uawdijnntqw1x1x1
IP : 216.73.216.219
Hostname : webm009.cluster128.gra.hosting.ovh.net
Kernel : Linux webm009.cluster128.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
OS : Linux
PATH:
/
home
/
chauffn
/
vuzelia
/
2023
/
modules
/
mod_stats
/
..
/
..
/
cc5e2
/
plugins.zip
/
/
PK<A#]Z?����3quickicon/downloadkey/src/Extension/Downloadkey.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Quickicon.downloadkey * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Quickicon\Downloadkey\Extension; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Component\Installer\Administrator\Helper\InstallerHelper as ComInstallerHelper; use Joomla\Event\SubscriberInterface; use Joomla\Module\Quickicon\Administrator\Event\QuickIconsEvent; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! update notification plugin * * @since 4.0.0 */ final class Downloadkey extends CMSPlugin implements SubscriberInterface { /** * Load the language file on instantiation. * * @var boolean * @since 4.0.0 */ protected $autoloadLanguage = true; /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.3.0 */ public static function getSubscribedEvents(): array { return [ 'onGetIcons' => 'onGetIcons', ]; } /** * Returns an icon definition for an icon which looks for extensions updates * via AJAX and displays a notification when such updates are found. * * @param QuickIconsEvent $event The event object * * @return void * * @since 4.0.0 */ public function onGetIcons(QuickIconsEvent $event): void { $context = $event->getContext(); if ( $context !== $this->params->get('context', 'update_quickicon') || !$this->getApplication()->getIdentity()->authorise('core.manage', 'com_installer') ) { return; } $info = $this->getMissingDownloadKeyInfo(); // No extensions need a download key. The icon is not rendered. if (!$info['supported']) { return; } $iconDefinition = [ 'link' => 'index.php?option=com_installer&view=updatesites&filter[supported]=1', 'image' => 'icon-key', 'icon' => '', 'text' => Text::_('PLG_QUICKICON_DOWNLOADKEY_OK'), 'class' => 'success', 'id' => 'plg_quickicon_downloadkey', 'group' => 'MOD_QUICKICON_MAINTENANCE', ]; if ($info['missing'] !== 0) { $iconDefinition = array_merge( $iconDefinition, [ 'link' => 'index.php?option=com_installer&view=updatesites&filter[supported]=-1', 'text' => Text::plural('PLG_QUICKICON_DOWNLOADKEY_N_MISSING', $info['missing']), 'class' => 'danger', ] ); } // Add the icon to the result array $result = $event->getArgument('result', []); $result[] = [ $iconDefinition, ]; $event->setArgument('result', $result); } /** * Gets the information about update sites requiring but missing a download key. * * The return array has two keys: * - supported Number of update sites supporting Download Key * - missing Number of update sites missing a Download Key * * If 'supported' is zero you do not need to provide any download keys. All your extensions are free downloads. * * If 'supported' is non-zero and 'missing' is zero you have entered a download key for all paid extensions. * * If 'supported' is non-zero and 'missing' is also non-zero you need to enter one or more download keys. * * @return array * @since 4.0.0 */ private function getMissingDownloadKeyInfo(): array { $ret = [ 'supported' => 0, 'missing' => 0, ]; if (!class_exists('Joomla\Component\Installer\Administrator\Helper\InstallerHelper')) { require_once JPATH_ADMINISTRATOR . '/components/com_installer/Helper/InstallerHelper.php'; } $supported = ComInstallerHelper::getDownloadKeySupportedSites(true); $ret['supported'] = count($supported); if ($ret['supported'] === 0) { return $ret; } $missing = ComInstallerHelper::getDownloadKeyExistsSites(false, true); $ret['missing'] = count($missing); return $ret; } } PK<A#]@Z��AA+quickicon/downloadkey/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Quickicon.downloadkey * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Quickicon\Downloadkey\Extension\Downloadkey; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Downloadkey( $dispatcher, (array) PluginHelper::getPlugin('quickicon', 'downloadkey') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK<A#]��`���%quickicon/downloadkey/downloadkey.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="quickicon" method="upgrade"> <name>plg_quickicon_downloadkey</name> <author>Joomla! Project</author> <creationDate>2019-10</creationDate> <copyright>(C) 2019 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.0.0</version> <description>PLG_QUICKICON_DOWNLOADKEY_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Quickicon\Downloadkey</namespace> <files> <folder plugin="downloadkey">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_quickicon_downloadkey.ini</language> <language tag="en-GB">language/en-GB/plg_quickicon_downloadkey.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="context" type="text" label="PLG_QUICKICON_DOWNLOADKEY_GROUP_LABEL" description="PLG_QUICKICON_DOWNLOADKEY_GROUP_DESC" default="update_quickicon" /> </fieldset> </fields> </config> </extension> PK<A#]E�]``;quickicon/extensionupdate/src/Extension/Extensionupdate.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Quickicon.extensionupdate * * @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Quickicon\Extensionupdate\Extension; use Joomla\CMS\Extension\ExtensionHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Session\Session; use Joomla\CMS\Uri\Uri; use Joomla\Event\SubscriberInterface; use Joomla\Module\Quickicon\Administrator\Event\QuickIconsEvent; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! update notification plugin * * @since 2.5 */ final class Extensionupdate extends CMSPlugin implements SubscriberInterface { /** * Load the language file on instantiation. * * @var boolean * @since 3.1 */ protected $autoloadLanguage = true; /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.3.0 */ public static function getSubscribedEvents(): array { return [ 'onGetIcons' => 'onGetIcons', ]; } /** * Returns an icon definition for an icon which looks for extensions updates * via AJAX and displays a notification when such updates are found. * * @param QuickIconsEvent $event The event object * * @return void * * @since 2.5 */ public function onGetIcons(QuickIconsEvent $event): void { $context = $event->getContext(); if ( $context !== $this->params->get('context', 'update_quickicon') || !$this->getApplication()->getIdentity()->authorise('core.manage', 'com_installer') ) { return; } $token = Session::getFormToken() . '=1'; $options = [ 'url' => Uri::base() . 'index.php?option=com_installer&view=update&task=update.find&' . $token, 'ajaxUrl' => Uri::base() . 'index.php?option=com_installer&view=update&task=update.ajax&' . $token . '&cache_timeout=3600&eid=0&skip=' . ExtensionHelper::getExtensionRecord('joomla', 'file')->extension_id, ]; $this->getApplication()->getDocument()->addScriptOptions('js-extensions-update', $options); Text::script('PLG_QUICKICON_EXTENSIONUPDATE_UPTODATE'); Text::script('PLG_QUICKICON_EXTENSIONUPDATE_UPDATEFOUND'); Text::script('PLG_QUICKICON_EXTENSIONUPDATE_ERROR'); Text::script('MESSAGE'); Text::script('ERROR'); Text::script('INFO'); Text::script('WARNING'); $this->getApplication()->getDocument()->getWebAssetManager() ->registerAndUseScript( 'plg_quickicon_extensionupdate', 'plg_quickicon_extensionupdate/extensionupdatecheck.min.js', [], ['defer' => true], ['core'] ); // Add the icon to the result array $result = $event->getArgument('result', []); $result[] = [ [ 'link' => 'index.php?option=com_installer&view=update&task=update.find&' . $token, 'image' => 'icon-star', 'icon' => '', 'text' => $this->getApplication()->getLanguage()->_('PLG_QUICKICON_EXTENSIONUPDATE_CHECKING'), 'id' => 'plg_quickicon_extensionupdate', 'group' => 'MOD_QUICKICON_MAINTENANCE', ], ]; $event->setArgument('result', $result); } } PK<A#]�NHUU/quickicon/extensionupdate/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Quickicon.extensionupdate * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Quickicon\Extensionupdate\Extension\Extensionupdate; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Extensionupdate( $dispatcher, (array) PluginHelper::getPlugin('quickicon', 'extensionupdate') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK<A#]��^���-quickicon/extensionupdate/extensionupdate.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="quickicon" method="upgrade"> <name>plg_quickicon_extensionupdate</name> <author>Joomla! Project</author> <creationDate>2011-08</creationDate> <copyright>(C) 2011 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_QUICKICON_EXTENSIONUPDATE_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Quickicon\Extensionupdate</namespace> <files> <folder plugin="extensionupdate">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_quickicon_extensionupdate.ini</language> <language tag="en-GB">language/en-GB/plg_quickicon_extensionupdate.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="context" type="text" label="PLG_QUICKICON_EXTENSIONUPDATE_GROUP_LABEL" description="PLG_QUICKICON_EXTENSIONUPDATE_GROUP_DESC" default="update_quickicon" /> </fieldset> </fields> </config> </extension> PK<A#]��UU/quickicon/phpversioncheck/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Quickicon.phpversioncheck * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Quickicon\PhpVersionCheck\Extension\PhpVersionCheck; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new PhpVersionCheck( $dispatcher, (array) PluginHelper::getPlugin('quickicon', 'phpversioncheck') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK<A#]�8����;quickicon/phpversioncheck/src/Extension/PhpVersionCheck.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Quickicon.phpversioncheck * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Quickicon\PhpVersionCheck\Extension; use Joomla\CMS\Date\Date; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Event\SubscriberInterface; use Joomla\Module\Quickicon\Administrator\Event\QuickIconsEvent; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Plugin to check the PHP version and display a warning about its support status * * @since 3.7.0 */ final class PhpVersionCheck extends CMSPlugin implements SubscriberInterface { /** * Constant representing the active PHP version being fully supported * * @var integer * @since 3.7.0 */ public const PHP_SUPPORTED = 0; /** * Constant representing the active PHP version receiving security support only * * @var integer * @since 3.7.0 */ public const PHP_SECURITY_ONLY = 1; /** * Constant representing the active PHP version being unsupported * * @var integer * @since 3.7.0 */ public const PHP_UNSUPPORTED = 2; /** * Load plugin language files automatically * * @var boolean * @since 3.7.0 */ protected $autoloadLanguage = true; /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.3.0 */ public static function getSubscribedEvents(): array { return [ 'onGetIcons' => 'onGetIcons', ]; } /** * Check the PHP version after the admin component has been dispatched. * * @param QuickIconsEvent $event The event object * * @return void * * @since 3.7.0 */ public function onGetIcons(QuickIconsEvent $event): void { if (!$this->shouldDisplayMessage()) { return; } $supportStatus = $this->getPhpSupport(); if ($supportStatus['status'] !== self::PHP_SUPPORTED) { // Enqueue the notification message; set a warning if receiving security support or "error" if unsupported switch ($supportStatus['status']) { case self::PHP_SECURITY_ONLY: $this->getApplication()->enqueueMessage($supportStatus['message'], 'warning'); break; case self::PHP_UNSUPPORTED: $this->getApplication()->enqueueMessage($supportStatus['message'], 'danger'); break; } } } /** * Gets PHP support status. * * @return array Array of PHP support data * * @since 3.7.0 * @note The dates used in this method should correspond to the dates given on PHP.net * @link https://www.php.net/supported-versions.php * @link https://www.php.net/eol.php */ private function getPhpSupport() { $phpSupportData = [ '7.2' => [ 'security' => '2019-11-30', 'eos' => '2020-11-30', ], '7.3' => [ 'security' => '2020-12-06', 'eos' => '2021-12-06', ], '7.4' => [ 'security' => '2021-11-28', 'eos' => '2022-11-28', ], '8.0' => [ 'security' => '2022-11-26', 'eos' => '2023-11-26', ], '8.1' => [ 'security' => '2023-11-25', 'eos' => '2025-12-31', ], '8.2' => [ 'security' => '2024-12-31', 'eos' => '2026-12-31', ], '8.3' => [ 'security' => '2025-12-31', 'eos' => '2027-12-31', ], ]; // Fill our return array with default values $supportStatus = [ 'status' => self::PHP_SUPPORTED, 'message' => null, ]; // Check the PHP version's support status using the minor version $activePhpVersion = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION; // Handle non standard strings like PHP 7.2.34-8+ubuntu18.04.1+deb.sury.org+1 $phpVersion = preg_split('/-/', PHP_VERSION)[0]; // Do we have the PHP version's data? if (isset($phpSupportData[$activePhpVersion])) { // First check if the version has reached end of support $today = new Date(); $phpEndOfSupport = new Date($phpSupportData[$activePhpVersion]['eos']); if ($phpNotSupported = $today > $phpEndOfSupport) { /* * Find the oldest PHP version still supported that is newer than the current version, * this is our recommendation for users on unsupported platforms */ foreach ($phpSupportData as $version => $versionData) { $versionEndOfSupport = new Date($versionData['eos']); if (version_compare($version, $activePhpVersion, 'ge') && ($today < $versionEndOfSupport)) { $supportStatus['status'] = self::PHP_UNSUPPORTED; $supportStatus['message'] = Text::sprintf( 'PLG_QUICKICON_PHPVERSIONCHECK_UNSUPPORTED', $phpVersion, $version, $versionEndOfSupport->format(Text::_('DATE_FORMAT_LC4')) ); return $supportStatus; } } // PHP version is not supported and we don't know of any supported versions. $supportStatus['status'] = self::PHP_UNSUPPORTED; $supportStatus['message'] = Text::sprintf( 'PLG_QUICKICON_PHPVERSIONCHECK_UNSUPPORTED_JOOMLA_OUTDATED', $phpVersion ); return $supportStatus; } // If the version is still supported, check if it has reached eol minus 3 month $securityWarningDate = clone $phpEndOfSupport; $securityWarningDate->sub(new \DateInterval('P3M')); if (!$phpNotSupported && $today > $securityWarningDate) { $supportStatus['status'] = self::PHP_SECURITY_ONLY; $supportStatus['message'] = Text::sprintf( 'PLG_QUICKICON_PHPVERSIONCHECK_SECURITY_ONLY', $phpVersion, $phpEndOfSupport->format(Text::_('DATE_FORMAT_LC4')) ); } } return $supportStatus; } /** * Determines if the message should be displayed * * @return boolean * * @since 3.7.0 */ private function shouldDisplayMessage() { // Only on admin app if (!$this->getApplication()->isClient('administrator')) { return false; } // Only if authenticated if ($this->getApplication()->getIdentity()->guest) { return false; } // Only on HTML documents if ($this->getApplication()->getDocument()->getType() !== 'html') { return false; } // Only on full page requests if ($this->getApplication()->getInput()->getCmd('tmpl', 'index') === 'component') { return false; } // Only to com_cpanel if ($this->getApplication()->getInput()->get('option') !== 'com_cpanel') { return false; } return true; } } PK<A#] �8D��-quickicon/phpversioncheck/phpversioncheck.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="quickicon" method="upgrade"> <name>plg_quickicon_phpversioncheck</name> <author>Joomla! Project</author> <creationDate>2016-08</creationDate> <copyright>(C) 2016 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.7.0</version> <description>PLG_QUICKICON_PHPVERSIONCHECK_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Quickicon\PhpVersionCheck</namespace> <files> <folder plugin="phpversioncheck">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_quickicon_phpversioncheck.ini</language> <language tag="en-GB">language/en-GB/plg_quickicon_phpversioncheck.sys.ini</language> </languages> </extension> PK<A#]��ѡ�� quickicon/akeebabackup/.htaccessnu�[���<IfModule !mod_authz_core.c> Order deny,allow Deny from all </IfModule> <IfModule mod_authz_core.c> <RequireAll> Require all denied </RequireAll> </IfModule> PK<A#]|��N!quickicon/akeebabackup/web.confignu�[���<?xml version="1.0"?> <!-- This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions --> <configuration> <system.webServer> <security> <requestFiltering> <fileExtensions allowUnlisted="false" > <clear /> <add fileExtension=".html" allowed="true"/> </fileExtensions> </requestFiltering> </security> </system.webServer> </configuration>PK<A#]�x�(mm5quickicon/akeebabackup/src/Extension/AkeebaBackup.phpnu�[���<?php /** * @package akeebabackup * @copyright Copyright (c)2006-2022 Nicholas K. Dionysopoulos / Akeeba Ltd * @license GNU General Public License version 3, or later */ namespace Joomla\Plugin\Quickicon\AkeebaBackup\Extension; defined('_JEXEC') || die; use Akeeba\Component\AkeebaBackup\Administrator\Extension\AkeebaBackupComponent; use Akeeba\Component\AkeebaBackup\Administrator\Model\StatisticsModel; use Akeeba\Engine\Factory; use Akeeba\Engine\Platform; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Date\Date; use Joomla\CMS\Document\Document; use Joomla\CMS\Language\Text; use Joomla\CMS\MVC\Factory\MVCFactoryAwareTrait; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\Database\DatabaseInterface; use Joomla\Event\DispatcherInterface; use Joomla\Event\SubscriberInterface; use Joomla\Module\Quickicon\Administrator\Event\QuickIconsEvent; class AkeebaBackup extends CMSPlugin implements SubscriberInterface { use MVCFactoryAwareTrait; /** * Load the language file on instantiation. * * @var boolean * @since 3.1 */ protected $autoloadLanguage = true; /** * Application object. * * @var \Joomla\CMS\Application\CMSApplication * @since 3.7.0 */ protected $app; /** * Database driver object * * @var DatabaseInterface * @since 9.3.0 */ protected $db; /** * The document. * * @var Document * * @since 4.0.0 */ private $document; /** * Constructor * * @param DispatcherInterface $subject The object to observe * @param Document $document The document * @param array $config An optional associative array of configuration settings. * Recognized key values include 'name', 'group', 'params', 'language' * (this list is not meant to be comprehensive). * * @since 9.0.0 */ public function __construct(DispatcherInterface $subject, Document $document, array $config = []) { parent::__construct($subject, $config); $this->document = $document; } /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 9.0.0 */ public static function getSubscribedEvents(): array { // Only subscribe events if the component is installed and enabled if (!ComponentHelper::isEnabled('com_akeebabackup')) { return []; } return [ 'onGetIcons' => 'getAkeebaBackupStatus', ]; } /** * This method is called when the Quick Icons module is constructing its set * of icons. You can return an array which defines a single icon and it will * be rendered right after the stock Quick Icons. * * @param QuickIconsEvent $event The event object * * @return void * * @since 9.0.0 */ public function getAkeebaBackupStatus(QuickIconsEvent $event) { $context = $event->getContext(); $user = $this->app->getIdentity(); if ($context !== 'update_quickicon' || !$user->authorise('core.manage', 'com_installer')) { return; } // Load the Akeeba Engine, if required if (!defined('AKEEBAENGINE')) { // Necessary defines for Akeeba Engine define('AKEEBAENGINE', 1); define('AKEEBAROOT', JPATH_ADMINISTRATOR . '/components/com_akeebabackup/engine'); // Make sure we have a profile set throughout the component's lifetime $profile_id = $this->app->getSession()->get('akeebebackup.profile'); if (is_null($profile_id)) { $this->app->getSession()->set('akeebabackup.profile', 1); } // Is Akeeba Engine available? $engineFactoryFile = AKEEBAROOT . '/Factory.php'; if (!file_exists($engineFactoryFile) || !is_readable($engineFactoryFile)) { return; } // Try to load the Akeeba Engine @include_once $engineFactoryFile; if (!class_exists('Akeeba\Engine\Factory')) { return; } Platform::addPlatform('joomla', JPATH_ADMINISTRATOR . '/components/com_akeebabackup/platform/Joomla'); // !!! IMPORTANT !!! DO NOT REMOVE! This triggers Akeeba Engine's autoloader. Without it the next line fails! $DO_NOT_REMOVE = Platform::getInstance(); // Set the DBO to the Akeeba Engine platform for Joomla Platform\Joomla::setDbDriver($this->db); } // Set up the default icon $url = Uri::base(); $url = rtrim($url, '/'); $profileId = (int) $this->params->get('profileid', 1); $token = $this->app->getSession()->getToken(); if ($profileId <= 0) { $profileId = 1; } $ret = [ 'link' => Route::_('index.php?option=com_akeebabackup&view=Backup&autostart=1&returnurl=' . base64_encode($url) . '&profileid=' . $profileId . "&$token=1"), 'image' => 'icon-akeebabackup', 'icon' => '', 'text' => Text::_('PLG_QUICKICON_AKEEBABACKUP_OK'), 'class' => 'success', 'id' => 'plg_quickicon_akeebabackup', 'group' => 'MOD_QUICKICON_MAINTENANCE', ]; // Do I need to parse backup warnings? if ($this->params->get('enablewarning', 0) == 0) { // Do not remove; required to load the Akeeba Engine configuration $engineConfig = Factory::getConfiguration(); Platform::getInstance()->load_configuration(1); // Get the latest backup ID $filters = [ [ 'field' => 'tag', 'operand' => '<>', 'value' => 'restorepoint', ], ]; $ordering = [ 'by' => 'backupstart', 'order' => 'DESC', ]; /** @var StatisticsModel $model */ $model = $this->getMVCFactory()->createModel('Statistics', 'Administrator'); $list = $model->getStatisticsListWithMeta(false, $filters, $ordering); $record = null; if (!empty($list)) { $record = (object) array_shift($list); } // Warn if there is no backup whatsoever $warning = is_null($record); // Process "failed backup" warnings, if specified if ((!is_null($record) && $this->params->get('warnfailed', 0) == 0)) { $warning = (($record->status == 'fail') || ($record->status == 'run')); } // Process "stale backup" warnings, if necessary if (!$warning && !is_null($record)) { $maxperiod = $this->params->get('maxbackupperiod', 24); $lastBackupRaw = $record->backupstart; $lastBackupObject = new Date($lastBackupRaw); $lastBackup = $lastBackupObject->toUnix(); $maxBackup = time() - $maxperiod * 3600; $warning = ($lastBackup < $maxBackup); } // If we have a warning we need to update the quick icon class and text if ($warning) { $ret['text'] = Text::_('PLG_QUICKICON_AKEEBABACKUP_BACKUPREQUIRED'); $ret['class'] = 'danger'; } } // Load the CSS $this->document->getWebAssetManager() ->getRegistry()->addExtensionRegistryFile('plg_quickicon_akeebabackup'); $this->document->getWebAssetManager() ->useStyle('plg_quickicon_akeebabackup.icons'); // Add the icon to the result array $result = $event->getArgument('result', []); $result[] = [ $ret, ]; $event->setArgument('result', $result); } }PK<A#]s�H� � 'quickicon/akeebabackup/akeebabackup.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <!--~ ~ @package akeebabackup ~ @copyright Copyright (c)2006-2022 Nicholas K. Dionysopoulos / Akeeba Ltd ~ @license GNU General Public License version 3, or later --> <extension version="4.0.0" type="plugin" group="quickicon" method="upgrade"> <name>PLG_QUICKICON_AKEEBABACKUP</name> <version>9.3.3</version> <creationDate>2022-10-10</creationDate> <author>Nicholas K. Dionysopoulos</author> <authorEmail>nicholas@dionysopoulos.me</authorEmail> <authorUrl>https://www.akeeba.com</authorUrl> <copyright>Copyright (c)2006-2022 Nicholas K. Dionysopoulos</copyright> <license>GNU General Public License version 3, or later</license> <description>PLG_QUICKICON_AKEEBABACKUP_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Quickicon\AkeebaBackup</namespace> <files> <folder plugin="akeebabackup">services</folder> <folder>src</folder> <filename>.htaccess</filename> <filename>web.config</filename> </files> <media destination="plg_quickicon_akeebabackup" folder="media"> <folder>css</folder> <file>joomla.asset.json</file> </media> <languages folder="language"> <language tag="en-GB">en-GB/plg_quickicon_akeebabackup.ini</language> <language tag="en-GB">en-GB/plg_quickicon_akeebabackup.sys.ini</language> </languages> <config addfieldpath="/administrator/components/com_akeebabackup/src/Field" addfieldprefix="Akeeba\Component\AkeebaBackup\Administrator\Field" > <fields name="params"> <fieldset name="basic"> <field name="enablewarning" type="radio" layout="joomla.form.field.radio.switcher" label="PLG_QUICKICON_AKEEBABACKUP_LBL_WARNINGS" description="PLG_QUICKICON_AKEEBABACKUP_DESC_WARNINGS" default="1" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="warnfailed" type="radio" layout="joomla.form.field.radio.switcher" label="PLG_QUICKICON_AKEEBABACKUP_LBL_WARNFAILED" description="PLG_QUICKICON_AKEEBABACKUP_DESC_WARNFAILED" default="1" showon="enablewarning:1" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="maxbackupperiod" type="number" label="PLG_QUICKICON_AKEEBABACKUP_LBL_PERIOD" description="PLG_QUICKICON_AKEEBABACKUP_DESC_PERIOD" min="1" max="87600" step="1" default="24"/> <field name="profileid" type="backupprofiles" default="1" label="PLG_QUICKICON_AKEEBABACKUP_PROFILE_LABEL" class="advancedSelect" description="PLG_QUICKICON_AKEEBABACKUP_PROFILE_DESC" /> </fieldset> </fields> </config> </extension>PK<A#]I�L�ss,quickicon/akeebabackup/services/provider.phpnu�[���<?php /** * @package akeebabackup * @copyright Copyright (c)2006-2022 Nicholas K. Dionysopoulos / Akeeba Ltd * @license GNU General Public License version 3, or later */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Extension\Service\Provider\MVCFactory; use Joomla\CMS\Factory; use Joomla\CMS\MVC\Factory\MVCFactoryInterface; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Quickicon\AkeebaBackup\Extension\AkeebaBackup; return new class implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 9.0.0 */ public function register(Container $container) { $container->registerServiceProvider(new MVCFactory('Akeeba\\Component\\AkeebaBackup')); $container->set( PluginInterface::class, function (Container $container) { $plugin = PluginHelper::getPlugin('quickicon', 'akeebabackup'); $pluginExtension = new AkeebaBackup( $container->get(DispatcherInterface::class), Factory::getApplication()->getDocument(), (array) $plugin ); $pluginExtension->setMVCFactory($container->get(MVCFactoryInterface::class)); return $pluginExtension; } ); } }; PK<A#]�]��quickicon/jce/jce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.8" type="plugin" group="quickicon" method="upgrade"> <name>plg_quickicon_jce</name> <version>2.9.20</version> <creationDate>10-02-2022</creationDate> <author>Ryan Demmer</author> <authorEmail>info@joomlacontenteditor.net</authorEmail> <authorUrl>http://www.joomlacontenteditor.net</authorUrl> <copyright>Copyright (C) 2006 - 2022 Ryan Demmer. All rights reserved</copyright> <license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license> <description>PLG_QUICKICON_JCE_XML_DESCRIPTION</description> <files folder="plugins/quickicon/jce"> <filename plugin="jce">jce.php</filename> </files> <languages folder="administrator/language/en-GB"> <language tag="en-GB">en-GB.plg_quickicon_jce.ini</language> <language tag="en-GB">en-GB.plg_quickicon_jce.sys.ini</language> </languages> </extension> PK<A#]�ٻ���quickicon/jce/jce.phpnu�[���<?php /** * @copyright Copyright (c) 2009-2021 Ryan Demmer. All rights reserved * @license GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * JCE is free software. This version may have been modified pursuant * to the GNU General Public License, and as distributed it includes or * is derivative of works licensed under the GNU General Public License or * other free or open source software licenses */ defined('_JEXEC') or die; /** * JCE File Browser Quick Icon plugin. * * @since 2.1 */ class plgQuickiconJce extends JPlugin { public function __construct(&$subject, $config) { parent::__construct($subject, $config); $app = JFactory::getApplication(); // only in Admin and only if the component is enabled if ($app->getClientId() !== 1 || JComponentHelper::getComponent('com_jce', true)->enabled === false) { return; } $this->loadLanguage(); } public function onGetIcons($context) { if ($context != $this->params->get('context', 'mod_quickicon')) { return; } $user = JFactory::getUser(); if (!$user->authorise('jce.browser', 'com_jce')) { return; } $language = JFactory::getLanguage(); $language->load('com_jce', JPATH_ADMINISTRATOR); return array(array( 'link' => 'index.php?option=com_jce&view=browser', 'image' => 'picture fas fa-image', 'access' => array('jce.browser', 'com_jce'), 'text' => JText::_('PLG_QUICKICON_JCE_TITLE'), 'id' => 'plg_quickicon_jce', )); } } PK<A#]A����'quickicon/joomlaupdate/joomlaupdate.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="quickicon" method="upgrade"> <name>plg_quickicon_joomlaupdate</name> <author>Joomla! Project</author> <creationDate>2011-08</creationDate> <copyright>(C) 2011 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_QUICKICON_JOOMLAUPDATE_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Quickicon\Joomlaupdate</namespace> <files> <folder plugin="joomlaupdate">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_quickicon_joomlaupdate.ini</language> <language tag="en-GB">language/en-GB/plg_quickicon_joomlaupdate.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="context" type="text" label="PLG_QUICKICON_JOOMLAUPDATE_GROUP_LABEL" description="PLG_QUICKICON_JOOMLAUPDATE_GROUP_DESC" default="update_quickicon" /> </fieldset> </fields> </config> </extension> PK<A#]L3 ���,quickicon/joomlaupdate/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Quickicon.Joomlaupdate * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Quickicon\Joomlaupdate\Extension\Joomlaupdate; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.0.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { // @Todo This needs to be changed to a proper factory $plugin = \Joomla\CMS\Plugin\PluginHelper::getPlugin('quickicon', 'joomlaupdate'); $plugin = new Joomlaupdate( $container->get(DispatcherInterface::class), Factory::getApplication()->getDocument(), (array) $plugin ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK<A#]��E��5quickicon/joomlaupdate/src/Extension/Joomlaupdate.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Quickicon.Joomlaupdate * * @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Quickicon\Joomlaupdate\Extension; use Joomla\CMS\Document\Document; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Session\Session; use Joomla\CMS\Uri\Uri; use Joomla\Event\DispatcherInterface; use Joomla\Event\SubscriberInterface; use Joomla\Module\Quickicon\Administrator\Event\QuickIconsEvent; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! update notification plugin * * @since 2.5 */ class Joomlaupdate extends CMSPlugin implements SubscriberInterface { /** * Load the language file on instantiation. * * @var boolean * @since 3.1 */ protected $autoloadLanguage = true; /** * The document. * * @var Document * * @since 4.0.0 */ private $document; /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.0.0 */ public static function getSubscribedEvents(): array { return [ 'onGetIcons' => 'getCoreUpdateNotification', ]; } /** * Constructor * * @param DispatcherInterface $subject The object to observe * @param Document $document The document * @param array $config An optional associative array of configuration settings. * Recognized key values include 'name', 'group', 'params', 'language' * (this list is not meant to be comprehensive). * * @since 4.0.0 */ public function __construct($subject, Document $document, $config = []) { parent::__construct($subject, $config); $this->document = $document; } /** * This method is called when the Quick Icons module is constructing its set * of icons. You can return an array which defines a single icon and it will * be rendered right after the stock Quick Icons. * * @param QuickIconsEvent $event The event object * * @return void * * @since 4.0.0 */ public function getCoreUpdateNotification(QuickIconsEvent $event) { $context = $event->getContext(); if ( $context !== $this->params->get('context', 'update_quickicon') || !$this->getApplication()->getIdentity()->authorise('core.manage', 'com_joomlaupdate') ) { return; } Text::script('PLG_QUICKICON_JOOMLAUPDATE_ERROR'); Text::script('PLG_QUICKICON_JOOMLAUPDATE_UPDATEFOUND'); Text::script('PLG_QUICKICON_JOOMLAUPDATE_UPTODATE'); Text::script('MESSAGE'); Text::script('ERROR'); Text::script('INFO'); Text::script('WARNING'); $this->document->addScriptOptions( 'js-joomla-update', [ 'url' => Uri::base() . 'index.php?option=com_joomlaupdate', 'ajaxUrl' => Uri::base() . 'index.php?option=com_joomlaupdate&task=update.ajax&' . Session::getFormToken() . '=1', 'version' => JVERSION, ] ); $this->document->getWebAssetManager() ->registerAndUseScript('plg_quickicon_joomlaupdate', 'plg_quickicon_joomlaupdate/jupdatecheck.min.js', [], ['defer' => true], ['core']); // Add the icon to the result array $result = $event->getArgument('result', []); $result[] = [ [ 'link' => 'index.php?option=com_joomlaupdate', 'image' => 'icon-joomla', 'icon' => '', 'text' => Text::_('PLG_QUICKICON_JOOMLAUPDATE_CHECKING'), 'id' => 'plg_quickicon_joomlaupdate', 'group' => 'MOD_QUICKICON_MAINTENANCE', ], ]; $event->setArgument('result', $result); } } PK<A#]�����quickicon/eos/eos.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="quickicon" method="upgrade"> <name>plg_quickicon_eos</name> <author>Joomla! Project</author> <creationDate>2023-05</creationDate> <copyright>(C) 2023 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.4.0</version> <description>PLG_QUICKICON_EOS_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Quickicon\Eos</namespace> <files> <folder plugin="eos">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_quickicon_eos.ini</language> <language tag="en-GB">language/en-GB/plg_quickicon_eos.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="last_snoozed_id" type="hidden" /> </fieldset> </fields> </config> </extension> PK<A#]�AEt�$�$#quickicon/eos/src/Extension/Eos.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Quickicon.eos * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Quickicon\Eos\Extension; use Joomla\CMS\Access\Exception\NotAllowed; use Joomla\CMS\Application\CMSWebApplicationInterface; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Database\DatabaseAwareTrait; use Joomla\Event\SubscriberInterface; use Joomla\Module\Quickicon\Administrator\Event\QuickIconsEvent; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! end of support notification plugin * * @since 4.4.0 */ final class Eos extends CMSPlugin implements SubscriberInterface { use DatabaseAwareTrait; /** * The EOS date for 4.4. * * @var string * @since 4.4.0 */ private const EOS_DATE = '2025-10-17'; /** * Load the language file on instantiation. * * @var bool * @since 4.4.0 */ protected $autoloadLanguage = false; /** * Holding the current valid message to be shown. * * @var array * @since 4.4.0 */ private $currentMessage = []; /** * Are the messages initialized. * * @var bool * @since 4.4.0 */ private $messagesInitialized = false; /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.4.0 */ public static function getSubscribedEvents(): array { return [ 'onGetIcons' => 'getEndOfServiceNotification', 'onAjaxEos' => 'onAjaxEos', ]; } /** * Check and show the alert. * * This method is called when the Quick Icons module is constructing its set * of icons. * * @param QuickIconsEvent $event The event object * * @return void * * @since 4.4.0 * * @throws \Exception */ public function getEndOfServiceNotification(QuickIconsEvent $event): void { $app = $this->getApplication(); if ( $event->getContext() !== $this->params->get('context', 'update_quickicon') || !$this->shouldDisplayMessage() || (!$this->messagesInitialized && $this->setMessage() == []) || !$app instanceof CMSWebApplicationInterface ) { return; } $this->loadLanguage(); // Show this only when not snoozed if ($this->params->get('last_snoozed_id', 0) < $this->currentMessage['id']) { // Build the message to be displayed in the cpanel $messageText = sprintf( $app->getLanguage()->_($this->currentMessage['messageText']), HTMLHelper::_('date', Eos::EOS_DATE, $app->getLanguage()->_('DATE_FORMAT_LC3')), $this->currentMessage['messageLink'] ); if ($this->currentMessage['snoozable']) { $messageText .= '<p><button class="btn btn-warning eosnotify-snooze-btn" type="button" >'; $messageText .= $app->getLanguage()->_('PLG_QUICKICON_EOS_SNOOZE_BUTTON') . '</button></p>'; } $app->enqueueMessage($messageText, $this->currentMessage['messageType']); } $app->getDocument()->getWebAssetManager() ->registerAndUseScript('plg_quickicon_eos.script', 'plg_quickicon_eos/snooze.js', [], ['type' => 'module']); } /** * Save the plugin parameters. * * @return bool * * @since 4.4.0 */ private function saveParams(): bool { $params = $this->params->toString('JSON'); $db = $this->getDatabase(); $query = $db->getQuery(true) ->update($db->quoteName('#__extensions')) ->set($db->quoteName('params') . ' = :params') ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) ->where($db->quoteName('folder') . ' = ' . $db->quote('quickicon')) ->where($db->quoteName('element') . ' = ' . $db->quote('eos')) ->bind(':params', $params); return $db->setQuery($query)->execute(); } /** * Determines if the message and quickicon should be displayed. * * @return bool * * @since 4.4.0 * * @throws \Exception */ private function shouldDisplayMessage(): bool { // Show only on administration part return $this->getApplication()->isClient('administrator') // Only show for HTML requests && $this->getApplication()->getDocument()->getType() === 'html' // Don't show in modal && $this->getApplication()->getInput()->getCmd('tmpl', 'index') !== 'component' // Only show in cpanel && $this->getApplication()->getInput()->get('option') === 'com_cpanel'; } /** * Return the texts to be displayed based on the time until we reach EOS. * * @param int $monthsUntilEOS The months until we reach EOS * @param int $inverted Have we surpassed the EOS date * * @return array An array with the message to be displayed or false * * @since 4.4.0 */ private function getMessageInfo(int $monthsUntilEOS, int $inverted): array { // The EOS date has passed - Support has ended if ($inverted === 1) { return [ 'id' => 5, 'messageText' => 'PLG_QUICKICON_EOS_MESSAGE_ERROR_SUPPORT_ENDED', 'messageType' => 'error', 'messageLink' => 'https://docs.joomla.org/Special:MyLanguage/Joomla_4.4.x_to_5.x_Planning_and_Upgrade_Step_by_Step', 'snoozable' => false, ]; } // The security support is ending in 6 months if ($monthsUntilEOS < 6) { return [ 'id' => 4, 'messageText' => 'PLG_QUICKICON_EOS_MESSAGE_WARNING_SUPPORT_ENDING', 'messageType' => 'warning', 'messageLink' => 'https://docs.joomla.org/Special:MyLanguage/Joomla_4.4.x_to_5.x_Planning_and_Upgrade_Step_by_Step', 'snoozable' => true, ]; } // We are in security only mode now, 12 month to go from now on if ($monthsUntilEOS < 12) { return [ 'id' => 3, 'messageText' => 'PLG_QUICKICON_EOS_MESSAGE_WARNING_SECURITY_ONLY', 'messageType' => 'warning', 'messageLink' => 'https://docs.joomla.org/Special:MyLanguage/Joomla_4.4.x_to_5.x_Planning_and_Upgrade_Step_by_Step', 'snoozable' => true, ]; } // We still have 16 month to go, lets remind our users about the pre upgrade checker if ($monthsUntilEOS < 16) { return [ 'id' => 2, 'messageText' => 'PLG_QUICKICON_EOS_MESSAGE_INFO_02', 'messageType' => 'info', 'messageLink' => 'https://docs.joomla.org/Special:MyLanguage/Pre-Update_Check', 'snoozable' => true, ]; } // Lets start our messages 2 month after the initial release, still 22 month to go if ($monthsUntilEOS < 22) { return [ 'id' => 1, 'messageText' => 'PLG_QUICKICON_EOS_MESSAGE_INFO_01', 'messageType' => 'info', 'messageLink' => 'https://joomla.org/5', 'snoozable' => true, ]; } return []; } /** * Check if current user is allowed to send the data. * * @return bool * * @since 4.4.0 * * @throws \Exception */ private function isAllowedUser(): bool { return $this->getApplication()->getIdentity()->authorise('core.login.admin'); } /** * User hit the snooze button. * * @return string * * @since 4.4.0 * * @throws Notallowed If user is not allowed * * @throws \Exception */ public function onAjaxEos(): string { // No messages yet so nothing to snooze if (!$this->messagesInitialized && $this->setMessage() == []) { return ''; } if (!$this->isAllowedUser()) { throw new Notallowed($this->getApplication()->getLanguage()->_('JGLOBAL_AUTH_ACCESS_DENIED'), 403); } // Make sure only snoozable messages can be snoozed if ($this->currentMessage['snoozable']) { $this->params->set('last_snoozed_id', $this->currentMessage['id']); $this->saveParams(); } return ''; } /** * Calculates how many days and selects correct message. * * @return array * * @since 4.4.0 */ private function setMessage(): array { $diff = Factory::getDate()->diff(Factory::getDate(Eos::EOS_DATE)); $message = $this->getMessageInfo(floor($diff->days / 30.417), $diff->invert); $this->currentMessage = $message; $this->messagesInitialized = true; return $message; } } PK<A#]�rn ��#quickicon/eos/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Quickicon.eos * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Quickicon\Eos\Extension\Eos; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 * * @throws Exception */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Eos( $dispatcher, (array) PluginHelper::getPlugin('quickicon', 'eos') ); $plugin->setApplication(Factory::getApplication()); $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } }; PK<A#]�� ��'quickicon/privacycheck/privacycheck.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="quickicon" method="upgrade"> <name>plg_quickicon_privacycheck</name> <author>Joomla! Project</author> <creationDate>2018-06</creationDate> <copyright>(C) 2018 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.9.0</version> <description>PLG_QUICKICON_PRIVACYCHECK_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Quickicon\PrivacyCheck</namespace> <files> <folder plugin="privacycheck">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_quickicon_privacycheck.ini</language> <language tag="en-GB">language/en-GB/plg_quickicon_privacycheck.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="context" type="text" label="PLG_QUICKICON_PRIVACYCHECK_GROUP_LABEL" description="PLG_QUICKICON_PRIVACYCHECK_GROUP_DESC" default="update_quickicon" /> </fieldset> </fields> </config> </extension> PK<A#]���iFF,quickicon/privacycheck/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Quickicon.privacycheck * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Quickicon\PrivacyCheck\Extension\PrivacyCheck; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new PrivacyCheck( $dispatcher, (array) PluginHelper::getPlugin('quickicon', 'privacycheck') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK<A#]b�Rl005quickicon/privacycheck/src/Extension/PrivacyCheck.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Quickicon.privacycheck * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Quickicon\PrivacyCheck\Extension; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Session\Session; use Joomla\CMS\Uri\Uri; use Joomla\Event\SubscriberInterface; use Joomla\Module\Quickicon\Administrator\Event\QuickIconsEvent; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Plugin to check privacy requests older than 14 days * * @since 3.9.0 */ final class PrivacyCheck extends CMSPlugin implements SubscriberInterface { /** * Load plugin language files automatically * * @var boolean * @since 3.9.0 */ protected $autoloadLanguage = true; /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.3.0 */ public static function getSubscribedEvents(): array { return [ 'onGetIcons' => 'onGetIcons', ]; } /** * Check privacy requests older than 14 days. * * @param QuickIconsEvent $event The event object * * @return void * * @since 3.9.0 */ public function onGetIcons(QuickIconsEvent $event): void { $context = $event->getContext(); if ( $context !== $this->params->get('context', 'update_quickicon') || !$this->getApplication()->getIdentity()->authorise('core.admin', 'com_privacy') || !ComponentHelper::isEnabled('com_privacy') ) { return; } $token = Session::getFormToken() . '=' . 1; $privacy = 'index.php?option=com_privacy'; $options = [ 'plg_quickicon_privacycheck_url' => Uri::base() . $privacy . '&view=requests&filter[status]=1&list[fullordering]=a.requested_at ASC', 'plg_quickicon_privacycheck_ajax_url' => Uri::base() . $privacy . '&task=getNumberUrgentRequests&format=json&' . $token, 'plg_quickicon_privacycheck_text' => [ "NOREQUEST" => $this->getApplication()->getLanguage()->_('PLG_QUICKICON_PRIVACYCHECK_NOREQUEST'), "REQUESTFOUND" => $this->getApplication()->getLanguage()->_('PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND'), "ERROR" => $this->getApplication()->getLanguage()->_('PLG_QUICKICON_PRIVACYCHECK_ERROR'), "REQUESTFOUND_MESSAGE" => $this->getApplication()->getLanguage()->_('PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND_MESSAGE'), "REQUESTFOUND_BUTTON" => $this->getApplication()->getLanguage()->_('PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND_BUTTON'), ], ]; $this->getApplication()->getDocument()->addScriptOptions('js-privacy-check', $options); $this->getApplication()->getDocument()->getWebAssetManager() ->registerAndUseScript('plg_quickicon_privacycheck', 'plg_quickicon_privacycheck/privacycheck.js', [], ['defer' => true], ['core']); // Add the icon to the result array $result = $event->getArgument('result', []); $result[] = [ [ 'link' => $privacy . '&view=requests&filter[status]=1&list[fullordering]=a.requested_at ASC', 'image' => 'icon-users', 'icon' => '', 'text' => $this->getApplication()->getLanguage()->_('PLG_QUICKICON_PRIVACYCHECK_CHECKING'), 'id' => 'plg_quickicon_privacycheck', 'group' => 'MOD_QUICKICON_USERS', ], ]; $event->setArgument('result', $result); } } PK<A#]a�=��-quickicon/overridecheck/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Quickicon.overridecheck * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Quickicon\OverrideCheck\Extension\OverrideCheck; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new OverrideCheck( $dispatcher, (array) PluginHelper::getPlugin('quickicon', 'overridecheck') ); $plugin->setApplication(Factory::getApplication()); $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } }; PK<A#]L�.j��7quickicon/overridecheck/src/Extension/OverrideCheck.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Quickicon.overridecheck * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Quickicon\OverrideCheck\Extension; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Session\Session; use Joomla\CMS\Uri\Uri; use Joomla\Database\DatabaseAwareTrait; use Joomla\Event\SubscriberInterface; use Joomla\Module\Quickicon\Administrator\Event\QuickIconsEvent; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! template override notification plugin * * @since 4.0.0 */ final class OverrideCheck extends CMSPlugin implements SubscriberInterface { use DatabaseAwareTrait; /** * Load the language file on instantiation. * * @var boolean * * @since 4.0.0 */ protected $autoloadLanguage = true; /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.3.0 */ public static function getSubscribedEvents(): array { return [ 'onGetIcons' => 'onGetIcons', ]; } /** * Returns an icon definition for an icon which looks for overrides update * via AJAX and displays a notification when such overrides are updated. * * @param QuickIconsEvent $event The event object * * @return void * * @since 4.0.0 */ public function onGetIcons(QuickIconsEvent $event): void { $context = $event->getContext(); if ( $context !== $this->params->get('context', 'update_quickicon') || !$this->getApplication()->getIdentity()->authorise('core.manage', 'com_templates') ) { return; } $token = Session::getFormToken() . '=1'; $options = [ 'url' => Uri::base() . 'index.php?option=com_templates&view=templates', 'ajaxUrl' => Uri::base() . 'index.php?option=com_templates&view=templates&task=template.ajax&' . $token, 'pluginId' => $this->getOverridePluginId(), ]; $this->getApplication()->getDocument()->addScriptOptions('js-override-check', $options); Text::script('PLG_QUICKICON_OVERRIDECHECK_ERROR', true); Text::script('PLG_QUICKICON_OVERRIDECHECK_ERROR_ENABLE', true); Text::script('PLG_QUICKICON_OVERRIDECHECK_UPTODATE', true); Text::script('PLG_QUICKICON_OVERRIDECHECK_OVERRIDEFOUND', true); $this->getApplication()->getDocument()->getWebAssetManager() ->registerAndUseScript('plg_quickicon_overridecheck', 'plg_quickicon_overridecheck/overridecheck.js', [], ['defer' => true], ['core']); // Add the icon to the result array $result = $event->getArgument('result', []); $result[] = [ [ 'link' => 'index.php?option=com_templates&view=templates', 'image' => 'icon-file', 'icon' => '', 'text' => $this->getApplication()->getLanguage()->_('PLG_QUICKICON_OVERRIDECHECK_CHECKING'), 'id' => 'plg_quickicon_overridecheck', 'group' => 'MOD_QUICKICON_MAINTENANCE', ], ]; $event->setArgument('result', $result); } /** * Gets the installer override plugin extension id. * * @return integer The installer override plugin extension id. * * @since 4.0.0 */ private function getOverridePluginId() { $db = $this->getDatabase(); $query = $db->getQuery(true) ->select($db->quoteName('extension_id')) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('folder') . ' = ' . $db->quote('installer')) ->where($db->quoteName('element') . ' = ' . $db->quote('override')); $db->setQuery($query); try { $result = (int) $db->loadResult(); } catch (\RuntimeException $e) { $this->getApplication()->enqueueMessage($e->getMessage(), 'error'); } return $result; } } PK<A#]il��)quickicon/overridecheck/overridecheck.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="quickicon" method="upgrade"> <name>plg_quickicon_overridecheck</name> <author>Joomla! Project</author> <creationDate>2018-06</creationDate> <copyright>(C) 2018 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.0.0</version> <description>PLG_QUICKICON_OVERRIDECHECK_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Quickicon\OverrideCheck</namespace> <files> <folder plugin="overridecheck">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_quickicon_overridecheck.ini</language> <language tag="en-GB">language/en-GB/plg_quickicon_overridecheck.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="context" type="text" label="PLG_QUICKICON_OVERRIDECHECK_GROUP_LABEL" description="PLG_QUICKICON_OVERRIDECHECK_GROUP_DESC" default="update_quickicon" /> </fieldset> </fields> </config> </extension> PK=A#]�6$ڂ9�92convertforms/getresponse/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsGetresponseInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK=A#]��" ��+convertforms/getresponse/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsGetResponseInstallerScript extends PlgConvertFormsGetResponseInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_GETRESPONSE'; public $alias = 'getresponse'; public $extension_type = 'plugin'; public $plugin_folder = "convertforms"; public $show_message = false; } PK=A#]g�V77(convertforms/getresponse/getresponse.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.3.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_GETRESPONSE</name> <description>PLG_CONVERTFORMS_GETRESPONSE_DESC</description> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c)2011-2016 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>November 2015</creationDate> <version>1.0</version> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="getresponse">getresponse.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PK=A#]�� ��(convertforms/getresponse/getresponse.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgConvertFormsGetResponse extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ function subscribe() { $api = new NR_GetResponse(array('api' => $this->lead->campaign->api)); $api->subscribe( $this->lead->email, $this->findKey('name', $this->lead->params), // I don't like this line $this->lead->campaign->list, $this->lead->params, isset($this->lead->campaign->updateexisting) ? $this->lead->campaign->updateexisting : true ); if (!$api->success()) { throw new Exception($api->getLastError()); } } }PK=A#]�C��ww!convertforms/getresponse/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="api" type="nrtext" label="PLG_CONVERTFORMS_GETRESPONSE_KEY" description="PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC" class="input-xlarge" urltext="PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-getresponse" required="true" /> <field name="list" type="servicelists" label="PLG_CONVERTFORMS_GETRESPONSE_LIST_ID" description="PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC" class="input-xlarge" required="true" /> <field name="updateexisting" type="radio" label="PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER" description="PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC" class="btn-group btn-group-yesno" default="1"> <option value="0">JNO</option> <option value="1">JYES</option> </field> </fieldset> </form>PK=A#]C�Q�==Nconvertforms/getresponse/language/el-GR/el-GR.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="GetResponse" PLG_CONVERTFORMS_GETRESPONSE="Convert Forms - Ενσωμάτωση GetResponse " PLG_CONVERTFORMS_GETRESPONSE_DESC="Convert Forms - Ενσωμάτωση με Υπηρεσία μάρκετινγκ ηλεκτρονικού ταχυδρομείου GetResponse." PLG_CONVERTFORMS_GETRESPONSE_KEY="Κλειδί API" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="Το κλειδί σας API του GetResponse" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="Που θα βρω το κλειδί API?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Διακριτικό καμπάνιας" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="Το σημείο καμπάνιας που πρέπει να εγγραφεί ο χρήστης" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Ενημέρωση υπάρχοντος χρήστη" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Επιλέξτε εάν θέλετε να ενημερωθεί ο υπάρχων χρήστης GetResponse εάν αυτός ο χρήστης υποβάλλει ξανά τη φόρμα σας." PK=A#]cX�Nconvertforms/getresponse/language/fi-FI/fi-FI.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="GetResponse" PLG_CONVERTFORMS_GETRESPONSE="Convert Forms - GetResponse liitäntä" PLG_CONVERTFORMS_GETRESPONSE_DESC="Convert Forms - Integrointi GetResponse Email Marketing palveluun" PLG_CONVERTFORMS_GETRESPONSE_KEY="API Key" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="Sinun GetResponse API Key" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="Mistä löytyy API Key?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Kampanjan merkki" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="Kampanjan merkki, jonka käyttäjän tulee tilata" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Päivitä nykyinen käyttäjä" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Valitse, haluatko päivittää nykyisen GetResponse-käyttäjän, jos kyseinen käyttäjä lähettää uudestaan lomakkeen" PK=A#]Ÿ73JJNconvertforms/getresponse/language/de-DE/de-DE.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="GetResponse" PLG_CONVERTFORMS_GETRESPONSE="Convert Forms - GetResponse Integration" PLG_CONVERTFORMS_GETRESPONSE_DESC="Convert Forms - Integration mit GetResponse E-Mail-Marketing-Diensten." PLG_CONVERTFORMS_GETRESPONSE_KEY="API Schlüssel" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="Ihr GetResponse API Schlüssel" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="Wo findet man den API Schlüssel?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Kampagnen-Token" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="Der Kampagnen-Token, bei dem der Benutzer hinzugefügt werden soll" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Bestehenden Benutzer aktualisieren" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Wählen Sie, ob Sie Ihren bestehenden GetResponse-Benutzer aktualisieren möchten, wenn dieser Benutzer Ihr Formular erneut abschickt" PK=A#]�r��Rconvertforms/getresponse/language/en-GB/en-GB.plg_convertforms_getresponse.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE="Convert Forms - GetResponse Integration" PLG_CONVERTFORMS_GETRESPONSE_DESC="Convert Forms - Integration with GetResponse Email Marketing Services." PK=A#]�#����Nconvertforms/getresponse/language/en-GB/en-GB.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="GetResponse" PLG_CONVERTFORMS_GETRESPONSE="Convert Forms - GetResponse Integration" PLG_CONVERTFORMS_GETRESPONSE_DESC="Convert Forms - Integration with GetResponse Email Marketing Services." PLG_CONVERTFORMS_GETRESPONSE_KEY="API Key" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="Your GetResponse API Key" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="Where to find API Key?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Campaign Token" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="The Campaign Token which the user should be subscribed to" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Update existing user" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Choose if you want to update your existing GetResponse user if that user resubmits your form"PK=A#]���))Nconvertforms/getresponse/language/uk-UA/uk-UA.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="GetResponse" PLG_CONVERTFORMS_GETRESPONSE="Перетворити форми - інтеграція GetResponse" PLG_CONVERTFORMS_GETRESPONSE_DESC="Перетворити форми - інтеграція з маркетинговими послугами GetResponse." PLG_CONVERTFORMS_GETRESPONSE_KEY="ключ API" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="Ваш ключ API GetResponse" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="Де я можу знайти ключ API?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Идентифікатор листа" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="Маркер кампанії, на який повинен підписатися користувач" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Оновити існуючого користувача" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Виберіть, чи бажаєте ви оновити існуючого користувача GetResponse, коли той користувач знову подасть форму." PK=A#][1.sNconvertforms/getresponse/language/et-EE/et-EE.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="GetResponse" PLG_CONVERTFORMS_GETRESPONSE="Convert Forms - GetResponse integreerimine" PLG_CONVERTFORMS_GETRESPONSE_DESC="Convert Forms - Integreerimine GetResponse e-mailide turunduse teenusega." PLG_CONVERTFORMS_GETRESPONSE_KEY="API võti" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="Sinu GetResponse API võti" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="Kuidas leida API võtit?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Kampaania võti" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="Kampaania võti millega kasutaja saab registreeruda" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Uuenda olemasolevat kasutajat" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Vali, kas soovid uuendada olemasolevat kasutajat GetResponse keskkonnas kui kasutaja vormi andmed sisestab" PK=A#]�� ��Nconvertforms/getresponse/language/fr-FR/fr-FR.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="GetResponse" PLG_CONVERTFORMS_GETRESPONSE="Convertisseur de formulaire - Intégration de GetResponse" PLG_CONVERTFORMS_GETRESPONSE_DESC="Convertisseur de formulaires - Intégration avec les services de Marketing et d'E-mailing de GetResponse" PLG_CONVERTFORMS_GETRESPONSE_KEY="Clé de l'API" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="Votre clé de l'API GetResponse" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="Où trouver la clé de l'API ?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Token de la campagne" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="Le token de la campagne à laquelle l'utilisateur doit s'abonner" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Mettre à jour un utilisateur existant" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Choisissez si vous voulez mettre à jour l'utilisateur existant de GetResponse si cet utilisateur soumet à nouveau votre formulaire." PK=A#]��%wwNconvertforms/getresponse/language/sk-SK/sk-SK.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="Získajte odpoveď" PLG_CONVERTFORMS_GETRESPONSE="Konvertovať formuláre – získať integráciu odozvy" PLG_CONVERTFORMS_GETRESPONSE_DESC="Konvertovať formuláre – integrácia s e-mailovými marketingovými službami Get Response." PLG_CONVERTFORMS_GETRESPONSE_KEY="API kľúč" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="Váš kľúč API Get Response" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="Kde nájsť kľúč API?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Token kampane" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="Token kampane, na odber ktorého by sa mal používateľ prihlásiť" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Aktualizovať existujúceho používateľa" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Vyberte, či chcete aktualizovať svojho existujúceho používateľa GetResponse, ak tento používateľ znova odošle váš formulár" PK=A#]��$aaNconvertforms/getresponse/language/ru-RU/ru-RU.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="GetResponse" PLG_CONVERTFORMS_GETRESPONSE="Преобразование форм - интеграция GetResponse" PLG_CONVERTFORMS_GETRESPONSE_DESC="Преобразование форм - интеграция с сервисами почтового маркетинга GetResponse." PLG_CONVERTFORMS_GETRESPONSE_KEY="ключ API" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="Ваш ключ API GetResponse" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="Где я могу найти ключ API?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Токен кампании" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="Токен кампании, на который должен подписаться пользователь" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Обновить существующего пользователя" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Выберите, хотите ли вы обновить существующего пользователя GetResponse, когда этот пользователь снова отправит вашу форму." PK=A#]�:2Nconvertforms/getresponse/language/cs-CZ/cs-CZ.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="GetResponse" PLG_CONVERTFORMS_GETRESPONSE="Convert Forms - Integrace GetResponse" PLG_CONVERTFORMS_GETRESPONSE_DESC="Convert Forms - Integrace GetResponse." PLG_CONVERTFORMS_GETRESPONSE_KEY="API klíč" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="Váš GetResponse API klíč" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="Kde získáte API klíč?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Token kampaně" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="Token kampaně, ke které se uživatel přihlašuje" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Upravit stávajícího uživatele" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Vyberte si zda chcete aktualizovat existující uživatele GetResponse v případě, že uživatel opakovaně odešle formulář" PK=A#]�ST�88Nconvertforms/getresponse/language/ca-ES/ca-ES.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="GetResponse" PLG_CONVERTFORMS_GETRESPONSE="Integració Convert Forms - Get response" PLG_CONVERTFORMS_GETRESPONSE_DESC="Integració entre Convert Forms i els serveis de màrqueting per correu electrònic GetResponse." PLG_CONVERTFORMS_GETRESPONSE_KEY="Clau API" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="La teva clau API de GetResponse" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="On trobar la clau API?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Token de la campanya" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="El token de la campanya a la que s'hauria de subscriure l'usuari" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Actualitzar usuari existent" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Escull si vols actualitzar el teu usuari GetResponseexistent si aquest usuari torna a respondre al formulari" PK=A#]��Nconvertforms/getresponse/language/it-IT/it-IT.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="GetResponse" PLG_CONVERTFORMS_GETRESPONSE="Integrazione Convert Forms - GetResponse" PLG_CONVERTFORMS_GETRESPONSE_DESC="Integrazione Convert Forms con i servizi Email Marketing di GetResponse." PLG_CONVERTFORMS_GETRESPONSE_KEY="Chiave API" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="La tua chiave API di GetResponse" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="Dove trovare la chiave API?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Token campagna" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="Il token campagna a cui l'utente dovrebbe essere iscritto" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Aggiorna utente esistente" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Seleziona se vuoi aggiornare il tuo utente esistente di GetResponse se quell'utente reinvia il modulo" PK=A#]�9�==Nconvertforms/getresponse/language/bg-BG/bg-BG.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="GetResponse" PLG_CONVERTFORMS_GETRESPONSE="Convert Forms – GetResponse интегррация" PLG_CONVERTFORMS_GETRESPONSE_DESC="Convert Forms – интеграция с GetResponse имейл маркетингови услуги." PLG_CONVERTFORMS_GETRESPONSE_KEY="API ключ" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="Вашия GetResponse API ключ" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="Къде да намерите API ключ?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Токен на Кампания" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="Токен на кампанията, за който потребителят трябва да бъде абониран" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Актуализиране съществуващ потребител" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Изберете дали искате да актуализирате съществуващия си потребител на GetResponse, ако той отново изпрати формуляра си" PK=A#]I�g�CCNconvertforms/getresponse/language/es-ES/es-ES.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="GetResponse" PLG_CONVERTFORMS_GETRESPONSE="\"Formas de conversión\" - Integración con GetResponse" PLG_CONVERTFORMS_GETRESPONSE_DESC="\"Formularios de conversión\" - Integración con servicios de marketing de Email GetResponse." PLG_CONVERTFORMS_GETRESPONSE_KEY="Clave de API" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="Tu clave de API GetResponse" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="¿Dónde encontrar la clave de API?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Seña de campaña" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="La seña de campaña a la que el usuario se debe suscribir" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Actualiza usuario existente" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Elige si quieres actualizar tu usuario de GetResponse existente si ese usuario reenvía el formulario" PK=A#]�&�qNconvertforms/getresponse/language/nl-NL/nl-NL.plg_convertforms_getresponse.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_GETRESPONSE_ALIAS="KrijgAntwoord" PLG_CONVERTFORMS_GETRESPONSE="Convert Forms - KrijgAntwoord Integratie" PLG_CONVERTFORMS_GETRESPONSE_DESC="Convert Forms - Integratie met KrijgAntwoord E-mail Marketing Diensten." PLG_CONVERTFORMS_GETRESPONSE_KEY="API Sleutel" PLG_CONVERTFORMS_GETRESPONSE_KEY_DESC="Uw KrijgAntwoord API Sleutel" PLG_CONVERTFORMS_GETRESPONSE_FIND_API_KEY="Waar vindt u de API Sleutel?" PLG_CONVERTFORMS_GETRESPONSE_LIST_ID="Campagne Token" ; PLG_CONVERTFORMS_GETRESPONSE_LIST_ID_DESC="The Campaign Token which the user should be subscribed to" PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER="Bijwerken bestaande gebruiker" ; PLG_CONVERTFORMS_GETRESPONSE_UPDATE_EXISTING_USER_DESC="Choose if you want to update your existing GetResponse user if that user resubmits your form" PK=A#]��e.yy0convertforms/campaignmonitor/campaignmonitor.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgConvertFormsCampaignMonitor extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ public function subscribe() { $api = new NR_CampaignMonitor(array('api' => $this->lead->campaign->api)); $api->subscribe( $this->lead->email, isset($this->lead->params['name']) ? $this->lead->params['name'] : '', $this->lead->campaign->list, $this->lead->params ); if (!$api->success()) { throw new Exception($api->getLastError()); } } }PK=A#]I=#FF0convertforms/campaignmonitor/campaignmonitor.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_CAMPAIGNMONITOR</name> <description>PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c)2011-2016 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>January 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="campaignmonitor">campaignmonitor.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PK=A#]=�:���Zconvertforms/campaignmonitor/language/en-GB/en-GB.plg_convertforms_campaignmonitor.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR="Convert Forms - Campaign Monitor Integration" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="Convert Forms - Integration with Campaign Monitor Email Marketing Services."PK=A#]6C7A%%Vconvertforms/campaignmonitor/language/en-GB/en-GB.plg_convertforms_campaignmonitor.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR_ALIAS="CampaignMonitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR="Convert Forms - Campaign Monitor Integration" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="Convert Forms - Integration with Campaign Monitor Email Marketing Services." PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY="API Key" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC="Your Campaign Monitor API Key" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID="List ID" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC="The List ID which the user should be subscribed to" PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY="Where to find API Key?"PK=A#]1����Vconvertforms/campaignmonitor/language/uk-UA/uk-UA.plg_convertforms_campaignmonitor.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR_ALIAS="Монітор кампанії" PLG_CONVERTFORMS_CAMPAIGNMONITOR="Перетворити форми - інтеграція монітора Kamganen" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="Перетворити форми - Моніторинг інтеграції кампанії" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY="ключ API" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC="Ключ API монітора вашої кампанії" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID="Ідентифікатор списку" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC="Ідентифікатор списку, до якого повинен увійти користувач" PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY="Де знаходиться ключ API?" PK=A#]�@S((Vconvertforms/campaignmonitor/language/et-EE/et-EE.plg_convertforms_campaignmonitor.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR_ALIAS="CampaignMonitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR="Convert Forms - Campaign Monitor integreerimine" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="Convert Forms - Integreerimine Campaign Monitor e-mailide turunduse teenusega." PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY="API võti" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC="Sinu kampaania API võti" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID="Uudiskirja ID" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC="Uudiskirja ID millega kasutaja liidetakse" PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY="Kuidas leida API võtit?" PK=A#]Y��z��Vconvertforms/campaignmonitor/language/fr-FR/fr-FR.plg_convertforms_campaignmonitor.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR_ALIAS="Supervision de la campagne" PLG_CONVERTFORMS_CAMPAIGNMONITOR="Convertisseur de formulaire - Intégration de la supervision de campagne" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="Convertisseur de formulaires - Intégration avec les services de Marketing et d'E-mailing de la supervision de campagne." PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY="Clé de l'API" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC="Votre clé de l'API de supervision de campagne" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID="ID de la liste" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC="L'ID de la liste à laquelle l'utilisateur doit s'abonner" PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY="Où trouver la clé de l'API ?" PK=A#]��s�iiVconvertforms/campaignmonitor/language/sk-SK/sk-SK.plg_convertforms_campaignmonitor.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR_ALIAS="Monitor kampane" PLG_CONVERTFORMS_CAMPAIGNMONITOR="Konvertovať formuláre – Integrácia monitora kampane" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="Konvertovať formuláre – integrácia s e-mailovými marketingovými službami sledovania kampaní." PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY="API kľúč" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC="Váš kľúč API monitora kampane" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID="ID zoznamu" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC="ID zoznamu, na odber ktorého by sa mal používateľ prihlásiť" PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY="Kde nájsť kľúč API?" PK=A#]��Vconvertforms/campaignmonitor/language/el-GR/el-GR.plg_convertforms_campaignmonitor.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR_ALIAS="Campaign Monitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR="Convert Forms - Ενσωμάτωση Campaign Monitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="Convert Forms - Ενσωμάτωση με υπηρεσίας μάρκετινγκ ηλεκτρονικού ταχυδρομείου Campaign Monitor." PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY="Κλειδί API" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC="Κλειδί API για Campaign Monitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID="Αναγνωριστικό λίστας" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC="Το αναγνωριστικό λίστας στο οποίο πρέπει να εγγραφεί ο χρήστης" PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY="Που να βρείτε το κλειδί API;" PK=A#]T�%z!!Vconvertforms/campaignmonitor/language/fi-FI/fi-FI.plg_convertforms_campaignmonitor.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR_ALIAS="CampaignMonitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR="Convert Forms - Campaign Monitor liitäntä" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="Convert Forms - Integrointi Campaign Monitor Email Marketing palveluun." PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY="API Key" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC="Sinun Campaign Monitor API Key" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID="Luettelo ID" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC="Luettelo ID, jonka käyttäjän tulee tilata" PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY="Mistä löytyy API Key?" PK=A#]u���HHVconvertforms/campaignmonitor/language/de-DE/de-DE.plg_convertforms_campaignmonitor.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR_ALIAS="CampaignMonitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR="Convert Forms - Campaign Monitor Integration" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="Convert Forms - Integration mit Campaign Monitor E-Mail-Marketingdiensten." PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY="API Schlüssel" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC="Ihr Campaign Monitor API Schlüssel" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID="Listen ID" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC="Die Listen ID, zu der der Benutzer hinzugefügt werden soll" PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY="Wo findet man den API Schlüssel?" PK=A#]$x�MMVconvertforms/campaignmonitor/language/ca-ES/ca-ES.plg_convertforms_campaignmonitor.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR_ALIAS="CampaignMonitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR="Integració Convert Forms - Campaign Monitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="Integració entre Convert Forms i els serveis de màrqueting per correu electrònic Campaign Monitor." PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY="Clau API" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC="La clau API de la teva campanya" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID="ID de llista" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC="L'ID del llistat al que s'hauria de subscriure l'usuari" PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY="On trobar la clau API?" PK=A#] z�w@@Vconvertforms/campaignmonitor/language/it-IT/it-IT.plg_convertforms_campaignmonitor.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR_ALIAS="CampaignMonitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR="Integrazione Convert Forms - Campaign Monitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="Integrazione Convert Forms con i servizi di Email Marketing di Campaign Monitor." PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY="Chiave API" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC="La tua chiave API di Campaign Monitor " PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID="ID elenco" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC="L'ID elenco a cui l'utente dovrebbe essere iscritto" PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY="Dove trovare la chiave API?" PK=A#]�\����Vconvertforms/campaignmonitor/language/bg-BG/bg-BG.plg_convertforms_campaignmonitor.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR_ALIAS="CampaignMonitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR="Convert Forms – Campaign Monitor интеграция" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="Convert Forms – Интеграция с Campaign Monitor имейл маркетинг услуги." PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY="API ключ" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC="Вашият Campaign Monitor API ключ" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID="Списък ID" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC="ID на списъка, за който потребителят трябва да се абонира" PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY="Къде да намерите API ключ?" PK=A#]�2bbVconvertforms/campaignmonitor/language/es-ES/es-ES.plg_convertforms_campaignmonitor.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR_ALIAS="CampaignMonitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR="\"Formas de conversión\" - Integración con CampaignMonitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="\"Formularios de conversión\" - Integrar con servicios de marketing de Email CampaignMonitor." PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY="Clave de API" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC="Tu clave de API CampaignMonitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID="Lista ID" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC="La lista ID a la que el usuario debiera estar suscrito" PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY="¿Dónde encontrar la clave de API?" PK=A#]_am�99Vconvertforms/campaignmonitor/language/ru-RU/ru-RU.plg_convertforms_campaignmonitor.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR_ALIAS="Монитор кампании" PLG_CONVERTFORMS_CAMPAIGNMONITOR="Преобразование форм - интеграция Kamganen Monitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="Преобразовать формы - Служба электронного маркетинга мониторинга интеграции кампании." PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY="Ключ API" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC="Ключ API вашего монитора кампании" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID="Идентификатор списка" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC="Идентификатор списка, в который должен войти пользователь" PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY="Где находится ключ API?" PK=A#]ڀ�9::Vconvertforms/campaignmonitor/language/cs-CZ/cs-CZ.plg_convertforms_campaignmonitor.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CAMPAIGNMONITOR_ALIAS="CampaignMonitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR="Convert Forms - Integrace Campaign Monitor" PLG_CONVERTFORMS_CAMPAIGNMONITOR_DESC="Convert Forms - Integrace emailových a marketingových služeb Campaign Monitor." PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY="API klíč" PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC="Váš Campaign Monitor API klíč" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID="ID seznamu" PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC="ID seznamu k jehož odběru se uživatel přihlašuje" PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY="Kde získáte API klíč?" PK=A#]�� b��%convertforms/campaignmonitor/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="api" type="nrtext" label="PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY" description="PLG_CONVERTFORMS_CAMPAIGNMONITOR_KEY_DESC" class="input-xlarge" required="true" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-campaignmonitor" urltext="PLG_CONVERTFORMS_CAMPAIGNMONITOR_FIND_API_KEY" /> <field name="list" type="servicelists" label="PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID" description="PLG_CONVERTFORMS_CAMPAIGNMONITOR_LIST_ID_DESC" class="input-xlarge" required="true" /> </fieldset> </form>PK=A#]n�:���/convertforms/campaignmonitor/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsCampaignMonitorInstallerScript extends PlgConvertFormsCampaignMonitorInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_CAMPAIGNMONITOR'; public $alias = 'campaignmonitor'; public $extension_type = 'plugin'; public $plugin_folder = "convertforms"; public $show_message = false; } PK=A#]]K�g�9�96convertforms/campaignmonitor/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsCampaignmonitorInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK=A#]i����*convertforms/sendinblue/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsSendinBlueInstallerScript extends PlgConvertFormsSendinBlueInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_SENDINBLUE'; public $alias = 'sendinblue'; public $extension_type = 'plugin'; public $plugin_folder = "convertforms"; public $show_message = false; } PK=A#]���sRR convertforms/sendinblue/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="version" type="radio" label="PLG_CONVERTFORMS_SENDINBLUE_VERSION" description="PLG_CONVERTFORMS_SENDINBLUE_VERSION_DESC" class="btn-group btn-group-yesno" default="3"> <option value="3">v3</option> <option value="2">v2</option> </field> <field name="v2_deprecation_notice" type="note" label="PLG_CONVERTFORMS_SENDINBLUE_V2_DEPRECATION" description="PLG_CONVERTFORMS_SENDINBLUE_V2_DEPRECATION_DESC" class="alert alert-danger" showon="version:2" /> <field name="api" type="nrtext" label="PLG_CONVERTFORMS_SENDINBLUE_KEY" description="PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC" class="input-xlarge" required="true" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-sendinblue" urltext="PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY" /> <field name="list" type="servicelists" label="PLG_CONVERTFORMS_SENDINBLUE_LIST_ID" description="PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC" class="input-xlarge" required="true" /> <field name="updateexisting" type="nrtoggle" label="PLG_CONVERTFORMS_SENDINBLUE_UPDATE_EXISTING_USER" description="PLG_CONVERTFORMS_SENDINBLUE_UPDATE_EXISTING_USER_DESC" checked="true" showon="version:3" /> </fieldset> </form>PK=A#]!�#�9�91convertforms/sendinblue/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsSendinblueInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK=A#]Ū���Lconvertforms/sendinblue/language/uk-UA/uk-UA.plg_convertforms_sendinblue.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE_ALIAS="SendinBlue" PLG_CONVERTFORMS_SENDINBLUE="Перетворити форми - інтеграція SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_DESC="Перетворити форми - інтеграція з маркетинговими послугами електронної пошти SendinBlue." PLG_CONVERTFORMS_SENDINBLUE_KEY="ключ API" PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC="Ваш API API SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY="Де я можу знайти ключ API?" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID="список ID" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC="Ідентифікатор списку, на який повинен підписатись користувач. Це може бути розділений комою список для кількох списків." PLG_CONVERTFORMS_SENDINBLUE_FIND_LIST="Де я можу знайти ідентифікатор списку?" PK=A#]_/r�{{Lconvertforms/sendinblue/language/et-EE/et-EE.plg_convertforms_sendinblue.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE_ALIAS="SendinBlue" PLG_CONVERTFORMS_SENDINBLUE="Convert Forms - SendinBlue integreerimine" PLG_CONVERTFORMS_SENDINBLUE_DESC="Convert Forms - Integreerimine SendinBlue e-mailide turunduse teenusega." PLG_CONVERTFORMS_SENDINBLUE_KEY="API võti" PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC="Sinu SendinBlue API võti" PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY="Kuidas leida API võtit?" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID="Uudiskirja ID" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC="Uudiskirja ID millega kasutaja liidetakse. See võib olla ka komadega eraldatud nimekiri mitmest uudiskirjast." PLG_CONVERTFORMS_SENDINBLUE_FIND_LIST="Kuidas leida uudiskirja ID'd?" PK=A#]�Aڀ�Pconvertforms/sendinblue/language/en-GB/en-GB.plg_convertforms_sendinblue.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE="Convert Forms - SendinBlue Integration" PLG_CONVERTFORMS_SENDINBLUE_DESC="Convert Forms - Integration with SendinBlue Email Marketing Services."PK=A#]J���Lconvertforms/sendinblue/language/en-GB/en-GB.plg_convertforms_sendinblue.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE_ALIAS="SendinBlue" PLG_CONVERTFORMS_SENDINBLUE="Convert Forms - SendinBlue Integration" PLG_CONVERTFORMS_SENDINBLUE_DESC="Convert Forms - Integration with SendinBlue Email Marketing Services." PLG_CONVERTFORMS_SENDINBLUE_KEY="API Key" PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC="Your SendinBlue API Key" PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY="Where to find API Key?" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID="List ID" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC="The List ID which the user should be subscribed to. It can be a comma separated list for multiple lists." PLG_CONVERTFORMS_SENDINBLUE_FIND_LIST="Where to find List ID?" PLG_CONVERTFORMS_SENDINBLUE_VERSION="API Version" PLG_CONVERTFORMS_SENDINBLUE_VERSION_DESC="Select the API Version." PLG_CONVERTFORMS_SENDINBLUE_V2_DEPRECATION="API v2 Deprecation Notice" PLG_CONVERTFORMS_SENDINBLUE_V2_DEPRECATION_DESC="On <strong>June 25th 2020</strong> Sendinblue's API v2 started its official deprecation process. Its sunset date has been scheduled for <strong>June 25th 2021</strong>. You're kindly requested to switch over to API v3." PLG_CONVERTFORMS_SENDINBLUE_UPDATE_EXISTING_USER="Update existing user" PLG_CONVERTFORMS_SENDINBLUE_UPDATE_EXISTING_USER_DESC=""PK=A#]�}���Lconvertforms/sendinblue/language/fr-FR/fr-FR.plg_convertforms_sendinblue.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE_ALIAS="SendinBlue" PLG_CONVERTFORMS_SENDINBLUE="Convertisseur de formulaire - Intégration de SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_DESC="Convertisseur de formulaires - Intégration avec les services de Marketing et d'E-mailing de SendinBlue." PLG_CONVERTFORMS_SENDINBLUE_KEY="Clé de l'API" PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC="Votre clé de l'API SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY="Où trouver la clé de l'API ?" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID="ID de la liste" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC="L'ID de la liste à laquelle l'utilisateur doit s'abonner. Séparé par un tiret pour plusieurs listes." PLG_CONVERTFORMS_SENDINBLUE_FIND_LIST="Où trouver l'ID de la liste ?" PK=A#]�Rl��Lconvertforms/sendinblue/language/sk-SK/sk-SK.plg_convertforms_sendinblue.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE_ALIAS="SendinBlue" PLG_CONVERTFORMS_SENDINBLUE="Konvertovať formuláre - SendinBlue Integration" PLG_CONVERTFORMS_SENDINBLUE_DESC="Konvertovať formuláre – integrácia so službami e-mailového marketingu SendinBlue." PLG_CONVERTFORMS_SENDINBLUE_KEY="API kľúč" PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC="Váš kľúč API SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY="Kde nájsť kľúč API?" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID="ID zoznamu" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC="ID zoznamu, na odber ktorého by sa mal používateľ prihlásiť. Môže to byť zoznam oddelený čiarkou pre viacero zoznamov." PLG_CONVERTFORMS_SENDINBLUE_FIND_LIST="Kde nájsť ID zoznamu?" PK=A#]D$�``Lconvertforms/sendinblue/language/el-GR/el-GR.plg_convertforms_sendinblue.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE_ALIAS="SendinBlue" PLG_CONVERTFORMS_SENDINBLUE="Convert Forms - Ενσωμάτωση SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_DESC="Convert Forms - Ενσωμάτωση με Υπηρεσία μάρκετινγκ ηλεκτρονικού ταχυδρομείου SendinBlue." PLG_CONVERTFORMS_SENDINBLUE_KEY="Κλειδί API" PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC="Το κλειδί σας API του SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY="Που θα βρω το κλειδί API?" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID="ID λίστας" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC="Το ID λίστας που πρέπει να εγγραφεί ο χρήστης. Για πολλαπλές λίστες μπορεί να είναι λίστες διαχωρισμένες με κόμμα." PLG_CONVERTFORMS_SENDINBLUE_FIND_LIST="Που θα βρω το ID λίστας?" PK=A#]��>jjLconvertforms/sendinblue/language/fi-FI/fi-FI.plg_convertforms_sendinblue.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE_ALIAS="SendinBlue" PLG_CONVERTFORMS_SENDINBLUE="Convert Forms - SendinBlue liitäntä" PLG_CONVERTFORMS_SENDINBLUE_DESC="Convert Forms - Integrointi with SendinBlue Email Marketing palveluun." PLG_CONVERTFORMS_SENDINBLUE_KEY="API Key" PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC="Sinun SendinBlue API Key" PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY="Mistä löytyy API Key?" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID="Luettelo ID" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC="Luettelo ID, jonka käyttäjän tulee tilata. Se voi olla pilkuilla erotettu luettelo useille luetteloille." PLG_CONVERTFORMS_SENDINBLUE_FIND_LIST="Mistä löytyy luettelo ID?" PK=A#]$ڔ�Lconvertforms/sendinblue/language/de-DE/de-DE.plg_convertforms_sendinblue.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE_ALIAS="SendinBlue" PLG_CONVERTFORMS_SENDINBLUE="Convert Forms - SendinBlue Integration" PLG_CONVERTFORMS_SENDINBLUE_DESC="Convert Forms - Integration mit SendInBlue E-Mail-Marketing-Diensten." PLG_CONVERTFORMS_SENDINBLUE_KEY="API Schlüssel" PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC="Ihr SendinBlue API Schlüssel" PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY="Wo findet man den API Schlüssel?" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID="Listen ID" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC="Die Listen ID, zu der der Benutzer hinzugefügt werden soll. Für mehreren Listen kann es eine durch Komma getrennte Liste sein." PLG_CONVERTFORMS_SENDINBLUE_FIND_LIST="Wo findet man die Listen ID?" PK=A#]T"��Lconvertforms/sendinblue/language/ca-ES/ca-ES.plg_convertforms_sendinblue.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE_ALIAS="SendinBlue" PLG_CONVERTFORMS_SENDINBLUE="Integració Convert Forms - SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_DESC="Integració entre Convert Forms i els serveis de màrqueting per correu electrònic SendinBlue." PLG_CONVERTFORMS_SENDINBLUE_KEY="Clau API" PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC="La teva clau API de SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY="On trobar la clau API?" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID="ID de llista" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC="L'ID del llistat al qual s'hauria de subscriure l'usuari. Pot ser un llistat separat per comes si són múltiples llistes." PLG_CONVERTFORMS_SENDINBLUE_FIND_LIST="On trobar l'ID de llista?" PK=A#]fC�4��Lconvertforms/sendinblue/language/bg-BG/bg-BG.plg_convertforms_sendinblue.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE_ALIAS="SendinBlue" PLG_CONVERTFORMS_SENDINBLUE="Convert Forms – SendinBlue интеграция" PLG_CONVERTFORMS_SENDINBLUE_DESC="Convert Forms – интеграция с SendinBlue имейл маркетинг услуги." PLG_CONVERTFORMS_SENDINBLUE_KEY="API ключ" PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC="Вашият SendinBlue API ключ" PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY="Къде да намерите API ключ?" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID="ID списък" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC="ID на списъка, за който потребителят трябва да се абонира. Може чрез разделени със запетая ID-та, потребителят да бъде добавен в няколко списъка." PLG_CONVERTFORMS_SENDINBLUE_FIND_LIST="Къде да намерите идентификационния номер на списъка?" PK=A#]� ����Lconvertforms/sendinblue/language/es-ES/es-ES.plg_convertforms_sendinblue.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE_ALIAS="SendinBlue" PLG_CONVERTFORMS_SENDINBLUE="\"Formas de conversión\" - Integración con SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_DESC="\"Formularios de conversión\" - Integración con servicios de marketing de Email SendinBlue." PLG_CONVERTFORMS_SENDINBLUE_KEY="Clave de API" PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC="Tu clave de API SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY="¿Dónde encontrar la clave de API?" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID="Lista ID" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC="La lista ID a la que el usuario debiera estar suscrito. Puede ser una lista separada por comas para listas múltiples." PLG_CONVERTFORMS_SENDINBLUE_FIND_LIST="¿Dónde encontrar la Lista ID?" PK=A#]�* (~~Lconvertforms/sendinblue/language/it-IT/it-IT.plg_convertforms_sendinblue.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE_ALIAS="SendinBlue" PLG_CONVERTFORMS_SENDINBLUE="Integrazione Convert Forms - SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_DESC="Integrazione Convert Forms con i servizi Email Marketing di SendinBlue." PLG_CONVERTFORMS_SENDINBLUE_KEY="Chiave API" PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC="La tua chiave API di SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY="Dove trovare la chiave API?" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID="ID elenco" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC="L'ID elenco a cui l'utente dovrebbe essere iscritto. Può essere un elenco separato da virgola per liste multiple." PLG_CONVERTFORMS_SENDINBLUE_FIND_LIST="Dove trovare l'ID elenco?" PK=A#]�Y��Lconvertforms/sendinblue/language/ru-RU/ru-RU.plg_convertforms_sendinblue.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE_ALIAS="SendinBlue" PLG_CONVERTFORMS_SENDINBLUE="Преобразование форм - интеграция с SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_DESC="Конвертировать формы - интеграция с почтовыми маркетинговыми сервисами SendinBlue." PLG_CONVERTFORMS_SENDINBLUE_KEY="Ключ API" PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC="Ваш ключ API SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY="Где я могу найти ключ API?" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID="Список ID" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC="Идентификатор списка, на который пользователь должен подписаться. Это может быть разделенный запятыми список для нескольких списков." PLG_CONVERTFORMS_SENDINBLUE_FIND_LIST="Где я могу найти идентификатор списка?" PK=A#]q{5��Lconvertforms/sendinblue/language/cs-CZ/cs-CZ.plg_convertforms_sendinblue.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SENDINBLUE_ALIAS="SendinBlue" PLG_CONVERTFORMS_SENDINBLUE="Convert Forms - Integrace SendinBlue" PLG_CONVERTFORMS_SENDINBLUE_DESC="Convert Forms - Integrace emailových a marketingových služeb SendinBlue." PLG_CONVERTFORMS_SENDINBLUE_KEY="API klíč" PLG_CONVERTFORMS_SENDINBLUE_KEY_DESC="Váš SendinBlue API klíč" PLG_CONVERTFORMS_SENDINBLUE_FIND_API_KEY="Kde získáte API klíč?" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID="ID seznamu" PLG_CONVERTFORMS_SENDINBLUE_LIST_ID_DESC="ID seznamu k jehož odběru se uživatel přihlašuje. Může to být seznam oddělený čárkami v případě potřeby více seznamů." PLG_CONVERTFORMS_SENDINBLUE_FIND_LIST="Kde najdu ID seznamu?" PK=A#]�����&convertforms/sendinblue/sendinblue.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2021 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgConvertFormsSendInBlue extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ public function subscribe() { $class_name = $this->getCampaignIntegration($this->lead->campaign); $api = new $class_name([ 'api' => $this->lead->campaign->api ]); $api->subscribe( $this->lead->email, $this->lead->params, $this->lead->campaign->list, (bool) $this->lead->campaign->updateexisting ); if (!$api->success()) { throw new Exception($api->getLastError()); } } /** * Returns the campaign integration. * Loads the exact version we have specified in the campaign settings. * * @param array $campaignData * * @return string */ protected function getCampaignIntegration($campaignData) { $campaignData = (array) $campaignData; return parent::getCampaignIntegration($campaignData) . $this->getSuffix($campaignData['version']); } /** * Get integration suffix * * @param string $version * * @return mixed */ private function getSuffix($version) { return (int) $version == 3 ? 3 : ''; } }PK=A#]���^00&convertforms/sendinblue/sendinblue.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_SENDINBLUE</name> <description>PLG_CONVERTFORMS_SENDINBLUE_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c)2011-2016 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>March 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="sendinblue">sendinblue.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PK=A#]�rP���&convertforms/aweber/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsAWeberInstallerScript extends PlgConvertFormsAWeberInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_AWEBER'; public $alias = 'aweber'; public $extension_type = 'plugin'; public $plugin_folder = "convertforms"; public $show_message = false; } PK=A#]T���}9}9-convertforms/aweber/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsAweberInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK=A#][�W��Dconvertforms/aweber/language/es-ES/es-ES.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="\"Formas de conversión\" - Integración con AWeber" PLG_CONVERTFORMS_AWEBER_DESC="\"Formularios de conversión\" - Integración con servicios de marketing de Email AWeber" PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Código de autorización" PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="Código de autorización creado con AWeber. Copia desde el popup y pégalo aquí." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Obtén tu código de autentificación" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="Lista ID única" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="La Lista ID única de tu Lista. Se puede encontrar en la configuración de Listas de tu cuenta AWeber." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="¿Dónde encontrar tu Lista ID única?" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Actualiza usuario existente" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Actualiza el usuario en AWeber con los nuevos datos si es que ya existe." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="AWeber no permite Optin simple por su API. Lea nuestra <a href='https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber#optin' target='_blank'>documentación</a> para más información." PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE="El código de autorización no es correcto. Por favor intenta obtener uno nuevo." PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="La conexión con AWeber se ha establecido." PK=A#]:�*���Dconvertforms/aweber/language/bg-BG/bg-BG.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="Convert Forms – AWeber интеграция" PLG_CONVERTFORMS_AWEBER_DESC="Convert Forms – интеграциия с AWeber имейл маркетинг услуга." PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Код за разрешение" PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="Кодът за упълномощаване, създаден от AWeber. Копирайте го от изскачащrият прозорец и го поставете тук." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Вземете Auth Code / Код за разрешение" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="Уникален ID идентификационен номер на списъка" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="Уникалният ID идентификационен номер на вашия списък. Той може да бъде намерен в Настройките на списък във вашия AWeber акаунт." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="Къде да намеря уникалния ID номер на списък?" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Актуализирайте съществуващия потребител" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Актуализирайте потребителя в AWeber с новите данни, ако той вече съществува." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="AWeber не поддържа Single Opt-in чрез техния API. Прочетете <a href='https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber#optin' target='_blank'>нашата документация</a> за повече информация." PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE="Кодът за разрешение не е правилен. Моля, опитайте да се сдобиете с нов." PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="Връзката AWeber е успешно установена." PK=A#]�ě6Dconvertforms/aweber/language/it-IT/it-IT.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="Integrazione Convert Forms - AWeber " PLG_CONVERTFORMS_AWEBER_DESC="Integrazione Convert Forms con i servizi Email Marketing di AWeber" PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Codice di autorizzazione" PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="Il codice di autorizzazione creato da AWeber. Copialo dal popup e incollalo qui." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Ricevi il codice di autorizzazione" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="ID elenco unico" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="L'ID elenco unico del tuo elenco. Può essere trovato nelle impostazioni elenco nell'account AWeber." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="Dove trovare il tuo ID elenco unico" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Aggiorna utente esistente" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Aggiorna l'utente su AWeber con le nuove informazioni se è già esistente." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="AWeber non supporta opt-in singolo con le proprie API. Leggi la nostra <a href='https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber#optin' target='_blank'>documentazione</a> per maggiori informazioni." PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE=" Il codice di autorizzazione non è corretto. Ti prego di procurartene uno nuovo." PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="La connessione ad AWeber è stata stabilita con successo." PK=A#]9���99Dconvertforms/aweber/language/sv-SE/sv-SE.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="Convert Forms - AWeber Integration" PLG_CONVERTFORMS_AWEBER_DESC="Convert Forms - Integration med AWeber Email Marketing Services." PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Behörighetskod" PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="Auktoriseringskoden skapad av AWeber. Kopiera den från popup-fönstret och klistra in den här." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Få auktoriseringskoden" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="Unikt List ID" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="Din listas unika ID. Den finns i list-inställningarna på ditt AWeber-konto." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="Var du hittar ditt unika list-ID" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Uppdatera befintlig användare" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Uppdatera användaren på AWeber med den nya datan om den redan finns." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="AWeber stöder inte Single Opt-in via deras API. Läs vår <a href='https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber#optin' target='_blank'>dokumentation</a> för mer information." PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE="Auktoriseringskoden är inte korrekt. Försök att skaffa en ny." ; PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="The AWeber connection has been successfully established." PK=A#]��ׂ�Dconvertforms/aweber/language/ca-ES/ca-ES.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="Integració Convert Forms - AWeber" PLG_CONVERTFORMS_AWEBER_DESC="Integració entre Convert Forms i els serveis de màrqueting per correu electrònic Aweber" PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Codi d'autorització" PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="El codi d'autorització creat a AWeber. Copia'l des de l'emergent i enganxa'l aquí." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Aconseguir l'Auth Code" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="ID de llistat únic" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="L'ID de llistat únic de la teva llista. El pots trobar a la configuració de llistat al teu compte Aweber." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="On trobar l'ID de llistat únic" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Actualitzar usuari existent" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Actualitza l'usuari a Aweber amb les noves dades si ja existeix." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="Aweber no suporta la confirmació d'entrada simple a través de la seva API. Llegeix la nostra <a href='https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber#optin' target='_blank'>documentació</a> per més informació." PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE="El codi d'autorització no és correcte. Aconsegueix-ne un de nou." PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="S'ha establert amb èxit la connexió amb Aweber." PK=A#]�a��N N Dconvertforms/aweber/language/ru-RU/ru-RU.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="Преобразовать формы - интеграция AWeber" PLG_CONVERTFORMS_AWEBER_DESC="Конвертировать формы - интеграция с сервисами почтового маркетинга AWeber." PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Код авторизации" PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="Код авторизации, созданный AWeber. Скопируйте его из всплывающего окна и вставьте его здесь." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Получить код аутентификации" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="Уникальный идентификатор списка" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="Уникальный идентификатор списка вашего списка. Вы можете найти его в настройках списка вашего аккаунта AWeber." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="Где вы можете найти свой уникальный идентификатор списка?" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Обновить существующего пользователя" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Обновите пользователя на AWeber новыми данными, если он уже существует." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="AWeber не поддерживает однократную подписку через свой API. Прочитайте наш <a href = 'https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber# Проверьте "_QQ_"target = '_ blank'> Документация </a> для получения дополнительной информации." PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE="Неправильный код авторизации. Пожалуйста, попробуйте получить новый." PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="Соединение AWeber было успешно установлено." PK=A#]���UUDconvertforms/aweber/language/cs-CZ/cs-CZ.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="Convert Forms - Integrace AWeber" PLG_CONVERTFORMS_AWEBER_DESC="Convert Forms - Integrace AWeber Email." PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Autorizační kód" PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="Autorizační kód vytvořený službou AWeber. Zkopírujte jej z okna a vložte sem." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Získat autorizační kód" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="Unikátní ID seznamu" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="Unikátní ID seznamu. Najdete ho ve svém účtu AWeber v části List Settings." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="Kde najdu ID seznamu" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Upravit stávajícího uživatele" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Aktualizujte informace o uživateli služby AWeber, pokud byl již uživatel vytvořen." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="Služba AWeber nepodporuje jednoduchý Opt-in skrze API. Přečtěte si <a href='https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber#optin' target='_blank'>dokumentataci</a> pro podrobnějsí informace." PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE="Autorizační kód není správný. Prosím, zkontrolujte kód nebo zkuste zadat jiný." PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="Spojení se službou AWeber bylo úspěšně nastaveno." PK=A#]�-L��Dconvertforms/aweber/language/sk-SK/sk-SK.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="Konvertovať formuláre - AWeber Integration" PLG_CONVERTFORMS_AWEBER_DESC="Konvertovať formuláre – integrácia s AWeber Email Marketing Services." PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Konvertovať formuláre – integrácia s AWeber Email Marketing Services." PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="Autorizačný kód vytvorený z AWeber. Skopírujte ho z kontextového okna a vložte ho sem." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Získajte autorizačný kód" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="Jedinečné ID zoznamu" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="Jedinečné ID zoznamu vášho zoznamu. Nájdete ho v nastaveniach zoznamu vo svojom účte AWeber." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="Kde nájsť svoje jedinečné ID zoznamu" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Aktualizovať existujúceho používateľa" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Aktualizujte používateľa na AWeber novými údajmi, ak už existuje." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="AWeber nepodporuje Single Opt-in prostredníctvom svojho API. Prečítajte si našu <a href='https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber#optin' target='_blank'>dokumentáciu </a>pre viac informácií." PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE="Autorizačný kód nie je správny. Skúste získať nový." PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="Spojenie AWeber bolo úspešne nadviazané." PK=A#]m����Dconvertforms/aweber/language/fr-FR/fr-FR.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="Convertisseur de formulaire - Intégration de AWeber" PLG_CONVERTFORMS_AWEBER_DESC="Convertisseur de formulaires - Intégration avec les services de Marketing et d'E-mailing d'AWeber" PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Code d'autorisation" PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="Le code d'autorisation est créé depuis AWeber. Copiez-le depuis le popup et collez-le ici." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Obtenir le code d'authentification" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="ID unique de la liste" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="L'ID unique de votre liste. Il peut être trouvé dans les paramètres de liste dans votre compte AWeber." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="Où trouver votre ID unique de la liste ?" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Mettre à jour un utilisateur existant" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Met à jour l'utilisateur sur AWeber avec les nouvelles données s'il existe déjà." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="AWeber ne supporte pas Single Opt-in depuis son API. Lisez notre <a href='https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber#optin' target='_blank'>documentation</a> d'info." PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE="Le code d'autorisation est erroné. Merci d'essayer d'en obtenir un nouveau." PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="La connexion de AWeber a été établi avec succès." PK=A#]��%%Dconvertforms/aweber/language/et-EE/et-EE.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="Convert Forms - AWeber integreerimine" PLG_CONVERTFORMS_AWEBER_DESC="Convert Forms - Integreerimine AWeber e-mailide turunduse teenusega." PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Autoriseerimise kood" PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="AWeber keskkonnast saadud autoriseerimise kood. Kopeeri see hüpikaknast ja kleebi siia." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Hangi autoriseerimiskood" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="Unikaalse uudiskirja ID" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="Sisesta oma unikaalse uudiskirja ID. Selle leiad uudiskrija seadetest AWeber konto alt." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="Kuidas leida unikaalse uudiskirja ID'd?" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Uuenda olemasolevat kasutajat" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Uuenda AWeber keskkonnas olevat kasutajat kui andmed sisestatakse." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="AWeber ei toeta ühekordset kinnitust üle API. Loe lisainfoks meie <a href='https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber#optin' target='_blank'>dokumentatsiooni</a>. " PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE="Autoriseerimisvõti on vale. Palun hangi uus." PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="Ühendus AWeber keskkonnaga on toimiv." PK=A#]�\M? ? Dconvertforms/aweber/language/uk-UA/uk-UA.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="Перетворити форми - інтеграція в веб-сайти" PLG_CONVERTFORMS_AWEBER_DESC="Перетворити форми - інтеграція з послугами маркетингу електронної пошти AWeber." PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Код авторизації" PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="Код авторизації, створений AWeber. Скопіюйте його зі спливаючого вікна та вставте його сюди." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Отримати код автентифікації" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="Унікальний ідентифікатор списку" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="Унікальний ідентифікатор списку вашого списку. Ви можете знайти його в налаштуваннях списку вашого облікового запису AWeber." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="Де ви можете знайти свій унікальний ідентифікатор списку?" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Оновити існуючого користувача" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Оновіть користувача в AWeber за допомогою нових даних, якщо він вже є." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="AWeber не підтримує єдине вхід через API. Читайте наш <a href = 'https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber# Установіть прапорець "_QQ_"target = '_ blank"_QQ_"> Документація </a> для отримання додаткової інформації. " PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE="Код авторизації невірний. Будь ласка, спробуйте отримати новий." PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="З'єднання AWeber успішно встановлено." PK=A#] ��//Dconvertforms/aweber/language/en-GB/en-GB.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="Convert Forms - AWeber Integration" PLG_CONVERTFORMS_AWEBER_DESC="Convert Forms - Integration with AWeber Email Marketing Services." PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Authorization Code" PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="The Authorization Code created from AWeber. Copy it from the popup and paste it here." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Get the Auth Code" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="Unique List ID" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="The Unique List ID of your List. It can be found in the List Settings in your AWeber Account." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="Where to find your Unique List ID" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Update existing user" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Update the user on AWeber with the new data if he already exists." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="AWeber does not support Single Opt-in through their API. Read our <a href='https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber#optin' target='_blank'>documentation</a> for more info." PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE="The Authorization Code is not correct. Please try to get a new one." PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="The AWeber connection has been successfully established."PK=A#]�DpppHconvertforms/aweber/language/en-GB/en-GB.plg_convertforms_aweber.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER="Convert Forms - AWeber Integration" PLG_CONVERTFORMS_AWEBER_DESC="Convert Forms - Integration with AWeber Email Marketing Services."PK=A#]�)���Dconvertforms/aweber/language/de-DE/de-DE.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="Convert Forms - AWeber Integration" PLG_CONVERTFORMS_AWEBER_DESC="Convert Forms - Integration mit AWeber E-Mail-Marketing-Diensten." PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Autorisierungscode" PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="Der von AWeber erstellte Autorisierungscode. Kopieren Sie ihn aus dem Popup und fügen Sie ihn hier ein." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Authentifizierungscode abrufen" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="Eindeutige Listen ID" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="Die eindeutige Listen ID Ihrer Liste. Sie finden sie in den Listeneinstellungen in Ihrem AWeber-Konto." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="Wo findet man die eindeutige Listen ID?" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Bestehenden Benutzer aktualisieren" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Aktualisieren Sie den Benutzer auf AWeber mit den neuen Daten, falls er bereits existiert." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="AWeber unterstützt kein einfaches Opt-in über sein API. Lesen Sie unsere <a href='https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber#optin' target='_blank'>Dokumentation</a> für weitere Informationen." PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE="Der Autorisierungscode ist nicht korrekt. Bitte versuchen Sie, einen neuen zu erhalten." PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="Die AWeber-Verbindung wurde erfolgreich hergestellt." PK=A#]�%� Dconvertforms/aweber/language/fi-FI/fi-FI.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="Convert Forms - AWeber liitäntä" PLG_CONVERTFORMS_AWEBER_DESC="Convert Forms - Integrointi AWeber Email Marketing palveluun." PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Valtuutuskoodi" PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="AWeberissä luotu valtuutuskoodi. Kopioi se ponnahdusikkunasta ja liitä se tähän." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Hanki valtuutus-koodi" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="Uniikki luettelo ID" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="Luettelosi uniikki luettelo ID. Se löytyy AWeber-tilisi luetteloasetuksista." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="Mistä löytyy uniikki luettelo ID" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Päivitä nykyinen käyttäjä" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Päivitä AWeber-käyttäjän tiedot uusilla tiedoilla, jos hän on jo olemassa." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="AWeber ei tue kertakirjautumista heidän sovellusliittymänsä kautta. Lue <a href='https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber#optin' target='_blank'>dokumenteista</a> lisätietoa." PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE="Valtuutuskoodi on väärä. Yritä hankkia uusi." PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="AWeber-yhteys on muodostettu onnistuneesti." PK=A#]\c��J J Dconvertforms/aweber/language/el-GR/el-GR.plg_convertforms_aweber.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_AWEBER_ALIAS="AWeber" PLG_CONVERTFORMS_AWEBER="Convert Forms - Ενσωμάτωση AWeber" PLG_CONVERTFORMS_AWEBER_DESC="Convert Forms - Ενσωμάτωση με Υπηρεσία μάρκετινγκ ηλεκτρονικού ταχυδρομείου AWeber." PLG_CONVERTFORMS_AWEBER_AUTH_CODE="Κωδικός εξουσιοδότησης" PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC="Ο κωδικός εξουσιοδότησης δημιουργήθηκε από το AWeber. Αντιγράψτε τον από το αναδυόμενο παράθυρο και επικολλήστε τον εδώ." PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE="Αποκτήστε κωδικό εξουσιοδότησης" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID="Μοναδικό αναγνωσριστικό λίστας" PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC="Το μοναδικό αναγνωριστικό της λίστας σας. Μπορείτε να το βρείτε στις ρυθμίσεις λίστας στο λογαριασμό σας AWeber." PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID="Που να βρείτε το μοναδικό αναγνωριστικό λίστας;" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER="Ενημέρωση υπάρχοντος χρήστη" PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC="Ενημερώστε τον χρήστη AWeber με τα νέα δεδομένα εφόσον αυτός υπάρχει ήδη." PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC="Το AWeber δεν υποστηρίζει Single Opt-in μέσω του δικού τους κλειδιού API. Διαβάστε <a href='https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber#optin' target='_blank'>την τεκμηρίωση</a> για περισσότερες πληροφορίες." PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE="Ο Κωδικός Εξουσιοδότησης δεν είναι σωστός. Προσπαθήστε να λάβετε ένα νέο." PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED="Η σύνδεση AWeber έχει δημιουργήθηκε με επιτυχία." PK=A#]fx�� � +convertforms/aweber/wrapper/curl_object.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ // No direct access defined('_JEXEC') or die('Restricted access'); /** * CurlInterface * * An object-oriented shim that wraps the standard PHP cURL library. * * This interface has been created so that cURL functionality can be stubbed * out for unit testing, or swapped for an alternative library. * * @see curl * @package * @version $id$ */ interface CurlInterface { /** * errNo * * Encapsulates curl_errno - Returns the last error number * @param resource $ch - A cURL handle returned by init. * @access public * @return the error number or 0 if no error occured. */ public function errno($ch); /** * error * * Encapsulates curl_error - Return last error string * @param resource $ch - A cURL handle returned by init. * @access public * @return the error messge or '' if no error occured. */ public function error($ch); /** * execute * * Encapsulates curl_exec - Perform a cURL session. * @param resource $ch - A cURL handle returned by init. * @access public * @return TRUE on success, FALSE on failure. */ public function execute($ch); /** * init * * Encapsulates curl_init - Initialize a cURL session. * @param string $url - url to use. * @access public * @return cURL handle on success, FALSE on failure. */ public function init($url); /** * setopt * * Encapsulates curl_setopt - Set an option for cURL transfer. * @param resource $ch - A cURL handle returned by init. * @param int $opt - The CURLOPT to set. * @param mixed $value - The value to set. * @access public * @return True on success, FALSE on failure. */ public function setopt($ch, $option, $value); } /** * CurlObject * * A concrete implementation of CurlInterface using the PHP cURL library. * * @package * @version $id$ */ class CurlObject implements CurlInterface { public function errno($ch) { return curl_errno($ch); } public function error($ch) { return curl_error($ch); } public function execute($ch) { return curl_exec($ch); } public function init($url) { return curl_init($url); } public function setopt($ch, $option, $value) { return curl_setopt($ch, $option, $value); } } ?> PK=A#]��a�>>'convertforms/aweber/wrapper/wrapper.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ // No direct access defined('_JEXEC') or die; require_once __DIR__ . '/aweber_api.php'; class NR_AWeber { /** * Create a new instance of NR_AWeber * * @param array $credentials An array containing the consumerKey, consumerSecret, * accessToken and accessSecret * @param string $listUID The AWeber Unique List ID */ public function __construct($credentials, $listUID) { if (!NR_AWeber::checkCredentials($credentials)) { throw new Exception("The AWeber Credentials are incomplete or incorrect", 1); } $this->application = new AWeberAPI($credentials['consumerKey'], $credentials['consumerSecret']); $this->account = $this->application->getAccount($credentials['accessToken'], $credentials['accessSecret']); $this->list = $this->findList($listUID); if ($this->list === false) { throw new Exception("The AWeber List could not be found", 1); } } /** * Finds the List resource * * @param string $listUID The AWeber Unique List ID * * @return object The AWeber List resource */ public function findList($listUID) { $foundLists = $this->account->lists->find(array('name' => $listUID)); if (count($foundLists)) { $foundList = $foundLists[0]; $listUrl = "/accounts/{$this->account->id}/lists/{$foundList->id}"; $list = $this->account->loadFromUrl($listUrl); return $list; } return false; } /** * Finds the Subscriber resource * * @param string $email The email of the subscriber we are searching for * * @return object The AWeber Subscriber resource */ public function findSubscriber($email) { $foundSubscribers = $this->list->subscribers->find(array('email' => $email)); return $foundSubscribers[0]; } /** * Updates a Subscriber * * @param array $subscriber An array containing subscriber data * * @return boolean The result of the operation */ public function updateSubscriber($subscriber) { $oldSubscriber = $this->findSubscriber($subscriber['email']); // If the subscriber does not exist, create it if (!is_object($oldSubscriber)) { return $this->createSubscriber($subscriber); } foreach ($subscriber as $key => $value) { // Fix Tags if ($key == 'tags') { $newTags = $value; if (empty($newTags) || is_null($newTags)) { continue; } $oldSubscriber->tags = [ 'add' => (array) $newTags, 'remove' => array_diff($oldSubscriber->data['tags'], $newTags) ]; continue; } $oldSubscriber->$key = $value; } $oldSubscriber->save(); return true; } /** * Creates a Subscriber * * @param array $subscriber An array containing subscriber data * * @return boolean The result of the operation */ public function createSubscriber($subscriber) { $newSubscriber = $this->list->subscribers->create($subscriber); return true; } /** * The entry point of a subscribe operation * * @param array $subscriber An array containing subscriber data * * @return boolean The result of the operation */ public function subscribe($subscriber) { if ($subscriber['updateexisting']) { $this->updateSubscriber($subscriber); } else { $this->createSubscriber($subscriber); } return true; } /** * Checks if the credentials have the correct structure for the OAuth 1.0 protocol * * @param array $credentials An array containing the consumerKey, consumerSecret, * accessToken and accessSecret * @param object $oldCampaign The campaign object carrying the old data * * @return boolean The result of the check */ public static function checkCredentials($credentials, $oldCampaign = false) { // Typecast simple objects $credentials = (array) $credentials; // Remove empty values $credentials = array_filter($credentials); // We need to have the following keys present in the credentials array $requiredCredentialsKeys = array('consumerKey', 'consumerSecret', 'accessToken', 'accessSecret'); // We need to check if the Auth Code has changed if (($oldCampaign !== false) && (is_object($oldCampaign)) && (isset($oldCampaign->authcode)) && ($oldCampaign->authcode !== $credentials['authcode'])) { return false; } // Check if the above mandatory keys are present if (count(array_intersect_key(array_flip($requiredCredentialsKeys), $credentials)) == count($requiredCredentialsKeys)) { return true; } } /** * Returns a new array with valid only custom fields * * @param array $customFields Array of custom fields * * @return array Array of valid only custom fields */ public function validateCustomFields($customFields) { $fields = array(); if (!is_array($customFields)) { return $fields; } $listCustomFields = $this->list->custom_fields; if (count($listCustomFields)) { foreach ($listCustomFields as $key => $customField) { if (!isset($customFields[$customField->name])) { continue; } $fields[$customField->name] = $customFields[$customField->name]; } } return $fields; } /** * Checks if the Authorization Code structure is correct * * @param string $authCode The Authorization Code * * @return boolean The result of the check */ public static function checkAuthCode($authCode) { $values = explode('|', $authCode); if (count($values) < 5) { return false; } return true; } }PK=A#]y��!��-convertforms/aweber/wrapper/curl_response.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ // No direct access defined('_JEXEC') or die('Restricted access'); # CurlResponse # # Author Sean Huber - shuber@huberry.com # Date May 2008 # # A basic CURL wrapper for PHP # # See the README for documentation/examples or http://php.net/curl for more information # about the libcurl extension for PHP -- http://github.com/shuber/curl/tree/master # class CurlResponse { public $body = ''; public $headers = array(); public function __construct($response) { # Extract headers from response $pattern = '#HTTP/\d\.\d.*?$.*?\r\n\r\n#ims'; preg_match_all($pattern, $response, $matches); $headers = explode("\r\n", str_replace("\r\n\r\n", '', array_pop($matches[0]))); # Extract the version and status from the first header $version_and_status = array_shift($headers); preg_match('#HTTP/(\d\.\d)\s(\d\d\d)\s(.*)#', $version_and_status, $matches); $this->headers['Http-Version'] = $matches[1]; $this->headers['Status-Code'] = $matches[2]; $this->headers['Status'] = $matches[2] . ' ' . $matches[3]; # Convert headers into an associative array foreach ($headers as $header) { preg_match('#(.*?)\:\s(.*)#', $header, $matches); $this->headers[$matches[1]] = $matches[2]; } # Remove the headers from the response body $this->body = preg_replace($pattern, '', $response); } public function __toString() { return $this->body; } public function headers() { return $this->headers; } } PK=A#]�C=##-convertforms/aweber/wrapper/oauth_adapter.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ // No direct access defined('_JEXEC') or die('Restricted access'); interface AWeberOAuthAdapter { public function request($method, $uri, $data = array()); public function getRequestToken($callbackUrl = false); } ?> PK=A#]2�mm/convertforms/aweber/wrapper/aweber_response.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ // No direct access defined('_JEXEC') or die('Restricted access'); /** * AWeberResponse * * Base class for objects that represent a response from the AWeberAPI. * Responses will exist as one of the two AWeberResponse subclasses: * - AWeberEntry - a single instance of an AWeber resource * - AWeberCollection - a collection of AWeber resources * @uses AWeberAPIBase * @package * @version $id$ */ class AWeberResponse extends AWeberAPIBase { public $adapter = false; public $data = array(); public $_dynamicData = array(); /** * __construct * * Creates a new AWeberRespones * * @param mixed $response Data returned by the API servers * @param mixed $url URL we hit to get the data * @param mixed $adapter OAuth adapter used for future interactions * @access public * @return void */ public function __construct($response, $url, $adapter) { $this->adapter = $adapter; $this->url = $url; $this->data = $response; } /** * __set * * Manual re-implementation of __set, allows sub classes to access * the default behavior by using the parent:: format. * * @param mixed $key Key of the attr being set * @param mixed $value Value being set to the attr * @access public */ public function __set($key, $value) { $this->{$key} = $value; } /** * __get * * PHP "MagicMethod" to allow for dynamic objects. Defers first to the * data in $this->data. * * @param String $value Name of the attribute requested * @access public * @return mixed */ public function __get($value) { if (in_array($value, $this->_privateData)) { return null; } if (array_key_exists($value, $this->data)) { return $this->data[$value]; } if ($value == 'type') { return $this->_type(); } } } PK=A#]-�"�K�K1convertforms/aweber/wrapper/oauth_application.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ // No direct access defined('_JEXEC') or die('Restricted access'); if (!class_exists('CurlObject')) { require_once 'curl_object.php'; } if (!class_exists('CurlResponse')) { require_once 'curl_response.php'; } /** * OAuthServiceProvider * * Represents the service provider in the OAuth authentication model. * The class that implements the service provider will contain the * specific knowledge about the API we are interfacing with, and * provide useful methods for interfacing with its API. * * For example, an OAuthServiceProvider would know the URLs necessary * to perform specific actions, the type of data that the API calls * would return, and would be responsible for manipulating the results * into a useful manner. * * It should be noted that the methods enforced by the OAuthServiceProvider * interface are made so that it can interact with our OAuthApplication * cleanly, rather than from a general use perspective, though some * methods for those purposes do exists (such as getUserData). * * @package * @version $id$ */ interface OAuthServiceProvider { public function getAccessTokenUrl(); public function getAuthorizeUrl(); public function getRequestTokenUrl(); public function getAuthTokenFromUrl(); public function getBaseUri(); public function getUserData(); } /** * OAuthApplication * * Base class to represent an OAuthConsumer application. This class is * intended to be extended and modified for each ServiceProvider. Each * OAuthServiceProvider should have a complementary OAuthApplication * * The OAuthApplication class should contain any details on preparing * requires that is unique or specific to that specific service provider's * implementation of the OAuth model. * * This base class is based on OAuth 1.0, designed with AWeber's implementation * as a model. An OAuthApplication built to work with a different service * provider (especially an OAuth2.0 Application) may alter or bypass portions * of the logic in this class to meet the needs of the service provider it * is designed to interface with. * * @package * @version $id$ */ class OAuthApplication implements AWeberOAuthAdapter { public $debug = false; public $userAgent = 'AWeber OAuth Consumer Application 1.0 - https://labs.aweber.com/'; public $format = false; public $requiresTokenSecret = true; public $signatureMethod = 'HMAC-SHA1'; public $version = '1.0'; public $curl = false; /** * @var OAuthUser User currently interacting with the service provider */ public $user = false; // Data binding this OAuthApplication to the consumer application it is acting // as a proxy for public $consumerKey = false; public $consumerSecret = false; /** * __construct * * Create a new OAuthApplication, based on an OAuthServiceProvider * @access public * @return void */ public function __construct($parentApp = false) { if ($parentApp) { if (!is_a($parentApp, 'OAuthServiceProvider')) { throw new Exception('Parent App must be a valid OAuthServiceProvider!'); } $this->app = $parentApp; } $this->user = new OAuthUser(); $this->curl = new CurlObject(); } /** * request * * Implemented for a standard OAuth adapter interface * @param mixed $method * @param mixed $uri * @param array $data * @param array $options * @access public * @return void */ public function request($method, $uri, $data = array(), $options = array()) { $uri = $this->app->removeBaseUri($uri); $url = $this->app->getBaseUri() . $uri; # WARNING: non-primative items in data must be json serialized in GET and POST. if ($method == 'POST' or $method == 'GET') { foreach ($data as $key => $value) { if (is_array($value)) { $data[$key] = json_encode($value); } } } $response = $this->makeRequest($method, $url, $data); if (!empty($options['return'])) { if ($options['return'] == 'status') { return $response->headers['Status-Code']; } if ($options['return'] == 'headers') { return $response->headers; } if ($options['return'] == 'integer') { return intval($response->body); } } $data = json_decode($response->body, true); if (empty($options['allow_empty']) && !isset($data)) { throw new AWeberResponseError($uri); } return $data; } /** * getRequestToken * * Gets a new request token / secret for this user. * @access public * @return void */ public function getRequestToken($callbackUrl = false) { $data = ($callbackUrl) ? array('oauth_callback' => $callbackUrl) : array(); $resp = $this->makeRequest('POST', $this->app->getRequestTokenUrl(), $data); $data = $this->parseResponse($resp); $this->requiredFromResponse($data, array('oauth_token', 'oauth_token_secret')); $this->user->requestToken = $data['oauth_token']; $this->user->tokenSecret = $data['oauth_token_secret']; return $data['oauth_token']; } /** * getAccessToken * * Makes a request for access tokens. Requires that the current user has an authorized * token and token secret. * * @access public * @return void */ public function getAccessToken() { $resp = $this->makeRequest('POST', $this->app->getAccessTokenUrl(), array('oauth_verifier' => $this->user->verifier) ); $data = $this->parseResponse($resp); $this->requiredFromResponse($data, array('oauth_token', 'oauth_token_secret')); if (empty($data['oauth_token'])) { throw new AWeberOAuthDataMissing('oauth_token'); } $this->user->accessToken = $data['oauth_token']; $this->user->tokenSecret = $data['oauth_token_secret']; return array($data['oauth_token'], $data['oauth_token_secret']); } /** * parseAsError * * Checks if response is an error. If it is, raise an appropriately * configured exception. * * @param mixed $response Data returned from the server, in array form * @access public * @throws AWeberOAuthException * @return void */ public function parseAsError($response) { if (!empty($response['error'])) { throw new AWeberOAuthException($response['error']['type'], $response['error']['message']); } } /** * requiredFromResponse * * Enforce that all the fields in requiredFields are present and not * empty in data. If a required field is empty, throw an exception. * * @param mixed $data Array of data * @param mixed $requiredFields Array of required field names. * @access protected * @return void */ protected function requiredFromResponse($data, $requiredFields) { foreach ($requiredFields as $field) { if (empty($data[$field])) { throw new AWeberOAuthDataMissing($field); } } } /** * get * * Make a get request. Used to exchange user tokens with serice provider. * @param mixed $url URL to make a get request from. * @param array $data Data for the request. * @access protected * @return void */ protected function get($url, $data) { $url = $this->_addParametersToUrl($url, $data); $handle = $this->curl->init($url); $resp = $this->_sendRequest($handle); return $resp; } /** * _addParametersToUrl * * Adds the parameters in associative array $data to the * given URL * @param String $url URL * @param array $data Parameters to be added as a query string to * the URL provided * @access protected * @return void */ protected function _addParametersToUrl($url, $data) { if (!empty($data)) { if (strpos($url, '?') === false) { $url .= '?' . $this->buildData($data); } else { $url .= '&' . $this->buildData($data); } } return $url; } /** * generateNonce * * Generates a 'nonce', which is a unique request id based on the * timestamp. If no timestamp is provided, generate one. * @param mixed $timestamp Either a timestamp (epoch seconds) or false, * in which case it will generate a timestamp. * @access public * @return string Returns a unique nonce */ public function generateNonce($timestamp = false) { if (!$timestamp) { $timestamp = $this->generateTimestamp(); } return md5($timestamp . '-' . rand(10000, 99999) . '-' . uniqid()); } /** * generateTimestamp * * Generates a timestamp, in seconds * @access public * @return int Timestamp, in epoch seconds */ public function generateTimestamp() { return time(); } /** * createSignature * * Creates a signature on the signature base and the signature key * @param mixed $sigBase Base string of data to sign * @param mixed $sigKey Key to sign the data with * @access public * @return string The signature */ public function createSignature($sigBase, $sigKey) { switch ($this->signatureMethod) { case 'HMAC-SHA1': default: return base64_encode(hash_hmac('sha1', $sigBase, $sigKey, true)); } } /** * encode * * Short-cut for utf8_encode / rawurlencode * @param mixed $data Data to encode * @access protected * @return void Encoded data */ protected function encode($data) { return rawurlencode($data); } /** * createSignatureKey * * Creates a key that will be used to sign our signature. Signatures * are signed with the consumerSecret for this consumer application and * the token secret of the user that the application is acting on behalf * of. * @access public * @return void */ public function createSignatureKey() { return $this->consumerSecret . '&' . $this->user->tokenSecret; } /** * getOAuthRequestData * * Get all the pre-signature, OAuth specific parameters for a request. * @access public * @return void */ public function getOAuthRequestData() { $token = $this->user->getHighestPriorityToken(); $ts = $this->generateTimestamp(); $nonce = $this->generateNonce($ts); return array( 'oauth_token' => $token, 'oauth_consumer_key' => $this->consumerKey, 'oauth_version' => $this->version, 'oauth_timestamp' => $ts, 'oauth_signature_method' => $this->signatureMethod, 'oauth_nonce' => $nonce); } /** * mergeOAuthData * * @param mixed $requestData * @access public * @return void */ public function mergeOAuthData($requestData) { $oauthData = $this->getOAuthRequestData(); return array_merge($requestData, $oauthData); } /** * createSignatureBase * * @param mixed $method String name of HTTP method, such as "GET" * @param mixed $url URL where this request will go * @param mixed $data Array of params for this request. This should * include ALL oauth properties except for the signature. * @access public * @return void */ public function createSignatureBase($method, $url, $data) { $method = $this->encode(strtoupper($method)); $query = parse_url($url, PHP_URL_QUERY); if ($query) { $parts = explode('?', $url, 2); $url = array_shift($parts); $items = explode('&', $query); foreach ($items as $item) { list($key, $value) = explode('=', $item); $data[rawurldecode($key)] = rawurldecode($value); } } $url = $this->encode($url); $data = $this->encode($this->collapseDataForSignature($data)); return $method . '&' . $url . '&' . $data; } /** * collapseDataForSignature * * Turns an array of request data into a string, as used by the oauth * signature * @param mixed $data * @access public * @return void */ public function collapseDataForSignature($data) { ksort($data); $collapse = ''; foreach ($data as $key => $val) { if (!empty($collapse)) { $collapse .= '&'; } $collapse .= $key . '=' . $this->encode($val); } return $collapse; } /** * signRequest * * Signs the request. * * @param mixed $method HTTP method * @param mixed $url URL for the request * @param mixed $data The data to be signed * @access public * @return array The data, with the signature. */ public function signRequest($method, $url, $data) { $base = $this->createSignatureBase($method, $url, $data); $key = $this->createSignatureKey(); $data['oauth_signature'] = $this->createSignature($base, $key); ksort($data); return $data; } /** * makeRequest * * Public facing function to make a request * * @param mixed $method * @param mixed $url - Reserved characters in query params MUST be escaped * @param mixed $data - Reserved characters in values MUST NOT be escaped * @access public * @return void */ public function makeRequest($method, $url, $data = array()) { if ($this->debug) { echo "\n** {$method}: $url\n"; } switch (strtoupper($method)) { case 'POST': $oauth = $this->prepareRequest($method, $url, $data); $resp = $this->post($url, $oauth); break; case 'GET': $oauth = $this->prepareRequest($method, $url, $data); $resp = $this->get($url, $oauth, $data); break; case 'DELETE': $oauth = $this->prepareRequest($method, $url, $data); $resp = $this->delete($url, $oauth); break; case 'PATCH': $oauth = $this->prepareRequest($method, $url, array()); $resp = $this->patch($url, $oauth, $data); break; } // enable debug output if ($this->debug) { echo "<pre>"; print_r($oauth); echo " --> Status: {$resp->headers['Status-Code']}\n"; echo " --> Body: {$resp->body}"; echo "</pre>"; } if (!$resp) { $msg = 'Unable to connect to the AWeber API. (' . $this->error . ')'; $error = array('message' => $msg, 'type' => 'APIUnreachableError', 'documentation_url' => 'https://labs.aweber.com/docs/troubleshooting'); throw new AWeberAPIException($error, $url); } if ($resp->headers['Status-Code'] >= 400) { $data = json_decode($resp->body, true); throw new AWeberAPIException($data['error'], $url); } return $resp; } /** * put * * Prepare an OAuth put method. * * @param mixed $url URL where we are making the request to * @param mixed $data Data that is used to make the request * @access protected * @return void */ protected function patch($url, $oauth, $data) { $url = $this->_addParametersToUrl($url, $oauth); $handle = $this->curl->init($url); $this->curl->setopt($handle, CURLOPT_CUSTOMREQUEST, 'PATCH'); $this->curl->setopt($handle, CURLOPT_POSTFIELDS, json_encode($data)); $resp = $this->_sendRequest($handle, array('Expect:', 'Content-Type: application/json')); return $resp; } /** * post * * Prepare an OAuth post method. * * @param mixed $url URL where we are making the request to * @param mixed $data Data that is used to make the request * @access protected * @return void */ protected function post($url, $oauth) { $handle = $this->curl->init($url); $postData = $this->buildData($oauth); $this->curl->setopt($handle, CURLOPT_POST, true); $this->curl->setopt($handle, CURLOPT_POSTFIELDS, $postData); $resp = $this->_sendRequest($handle); return $resp; } /** * delete * * Makes a DELETE request * @param mixed $url URL where we are making the request to * @param mixed $data Data that is used in the request * @access protected * @return void */ protected function delete($url, $data) { $url = $this->_addParametersToUrl($url, $data); $handle = $this->curl->init($url); $this->curl->setopt($handle, CURLOPT_CUSTOMREQUEST, 'DELETE'); $resp = $this->_sendRequest($handle); return $resp; } /** * buildData * * Creates a string of data for either post or get requests. * @param mixed $data Array of key value pairs * @access public * @return void */ public function buildData($data) { ksort($data); $params = array(); foreach ($data as $key => $value) { $params[] = $key . '=' . $this->encode($value); } return implode('&', $params); } /** * _sendRequest * * Actually makes a request. * @param mixed $handle Curl handle * @param array $headers Additional headers needed for request * @access private * @return void */ private function _sendRequest($handle, $headers = array('Expect:')) { $this->curl->setopt($handle, CURLOPT_RETURNTRANSFER, true); $this->curl->setopt($handle, CURLOPT_HEADER, true); $this->curl->setopt($handle, CURLOPT_HTTPHEADER, $headers); $this->curl->setopt($handle, CURLOPT_USERAGENT, $this->userAgent); $this->curl->setopt($handle, CURLOPT_SSL_VERIFYPEER, FALSE); $this->curl->setopt($handle, CURLOPT_VERBOSE, FALSE); $this->curl->setopt($handle, CURLOPT_CONNECTTIMEOUT, 10); $this->curl->setopt($handle, CURLOPT_TIMEOUT, 90); $resp = $this->curl->execute($handle); if ($resp) { return new CurlResponse($resp); } $this->error = $this->curl->errno($handle) . ' - ' . $this->curl->error($handle); return false; } /** * prepareRequest * * @param mixed $method HTTP method * @param mixed $url URL for the request * @param mixed $data The data to generate oauth data and be signed * @access public * @return void The data, with all its OAuth variables and signature */ public function prepareRequest($method, $url, $data) { $data = $this->mergeOAuthData($data); $data = $this->signRequest($method, $url, $data); return $data; } /** * parseResponse * * Parses the body of the response into an array * @param mixed $string The body of a response * @access public * @return void */ public function parseResponse($resp) { $data = array(); if (!$resp) { return $data;} if (empty($resp)) { return $data;} if (empty($resp->body)) { return $data;} switch ($this->format) { case 'json': $data = json_decode($resp->body); break; default: parse_str($resp->body, $data); } $this->parseAsError($data); return $data; } } /** * OAuthUser * * Simple data class representing the user in an OAuth application. * @package * @version $id$ */ class OAuthUser { public $authorizedToken = false; public $requestToken = false; public $verifier = false; public $tokenSecret = false; public $accessToken = false; /** * isAuthorized * * Checks if this user is authorized. * @access public * @return void */ public function isAuthorized() { if (empty($this->authorizedToken) && empty($this->accessToken)) { return false; } return true; } /** * getHighestPriorityToken * * Returns highest priority token - used to define authorization * state for a given OAuthUser * @access public * @return void */ public function getHighestPriorityToken() { if (!empty($this->accessToken)) { return $this->accessToken; } if (!empty($this->authorizedToken)) { return $this->authorizedToken; } if (!empty($this->requestToken)) { return $this->requestToken; } // Return no token, new user return ''; } } ?> PK=A#]!p��7convertforms/aweber/wrapper/aweber_entry_data_array.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ // No direct access defined('_JEXEC') or die('Restricted access'); class AWeberEntryDataArray implements ArrayAccess, Countable, Iterator { private $counter = 0; protected $data; protected $keys; protected $name; protected $parent; public function __construct($data, $name, $parent) { $this->data = $data; $this->keys = array_keys($data); $this->name = $name; $this->parent = $parent; } public function count() { return sizeOf($this->data); } public function offsetExists($offset) { return (isset($this->data[$offset])); } public function offsetGet($offset) { return $this->data[$offset]; } public function offsetSet($offset, $value) { $this->data[$offset] = $value; $this->parent->{$this->name} = $this->data; return $value; } public function offsetUnset($offset) { unset($this->data[$offset]); } public function rewind() { $this->counter = 0; } public function current() { return $this->data[$this->key()]; } public function key() { return $this->keys[$this->counter]; } public function next() { $this->counter++; } public function valid() { if ($this->counter >= sizeOf($this->data)) { return false; } return true; } } ?> PK=A#]��yU��*convertforms/aweber/wrapper/exceptions.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ // No direct access defined('_JEXEC') or die('Restricted access'); class AWeberException extends Exception { } /** * Thrown when the API returns an error. (HTTP status >= 400) * * * @uses AWeberException * @package * @version $id$ */ class AWeberAPIException extends AWeberException { public $type; public $status; public $message; public $documentation_url; public $url; public function __construct($error, $url) { // record specific details of the API exception for processing $this->url = $url; $this->type = $error['type']; $this->status = array_key_exists('status', $error) ? $error['status'] : ''; $this->message = $error['message']; $this->documentation_url = $error['documentation_url']; parent::__construct($this->message); } } /** * Thrown when attempting to use a resource that is not implemented. * * @uses AWeberException * @package * @version $id$ */ class AWeberResourceNotImplemented extends AWeberException { public function __construct($object, $value) { $this->object = $object; $this->value = $value; parent::__construct("Resource \"{$value}\" is not implemented on this resource."); } } /** * AWeberMethodNotImplemented * * Thrown when attempting to call a method that is not implemented for a resource * / collection. Differs from standard method not defined errors, as this will * be thrown when the method is infact implemented on the base class, but the * current resource type does not provide access to that method (ie calling * getByMessageNumber on a web_forms collection). * * @uses AWeberException * @package * @version $id$ */ class AWeberMethodNotImplemented extends AWeberException { public function __construct($object) { $this->object = $object; parent::__construct("This method is not implemented by the current resource."); } } /** * AWeberOAuthException * * OAuth exception, as generated by an API JSON error response * @uses AWeberException * @package * @version $id$ */ class AWeberOAuthException extends AWeberException { public function __construct($type, $message) { $this->type = $type; $this->message = $message; parent::__construct("{$type}: {$message}"); } } /** * AWeberOAuthDataMissing * * Used when a specific piece or pieces of data was not found in the * response. This differs from the exception that might be thrown as * an AWeberOAuthException when parameters are not provided because * it is not the servers' expectations that were not met, but rather * the expecations of the client were not met by the server. * * @uses AWeberException * @package * @version $id$ */ class AWeberOAuthDataMissing extends AWeberException { public function __construct($missing) { if (!is_array($missing)) { $missing = array($missing); } $this->missing = $missing; $required = join(', ', $this->missing); parent::__construct("OAuthDataMissing: Response was expected to contain: {$required}"); } } /** * AWeberResponseError * * This is raised when the server returns a non-JSON response. This * should only occur when there is a server or some type of connectivity * issue. * * @uses AWeberException * @package * @version $id$ */ class AWeberResponseError extends AWeberException { public function __construct($uri) { $this->uri = $uri; parent::__construct("Request for {$uri} did not respond properly."); } } PK=A#]7zu�"�"*convertforms/aweber/wrapper/aweber_api.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ // No direct access defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/exceptions.php'; require_once __DIR__ . '/oauth_adapter.php'; require_once __DIR__ . '/oauth_application.php'; require_once __DIR__ . '/aweber_response.php'; require_once __DIR__ . '/aweber_collection.php'; require_once __DIR__ . '/aweber_entry_data_array.php'; require_once __DIR__ . '/aweber_entry.php'; /** * AWeberServiceProvider * * Provides specific AWeber information or implementing OAuth. * @uses OAuthServiceProvider * @package * @version $id$ */ class AWeberServiceProvider implements OAuthServiceProvider { /** * @var String Location for API calls */ public $baseUri = 'https://api.aweber.com/1.0'; /** * @var String Location to request an access token */ public $accessTokenUrl = 'https://auth.aweber.com/1.0/oauth/access_token'; /** * @var String Location to authorize an Application */ public $authorizeUrl = 'https://auth.aweber.com/1.0/oauth/authorize'; /** * @var String Location to request a request token */ public $requestTokenUrl = 'https://auth.aweber.com/1.0/oauth/request_token'; public function getBaseUri() { return $this->baseUri; } public function removeBaseUri($url) { return str_replace($this->getBaseUri(), '', $url); } public function getAccessTokenUrl() { return $this->accessTokenUrl; } public function getAuthorizeUrl() { return $this->authorizeUrl; } public function getRequestTokenUrl() { return $this->requestTokenUrl; } public function getAuthTokenFromUrl() { return ''; } public function getUserData() { return ''; } } /** * AWeberAPIBase * * Base object that all AWeberAPI objects inherit from. Allows specific pieces * of functionality to be shared across any object in the API, such as the * ability to introspect the collections map. * * @package * @version $id$ */ class AWeberAPIBase { /** * Maintains data about what children collections a given object type * contains. */ static protected $_collectionMap = array( 'account' => array('lists', 'integrations'), 'broadcast_campaign' => array('links', 'messages', 'stats'), 'followup_campaign' => array('links', 'messages', 'stats'), 'link' => array('clicks'), 'list' => array('campaigns', 'custom_fields', 'subscribers', 'web_forms', 'web_form_split_tests'), 'web_form' => array(), 'web_form_split_test' => array('components'), ); /** * loadFromUrl * * Creates an object, either collection or entry, based on the given * URL. * * @param mixed $url URL for this request * @access public * @return AWeberEntry or AWeberCollection */ public function loadFromUrl($url) { $data = $this->adapter->request('GET', $url); return $this->readResponse($data, $url); } protected function _cleanUrl($url) { return str_replace($this->adapter->app->getBaseUri(), '', $url); } /** * readResponse * * Interprets a response, and creates the appropriate object from it. * @param mixed $response Data returned from a request to the AWeberAPI * @param mixed $url URL that this data was requested from * @access protected * @return mixed */ protected function readResponse($response, $url) { $this->adapter->parseAsError($response); if (!empty($response['id']) || !empty($response['broadcast_id'])) { return new AWeberEntry($response, $url, $this->adapter); } else if (array_key_exists('entries', $response)) { return new AWeberCollection($response, $url, $this->adapter); } return false; } } /** * AWeberAPI * * Creates a connection to the AWeberAPI for a given consumer application. * This is generally the starting point for this library. Instances can be * created directly with consumerKey and consumerSecret. * @uses AWeberAPIBase * @package * @version $id$ */ class AWeberAPI extends AWeberAPIBase { /** * @var String Consumer Key */ public $consumerKey = false; /** * @var String Consumer Secret */ public $consumerSecret = false; /** * @var Object - Populated in setAdapter() */ public $adapter = false; /** * Uses the app's authorization code to fetch an access token * * @param String Authorization code from authorize app page */ public static function getDataFromAweberID($string) { list($consumerKey, $consumerSecret, $requestToken, $tokenSecret, $verifier) = AWeberAPI::_parseAweberID($string); if (!$verifier) { return null; } $aweber = new AWeberAPI($consumerKey, $consumerSecret); $aweber->adapter->user->requestToken = $requestToken; $aweber->adapter->user->tokenSecret = $tokenSecret; $aweber->adapter->user->verifier = $verifier; list($accessToken, $accessSecret) = $aweber->getAccessToken(); return array($consumerKey, $consumerSecret, $accessToken, $accessSecret); } protected static function _parseAWeberID($string) { $values = explode('|', $string); if (count($values) < 5) { return null; } return array_slice($values, 0, 5); } /** * Sets the consumer key and secret for the API object. The * key and secret are listed in the My Apps page in the labs.aweber.com * Control Panel OR, in the case of distributed apps, will be returned * from the getDataFromAweberID() function * * @param String Consumer Key * @param String Consumer Secret * @return null */ public function __construct($key, $secret) { // Load key / secret $this->consumerKey = $key; $this->consumerSecret = $secret; $this->setAdapter(); } /** * Returns the authorize URL by appending the request * token to the end of the Authorize URI, if it exists * * @return string The Authorization URL */ public function getAuthorizeUrl() { $requestToken = $this->user->requestToken; return (empty($requestToken)) ? $this->adapter->app->getAuthorizeUrl() : $this->adapter->app->getAuthorizeUrl() . "?oauth_token={$this->user->requestToken}"; } /** * Sets the adapter for use with the API */ public function setAdapter($adapter = null) { if (empty($adapter)) { $serviceProvider = new AWeberServiceProvider(); $adapter = new OAuthApplication($serviceProvider); $adapter->consumerKey = $this->consumerKey; $adapter->consumerSecret = $this->consumerSecret; } $this->adapter = $adapter; } /** * Fetches account data for the associated account * * @param String Access Token (Only optional/cached if you called getAccessToken() earlier * on the same page) * @param String Access Token Secret (Only optional/cached if you called getAccessToken() earlier * on the same page) * @return Object AWeberCollection Object with the requested * account data */ public function getAccount($token = false, $secret = false) { if ($token && $secret) { $user = new OAuthUser(); $user->accessToken = $token; $user->tokenSecret = $secret; $this->adapter->user = $user; } $body = $this->adapter->request('GET', '/accounts'); $accounts = $this->readResponse($body, '/accounts'); return $accounts[0]; } /** * PHP Automagic */ public function __get($item) { if ($item == 'user') { return $this->adapter->user; } trigger_error("Could not find \"{$item}\""); } /** * Request a request token from AWeber and associate the * provided $callbackUrl with the new token * @param String The URL where users should be redirected * once they authorize your app * @return Array Contains the request token as the first item * and the request token secret as the second item of the array */ public function getRequestToken($callbackUrl) { $requestToken = $this->adapter->getRequestToken($callbackUrl); return array($requestToken, $this->user->tokenSecret); } /** * Request an access token using the request tokens stored in the * current user object. You would want to first set the request tokens * on the user before calling this function via: * * $aweber->user->tokenSecret = $_COOKIE['requestTokenSecret']; * $aweber->user->requestToken = $_GET['oauth_token']; * $aweber->user->verifier = $_GET['oauth_verifier']; * * @return Array Contains the access token as the first item * and the access token secret as the second item of the array */ public function getAccessToken() { return $this->adapter->getAccessToken(); } } ?> PK=A#]���]],convertforms/aweber/wrapper/aweber_entry.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ // No direct access defined('_JEXEC') or die('Restricted access'); class AWeberEntry extends AWeberResponse { /** * @var array Holds list of data keys that are not publicly accessible */ protected $_privateData = array( 'resource_type_link', 'http_etag', ); /** * @var array Stores local modifications that have not been saved */ protected $_localDiff = array(); /** * @var array Holds AWeberCollection objects already instantiated, keyed by * their resource name (plural) */ protected $_collections = array(); /** * attrs * * Provides a simple array of all the available data (and collections) available * in this entry. * * @access public * @return array */ public function attrs() { $attrs = array(); foreach ($this->data as $key => $value) { if (!in_array($key, $this->_privateData) && !strpos($key, 'collection_link')) { $attrs[$key] = $value; } } if (!empty(AWeberAPI::$_collectionMap[$this->type])) { foreach (AWeberAPI::$_collectionMap[$this->type] as $child) { $attrs[$child] = 'collection'; } } return $attrs; } /** * _type * * Used to pull the name of this resource from its resource_type_link * @access protected * @return String */ protected function _type() { if (empty($this->type)) { if (!empty($this->data['resource_type_link'])) { list($url, $type) = explode('#', $this->data['resource_type_link']); $this->type = $type; } elseif (!empty($this->data['broadcast_id'])) { $this->type = 'broadcast'; } else { return null; } } return $this->type; } /** * delete * * Delete this object from the AWeber system. May not be supported * by all entry types. * @access public * @return boolean Returns true if it is successfully deleted, false * if the delete request failed. */ public function delete() { $this->adapter->request('DELETE', $this->url, array(), array('return' => 'status')); return true; } /** * move * * Invoke the API method to MOVE an entry resource to a different List. * * Note: Not all entry resources are eligible to be moved, please * refer to the AWeber API Reference Documentation at * https://labs.aweber.com/docs/reference/1.0 for more * details on which entry resources may be moved and if there * are any requirements for moving that resource. * * @access public * @param AWeberEntry(List) List to move Resource (this) too. * @return mixed AWeberEntry(Resource) Resource created on List ($list) * or False if resource was not created. */ public function move($list, $last_followup_message_number_sent = NULL) { # Move Resource $params = array( 'ws.op' => 'move', 'list_link' => $list->self_link, ); if (isset($last_followup_message_number_sent)) { $params['last_followup_message_number_sent'] = $last_followup_message_number_sent; } $data = $this->adapter->request('POST', $this->url, $params, array('return' => 'headers')); # Return new Resource $url = $data['Location']; $resource_data = $this->adapter->request('GET', $url); return new AWeberEntry($resource_data, $url, $this->adapter); } /** * save * * Saves the current state of this object if it has been changed. * @access public * @return void */ public function save() { if (!empty($this->_localDiff)) { $data = $this->adapter->request('PATCH', $this->url, $this->_localDiff, array('return' => 'status')); } $this->_localDiff = array(); return true; } /** * __get * * Used to look up items in data, and special properties like type and * child collections dynamically. * * @param String $value Attribute being accessed * @access public * @throws AWeberResourceNotImplemented * @return mixed */ public function __get($value) { if (in_array($value, $this->_privateData)) { return null; } if (!empty($this->data) && array_key_exists($value, $this->data)) { if (is_array($this->data[$value])) { $array = new AWeberEntryDataArray($this->data[$value], $value, $this); $this->data[$value] = $array; } return $this->data[$value]; } if ($value == 'type') { return $this->_type(); } if ($this->_isChildCollection($value)) { return $this->_getCollection($value); } throw new AWeberResourceNotImplemented($this, $value); } /** * __set * * If the key provided is part of the data array, then update it in the * data array. Otherwise, use the default __set() behavior. * * @param mixed $key Key of the attr being set * @param mixed $value Value being set to the $key attr * @access public */ public function __set($key, $value) { if (array_key_exists($key, $this->data)) { $this->_localDiff[$key] = $value; return $this->data[$key] = $value; } else { return parent::__set($key, $value); } } /** getParentEntry * * Gets an entry's parent entry * Returns NULL if no parent entry */ public function getParentEntry() { $url_parts = explode('/', $this->url); $size = count($url_parts); #Remove entry id and slash from end of url $url = substr($this->url, 0, -strlen($url_parts[$size - 1]) - 1); #Remove collection name and slash from end of url $url = substr($url, 0, -strlen($url_parts[$size - 2]) - 1); try { $data = $this->adapter->request('GET', $url); return new AWeberEntry($data, $url, $this->adapter); } catch (Exception $e) { return NULL; } } /** * _parseNamedOperation * * Turns a dumb array of json into an array of Entries. This is NOT * a collection, but simply an array of entries, as returned from a * named operation. * * @param array $data * @access protected * @return array */ protected function _parseNamedOperation($data) { $results = array(); foreach ($data as $entryData) { $results[] = new AWeberEntry($entryData, str_replace($this->adapter->app->getBaseUri(), '', $entryData['self_link']), $this->adapter); } return $results; } /** * _methodFor * * Raises exception if $this->type is not in array entryTypes. * Used to restrict methods to specific entry type(s). * @param mixed $entryTypes Array of entry types as strings, ie array('account') * @access protected * @return void */ protected function _methodFor($entryTypes) { if (in_array($this->type, $entryTypes)) { return true; } throw new AWeberMethodNotImplemented($this); } /** * _getCollection * * Returns the AWeberCollection object representing the given * collection name, relative to this entry. * * @param String $value The name of the sub-collection * @access protected * @return AWeberCollection */ protected function _getCollection($value) { if (empty($this->_collections[$value])) { $url = "{$this->url}/{$value}"; $data = $this->adapter->request('GET', $url); $this->_collections[$value] = new AWeberCollection($data, $url, $this->adapter); } return $this->_collections[$value]; } /** * _isChildCollection * * Is the given name of a collection a child collection of this entry? * * @param String $value The name of the collection we are looking for * @access protected * @return boolean * @throws AWeberResourceNotImplemented */ protected function _isChildCollection($value) { $this->_type(); if (!empty(AWeberAPI::$_collectionMap[$this->type]) && in_array($value, AWeberAPI::$_collectionMap[$this->type])) { return true; } return false; } } PK=A#]�����1convertforms/aweber/wrapper/aweber_collection.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ // No direct access defined('_JEXEC') or die('Restricted access'); class AWeberCollection extends AWeberResponse implements ArrayAccess, Iterator, Countable { protected $pageSize = 100; protected $pageStart = 0; protected function _updatePageSize() { # grab the url, or prev and next url and pull ws.size from it $url = $this->url; if (array_key_exists('next_collection_link', $this->data)) { $url = $this->data['next_collection_link']; } elseif (array_key_exists('prev_collection_link', $this->data)) { $url = $this->data['prev_collection_link']; } # scan querystring for ws_size $url_parts = parse_url($url); # we have a query string if (array_key_exists('query', $url_parts)) { parse_str($url_parts['query'], $params); # we have a ws_size if (array_key_exists('ws_size', $params)) { # set pageSize $this->pageSize = $params['ws_size']; return; } } # we dont have one, just count the # of entries $this->pageSize = count($this->data['entries']); } public function __construct($response, $url, $adapter) { parent::__construct($response, $url, $adapter); $this->_updatePageSize(); } /** * @var array Holds list of keys that are not publicly accessible */ protected $_privateData = array( 'entries', 'start', 'next_collection_link', ); /** * getById * * Gets an entry object of this collection type with the given id * @param mixed $id ID of the entry you are requesting * @access public * @return AWeberEntry */ public function getById($id) { $data = $this->adapter->request('GET', "{$this->url}/{$id}"); $url = "{$this->url}/{$id}"; return new AWeberEntry($data, $url, $this->adapter); } /** getParentEntry * * Gets an entry's parent entry * Returns NULL if no parent entry */ public function getParentEntry() { $url_parts = explode('/', $this->url); $size = count($url_parts); # Remove collection id and slash from end of url $url = substr($this->url, 0, -strlen($url_parts[$size - 1]) - 1); try { $data = $this->adapter->request('GET', $url); return new AWeberEntry($data, $url, $this->adapter); } catch (Exception $e) { return NULL; } } /** * _type * * Interpret what type of resources are held in this collection by * analyzing the URL * * @access protected * @return void */ protected function _type() { $urlParts = explode('/', $this->url); $type = array_pop($urlParts); return $type; } /** * create * * Invoke the API method to CREATE a new entry resource. * * Note: Not all entry resources are eligible to be created, please * refer to the AWeber API Reference Documentation at * https://labs.aweber.com/docs/reference/1.0 for more * details on which entry resources may be created and what * attributes are required for creating resources. * * @access public * @param params mixed associtative array of key/value pairs. * @return AWeberEntry(Resource) The new resource created */ public function create($kv_pairs) { # Create Resource $params = array_merge(array('ws.op' => 'create'), $kv_pairs); $data = $this->adapter->request('POST', $this->url, $params, array('return' => 'headers')); # Return new Resource $url = $data['Location']; $resource_data = $this->adapter->request('GET', $url); return new AWeberEntry($resource_data, $url, $this->adapter); } /** * find * * Invoke the API 'find' operation on a collection to return a subset * of that collection. Not all collections support the 'find' operation. * refer to https://labs.aweber.com/docs/reference/1.0 for more information. * * @param mixed $search_data Associative array of key/value pairs used as search filters * * refer to https://labs.aweber.com/docs/reference/1.0 for a * complete list of valid search filters. * * filtering on attributes that require additional permissions to * display requires an app authorized with those additional permissions. * @access public * @return AWeberCollection */ public function find($search_data) { # invoke find operation $params = array_merge($search_data, array('ws.op' => 'find')); $data = $this->adapter->request('GET', $this->url, $params); # get total size $ts_params = array_merge($params, array('ws.show' => 'total_size')); $total_size = $this->adapter->request('GET', $this->url, $ts_params, array('return' => 'integer')); $data['total_size'] = $total_size; # return collection return $this->readResponse($data, $this->url); } /* * ArrayAccess Functions * * Allows this object to be accessed via bracket notation (ie $obj[$x]) * http://php.net/manual/en/class.arrayaccess.php */ public function offsetSet($offset, $value) {} public function offsetUnset($offset) {} public function offsetExists($offset) { if ($offset >= 0 && $offset < $this->total_size) { return true; } return false; } protected function _fetchCollectionData($offset) { # we dont have a next page, we're done if (!array_key_exists('next_collection_link', $this->data)) { return null; } # snag query string args from collection $parsed = parse_url($this->data['next_collection_link']); # parse the query string to get params $pairs = explode('&', $parsed['query']); foreach ($pairs as $pair) { list($key, $val) = explode('=', $pair); $params[$key] = $val; } # calculate new args $limit = $params['ws.size']; $pagination_offset = intval($offset / $limit) * $limit; $params['ws.start'] = $pagination_offset; # fetch data, exclude query string $url_parts = explode('?', $this->url); $data = $this->adapter->request('GET', $url_parts[0], $params); $this->pageStart = $params['ws.start']; $this->pageSize = $params['ws.size']; $collection_data = array('entries', 'next_collection_link', 'prev_collection_link', 'ws.start'); foreach ($collection_data as $item) { if (!array_key_exists($item, $this->data)) { continue; } if (!array_key_exists($item, $data)) { continue; } $this->data[$item] = $data[$item]; } } public function offsetGet($offset) { if (!$this->offsetExists($offset)) { return null; } $limit = $this->pageSize; $pagination_offset = intval($offset / $limit) * $limit; # load collection page if needed if ($pagination_offset !== $this->pageStart) { $this->_fetchCollectionData($offset); } $entry = $this->data['entries'][$offset - $pagination_offset]; # we have an entry, cast it to an AWeberEntry and return it $entry_url = $this->adapter->app->removeBaseUri($entry['self_link']); return new AWeberEntry($entry, $entry_url, $this->adapter); } /* * Iterator */ protected $_iterationKey = 0; public function current() { return $this->offsetGet($this->_iterationKey); } public function key() { return $this->_iterationKey; } public function next() { $this->_iterationKey++; } public function rewind() { $this->_iterationKey = 0; } public function valid() { return $this->offsetExists($this->key()); } /* * Countable interface methods * Allows PHP's count() and sizeOf() functions to act on this object * http://www.php.net/manual/en/class.countable.php */ public function count() { return $this->total_size; } } PK=A#]�]7,��convertforms/aweber/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="authcode" type="nrtext" label="PLG_CONVERTFORMS_AWEBER_AUTH_CODE" description="PLG_CONVERTFORMS_AWEBER_AUTH_CODE_DESC" class="input-xlarge" required="true" url="https://auth.aweber.com/1.0/oauth/authorize_app/7b524f01" urltext="PLG_CONVERTFORMS_AWEBER_FIND_AUTH_CODE" urlpopup="true" /> <field name="uniquelistid" type="nrtext" label="PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID" description="PLG_CONVERTFORMS_AWEBER_UNIQUE_LIST_ID_DESC" class="input-xlarge" required="true" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-aweber#campaign" urltext="PLG_CONVERTFORMS_AWEBER_FIND_UNIQUE_LIST_ID" /> <field name="updateexisting" type="radio" label="PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER" description="PLG_CONVERTFORMS_AWEBER_UPDATE_EXISTING_USER_DESC" class="btn-group btn-group-yesno" default="1"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="optinnote" type="note" description="PLG_CONVERTFORMS_AWEBER_SINGLE_OPTIN_DESC" /> <field name="consumerKey" type="hidden" default="" /> <field name="consumerSecret" type="hidden" default="" /> <field name="accessToken" type="hidden" default="" /> <field name="accessSecret" type="hidden" default="" /> </fieldset> </form>PK=A#],UCCconvertforms/aweber/aweber.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_AWEBER</name> <description>PLG_CONVERTFORMS_AWEBER_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c)2011-2016 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>January 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <folder>wrapper</folder> <filename plugin="aweber">aweber.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PK=A#]�q7^ convertforms/aweber/aweber.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ // No direct access defined('_JEXEC') or die('Restricted access'); class plgConvertFormsAWeber extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ public function subscribe() { $lead = $this->lead; $credentials = array( 'consumerKey' => $lead->campaign->consumerKey, 'consumerSecret' => $lead->campaign->consumerSecret, 'accessToken' => $lead->campaign->accessToken, 'accessSecret' => $lead->campaign->accessSecret, ); $api = new NR_AWeber($credentials, $lead->campaign->uniquelistid); jimport('joomla.application.helper'); $ad_tracking = 'convertforms_' . JApplicationHelper::stringURLSafe($lead->campaign->name); $name = isset($lead->params['name']) ? $lead->params['name'] : ''; $tags = isset($lead->params['tags']) ? explode(',', $lead->params['tags']) : array(); $user = array( 'email' => $lead->email, 'ip_address' => $_SERVER['REMOTE_ADDR'], 'ad_tracking' => $ad_tracking, 'name' => $name, 'tags' => $tags, 'updateexisting' => $lead->campaign->updateexisting ); if ($customFields = $api->validateCustomFields($lead->params)) { $user['custom_fields'] = $customFields; } $api->subscribe($user); } /** * Create the final credentials with the auth code * * @param string $context The context of the content passed to the plugin (added in 1.6) * @param object $article A JTableContent object * @param bool $isNew If the content has just been created * * @return boolean */ public function onContentBeforeSave($context, $article, $isNew) { if ($context != 'com_convertforms.campaign') { return; } if (!is_object($article) || !isset($article->params) || !isset($article->service) || ($article->service != 'aweber')) { return; } $this->loadWrapper(); $oldCampaign = false; if (isset($article->id)) { $oldCampaign = ConvertForms\Helper::getCampaign($article->id); } $params = json_decode($article->params); if (isset($params->authcode) && !NR_AWeber::checkAuthCode($params->authcode)) { JFactory::getApplication()->enqueueMessage(JText::_('PLG_CONVERTFORMS_AWEBER_WRONG_AUTH_CODE'), 'error'); return; } if (isset($params->authcode) && !NR_AWeber::checkCredentials($params, $oldCampaign)) { try { $credentials = AWeberAPI::getDataFromAweberID($params->authcode); $params->consumerKey = $credentials[0]; $params->consumerSecret = $credentials[1]; $params->accessToken = $credentials[2]; $params->accessSecret = $credentials[3]; $article->params = json_encode($params); JFactory::getApplication()->enqueueMessage(JText::_('PLG_CONVERTFORMS_AWEBER_CONNECTION_ESTABLISHED')); } catch (Exception $e) { JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error'); } } return true; } /** * Returns Service Wrapper File * * @return string */ protected function getWrapperFile() { return JPATH_PLUGINS . '/convertforms/aweber/wrapper/wrapper.php'; } }PK=A#]��r;�9�91convertforms/salesforce/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsSalesforceInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK=A#]6EL���*convertforms/salesforce/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsSalesForceInstallerScript extends PlgConvertFormsSalesForceInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_SALESFORCE'; public $alias = 'salesforce'; public $extension_type = 'plugin'; public $plugin_folder = 'convertforms'; public $show_message = false; } PK=A#]��8�33&convertforms/salesforce/salesforce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_SALESFORCE</name> <description>PLG_CONVERTFORMS_SALESFORCE_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c)2011-2017 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>November 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="salesforce">salesforce.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PK=A#]��!�&convertforms/salesforce/salesforce.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgConvertFormsSalesForce extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ public function subscribe() { $api = new NR_SalesForce($this->lead->campaign->organizationID); $api->subscribe( $this->lead->email, $this->lead->params ); if (!$api->success()) { throw new Exception($api->getLastError()); } } }PK=A#]8� � convertforms/salesforce/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="organizationID" type="nrtext" label="PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID" description="PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC" class="input-xlarge" required="true" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-salesforce" urltext="PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID" /> </fieldset> </form>PK=A#]+s�44Lconvertforms/salesforce/language/ca-ES/ca-ES.plg_convertforms_salesforce.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE_ALIAS="SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE="Integració Convert Forms - SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE_DESC="Integració entre Convert Forms i el CRM SalesForce." PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID="ID d'organització" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC="ID de la teva organització SalesForce" PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID="On trobar l'ID d'organització?" PLG_CONVERTFORMS_SALESFORCE_ERROR="Un error ha evitat que SalesForce pogués guardar la pista. Comprova la configuració de la teva campanya." PK=A#]���IILconvertforms/salesforce/language/it-IT/it-IT.plg_convertforms_salesforce.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE_ALIAS="Web-to-Lead di SalesForce" PLG_CONVERTFORMS_SALESFORCE="Integrazione Convert Forms - Web-to-Lead di SalesForce" PLG_CONVERTFORMS_SALESFORCE_DESC="Integrazione Convert Forms con il CRM di SalesForce" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID="ID organizzazione" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC="il tuo ID organizzazione di SalesForce" PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID="Dove trovare l'ID organizzazione?" PLG_CONVERTFORMS_SALESFORCE_ERROR="Un errore ha impedito a SalesForce di memorizzare il lead. Ti prego di controllare la configurazione della tua campagna." PK=A#]D�W���Lconvertforms/salesforce/language/bg-BG/bg-BG.plg_convertforms_salesforce.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE_ALIAS="SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE="Convert Forms – SalesForce Web-to-Lead интегра;ия" PLG_CONVERTFORMS_SALESFORCE_DESC="Convert Forms – интеграция с SalesForce CRM." PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID="ID организация" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC="Вашият SalesForce Organization ID" PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID="Къде да намерите ID идентификационния номер на организацията?" PLG_CONVERTFORMS_SALESFORCE_ERROR="Грешка е попречила на SalesForce да съхранява данни. Моля, проверете конфигурацията Campaign Configuration." PK=A#]�bkLLLconvertforms/salesforce/language/es-ES/es-ES.plg_convertforms_salesforce.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE_ALIAS="Web-to-Lead SalesForce" PLG_CONVERTFORMS_SALESFORCE="\"Formas de conversión\" - Integración con Web-to-Lead SalesForce" PLG_CONVERTFORMS_SALESFORCE_DESC="\"Formularios de conversión\" - Integración con SalesForce CRM." PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID="Organization ID" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC="Organization ID de tu SalesForce" PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID="¿Dónde encontrar la Organización ID?" PLG_CONVERTFORMS_SALESFORCE_ERROR="Un error ha prevenido a SalesForce grabar el Lead. Por favor revisa la configuración de tu campaña." PK=A#]H�)�Lconvertforms/salesforce/language/ru-RU/ru-RU.plg_convertforms_salesforce.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE_ALIAS="SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE="Преобразование форм - интеграция SalesForce с Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE_DESC="Преобразовать формы - интеграция с SalesForce CRM." PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID="организация ID" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC="Ваш идентификатор организации SalesForce" PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID="Где я могу найти идентификатор организации?" PLG_CONVERTFORMS_SALESFORCE_ERROR="SalesForce не удалось сохранить преимущество из-за ошибки. Пожалуйста, проверьте конфигурацию своей кампании." PK=A#]�!� Lconvertforms/salesforce/language/cs-CZ/cs-CZ.plg_convertforms_salesforce.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE_ALIAS="SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE="Convert Forms - Integrace SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE_DESC="Convert Forms - Integrace SalesForce CRM." PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID="ID organizace" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC="Vaše ID organizace u SalesForce" PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID="Kde najdu ID organizace?" PLG_CONVERTFORMS_SALESFORCE_ERROR="Chyba znemožňuje ukládání informací z SalesForce. Zkontrolujte své nastavení kampaně." PK=A#]N��wwPconvertforms/salesforce/language/en-GB/en-GB.plg_convertforms_salesforce.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE="Convert Forms - SalesForce Web-to-Lead Integration" PLG_CONVERTFORMS_SALESFORCE_DESC="Convert Forms - Integration with SalesForce CRM."PK=A#]���gLconvertforms/salesforce/language/en-GB/en-GB.plg_convertforms_salesforce.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE_ALIAS="SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE="Convert Forms - SalesForce Web-to-Lead Integration" PLG_CONVERTFORMS_SALESFORCE_DESC="Convert Forms - Integration with SalesForce CRM." PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID="Organization ID" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC="Your SalesForce Organization ID" PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID="Where to find Organization ID?" PLG_CONVERTFORMS_SALESFORCE_ERROR="An error has prevented SalesForce from storing the Lead. Please check your Campaign Configuration."PK=A#]qlm0Lconvertforms/salesforce/language/uk-UA/uk-UA.plg_convertforms_salesforce.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE_ALIAS="SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE="Перетворити форми - інтеграція веб-лідерів SalesForce" PLG_CONVERTFORMS_SALESFORCE_DESC="Перетворити форми - інтеграція з CRM SalesForce." PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID="ID Організації" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC="Ваш ідентифікатор організації SalesForce" PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID="Де я можу знайти ідентифікатор організації?" PLG_CONVERTFORMS_SALESFORCE_ERROR="SalesForce не змогла зберегти потенційну позицію через помилку. Перевірте конфігурацію кампанії." PK=A#]ƲT^��Lconvertforms/salesforce/language/et-EE/et-EE.plg_convertforms_salesforce.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE_ALIAS="SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE="Convert Forms - SalesForce Web-to-Lead integreerimine" PLG_CONVERTFORMS_SALESFORCE_DESC="Convert Forms - Integreerimine SalesForce CRM'ga." PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID="Organisatsiooni ID" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC="Sinu SalesForce organisatsiooni ID" PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID="Kuidas leida organisatsiooni ID'd?" PLG_CONVERTFORMS_SALESFORCE_ERROR="Viga andmete lähetamisega. Palun kontrolli seadeid." PK=A#]^�7??Lconvertforms/salesforce/language/fr-FR/fr-FR.plg_convertforms_salesforce.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE_ALIAS="SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE="Intégration de SalesForce Web-to-Lead à Convert Forms" PLG_CONVERTFORMS_SALESFORCE_DESC="Convertisseur de formulaires - Intégration avec le CRM SalesForce" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID="ID d'organisation" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC="Votre ID d'organisation SalesForce" PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID="Où trouver l'ID d'organisation ?" PLG_CONVERTFORMS_SALESFORCE_ERROR="Une erreur a empêché SalesForce d'enregistrer le Lead. Vérifiez la configuration de votre campagne" PK=A#]A���33Lconvertforms/salesforce/language/sk-SK/sk-SK.plg_convertforms_salesforce.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE_ALIAS="SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE="Konvertovať formuláre – integrácia SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE_DESC="Konvertovať formuláre – integrácia s SalesForce CRM." PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID="ID organizácie" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC="Vaše ID organizácie SalesForce" PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID="Kde nájsť ID organizácie?" PLG_CONVERTFORMS_SALESFORCE_ERROR="Chyba zabránila SalesForce uložiť potenciálneho zákazníka. Skontrolujte konfiguráciu kampane." PK=A#]R����Lconvertforms/salesforce/language/el-GR/el-GR.plg_convertforms_salesforce.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE_ALIAS="SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE="Convert Forms - Ενσωμάτωση SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE_DESC="Convert Forms - Ενσωμάτωση με with SalesForce CRM." PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID="Αναγνωριστικό Οργανισμού" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC="Το αναγνωριστικό σας για SalesForce" PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID="Που να βρείτε το αναγωνριστικό Οργανισμού;" PLG_CONVERTFORMS_SALESFORCE_ERROR="Ένα σφάλμα εμπόδισε το SalesForce να αποθηκεύσει το δυνητικό πελάτη. Ελέγξτε τη διαμόρφωση της καμπάνιας σας." PK=A#]��5� Lconvertforms/salesforce/language/fi-FI/fi-FI.plg_convertforms_salesforce.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE_ALIAS="SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE="Convert Forms - SalesForce Web-to-Lead liitäntä" PLG_CONVERTFORMS_SALESFORCE_DESC="Convert Forms - Integrointi SalesForce CRM." PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID="Organisaation ID" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC="Sinun SalesForce organisaation ID" PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID="Mistä löytyy organisaatio ID?" PLG_CONVERTFORMS_SALESFORCE_ERROR="Virhe on estänyt SalesForcea tallentamasta tietoa. Tarkista kampanjamäärityksesi." PK=A#]I���33Lconvertforms/salesforce/language/de-DE/de-DE.plg_convertforms_salesforce.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_SALESFORCE_ALIAS="SalesForce Web-to-Lead" PLG_CONVERTFORMS_SALESFORCE="Convert Forms - SalesForce Web-to-Lead Integration" PLG_CONVERTFORMS_SALESFORCE_DESC="Convert Forms - Integration mit SalesForce CRM." PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID="Organisation ID" PLG_CONVERTFORMS_SALESFORCE_ORGANIZATION_ID_DESC="Ihre SalesForce Organisation ID" PLG_CONVERTFORMS_SALESFORCE_FIND_ORGANIZATION_ID="Wo findet man die Organisation ID?" PLG_CONVERTFORMS_SALESFORCE_ERROR="Ein Fehler hat SalesForce daran gehindert, den Lead zu speichern. Bitte überprüfen Sie Ihre Kampagnenkonfiguration." PK=A#]�z�GGLconvertforms/convertkit/language/el-GR/el-GR.plg_convertforms_convertkit.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT_ALIAS="ConvertKit" PLG_CONVERTFORMS_CONVERTKIT="Convert Forms - Ενσωμάτωση ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_DESC="Convert Forms - Ενσωμάτωση με Υπηρεσία μάρκετινγκ ηλεκτρονικού ταχυδρομείου ConvertKit." PLG_CONVERTFORMS_CONVERTKIT_KEY="Κλειδί API" PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC="Το κειδί σας API για το ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID="Αναγνωριστικό φόρμας" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC="Το αναγνωριστικό φόρμας στο οποίο πρέπει να εγγραφεί ο χρήστης" PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY="Που να βρείτε το κλειδί API;" PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID="Που να βρείτε το αναγνωριστικό φόρμας;" PK=A#]P[K�##Lconvertforms/convertkit/language/fi-FI/fi-FI.plg_convertforms_convertkit.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT_ALIAS="ConvertKit" PLG_CONVERTFORMS_CONVERTKIT="Convert Forms - ConvertKit liitäntä" PLG_CONVERTFORMS_CONVERTKIT_DESC="Convert Forms - Integrointi ConvertKit Email Marketing palveluun." PLG_CONVERTFORMS_CONVERTKIT_KEY="API Key" PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC="Sinun ConvertKit API Key" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID="Lomake ID" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC="Lomake ID, jonka käyttäjän tulee tilata" PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY="Mistä löytyy API Key?" PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID="Mistä löytyy lomake ID?" PK=A#]��|�XXLconvertforms/convertkit/language/de-DE/de-DE.plg_convertforms_convertkit.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT_ALIAS="ConvertKit" PLG_CONVERTFORMS_CONVERTKIT="Convert Forms - ConvertKit Integration" PLG_CONVERTFORMS_CONVERTKIT_DESC="Convert Forms - Integration mit ConvertKit E-Mail-Marketing-Diensten." PLG_CONVERTFORMS_CONVERTKIT_KEY="API Schlüssel" PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC="Ihr ConvertKit API Schlüssel" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID="Formular ID" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC="Die Formular ID, zu der der Benutzer hinzugefügt werden soll" PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY="Wo findet man den API Schlüssel?" PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID="Wo findet man die Formular ID?" PK=A#]��+AggLconvertforms/convertkit/language/sk-SK/sk-SK.plg_convertforms_convertkit.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT_ALIAS="ConvertKit" PLG_CONVERTFORMS_CONVERTKIT="Convert Forms - ConvertKit Integration" PLG_CONVERTFORMS_CONVERTKIT_DESC="Konvertovať formuláre – integrácia s e-mailovými marketingovými službami ConvertKit." PLG_CONVERTFORMS_CONVERTKIT_KEY="API kľúč" PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC="Váš kľúč API ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID="ID formulára" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC="ID formulára, na odber ktorého by sa mal používateľ prihlásiť" PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY="Kde nájsť kľúč API?" PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID="Kde nájsť ID formulára?" PK=A#]R$Lconvertforms/convertkit/language/uk-UA/uk-UA.plg_convertforms_convertkit.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT_ALIAS="ConvertKit" PLG_CONVERTFORMS_CONVERTKIT="Перетворити форми - інтегрувати ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_DESC="Перетворити форми - інтеграція з маркетинговими послугами ConvertKit." PLG_CONVERTFORMS_CONVERTKIT_KEY="ключ API" PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC="Ваш API API ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID="Форма ID" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC="Ідентифікатор форми, на яку повинен підписатись користувач" PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY="Де я можу знайти ключ API?" PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID="Де я можу знайти ідентифікатор форми?" PK=A#]�D��**Lconvertforms/convertkit/language/et-EE/et-EE.plg_convertforms_convertkit.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT_ALIAS="ConvertKit" PLG_CONVERTFORMS_CONVERTKIT="Convert Forms - ConvertKit integreerimine" PLG_CONVERTFORMS_CONVERTKIT_DESC="Convert Forms - Integreerimine ConvertKit e-mailide turunduse teenusega." PLG_CONVERTFORMS_CONVERTKIT_KEY="API võti" PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC="Sinu ConvertKit API võti" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID="Vormi ID" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC="Vormi ID millega kasutaja liidetakse" PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY="Kuidas leida API võtit?" PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID="Kuidas leida vormi ID'd?" PK=A#]i%Ȁ�Pconvertforms/convertkit/language/en-GB/en-GB.plg_convertforms_convertkit.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT="Convert Forms - ConvertKit Integration" PLG_CONVERTFORMS_CONVERTKIT_DESC="Convert Forms - Integration with ConvertKit Email Marketing Services."PK=A#]�gt((Lconvertforms/convertkit/language/en-GB/en-GB.plg_convertforms_convertkit.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT_ALIAS="ConvertKit" PLG_CONVERTFORMS_CONVERTKIT="Convert Forms - ConvertKit Integration" PLG_CONVERTFORMS_CONVERTKIT_DESC="Convert Forms - Integration with ConvertKit Email Marketing Services." PLG_CONVERTFORMS_CONVERTKIT_KEY="API Key" PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC="Your ConvertKit API Key" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID="Form ID" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC="The Form ID which the user should be subscribed to" PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY="Where to find API Key?" PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID="Where to find Form ID?"PK=A#]5BL���Lconvertforms/convertkit/language/fr-FR/fr-FR.plg_convertforms_convertkit.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT_ALIAS="ConvertKit" PLG_CONVERTFORMS_CONVERTKIT="Convertisseur de formulaire - Intégration de ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_DESC="Convertisseur de formulaires - Intégration avec les services de Marketing et d'E-mailing de ConvertKit." PLG_CONVERTFORMS_CONVERTKIT_KEY="Clé de l'API" PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC="Votre clé de l'API ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID="ID du formulaire" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC="L'ID du formulaire auquel l'utilisateur doit s'inscrire" PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY="Où trouver la clé de l'API ?" PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID="Où trouver l'ID du formulaire ?" PK=A#]&���((Lconvertforms/convertkit/language/ru-RU/ru-RU.plg_convertforms_convertkit.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT_ALIAS="ConvertKit" PLG_CONVERTFORMS_CONVERTKIT="Преобразовать формы - Интеграция с ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_DESC="Преобразование форм - интеграция с сервисами почтового маркетинга ConvertKit." PLG_CONVERTFORMS_CONVERTKIT_KEY="ключ API" PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC="Ваш ключ API ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID="Форма ID" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC="Идентификатор формы, на которую должен подписаться пользователь" PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY="Где я могу найти ключ API?" PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID="Где я могу найти идентификатор формы?" PK=A#]`�HHLconvertforms/convertkit/language/cs-CZ/cs-CZ.plg_convertforms_convertkit.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT_ALIAS="ConvertKit" PLG_CONVERTFORMS_CONVERTKIT="Convert Forms - Integrace ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_DESC="Convert Forms - Integrace emailových a marketingových služeb ConvertKit." PLG_CONVERTFORMS_CONVERTKIT_KEY="API klíč" PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC="Váš ConvertKit API klíč" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID="ID formuláře" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC="ID formuláře k jehož odběru se uživatel přihlašuje" PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY="Kde získáte API klíč?" PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID="Kde najdu ID formuláře?" PK=A#]�} ���Lconvertforms/convertkit/language/bg-BG/bg-BG.plg_convertforms_convertkit.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT_ALIAS="ConvertKit" PLG_CONVERTFORMS_CONVERTKIT="Convert Forms – ConvertKit интеграция" PLG_CONVERTFORMS_CONVERTKIT_DESC="Convert Forms – интеграция с ConvertKit имейл маркетинг услуги." PLG_CONVERTFORMS_CONVERTKIT_KEY="API ключ" PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC="Вашият ConvertKit API ключ" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID="ID на формуляра" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC="ID на формуляра, за който потребителят трябва да се абонира" PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY="Къде да намерите API ключа?" PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID="Къде да намерите ID на формуляра?" PK=A#]������Lconvertforms/convertkit/language/es-ES/es-ES.plg_convertforms_convertkit.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT_ALIAS="ConvertKit" PLG_CONVERTFORMS_CONVERTKIT="\"Formas de conversión\" - Integración con ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_DESC="\"Formularios de conversión\" - Integración con servicios de marketing de Email ConvertKit." PLG_CONVERTFORMS_CONVERTKIT_KEY="Clave de API" PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC="Tu clave de API ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID="Formulario ID" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC="El formulario ID a la que el usuario debiera estar suscrito" PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY="¿Dónde encontrar la clave de API?" PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID="¿Dónde encontrar el formulario ID?" PK=A#]i���FFLconvertforms/convertkit/language/it-IT/it-IT.plg_convertforms_convertkit.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT_ALIAS="ConvertKit" PLG_CONVERTFORMS_CONVERTKIT="Integrazione Convert Forms - ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_DESC="Integrazione Convert Forms con i servizi Email Marketing di ConvertKit." PLG_CONVERTFORMS_CONVERTKIT_KEY="Chiave API" PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC="La tua chiave API di ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID="ID modulo" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC="L'ID modulo a cui l'utente dovrebbe essere iscritto" PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY="Dove trovare la chiave API?" PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID="Dove trovare l'ID del modulo?" PK=A#]�w��bbLconvertforms/convertkit/language/ca-ES/ca-ES.plg_convertforms_convertkit.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_CONVERTKIT_ALIAS="ConvertKit" PLG_CONVERTFORMS_CONVERTKIT="Integració Convert Forms - ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_DESC="Integració entre Convert Forms i els serveis de màrqueting per correu electrònic ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_KEY="Clau API" PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC="La teva clau API de ConvertKit" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID="ID del formulari" PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC="L'ID del formulari al qual s'hauria de subscriure l'usuari" PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY="On trobar la clau API?" PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID="On trobar l'ID del formulari?" PK=A#]b%/ς� convertforms/convertkit/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="api" type="nrtext" label="PLG_CONVERTFORMS_CONVERTKIT_KEY" description="PLG_CONVERTFORMS_CONVERTKIT_KEY_DESC" class="input-xlarge" required="true" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-convertkit" urltext="PLG_CONVERTFORMS_CONVERTKIT_FIND_API_KEY" /> <field name="formid" type="nrtext" label="PLG_CONVERTFORMS_CONVERTKIT_FORM_ID" description="PLG_CONVERTFORMS_CONVERTKIT_FORM_ID_DESC" class="input-xlarge" required="true" urltext="PLG_CONVERTFORMS_CONVERTKIT_FIND_FORM_ID" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-convertkit" /> </fieldset> </form>PK=A#]~M ~��*convertforms/convertkit/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsConvertKitInstallerScript extends PlgConvertFormsConvertKitInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_CONVERTKIT'; public $alias = 'convertkit'; public $extension_type = 'plugin'; public $plugin_folder = "convertforms"; public $show_message = false; } PK=A#],�ٟ�9�91convertforms/convertkit/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsConvertkitInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK=A#]�*�00&convertforms/convertkit/convertkit.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_CONVERTKIT</name> <description>PLG_CONVERTFORMS_CONVERTKIT_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c)2011-2016 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>March 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="convertkit">convertkit.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PK=A#]� ��&convertforms/convertkit/convertkit.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgConvertFormsConvertKit extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ function subscribe() { $api = new NR_ConvertKit($this->lead->campaign->api); $api->subscribe( $this->lead->email, $this->lead->campaign->formid, $this->lead->params ); if (!$api->success()) { throw new Exception($api->getLastError()); } } }PK=A#]C|ue��$convertforms/drip/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsDripInstallerScript extends PlgConvertFormsDripInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_DRIP'; public $alias = 'drip'; public $extension_type = 'plugin'; public $plugin_folder = "convertforms"; public $show_message = false; } PK=A#]W�{9{9+convertforms/drip/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsDripInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK=A#]ל����convertforms/drip/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="api" type="nrtext" label="PLG_CONVERTFORMS_DRIP_KEY" description="PLG_CONVERTFORMS_DRIP_KEY_DESC" class="input-xlarge" required="true" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-drip" urltext="PLG_CONVERTFORMS_DRIP_FIND_API_KEY" /> <field name="account_id" type="nrtext" label="PLG_CONVERTFORMS_DRIP_ACCOUNTID" description="PLG_CONVERTFORMS_DRIP_ACCOUNTID_DESC" class="input-xlarge" required="true" /> <field name="list" type="servicelists" label="PLG_CONVERTFORMS_DRIP_CAMPAIGN_ID" description="PLG_CONVERTFORMS_DRIP_CAMPAIGN_ID_DESC" class="input-xlarge" required="true" /> <field name="doubleoptin" type="radio" label="PLG_CONVERTFORMS_DRIP_DOUBLE_OPTIN" description="PLG_CONVERTFORMS_DRIP_DOUBLE_OPTIN_DESC" class="btn-group btn-group-yesno" default="0"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="updateexisting" type="radio" label="PLG_CONVERTFORMS_DRIP_UPDATE_EXISTING_USER" description="PLG_CONVERTFORMS_DRIP_UPDATE_EXISTING_USER_DESC" class="btn-group btn-group-yesno" default="1"> <option value="0">JNO</option> <option value="1">JYES</option> </field> </fieldset> </form>PK=A#]B�&``convertforms/drip/drip.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgConvertFormsDrip extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ function subscribe() { $api = new NR_Drip(array( 'api' => $this->lead->campaign->api, 'account_id' => $this->lead->campaign->account_id )); $api->subscribe( $this->lead->email, $this->lead->campaign->list, isset($this->lead->params['name']) ? $this->lead->params['name'] : '', $this->lead->params, isset($this->lead->params['tags']) ? $this->lead->params['tags'] : '', $this->lead->campaign->updateexisting, $this->lead->campaign->doubleoptin ); if (!$api->success()) { throw new Exception($api->getLastError()); } } }PK=A#]!�[�convertforms/drip/drip.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_DRIP</name> <description>PLG_CONVERTFORMS_DRIP_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c)2011-2016 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>August 2019</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="drip">drip.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PK=A#]>5c��@convertforms/drip/language/en-GB/en-GB.plg_convertforms_drip.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_DRIP_ALIAS="Drip" PLG_CONVERTFORMS_DRIP="Convert Forms - Drip Integration" PLG_CONVERTFORMS_DRIP_DESC="Convert Forms - Integration with Drip Ecommerce CRM." PLG_CONVERTFORMS_DRIP_KEY="API Key" PLG_CONVERTFORMS_DRIP_KEY_DESC="Your Drip API Key" PLG_CONVERTFORMS_DRIP_ACCOUNTID="Account ID" PLG_CONVERTFORMS_DRIP_ACCOUNTID_DESC="Your Drip Account ID" PLG_CONVERTFORMS_DRIP_CAMPAIGN_ID="Campaign ID" PLG_CONVERTFORMS_DRIP_CAMPAIGN_ID_DESC="The Campaign ID which the user should be subscribed to" PLG_CONVERTFORMS_DRIP_FIND_API_KEY="Where to find API Key?" PLG_CONVERTFORMS_DRIP_DOUBLE_OPTIN="Double Optin" PLG_CONVERTFORMS_DRIP_DOUBLE_OPTIN_DESC="Should the user have to click on a confirmation email before being considered as a subscriber?" PLG_CONVERTFORMS_DRIP_UPDATE_EXISTING_USER="Update existing user" PLG_CONVERTFORMS_DRIP_UPDATE_EXISTING_USER_DESC="Choose if you want to update your existing Drip user if that user resubmits your form" PLG_CONVERTFORMS_DRIP_SUBSCRIBER_ALREADY_EXISTS="You are already a subscriber."PK=A#]���eeDconvertforms/drip/language/en-GB/en-GB.plg_convertforms_drip.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_DRIP="Convert Forms - Drip Integration" PLG_CONVERTFORMS_DRIP_DESC="Convert Forms - Integration with Drip Ecommerce CRM."PK=A#]VN� ��Fconvertforms/hubspot/language/ru-RU/ru-RU.plg_convertforms_hubspot.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT_ALIAS="HubSpot" PLG_CONVERTFORMS_HUBSPOT="Преобразование форм - интеграция HubSpot" PLG_CONVERTFORMS_HUBSPOT_DESC="Преобразование форм - интеграция с сервисами почтового маркетинга HubSpot." PLG_CONVERTFORMS_HUBSPOT_KEY="ключ API" PLG_CONVERTFORMS_HUBSPOT_KEY_DESC="Ваш ключ API HubSpot" PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY="Где я могу найти ключ API?" PK=A#]�rֈKKFconvertforms/hubspot/language/cs-CZ/cs-CZ.plg_convertforms_hubspot.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT_ALIAS="HubSpot" PLG_CONVERTFORMS_HUBSPOT="Convert Forms - Integrace HubSpot" PLG_CONVERTFORMS_HUBSPOT_DESC="Convert Forms - Integrace emailových a marketingových služeb HubSpot." PLG_CONVERTFORMS_HUBSPOT_KEY="API klíč" PLG_CONVERTFORMS_HUBSPOT_KEY_DESC="Váš HubSpot API klíč" PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY="Kde získáte API klíč?" PK=A#]O@ő�Fconvertforms/hubspot/language/bg-BG/bg-BG.plg_convertforms_hubspot.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT_ALIAS="HubSpot" PLG_CONVERTFORMS_HUBSPOT="Convert Forms – HubSpot интеграция" PLG_CONVERTFORMS_HUBSPOT_DESC="Convert Forms – интеграция с HubSpot имейл маркетингови услуги." PLG_CONVERTFORMS_HUBSPOT_KEY="API ключ" PLG_CONVERTFORMS_HUBSPOT_KEY_DESC="Вашият HubSpot API ключ" PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY="Къде да намерите API ключ?" PK=A#]�K�{{Fconvertforms/hubspot/language/es-ES/es-ES.plg_convertforms_hubspot.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT_ALIAS="HubSpot" PLG_CONVERTFORMS_HUBSPOT="\"Formas de conversión\" - Integración con HubSpot" PLG_CONVERTFORMS_HUBSPOT_DESC="\"Formularios de conversión\" - Integración con servicios de marketing de Email HubSpot." PLG_CONVERTFORMS_HUBSPOT_KEY="Clave de API" PLG_CONVERTFORMS_HUBSPOT_KEY_DESC="Tu clave de API HubSpot" PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY="¿Dónde encontrar la clave de API?" PK=A#]�l�RRFconvertforms/hubspot/language/it-IT/it-IT.plg_convertforms_hubspot.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT_ALIAS="HubSpot" PLG_CONVERTFORMS_HUBSPOT="Integrazione Convert Forms - HubSpot" PLG_CONVERTFORMS_HUBSPOT_DESC="Integrazione Convert Forms con i servizi Email Marketing di HubSpot " PLG_CONVERTFORMS_HUBSPOT_KEY="Chiave API" PLG_CONVERTFORMS_HUBSPOT_KEY_DESC="La tua chiave API di HubSpot " PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY="Dove trovare la chiave API?" PK=A#] �$�^^Fconvertforms/hubspot/language/ca-ES/ca-ES.plg_convertforms_hubspot.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT_ALIAS="HubSpot" PLG_CONVERTFORMS_HUBSPOT="Integració Convert Forms - HubSpot" PLG_CONVERTFORMS_HUBSPOT_DESC="Integració entre Convert Forms i els serveis de màrqueting per correu electrònic HubSpot" PLG_CONVERTFORMS_HUBSPOT_KEY="Clau API" PLG_CONVERTFORMS_HUBSPOT_KEY_DESC="La teva clau API de Hubspot" PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY="On trobar la clau API?" PK=A#]&��_::Fconvertforms/hubspot/language/fi-FI/fi-FI.plg_convertforms_hubspot.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT_ALIAS="HubSpot" PLG_CONVERTFORMS_HUBSPOT="Convert Forms - HubSpot liitäntä" PLG_CONVERTFORMS_HUBSPOT_DESC="Convert Forms - Integrointi HubSpot Email Marketing palveluun." PLG_CONVERTFORMS_HUBSPOT_KEY="API Key" PLG_CONVERTFORMS_HUBSPOT_KEY_DESC="Sinun HubSpot API Key" PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY="Mistä löytyy API Key?" PK=A#]�G.�UUFconvertforms/hubspot/language/de-DE/de-DE.plg_convertforms_hubspot.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT_ALIAS="HubSpot" PLG_CONVERTFORMS_HUBSPOT="Convert Forms - HubSpot Integration" PLG_CONVERTFORMS_HUBSPOT_DESC="Convert Forms - Integration mit HubSpot E-Mail-Marketing-Diensten." PLG_CONVERTFORMS_HUBSPOT_KEY="API Schlüssel" PLG_CONVERTFORMS_HUBSPOT_KEY_DESC="Ihr HubSpot API Schlüssel" PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY="Wo findet man den API Schlüssel?" PK=A#]�N���Fconvertforms/hubspot/language/el-GR/el-GR.plg_convertforms_hubspot.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT_ALIAS="HubSpot" PLG_CONVERTFORMS_HUBSPOT="Convert Forms - Ενσωμάτωση HubSpot" PLG_CONVERTFORMS_HUBSPOT_DESC="Convert Forms - Ενσωμάτωση με Υπηρεσία μάρκετινγκ ηλεκτρονικού ταχυδρομείου HubSpot ." PLG_CONVERTFORMS_HUBSPOT_KEY="Κλειδί API" PLG_CONVERTFORMS_HUBSPOT_KEY_DESC="Το κλειδί σας API για το HubSpot" PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY="Που θα βρω το κλειδί API?" PK=A#]]|QuuFconvertforms/hubspot/language/sk-SK/sk-SK.plg_convertforms_hubspot.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT_ALIAS="HubSpot" PLG_CONVERTFORMS_HUBSPOT="Konvertovať formuláre – integrácia HubSpot" PLG_CONVERTFORMS_HUBSPOT_DESC="Konvertovať formuláre – integrácia s e-mailovými marketingovými službami HubSpot." PLG_CONVERTFORMS_HUBSPOT_KEY="API kľúč" PLG_CONVERTFORMS_HUBSPOT_KEY_DESC="Váš kľúč rozhrania HubSpot API" PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY="Kde nájsť kľúč API?" PK=A#]�ѽ��Fconvertforms/hubspot/language/fr-FR/fr-FR.plg_convertforms_hubspot.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT_ALIAS="HubSpot" PLG_CONVERTFORMS_HUBSPOT="Convertisseur de formulaire - Intégration de HubSpot" PLG_CONVERTFORMS_HUBSPOT_DESC="Convertisseur de formulaires - Intégration avec les services de Marketing et d'E-mailing de HubSpot." PLG_CONVERTFORMS_HUBSPOT_KEY="Clé de l'API" PLG_CONVERTFORMS_HUBSPOT_KEY_DESC="Votre clé de l'API HubSpot" PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY="Où trouver la clé de l'API ?" PK=A#]�gV��Fconvertforms/hubspot/language/uk-UA/uk-UA.plg_convertforms_hubspot.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT_ALIAS="HubSpot" PLG_CONVERTFORMS_HUBSPOT="Перетворити форми - інтеграція HubSpot" PLG_CONVERTFORMS_HUBSPOT_DESC="Перетворити форми - інтеграція з маркетинговими послугами HubSpot." PLG_CONVERTFORMS_HUBSPOT_KEY="ключ API" PLG_CONVERTFORMS_HUBSPOT_KEY_DESC="Ваш ключ API HubSpot" PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY="Де я можу знайти ключ API?" PK=A#]%�IIFconvertforms/hubspot/language/et-EE/et-EE.plg_convertforms_hubspot.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT_ALIAS="HubSpot" PLG_CONVERTFORMS_HUBSPOT="Convert Forms - HubSpot integreerimine" PLG_CONVERTFORMS_HUBSPOT_DESC="Convert Forms - Integreerimine HubSpot e-mailide turunduse teenusega." PLG_CONVERTFORMS_HUBSPOT_KEY="API võti" PLG_CONVERTFORMS_HUBSPOT_KEY_DESC="Sinu HubSpot API võti" PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY="Kuidas leida API võtit?" PK=A#]5���<<Fconvertforms/hubspot/language/en-GB/en-GB.plg_convertforms_hubspot.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT_ALIAS="HubSpot" PLG_CONVERTFORMS_HUBSPOT="Convert Forms - HubSpot Integration" PLG_CONVERTFORMS_HUBSPOT_DESC="Convert Forms - Integration with HubSpot Email Marketing Services." PLG_CONVERTFORMS_HUBSPOT_KEY="API Key" PLG_CONVERTFORMS_HUBSPOT_KEY_DESC="Your HubSpot API Key" PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY="Where to find API Key?"PK=A#]u�'-ttJconvertforms/hubspot/language/en-GB/en-GB.plg_convertforms_hubspot.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_HUBSPOT="Convert Forms - HubSpot Integration" PLG_CONVERTFORMS_HUBSPOT_DESC="Convert Forms - Integration with HubSpot Email Marketing Services."PK=A#]��6��convertforms/hubspot/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="api" type="nrtext" label="PLG_CONVERTFORMS_HUBSPOT_KEY" description="PLG_CONVERTFORMS_HUBSPOT_KEY_DESC" class="input-xlarge" required="true" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-hubspot" urltext="PLG_CONVERTFORMS_HUBSPOT_FIND_API_KEY" /> </fieldset> </form>PK=A#]0�$$ convertforms/hubspot/hubspot.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_HUBSPOT</name> <description>PLG_CONVERTFORMS_HUBSPOT_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c)2011-2017 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>March 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="hubspot">hubspot.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PK=A#][���� convertforms/hubspot/hubspot.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgConvertFormsHubSpot extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ function subscribe() { $api = new NR_HubSpot($this->lead->campaign->api); $api->subscribe( $this->lead->email, $this->lead->params ); if (!$api->success()) { throw new Exception($api->getLastError()); } } }PK=A#]%�����'convertforms/hubspot/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsHubSpotInstallerScript extends PlgConvertFormsHubSpotInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_HUBSPOT'; public $alias = 'hubspot'; public $extension_type = 'plugin'; public $plugin_folder = "convertforms"; public $show_message = false; } PK=A#]�`L�~9~9.convertforms/hubspot/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsHubspotInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK=A#] ��9�91convertforms/acymailing/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsAcymailingInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK=A#]�*�V��*convertforms/acymailing/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsAcyMailingInstallerScript extends PlgConvertFormsAcyMailingInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_ACYMAILING'; public $alias = 'acymailing'; public $extension_type = 'plugin'; public $plugin_folder = "convertforms"; public $show_message = false; } PK=A#]�lӧ�Lconvertforms/acymailing/language/et-EE/et-EE.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="AcyMailing" PLG_CONVERTFORMS_ACYMAILING="Convert Forms - AcyMailing integreerimine" PLG_CONVERTFORMS_ACYMAILING_DESC="Convert Forms - Integreerimine Acymailing Joomla! lisaga." PLG_CONVERTFORMS_ACYMAILING_LIST_ID="Rühma ID" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Määra rühmad millega kasutaja liidetakse." PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="Kahekordne kinnitus" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="Kas kasutaja peab klikkima kinnitusmeilis olemave lingile enne kui temast saab uudiskirja tellija?" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="Ei suuda luua kasutajat." PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Määra rühm kampaania seadetes" PK=A#]鋘b11Lconvertforms/acymailing/language/uk-UA/uk-UA.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="AcyMailing" PLG_CONVERTFORMS_ACYMAILING="Перетворити форми - інтеграція AcyMailing" PLG_CONVERTFORMS_ACYMAILING_DESC="Перетворити форми - інтеграція з розширенням Acymailing Joomla!" PLG_CONVERTFORMS_ACYMAILING_LIST_ID="Список ідентифікаторів" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Виберіть списки, для яких користувач повинен бути зареєстрований як підписка." PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="Подвійна перевірка" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="Чи повинен користувач натиснути електронний лист для підтвердження, перш ніж зареєструватися як підписка?" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="Користувача не можна створити." PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Виберіть список у налаштуваннях кампанії." PK=A#]XoՁ�Pconvertforms/acymailing/language/en-GB/en-GB.plg_convertforms_acymailing.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING="Convert Forms - AcyMailing Integration" PLG_CONVERTFORMS_ACYMAILING_DESC="Convert Forms - Integration with Acymailing Joomla! Extension."PK=A#]WB�!qqLconvertforms/acymailing/language/en-GB/en-GB.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="AcyMailing" PLG_CONVERTFORMS_ACYMAILING="Convert Forms - AcyMailing Integration" PLG_CONVERTFORMS_ACYMAILING_DESC="Convert Forms - Integration with Acymailing Joomla! Extension." PLG_CONVERTFORMS_ACYMAILING_LIST_ID="List ID" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Select the lists which the user should be subscribed to." PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="Double Optin" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="Should the user have to click on a confirmation email before being considered as a subscriber?" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="Can't create user." PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Please select a list in the campaign settings" PLG_CONVERTFORMS_ACYMAILING_HELPER_CLASS_ERROR="AcyMailing %d helper class not found. Make sure AcyMailing is installed and you've selected the correct AcyMailing list in the campaign settings."PK=A#]�[6Lconvertforms/acymailing/language/fr-FR/fr-FR.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="AcyMailing" PLG_CONVERTFORMS_ACYMAILING="Convertisseur de formulaires - Intégration de AcyMailing" PLG_CONVERTFORMS_ACYMAILING_DESC="Convertisseur de formulaires - Intégration avec l'extension Joomla! AcyMailing." PLG_CONVERTFORMS_ACYMAILING_LIST_ID="ID de la liste" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Sélectionnez les listes auxquelles l'utilisateur doit s'abonner." PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="Vérification par mail" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="L'utilisateur doit-il cliquer sur un mail de confirmation avant d'être considéré comme abonné ?" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="Impossible de créer un utilisateur" PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Merci de choisir une liste dans les réglages de la campagne" PK=A#]�p-���Lconvertforms/acymailing/language/sk-SK/sk-SK.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="AcyMailing" PLG_CONVERTFORMS_ACYMAILING="Konvertovať formuláre – integrácia AcyMailing" PLG_CONVERTFORMS_ACYMAILING_DESC="Konvertovať formuláre – integrácia s Acymailing Joomla! Rozšírenie." PLG_CONVERTFORMS_ACYMAILING_LIST_ID="ID zoznamu" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Vyberte zoznamy, na odber ktorých má byť používateľ prihlásený." PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="Double Optin" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="Mal by používateľ kliknúť na potvrdzovací e-mail predtým, ako bude považovaný za odberateľa?" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="Nie je možné vytvoriť používateľa." PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Vyberte zoznam v nastaveniach kampane" PK=A#]ٸ�͘�Lconvertforms/acymailing/language/el-GR/el-GR.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="AcyMailing" PLG_CONVERTFORMS_ACYMAILING="Convert Forms - Ενσωμάτωση AcyMailing" PLG_CONVERTFORMS_ACYMAILING_DESC="Convert Forms - Ενσωμάτωση με ένθεμα Acymailing Joomla!" PLG_CONVERTFORMS_ACYMAILING_LIST_ID="Αναγνωριστικό λίστας" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Επιλέξτε τις λίστες στις οποίες πρέπει να εγγραφεί ο χρήστης." PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="Double Optin" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="Πρέπει ο χρήστης να κάνει κλικ σε μήνυμα επιβεβαίωσης πριν θεωρηθεί συνδρομητής;" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="Αδυναμία δημιουργίας χρήστη." PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Επιλέξτε μια λίστα στις ρυθμίσεις καμπάνιας" PK=A#]PhLconvertforms/acymailing/language/de-DE/de-DE.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="AcyMailing" PLG_CONVERTFORMS_ACYMAILING="Convert Forms - AcyMailing Integration" PLG_CONVERTFORMS_ACYMAILING_DESC="Convert Forms - Integration mit der Acymailing Joomla! Erweiterung." PLG_CONVERTFORMS_ACYMAILING_LIST_ID="Listen ID" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Wählen Sie die Listen aus, zu denen der Benutzer hinzugefügt werden soll." PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="Doppeltes Opt-in" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="Sollte der Nutzer auf einen Bestätigungs-Link in einer E-Mail klicken müssen, bevor er als Abonnent betrachtet wird?" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="Der Benutzer kann nicht erstellt werden." PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Bitte eine Liste in den Kampagnen-Einstellungen auswählen" PK=A#]����Lconvertforms/acymailing/language/fi-FI/fi-FI.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="AcyMailing" PLG_CONVERTFORMS_ACYMAILING="Convert Forms - AcyMailing liitäntä" PLG_CONVERTFORMS_ACYMAILING_DESC="Convert Forms -integrointi Acymailing Joomla! laajennukseen." PLG_CONVERTFORMS_ACYMAILING_LIST_ID="Luettelo ID" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Valitse luettelo ID, jonka käyttäjän tulee tilata" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="Tupla varmistus" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="Pitääkö käyttäjän avata vahvistusviesti ennen kuin hänet hyväksytään tilaajana?" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="Käyttäjää ei voi luoda." PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Valitse luettelosta kampanja-asetuksissa" PK=A#]��!9��Lconvertforms/acymailing/language/sv-SE/sv-SE.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="Acymailing" PLG_CONVERTFORMS_ACYMAILING="Convert Forms - AcyMailing Integration" PLG_CONVERTFORMS_ACYMAILING_DESC="Convert Forms - Integration med Acymailing Joomla! Komponent." PLG_CONVERTFORMS_ACYMAILING_LIST_ID="List ID" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Välj listan användaren skall bli prenumerant till." PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="Dubbel Optin" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="Skall användaren behöva klicka på ett konfirmation email innan han anses bli en prenumerant?" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="Kan inte skapa användare." PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Vänligen välj en lista i kampanj inställningen" PK=A#]�� ��Lconvertforms/acymailing/language/ca-ES/ca-ES.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="AcyMailing" PLG_CONVERTFORMS_ACYMAILING="Integració Convert Forms - AcyMailing" PLG_CONVERTFORMS_ACYMAILING_DESC="Integració entre Convert Forms i l'extensió de Joomla! AcyMailing." PLG_CONVERTFORMS_ACYMAILING_LIST_ID="ID de llista" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Escull les llistes a les que s'hauria de subscriure l'usuari" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="Doble confirmació d'entrada" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="L'usuari hauria de clicar a un correu de confirmació abans de ser considerat subscriptor?" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="No es pot crear l'usuari." PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Escull una llista a la configuració de la campanya" PK=A#];B ���Lconvertforms/acymailing/language/es-ES/es-ES.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="Acymailing" PLG_CONVERTFORMS_ACYMAILING="\"Formas de conversión\" - Integración con AcyMailing" PLG_CONVERTFORMS_ACYMAILING_DESC="\"Formularios de conversión\" - Integrar con extensión de Joomla! Acymailing." PLG_CONVERTFORMS_ACYMAILING_LIST_ID="Lista ID" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Selecciona las listas a la que el usuario debe estar suscrito." PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="Optin doble" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="¿Debe el usuario hacer click en un email de confirmación antes de ser considerado subscriptor?" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="No se puede crear el usuario" PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Por favor, seleccione una lista en la configuración de campaña" PK=A#]p���Lconvertforms/acymailing/language/bg-BG/bg-BG.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="AcyMailing" PLG_CONVERTFORMS_ACYMAILING="Convert Forms – AcyMailing Integration" PLG_CONVERTFORMS_ACYMAILING_DESC="Convert Forms – интеграция с Acymailing Joomla! разширение." PLG_CONVERTFORMS_ACYMAILING_LIST_ID="Списък ID" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Изберете списъците, за които потребителят трябва да се абонира." PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="В две стъпки" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="Трябва ли потребителят да щракне линка в имейла за потвърждение, преди да бъде считан за абонат?" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="Потребителят не може да бъде създаден." PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Моля, изберете списък в настройките на кампанията" PK=A#]ٳ�q��Lconvertforms/acymailing/language/it-IT/it-IT.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="AcyMailing" PLG_CONVERTFORMS_ACYMAILING="Integrazione Convert Forms - AcyMailing" PLG_CONVERTFORMS_ACYMAILING_DESC="Integrazione Convert Forms con l'estensione di Joomla! Acymailing." PLG_CONVERTFORMS_ACYMAILING_LIST_ID="ID elenco" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Seleziona le liste a cui l'utente dovrebbe essere iscritto." PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="Doppio Opt-in" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="L'utente dovrebbe fare clic su una mail di conferma prima di essere considerato un iscritto?" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="Non posso creare l'utente." PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Seleziona una lista nelle impostazioni di campagna" PK=A#]K�X�ggLconvertforms/acymailing/language/ru-RU/ru-RU.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="AcyMailing" PLG_CONVERTFORMS_ACYMAILING="Преобразовать формы - интеграция AcyMailing" PLG_CONVERTFORMS_ACYMAILING_DESC="Преобразование форм - интеграция с расширением Joomla! Acymailing." PLG_CONVERTFORMS_ACYMAILING_LIST_ID="Список идентификаторов" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Выберите списки, для которых пользователь должен быть зарегистрирован в качестве подписки." PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="Двойная проверка" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="Нужно ли пользователю нажимать подтверждение по электронной почте перед регистрацией в качестве подписки?" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="Пользователь не может быть создан." PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Пожалуйста, выберите список в настройках кампании." PK=A#]����Lconvertforms/acymailing/language/cs-CZ/cs-CZ.plg_convertforms_acymailing.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACYMAILING_ALIAS="AcyMailing" PLG_CONVERTFORMS_ACYMAILING="Convert Forms - integrace AcyMailing" PLG_CONVERTFORMS_ACYMAILING_DESC="Convert Forms - Integrace s rozšířením Acymailing pro Joomla!" PLG_CONVERTFORMS_ACYMAILING_LIST_ID="Seznam ID" PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC="Vyberte seznamy k jejiž odběru se uživatel přihlašuje." PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN="Dvojité potvrzení souhlasu" PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC="Měl by uživatel potvrdit kliknutím na odkaz v potvrzovacím e-mailu souhlas s odběrem?" PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER="Nevytvářet uživatele." PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED="Prosím zvolte seznam v nastavení kampaní" PK=A#]���� convertforms/acymailing/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="list" type="acymailing" label="PLG_CONVERTFORMS_ACYMAILING_LIST_ID" description="PLG_CONVERTFORMS_ACYMAILING_LIST_ID_DESC" required="true" multiple="true" /> <field name="doubleoptin" type="radio" label="PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN" description="PLG_CONVERTFORMS_ACYMAILING_DOUBLEOPTIN_DESC" class="btn-group btn-group-yesno" default="0"> <option value="0">JNO</option> <option value="1">JYES</option> </field> </fieldset> </form>PK=A#]2�.��&convertforms/acymailing/acymailing.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgConvertFormsAcyMailing extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ public function subscribe() { // Make sure there's a list selected if (!isset($this->lead->campaign->list) || empty($this->lead->campaign->list)) { throw new Exception(JText::_('PLG_CONVERTFORMS_ACYMAILING_NO_LIST_SELECTED')); } $lists = $this->lead->campaign->list; $lists_v5 = []; $lists_v6 = []; // Discover lists for each version. v6 lists starts with 6: prefix. foreach ($lists as $list) { // Is a v5 list if (strpos($list, '6:') === false) { $lists_v5[] = $list; continue; } // Is a v6 list $lists_v6[] = str_replace('6:', '', $list); } require_once __DIR__ . '/helper.php'; // Add user to AcyMailing 5 lists if (!empty($lists_v5)) { ConvertFormsAcyMailingHelper::subscribe_v5($this->lead->email, $this->lead->params, $lists_v5, $this->lead->campaign->doubleoptin); } // Add user to AcyMailing 6+ lists if (!empty($lists_v6)) { ConvertFormsAcyMailingHelper::subscribe($this->lead->email, $this->lead->params, $lists_v6, $this->lead->campaign->doubleoptin); } } /** * Disable service wrapper * * @return boolean */ protected function loadWrapper() { return true; } }PK=A#]#fWWW&convertforms/acymailing/acymailing.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_ACYMAILING</name> <description>PLG_CONVERTFORMS_ACYMAILING_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c) 2020 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>November 2015</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="acymailing">acymailing.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> <filename>helper.php</filename> </files> </extension>PK=A#]Yzi''"convertforms/acymailing/helper.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class ConvertFormsAcyMailingHelper { /** * @deprecated Use subscribe() */ public static function subscribe_v6($email, $params, $lists, $doubleOptin = true) { self::subscribe($email, $params, $lists, $doubleOptin); } /** * Subscribe method for AcyMailing v6 * * @param array $lists * * @return void */ public static function subscribe($email, $params, $lists, $doubleOptin = true) { if (!@include_once(JPATH_ADMINISTRATOR . '/components/com_acym/helpers/helper.php')) { throw new Exception(JText::sprintf('PLG_CONVERTFORMS_ACYMAILING_HELPER_CLASS_ERROR', 6)); } // Create user object $user = new stdClass(); $user->email = $email; $user->confirmed = $doubleOptin ? 0 : 1; $user_fields = array_change_key_case($params); $user->name = isset($user_fields['name']) ? $user_fields['name'] : ''; // Load User Class $acym = acym_get('class.user'); // Check if exists $existing_user = $acym->getOneByEmail($email); if ($existing_user) { $user->id = $existing_user->id; } else { // Save user to database only if it's a new user. if (!$user->id = $acym->save($user)) { throw new Exception(JText::_('PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER')); } } // Save Custom Fields $fieldClass = acym_get('class.field'); // getAllfields was removed in 7.7.4 and we must use getAll moving forward. $acy_fields_method = method_exists($fieldClass, 'getAllfields') ? 'getAllfields' : 'getAll'; $acy_fields = $fieldClass->$acy_fields_method(); unset($user_fields['name']); // Name is already used during user creation. $fields_to_store = []; foreach ($user_fields as $paramKey => $paramValue) { // Check if paramKey it's a custom field $field_found = array_filter($acy_fields, function($field) use($paramKey) { return (strtolower($field->name) == $paramKey || $field->id == $paramKey); }); if ($field_found) { // Get the 1st occurence $field = array_shift($field_found); // AcyMailing 6 needs field's ID to recognize a field. $fields_to_store[$field->id] = $paramValue; // $paramValue output: array(1) { [0]=> string(2) "gr" } // AcyMailing will get the key as the value instead of "gr" // We combine to remove the keys in order to keep the values if (is_array($paramValue)) { $fields_to_store[$field->id] = array_combine($fields_to_store[$field->id], $fields_to_store[$field->id]); } } } if ($fields_to_store) { $fieldClass->store($user->id, $fields_to_store); } // Subscribe user to AcyMailing lists return $acym->subscribe($user->id, $lists); } /** * Subscribe method for AcyMailing v5 * * @param array $lists * * @return void */ public static function subscribe_v5($email, $params, $lists, $doubleOptin = true) { if (!@include_once(JPATH_ADMINISTRATOR . '/components/com_acymailing/helpers/helper.php')) { throw new Exception(JText::sprintf('PLG_CONVERTFORMS_ACYMAILING_HELPER_CLASS_ERROR', 5)); } // Create user object $user = new stdClass(); $user->email = $email; $user->confirmed = $doubleOptin ? false : true; // Get Custrom Fields $db = JFactory::getDbo(); $customFields = $db->setQuery( $db->getQuery(true) ->select($db->quoteName('namekey')) ->from($db->quoteName('#__acymailing_fields')) )->loadColumn(); if (is_array($customFields) && count($customFields)) { foreach ($params as $key => $param) { if (in_array($key, $customFields)) { $user->$key = $param; } } } $acymailing = acymailing_get('class.subscriber'); $userid = $acymailing->subid($email); // AcyMailing sends account confirmation e-mails even if the user exists, so we need // to run save() method only if the user actually is new. if (is_null($userid)) { // Save user to database if (!$userid = $acymailing->save($user)) { throw new Exception(JText::_('PLG_CONVERTFORMS_ACYMAILING_CANT_CREATE_USER')); } } // Subscribe user to AcyMailing lists $lead = []; foreach($lists as $listId) { $lead[$listId] = ['status' => 1]; } return $acymailing->saveSubscription($userid, $lead); } }PK=A#]�Uq��Jconvertforms/mailchimp/language/ru-RU/ru-RU.plg_convertforms_mailchimp.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP_ALIAS="MailChimp" PLG_CONVERTFORMS_MAILCHIMP="Преобразование форм - интеграция с MailChimp" PLG_CONVERTFORMS_MAILCHIMP_DESC="Конвертировать формы - интеграция с MailChimp Email Marketing Services." PLG_CONVERTFORMS_MAILCHIMP_KEY="ключ API" PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC="Ваш ключ API MailChimp" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID="список ID" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC="Идентификатор списка, на который пользователь должен подписаться" PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY="Где я могу найти ключ API?" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN="Двойной Optin" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC="" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER="Обновить существующего пользователя" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC="" PK=A#]��SJconvertforms/mailchimp/language/cs-CZ/cs-CZ.plg_convertforms_mailchimp.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP_ALIAS="MailChimp" PLG_CONVERTFORMS_MAILCHIMP="Convert Forms - integrace MailChimp" PLG_CONVERTFORMS_MAILCHIMP_DESC="Convert Forms - Integrace emailových a marketingových služeb MailChimp." PLG_CONVERTFORMS_MAILCHIMP_KEY="API klíč" PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC="Váš MailChimp API klíč" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID="ID seznamu" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC="ID seznamu k jehož odběru se uživatel přihlašuje" PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY="Kde získáte API klíč?" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN="Dvojité potvrzení souhlasu" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC="" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER="Upravit stávajícího uživatele" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC="" PK=A#]Y~(_Jconvertforms/mailchimp/language/ca-ES/ca-ES.plg_convertforms_mailchimp.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP_ALIAS="MailChimp" PLG_CONVERTFORMS_MAILCHIMP="Integració Convert Forms - MailChimp" PLG_CONVERTFORMS_MAILCHIMP_DESC="Integració entre Convert Forms i els serveis de màrqueting per correu electrònic MailChimp" PLG_CONVERTFORMS_MAILCHIMP_KEY="Clau API" PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC="La teva clau API de MailChimp" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID="ID de llista" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC="L'ID del llistat al que s'hauria de subscriure l'usuari" PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY="On trobar la clau API?" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN="Doble confirmació d'entrada" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC="" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER="Actualitzar usuari existent" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC="" PK=A#];�`�Jconvertforms/mailchimp/language/es-ES/es-ES.plg_convertforms_mailchimp.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP_ALIAS="MailChimp" PLG_CONVERTFORMS_MAILCHIMP="\"Formas de conversión\" - Integración con MailChimp" PLG_CONVERTFORMS_MAILCHIMP_DESC="\"Formularios de conversión\" - Integración con servicios de marketing de Email MailChimp." PLG_CONVERTFORMS_MAILCHIMP_KEY="Clave de API" PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC="Tu clave de API MailChimp" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID="Lista ID" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC="La lista ID a la que el usuario debiera estar suscrito" PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY="¿Dónde encontrar la clave de API?" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN="Optin doble" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC="" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER="Actualiza usuario existente" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC="" PK=A#],����Jconvertforms/mailchimp/language/bg-BG/bg-BG.plg_convertforms_mailchimp.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP_ALIAS="MailChimp" PLG_CONVERTFORMS_MAILCHIMP="Convert Forms – MailChimp интеграция" PLG_CONVERTFORMS_MAILCHIMP_DESC="Convert Forms – интеграция с MailChimp имейл маркетинг услуги." PLG_CONVERTFORMS_MAILCHIMP_KEY="API ключ" PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC="Вашият MailChimp API ключ" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID="ID на списък" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC="ID на списъка, за който потребителят трябва да се абонира" PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY="Къде да намерите API ключ?" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN="Double Optin регистрация" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC="" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER="Актуализирайте съществуващия потребител" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC="" PK=A#]�/y���Jconvertforms/mailchimp/language/it-IT/it-IT.plg_convertforms_mailchimp.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP_ALIAS="MailChimp" PLG_CONVERTFORMS_MAILCHIMP="Integrazione Convert Forms - MailChimp" PLG_CONVERTFORMS_MAILCHIMP_DESC="Integrazione Convert Forms con i servizi Email Marketing di MailChimp." PLG_CONVERTFORMS_MAILCHIMP_KEY="Chiave API" PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC="La tua Chiave API di MailChimp" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID="ID elenco" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC="L'ID elenco a cui l'utente dovrebbe essere iscritto" PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY="Dove trovare la chiave API?" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN="Doppio opt-in" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC="" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER="Aggiorna utente esistente" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC="" PK=A#]\��h��Jconvertforms/mailchimp/language/el-GR/el-GR.plg_convertforms_mailchimp.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP_ALIAS="MailChimp" PLG_CONVERTFORMS_MAILCHIMP="Convert Forms - Ενσωμάτωση MailChimp " PLG_CONVERTFORMS_MAILCHIMP_DESC="Convert Forms - Ενσωμάτωση με Υπηρεσία μάρκετινγκ ηλεκτρονικού ταχυδρομείου MailChimp." PLG_CONVERTFORMS_MAILCHIMP_KEY="Κλειδί API" PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC="Το κλειδί σας API για το MailChimp " PLG_CONVERTFORMS_MAILCHIMP_LIST_ID="ID λίστας" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC="ID λίστας στο οποίο πρέπει να εγγραφεί ο χρήστης" PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY="Που θα βρω το κλειδί API?" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN="Double Optin" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC="" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER="Ενημέρωση υπάρχοντος χρήστη" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC="" PK=A#]f��- Jconvertforms/mailchimp/language/de-DE/de-DE.plg_convertforms_mailchimp.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP_ALIAS="MailChimp" PLG_CONVERTFORMS_MAILCHIMP="Convert Forms - MailChimp Integration" PLG_CONVERTFORMS_MAILCHIMP_DESC="Convert Forms - Integration mit MailChimp E-Mail-Marketing-Diensten." PLG_CONVERTFORMS_MAILCHIMP_KEY="API Schlüssel" PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC="Ihr MailChimp API Schlüssel" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID="Listen ID" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC="Die Listen ID, zu der der Benutzer hinzugefügt werden soll" PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY="Wo findet man den API Schlüssel?" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN="Doppeltes Opt-in" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC="" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER="Bestehenden Benutzer aktualisieren" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC="" PK=A#]�(����Jconvertforms/mailchimp/language/fi-FI/fi-FI.plg_convertforms_mailchimp.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP_ALIAS="MailChimp" PLG_CONVERTFORMS_MAILCHIMP="Convert Forms - MailChimp liitäntä" PLG_CONVERTFORMS_MAILCHIMP_DESC="Convert Forms - Integrointi MailChimp Email Marketing palveluun." PLG_CONVERTFORMS_MAILCHIMP_KEY="API Key" PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC="Sinun MailChimp API Key" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID="Luettelo ID" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC="Luettelo ID, jonka käyttäjän tulee tilata" PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY="Mistä löytyy API Key?" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN="Tupla varmistus" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC="" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER="Päivitä nykyinen käyttäjä" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC="" PK=A#]��n��Jconvertforms/mailchimp/language/et-EE/et-EE.plg_convertforms_mailchimp.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP_ALIAS="MailChimp" PLG_CONVERTFORMS_MAILCHIMP="Convert Forms - MailChimp integreerimine" PLG_CONVERTFORMS_MAILCHIMP_DESC="Convert Forms - Integreerimine MailChimp e-mailide turunduse teenusega." PLG_CONVERTFORMS_MAILCHIMP_KEY="API võti" PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC="Sinu MailChimp API võti" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID="Uudiskirja ID" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC="Uudiskirja ID millega kasutaja liidetakse" PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY="Kuidas leida API võtit?" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN="Kahekordne kinnitus" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC="" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER="Uuenda olemasolevat kasutajat" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC="" PK=A#]2?����Jconvertforms/mailchimp/language/uk-UA/uk-UA.plg_convertforms_mailchimp.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP_ALIAS="MailChimp" PLG_CONVERTFORMS_MAILCHIMP="Перетворити форми - інтеграція MailChimp" PLG_CONVERTFORMS_MAILCHIMP_DESC="Перетворити форми - інтеграція з маркетинговими послугами MailChimp." PLG_CONVERTFORMS_MAILCHIMP_KEY="ключ API" PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC="Ваш API API MailChimp" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID="список ID" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC="Ідентифікатор списку, на який повинен підписатись користувач" PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY="Де я можу знайти ключ API?" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN="Подвійний оптин" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC="" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER="Оновити існуючого користувача" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC="" PK=A#]��uG��Nconvertforms/mailchimp/language/en-GB/en-GB.plg_convertforms_mailchimp.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP="Convert Forms - MailChimp Integration" PLG_CONVERTFORMS_MAILCHIMP_DESC="Convert Forms - Integration with MailChimp Email Marketing Services."PK=A#]Z�����Jconvertforms/mailchimp/language/en-GB/en-GB.plg_convertforms_mailchimp.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP_ALIAS="MailChimp" PLG_CONVERTFORMS_MAILCHIMP="Convert Forms - MailChimp Integration" PLG_CONVERTFORMS_MAILCHIMP_DESC="Convert Forms - Integration with MailChimp Email Marketing Services." PLG_CONVERTFORMS_MAILCHIMP_KEY="API Key" PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC="Your MailChimp API Key" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID="List ID" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC="The List ID which the user should be subscribed to" PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY="Where to find API Key?" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN="Double Optin" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC="" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER="Update existing user" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC=""PK=A#]�vrFFJconvertforms/mailchimp/language/fr-FR/fr-FR.plg_convertforms_mailchimp.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP_ALIAS="MailChimp" PLG_CONVERTFORMS_MAILCHIMP="Convertisseur de formulaires - Intégration de MailChimp" PLG_CONVERTFORMS_MAILCHIMP_DESC="Convertisseur de formulaires - Intégration avec les services de Marketing et d'E-mailing de MailChimp." PLG_CONVERTFORMS_MAILCHIMP_KEY="Clé de l'API" PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC="Votre clé d'API MailChimp" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID="ID de la liste" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC="L'ID de la liste à laquelle l'utilisateur doit s'abonner" PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY="Où trouver la clé de l'API ?" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN="Vérification par mail" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC="" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER="Mettre à jour un utilisateur existant" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC="" PK=A#]�9�**Jconvertforms/mailchimp/language/sk-SK/sk-SK.plg_convertforms_mailchimp.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_MAILCHIMP_ALIAS="MailChimp" PLG_CONVERTFORMS_MAILCHIMP="Konvertovať formuláre – integrácia MailChimp" PLG_CONVERTFORMS_MAILCHIMP_DESC="Konvertovať formuláre – integrácia s e-mailovými marketingovými službami MailChimp." PLG_CONVERTFORMS_MAILCHIMP_KEY="API kľúč" PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC="Váš kľúč API MailChimp" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID="ID zoznamu" PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC="ID zoznamu, na odber ktorého by sa mal používateľ prihlásiť" PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY="Kde nájsť kľúč API?" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN="Double Optin" PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC="" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER="Aktualizovať existujúceho používateľa" PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC="" PK=A#]��5��convertforms/mailchimp/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="api" type="nrtext" label="PLG_CONVERTFORMS_MAILCHIMP_KEY" description="PLG_CONVERTFORMS_MAILCHIMP_KEY_DESC" class="input-xlarge" required="true" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-mailchimp" urltext="PLG_CONVERTFORMS_MAILCHIMP_FIND_API_KEY" /> <field name="list" type="servicelists" label="PLG_CONVERTFORMS_MAILCHIMP_LIST_ID" description="PLG_CONVERTFORMS_MAILCHIMP_LIST_ID_DESC" class="input-xlarge" required="true" /> <field name="doubleoptin" type="nrtoggle" label="PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN" description="PLG_CONVERTFORMS_MAILCHIMP_DOUBLE_OPTIN_DESC" /> <field name="updateexisting" type="nrtoggle" label="PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER" description="PLG_CONVERTFORMS_MAILCHIMP_UPDATE_EXISTING_USER_DESC" checked="true" /> </fieldset> </form>PK=A#]< �)��)convertforms/mailchimp/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsMailChimpInstallerScript extends PlgConvertFormsMailChimpInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_MAILCHIMP'; public $alias = 'mailchimp'; public $extension_type = 'plugin'; public $plugin_folder = "convertforms"; public $show_message = false; } PK=A#]�����$convertforms/mailchimp/mailchimp.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgConvertFormsMailChimp extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ function subscribe() { $api = new NR_MailChimp(array('api' => $this->lead->campaign->api)); $api->subscribe( $this->lead->email, $this->lead->campaign->list, $this->lead->params, $this->lead->campaign->updateexisting, $this->lead->campaign->doubleoptin ); if (!$api->success()) { $error = $api->getLastError(); $error_parts = explode(' ', $error); if (function_exists('mb_strpos')) { // Make MalChimp errors translatable if (mb_strpos($error, 'is already a list member') !== false) { $error = JText::sprintf('COM_CONVERTFORMS_ERROR_USER_ALREADY_EXIST', $error_parts[0]); } if (mb_strpos($error, 'fake or invalid') !== false) { $error = JText::sprintf('COM_CONVERTFORMS_ERROR_INVALID_EMAIL_ADDRESS', $error_parts[0]); } } throw new Exception($error); } } }PK=A#]}���//$convertforms/mailchimp/mailchimp.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_MAILCHIMP</name> <description>PLG_CONVERTFORMS_MAILCHIMP_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c)2011-2016 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>November 2015</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="mailchimp">mailchimp.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PK=A#]�ܺr�9�90convertforms/mailchimp/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsMailchimpInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK=A#]�b���.convertforms/activecampaign/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsActiveCampaignInstallerScript extends PlgConvertFormsActiveCampaignInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_ACTIVECAMPAIGN'; public $alias = 'activecampaign'; public $extension_type = 'plugin'; public $plugin_folder = "convertforms"; public $show_message = false; } PK=A#]�p��.convertforms/activecampaign/activecampaign.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgConvertFormsActiveCampaign extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ function subscribe() { // Call API $api = new NR_ActiveCampaign(array( 'api' => $this->lead->campaign->api, 'endpoint' => $this->lead->campaign->endpoint )); // Subscribe $api->subscribe( $this->lead->email, isset($this->lead->params['name']) ? $this->lead->params['name'] : '', $this->lead->campaign->list, isset($this->lead->params['tags']) ? $this->lead->params['tags'] : '', $this->lead->params, isset($this->lead->campaign->updateexisting) ? $this->lead->campaign->updateexisting : true ); if (!$api->success()) { throw new Exception($api->getLastError()); } } }PK=A#]e+��CC.convertforms/activecampaign/activecampaign.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_ACTIVECAMPAIGN</name> <description>PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC</description> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c)2011-2016 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>November 2015</creationDate> <version>1.0</version> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="activecampaign">activecampaign.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PK=A#]�(�UTconvertforms/activecampaign/language/uk-UA/uk-UA.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="Активна кампанія" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Перетворити форми - інтеграція в активну кампанію" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Перетворити форми - інтеграція в сервіси маркетингу електронної пошти поточної кампанії." PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="URL-адреса API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="URL-адреса API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="Де розташована URL-адреса API?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="ключ API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="Ключ API вашої активної кампанії" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="Де знаходиться ключ API?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="Список ідентифікаторів" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="Ідентифікатор списку, для якого повинен бути зареєстрований користувач" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="Де ідентифікатор списку?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Оновити існуючого користувача" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Виберіть, чи повинен користувач поточної кампанії бути оновлений, коли він надсилає вашу форму назад" PK=A#]�3�]""Tconvertforms/activecampaign/language/et-EE/et-EE.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Convert Forms - ActiveCampaign integreerimine" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Convert Forms - Integreerimine ActiveCampaign e-mailide turunduse teenusega." PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="Kuidas leida API URL?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="API võti" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="Sinu ActiveCampaign API võti" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="Kuidas leida API võtit?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="Uudiskirja ID" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="Uudiskirja ID millega kasutaja liidetakse" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="Kuidas leida uudiskirja ID'd?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Uuenda olemasolevat kasutajat" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Vali, ka ssoovid uuendada olemasolevat kasutajat ActiveCampaign keskkonnas kui kasutaja vormi andmed sisestab" PK=A#]{7m���Xconvertforms/activecampaign/language/en-GB/en-GB.plg_convertforms_activecampaign.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN="Convert Forms - ActiveCampaign Integration" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Convert Forms - Integration with ActiveCampaign Email Marketing Services."PK=A#]��t��Tconvertforms/activecampaign/language/en-GB/en-GB.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Convert Forms - ActiveCampaign Integration" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Convert Forms - Integration with ActiveCampaign Email Marketing Services." PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="Where to find API URL?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="API Key" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="Your ActiveCampaign API Key" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="Where to find API Key?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="List ID" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="The List ID which the user should be subscribed to" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="Where to find List ID?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Update existing user" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Choose if you want to update your existing ActiveCampaign user if that user resubmits your form"PK=A#]�V*���Tconvertforms/activecampaign/language/fr-FR/fr-FR.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="Campagne active" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Convertisseur de formulaire - Intégration de la campagne active" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Convertisseur de formulaires - Intégration avec les services de Marketing et d'E-mailing de la campagne active" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="URL de l'API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="URL de l'API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="Où trouver l'URL de l'API ?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="Clé de l'API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="Votre clé d'API de la campagne active" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="Où trouver la clé de l'API ?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="ID de la liste" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="L'ID de la liste à laquelle l'utilisateur doit s'abonner" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="Où trouver l'ID de la liste ?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Mettre à jour un utilisateur existant" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Choisissez si vous voulez mettre à jour l'utilisateur existant de la campagne active si cet utilisateur soumet à nouveau votre formulaire." PK=A#]@�]��Tconvertforms/activecampaign/language/sk-SK/sk-SK.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="Aktívna kampaň" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Konvertovať formuláre – integrácia aktívnej kampane" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Konvertovať formuláre – integrácia so službami e-mailového marketingu ActiveCampaign." PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="API rozhrania URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="API rozhrania URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="Kde nájsť API URL?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="API kľúč" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="Váš kľúč rozhrania API ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="Kde nájsť kľúč API?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="ID zoznamu" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="ID zoznamu, na odber ktorého by sa mal používateľ prihlásiť" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="Kde nájsť ID zoznamu?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Aktualizovať existujúceho používateľa" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Vyberte, či chcete aktualizovať svojho existujúceho používateľa ActiveCampaign, ak tento používateľ znova odošle váš formulár" PK=A#]��p **Tconvertforms/activecampaign/language/el-GR/el-GR.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Convert Forms - Ενσωμάτωση ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Convert Forms - Ενσωμάτωση με την υπηρεσία email μάρκετινγκ ActiveCampaign." PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="Που θα βρώ το API URL?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="Κλειδί API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="Το κλειδί σας API του ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="Που θα βρω το κλειδί API?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="ID λίστας" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="ID λίστας στο οποίο πρέπει να εγγραφεί ο χρήστης" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="Που θα βρω το ID λίστας?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Ενημέρωση υπάρχοντος χρήστη" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Επιλέξτε εάν θέλετε να ενημερωθεί ο υπάρχων χρήστης ActiveCampaign εάν αυτός ο χρήστης υποβάλλει ξανά τη φόρμα σας." PK=A#]A //Tconvertforms/activecampaign/language/fi-FI/fi-FI.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Convert Forms - ActiveCampaign liitäntä" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Convert Forms - Integrointi ActiveCampaign Email Marketing Services -palveluun." PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="Mistä löytyy API URL?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="API Key" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="Sinun ActiveCampaign API Key" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="Mistä löytyy API Key?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="Luettelo ID" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="Luettelo ID, jonka käyttäjän tulee tilata" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="Mistä löytyy luettelo ID?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Päivitä nykyinen käyttäjä" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Valitse, haluatko päivittää nykyisen ActiveCampaign-käyttäjän, jos kyseinen käyttäjä lähettää uudestaan lomakkeen" PK=A#]���YYTconvertforms/activecampaign/language/de-DE/de-DE.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="AktiveKampagne" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Convert Forms - AktiveKampagne Integration" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Convert Forms - Integration mit AktiveKampagne E-Mail-Marketingdiensten." PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="Wo findet man die API URL?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="API Schlüssel" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="Ihr AktiveKampagne API Schlüssel" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="Wo findet man die API URL?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="Listen ID" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="Die Listen ID, zu der der Benutzer hinzugefügt werden soll" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="Wo findet man die Listen ID?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Akutalisiere existierenden Benutzer" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Wählen Sie, ob Sie Ihren bestehenden AktiveKampagne-Benutzer aktualisieren möchten, wenn dieser Benutzer Ihr Formular erneut abschickt" PK=A#];}D|&&Tconvertforms/activecampaign/language/sv-SE/sv-SE.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Convert Forms - ActiveCampaign integrering" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Convert Forms - Integration med ActiveCampaign e-postmarknadsföringstjänster" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="Var hittar jag API URL?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="API Nyckel" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="Din ActiveCampaign API-nyckel" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="Var hittar jag API nyckeln?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="List ID" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="List-ID som användaren ska prenumerera på" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="Var hittar jag List ID?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Uppdatera befintlig användare" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Välj om du vill uppdatera din befintliga ActiveCampaign-användare om den användaren skickar in ditt formulär igen" PK=A#]'@�@@Tconvertforms/activecampaign/language/ca-ES/ca-ES.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Integració Convert Forms - ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Integració entre Convert Forms i els serveis de màrqueting per correu electrònic ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="URL API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="URL API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="On trobar la URL API?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="Clau API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="La teva clau API d'ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="On trobar la clau API?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="ID de llista" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="L'ID del llistat al que s'hauria de subscriure l'usuari" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="On trobar l'ID de llista?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Actualitzar usuari existent" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Escull si vols actualitzar el teu usuari ActiveCampaign existent si aquest usuari torna a respondre al formulari" PK=A#]D)��IITconvertforms/activecampaign/language/bg-BG/bg-BG.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Convert Forms – ActiveCampaign интеграция" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Convert Forms – Интеграция с ActiveCampaign имейл маркетингови услуги " PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="Къде да намеря API URL?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="API ключ" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="Вашият ActiveCampaign API ключ" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="Къде да намеря API ключ?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="Списък ID" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="ID на списъка, за който потребителят трябва да се абонира" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="Къде да намеря List ID?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Актуализирайте съществуващ потребител" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Изберете дали искате да актуализирате своя съществуващ потребител на ActiveCampaign, ако той отново изпрати формуляра ви" PK=A#]���ffTconvertforms/activecampaign/language/es-ES/es-ES.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN="\"Formas de conversión\" - Integración con ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="\"Formularios de conversión\" - Integrar con servicios de marketing de Email ActiveCampaign." PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="URL de API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="URL de API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="¿Dónde encontrar la URL de API?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="Clave de API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="Tu clave de API Active Campaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="¿Dónde encontrar la clave de API?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="Lista ID" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="La lista ID a la que el usuario debiera estar suscrito" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="¿Dónde encontrar la Lista ID?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Actualiza usuario existente" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Elige si quieres actualizar tu usuario de ActiveCampaign existente si ese usuario reenvía el formulario" PK=A#]l2,,Tconvertforms/activecampaign/language/it-IT/it-IT.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="CampagnaAttiva" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Convert Forms - Integrazione CampagnaAttiva" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Convert Forms - Integrazione con i servizi Email Marketing di CampagnaAttiva." PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="URL API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="URL API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="dove trovare l'URL API?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="Chiave API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="La tua Chiave API di CampagnaAttiva" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="Dove trovare la chiave API?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="Lista ID" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="La lista di ID a cui l'utente si è iscritto" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="Dove trovare la Lista ID?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Aggiorna utenti già registrati" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Seleziona se vuoi aggiornare l'utente di CampagnaAttiva esistente e se lo stesso utente dovrà inviare il modulo" PK=A#].3R�??Tconvertforms/activecampaign/language/nl-NL/nl-NL.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Convert Forms - ActiveCampaign Integratie" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Convert Forms - Integratie met ActiveCampaign Email Marketing Services." PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="Waar kan ik de API URL vinden?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="API Sleutel" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="Jouw ActiveCampaign API Sleutel" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="Waar kan ik de API sleutel vinden?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="Lijst ID" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="De lijst-ID waarop de gebruiker geabonneerd zou moeten zijn" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="Waar kan ik de lijst-ID vinden?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Bijwerken bestaande gebruiker" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Kies om de bestaande ActiveCampaign gebruiker bij te werken als die gebruiker jouw formulier opnieuw indient." PK=A#]t���<<Tconvertforms/activecampaign/language/cs-CZ/cs-CZ.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Convert Forms - Integrace ActiveCampaign" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Convert Forms - Integrace emailových a marketingových služeb ActiveCampaign." PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="API URL" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="Kde najdu API URL?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="API klíč" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="Váš ActiveCampaign API klíč" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="Kde získáte API klíč?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="ID seznamu" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="ID seznamu k jehož odběru se uživatel přihlašuje" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="Kde najdu ID seznamu?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Upravit stávajícího uživatele" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Zvolte pokud chcete aktualizovat stávajícího uživatele ActiveCampaign v případě, že uživatel opětovně odeslal formulář" PK=A#]�% ��Tconvertforms/activecampaign/language/ru-RU/ru-RU.plg_convertforms_activecampaign.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ACTIVECAMPAIGN_ALIAS="Активная кампания" PLG_CONVERTFORMS_ACTIVECAMPAIGN="Преобразовать формы - интеграция в активную кампанию" PLG_CONVERTFORMS_ACTIVECAMPAIGN_DESC="Преобразовать формы - интеграция в службы почтового маркетинга текущей кампании." PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL="URL API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC="URL API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND="Где находится URL API?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY="Ключ API" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC="Ключ API вашей активной кампании" PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND="Где находится ключ API?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST="Список идентификаторов" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC="Идентификатор списка, для которого пользователь должен быть зарегистрирован" PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_FIND="Где идентификатор списка?" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER="Обновить существующего пользователя" PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC="Выберите, должен ли пользователь текущей кампании обновляться при отправке вашей формы обратно" PK=A#]��(vv$convertforms/activecampaign/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="endpoint" type="nrtext" label="PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL" description="PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_DESC" hint="http://account.api-us1.com" urltext="PLG_CONVERTFORMS_ACTIVECAMPAIGN_API_URL_FIND" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-activecampaign" required="true" class="input-xlarge"> </field> <field name="api" type="nrtext" label="PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY" description="PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_DESC" class="input-xlarge" urltext="PLG_CONVERTFORMS_ACTIVECAMPAIGN_KEY_FIND" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-activecampaign" required="true" /> <field name="list" type="servicelists" label="PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST" description="PLG_CONVERTFORMS_ACTIVECAMPAIGN_LIST_DESC" class="input-xlarge" required="true" /> <field name="updateexisting" type="radio" label="PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER" description="PLG_CONVERTFORMS_ACTIVECAMPAIGN_UPDATE_EXISTING_USER_DESC" class="btn-group btn-group-yesno" default="1"> <option value="0">JNO</option> <option value="1">JYES</option> </field> </fieldset> </form>PK=A#]ɯq��9�95convertforms/activecampaign/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsActivecampaignInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK=A#]�s��"�"convertforms/emails/emails.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); use Joomla\CMS\Plugin\PluginHelper; class plgConvertFormsEmails extends JPlugin { /** * Form Object * * @var object */ private $form; /** * Auto loads the plugin language file * * @var boolean */ protected $autoloadLanguage = true; /** * Add plugin fields to the form * * @param JForm $form * @param object $data * * @return boolean */ public function onConvertFormsFormPrepareForm($form, $data) { $form->loadFile(__DIR__ . '/form/form.xml', false); return true; } /** * Event triggered during fieldset rendering in the form editing page in the backend. * * @param string $fieldset_name The name of the fieldset is going to be rendered * @param string $fieldset The HTML output of the fieldset * * @return void */ public function onConvertFormsBackendFormPrepareFieldset($fieldset_name, &$fieldset) { if ($this->_name != $fieldset_name) { return; } // Proceed only if Mail Sending is disabled. if ((bool) \JFactory::getConfig()->get('mailonline')) { return; } $warning = ' <div class="alert alert-error"> <span class="icon-warning"></span>' . \JText::_('PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED') . ' </div>'; $fieldset = $warning . $fieldset; } /** * Create the final credentials with the auth code * * @param string $context The context of the content passed to the plugin (added in 1.6) * @param object $article A JTableContent object * @param bool $isNew If the content has just been created * * @return boolean */ public function onContentBeforeSave($context, $form, $isNew) { if ($context != 'com_convertforms.form') { return; } if (!is_object($form) || !isset($form->params)) { return; } $params = json_decode($form->params); if (!isset($params->emails)) { return true; } // Proceed only if Send Notifications option is enabled if ($params->sendnotifications != '1') { return true; } $this->form = clone $form; $this->form->params = $params; foreach ($params->emails as $key => $email) { $keyToID = ((int) str_replace('emails', '', $key)) + 1; $error = JText::_('COM_CONVERTFORMS_EMAILS') . ' #' . $keyToID . ' - '; $options = [ 'recipient' => ['COM_CONVERTFORMS_EMAILS_RECIPIENT', true, true], 'subject' => ['COM_CONVERTFORMS_EMAILS_SUBJECT', false, true], 'from_name' => ['COM_CONVERTFORMS_EMAILS_FROM', false, true], 'from_email' => ['COM_CONVERTFORMS_EMAILS_FROM_EMAIL', true, true], 'reply_to' => ['COM_CONVERTFORMS_EMAILS_REPLY_TO', true, false], 'reply_to_name' => ['COM_CONVERTFORMS_EMAILS_REPLY_TO_NAME', false, false], 'body' => ['COM_CONVERTFORMS_EMAILS_BODY', false, true], 'attachments' => ['COM_CONVERTFORMS_EMAILS_ATTACHMENT', false, false] ]; foreach ($options as $key => $option) { $acceptsCommaSeparatedValues = $option[1]; $optionValues = $acceptsCommaSeparatedValues ? explode(',', $email->$key) : (array) $email->$key; foreach ($optionValues as $optionValue) { $result = $this->validateOption($optionValue, $option[1], $option[2]); if (is_string($result)) { $form->setError($error . JText::_($option[0]) . ' - ' . $result); return false; break; } } } } return true; } /** * Validates string as an Email Notification option. * * @param string $string The option name as found in the xml file * @param bool $validateAsEmail If enabled, the option should be validated as an Email Address * @param bool $required If enabled, string should not be left blank * * @return void */ private function validateOption($string, $validateAsEmail = true, $required = true) { // Check if it's empty if ($required && (empty($string) || is_null($string))) { return JText::sprintf('PLG_CONVERTFORMS_EMAILS_ERROR_BLANK', $string); } $string = trim($string); // Check if has a valid field-based Smart Tag in the form: {field.field-name} $pattern = "#\{field.([^{}]*)\}#s"; preg_match_all($pattern, $string, $result); if (!empty($result[1]) && count($result[1]) > 0) { foreach ($result[1] as $key => $match) { // Keep only the actual field name list($field_name, $options) = explode('--', $result[1][$key]) + ['', '']; if (!$this->formHasField(trim($field_name))) { return JText::sprintf('PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG', $result[0][$key]); break; } } return true; } // Check if has a valid Email Address info@mail.com if ($validateAsEmail && !empty($string)) { // Check common email-based Smart Tags if (in_array($string, ['{user.email}', '{site.email}'])) { return true; } if (!ConvertForms\Validate::email($string)) { return JText::sprintf('PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS', $string); } } return true; } /** * Check if given name exists as a form field * * @param string $name * * @return bool */ private function formHasField($name) { $name = strtolower($name); foreach ($this->form->params->fields as $field) { if (!isset($field->name)) { continue; } if (strtolower($field->name) == $name) { return true; } // In case a sub Smart Tag is being used. Eg: {field.dropdown.label} to get dropdown's selected text. if (stripos($name, $field->name . '.') !== false) { return true; } } return false; } /** * Content is passed by reference, but after the save, so no changes will be saved. * * @param string $submission The submission information object * * @return void */ public function onConvertFormsSubmissionAfterSave($submission) { if (!isset($submission->form->sendnotifications) || !$submission->form->sendnotifications) { return; } if (!isset($submission->form->emails) || !is_array($submission->form->emails)) { return; } $emailCloakEnabled = PluginHelper::isEnabled('content', 'emailcloak'); // Send email queue foreach ($submission->form->emails as $key => $email) { // Disable cloaking of email addresses if ($emailCloakEnabled) { $email['body'] .= '{emailcloak=off}'; } // Trigger Content Plugins $email['body'] = \JHtml::_('content.prepare', $email['body']); // Replace {variables} $email = ConvertForms\SmartTags::replace($email, $submission); // Send mail $mailer = new NRFramework\Email($email); if (!$mailer->send()) { throw new \Exception($mailer->error); } } } }PK=A#] �� convertforms/emails/emails.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_EMAILS</name> <description>PLG_CONVERTFORMS_EMAILS_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c)2011-2016 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>January 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <folder>form</folder> <filename plugin="emails">emails.php</filename> <filename>script.install.helper.php</filename> </files> </extension>PK=A#]9��}9}9-convertforms/emails/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsEmailsInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK=A#]�*�ggDconvertforms/emails/language/cs-CZ/cs-CZ.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Convert Forms - E-mailová upozornění" PLG_CONVERTFORMS_EMAILS_DESC="Poslat upozornění e-mailem, pokud uživatel odešle formulář" PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Pole je povinné" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Neznámý chytrý štítek: %s" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Nemplatný e-mailová adresa: %s" PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b>Odesílání e-mailů je vypnuté!</b><br>Pokud chcete odesílání e-mailů zprovoznit, musíte aktivovat volbu Odesílat e-maily, kterou najdete v sekci Nastavení mailu v Globálním nastavení Joomla!" PK=A#]'Is�UUDconvertforms/emails/language/ru-RU/ru-RU.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Преобразовать формы - Уведомление по электронной почте" PLG_CONVERTFORMS_EMAILS_DESC="Отправить уведомление по электронной почте, когда пользователь отправляет форму" PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Поле обязательно для заполнения" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Неизвестный смарт-тег: %s" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Неверный адрес электронной почты: %s" PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b> Отправка электронной почты деактивирована! </b> <br> Чтобы иметь возможность отправлять электронную почту, в настройках электронной почты в глобальной конфигурации Joomla! Должен быть установлен параметр Отправить электронную почту. быть активированным. " PK=A#]O{�o��Dconvertforms/emails/language/ca-ES/ca-ES.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Convert Forms - Notificacions per correu electrònic" PLG_CONVERTFORMS_EMAILS_DESC="Envia notificacions per correu electrònic quan els usuaris responen a un formulari." PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Camp requerit" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Etiqueta intel·ligent desconeguda: %s" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Adreça de correu electrònic invàlida: %s" PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b>L'enviament de correus electrònics està desactivat!</b><br>Per poder enviar correus electrònics, la opció Enviar Correu electrònic dins la configuració Global de Joomla! ha d'estar activada." PK=A#]����KKDconvertforms/emails/language/it-IT/it-IT.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Convert Forms - Notifiche Email" PLG_CONVERTFORMS_EMAILS_DESC="Invia una notifica via email quando un utente invia un modulo." PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Campo richiesto" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Smart Tag sconosciuta: %s" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Indirizzo eMail errato: %s" PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b>L'invio di email è disabilitato!</b>Per abilitare la funzione di invio email, l'ozpione Invia Email deve essere attivata nel pannello di controllo di Joomla, alla voce Configurazione Globale." PK=A#]���&ssDconvertforms/emails/language/es-ES/es-ES.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="\"Formas de conversión\" - Notificaciones por email" PLG_CONVERTFORMS_EMAILS_DESC="Envíe notificación por email cuando los usuarios envíen un formulario." PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Campo requerido" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Smart Tag desconocido «%s»" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Email incorrecto «%s»" PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="¡El envío de correo está desactivado! Para poder enviar correos electrónicos, la opción Enviar correo se encuentra en la Configuración de correo en Joomla! La configuración global debe estar habilitada." PK=A#]ξ9�BBDconvertforms/emails/language/bg-BG/bg-BG.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Convert Forms – имейл нотификации" PLG_CONVERTFORMS_EMAILS_DESC="Изпращайте известия по имейл, когато потребителите изпратят формуляр." PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Задължително поле" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Неизвестен смарт таг: %s" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Невалиден имейл адрес: %s" PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b>Изпращането на поща е изключено!</b> <br>За да можете да изпращате имейли, опцията за изпращане на поща в глобалните настройките за поща на Joomla!, трябва да бъде активирана." PK=A#]#+d55Dconvertforms/emails/language/nl-NL/nl-NL.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Convert Forms - E-mail Notificaties" PLG_CONVERTFORMS_EMAILS_DESC="Stuur e-mail notificaties als gebruikers een formulier inzenden." PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Dit veld is vereist" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Onbekende Smart Tag: %s" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Ongeldig e-mailadres: %s" PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b>Sturen van mail is uitgeschakeld!</b><br>Om e-mails te kunnen sturen moet de Send Mail optie in de Mail Instellingen in de Joomla! Global Configuration ingeschakeld zijn." PK=A#]Sޭ\��Dconvertforms/emails/language/el-GR/el-GR.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Convert Forms - Ειδοποιήσεις ηλεκτρονικού ταχυδρομείου" PLG_CONVERTFORMS_EMAILS_DESC="Στείλτε ειδοποιήσεις μέσω email όταν οι χρήστες αποστέλουν μια φόρμα." PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Το πεδίο είναι υποχρεωτικό" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Άγνωστη έξυπνη ετικέτα: %s" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Μη έγκυρη διεύθυνση e-mail: %s" PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b>Η αποστολή αλληλογραφίας είναι απενεργοποιημένη!</b><br>Για να μπορείτε να στέλνετε μηνύματα, η επιλογή Αποστολή αλληλογραφίας βρίσκεται στις Ρυθμίσεις αλληλογραφίας του Joomla! Η καθολική διαμόρφωση πρέπει να είναι ενεργοποιημένη.." PK=A#]�J�VVDconvertforms/emails/language/de-DE/de-DE.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Convert Forms - Email Benachrichtigung" PLG_CONVERTFORMS_EMAILS_DESC="Email Benachrichtigung senden, wenn Benutzer ein Formular abschickt" PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Feld ist erforderlich" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Unbekanntes Smart Tag: %s" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Ungültige E-Mail-Adresse: %s" PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b> E-Mail-Versand ist deaktiviert! </b> <br> Um E-Mails versenden zu können, muss die Option E-Mail senden in den E-Mail-Einstellungen in der globalen Joomla! -Konfiguration aktiviert sein." PK=A#]�M�SJJDconvertforms/emails/language/fi-FI/fi-FI.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Convert Forms - Sähköposti-ilmoitukset" PLG_CONVERTFORMS_EMAILS_DESC="Lähetä sähköposti-ilmoitus, kun käyttäjä lähettää lomakkeen." PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Kenttä vaaditaan" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Tuntematon Smart Tag: %s" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Virheellinen sähköpostiosoite: %s" PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b>Sähköpostien lähettäminen on kytketty pois päältä! </b><br>Jotta voisit lähettää sähköpostia, Joomlan globaalit sähköpostiasetukset on otettava käyttöön." PK=A#]�TllDconvertforms/emails/language/pt-BR/pt-BR.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Plugin Formulários de Conversão - Notificações de E-mail" PLG_CONVERTFORMS_EMAILS_DESC="Envia notificações por e-mail quando os usuários enviarem um formulário." PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Campo obrigatório" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Smart Tag desconhecida: 1%s" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Endereço de email inválido: 1%s" ; PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b>Mail sending is turned off!</b><br>In order to be able to send emails, the Send Mail option found under the Mail Settings in the Joomla! Global Configuration must be enabled." PK=A#]��Y�&&Dconvertforms/emails/language/en-GB/en-GB.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Convert Forms - Email Notifications" PLG_CONVERTFORMS_EMAILS_DESC="Send email notifications when users submit a form." PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Field is required" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Unknown Smart Tag: %s" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Invalid email address: %s" PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b>Mail sending is turned off!</b><br>In order to be able to send emails, the Send Mail option found under the Mail Settings in the Joomla! Global Configuration must be enabled."PK=A#]ؔ��jjHconvertforms/emails/language/en-GB/en-GB.plg_convertforms_emails.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Convert Forms - Email Notifications" PLG_CONVERTFORMS_EMAILS_DESC="Send email notifications when users submit a form."PK=A#]��9P��Dconvertforms/emails/language/et-EE/et-EE.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Convert Forms - E-mailide teated" PLG_CONVERTFORMS_EMAILS_DESC="Saada e-maili teade kui kasutaja sisestab vormi." PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Kohustuslik väli" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Tundmatu nutikas-võtmesõna: %s" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Vigane e-maili aadress: %s" PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b>E-mailide saatmine on välja lülitatud!</b><br>Et e-maile saata, lülita Joomla üldistest seadetest see sisse." PK=A#]UF�W��Dconvertforms/emails/language/uk-UA/uk-UA.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Перетворити форми - повідомлення електронною поштою" PLG_CONVERTFORMS_EMAILS_DESC="Надіслати сповіщення електронною поштою, коли користувач подає форму" PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Поле обов'язкове" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Невідомий смарт-тег: %s " PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Недійсна адреса електронної пошти: %s " PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b> Електронна пошта вимкнена! </B> <br> Щоб мати змогу надсилати електронні листи, у глобальній конфігурації Joomla! Потрібно встановити параметр"_QQ_" Надіслати електронну пошту "_QQ_". бути активованим. " PK=A#]}�f�AADconvertforms/emails/language/fr-FR/fr-FR.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Convertisseur de formulaires - Notifications par mail" PLG_CONVERTFORMS_EMAILS_DESC="Envoyer une notification par mail aux utilisateurs complétant le formulaire." PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Ce champ est requis" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Smart tag inconnu : %s" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Adresse de messagerie incorrecte : %s" PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b>L'envoi de mails est désactivé !</b><br>Pour pouvoir les envoyer, vous devez activer l'option dans la Configuration générale de Joomla!" PK=A#]�>O�mmDconvertforms/emails/language/sk-SK/sk-SK.plg_convertforms_emails.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_EMAILS="Konvertovať formuláre – e-mailové upozornenia" PLG_CONVERTFORMS_EMAILS_DESC="Odosielať e-mailové upozornenia, keď používatelia odoslali formulár." PLG_CONVERTFORMS_EMAILS_ERROR_BLANK="Pole je povinné" PLG_CONVERTFORMS_EMAILS_ERROR_UNKNOWN_SMART_TAG="Neznáma inteligentná značka:%s" PLG_CONVERTFORMS_EMAILS_ERROR_INVALID_EMAIL_ADDRESS="Neplatná emailová adresa:%s" PLG_CONVERTFORMS_EMAILS_ERROR_MAIL_SENDING_DISABLED="<b>Odosielanie pošty je vypnuté! </b><br>Aby ste mohli posielať e-maily, možnosť Odoslať poštu sa nachádza v nastaveniach pošty v Joomla! Musí byť povolená globálna konfigurácia." PK=A#]]�z��&convertforms/emails/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsEmailsInstallerScript extends PlgConvertFormsEmailsInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_EMAILS'; public $alias = 'emails'; public $extension_type = 'plugin'; public $plugin_folder = "convertforms"; public $show_message = false; } PK=A#] �R4UU!convertforms/emails/form/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="emails" label="COM_CONVERTFORMS_EMAILS" tab="behavior" addfieldpath="plugins/convertforms/emails/form/fields"> <field name="sendnotifications" type="nrtoggle" label="COM_CONVERTFORMS_EMAILS_DESC" /> <field name="emails" type="cfsubform" formsource="/plugins/convertforms/emails/form/fields.xml" hiddenLabel="true" multiple="true" showon="sendnotifications:1" /> </fieldset> </form>PK=A#]��tww#convertforms/emails/form/fields.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset> <field name="recipient" type="text" label="COM_CONVERTFORMS_EMAILS_RECIPIENT" description="COM_CONVERTFORMS_EMAILS_RECIPIENT_DESC" hint="COM_CONVERTFORMS_EMAILS_RECIPIENT" class="show-smart-tags" default="{site.email}" required="true" /> <field name="subject" type="text" label="COM_CONVERTFORMS_EMAILS_SUBJECT" hint="COM_CONVERTFORMS_EMAILS_SUBJECT" class="show-smart-tags" default="New Submission #{submission.id}: Contact Form" required="true" /> <field name="from_name" type="text" label="COM_CONVERTFORMS_EMAILS_FROM" hint="COM_CONVERTFORMS_EMAILS_FROM" class="show-smart-tags" default="{site.name}" required="true" /> <field name="from_email" type="text" label="COM_CONVERTFORMS_EMAILS_FROM_EMAIL" hint="COM_CONVERTFORMS_EMAILS_FROM_EMAIL" class="show-smart-tags" default="{site.email}" required="true" /> <field name="reply_to" type="text" label="COM_CONVERTFORMS_EMAILS_REPLY_TO" hint="COM_CONVERTFORMS_EMAILS_REPLY_TO" class="show-smart-tags" /> <field name="reply_to_name" type="text" label="COM_CONVERTFORMS_EMAILS_REPLY_TO_NAME" hint="COM_CONVERTFORMS_EMAILS_REPLY_TO_NAME" class="show-smart-tags" /> <field name="body" type="textarea" label="COM_CONVERTFORMS_EMAILS_BODY" class="editorx show-smart-tags" filter="raw" required="true" default="{all_fields}" /> <field name="attachments" type="text" label="COM_CONVERTFORMS_EMAILS_ATTACHMENT" description="COM_CONVERTFORMS_EMAILS_ATTACHMENT_DESC" hint="images/myattachment.pdf" class="show-smart-tags" /> </fieldset> </form>PK=A#]:�/R++-convertforms/emails/form/fields/cfsubform.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); JFormHelper::loadFieldClass('subform'); class JFormFieldCFSubform extends JFormFieldSubform { /** * Method to get the field input markup. * * @return string The field input markup. * * @since 3.6 */ protected function getInput() { // The following script toggles the required attribute for all Email Notification options. JFactory::getDocument()->addScriptDeclaration(' jQuery(function($) { $("input[name=\'jform[sendnotifications]\']").on("change", function() { var enabled = $(this).is(":checked"); var exclude_fields = $("input[id*=reply_to], input[id$=attachments]"); var fields = $("#behavior-emails .subform-repeatable-group").find("input, textarea").not(exclude_fields); if (enabled) { fields.attr("required", "required").addClass("required"); } else { fields.removeAttr("required").removeClass("required"); } }); }); '); return parent::getInput(); } } PK=A#]��s!(("convertforms/icontact/icontact.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_ICONTACT</name> <description>PLG_CONVERTFORMS_ICONTACT_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c)2011-2016 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>March 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="icontact">icontact.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PK=A#]ͳ�7 7 "convertforms/icontact/icontact.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgConvertFormsIContact extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ public function subscribe() { $api = new NR_iContact(array( 'appID' => $this->lead->campaign->appID, 'username' => $this->lead->campaign->username, 'appPassword' => $this->lead->campaign->appPassword, 'accountID' => $this->lead->campaign->accountID, 'clientFolderID' => $this->lead->campaign->clientFolderID )); $api->subscribe( $this->lead->email, $this->lead->params, $this->lead->campaign->list ); if (!$api->success()) { throw new Exception($api->getLastError()); } } /** * Retrieve the accountID and the clientFolderID * * @param string $context The context of the content passed to the plugin (added in 1.6) * @param object $article A JTableContent object * @param bool $isNew If the content has just been created * * @return boolean */ public function onContentBeforeSave($context, $article, $isNew) { if ($context != 'com_convertforms.campaign') { return; } if (!is_object($article) || !isset($article->params) || !isset($article->service) || ($article->service != 'icontact')) { return; } $params = json_decode($article->params); if (!isset($params->appID) || !isset($params->username) || !isset($params->appPassword)) { return; } $this->loadWrapper(); if (empty($params->accountID) || empty($params->clientFolderID)) { try { $api = new NR_iContact(array( 'appID' => $params->appID, 'username' => $params->username, 'appPassword' => $params->appPassword )); $params->accountID = $api->accountID; $params->clientFolderID = $api->clientFolderID; $article->params = json_encode($params); } catch (Exception $e) { JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error'); } } return true; } }PK=A#]Քz{��Hconvertforms/icontact/language/es-ES/es-ES.plg_convertforms_icontact.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT_ALIAS="iContact" PLG_CONVERTFORMS_ICONTACT="\"Formas de conversión\" - Integración con iContact" PLG_CONVERTFORMS_ICONTACT_DESC="\"Formularios de conversión\" - Integración con servicios de marketing de Email iContact." PLG_CONVERTFORMS_ICONTACT_APP_ID="App ID" PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC="Tu ID de App iContact" PLG_CONVERTFORMS_ICONTACT_USERNAME="Nombre de usuario" PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC="Tu nombre de usuario iContact" PLG_CONVERTFORMS_ICONTACT_APP_PASS="Contraseña de la App" PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC="Tu contraseña de app iContact. ¡Esta NO es to contraseña de tu cuenta iContact!" PLG_CONVERTFORMS_ICONTACT_LIST_ID="Lista ID" PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC="La lista ID a la que el usuario debiera estar suscrito" PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID="¿Dónde encontrar la App ID?" PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS="¿Dónde encontrar la contraseña de la App?" PLG_CONVERTFORMS_ICONTACT_FIND_LIST_ID="¿Dónde encontrar la Lista ID?" PK=A#]|�22Hconvertforms/icontact/language/bg-BG/bg-BG.plg_convertforms_icontact.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT_ALIAS="iContact" PLG_CONVERTFORMS_ICONTACT="Convert Forms – iContact интеграция" PLG_CONVERTFORMS_ICONTACT_DESC="Convert Forms – интеграция с iContact имейл маркетингови услуги." PLG_CONVERTFORMS_ICONTACT_APP_ID="ID апликация" PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC="Вашият ID на iContact апликация" PLG_CONVERTFORMS_ICONTACT_USERNAME="Име на потребител" PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC="Вашето iContact име на потребител" PLG_CONVERTFORMS_ICONTACT_APP_PASS="Парола за приложение" PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC="Вашата iContact парола за приложение. Това НЕ е вашата парола за iContact Account!" PLG_CONVERTFORMS_ICONTACT_LIST_ID="ID на списъка" PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC="ID на списъка, за който потребителят трябва да се абонира" PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID="Къде да намерите ID на приложението?" PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS="Къде да намерите парола за приложение?" PLG_CONVERTFORMS_ICONTACT_FIND_LIST_ID="Къде да намерите ID идентификационния номер на списъка?" PK=A#]{�7c��Hconvertforms/icontact/language/it-IT/it-IT.plg_convertforms_icontact.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT_ALIAS="iContact" PLG_CONVERTFORMS_ICONTACT="Integrazione Convert Forms - iContact" PLG_CONVERTFORMS_ICONTACT_DESC="Integrazione Convert Forms con i servizi Email Marketing di iContact." PLG_CONVERTFORMS_ICONTACT_APP_ID="ID app" PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC="La tua ID app di iContact" PLG_CONVERTFORMS_ICONTACT_USERNAME="Nome utente" PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC="Il tuo nome utente su iContact" PLG_CONVERTFORMS_ICONTACT_APP_PASS="Password dell'app" PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC="La tua password dell'app di iContact. Questa NON è la password del tuo account iContact" PLG_CONVERTFORMS_ICONTACT_LIST_ID="ID elenco" PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC="L'ID elenco a cui l'utente dovrebbe essere iscritto" PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID="Dove trovare l'ID dell'app?" PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS="Dove trovare la password dell'app?" PLG_CONVERTFORMS_ICONTACT_FIND_LIST_ID="Dove trovare l'ID elenco?" PK=A#]��.���Hconvertforms/icontact/language/ca-ES/ca-ES.plg_convertforms_icontact.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT_ALIAS="iContact" PLG_CONVERTFORMS_ICONTACT="Integració Convert Forms - iContact" PLG_CONVERTFORMS_ICONTACT_DESC="Integració entre Convert Forms i els serveis de màrqueting per correu electrònic iContact" PLG_CONVERTFORMS_ICONTACT_APP_ID="ID d'app" PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC="L'ID de la teva App iContact" PLG_CONVERTFORMS_ICONTACT_USERNAME="Nom d'usuari" PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC="El teu nom d'usuari a iContact" PLG_CONVERTFORMS_ICONTACT_APP_PASS="Contrasenya d'App" PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC="La teva contrasenya de l'App iContact. Aquesta NO és la contrasenya del teu compte d'iContact!" PLG_CONVERTFORMS_ICONTACT_LIST_ID="ID de llista" PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC="L'ID del llistat al que s'hauria de subscriure l'usuari" PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID="On trobar l'Id d'App?" PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS="On trobar la contrasenya d'App?" PLG_CONVERTFORMS_ICONTACT_FIND_LIST_ID="On trobar l'ID de llista?" PK=A#]K��<QQHconvertforms/icontact/language/ru-RU/ru-RU.plg_convertforms_icontact.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT_ALIAS="iContact" PLG_CONVERTFORMS_ICONTACT="Преобразование форм - интеграция с iContact" PLG_CONVERTFORMS_ICONTACT_DESC="Преобразование форм - интеграция с iContact Email Marketing Services." PLG_CONVERTFORMS_ICONTACT_APP_ID="Идентификатор приложения" PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC="Ваш идентификатор приложения iContact" PLG_CONVERTFORMS_ICONTACT_USERNAME="Имя пользователя" PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC="Ваше имя пользователя iContact" PLG_CONVERTFORMS_ICONTACT_APP_PASS="Пароль приложения" PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC="Ваш пароль приложения iContact. Это НЕ пароль вашего аккаунта iContact!" PLG_CONVERTFORMS_ICONTACT_LIST_ID="Список ID" PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC="Идентификатор списка, на который пользователь должен подписаться" PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID="Где я могу найти идентификатор приложения?" PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS="Где я могу найти пароль приложения?" PLG_CONVERTFORMS_ICONTACT_FIND_LIST_ID="Где я могу найти идентификатор списка?" PK=A#]���Ȓ�Hconvertforms/icontact/language/cs-CZ/cs-CZ.plg_convertforms_icontact.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT_ALIAS="iContact" PLG_CONVERTFORMS_ICONTACT="Convert Forms - Integrace iContact" PLG_CONVERTFORMS_ICONTACT_DESC="Convert Forms - Integrace emailových a marketingových služeb iContact." PLG_CONVERTFORMS_ICONTACT_APP_ID="ID aplikace" PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC="Vaše iContact ID aplikace" PLG_CONVERTFORMS_ICONTACT_USERNAME="Uživatelské jméno" PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC="Vaše iContact uživatelské jméno" PLG_CONVERTFORMS_ICONTACT_APP_PASS="Heslo aplikace" PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC="Vaše iContact heslo aplikace. Toto NENÍ heslok účtu iContact!" PLG_CONVERTFORMS_ICONTACT_LIST_ID="ID seznamu" PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC="ID seznamu k jehož odběru se uživatel přihlašuje" PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID="Kde najdu ID aplikace?" PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS="Kde najdu heslo aplikace?" PLG_CONVERTFORMS_ICONTACT_FIND_LIST_ID="Kde najdu ID seznamu?" PK=A#]��4��Hconvertforms/icontact/language/sk-SK/sk-SK.plg_convertforms_icontact.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT_ALIAS="iContact" PLG_CONVERTFORMS_ICONTACT="Konvertovať formuláre – integrácia iContact" PLG_CONVERTFORMS_ICONTACT_DESC="Konvertovať formuláre – integrácia so službami e-mailového marketingu iContact." PLG_CONVERTFORMS_ICONTACT_APP_ID="ID aplikácie" PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC="ID vašej aplikácie iContact" PLG_CONVERTFORMS_ICONTACT_USERNAME="Používateľské meno" PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC="Vaše používateľské meno iContact" PLG_CONVERTFORMS_ICONTACT_APP_PASS="Heslo aplikácie" PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC="Vaše heslo aplikácie iContact. Toto NIE JE heslo vášho účtu iContact!" PLG_CONVERTFORMS_ICONTACT_LIST_ID="ID zoznamu" PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC="ID zoznamu, na odber ktorého by sa mal používateľ prihlásiť" PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID="Kde nájsť ID aplikácie?" PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS="Kde nájsť heslo aplikácie?" PLG_CONVERTFORMS_ICONTACT_FIND_LIST_ID="Kde nájsť ID zoznamu?" PK=A#]"�fHconvertforms/icontact/language/fr-FR/fr-FR.plg_convertforms_icontact.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT_ALIAS="iContact" PLG_CONVERTFORMS_ICONTACT="Convertisseur de formulaire - Intégration d'iContact" PLG_CONVERTFORMS_ICONTACT_DESC="Convertisseur de formulaires - Intégration avec les services de Marketing et d'E-mailing d'iContact." PLG_CONVERTFORMS_ICONTACT_APP_ID="ID de l'appli" PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC="Votre ID d'iContact App" PLG_CONVERTFORMS_ICONTACT_USERNAME="Nom d'utilisateur" PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC="Votre nom d'utilisateur d'iContact" PLG_CONVERTFORMS_ICONTACT_APP_PASS="Mot de passe de l'appli" PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC="Le mot de passe d'iContact App. Ce N'est PAS le mot de passe de votre compte iContact !" PLG_CONVERTFORMS_ICONTACT_LIST_ID="ID de la liste" PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC="L'ID de la liste à laquelle l'utilisateur doit s'abonner" PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID="Où trouver l'ID de l'appli ?" PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS="Où trouver le mot de passe de l'appli ?" PLG_CONVERTFORMS_ICONTACT_FIND_LIST_ID="Où trouver l'ID de la liste ?" PK=A#]l�n�xxHconvertforms/icontact/language/et-EE/et-EE.plg_convertforms_icontact.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT_ALIAS="iContact" PLG_CONVERTFORMS_ICONTACT="Convert Forms - iContact integreerimine" PLG_CONVERTFORMS_ICONTACT_DESC="Convert Forms - Integreerimine iContact e-mailide turunduse teenusega." PLG_CONVERTFORMS_ICONTACT_APP_ID="Äpi ID" PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC="Sinu iContact äpi ID" PLG_CONVERTFORMS_ICONTACT_USERNAME="Kasutajanimi" PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC="Sinu iContact kasutajanimi" PLG_CONVERTFORMS_ICONTACT_APP_PASS="Äpi parool" PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC="Sinu iContact äpi parool. See ei ole sinu iContact konto parool!" PLG_CONVERTFORMS_ICONTACT_LIST_ID="Uudiskirja ID" PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC="Uudiskirja ID millega kasutaja liidetakse" PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID="Kuidas leida äpi ID'd?" PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS="Kuidas leida äpi parooli?" PLG_CONVERTFORMS_ICONTACT_FIND_LIST_ID="Kuidas leida uudiskirja ID'd?" PK=A#]��}�OOHconvertforms/icontact/language/uk-UA/uk-UA.plg_convertforms_icontact.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT_ALIAS="iContact" PLG_CONVERTFORMS_ICONTACT="Перетворити форми - інтеграція iContact" PLG_CONVERTFORMS_ICONTACT_DESC="Перетворити форми - інтеграція з iContact Email Marketing Services." PLG_CONVERTFORMS_ICONTACT_APP_ID="Ідентифікатор додатка" PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC="Ваш ідентифікатор програми iContact" PLG_CONVERTFORMS_ICONTACT_USERNAME="Ім'я користувача" PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC="Ваше ім'я користувача iContact" PLG_CONVERTFORMS_ICONTACT_APP_PASS="спеціальний пароль для програми" PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC="Ваш пароль програми iContact. Це НЕ пароль вашого облікового запису iContact!" PLG_CONVERTFORMS_ICONTACT_LIST_ID="список ID" PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC="Ідентифікатор списку, на який повинен підписатись користувач" PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID="Де я можу знайти ідентифікатор програми?" PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS="Де я можу знайти пароль програми?" PLG_CONVERTFORMS_ICONTACT_FIND_LIST_ID="Де я можу знайти ідентифікатор списку?" PK=A#]���0iiHconvertforms/icontact/language/en-GB/en-GB.plg_convertforms_icontact.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT_ALIAS="iContact" PLG_CONVERTFORMS_ICONTACT="Convert Forms - iContact Integration" PLG_CONVERTFORMS_ICONTACT_DESC="Convert Forms - Integration with iContact Email Marketing Services." PLG_CONVERTFORMS_ICONTACT_APP_ID="App ID" PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC="Your iContact App ID" PLG_CONVERTFORMS_ICONTACT_USERNAME="Username" PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC="Your iContact Username" PLG_CONVERTFORMS_ICONTACT_APP_PASS="App Password" PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC="Your iContact App Password. This is NOT your iContact Account Password!" PLG_CONVERTFORMS_ICONTACT_LIST_ID="List ID" PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC="The List ID which the user should be subscribed to" PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID="Where to find App ID?" PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS="Where to find App Password?" PLG_CONVERTFORMS_ICONTACT_FIND_LIST_ID="Where to find List ID?"PK=A#]Q�xxLconvertforms/icontact/language/en-GB/en-GB.plg_convertforms_icontact.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT="Convert Forms - iContact Integration" PLG_CONVERTFORMS_ICONTACT_DESC="Convert Forms - Integration with iContact Email Marketing Services."PK=A#]�����Hconvertforms/icontact/language/de-DE/de-DE.plg_convertforms_icontact.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT_ALIAS="iContact" PLG_CONVERTFORMS_ICONTACT="Convert Forms - iContact Integration" PLG_CONVERTFORMS_ICONTACT_DESC="Convert Forms - Integration mit iContact E-Mail-Marketing-Diensten." PLG_CONVERTFORMS_ICONTACT_APP_ID="App ID" PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC="Ihre iContact App ID" PLG_CONVERTFORMS_ICONTACT_USERNAME="Benutzername" PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC="Ihr iContact Benutzername" PLG_CONVERTFORMS_ICONTACT_APP_PASS="App Passwort" PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC="Ihr iContact App Passwort. Dies ist NICHT das Passwort für Ihr iContact-Konto!" PLG_CONVERTFORMS_ICONTACT_LIST_ID="Listen ID" PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC="Die Listen ID, zu der der Benutzer hinzugefügt werden soll" PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID="Wo findet man die App ID?" PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS="Wo findet man das App Passwort?" PLG_CONVERTFORMS_ICONTACT_FIND_LIST_ID="Wo findet man die Listen ID?" PK=A#]�~5��Hconvertforms/icontact/language/fi-FI/fi-FI.plg_convertforms_icontact.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT_ALIAS="iContact" PLG_CONVERTFORMS_ICONTACT="Convert Forms - iContact liitäntä" PLG_CONVERTFORMS_ICONTACT_DESC="Convert Forms - Integrointi iContact Email Marketing palveluun." PLG_CONVERTFORMS_ICONTACT_APP_ID="Sovellus ID" PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC="Sinun iContact sovellus ID" PLG_CONVERTFORMS_ICONTACT_USERNAME="Käyttäjänimi" PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC="Sinun iContact käyttäjänimi" PLG_CONVERTFORMS_ICONTACT_APP_PASS="Sovelluksen salasana" PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC="IContact-sovelluksen salasana. Tämä EI ole iContact-tilisi salasana!" PLG_CONVERTFORMS_ICONTACT_LIST_ID="Luettelo ID" PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC="Luettelo ID, jonka käyttäjän tulee tilata" PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID="Mistä löytyy sovellus ID?" PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS="Mistä löytyy sovellus salasana?" PLG_CONVERTFORMS_ICONTACT_FIND_LIST_ID="Mistä löytyy luettelo ID?" PK=A#]����Hconvertforms/icontact/language/el-GR/el-GR.plg_convertforms_icontact.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ICONTACT_ALIAS="iContact" PLG_CONVERTFORMS_ICONTACT="Convert Forms - Ενσωμάτωση iContact " PLG_CONVERTFORMS_ICONTACT_DESC="Convert Forms - Ενσωμάτωση με Υπηρεσία μάρκετινγκ ηλεκτρονικού ταχυδρομείου iContact ." PLG_CONVERTFORMS_ICONTACT_APP_ID="App ID" PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC="Το ID σας για το iContact App" PLG_CONVERTFORMS_ICONTACT_USERNAME="Οομα χρήστη" PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC="Το όνομα χρήστη iContact" PLG_CONVERTFORMS_ICONTACT_APP_PASS="Κωδικός App" PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC="Ο κωδικός σας iContact App. ΔΕΝ είναι ο Κωδικός Λογαριασμού που έχετε στο iContact!" PLG_CONVERTFORMS_ICONTACT_LIST_ID="ID λίστας" PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC="ID λίστας στο οποίο πρέπει να εγγραφεί ο χρήστης" PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID="Που θα βρω το ID του App?" PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS="Που θα βρω τον κωδικό του App?" PLG_CONVERTFORMS_ICONTACT_FIND_LIST_ID="Που θα βρω το ID λίστας?" PK=A#]2����convertforms/icontact/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="appID" type="nrtext" label="PLG_CONVERTFORMS_ICONTACT_APP_ID" description="PLG_CONVERTFORMS_ICONTACT_APP_ID_DESC" class="input-xlarge" required="true" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-icontact" urltext="PLG_CONVERTFORMS_ICONTACT_FIND_APP_ID" /> <field name="username" type="nrtext" label="PLG_CONVERTFORMS_ICONTACT_USERNAME" description="PLG_CONVERTFORMS_ICONTACT_USERNAME_DESC" class="input-xlarge" required="true" /> <field name="appPassword" type="nrtext" label="PLG_CONVERTFORMS_ICONTACT_APP_PASS" description="PLG_CONVERTFORMS_ICONTACT_APP_PASS_DESC" class="input-xlarge" required="true" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-icontact" urltext="PLG_CONVERTFORMS_ICONTACT_FIND_APP_PASS" /> <field name="list" type="servicelists" label="PLG_CONVERTFORMS_ICONTACT_LIST_ID" description="PLG_CONVERTFORMS_ICONTACT_LIST_ID_DESC" class="input-xlarge" required="true" /> <field name="accountID" type="hidden" default="" /> <field name="clientFolderID" type="hidden" default="" /> </fieldset> </form>PK=A#]�r��(convertforms/icontact/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsiContactInstallerScript extends PlgConvertFormsiContactInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_ICONTACT'; public $alias = 'icontact'; public $extension_type = 'plugin'; public $plugin_folder = "convertforms"; public $show_message = false; } PK=A#]4��@99/convertforms/icontact/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsIcontactInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK=A#]�j�V�9�92convertforms/errorlogger/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsErrorloggerInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK=A#]�� ��+convertforms/errorlogger/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsErrorLoggerInstallerScript extends PlgConvertFormsErrorLoggerInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_ERRORLOGGER'; public $alias = 'errorlogger'; public $extension_type = 'plugin'; public $plugin_folder = "convertforms"; public $show_message = false; } PK=A#])[�: : (convertforms/errorlogger/errorlogger.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); use NRFramework\WebClient; use ConvertForms\Form; class plgConvertFormsErrorLogger extends JPlugin { /** * Joomla Application Object * * @var object */ protected $app; /** * Add plugin fields to the form * * @param JForm $form * @param object $data * * @return boolean */ public function onConvertFormsError($error, $category, $form_id, $data = null) { // Only on front-end if ($this->app->isClient('administrator')) { return; } if (isset($data['skip_error_logger'])) { return; } $user = JFactory::getUser(); // Get form's name $form_data = Form::load($form_id); $form_name = isset($form_data['name']) ? $form_data['name'] : 'Unknown Form'; $form_name .= ' (' . $form_id . ')'; $error_message = ' Identity --------------------------------------------------------------------------- Date Time: ' . JFactory::getDate() . ' Error Category: ' . $category . ' Error message: ' . $error . ' Form: ' . $form_name . ' Session ID: ' . JFactory::getSession()->getId() . ' IP Address: ' . $this->app->input->server->get('REMOTE_ADDR') . ' User Agent: ' . WebClient::getClient()->userAgent . ' Device: ' . WebClient::getDeviceType() . ' Logged In Username: ' . $user->username . ' Logged In Name: ' . $user->name . ' Data --------------------------------------------------------------------------- ' . print_r($data, true) . ' Request Headers --------------------------------------------------------------------------- ' . print_r($this->app->input->server->getArray(), true) . ' '; try { JLog::add($error_message, JLog::ERROR, 'convertforms_errors'); } catch (\Throwable $th) { } } }PK=A#]+xɼ��Nconvertforms/errorlogger/language/ca-ES/ca-ES.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Convert Forms - Registre d'errors" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Registra els errors produïts durant la tramesa i el renderitzat de formularis a un arxiu de registre." PK=A#]wIԯ�Nconvertforms/errorlogger/language/nl-NL/nl-NL.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Convert Forms - Fouten Logboek" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Fouten die zich voordoen bij de werking en bij het inzenden van een formulier worden in een logbestand bewaard. " PK=A#]�ʌN��Nconvertforms/errorlogger/language/es-ES/es-ES.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Convertir formularios - Registro de errores" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Errores de registro de errores producidos durante el envío del formulario y la representación del formulario en un archivo de registro de errores." PK=A#]��¬Nconvertforms/errorlogger/language/bg-BG/bg-BG.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Convert Forms – Дневник на грешките" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Дневник на грешките при регистрация, грешки при подаване на формуляра и при показване на формуляр в сайта." PK=A#]Vn����Nconvertforms/errorlogger/language/it-IT/it-IT.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Convert Forms - Logger Errori" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Trascrive su un file gli errori che avvengono quando si inviano moduli." PK=A#]��l���Nconvertforms/errorlogger/language/ru-RU/ru-RU.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Конструктор форм - Журнал ошибок" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Сохраняет в журнал ошибки, возникающие при отправке заявок или создании форм" PK=A#]��n���Nconvertforms/errorlogger/language/cs-CZ/cs-CZ.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Convert Forms - Záznam chyb" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Logovat chyby, která nastanou v průběhu vyplňování nebo odesílání formuláře a ukládat je do souboru." PK=A#]����Nconvertforms/errorlogger/language/fr-FR/fr-FR.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Convert Forms - Enregistrement des erreurs" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Enregistre dans un fichier log les erreurs qui se produisent lors de la soumission ou du remplissage d'un formulaire." PK=A#]�b|���Nconvertforms/errorlogger/language/et-EE/et-EE.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Convert Forms - Vigade logija" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Logi vigasid mis võivad tekkida vormi andmete sisestamisel ja vormi loomisel." PK=A#]�I�Nconvertforms/errorlogger/language/uk-UA/uk-UA.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Перетворити форми - журнал помилок" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Помилки журналу, які виникають під час подання форми та коли форма надається в файл журналу помилок." PK=A#]��u��Nconvertforms/errorlogger/language/en-GB/en-GB.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Convert Forms - Error Logger" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Log errors errors produced during form submission and form rendering to an error log file."PK=A#]��u��Rconvertforms/errorlogger/language/en-GB/en-GB.plg_convertforms_errorlogger.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Convert Forms - Error Logger" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Log errors errors produced during form submission and form rendering to an error log file."PK=A#]|�kϯ�Nconvertforms/errorlogger/language/sk-SK/sk-SK.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Convert Forms - Error Logger" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Zaznamenajte chyby vzniknuté počas odosielania formulára a vykresľovania formulára do súboru denníka chýb." PK=A#]������Nconvertforms/errorlogger/language/de-DE/de-DE.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Convert Forms - Fehlerprotokoll" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Protokolliert Fehler, die während der Formularübermittlung und Formularwiedergabe erzeugt wurden, in einer Fehlerprotokolldatei. " PK=A#]f��Nconvertforms/errorlogger/language/fi-FI/fi-FI.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Convert Forms - Virherekisteröinti" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Virhelogiin liitetyt virheet, jotka on tuotettu lomakkeen lähettämisen ja lomakkeen palautuksen yhteydessä." PK=A#]�8u�**Nconvertforms/errorlogger/language/el-GR/el-GR.plg_convertforms_errorlogger.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2019 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ERRORLOGGER="Convert Forms - Καταγραφή σφαλμάτων" PLG_CONVERTFORMS_ERRORLOGGER_DESC="Σφάλματα καταγραφής, που δημιουργούνται κατά την υποβολή φόρμας και απόδοση φόρμας σε αρχείο καταγραφής σφαλμάτων." PK=A#]w���(convertforms/errorlogger/errorlogger.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_ERRORLOGGER</name> <description>PLG_CONVERTFORMS_ERRORLOGGER_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c) 2011-2019 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>January 2019</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="errorlogger">errorlogger.php</filename> <filename>script.install.helper.php</filename> </files> </extension>PK=A#]dBVM��convertforms/zoho/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="api" type="nrtext" label="PLG_CONVERTFORMS_ZOHO_KEY" description="PLG_CONVERTFORMS_ZOHO_KEY_DESC" class="input-xlarge" required="true" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-zoho" urltext="PLG_CONVERTFORMS_ZOHO_FIND_API_KEY" /> <field name="list" type="servicelists" label="PLG_CONVERTFORMS_ZOHO_LIST_ID" description="PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC" class="input-xlarge" required="true" /> </fieldset> </form>PK=A#]�J�@convertforms/zoho/language/es-ES/es-ES.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Campañas Zoho" PLG_CONVERTFORMS_ZOHO="\"Formularios de conversión\" - Integración campañas Zoho" PLG_CONVERTFORMS_ZOHO_DESC="\"Formularios de conversión\" - Integración con Campañas Zoho." PLG_CONVERTFORMS_ZOHO_KEY="Código de autentificación" PLG_CONVERTFORMS_ZOHO_KEY_DESC="Tu código de autentificación Zoho" PLG_CONVERTFORMS_ZOHO_LIST_ID="Lista ID" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="La lista ID a la que el usuario debiera estar suscrito" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="¿Dónde encontrar el código de autentificación?" PK=A#]�Nn44@convertforms/zoho/language/bg-BG/bg-BG.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Zoho Campaigns" PLG_CONVERTFORMS_ZOHO="Convert Forms – Zoho Campaigns интеграция" PLG_CONVERTFORMS_ZOHO_DESC="Convert Forms – интеграция със Zoho Campaigns." PLG_CONVERTFORMS_ZOHO_KEY="Auth Code " PLG_CONVERTFORMS_ZOHO_KEY_DESC="Вашият Zoho Auth Code разрешаващ код" PLG_CONVERTFORMS_ZOHO_LIST_ID="ID списък" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="ID на списъка, за който потребителят трябва да се абонира" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="Къде да намерите Auth Code?" PK=A#]�W���@convertforms/zoho/language/it-IT/it-IT.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Zoho Campaigns" PLG_CONVERTFORMS_ZOHO="Integrazione Convert Forms - Zoho Campaigns" PLG_CONVERTFORMS_ZOHO_DESC="Integrazione Convert Forms con Zoho Campaigns." PLG_CONVERTFORMS_ZOHO_KEY="Codice di autorizzazione" PLG_CONVERTFORMS_ZOHO_KEY_DESC="Il tuo codice di autorizzazione di Zoho" PLG_CONVERTFORMS_ZOHO_LIST_ID="ID elenco" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="L'ID elenco a cui l'utente dovrebbe essere iscritto" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="Dove trovare il codice di autorizzazione?" PK=A#]Ǚ����@convertforms/zoho/language/sv-SE/sv-SE.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Zoho kampanjer" PLG_CONVERTFORMS_ZOHO="Convert Forms - Zoho Kampanjintegration" PLG_CONVERTFORMS_ZOHO_DESC="Convert Forms - Integration med Zoho kampanjer." PLG_CONVERTFORMS_ZOHO_KEY="Behörighetskod" PLG_CONVERTFORMS_ZOHO_KEY_DESC="Din Zoho behörighetskod" PLG_CONVERTFORMS_ZOHO_LIST_ID="List ID" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="List-ID som användaren ska prenumerera på" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="Var hittar jag behörighetskoden?" PK=A#]<�;���@convertforms/zoho/language/ca-ES/ca-ES.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Zoho Campaigns" PLG_CONVERTFORMS_ZOHO="Integració Convert Forms - Zoho Campaigns" PLG_CONVERTFORMS_ZOHO_DESC="Integració entre Convert Forms i Zoho Campaigns." PLG_CONVERTFORMS_ZOHO_KEY="Auth Code" PLG_CONVERTFORMS_ZOHO_KEY_DESC="El teu Zoho Auth Code" PLG_CONVERTFORMS_ZOHO_LIST_ID="ID de llista" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="L'ID del llistat al que s'hauria de subscriure l'usuari" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="On trobar l'Auth Code?" PK=A#]��h��@convertforms/zoho/language/cs-CZ/cs-CZ.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Zoho Campaigns" PLG_CONVERTFORMS_ZOHO="Convert Forms - Integrace Zoho Campaigns" PLG_CONVERTFORMS_ZOHO_DESC="Convert Forms - Integrace Zoho Campaigns." PLG_CONVERTFORMS_ZOHO_KEY="Autorizační kód" PLG_CONVERTFORMS_ZOHO_KEY_DESC="Vás Zoho autorizační kód" PLG_CONVERTFORMS_ZOHO_LIST_ID="ID seznamu" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="ID seznamu k jehož odběru se uživatel přihlašuje" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="Kde najdu autorizační kód?" PK=A#]��H��@convertforms/zoho/language/ru-RU/ru-RU.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Zoho Кампании" PLG_CONVERTFORMS_ZOHO="Преобразование форм - интеграция кампании Zoho" PLG_CONVERTFORMS_ZOHO_DESC="Преобразование форм - интеграция с кампаниями Zoho." PLG_CONVERTFORMS_ZOHO_KEY="код аутентификации" PLG_CONVERTFORMS_ZOHO_KEY_DESC="Ваш код авторизации Zoho" PLG_CONVERTFORMS_ZOHO_LIST_ID="список ID" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="Идентификатор списка, на который пользователь должен подписаться" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="Где я могу найти код аутентификации?" PK=A#]��N��@convertforms/zoho/language/sk-SK/sk-SK.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Zoho kampane" PLG_CONVERTFORMS_ZOHO="Konvertovať formuláre – integrácia kampaní Zoho" PLG_CONVERTFORMS_ZOHO_DESC="Konvertovať formuláre – integrácia s kampaňami Zoho." PLG_CONVERTFORMS_ZOHO_KEY="Auth Code" PLG_CONVERTFORMS_ZOHO_KEY_DESC="Váš autorizačný kód Zoho" PLG_CONVERTFORMS_ZOHO_LIST_ID="ID zoznamu" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="ID zoznamu, na odber ktorého by sa mal používateľ prihlásiť" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="Kde nájsť Auth Code?" PK=A#]Z�t @convertforms/zoho/language/fr-FR/fr-FR.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Campagne Zoho" PLG_CONVERTFORMS_ZOHO="Convertisseur de formulaire - Intégration de la campagne Zoho" PLG_CONVERTFORMS_ZOHO_DESC="Convertisseur de formulaires - Intégration avec la campagne Zoho." PLG_CONVERTFORMS_ZOHO_KEY="Code d'authentification" PLG_CONVERTFORMS_ZOHO_KEY_DESC="Votre code d'authentification Zoho" PLG_CONVERTFORMS_ZOHO_LIST_ID="ID de la liste" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="L'ID de la liste à laquelle l'utilisateur doit s'abonner" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="Où trouver votre code d'authentification ?" PK=A#]x�9i��@convertforms/zoho/language/et-EE/et-EE.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Zoho Campaigns" PLG_CONVERTFORMS_ZOHO="Convert Forms - Zoho Campaigns integreerimine" PLG_CONVERTFORMS_ZOHO_DESC="Convert Forms - Integreerimine Zoho Campaigns'ga." PLG_CONVERTFORMS_ZOHO_KEY="Autentimiskood" PLG_CONVERTFORMS_ZOHO_KEY_DESC="Sinu Zoho autentimiskood" PLG_CONVERTFORMS_ZOHO_LIST_ID="Uudiskirja ID" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="Uudiskirja ID millega kasutaja liidetakse" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="Kuidas leida autentimiskoodi?" PK=A#](�aȊ�@convertforms/zoho/language/uk-UA/uk-UA.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Zoho Кампанії" PLG_CONVERTFORMS_ZOHO="Перетворення форм - інтеграція кампанії Zoho" PLG_CONVERTFORMS_ZOHO_DESC="Перетворити форми - інтеграція з кампаніями Zoho." PLG_CONVERTFORMS_ZOHO_KEY="код аутентифікації" PLG_CONVERTFORMS_ZOHO_KEY_DESC="Ваш код Zoho Auth" PLG_CONVERTFORMS_ZOHO_LIST_ID="список ID" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="Ідентифікатор списку, на який повинен підписатись користувач" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="Де я можу знайти код аутентифікації?" PK=A#]�:�H��@convertforms/zoho/language/en-GB/en-GB.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Zoho Campaigns" PLG_CONVERTFORMS_ZOHO="Convert Forms - Zoho Campaigns Integration" PLG_CONVERTFORMS_ZOHO_DESC="Convert Forms - Integration with Zoho Campaigns." PLG_CONVERTFORMS_ZOHO_KEY="Auth Code" PLG_CONVERTFORMS_ZOHO_KEY_DESC="Your Zoho Auth Code" PLG_CONVERTFORMS_ZOHO_LIST_ID="List ID" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="The List ID which the user should be subscribed to" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="Where to find Auth Code?"PK=A#]Q�K�ccDconvertforms/zoho/language/en-GB/en-GB.plg_convertforms_zoho.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO="Convert Forms - Zoho Campaigns Integration" PLG_CONVERTFORMS_ZOHO_DESC="Convert Forms - Integration with Zoho Campaigns."PK=A#]o�x7��@convertforms/zoho/language/de-DE/de-DE.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Zoho Campaigns" PLG_CONVERTFORMS_ZOHO="Convert Forms - Zoho Campaigns Integration" PLG_CONVERTFORMS_ZOHO_DESC="Convert Forms - Integration mit Zoho Campaigns." PLG_CONVERTFORMS_ZOHO_KEY="Authentifizierungscode" PLG_CONVERTFORMS_ZOHO_KEY_DESC="Ihr Zoho Authentifizierungscode" PLG_CONVERTFORMS_ZOHO_LIST_ID="Listen ID" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="Die Listen ID, zu der der Benutzer hinzugefügt werden soll" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="Wo findet man den Authentifizierungscode?" PK@A#]M\���@convertforms/zoho/language/fi-FI/fi-FI.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Zoho Campaigns" PLG_CONVERTFORMS_ZOHO="Convert Forms - Zoho Campaigns liitäntä" PLG_CONVERTFORMS_ZOHO_DESC="Convert Forms - IIntegrointi Zoho Campaigns." PLG_CONVERTFORMS_ZOHO_KEY="Valtuutuskoodi" PLG_CONVERTFORMS_ZOHO_KEY_DESC="Sinun Zoho valtuutuskoodi" PLG_CONVERTFORMS_ZOHO_LIST_ID="Luettelo ID" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="Luettelo ID, jonka käyttäjän tulee tilata" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="Mistä löytyy valtuutuskoodi?" PK@A#]���@convertforms/zoho/language/el-GR/el-GR.plg_convertforms_zoho.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHO_ALIAS="Καμπάνιες Zoho" PLG_CONVERTFORMS_ZOHO="Convert Forms - Ενσωμάτωση σε καμπάνιες Zoho" PLG_CONVERTFORMS_ZOHO_DESC="Convert Forms - Ενσωμάτωση με καμπάνιες Zoho." PLG_CONVERTFORMS_ZOHO_KEY="Κωδικός έγκρισης" PLG_CONVERTFORMS_ZOHO_KEY_DESC="Ο κωδικός έγκρισής σας στο Zoho" PLG_CONVERTFORMS_ZOHO_LIST_ID="Αναγνωριστικό λίστας" PLG_CONVERTFORMS_ZOHO_LIST_ID_DESC="Το αναγνωριστικό λίστας στο οποίο πρέπει να εγγραφεί ο χρήστης" PLG_CONVERTFORMS_ZOHO_FIND_API_KEY="Που να βρω τον κωδικό έγκρισης;" PK@A#]����convertforms/zoho/zoho.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_ZOHO</name> <description>PLG_CONVERTFORMS_ZOHO_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c)2011-2017 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>May 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="zoho">zoho.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PK@A#]�;�zconvertforms/zoho/zoho.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgConvertFormsZoho extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ function subscribe() { $api = new NR_ZoHo(array('api' => $this->lead->campaign->api)); $api->subscribe( $this->lead->email, $this->lead->campaign->list, $this->lead->params ); if (!$api->success()) { throw new Exception($api->getLastError()); } } }PK@A#]��C��$convertforms/zoho/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsZoHoInstallerScript extends PlgConvertFormsZoHoInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_ZOHO'; public $alias = 'zoho'; public $extension_type = 'plugin'; public $plugin_folder = "convertforms"; public $show_message = false; } PK@A#]T}]{9{9+convertforms/zoho/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsZohoInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK@A#]YM<t��*convertforms/elasticemail/elasticemail.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgConvertFormsElasticEmail extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ public function subscribe() { $api = new NR_ElasticEmail(array('api' => $this->lead->campaign->api)); $api->subscribe( $this->lead->email, $this->lead->campaign->list, $this->lead->campaign->publicAccountID, $this->lead->params, $this->lead->campaign->updateexisting, $this->lead->campaign->doubleoptin, $this->lead->campaign->publicAccountID ); if (!$api->success()) { throw new Exception($api->getLastError()); } } /** * Get the publicAccountID * * @param string $context The context of the content passed to the plugin (added in 1.6) * @param object $article A JTableContent object * @param bool $isNew If the content has just been created * * @return boolean */ public function onContentBeforeSave($context, $article, $isNew) { if ($context != 'com_convertforms.campaign') { return; } if (!is_object($article) || !isset($article->params) || !isset($article->service) || ($article->service != 'elasticemail')) { return; } $this->loadWrapper(); $params = json_decode($article->params); if (!isset($params->api)) { return; } try { $api = new NR_ElasticEmail(array('api' => $params->api)); $params->publicAccountID = $api->getPublicAccountID(); $article->params = json_encode($params); } catch (Exception $e) { JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error'); return; } return true; } }PK@A#]��n�88*convertforms/elasticemail/elasticemail.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_ELASTICEMAIL</name> <description>PLG_CONVERTFORMS_ELASTICEMAIL_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c) 2011-2017 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>July 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="elasticemail">elasticemail.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PK@A#]�c ��Pconvertforms/elasticemail/language/ru-RU/ru-RU.plg_convertforms_elasticemail.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL_ALIAS="ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL="Преобразование форм - интеграция с ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="Преобразование форм - интеграция со службами электронной почты ElasticEmail." PLG_CONVERTFORMS_ELASTICEMAIL_KEY="ключ API" PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC="Ваш ключ API ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID="список ID" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC="Идентификатор списка, на который пользователь должен подписаться" PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY="Где я могу найти ключ API?" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN="Двойной Optin" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC="Следует ли информировать пользователя по электронной почте после подписки, чтобы он мог активировать его?" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER="Обновить существующего пользователя" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC="Следует ли обновлять существующего пользователя при повторном входе в систему с новыми данными?" PLG_CONVERTFORMS_ELASTICEMAIL_UNRETRIEVABLE_PUBLICACCOUNTID="Не удалось получить идентификатор общедоступной эластичной учетной записи электронной почты. Пожалуйста, проверьте свой ключ API и попробуйте снова сохранить кампанию." PK@A#]����Pconvertforms/elasticemail/language/cs-CZ/cs-CZ.plg_convertforms_elasticemail.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL_ALIAS="ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL="Convert Forms - Integrace ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="Convert Forms - Integrace emailových a marketingových služeb ElasticEmail." PLG_CONVERTFORMS_ELASTICEMAIL_KEY="API klíč" PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC="Váš ElasticEmail API klíč" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID="ID seznamu" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC="ID seznamu k jehož odběru se uživatel přihlašuje" PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY="Kde získáte API klíč?" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN="Dvojité potvrzení souhlasu" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC="Možnosti informovat uživatele e-mailem o přihlášení k odběru, aby jej mohl potvrdit a tím aktivovat." PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER="Upravit stávajícího uživatele" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC="Možnost aktualizovat stávajícího uživatele, pokud se znovu přihlásí s novými údaji." PLG_CONVERTFORMS_ELASTICEMAIL_UNRETRIEVABLE_PUBLICACCOUNTID="ID veřejného účtu Elastic Email nelze načíst. Zkontrolujte váš klíč API a zkuste kampaň znovu uložit." PK@A#] M(���Pconvertforms/elasticemail/language/ca-ES/ca-ES.plg_convertforms_elasticemail.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL_ALIAS="ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL="Integració Convert Forms - ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="Integració entre Convert Forms i els serveis de màrqueting per correu electrònic ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_KEY="Clau API" PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC="La teva clau API d'ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID="ID de llista" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC="L'ID del llistat al que s'hauria de subscriure l'usuari" PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY="On trobar la clau API?" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN="Doble confirmació d'entrada" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC="Escull si s'hauria d'informar per correu electrònic l'usuari per activar la subscripció." PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER="Actualitzar usuari existent" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC="Escull si s'hauria d'actualitzar un usuari existent si es torna a subscriure amb noves dades." PLG_CONVERTFORMS_ELASTICEMAIL_UNRETRIEVABLE_PUBLICACCOUNTID="No s'ha pogut recuperar l'ID de Compte Públic d'ElasticMail. Comprova la teva clau API i intenta tornar a guardar la campanya." PK@A#]�͔�Pconvertforms/elasticemail/language/it-IT/it-IT.plg_convertforms_elasticemail.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL_ALIAS="ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL="Integrazione Convert Forms - ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="Integrazione Convert Forms con i servizi Email Marketing di ElasticEmail." PLG_CONVERTFORMS_ELASTICEMAIL_KEY="Chiave API" PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC="La tua Chiave API di ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID="ID elenco" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC="L'ID elenco a cui l'utente dovrebbe essere iscritto" PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY="Dove trovare la chiave API?" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN="Doppio opt-in" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC="Se l'utente dovrebbe essere informato con un email dopo l'iscrizione così può attivarla." PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER="Aggiorna utente esistente" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC="Se l'utente dovrebbe essere aggiornato con un email in caso si iscriva di nuovo con nuovi dati." PLG_CONVERTFORMS_ELASTICEMAIL_UNRETRIEVABLE_PUBLICACCOUNTID="Non si trova l'ID dell'account pubblico di ElasticEmail. Ti prego di controllare la tua chiave API e di provare a salvare di nuovo la campagna." PK@A#]��Y�UUPconvertforms/elasticemail/language/bg-BG/bg-BG.plg_convertforms_elasticemail.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL_ALIAS="ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL="Convert Forms – ElasticEmail интеграция" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="Convert Forms – интеграция на ElasticEmail имейл маркетинг услуги." PLG_CONVERTFORMS_ELASTICEMAIL_KEY="API ключ" PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC="Вашият ElasticEmail API ключ" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID="ID на списък" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC="ID на списъка, за който потребителят трябва да се абонира" PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY="Къде да намерите API ключ?" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN="Double Optin активация" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC="Дали потребителят трябва да бъде уведомен чрез имейл след абонамента си с линк за да активира абонамента си." PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER="Актуализиране съществуващия потребител" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC="Дали съществуващ потребител трябва да бъде актуализиран, когато той се абонира отново с нови данни." PLG_CONVERTFORMS_ELASTICEMAIL_UNRETRIEVABLE_PUBLICACCOUNTID="Elastic Email Public Account ID не може да бъде извлечен. Моля, проверете вашия API ключ и опитайте да запазите кампанията отново." PK@A#]+ն��Pconvertforms/elasticemail/language/es-ES/es-ES.plg_convertforms_elasticemail.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL_ALIAS="ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL="\"Formas de conversión\" - Integración con ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="\"Formularios de conversión\" - Integración con servicios de marketing de Email ElasticEmail." PLG_CONVERTFORMS_ELASTICEMAIL_KEY="Clave de API" PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC="Tu clave de API ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID="Lista ID" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC="La lista ID a la que el usuario debiera estar suscrito" PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY="¿Dónde encontrar la clave de API?" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN="Optin doble" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC="Si el usuario debe ser notificado por email después de su suscripción para activarla." PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER="Actualiza usuario existente" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC="Si un usuario existente debe ser actualizado si se subscribe de nuevo con nuevos datos." PLG_CONVERTFORMS_ELASTICEMAIL_UNRETRIEVABLE_PUBLICACCOUNTID="La ID de cuenta pública de ElasticEmail no se pudo recuperar. Por favor revise su clave de API e intente guardar la campaña nuevamente." PK@A#]Hֻ�ttPconvertforms/elasticemail/language/fi-FI/fi-FI.plg_convertforms_elasticemail.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL_ALIAS="ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL="Convert Forms - ElasticEmail liitäntä" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="Convert Forms -Integrointi ElasticEmail Email Marketing palveluun." PLG_CONVERTFORMS_ELASTICEMAIL_KEY="API Key" PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC="Sinun ElasticEmail API Key" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID="Luettelo ID" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC="Luettelo ID, jonka käyttäjän tulee tilata" PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY="Mistä löytyy API Key?" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN="Tupla varmistus" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC="Pitääkö käyttäjälle ilmoittaa tilauksen jälkeen sähköpostitse, jotta hän voi aktivoida tilauksen." PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER="Päivitä nykyinen käyttäjä" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC="Pitääkö olemassa olevan käyttäjän päivittää, jos hän tilaa uudelleen uutta tietoa." PLG_CONVERTFORMS_ELASTICEMAIL_UNRETRIEVABLE_PUBLICACCOUNTID="Elastic Emailin julkisen tilin tunnusta ei voitu noutaa. Tarkista API-avaimesi ja yritä tallentaa kampanja uudelleen." PK@A#]@�?��Pconvertforms/elasticemail/language/de-DE/de-DE.plg_convertforms_elasticemail.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL_ALIAS="ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL="Convert Forms - ElasticEmail Integration" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="Convert Forms - Integration mit ElasticEmail E-Mail-Marketing-Diensten." PLG_CONVERTFORMS_ELASTICEMAIL_KEY="API Schlüssel" PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC="Ihr ElasticEmail API Schlüssel" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID="Listen ID" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC="Die Listen ID, zu der der Benutzer hinzugefügt werden soll" PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY="Wo findet man den API Schlüssel?" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN="Doppeltes Opt-in" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC="Ob der Nutzer nach seinem Abonnement per E-Mail informiert werden soll, damit er es aktivieren kann." PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER="Bestehenden Benutzer aktualisieren" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC="Ob ein bestehender Benutzer aktualisiert werden soll, wenn er sich erneut mit neuen Daten anmeldet." PLG_CONVERTFORMS_ELASTICEMAIL_UNRETRIEVABLE_PUBLICACCOUNTID="Die öffentliche Konto ID von ElasticEmail konnte nicht abgerufen werden. Bitte überprüfen Sie Ihren API-Schlüssel und versuchen Sie erneut, die Kampagne zu speichern." PK@A#]�H�UUPconvertforms/elasticemail/language/el-GR/el-GR.plg_convertforms_elasticemail.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL_ALIAS="ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL="Convert Forms - Ενσωμάτωση ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="Convert Forms - Ενσωμάτωση με Υπηρεσία ηλεκτρονικού ταχυδρομείου ElasticEmail." PLG_CONVERTFORMS_ELASTICEMAIL_KEY="Κλειδί API" PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC="Το κλειδί σας API για το ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID="Αναγνωριστικό λίστας" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC="Αναγνωριστικό λίστας στο οποίο πρέπει να εγγραφεί ο χρήστης" PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY="Που να βρείτε το κλειδί API;" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN="Double Optin" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC="O χρήστης θα πρέπει να ενημερωθεί με email μετά την εγγραφή του ώστε να μπορεί να την ενεργοποιήσει." PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER="Ενημέρωση υπάρχοντος χρήστη" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC="Ένας υπάρχων χρήστης θα πρέπει να ενημερωθεί εάν εγγραφεί ξανά με νέα δεδομένα." PLG_CONVERTFORMS_ELASTICEMAIL_UNRETRIEVABLE_PUBLICACCOUNTID="Δεν ήταν δυνατή η ανάκτηση του αναγνωριστικού για το Elastic Email. Ελέγξτε το κλειδί API και δοκιμάστε να αποθηκεύσετε ξανά την καμπάνια." PK@A#]���y��Pconvertforms/elasticemail/language/fr-FR/fr-FR.plg_convertforms_elasticemail.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL_ALIAS="ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL="Convertisseur de formulaires - Intégration de ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="Convertisseur de formulaires - Intégration avec les services de Marketing et d'E-mailing d'ElasticEmail." PLG_CONVERTFORMS_ELASTICEMAIL_KEY="Clé de l'API" PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC="Votre clé de l'API ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID="ID de la liste" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC="L'ID de la liste à laquelle l'utilisateur doit s'abonner" PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY="Où trouver la clé de l'API ?" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN="Vérification par mail" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC="Informe l'utilisateur après son abonnement par mail afin qu'il puisse l'activer." PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER="Mettre à jour un utilisateur existant" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC="Met à jour un utilisateur existant avec de nouvelles données s'il est déjà inscrit." PLG_CONVERTFORMS_ELASTICEMAIL_UNRETRIEVABLE_PUBLICACCOUNTID="L'ID du compte public ElasticEmail n'a pas pu être récupéré. Veuillez vérifier votre clé API et réessayer d'enregistrer la campagne." PK@A#] K�TTPconvertforms/elasticemail/language/en-GB/en-GB.plg_convertforms_elasticemail.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL_ALIAS="ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL="Convert Forms - ElasticEmail Integration" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="Convert Forms - Integration with ElasticEmail Email Marketing Services." PLG_CONVERTFORMS_ELASTICEMAIL_KEY="API Key" PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC="Your ElasticEmail API Key" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID="List ID" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC="The List ID which the user should be subscribed to" PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY="Where to find API Key?" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN="Double Optin" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC="Whether the user should be informed by an email after his subscription so he can activate it." PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER="Update existing user" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC="Whether an existing user should be updated if he subscribes again with new data." PLG_CONVERTFORMS_ELASTICEMAIL_UNRETRIEVABLE_PUBLICACCOUNTID="The Elastic Email Public Account ID could not be retrieved. Please check your API Key and try saving the campaign again."PK@A#]C� ���Tconvertforms/elasticemail/language/en-GB/en-GB.plg_convertforms_elasticemail.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL="Convert Forms - ElasticEmail Integration" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="Convert Forms - Integration with ElasticEmail Email Marketing Services."PK@A#]���<eePconvertforms/elasticemail/language/uk-UA/uk-UA.plg_convertforms_elasticemail.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL_ALIAS="ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL="Перетворити форми - інтеграція ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="Перетворити форми - інтеграція з маркетинговими послугами ElasticEmail." PLG_CONVERTFORMS_ELASTICEMAIL_KEY="ключ API" PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC="Ваш ключ API ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID="список ID" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC="Ідентифікатор списку, на який повинен підписатись користувач" PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY="Де я можу знайти ключ API?" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN="Подвійний оптин" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC="Чи слід повідомляти користувача електронною поштою після його підписки, щоб він міг його активувати?" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER="Оновити існуючого користувача" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC="Чи слід оновити існуючого користувача, коли він знову ввійде з новими даними?" PLG_CONVERTFORMS_ELASTICEMAIL_UNRETRIEVABLE_PUBLICACCOUNTID="Не вдалося отримати ідентифікатор загальнодоступного еластичного електронної пошти. Перевірте ключ API і спробуйте зберегти кампанію ще раз." PK@A#]����66Pconvertforms/elasticemail/language/et-EE/et-EE.plg_convertforms_elasticemail.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL_ALIAS="ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL="Convert Forms - ElasticEmail integreerimine" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="Convert Forms - Integreerimine ElasticEmail e-mailide turunduse teenusega." PLG_CONVERTFORMS_ELASTICEMAIL_KEY="API võti" PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC="Sinu ElasticEmail API võti" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID="Uudiskirja ID" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC="Uudiskirja ID millega kasutaja liidetakse" PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY="Kuidas leida API võtit?" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN="Kahekordne kinnitus" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC="Määra, kas kasutajat peab teavitama liitmisest, et ta ise end üle aktiveeriks." PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER="Uuenda olemasolevat kasutajat" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC="Kas olemasoleva kasutaja andmed kirjutatakse üle." PLG_CONVERTFORMS_ELASTICEMAIL_UNRETRIEVABLE_PUBLICACCOUNTID="ElasticEmaili avaliku konto ID pole kättesaadav. Palun kontrolli API võtit ja salvesta kampaania uuesti." PK@A#]�3����Pconvertforms/elasticemail/language/sk-SK/sk-SK.plg_convertforms_elasticemail.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ELASTICEMAIL_ALIAS="Elastický email" PLG_CONVERTFORMS_ELASTICEMAIL="Konvertovať formuláre – ElasticEmail Integration" PLG_CONVERTFORMS_ELASTICEMAIL_DESC="Konvertovať formuláre – integrácia so službami e-mailového marketingu ElasticEmail." PLG_CONVERTFORMS_ELASTICEMAIL_KEY="API kľúč" PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC="Váš kľúč rozhrania API ElasticEmail" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID="ID zoznamu" PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC="ID zoznamu, na odber ktorého by sa mal používateľ prihlásiť" PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY="Kde nájsť kľúč API?" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN="Double Optin" PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC="Či má byť používateľ po predplatení informovaný e-mailom, aby si ho mohol aktivovať." PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER="Aktualizovať existujúceho používateľa" PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC="Či sa má existujúci používateľ aktualizovať, ak sa znova prihlási na odber s novými údajmi." PLG_CONVERTFORMS_ELASTICEMAIL_UNRETRIEVABLE_PUBLICACCOUNTID="Nepodarilo sa získať ID verejného účtu elastického e-mailu. Skontrolujte svoj kľúč API a skúste kampaň uložiť znova." PK@A#]c�b "convertforms/elasticemail/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="api" type="nrtext" label="PLG_CONVERTFORMS_ELASTICEMAIL_KEY" description="PLG_CONVERTFORMS_ELASTICEMAIL_KEY_DESC" class="input-xlarge" required="true" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-elasticemail" urltext="PLG_CONVERTFORMS_ELASTICEMAIL_FIND_API_KEY" /> <field name="list" type="servicelists" label="PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID" description="PLG_CONVERTFORMS_ELASTICEMAIL_LIST_ID_DESC" class="input-xlarge" required="true" /> <field name="doubleoptin" type="radio" label="PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN" description="PLG_CONVERTFORMS_ELASTICEMAIL_DOUBLE_OPTIN_DESC" class="btn-group btn-group-yesno" default="0"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="updateexisting" type="radio" label="PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER" description="PLG_CONVERTFORMS_ELASTICEMAIL_UPDATE_EXISTING_USER_DESC" class="btn-group btn-group-yesno" default="1"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="publicAccountID" type="hidden" default="" /> </fieldset> </form>PK@A#]��r��,convertforms/elasticemail/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsElasticEmailInstallerScript extends PlgConvertFormsElasticEmailInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_ELASTICEMAIL'; public $alias = 'elasticemail'; public $extension_type = 'plugin'; public $plugin_folder = 'convertforms'; public $show_message = false; } PK@A#]��x�9�93convertforms/elasticemail/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsElasticemailInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK@A#]��5&& convertforms/zohocrm/zohocrm.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="convertforms" method="upgrade"> <name>PLG_CONVERTFORMS_ZOHOCRM</name> <description>PLG_CONVERTFORMS_ZOHOCRM_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c)2011-2017 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>October 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="zohocrm">zohocrm.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PK@A#] �,�� convertforms/zohocrm/zohocrm.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); /** * Zoho CRM Convert Forms Plugin * * Note: Zoho CRM is using spaces in their custom field names (First Name, Last Name e.t.c). * Therefore we can't apply any filtering that strips away spaces on the Field Key * option during form saving in the backend as we can end up with a broken form. * * Commit regression: 13d8dc4 * https://bitbucket.org/tassosm/convertforms/commits/13d8dc475816a83c697ec81e5558d4680dfb4dcd */ class plgConvertFormsZohoCRM extends \ConvertForms\Plugin { /** * Main method to store data to service * * @return void */ public function subscribe() { $api = new NR_ZohoCRM(array( 'authenticationToken' => $this->lead->campaign->authenticationToken, 'datacenter' => isset($this->lead->campaign->dc) ? $this->lead->campaign->dc : null )); $api->subscribe( $this->lead->email, $this->lead->params, $this->lead->campaign->zohomodule, $this->lead->campaign->updateexisting, $this->lead->campaign->triggerworkflow, $this->lead->campaign->approval ); if (!$api->success()) { throw new Exception($api->getLastError()); } } }PK@A#]��X~9~9.convertforms/zohocrm/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgConvertformsZohocrmInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK@A#]>�S S convertforms/zohocrm/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="service"> <field name="authenticationToken" type="nrtext" label="PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN" description="PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC" class="input-xlarge" required="true" url="https://www.tassos.gr/joomla-extensions/convert-forms/docs/sync-leads-with-zohocrm" urltext="PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN" /> <field name="dc" type="list" label="PLG_CONVERTFORMS_ZOHOCRM_DATACENTER" description="PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC" default="crm.zoho.com"> <option value="crm.zoho.eu">EU</option> <option value="crm.zoho.com">US</option> </field> <field name="zohomodule" type="list" label="PLG_CONVERTFORMS_ZOHOCRM_MODULE" description="PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC" size="1" default="leads"> <option value="leads">PLG_CONVERTFORMS_ZOHOCRM_LEADS</option> <option value="accounts">PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS</option> <option value="contacts">PLG_CONVERTFORMS_ZOHOCRM_CONTACTS</option> </field> <field name="updateexisting" type="radio" label="PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER" description="PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC" class="btn-group btn-group-yesno" default="1"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="triggerworkflow" type="radio" label="PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW" description="PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC" class="btn-group btn-group-yesno" default="1"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="approval" type="radio" label="PLG_CONVERTFORMS_ZOHOCRM_APPROVAL" description="PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC" class="btn-group btn-group-yesno" default="0"> <option value="0">JNO</option> <option value="1">JYES</option> </field> </fieldset> </form>PK@A#]�ԗ�}}Fconvertforms/zohocrm/language/cs-CZ/cs-CZ.plg_convertforms_zohocrm.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM_ALIAS="Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM="Convert Forms - Integrace Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM_DESC="Convert Forms - Integrace Zoho CRM." PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN="Autorizační token" PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC="Váš autorizační token Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN="Kde najdu autorizační token?" PLG_CONVERTFORMS_ZOHOCRM_MODULE="Modul" PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC="Modul Zoho CRM, do kterého chcete předávat záznamy" PLG_CONVERTFORMS_ZOHOCRM_LEADS="Leads" PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS="Účty" PLG_CONVERTFORMS_ZOHOCRM_CONTACTS="Kontakty" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER="Upravit stávajícího uživatele" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC="Zapněte možnost ukládání záznamů v potvrzovacím režimu." PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW="Spouštěcí workflow" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC="Zapněte spouštěč, které ovlivní postup zpracování při ukládání záznamů do CRM účtu." PLG_CONVERTFORMS_ZOHOCRM_APPROVAL="Režim schvalování" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC="Pokud povolíte tuto možnost, záznamy se nebudou ukládat přímo do modulů Zoho. Budou vyžadovat neprve potrvzení." PLG_CONVERTFORMS_ZOHOCRM_DATACENTER="Datacentrum" PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC="Vyberte, kde je hostovaná vaše instalace Zoho CRM." PK@A#]t�_���Fconvertforms/zohocrm/language/ru-RU/ru-RU.plg_convertforms_zohocrm.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM_ALIAS="Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM="Преобразование форм - интеграция с Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM_DESC="Конвертировать формы - интеграция с Zoho CRM." PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN="Проверка подлинности фишку" PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC="Ваш токен аутентификации Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN="Где я могу найти токен аутентификации?" PLG_CONVERTFORMS_ZOHOCRM_MODULE="Модуль" PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC="Модуль Zoho CRM, на который вы хотите отправлять свои сообщения" PLG_CONVERTFORMS_ZOHOCRM_LEADS="Интересующиеся" PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS="Учетные записи" PLG_CONVERTFORMS_ZOHOCRM_CONTACTS="Контакты" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER="Обновить существующего пользователя" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC="Чтобы сохранить записи в режиме утверждения." PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW="Запуск рабочего процесса" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC="Активируйте эту опцию, чтобы активировать правило рабочего процесса при вставке записей данных в учетную запись CRM." PLG_CONVERTFORMS_ZOHOCRM_APPROVAL="Об утверждении режима" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC="Если эта опция активирована, записи не добавляются непосредственно в модули Zoho. Сначала они должны быть утверждены." PLG_CONVERTFORMS_ZOHOCRM_DATACENTER="Датацентр" PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC="Выберите, где размещена ваша Zoho CRM." PK@A#]4����Fconvertforms/zohocrm/language/ca-ES/ca-ES.plg_convertforms_zohocrm.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM_ALIAS="Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM="Integració Convert Forms - Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM_DESC="Integració entre Convert Forms i Zoho CRM." PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN="Token d'autentificació" PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC="El teu token d'autentificació Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN="On trobar el token d'autentificació?" PLG_CONVERTFORMS_ZOHOCRM_MODULE="Mòdul" PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC="El mòdul Zoho CRM al que t'agradaria enviar les teves respostes" PLG_CONVERTFORMS_ZOHOCRM_LEADS="Pistes" PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS="Comptes" PLG_CONVERTFORMS_ZOHOCRM_CONTACTS="Contactes" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER="Actualitzar usuari existent" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC="Activa-ho per mantenir els registres en mode aprovació" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW="Iniciar flux de treball" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC="Activa-ho per disparar la regla de flux de treball mentre s'insereixen registres al compte CRM." PLG_CONVERTFORMS_ZOHOCRM_APPROVAL="Mode d'aprovació" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC="Quan aquesta opció està activada, els registres no s'afegeixen directament als mòduls Zoho. Primer cal activar-los." PLG_CONVERTFORMS_ZOHOCRM_DATACENTER="Centre de dades" PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC="Escull on s'hospeda el teu Zoho CRM" PK@A#]�2Wc��Fconvertforms/zohocrm/language/bg-BG/bg-BG.plg_convertforms_zohocrm.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM_ALIAS="Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM="Convert Forms – Zoho CRM интеграция" PLG_CONVERTFORMS_ZOHOCRM_DESC="Convert Forms – интеграция със Zoho CRM." PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN="Токен за удостоверяване" PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC="Вашият Zoho CRM токен за удостоверяване" PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN="Къде да намерите токен за удостоверяване?" PLG_CONVERTFORMS_ZOHOCRM_MODULE="Модул" PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC="Zoho CRM модул, на който искате да изпращате вашите заявки" PLG_CONVERTFORMS_ZOHOCRM_LEADS="Интерисуващи" PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS="Регистрации" PLG_CONVERTFORMS_ZOHOCRM_CONTACTS="Контакти" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER="Актуализирайте съществуващия потребител" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC="Активирайте за запазване на записите в режим на одобрение." PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW="Активирай работен поток" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC="Активирайте тази опция за задействане на правилото за работния процес, докато вмъквате записи в CRM акаунт." PLG_CONVERTFORMS_ZOHOCRM_APPROVAL="Режим на одобрение" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC="Когато тази опция е активирана, записите не се добавят директно към модулите Zoho. Записите трябва първо да бъдат одобрени." PLG_CONVERTFORMS_ZOHOCRM_DATACENTER="Център за данни" PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC="Изберете къде се хоства вашият Zoho CRM." PK@A#]粽���Fconvertforms/zohocrm/language/es-ES/es-ES.plg_convertforms_zohocrm.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM_ALIAS="CRM de Zoho" PLG_CONVERTFORMS_ZOHOCRM="\"Formularios de conversión\" - Integración Zoho CRM." PLG_CONVERTFORMS_ZOHOCRM_DESC="\"Formularios de conversión\" - Integración con Zoho CRM." PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN="Señal de autentificación" PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC="Tu señal de autentificación de CRM de Zoho" PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN="¿Dónde encontrar la señal de autentificación?" PLG_CONVERTFORMS_ZOHOCRM_MODULE="Módulo" PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC="El módulo Zoho CRM al que le gustaría enviar sus envíos" PLG_CONVERTFORMS_ZOHOCRM_LEADS="Leads" PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS="Cuentas" PLG_CONVERTFORMS_ZOHOCRM_CONTACTS="Contactos" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER="Actualiza usuario existente" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC="Habilita para retener registros en modo de aprobación." PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW="Activa flujos de trabajo." PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC="Habilita para activar la regla de flujo de trabajo mientras se ingresan registros a la cuenta CRM." PLG_CONVERTFORMS_ZOHOCRM_APPROVAL="Modo de aprobación" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC="Cuando esta opción esta habilitada, los registros no se agregan directamente a los módulos de Zoho. Necesitan estar aprobados primero." PLG_CONVERTFORMS_ZOHOCRM_DATACENTER="Centro de datos" PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC="Elija dónde está alojado su Zoho CRM." PK@A#]I�X���Fconvertforms/zohocrm/language/it-IT/it-IT.plg_convertforms_zohocrm.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM_ALIAS="Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM="Integrazione Convert Forms - Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM_DESC="Integrazione Convert Forms con Zoho CRM." PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN="Token di autenticazione" PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC="Il tuo token di autenticazione di Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN="Dove trovare il token di autenticazione?" PLG_CONVERTFORMS_ZOHOCRM_MODULE="Modulo" PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC="Il modulo di Zoho CRM a cui vorresti mandare i tuoi invii" PLG_CONVERTFORMS_ZOHOCRM_LEADS="Lead" PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS="Account" PLG_CONVERTFORMS_ZOHOCRM_CONTACTS="Contatti" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER="Aggiorna utente esistente" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC="Abilita per tenere le registrazioni in modalità approvazione" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW="Flusso di lavoro dell'attivatore" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC="Abilita per attivare la regola del flusso di lavoro mentre inserisci registrazioni nell'account del CRM." PLG_CONVERTFORMS_ZOHOCRM_APPROVAL="Modalità approvazione" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC="Quando qeusta opzione è abilitata, le registrazioni non vengono inserite direttamente nei moduli di Zoho. Devono essere approvate in precedenza." PLG_CONVERTFORMS_ZOHOCRM_DATACENTER="Datacenter" PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC="Scegli dove è situato l'host di Zoho CRM." PK@A#]��FFFconvertforms/zohocrm/language/fi-FI/fi-FI.plg_convertforms_zohocrm.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM_ALIAS="Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM="Convert Forms - Zoho CRM liitäntä" PLG_CONVERTFORMS_ZOHOCRM_DESC="Convert Forms - Integrointi Zoho CRM." PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN="Todennustunnus" PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC="Sinun Zoho CRM todennustunnus" PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN="Mistä löytyy todennustunnus?" PLG_CONVERTFORMS_ZOHOCRM_MODULE="Moduuli" PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC="Zoho CRM -moduuli, johon haluat lähettää lähetyksesi" PLG_CONVERTFORMS_ZOHOCRM_LEADS="Leads" PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS="Tilit" PLG_CONVERTFORMS_ZOHOCRM_CONTACTS="Yhteystiedot" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER="Päivitä nykyinen käyttäjä" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC="Mahdollistaa tietueiden pitämisen hyväksyntätilassa." PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW="Käynnistä työnkulku" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC="Mahdollistaa työnkulkusäännön käynnistämisen lisäämällä tietueita CRM-tiliin." PLG_CONVERTFORMS_ZOHOCRM_APPROVAL="Hyväksyntätila" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC="Kun tämä vaihtoehto on käytössä, tietueita ei lisätä suoraan Zoho-moduuleihin. Ne on ensin hyväksyttävä." PLG_CONVERTFORMS_ZOHOCRM_DATACENTER="Datakeskus" PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC="Valitse missä Zoho CRM toimii." PK@A#]E�����Fconvertforms/zohocrm/language/de-DE/de-DE.plg_convertforms_zohocrm.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM_ALIAS="Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM="Convert Forms - Zoho CRM Integration" PLG_CONVERTFORMS_ZOHOCRM_DESC="Convert Forms - Integration mit Zoho CRM." PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN="Authentifizierungs-Token" PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC="Ihr Zoho CRM Authentifizierungs-Token" PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN="Wo findet man den Authentifizierungs-Token?" PLG_CONVERTFORMS_ZOHOCRM_MODULE="Modul" PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC="Das Zoho CRM-Modul, an das Sie Ihre Eingaben senden möchten" PLG_CONVERTFORMS_ZOHOCRM_LEADS="Leads" PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS="Konten" PLG_CONVERTFORMS_ZOHOCRM_CONTACTS="Kontakte" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER="Bestehenden Benutzer aktualisieren" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC="Aktivieren Sie diese Option, um die Datensätze im Genehmigungsmodus zu halten." PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW="Arbeitsablauf auslösen" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC="Aktivieren Sie diese Option, um die Arbeitsablauf-Regel beim Einfügen von Datensätzen in das CRM-Konto auszulösen." PLG_CONVERTFORMS_ZOHOCRM_APPROVAL="Genehmigungsmodus" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC="Wenn diese Option aktiviert ist, werden die Datensätze nicht direkt zu den Zoho-Modulen hinzugefügt. Sie müssen zuerst genehmigt werden." PLG_CONVERTFORMS_ZOHOCRM_DATACENTER="Rechenzentrum" PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC="Wählen Sie, wo Ihr Zoho CRM gehostet wird." PK@A#]/�Z_��Fconvertforms/zohocrm/language/el-GR/el-GR.plg_convertforms_zohocrm.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM_ALIAS="Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM="Convert Forms - Ενσωμάτωση Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM_DESC="Convert Forms - Ενσωμάτωση με Zoho CRM." PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN="Διακριτικό ελέγχου ταυτότητας" PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC="Διακριτικό ελέγχου ταυτότητας για το Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN="Που θα βρω το Διακριτικό ελέγχου ταυτότητας?" PLG_CONVERTFORMS_ZOHOCRM_MODULE="Ενθεμα" PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC="Το ένθεμα Zoho CRM στο οποίο θέλετε να στέλνετε τις εγγραφές σας." PLG_CONVERTFORMS_ZOHOCRM_LEADS="Οδηγία" PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS="Λογαριασμοί" PLG_CONVERTFORMS_ZOHOCRM_CONTACTS="Επαφές" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER="Ενημέρωση υπάρχοντος χρήστη" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC="Ενεργόποιήστε για να παραμένουν οι εγγραφές σε λειτουργία έγκρισης" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW="Ενεργοποίηση ροής εργασιών" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC="Ενεργοποιήστε το για τον κανόνα Ενεργοποίησης ροής εργασιών όταν προστίθενται εγγραφές στο λογαριασμό σας CRM" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL="Λειτουργία έγκρισης" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC="Οταν είναι ενεργοποιημένο, οι καταχωρήσεις δεν προστίθενται απ'ευθείας στα ενθέματα Zoho. Πρέπει πρώτα να εγκριθούν." PLG_CONVERTFORMS_ZOHOCRM_DATACENTER="Datacenter" PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC="Επιλέξτε το που φιλοξενείται το Zoho CRM" PK@A#]8aE���Fconvertforms/zohocrm/language/fr-FR/fr-FR.plg_convertforms_zohocrm.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM_ALIAS="CRM Zoho" PLG_CONVERTFORMS_ZOHOCRM="Convertisseur de formulaire - Intégration du CRM Zoho" PLG_CONVERTFORMS_ZOHOCRM_DESC="Convertisseur de formulaires - Intégration avec le CRM Zoho." PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN="Token d'authentification" PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC="Votre token d'authentification du CRM Zoho" PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN="Où trouver le token d'authentification ?" PLG_CONVERTFORMS_ZOHOCRM_MODULE="Module" PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC="Le module CRM Zoho auquel vous voulez envoyer les soumissions" PLG_CONVERTFORMS_ZOHOCRM_LEADS="Leads" PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS="Comptes" PLG_CONVERTFORMS_ZOHOCRM_CONTACTS="Contacts" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER="Mettre à jour un utilisateur existant" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC="Activez pour conserver les enregistrements dans le mode de validation." PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW="Déclencher le flux de travail" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC="Activez pour déclencher la règle de flux de travail lors de l'enregistrement dans le compte CRM." PLG_CONVERTFORMS_ZOHOCRM_APPROVAL="Mode de validation" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC="Lorsque cette option est activée, les enregistrements ne sont pas ajoutés directement aux modules Zoho. Ils doivent d'abord être approuvés." PLG_CONVERTFORMS_ZOHOCRM_DATACENTER="Datacenter" PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC="Choisissez où votre CRM Zoho est hébergé" PK@A#]w^�:��Fconvertforms/zohocrm/language/uk-UA/uk-UA.plg_convertforms_zohocrm.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM_ALIAS="Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM="Перетворити форми - інтеграція Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM_DESC="Перетворити форми - інтеграція з Zoho CRM." PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN="Перевірка автентичності фішку" PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC="Ваш маркер аутентифікації Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN="Де я можу знайти маркер аутентифікації?" PLG_CONVERTFORMS_ZOHOCRM_MODULE="Модуль" PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC="Модуль Zoho CRM, на який потрібно відправляти свої повідомлення" PLG_CONVERTFORMS_ZOHOCRM_LEADS="Потенційні клієнти" PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS="Облікові записи" PLG_CONVERTFORMS_ZOHOCRM_CONTACTS="Контакти" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER="Оновити існуючого користувача" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC="Для збереження записів у режимі затвердження." PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW="Тригер робочого процесу" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC="Активуйте цю опцію, щоб запустити правило робочого процесу під час вставки записів у CRM-акаунт." PLG_CONVERTFORMS_ZOHOCRM_APPROVAL="Про затвердження режиму" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC="Якщо цей параметр активований, записи не додаються безпосередньо до модулів Zoho. Вони повинні бути затверджені спочатку." PLG_CONVERTFORMS_ZOHOCRM_DATACENTER="Датацентр" PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC="Виберіть, де розміщується ваш Zoho CRM." PK@A#]�*�##Fconvertforms/zohocrm/language/et-EE/et-EE.plg_convertforms_zohocrm.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM_ALIAS="Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM="Convert Forms - Zoho CRM integreerimine" PLG_CONVERTFORMS_ZOHOCRM_DESC="Convert Forms - Integreerimine Zoho CRM'ga." PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN="Autentimisvõti" PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC="Sinu Zoho CRM autentimisvõti" PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN="Kuidas leida autentimisvõtit?" PLG_CONVERTFORMS_ZOHOCRM_MODULE="Moodul" PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC="Zoho moodul kuhu kasutaja sisestused saadetakse" PLG_CONVERTFORMS_ZOHOCRM_LEADS="meeskonnad" PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS="Kontod" PLG_CONVERTFORMS_ZOHOCRM_CONTACTS="Kontaktid" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER="Uuenda olemasolevat kasutajat" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC="Luba kirjed jätta kinnitatud staatusesse." PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW="Töövoo käivitaja" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC="Luba töövoo käivituse reegel saatmaks kirjeid CRM kontole." PLG_CONVERTFORMS_ZOHOCRM_APPROVAL="Kinnituse staatus" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC="Kui see seade on lubatud, siis kirjed lisatakse otse Zoho moodulisse. Kirjed tuleb eelnevalt kinnitada." PLG_CONVERTFORMS_ZOHOCRM_DATACENTER="Andmekeskus" PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC="Vali, kus sinu Zoho CRM teenusepakkuja asub." PK@A#]�Ě]]Jconvertforms/zohocrm/language/en-GB/en-GB.plg_convertforms_zohocrm.sys.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM="Convert Forms - Zoho CRM Integration" PLG_CONVERTFORMS_ZOHOCRM_DESC="Convert Forms - Integration with Zoho CRM."PK@A#]l�i77Fconvertforms/zohocrm/language/en-GB/en-GB.plg_convertforms_zohocrm.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM_ALIAS="Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM="Convert Forms - Zoho CRM Integration" PLG_CONVERTFORMS_ZOHOCRM_DESC="Convert Forms - Integration with Zoho CRM." PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN="Authentication Token" PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC="Your Zoho CRM Authentication Token" PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN="Where to find Authentication Token?" PLG_CONVERTFORMS_ZOHOCRM_MODULE="Module" PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC="The Zoho CRM module you'd like to send your submissions to" PLG_CONVERTFORMS_ZOHOCRM_LEADS="Leads" PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS="Accounts" PLG_CONVERTFORMS_ZOHOCRM_CONTACTS="Contacts" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER="Update existing user" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC="Enable to keep the records in approval mode." PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW="Trigger workflow" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC="Enable to trigger the workflow rule while inserting records into CRM account." PLG_CONVERTFORMS_ZOHOCRM_APPROVAL="Approval Mode" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC="When this option is enabled, records are not added directly to the Zoho modules. They need to be approved first." PLG_CONVERTFORMS_ZOHOCRM_DATACENTER="Datacenter" PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC="Choose where your Zoho CRM is hosted."PK@A#]��ae��Fconvertforms/zohocrm/language/sk-SK/sk-SK.plg_convertforms_zohocrm.ininu�[���; @package Convert Forms ; @version 3.2.11 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2017 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_CONVERTFORMS_ZOHOCRM_ALIAS="Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM="Konvertovať formuláre – integrácia Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM_DESC="Konvertovať formuláre – integrácia so Zoho CRM." PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN="Autentifikačný token" PLG_CONVERTFORMS_ZOHOCRM_AUTHENTICATIONTOKEN_DESC="Váš autentifikačný token Zoho CRM" PLG_CONVERTFORMS_ZOHOCRM_FIND_AUTHENTICATIONTOKEN="Kde nájsť autentifikačný token?" PLG_CONVERTFORMS_ZOHOCRM_MODULE="modul" PLG_CONVERTFORMS_ZOHOCRM_MODULE_DESC="Modul Zoho CRM, do ktorého chcete posielať svoje príspevky" PLG_CONVERTFORMS_ZOHOCRM_LEADS="Vedie" PLG_CONVERTFORMS_ZOHOCRM_ACCOUNTS="účty" PLG_CONVERTFORMS_ZOHOCRM_CONTACTS="Kontakty" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER="Aktualizovať existujúceho používateľa" PLG_CONVERTFORMS_ZOHOCRM_UPDATE_EXISTING_USER_DESC="Povoliť uchovávanie záznamov v režime schvaľovania." PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW="Spustite pracovný postup" PLG_CONVERTFORMS_ZOHOCRM_TRIGGER_WORKFLOW_DESC="Povoliť spustenie pravidla pracovného toku pri vkladaní záznamov do účtu CRM." PLG_CONVERTFORMS_ZOHOCRM_APPROVAL="Režim schválenia" PLG_CONVERTFORMS_ZOHOCRM_APPROVAL_DESC="Keď je táto možnosť povolená, záznamy sa nepridávajú priamo do modulov Zoho. Najprv ich treba schváliť." PLG_CONVERTFORMS_ZOHOCRM_DATACENTER="Dátové centrum" PLG_CONVERTFORMS_ZOHOCRM_DATACENTER_DESC="Vyberte, kde je hosťované vaše Zoho CRM." PK@A#]I!���'convertforms/zohocrm/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgConvertFormsZohoCRMInstallerScript extends PlgConvertFormsZohoCRMInstallerScriptHelper { public $name = 'PLG_CONVERTFORMS_ZOHOCRM'; public $alias = 'zohocrm'; public $extension_type = 'plugin'; public $plugin_folder = 'convertforms'; public $show_message = false; } PK@A#]2W�F9 9 +editors-xtd/module/src/Extension/Module.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.module * * @copyright (C) 2015 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\EditorsXtd\Module\Extension; use Joomla\CMS\Language\Text; use Joomla\CMS\Object\CMSObject; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Session\Session; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Editor Module button * * @since 3.5 */ final class Module extends CMSPlugin { /** * Load the language file on instantiation. * * @var boolean * @since 3.5 */ protected $autoloadLanguage = true; /** * Display the button * * @param string $name The name of the button to add * * @return CMSObject|void The button options as CMSObject * * @since 3.5 */ public function onDisplay($name) { /* * Use the built-in element view to select the module. * Currently uses blank class. */ $user = $this->getApplication()->getIdentity(); if ( $user->authorise('core.create', 'com_modules') || $user->authorise('core.edit', 'com_modules') || $user->authorise('core.edit.own', 'com_modules') ) { $link = 'index.php?option=com_modules&view=modules&layout=modal&tmpl=component&editor=' . $name . '&' . Session::getFormToken() . '=1'; $button = new CMSObject(); $button->modal = true; $button->link = $link; $button->text = Text::_('PLG_MODULE_BUTTON_MODULE'); $button->name = $this->_type . '_' . $this->_name; $button->icon = 'cube'; $button->iconSVG = '<svg viewBox="0 0 512 512" width="24" height="24"><path d="M239.1 6.3l-208 78c-18.7 7-31.1 ' . '25-31.1 45v225.1c0 18.2 10.3 34.8 26.5 42.9l208 104c13.5 6.8 29.4 6.8 42.9 0l208-104c16.3-8.1 26.5-24.8 ' . '26.5-42.9V129.3c0-20-12.4-37.9-31.1-44.9l-208-78C262 2.2 250 2.2 239.1 6.3zM256 68.4l192 72v1.1l-192 ' . '78-192-78v-1.1l192-72zm32 356V275.5l160-65v133.9l-160 80z"></path></svg>'; $button->options = [ 'height' => '300px', 'width' => '800px', 'bodyHeight' => '70', 'modalWidth' => '80', ]; return $button; } } } PK@A#]6�//(editors-xtd/module/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.article * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\EditorsXtd\Module\Extension\Module; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Module( $dispatcher, (array) PluginHelper::getPlugin('editors-xtd', 'module') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]u�Aeeeditors-xtd/module/module.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="editors-xtd" method="upgrade"> <name>plg_editors-xtd_module</name> <author>Joomla! Project</author> <creationDate>2015-10</creationDate> <copyright>(C) 2015 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.5.0</version> <description>PLG_MODULE_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\EditorsXtd\Module</namespace> <files> <folder plugin="module">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_editors-xtd_module.ini</language> <language tag="en-GB">language/en-GB/plg_editors-xtd_module.sys.ini</language> </languages> </extension> PK@A#]<w )editors-xtd/convertforms/convertforms.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4" type="plugin" group="editors-xtd" method="upgrade"> <name>PLG_EDITORS-XTD_CONVERTFORMS</name> <description>PLG_EDITORS-XTD_CONVERTFORMS_DESC</description> <creationDate>June 2017</creationDate> <copyright>Copyright © 2020 Tassos Marinos All Rights Reserved</copyright> <license>http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL</license> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <version>1.0</version> <scriptfile>script.install.php</scriptfile> <files> <filename plugin="convertforms">convertforms.php</filename> <filename>script.install.helper.php</filename> <filename>form.xml</filename> <folder>language</folder> </files> </extension> PK@A#]��T!,,)editors-xtd/convertforms/convertforms.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class PlgButtonConvertforms extends JPlugin { /** * Load the language file on instantiation. * * @var boolean */ protected $autoloadLanguage = true; /** * Application Object * * @var object */ protected $app; /** * ConvertForms Button * * @param string $name The name of the button to add * * @return JObject The button object */ public function onDisplay($name) { $component = $this->app->input->getCmd('option'); $basePath = $this->app->isClient('administrator') ? '' : 'administrator/'; $link = $basePath . 'index.php?option=com_convertforms&view=editorbutton&layout=button&tmpl=component&e_name=' . $name . '&e_comp='. $component; $button = new JObject; $button->modal = true; $button->class = 'btn cf'; $button->link = $link; $button->text = JText::_('PLG_EDITORS-XTD_CONVERTFORMS_BUTTON_TEXT'); $button->name = 'vcard'; if (defined('nrJ4')) { $button->options = [ 'height' => '200px', 'bodyHeight' => '180px', 'modalWidth' => '250px', ]; } else { $button->options = "{handler: 'iframe', size: {x: 350, y: 220}}"; } return $button; } }PK@A#]�#o,,2editors-xtd/convertforms/language/en-GB/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#]��P��Reditors-xtd/convertforms/language/en-GB/en-GB.plg_editors-xtd_convertforms.sys.ininu�[���CONVERTFORMS="Convert Forms" PLG_EDITORS-XTD_CONVERTFORMS="Editor Button - Convert Forms" PLG_EDITORS-XTD_CONVERTFORMS_DESC="Editor Button - Convert Forms Button Creator"PK@A#]��n��Neditors-xtd/convertforms/language/en-GB/en-GB.plg_editors-xtd_convertforms.ininu�[���CONVERTFORMS="Convert Forms" PLG_EDITORS-XTD_CONVERTFORMS="Editor Button - Convert Forms" PLG_EDITORS-XTD_CONVERTFORMS_DESC="Convert Forms Button Creator" PLG_EDITORS-XTD_CONVERTFORMS_BUTTON_TEXT="Convert Forms" PLG_EDITORS-XTD_CONVERTFORMS_SELECT_FORM="Select form" PLG_EDITORS-XTD_CONVERTFORMS_SELECT_FORM_DESC="Select the form you'd like to insert" PLG_EDITORS-XTD_CONVERTFORMS_INSERTBUTTON="Insert shortcode"PK@A#]��@ŗ�!editors-xtd/convertforms/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="main" addfieldpath="administrator/components/com_convertforms/models/forms/fields"> <field name="convertformid" type="convertforms" label="PLG_EDITORS-XTD_CONVERTFORMS_SELECT_FORM" description="PLG_EDITORS-XTD_CONVERTFORMS_SELECT_FORM_DESC" class="span12"> </field> </fieldset> </form>PK@A#]&i��+editors-xtd/convertforms/script.install.phpnu�[���<?php /** * @package Convert Forms * @version 3.2.11 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgEditorsXtdConvertformsInstallerScript extends PlgEditorsXtdConvertformsInstallerScriptHelper { public $name = 'CONVERTFORMS'; public $alias = 'convertforms'; public $extension_type = 'plugin'; public $plugin_folder = 'editors-xtd'; public $show_message = false; } PK@A#]��?^�9�92editors-xtd/convertforms/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgEditorsxtdConvertformsInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK@A#][W�qq!editors-xtd/readmore/readmore.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="editors-xtd" method="upgrade"> <name>plg_editors-xtd_readmore</name> <author>Joomla! Project</author> <creationDate>2006-03</creationDate> <copyright>(C) 2006 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_READMORE_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\EditorsXtd\ReadMore</namespace> <files> <folder plugin="readmore">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_editors-xtd_readmore.ini</language> <language tag="en-GB">language/en-GB/plg_editors-xtd_readmore.sys.ini</language> </languages> </extension> PK@A#]x�y�77*editors-xtd/readmore/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.article * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\EditorsXtd\ReadMore\Extension\ReadMore; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new ReadMore( $dispatcher, (array) PluginHelper::getPlugin('editors-xtd', 'readmore') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]����/editors-xtd/readmore/src/Extension/ReadMore.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.readmore * * @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\EditorsXtd\ReadMore\Extension; use Joomla\CMS\Language\Text; use Joomla\CMS\Object\CMSObject; use Joomla\CMS\Plugin\CMSPlugin; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Editor Readmore button * * @since 1.5 */ final class ReadMore extends CMSPlugin { /** * Load the language file on instantiation. * * @var boolean * @since 3.1 */ protected $autoloadLanguage = true; /** * Readmore button * * @param string $name The name of the button to add * * @return CMSObject $button A two element array of (imageName, textToInsert) * * @since 1.5 */ public function onDisplay($name) { $doc = $this->getApplication()->getDocument(); $doc->getWebAssetManager() ->registerAndUseScript('com_content.admin-article-readmore', 'com_content/admin-article-readmore.min.js', [], ['defer' => true], ['core']); // Pass some data to javascript $doc->addScriptOptions( 'xtd-readmore', [ 'exists' => Text::_('PLG_READMORE_ALREADY_EXISTS', true), ] ); $button = new CMSObject(); $button->modal = false; $button->onclick = 'insertReadmore(\'' . $name . '\');return false;'; $button->text = Text::_('PLG_READMORE_BUTTON_READMORE'); $button->name = $this->_type . '_' . $this->_name; $button->icon = 'arrow-down'; $button->iconSVG = '<svg viewBox="0 0 32 32" width="24" height="24"><path d="M32 12l-6-6-10 10-10-10-6 6 16 16z"></path></svg>'; $button->link = '#'; return $button; } } PK@A#]����)editors-xtd/image/src/Extension/Image.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.image * * @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\EditorsXtd\Image\Extension; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Object\CMSObject; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Uri\Uri; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Editor Image button * * @since 1.5 */ final class Image extends CMSPlugin { /** * Load the language file on instantiation. * * @var boolean * @since 3.1 */ protected $autoloadLanguage = true; /** * Display the button. * * @param string $name The name of the button to display. * @param string $asset The name of the asset being edited. * @param integer $author The id of the author owning the asset being edited. * * @return CMSObject|false * * @since 1.5 */ public function onDisplay($name, $asset, $author) { $doc = $this->getApplication()->getDocument(); $user = $this->getApplication()->getIdentity(); $extension = $this->getApplication()->getInput()->get('option'); // For categories we check the extension (ex: component.section) if ($extension === 'com_categories') { $parts = explode('.', $this->getApplication()->getInput()->get('extension', 'com_content')); $extension = $parts[0]; } $asset = $asset !== '' ? $asset : $extension; if ( $user->authorise('core.edit', $asset) || $user->authorise('core.create', $asset) || (count($user->getAuthorisedCategories($asset, 'core.create')) > 0) || ($user->authorise('core.edit.own', $asset) && $author === $user->id) || (count($user->getAuthorisedCategories($extension, 'core.edit')) > 0) || (count($user->getAuthorisedCategories($extension, 'core.edit.own')) > 0 && $author === $user->id) ) { $doc->getWebAssetManager() ->useScript('webcomponent.media-select') ->useScript('webcomponent.field-media') ->useStyle('webcomponent.media-select'); $doc->addScriptOptions('xtdImageModal', [$name . '_ImageModal']); $doc->addScriptOptions('media-picker-api', ['apiBaseUrl' => Uri::base() . 'index.php?option=com_media&format=json']); if (count($doc->getScriptOptions('media-picker')) === 0) { $imagesExt = array_map( 'trim', explode( ',', ComponentHelper::getParams('com_media')->get( 'image_extensions', 'bmp,gif,jpg,jpeg,png,webp' ) ) ); $audiosExt = array_map( 'trim', explode( ',', ComponentHelper::getParams('com_media')->get( 'audio_extensions', 'mp3,m4a,mp4a,ogg' ) ) ); $videosExt = array_map( 'trim', explode( ',', ComponentHelper::getParams('com_media')->get( 'video_extensions', 'mp4,mp4v,mpeg,mov,webm' ) ) ); $documentsExt = array_map( 'trim', explode( ',', ComponentHelper::getParams('com_media')->get( 'doc_extensions', 'doc,odg,odp,ods,odt,pdf,ppt,txt,xcf,xls,csv' ) ) ); $doc->addScriptOptions('media-picker', [ 'images' => $imagesExt, 'audios' => $audiosExt, 'videos' => $videosExt, 'documents' => $documentsExt, ]); } Text::script('JFIELD_MEDIA_LAZY_LABEL'); Text::script('JFIELD_MEDIA_ALT_LABEL'); Text::script('JFIELD_MEDIA_ALT_CHECK_LABEL'); Text::script('JFIELD_MEDIA_ALT_CHECK_DESC_LABEL'); Text::script('JFIELD_MEDIA_CLASS_LABEL'); Text::script('JFIELD_MEDIA_FIGURE_CLASS_LABEL'); Text::script('JFIELD_MEDIA_FIGURE_CAPTION_LABEL'); Text::script('JFIELD_MEDIA_LAZY_LABEL'); Text::script('JFIELD_MEDIA_SUMMARY_LABEL'); Text::script('JFIELD_MEDIA_EMBED_CHECK_DESC_LABEL'); Text::script('JFIELD_MEDIA_DOWNLOAD_CHECK_DESC_LABEL'); Text::script('JFIELD_MEDIA_DOWNLOAD_CHECK_LABEL'); Text::script('JFIELD_MEDIA_EMBED_CHECK_LABEL'); Text::script('JFIELD_MEDIA_WIDTH_LABEL'); Text::script('JFIELD_MEDIA_TITLE_LABEL'); Text::script('JFIELD_MEDIA_HEIGHT_LABEL'); Text::script('JFIELD_MEDIA_UNSUPPORTED'); Text::script('JFIELD_MEDIA_DOWNLOAD_FILE'); $link = 'index.php?option=com_media&view=media&tmpl=component&e_name=' . $name . '&asset=' . $asset . '&mediatypes=0,1,2,3' . '&author=' . $author; $button = new CMSObject(); $button->modal = true; $button->link = $link; $button->text = Text::_('PLG_IMAGE_BUTTON_IMAGE'); $button->name = $this->_type . '_' . $this->_name; $button->icon = 'pictures'; $button->iconSVG = '<svg width="24" height="24" viewBox="0 0 512 512"><path d="M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48' . ' 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 336H54a6 6 0 0 1-6-6V118a6 6 0 0 1 6-6h404a6 6' . ' 0 0 1 6 6v276a6 6 0 0 1-6 6zM128 152c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40' . 'zM96 352h320v-80l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L192 304l-39.515-39.515c-4.686-4.686-12.284-4' . '.686-16.971 0L96 304v48z"></path></svg>'; $button->options = [ 'height' => '400px', 'width' => '800px', 'bodyHeight' => '70', 'modalWidth' => '80', 'tinyPath' => $link, 'confirmCallback' => 'Joomla.getImage(Joomla.selectedMediaFile, \'' . $name . '\', this)', 'confirmText' => Text::_('PLG_IMAGE_BUTTON_INSERT'), ]; return $button; } return false; } } PK@A#]`��<))'editors-xtd/image/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.image * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\EditorsXtd\Image\Extension\Image; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Image( $dispatcher, (array) PluginHelper::getPlugin('editors-xtd', 'image') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]A�__editors-xtd/image/image.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="editors-xtd" method="upgrade"> <name>plg_editors-xtd_image</name> <author>Joomla! Project</author> <creationDate>2004-08</creationDate> <copyright>(C) 2005 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_IMAGE_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\EditorsXtd\Image</namespace> <files> <folder plugin="image">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_editors-xtd_image.ini</language> <language tag="en-GB">language/en-GB/plg_editors-xtd_image.sys.ini</language> </languages> </extension> PK@A#]\���+editors-xtd/fields/src/Extension/Fields.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.fields * * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\EditorsXtd\Fields\Extension; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Object\CMSObject; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Session\Session; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Editor Fields button * * @since 3.7.0 */ final class Fields extends CMSPlugin { /** * Load the language file on instantiation. * * @var boolean * @since 3.7.0 */ protected $autoloadLanguage = true; /** * Display the button * * @param string $name The name of the button to add * * @return CMSObject|void The button options as CMSObject * * @since 3.7.0 */ public function onDisplay($name) { // Check if com_fields is enabled if (!ComponentHelper::isEnabled('com_fields')) { return; } // Guess the field context based on view. $jinput = $this->getApplication()->getInput(); $context = $jinput->get('option') . '.' . $jinput->get('view'); // Special context for com_categories if ($context === 'com_categories.category') { $context = $jinput->get('extension', 'com_content') . '.categories'; } $link = 'index.php?option=com_fields&view=fields&layout=modal&tmpl=component&context=' . $context . '&editor=' . $name . '&' . Session::getFormToken() . '=1'; $button = new CMSObject(); $button->modal = true; $button->link = $link; $button->text = Text::_('PLG_EDITORS-XTD_FIELDS_BUTTON_FIELD'); $button->name = $this->_type . '_' . $this->_name; $button->icon = 'puzzle'; $button->iconSVG = '<svg viewBox="0 0 576 512" width="24" height="24"><path d="M519.442 288.651c-41.519 0-59.5 31.593-82.058 31.593C377.' . '409 320.244 432 144 432 144s-196.288 80-196.288-3.297c0-35.827 36.288-46.25 36.288-85.985C272 19.216 243.885 0 210.' . '539 0c-34.654 0-66.366 18.891-66.366 56.346 0 41.364 31.711 59.277 31.711 81.75C175.885 207.719 0 166.758 0 166.758' . 'v333.237s178.635 41.047 178.635-28.662c0-22.473-40-40.107-40-81.471 0-37.456 29.25-56.346 63.577-56.346 33.673 0 61' . '.788 19.216 61.788 54.717 0 39.735-36.288 50.158-36.288 85.985 0 60.803 129.675 25.73 181.23 25.73 0 0-34.725-120.1' . '01 25.827-120.101 35.962 0 46.423 36.152 86.308 36.152C556.712 416 576 387.99 576 354.443c0-34.199-18.962-65.792-56' . '.558-65.792z"></path></svg>'; $button->options = [ 'height' => '300px', 'width' => '800px', 'bodyHeight' => '70', 'modalWidth' => '80', ]; return $button; } } PK@A#]֠n�..(editors-xtd/fields/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.fields * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\EditorsXtd\Fields\Extension\Fields; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Fields( $dispatcher, (array) PluginHelper::getPlugin('editors-xtd', 'fields') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]U�|qqeditors-xtd/fields/fields.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="editors-xtd" method="upgrade"> <name>plg_editors-xtd_fields</name> <author>Joomla! Project</author> <creationDate>2017-02</creationDate> <copyright>(C) 2017 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.7.0</version> <description>PLG_EDITORS-XTD_FIELDS_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\EditorsXtd\Fields</namespace> <files> <folder plugin="fields">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_editors-xtd_fields.ini</language> <language tag="en-GB">language/en-GB/plg_editors-xtd_fields.sys.ini</language> </languages> </extension> PK@A#]P���editors-xtd/engagebox/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="main" addfieldpath="administrator/components/com_rstbox/models/forms/fields"> <field name="boxid" type="boxes" label="PLG_EDITORS-XTD_ENGAGEBOX_SELECT_BOX" description="PLG_EDITORS-XTD_ENGAGEBOX_SELECT_BOX_DESC" class="span12"> <option value="0">PLG_EDITORS-XTD_ENGAGEBOX_USESAMEBOX</option> </field> <field name="type" type="list" label="Button Type" default="button" class="span12"> <option value="button">Button</option> <option value="a">Link</option> <option value="div">Div</option> </field> <field name="href" type="url" label="PLG_EDITORS-XTD_ENGAGEBOX_HREF" description="PLG_EDITORS-XTD_ENGAGEBOX_HREF_DESC" hint="http://" showon="type:a" class="span12" /> <field name="label" type="text" required="true" label="PLG_EDITORS-XTD_ENGAGEBOX_LABEL" description="PLG_EDITORS-XTD_ENGAGEBOX_LABEL_DESC" default="Close" class="span12" /> <field name="cmd" type="list" label="PLG_EDITORS-XTD_ENGAGEBOX_ACTION" description="PLG_EDITORS-XTD_ENGAGEBOX_ACTION_DESC" class="span12" default="close"> <option value="open">PLG_EDITORS-XTD_ENGAGEBOX_OPEN</option> <option value="close">PLG_EDITORS-XTD_ENGAGEBOX_CLOSE</option> <option value="toggle">PLG_EDITORS-XTD_ENGAGEBOX_TOGGLE</option> </field> </fieldset> </form>PK@A#]���D#editors-xtd/engagebox/engagebox.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4" type="plugin" group="editors-xtd" method="upgrade"> <name>PLG_EDITORS-XTD_ENGAGEBOX</name> <description>PLG_EDITORS-XTD_ENGAGEBOX_DESC</description> <creationDate>November 2016</creationDate> <copyright>Copyright © 2019 Tassos Marinos All Rights Reserved</copyright> <license>http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL</license> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <version>1.0</version> <scriptfile>script.install.php</scriptfile> <files> <filename plugin="engagebox">engagebox.php</filename> <filename>script.install.helper.php</filename> <filename>form.xml</filename> <folder>language</folder> </files> </extension> PK@A#]^��T��#editors-xtd/engagebox/engagebox.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2021 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class PlgButtonEngagebox extends JPlugin { /** * Load the language file on instantiation. * * @var boolean */ protected $autoloadLanguage = true; /** * Application Object * * @var object */ protected $app; /** * EngageBox Button * * @param string $name The name of the button to add * * @return JObject The button object */ public function onDisplay($name) { JFactory::getDocument()->addStyleDeclaration(' .ebox .icon-checkbox-partial, .mce-ico.icon-checkbox-partial { color: #2a78cb; } '); $component = $this->app->input->getCmd('option'); $basePath = $this->app->isClient('administrator') ? '' : 'administrator/'; $link = $basePath . 'index.php?option=com_rstbox&view=rstbox&layout=button&tmpl=component&e_name=' . $name . '&e_comp='. $component; $button = new JObject; $button->modal = true; $button->class = 'btn ebox'; $button->link = $link; $button->text = JText::_('PLG_EDITORS-XTD_ENGAGEBOX_BUTTON_TEXT'); $button->name = 'checkbox-partial'; if (defined('nrJ4')) { $button->options = [ 'height' => '450px', 'bodyHeight' => '450px', 'modalWidth' => '230px', ]; } else { $button->options = "{handler: 'iframe', size: {x: 350, y: 400}}"; } return $button; } }PK@A#]�#o,,/editors-xtd/engagebox/language/en-GB/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#]T9�__Heditors-xtd/engagebox/language/en-GB/en-GB.plg_editors-xtd_engagebox.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr/joomla-extensions ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr ENGAGEBOX="EngageBox" PLG_EDITORS-XTD_ENGAGEBOX="Editor Button - EngageBox" PLG_EDITORS-XTD_ENGAGEBOX_DESC="EngageBox Button Creator" PLG_EDITORS-XTD_ENGAGEBOX_BUTTON_TEXT="EngageBox" PLG_EDITORS-XTD_ENGAGEBOX_SELECT_BOX="Choose Box" PLG_EDITORS-XTD_ENGAGEBOX_SELECT_BOX_DESC="Choose the box you'd like to handle" PLG_EDITORS-XTD_ENGAGEBOX_INSERTBUTTON="Insert the button" PLG_EDITORS-XTD_ENGAGEBOX_OPEN="Open" PLG_EDITORS-XTD_ENGAGEBOX_CLOSE="Close" PLG_EDITORS-XTD_ENGAGEBOX_TOGGLE="Toggle" PLG_EDITORS-XTD_ENGAGEBOX_USESAMEBOX="Use the box being edited now" PLG_EDITORS-XTD_ENGAGEBOX_HREF="Link URL" PLG_EDITORS-XTD_ENGAGEBOX_HREF_DESC="Enter the URL for your button" PLG_EDITORS-XTD_ENGAGEBOX_LABEL="Label" PLG_EDITORS-XTD_ENGAGEBOX_LABEL_DESC="Enter the text for your button" PLG_EDITORS-XTD_ENGAGEBOX_ACTION="Action" PLG_EDITORS-XTD_ENGAGEBOX_ACTION_DESC="Choose the action of your button"PK@A#]��uuLeditors-xtd/engagebox/language/en-GB/en-GB.plg_editors-xtd_engagebox.sys.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr/joomla-extensions ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr ENGAGEBOX="EngageBox" PLG_EDITORS-XTD_ENGAGEBOX="Editor Button - EngageBox" PLG_EDITORS-XTD_ENGAGEBOX_DESC="Editor Button - EngageBox Button Creator"PK@A#]�����(editors-xtd/engagebox/script.install.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgEditorsXtdEngageBoxInstallerScript extends PlgEditorsXtdEngageBoxInstallerScriptHelper { public $name = 'ENGAGEBOX'; public $alias = 'engagebox'; public $extension_type = 'plugin'; public $plugin_folder = 'editors-xtd'; public $show_message = false; } PK@A#]G.p~9~9/editors-xtd/engagebox/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgEditorsxtdEngageboxInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PK@A#]#ӗ�33)editors-xtd/article/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.article * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\EditorsXtd\Article\Extension\Article; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Article( $dispatcher, (array) PluginHelper::getPlugin('editors-xtd', 'article') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]���kkeditors-xtd/article/article.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="editors-xtd" method="upgrade"> <name>plg_editors-xtd_article</name> <author>Joomla! Project</author> <creationDate>2009-10</creationDate> <copyright>(C) 2009 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_ARTICLE_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\EditorsXtd\Article</namespace> <files> <folder plugin="article">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_editors-xtd_article.ini</language> <language tag="en-GB">language/en-GB/plg_editors-xtd_article.sys.ini</language> </languages> </extension> PK@A#]8�dƂ � -editors-xtd/article/src/Extension/Article.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.article * * @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\EditorsXtd\Article\Extension; use Joomla\CMS\Language\Text; use Joomla\CMS\Object\CMSObject; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Session\Session; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Editor Article button * * @since 1.5 */ final class Article extends CMSPlugin { /** * Load the language file on instantiation. * * @var boolean * @since 3.1 */ protected $autoloadLanguage = true; /** * Display the button * * @param string $name The name of the button to add * * @return CMSObject|void The button options as CMSObject, void if ACL check fails. * * @since 1.5 */ public function onDisplay($name) { $user = $this->getApplication()->getIdentity(); // Can create in any category (component permission) or at least in one category $canCreateRecords = $user->authorise('core.create', 'com_content') || count($user->getAuthorisedCategories('com_content', 'core.create')) > 0; // Instead of checking edit on all records, we can use **same** check as the form editing view $values = (array) $this->getApplication()->getUserState('com_content.edit.article.id'); $isEditingRecords = count($values); // This ACL check is probably a double-check (form view already performed checks) $hasAccess = $canCreateRecords || $isEditingRecords; if (!$hasAccess) { return; } $link = 'index.php?option=com_content&view=articles&layout=modal&tmpl=component&' . Session::getFormToken() . '=1&editor=' . $name; $button = new CMSObject(); $button->modal = true; $button->link = $link; $button->text = Text::_('PLG_ARTICLE_BUTTON_ARTICLE'); $button->name = $this->_type . '_' . $this->_name; $button->icon = 'file-add'; $button->iconSVG = '<svg viewBox="0 0 32 32" width="24" height="24"><path d="M28 24v-4h-4v4h-4v4h4v4h4v-4h4v-4zM2 2h18v6h6v10h2v-10l-8-' . '8h-20v32h18v-2h-16z"></path></svg>'; $button->options = [ 'height' => '300px', 'width' => '800px', 'bodyHeight' => '70', 'modalWidth' => '80', ]; return $button; } } PK@A#]!σ��1editors-xtd/pagebreak/src/Extension/PageBreak.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.pagebreak * * @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\EditorsXtd\PageBreak\Extension; use Joomla\CMS\Application\CMSWebApplicationInterface; use Joomla\CMS\Object\CMSObject; use Joomla\CMS\Plugin\CMSPlugin; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Editor Pagebreak button * * @since 1.5 */ final class PageBreak extends CMSPlugin { /** * Load the language file on instantiation. * * @var boolean * @since 3.1 */ protected $autoloadLanguage = true; /** * Display the button * * @param string $name The name of the button to add * * @return CMSObject|void The button options as CMSObject * * @since 1.5 */ public function onDisplay($name) { $app = $this->getApplication(); if (!$app instanceof CMSWebApplicationInterface) { return; } $user = $app->getIdentity(); // Can create in any category (component permission) or at least in one category $canCreateRecords = $user->authorise('core.create', 'com_content') || count($user->getAuthorisedCategories('com_content', 'core.create')) > 0; // Instead of checking edit on all records, we can use **same** check as the form editing view $values = (array) $app->getUserState('com_content.edit.article.id'); $isEditingRecords = count($values); // This ACL check is probably a double-check (form view already performed checks) $hasAccess = $canCreateRecords || $isEditingRecords; if (!$hasAccess) { return; } $app->getDocument()->addScriptOptions('xtd-pagebreak', ['editor' => $name]); $link = 'index.php?option=com_content&view=article&layout=pagebreak&tmpl=component&e_name=' . $name; $button = new CMSObject(); $button->modal = true; $button->link = $link; $button->text = $app->getLanguage()->_('PLG_EDITORSXTD_PAGEBREAK_BUTTON_PAGEBREAK'); $button->name = $this->_type . '_' . $this->_name; $button->icon = 'copy'; $button->iconSVG = '<svg viewBox="0 0 32 32" width="24" height="24"><path d="M26 8h-6v-2l-6-6h-14v24h12v8h20v-18l-6-6zM26 10.828l3.172 3' . '.172h-3.172v-3.172zM14 2.828l3.172 3.172h-3.172v-3.172zM2 2h10v6h6v14h-16v-20zM30 30h-16v-6h6v-14h4v6h6v14z"></pa' . 'th></svg>'; $button->options = [ 'height' => '200px', 'width' => '400px', 'bodyHeight' => '70', 'modalWidth' => '80', ]; return $button; } } PK@A#]$==+editors-xtd/pagebreak/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.pagebreak * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\EditorsXtd\PageBreak\Extension\PageBreak; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new PageBreak( $dispatcher, (array) PluginHelper::getPlugin('editors-xtd', 'pagebreak') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]�f.��#editors-xtd/pagebreak/pagebreak.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="editors-xtd" method="upgrade"> <name>plg_editors-xtd_pagebreak</name> <author>Joomla! Project</author> <creationDate>2004-08</creationDate> <copyright>(C) 2005 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_EDITORSXTD_PAGEBREAK_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\EditorsXtd\PageBreak</namespace> <files> <folder plugin="pagebreak">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_editors-xtd_pagebreak.ini</language> <language tag="en-GB">language/en-GB/plg_editors-xtd_pagebreak.sys.ini</language> </languages> </extension> PK@A#]b�J���#editors-xtd/bagallery/bagallery.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.0" type="plugin" group="editors-xtd" method="upgrade"> <name>BaGallery - Shortcode</name> <creationDate>18 June 2015</creationDate> <author>Balbooa</author> <copyright>Balbooa 2016</copyright> <license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license> <authorEmail>support@balbooa.com</authorEmail> <authorUrl>http://balbooa.com</authorUrl> <version>2.3.2</version> <description>Displays a button to make it possible to insert Gallery into an Article or Custom HTML module</description> <files> <filename plugin="bagallery">bagallery.php</filename> <filename>index.html</filename> </files> </extension>PK@A#]w���#editors-xtd/bagallery/bagallery.phpnu�[���<?php /** * @package BaGallery * @author Balbooa http://www.balbooa.com/ * @copyright Copyright @ Balbooa * @license http://www.gnu.org/licenses/gpl.html GNU/GPL */ defined('_JEXEC') or die; class PlgButtonBagallery extends JPlugin { public function onDisplay($name) { $js = " function SelectGallery(id) { if ('jInsertEditorText' in window) { jInsertEditorText('[gallery ID='+id+']', '".$name."'); SqueezeBox.close(); jModalClose(); } else { for (var ind in Joomla.editors.instances) { Joomla.editors.instances[ind].replaceSelection('[gallery ID='+id+']', '".$name."'); break; } if (window.jQuery) { jQuery(Joomla.currentModal).modal('hide'); } } if (window.Joomla.Modal) { window.parent.Joomla.Modal.getCurrent().close(); } }"; $doc = JFactory::getDocument(); $doc->addScriptDeclaration($js); $link = 'index.php?option=com_bagallery&view=galleries&layout=modal&tmpl=component'; $button = new JObject; $button->modal = true; $button->class = 'btn'; $button->link = $link; $button->text = 'Gallery'; $button->name = 'picture'; $button->options = "{handler: 'iframe', size: {x: 740, y: 545}}"; $button->icon = 'picture'; $button->iconSVG = '<svg width="24" height="24" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M14.5 3h-13a.5.5 0 0 0-.5.5v9c0 .013 0 .027.002.04V12l2.646-2.354a.5.5 0 0 1 .63-.062l2.66 1.773 3.71-3.71a.5.5 0 0 1 .577-.094L15 9.499V3.5a.5.5 0 0 0-.5-.5zm-13-1A1.5 1.5 0 0 0 0 3.5v9A1.5 1.5 0 0 0 1.5 14h13a1.5 1.5 0 0 0 1.5-1.5v-9A1.5 1.5 0 0 0 14.5 2h-13zm4.502 3.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"></path></svg>'; return $button; } } PK@A#]߄�B editors-xtd/bagallery/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]���eeeditors-xtd/menu/menu.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="editors-xtd" method="upgrade"> <name>plg_editors-xtd_menu</name> <author>Joomla! Project</author> <creationDate>2016-08</creationDate> <copyright>(C) 2016 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.7.0</version> <description>PLG_EDITORS-XTD_MENU_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\EditorsXtd\Menu</namespace> <files> <folder plugin="menu">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_editors-xtd_menu.ini</language> <language tag="en-GB">language/en-GB/plg_editors-xtd_menu.sys.ini</language> </languages> </extension> PK@A#]�$��''&editors-xtd/menu/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.article * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\EditorsXtd\Menu\Extension\Menu; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Menu( $dispatcher, (array) PluginHelper::getPlugin('editors-xtd', 'menu') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]�sm�'editors-xtd/menu/src/Extension/Menu.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.menu * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\EditorsXtd\Menu\Extension; use Joomla\CMS\Language\Text; use Joomla\CMS\Object\CMSObject; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Session\Session; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Editor menu button * * @since 3.7.0 */ final class Menu extends CMSPlugin { /** * Load the language file on instantiation. * * @var boolean * @since 3.7.0 */ protected $autoloadLanguage = true; /** * Display the button * * @param string $name The name of the button to add * * @since 3.7.0 * @return CMSObject */ public function onDisplay($name) { /* * Use the built-in element view to select the menu item. * Currently uses blank class. */ $user = $this->getApplication()->getIdentity(); if ( $user->authorise('core.create', 'com_menus') || $user->authorise('core.edit', 'com_menus') ) { $link = 'index.php?option=com_menus&view=items&layout=modal&tmpl=component&' . Session::getFormToken() . '=1&editor=' . $name; $button = new CMSObject(); $button->modal = true; $button->link = $link; $button->text = Text::_('PLG_EDITORS-XTD_MENU_BUTTON_MENU'); $button->name = $this->_type . '_' . $this->_name; $button->icon = 'list'; $button->iconSVG = '<svg viewBox="0 0 512 512" width="24" height="24"><path d="M80 368H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 1' . '6 0 0 0 16-16v-64a16 16 0 0 0-16-16zm0-320H16A16 16 0 0 0 0 64v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16V64a16 16 ' . '0 0 0-16-16zm0 160H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm416 176H1' . '76a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H176a16 16 0 0 0-16 16' . 'v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16' . 'h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z"></path></svg>'; $button->options = [ 'height' => '300px', 'width' => '800px', 'bodyHeight' => '70', 'modalWidth' => '80', ]; return $button; } } } PK@A#]����//-editors-xtd/contact/src/Extension/Contact.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.contact * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\EditorsXtd\Contact\Extension; use Joomla\CMS\Language\Text; use Joomla\CMS\Object\CMSObject; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Session\Session; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Editor Contact button * * @since 3.7.0 */ final class Contact extends CMSPlugin { /** * Load the language file on instantiation. * * @var boolean * @since 3.7.0 */ protected $autoloadLanguage = true; /** * Display the button * * @param string $name The name of the button to add * * @return CMSObject|void The button options as CMSObject * * @since 3.7.0 */ public function onDisplay($name) { $user = $this->getApplication()->getIdentity(); if ( $user->authorise('core.create', 'com_contact') || $user->authorise('core.edit', 'com_contact') || $user->authorise('core.edit.own', 'com_contact') ) { // The URL for the contacts list $link = 'index.php?option=com_contact&view=contacts&layout=modal&tmpl=component&' . Session::getFormToken() . '=1&editor=' . $name; $button = new CMSObject(); $button->modal = true; $button->link = $link; $button->text = Text::_('PLG_EDITORS-XTD_CONTACT_BUTTON_CONTACT'); $button->name = $this->_type . '_' . $this->_name; $button->icon = 'address'; $button->iconSVG = '<svg viewBox="0 0 448 512" width="24" height="24"><path d="M436 160c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V48c' . '0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h20c6.6 0 12-5.4 1' . '2-12v-40c0-6.6-5.4-12-12-12h-20v-64h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20zm-228-32c35.3 0 64 28.7' . ' 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H118.4C106 384 96 375.4 96 364.' . '8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2z">' . '</path></svg>'; $button->options = [ 'height' => '300px', 'width' => '800px', 'bodyHeight' => '70', 'modalWidth' => '80', ]; return $button; } } } PK@A#]n��Zwweditors-xtd/contact/contact.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="editors-xtd" method="upgrade"> <name>plg_editors-xtd_contact</name> <author>Joomla! Project</author> <creationDate>2016-10</creationDate> <copyright>(C) 2016 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.7.0</version> <description>PLG_EDITORS-XTD_CONTACT_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\EditorsXtd\Contact</namespace> <files> <folder plugin="contact">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_editors-xtd_contact.ini</language> <language tag="en-GB">language/en-GB/plg_editors-xtd_contact.sys.ini</language> </languages> </extension> PK@A#]�p��33)editors-xtd/contact/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors-xtd.contact * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\EditorsXtd\Contact\Extension\Contact; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Contact( $dispatcher, (array) PluginHelper::getPlugin('editors-xtd', 'contact') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]wtW�!maximenuck/k2/elements/index.htmlnu�[���<html><body></body></html>PK@A#]�|����'maximenuck/k2/elements/ckk2category.phpnu�[���<?php /** * @copyright Copyright (C) 2011 Cedric KEIFLIN alias ced1870 * http://www.joomlack.fr * Module Maximenu CK * @license GNU/GPL * */ defined('JPATH_BASE') or die; jimport('joomla.filesystem.file'); jimport('joomla.form.formfield'); JFormHelper::loadFieldClass('list'); class JFormFieldCkk2category extends JFormFieldList { protected $type = 'ckk2category'; protected function getOptions() { // if the component is not installed if (!JFolder::exists(JPATH_ROOT . '/administrator/components/com_k2')) { // add the root item $option = new stdClass(); $option->text = JText::_('MOD_MAXIMENUCK_K2_NOTFOUND'); $option->value = '0'; $options[] = $option; // Merge any additional options in the XML definition. $options = array_merge(parent::getOptions(), $options); return $options; } // get the categories form the helper $params = new JRegistry(); require_once JPATH_ROOT . '/plugins/maximenuck/k2/helper/helper_k2.php'; $cats = MaximenuckHelpersourceK2::getItems($params); // add the root item $option = new stdClass(); $option->text = JText::_('MOD_MAXIMENUCK_K2_ROOTNODE'); $option->value = '0'; $options[] = $option; foreach ($cats as $cat) { $option = new stdClass(); $option->text = str_repeat(" - ", $cat->level - 1) . $cat->name; $option->value = $cat->id; $options[] = $option; } // Merge any additional options in the XML definition. $options = array_merge(parent::getOptions(), $options); return $options; } } PK@A#]�#o,,maximenuck/k2/helper/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#]���"maximenuck/k2/helper/helper_k2.phpnu�[���<?php /** * @name Maximenu CK * @copyright Copyright (C) 2020. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt * @author Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr */ // No direct access defined('_JEXEC') or die; /** * Helper Class. */ class MaximenuckHelpersourceK2 { private static $params; /* * Get the items from the source */ public static function getItems($params) { if (empty(self::$params)) { self:$params = $params; } $app = JFactory::getApplication(); $input = $app->input; $usek2suffix = $params->get('usek2suffix', '0'); $k2imagesuffix = $params->get('k2imagesuffix', '_mini'); $usek2images = $params->get('usek2images', '0'); $categoryroot = $params->get('k2categoryroot', '0'); $categorydepth = $params->get('k2categorydepth', '0'); // $start = $params->get('startLevel', '1'); // $end = $params->get('endLevel', '10'); // $dependantitems = $params->get('dependantitems', '0'); $k2showall = $params->get('k2showall', '1'); $active_path = array(); // get the list of categories $items = array(); $activeCategories = array(); $active_category_id = $input->get('id', '0', 'int'); self::getCategoryParentRecurse($active_category_id, $activeCategories); self::recurseCategories($categoryroot, 0, $items, $categorydepth, $active_category_id); require_once JPATH_SITE . '/components/com_k2/helpers/route.php'; foreach ($items as $i => &$item) { $item->params = new JRegistry(); // $item->flink = JRoute::_('index.php?option=com_k2&view=itemlist&layout=category&task=category&id=' . $item->id ); $item->flink = JRoute::_(' index.php?option=com_k2&test=3&view=itemlist&layout=category&task=category&id=' . $item->id ); $item->deeper = false; $item->shallower = false; $item->level_diff = 0; // $item->level = $item->level - $categoryrootitem->level; if (isset($items[$i-1])) { $items[$i-1]->deeper = ($item->level > $items[$i-1]->level); $items[$i-1]->shallower = ($item->level < $items[$i-1]->level); $items[$i-1]->level_diff = ($items[$i-1]->level - $item->level); if ($items[$i-1]->deeper AND $params->get('layout', 'default') != '_:flatlist') $items[$i-1]->classe .= " parent"; } // test if it is the last item $item->is_end = !isset($items[$i + 1]); // add some classes $item->classe = " item" . $item->id; if (in_array($item->id, $activeCategories)) { $item->classe .= " active"; } if ($active_category_id && $active_category_id == $item->id) { $item->classe .= " current"; } // search for parameters $patterns = "#{maximenu}(.*){/maximenu}#Uis"; $result = preg_match($patterns, stripslashes($item->description), $results); $item->desc = ''; $item->colwidth = ''; $item->tagcoltitle = 'none'; $item->tagclass = ''; $item->leftmargin = ''; $item->topmargin = ''; $item->submenuwidth = ''; if (isset($results[1])) { $k2params = explode('|', $results[1]); // $parmsnumb = count($k2params); for ($j = 0; $j < count($k2params); $j++) { $item->desc = stristr($k2params[$j], "desc=") ? str_replace('desc=', '', $k2params[$j]) : $item->desc; $item->colwidth = stristr($k2params[$j], "col=") ? str_replace('col=', '', $k2params[$j]) : $item->colwidth; $item->tagcoltitle = stristr($k2params[$j], "taghtml=") ? str_replace('taghtml=', '', $k2params[$j]) : $item->tagcoltitle; $item->tagclass = stristr($k2params[$j], "tagclass=") ? ' '.str_replace('tagclass=', '', $k2params[$j]) : $item->tagclass; $item->leftmargin = stristr($k2params[$j], "leftmargin=") ? str_replace('leftmargin=', '', $k2params[$j]) : $item->leftmargin; $item->topmargin = stristr($k2params[$j], "topmargin=") ? str_replace('topmargin=', '', $k2params[$j]) : $item->topmargin; $item->submenucontainerwidth = stristr($k2params[$j], "submenuwidth=") ? str_replace('submenuwidth=', '', $k2params[$j]) : $item->submenuwidth; $item->createnewrow = stristr($k2params[$j], "newrow") ? 1 : 0; } } $item->classe .= $item->tagclass; // variables definition $item->ftitle = stripslashes(htmlspecialchars($item->name)); $item->content = ""; $item->rel = ""; // manage images if (!$usek2suffix) $k2imagesuffix = ''; $item->menu_image = ''; if ($usek2images) { $imageurl = $item->image ? explode(".",$item->image): ''; $imagename = isset($imageurl[0]) ? $imageurl[0] : ''; $imageext = isset($imageurl[1]) ? $imageurl[1] : ''; if (JFile::exists(JPATH_ROOT . '/media/k2/categories/' . $imagename . $k2imagesuffix . '.' . $imageext)) { $item->menu_image = 'media/k2/categories/' . $imagename . $k2imagesuffix . '.' . $imageext; } } // manage columns if ($item->colwidth) { $item->colonne = true; $parentItem = self::getParentItem($item->parent, $items); if (isset($parentItem->submenuswidth)) { $parentItem->submenuswidth = strval($parentItem->submenuswidth) + strval($item->colwidth); } else { $parentItem->submenuswidth = strval($item->colwidth); } if (isset($items[$i-1]) AND $items[$i-1]->deeper) { $items[$i-1]->nextcolumnwidth = $item->colwidth; } $item->columnwidth = $item->colwidth; } if (isset($parentItem->submenucontainerwidth) AND $parentItem->submenucontainerwidth) $parentItem->submenuswidth = $parentItem->submenucontainerwidth; $item->name = $item->ftitle; // pour compat avec default.php $item->anchor_css = ''; $item->anchor_title = ''; $item->type = ''; // get plugin parameters that are used directly in the layout $item->liclass = $item->params->get('maximenu_liclass', ''); $item->colbgcolor = $item->params->get('maximenu_colbgcolor', ''); } // give the correct deep infos for the last item if (isset($items[$i])) { $items[$i]->level_diff = ($items[$i]->level - 1); } return $items; } function getParentItem($id, $items) { foreach ($items as $item) { if ($item->id == $id) return $item; } } static function getChidrenItems($parent_id) { $db = JFactory::getDBO(); $query = "SELECT *," ." 1 as level" ." FROM #__k2_categories" ." WHERE published = 1" ." AND parent = " . (int) $parent_id ." ORDER BY ordering ASC"; $db->setQuery($query); if ($db->execute()) { $rows = $db->loadObjectList('id'); return $rows; } else { echo '<p style="color:red;font-weight:bold;">Error loading SQL data : loading the k2 categories in Maximenu CK</p>'; return false; } } static function recurseCategories($category_id, $level, &$sortedCats, $depth, $active_category_id) { $level++; // if (self::hasChildren($category_id)) { $childCats = self::getChidrenItems($category_id); if(!empty($childCats)){ foreach ($childCats as $childCat) { $childCat->level = $level; $sortedCats[] = $childCat; if ( ($depth > 0 && $childCat->level < $depth) || $depth == 0) { self::recurseCategories($childCat->id,$level, $sortedCats, $depth, $active_category_id); } } } // } } static function getCategoryParentRecurse($category_id, &$activeCategories) { $activeCategories[] = $category_id; $db = JFactory::getDBO(); $query = "SELECT parent" ." FROM #__k2_categories" ." WHERE published = 1" ." AND id = " . (int) $category_id; $db->setQuery($query); if ($db->execute()) { $parent_category_id = (int)$db->loadResult(); } else { $parent_category_id = null; } if($parent_category_id){ self::getCategoryParentRecurse($parent_category_id, $activeCategories); } } } PK@A#]��L��"maximenuck/k2/params/k2_params.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fields name="params"> <fieldset name="editionfieldset" label="" addfieldpath="/plugins/maximenuck/k2/elements"> <field name="k2spacer" type="maximenuckspacer" label="MAXIMENUCK_K2_LABEL" style="title" showon="source:k2" /> <field name="usek2images" type="maximenuckradio" default="0" label="MOD_MAXIMENUCK_USEK2IMAGES_LABEL" description="MOD_MAXIMENUCK_USEK2IMAGES_DESC" icon="images.png" showon="source:k2" class="btn-group"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="usek2suffix" type="maximenuckradio" default="0" label="MOD_MAXIMENUCK_USEK2SUFFIX_LABEL" description="MOD_MAXIMENUCK_USEK2SUFFIX_DESC" showon="source:k2" class="btn-group"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="k2imagesuffix" type="maximenucktext" default="_mini" label="MOD_MAXIMENUCK_K2IMAGESUFFIX_LABEL" description="MOD_MAXIMENUCK_K2IMAGESUFFIX_DESC" showon="source:k2" icon="image.png" /> <field name="k2categoryroot" type="ckk2category" label="MOD_MAXIMENUCK_K2CATEGORYROOT_LABEL" default="0" description="MOD_MAXIMENUCK_K2CATEGORYROOT_DESC" showon="source:k2" /> <field name="k2categorydepth" type="maximenucklist" label="MOD_MAXIMENUCK_K2CATEGORYDEPTH_LABEL" default="0" description="MOD_MAXIMENUCK_K2CATEGORYDEPTH_DESC" showon="source:k2" > <option value="0">JALL</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> </field> <field name="k2showall" type="maximenuckradio" label="MOD_MAXIMENUCK_K2SHOWALL_LABEL" default="1" description="MOD_MAXIMENUCK_K2SHOWALL_DESC" class="btn-group" showon="source:k2" > <option value="0">JNO</option> <option value="1">JYES</option> </field> </fieldset> </fields> </form>PK@A#]�#o,,maximenuck/k2/params/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#]�nEE8maximenuck/k2/language/en-GB/en-GB.plg_maximenuck_k2.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_SOURCE_K2="K2" MAXIMENUCK_K2_DESC ="Maximenu CK - K2. The plugin allows you to load the K2 into Maximenu CK" PK@A#]�V�'maximenuck/k2/language/en-GB/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]��1K<maximenuck/k2/language/en-GB/en-GB.plg_maximenuck_k2.sys.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_K2_DESC ="Maximenu CK - K2. The plugin allows you to load the K2 products into Maximenu CK"PK@A#]eOگ==<maximenuck/k2/language/fr-FR/fr-FR.plg_maximenuck_k2.sys.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_K2_DESC ="Maximenu CK - K2. Le plugin permet d'afficher les produits K2 dans le module Maximenu CK"PK@A#]�I��VV8maximenuck/k2/language/fr-FR/fr-FR.plg_maximenuck_k2.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_SOURCE_K2="K2" MAXIMENUCK_K2_DESC ="Maximenu CK - K2. Le plugin permet d'afficher les produits K2 dans le module Maximenu CK" PK@A#]�V�'maximenuck/k2/language/fr-FR/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]�V�!maximenuck/k2/language/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]�+*�eemaximenuck/k2/k2.phpnu�[���<?php /** * @copyright Copyright (C) 2020 Cédric KEIFLIN alias ced1870 * https://www.template-creator.com * https://www.joomlack.fr * @license GNU/GPL * */ defined('_JEXEC') or die('Restricted access'); jimport('joomla.event.plugin'); class plgMaximenuckK2 extends JPlugin { private $type = 'k2'; private $shallLoad = true; function __construct(&$subject, $params) { // does not load if the component is not installed $this->shallLoad = file_exists(JPATH_ROOT . '/administrator/components/com_k2'); if (! $this->shallLoad) return; parent::__construct($subject, $params); } /* * Initiate the lugin load * * Return mixed */ function registerListeners() { if ($this->shallLoad === true) { parent::registerListeners(); } else { return false; } } /* * Send the infos in the source list to add the type in the plugin options * * Return string the source type */ public function onMaximenuckGetSourceName() { $this->loadLanguage(); return $this->type; } /* * Send the infos in the source list to add the type in the plugin options * * Return string the source type */ public function onMaximenuckGetTypeName() { $this->loadLanguage(); return $this->type; } /* * Display the html code for the item to be used into the frontend page * @param string the item object from simple_html_dom * * Return String the html code */ public function onMaximenuckRenderItemK2($item) { require_once(__DIR__ . '/helper/helper_' . $this->type . '.php'); $k2 = MaximenuckHelpersourceK2::getItems($item->params); $html = '<ul class="maximenuck2">'; foreach ($k2 as $item) { $item->level = $item->level; $item->type = 'k2'; $html .= Maximenuck\Helperfront::getHtmlItem($item); } $html .= '</ul>'; return $html; } }PK@A#]��}Zmaximenuck/k2/k2.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3" type="plugin" group="maximenuck" method="upgrade"> <name>Maximenu CK - K2</name> <creationDate>January 2020</creationDate> <copyright>Copyright (C) 2020. All rights reserved.</copyright> <license>GNU General Public License version 2 or later</license> <author>Cedric Keiflin</author> <authorEmail>ced1870@gmail.com</authorEmail> <authorUrl>https://www.joomlack.fr</authorUrl> <version>9.1.21</version> <description>Loader of K2 items for Maximenu CK</description> <files> <filename plugin="k2">k2.php</filename> <folder>elements</folder> <folder>helper</folder> <folder>language</folder> <folder>params</folder> </files> <languages folder="language"> <language tag="en-GB">en-GB/en-GB.plg_maximenuck_k2.sys.ini</language> <language tag="en-GB">en-GB/en-GB.plg_maximenuck_k2.ini</language> <language tag="fr-FR">fr-FR/fr-FR.plg_maximenuck_k2.sys.ini</language> <language tag="fr-FR">fr-FR/fr-FR.plg_maximenuck_k2.ini</language> </languages> </extension>PK@A#]V���**Lmaximenuck/virtuemart/language/en-GB/en-GB.plg_maximenuck_virtuemart.sys.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_VIRTUEMART_DESC ="Maximenu CK - Virtuemart. The plugin allows you to load the Virtuemart products into Maximenu CK"PK@A#]��E���Hmaximenuck/virtuemart/language/en-GB/en-GB.plg_maximenuck_virtuemart.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_SOURCE_VIRTUEMART="Virtuemart" MAXIMENUCK_VIRTUEMART_DESC ="Maximenu CK - Virtuemart. The plugin allows you to load the Virtuemart into Maximenu CK" MAXIMENUCK_VIRTUEMART_TYPE ="Virtuemart list from a category" MAXIMENUCK_VIRTUEMART_TYPE_SHORT ="Virtuemart list" MAXIMENUCK_VIRTUEMART_LABEL="Virtuemart" MOD_MAXIMENUCK_VIRTUEMART="Virtuemart" MOD_MAXIMENUCK_VIRTUEMART_NOTFOUND="Virtuemart not found" MOD_MAXIMENUCK_VIRTUEMART_ROOTNODE="Virtuemart root" MOD_MAXIMENUCK_SPACER_VIRTUEMART="Virtuemart Options" MOD_MAXIMENUCK_USEVIRTUEMARTIMAGES_LABEL = "Use images" MOD_MAXIMENUCK_USEVIRTUEMARTIMAGES_DESC = "Displays images aside the links. Uses thumbnails of the category with the suffix" MOD_MAXIMENUCK_USEVIRTUEMARTSUFFIX_LABEL = "Use a suffix" MOD_MAXIMENUCK_USEVIRTUEMARTSUFFIX_DESC = "Add a suffix to categories thumbnails to add icons in the menu" MOD_MAXIMENUCK_VIRTUEMARTIMAGESUFFIX_LABEL = "Images suffix" MOD_MAXIMENUCK_VIRTUEMARTIMAGESUFFIX_DESC = "Define a suffix to use with the thumbnail of the category" MOD_MAXIMENUCK_VIRTUEMARTCATEGORYROOT_LABEL = "Root category" MOD_MAXIMENUCK_VIRTUEMARTCATEGORYROOT_DESC = "The menu will only render the categories under the selected root" MOD_MAXIMENUCK_VIRTUEMARTCATEGORYDEPTH_LABEL = "Depth of categories" MOD_MAXIMENUCK_VIRTUEMARTCATEGORYDEPTH_DESC = "Select how many levels of categories you want to show" ;added 9.1.19 MOD_MAXIMENUCK_VIRTUEMARTSORTING_LABEL="Sort order" MOD_MAXIMENUCK_VIRTUEMART_ALPHABETICAL="Alphabetical"PK@A#]�V�/maximenuck/virtuemart/language/en-GB/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]7���UULmaximenuck/virtuemart/language/fr-FR/fr-FR.plg_maximenuck_virtuemart.sys.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_VIRTUEMART_DESC ="Maximenu CK - Virtuemart. Le plugin permet d'afficher les produits Virtuemart dans le module Maximenu CK"PK@A#]mL�qqHmaximenuck/virtuemart/language/fr-FR/fr-FR.plg_maximenuck_virtuemart.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_SOURCE_VIRTUEMART="Virtuemart" MAXIMENUCK_VIRTUEMART_DESC ="Maximenu CK - Virtuemart. Le plugin permet d'afficher les produits Virtuemart dans le module Maximenu CK" MAXIMENUCK_VIRTUEMART_TYPE ="Liste d'virtuemart d'une catégorie" MAXIMENUCK_VIRTUEMART_TYPE_SHORT ="Liste d'virtuemart" MAXIMENUCK_VIRTUEMART_LABEL="Virtuemart" MOD_MAXIMENUCK_VIRTUEMART="Virtuemart" MOD_MAXIMENUCK_VIRTUEMART_NOTFOUND = "Virtuemart non trouvé" MOD_MAXIMENUCK_VIRTUEMART_ROOTNODE = "Racine de Virtuemart" MOD_MAXIMENUCK_SPACER_VIRTUEMART = "Compatibilité Virtuemart" MOD_MAXIMENUCK_USEVIRTUEMARTIMAGES_LABEL = "Utiliser les images" MOD_MAXIMENUCK_USEVIRTUEMARTIMAGES_DESC = "Affiche des images à gauche des liens dans le menu. Utilise la miniature de la catégorie et le suffixe" MOD_MAXIMENUCK_USEVIRTUEMARTSUFFIX_LABEL = "Utiliser un suffixe" MOD_MAXIMENUCK_USEVIRTUEMARTSUFFIX_DESC = "Ajoute un suffixe aux miniatures des catégories pour insérer les icônes dans le menu" MOD_MAXIMENUCK_VIRTUEMARTIMAGESUFFIX_LABEL = "Suffixe des images" MOD_MAXIMENUCK_VIRTUEMARTIMAGESUFFIX_DESC = "On peut définir un suffixe à ajouter à l'image miniature de la catégorie, ça permet d'utiliser une autre icône pour le menu" MOD_MAXIMENUCK_VIRTUEMARTCATEGORYROOT_LABEL = "Catégorie parente" MOD_MAXIMENUCK_VIRTUEMARTCATEGORYROOT_DESC = "Le menu n'affichera que les catégories en dessous de celle-ci" MOD_MAXIMENUCK_VIRTUEMARTCATEGORYDEPTH_LABEL = "Profondeur de catégories" MOD_MAXIMENUCK_VIRTUEMARTCATEGORYDEPTH_DESC = "Choisir le nombre de niveaux de catégories à afficher" ;added 9.1.19 MOD_MAXIMENUCK_VIRTUEMARTSORTING_LABEL="Ordre d'affichage" MOD_MAXIMENUCK_VIRTUEMART_ALPHABETICAL="Alphabétique"PK@A#]�V�/maximenuck/virtuemart/language/fr-FR/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]�V�)maximenuck/virtuemart/language/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]F[��UU$maximenuck/virtuemart/virtuemart.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3" type="plugin" group="maximenuck" method="upgrade"> <name>Maximenu CK - Virtuemart</name> <creationDate>January 2020</creationDate> <copyright>Copyright (C) 2020. All rights reserved.</copyright> <license>GNU General Public License version 2 or later</license> <author>Cedric Keiflin</author> <authorEmail>ced1870@gmail.com</authorEmail> <authorUrl>https://www.joomlack.fr</authorUrl> <version>9.1.21</version> <description>Loader of Virtuemart items for Maximenu CK</description> <files> <filename plugin="virtuemart">virtuemart.php</filename> <folder>elements</folder> <folder>helper</folder> <folder>language</folder> <folder>params</folder> </files> <languages folder="language"> <language tag="en-GB">en-GB/en-GB.plg_maximenuck_virtuemart.sys.ini</language> <language tag="en-GB">en-GB/en-GB.plg_maximenuck_virtuemart.ini</language> <language tag="fr-FR">fr-FR/fr-FR.plg_maximenuck_virtuemart.sys.ini</language> <language tag="fr-FR">fr-FR/fr-FR.plg_maximenuck_virtuemart.ini</language> </languages> </extension>PK@A#]���֮�$maximenuck/virtuemart/virtuemart.phpnu�[���<?php /** * @copyright Copyright (C) 2020 Cédric KEIFLIN alias ced1870 * https://www.template-creator.com * https://www.joomlack.fr * @license GNU/GPL * */ defined('_JEXEC') or die('Restricted access'); jimport('joomla.event.plugin'); class plgMaximenuckVirtuemart extends JPlugin { private $type = 'virtuemart'; private $shallLoad = true; function __construct(&$subject, $params) { // does not load if the component is not installed $this->shallLoad = file_exists(JPATH_SITE . '/administrator/components/com_virtuemart'); if (! $this->shallLoad) return; parent::__construct($subject, $params); } /* * Initiate the lugin load * * Return mixed */ function registerListeners() { if ($this->shallLoad === true) { parent::registerListeners(); } else { return false; } } /* * Send the infos in the source list to add the type in the plugin options * * Return string the source type */ public function onMaximenuckGetSourceName() { $this->loadLanguage(); return $this->type; } /* * Send the infos in the source list to add the type in the plugin options * * Return string the source type */ public function onMaximenuckGetTypeName() { $this->loadLanguage(); return $this->type; } /* * Display the html code for the item to be used into the frontend page * @param string the item object from simple_html_dom * * Return String the html code */ public function onMaximenuckRenderItemVirtuemart($item) { require_once(__DIR__ . '/helper/helper_' . $this->type . '.php'); $virtuemart = MaximenuckHelpersourceVirtuemart::getItems($item->params); $html = '<ul class="maximenuck2">'; foreach ($virtuemart as $article) { $article->level = $item->level; $article->type = 'article'; $html .= Maximenuck\Helperfront::getHtmlItem($article); } $html .= '</ul>'; return $html; } }PK@A#]�e� � 2maximenuck/virtuemart/params/virtuemart_params.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fields name="params"> <fieldset name="editionfieldset" label="" addfieldpath="/plugins/maximenuck/virtuemart/elements"> <field name="virtuemartspacer" type="maximenuckspacer" label="MAXIMENUCK_VIRTUEMART_LABEL" style="title" showon="source:virtuemart" /> <field name="usevirtuemartimages" type="maximenuckradio" class="btn-group" default="0" label="MOD_MAXIMENUCK_USEVIRTUEMARTIMAGES_LABEL" description="MOD_MAXIMENUCK_USEVIRTUEMARTIMAGES_DESC" showon="source:virtuemart" icon="images.png"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="usevirtuemartsuffix" type="maximenuckradio" class="btn-group" default="0" label="MOD_MAXIMENUCK_USEVIRTUEMARTSUFFIX_LABEL" description="MOD_MAXIMENUCK_USEVIRTUEMARTSUFFIX_DESC" showon="source:virtuemart" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="virtuemartimagesuffix" type="maximenucktext" default="_mini" label="MOD_MAXIMENUCK_VIRTUEMARTIMAGESUFFIX_LABEL" description="MOD_MAXIMENUCK_VIRTUEMARTIMAGESUFFIX_DESC" showon="source:virtuemart" icon="image.png" /> <field name="virtuemartcategoryroot" type="ckvmcategory" label="MOD_MAXIMENUCK_VIRTUEMARTCATEGORYROOT_LABEL" default="0" description="MOD_MAXIMENUCK_VIRTUEMARTCATEGORYROOT_DESC" showon="source:virtuemart" /> <field name="virtuemartcategorydepth" type="maximenucklist" label="MOD_MAXIMENUCK_VIRTUEMARTCATEGORYDEPTH_LABEL" default="0" description="MOD_MAXIMENUCK_VIRTUEMARTCATEGORYDEPTH_DESC" showon="source:virtuemart" > <option value="0">JALL</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> </field> <field name="virtuemartsorting" type="maximenucklist" class="btn-group" default="default" label="MOD_MAXIMENUCK_VIRTUEMARTSORTING_LABEL" showon="source:virtuemart" > <option value="default">JDEFAULT</option> <option value="alphabetical">MOD_MAXIMENUCK_VIRTUEMART_ALPHABETICAL</option> </field> </fieldset> </fields> </form>PK@A#]�#o,,'maximenuck/virtuemart/params/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#][H�2G G /maximenuck/virtuemart/elements/ckvmcategory.phpnu�[���<?php /** * @copyright Copyright (C) 2011 Cedric KEIFLIN alias ced1870 * http://www.joomlack.fr * Module Maximenu CK * @license GNU/GPL * */ defined('JPATH_BASE') or die; jimport('joomla.filesystem.file'); if (file_exists(JPATH_ROOT . '/administrator/components/com_virtuemart')) { if (!class_exists('VmConfig')) { if (file_exists(JPATH_ROOT . '/administrator/components/com_virtuemart/helpers/config.php')) require(JPATH_ROOT . '/administrator/components/com_virtuemart/helpers/config.php'); } if (!class_exists('ShopFunctions')) { if (file_exists(JPATH_ROOT . '/administrator/components/com_virtuemart/helpers/shopfunctions.php')) require(JPATH_ROOT . '/administrator/components/com_virtuemart/helpers/shopfunctions.php'); } // if (!class_exists('TableCategories')) { // if (file_exists(JPATH_ROOT . '/administrator/components/com_virtuemart/tables/categories.php')) // require(JPATH_ROOT . '/administrator/components/com_virtuemart/tables/categories.php'); // } } jimport('joomla.form.formfield'); JFormHelper::loadFieldClass('list'); class JFormFieldCkvmcategory extends JFormFieldList { protected $type = 'Ckvmcategory'; protected function getOptions() { // if VM is not installed if (!JFolder::exists(JPATH_ROOT . '/administrator/components/com_virtuemart') OR !class_exists('ShopFunctions')) { // add the root item $option = new stdClass(); $option->text = JText::_('MOD_MAXIMENUCK_VIRTUEMART_NOTFOUND'); $option->value = '0'; $options[] = $option; // Merge any additional options in the XML definition. $options = array_merge(parent::getOptions(), $options); return $options; } VmConfig::loadConfig(); $categorylist = ShopFunctions::categoryListTree(); $categorylist = trim($categorylist, '</option>'); $categorylist = explode("</option><option", $categorylist); // add the root item $option = new stdClass(); $option->text = JText::_('MOD_MAXIMENUCK_VIRTUEMART_ROOTNODE'); $option->value = '0'; $options[] = $option; foreach ($categorylist as $cat) { $option = new stdClass(); $text = explode(">", $cat); $option->text = trim($text[1]); $option->value = strval(trim(trim(trim($text[0]), '"'), 'value="')); $options[] = $option; } // Merge any additional options in the XML definition. $options = array_merge(parent::getOptions(), $options); return $options; } } PK@A#]wtW�)maximenuck/virtuemart/elements/index.htmlnu�[���<html><body></body></html>PK@A#]�Y�..2maximenuck/virtuemart/helper/helper_virtuemart.phpnu�[���<?php /** * @name Maximenu CK * @copyright Copyright (C) 2020. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt * @author Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr */ // No direct access defined('_JEXEC') or die; /** * Helper Class. */ class MaximenuckHelpersourceVirtuemart { private static $params; static function getChidrenItems($parent_id) { $db = JFactory::getDBO(); $query_children = "SELECT *, #__virtuemart_categories.virtuemart_category_id as id, #__virtuemart_category_categories.category_parent_id as parent, #__virtuemart_categories.ordering as ordering, 2 as level" ." FROM (((#__virtuemart_categories" ." INNER JOIN #__virtuemart_category_categories" ." ON #__virtuemart_categories.virtuemart_category_id = #__virtuemart_category_categories.category_child_id)" ." INNER JOIN #__virtuemart_categories_".VMLANG ." ON #__virtuemart_categories.virtuemart_category_id = #__virtuemart_categories_".VMLANG.".virtuemart_category_id)" ." LEFT OUTER JOIN #__virtuemart_category_medias" ." ON #__virtuemart_categories.virtuemart_category_id = #__virtuemart_category_medias.virtuemart_category_id)" ." LEFT OUTER JOIN #__virtuemart_medias" ." ON #__virtuemart_category_medias.virtuemart_media_id = #__virtuemart_medias.virtuemart_media_id" ." WHERE #__virtuemart_category_categories.category_parent_id = " . (int) $parent_id . " AND #__virtuemart_categories.published = 1"; if (self::$params->get('virtuemartsorting', 'default') == 'default') { $query_children .= " ORDER BY #__virtuemart_categories.ordering ASC, #__virtuemart_categories.virtuemart_category_id ASC"; } else { $query_children .= " ORDER BY #__virtuemart_categories_".VMLANG.".category_name ASC, #__virtuemart_categories.virtuemart_category_id ASC"; } $db->setQuery($query_children); if ($db->execute()) { $rows_children = $db->loadObjectList('id'); return $rows_children; } else { echo '<p style="color:red;font-weight:bold;">Error loading SQL data : loading the Virtuemart categories in Maximenu CK</p>'; return false; } } static function recurseCategories($category_id, $level, &$sortedCats, $depth) { $level++; if (self::hasChildren($category_id)) { $childCats = self::getChidrenItems($category_id); if(!empty($childCats)){ foreach ($childCats as $childCat) { $childCat->level = $level; $sortedCats[] = $childCat; if ( ($depth > 0 && $childCat->level < $depth) || $depth == 0) { self::recurseCategories($childCat->id,$level, $sortedCats, $depth); } } } } } /** * Checks for children of the category $virtuemart_category_id * * @param int $virtuemart_category_id the category ID to check * @return boolean true when the category has childs, false when not */ static function hasChildren($virtuemart_category_id) { $db = JFactory::getDBO(); $q = "SELECT `category_child_id` FROM `#__virtuemart_category_categories` WHERE `category_parent_id` = ".(int)$virtuemart_category_id; $db->setQuery($q); $db->execute(); if ($db->getAffectedRows() > 0){ return true; } else { return false; } } /** * Get a list of the menu items. * * @param JRegistry $params The module options. * * @return array */ static function getItems(&$params, $all = false, $level = 1, $parent_id = 0) { self::$params = $params; if (! defined('DS') ) { define('DS', '/'); } jimport('joomla.application.module.helper'); if (!class_exists( 'VmConfig' )) require_once(JPATH_ADMINISTRATOR.'/components/com_virtuemart/helpers/config.php'); $config= VmConfig::loadConfig(); if(!class_exists('VmModel'))require(JPATH_ADMINISTRATOR.'/components/com_virtuemart/helpers/vmmodel.php'); // for joomla 2.5 /* $usevmsuffix = $params->get('usevmsuffix', '0'); $vmimagesuffix = $params->get('vmimagesuffix', '_mini'); $usevmimages = $params->get('usevmimages', '0'); $vmcategoryroot = $params->get('vmcategoryroot', '0'); $vmcategorydepth = $params->get('vmcategorydepth', '0'); */ // for joomla 3 $usevmsuffix = $params->get('usevirtuemartsuffix', '0'); $vmimagesuffix = $params->get('virtuemartimagesuffix', '_mini'); $usevmimages = $params->get('usevirtuemartimages', '0'); $vmcategoryroot = $params->get('virtuemartcategoryroot', '0'); $vmcategorydepth = $params->get('virtuemartcategorydepth', '0'); // $active_path = array(); // $db = JFactory::getDBO(); $active_category_id = JRequest::getInt('virtuemart_category_id', '0'); // get the active tree $categoryModel = VmModel::getModel('Category'); $parentCategories = $categoryModel->getCategoryRecurse($active_category_id,0); // $level = 0; $items = array(); $i = 0; $vmcategoryrootitem = new stdClass(); $vmcategoryrootitem->level = 0; $vmcategoryrootitem->enfants = ''; // get the list of categories self::recurseCategories($vmcategoryroot, 0, $items, $vmcategorydepth); $j = 0; $lastitem = 0; foreach ($items as $i => &$item) { $newItem = self::initItem(); foreach ($newItem as $prop => $val) { if (! isset($item->$prop)) $item->$prop = $val; } $item->flink = $item->link = JRoute::_('index.php?option=com_virtuemart&view=category&virtuemart_category_id=' . $item->id); $item->level = $item->level + $level - 1; if ($item->level == $level) { $item->parent_id = $parent_id; } if (isset($items[$i-1])) { $items[$i-1]->deeper = ($item->level > $items[$i-1]->level); $items[$i-1]->shallower = ($item->level < $items[$i-1]->level); $items[$i-1]->level_diff = ($items[$i-1]->level - $item->level); if ($items[$i-1]->deeper AND $params->get('layout', 'default') != '_:flatlist') $items[$i-1]->classe .= " parent"; } // if ($item->deeper) $item->classe .= " parent"; // test if it is the last item $item->is_end = !isset($items[$i + 1]); // add some classes $item->classe .= " item" . $item->id; if (in_array($item->id, $parentCategories)) { $item->classe .= " active"; } if ($active_category_id && $active_category_id == $item->id) { $item->classe .= " current"; } // search for parameters $patterns = "#{maximenu}(.*){/maximenu}#Uis"; $result = preg_match($patterns, stripslashes($item->category_description), $results); $imageonly = ''; if (isset($results[1])) { $vmparams = explode('|', $results[1]); // $parmsnumb = count($vmparams); for ($j = 0; $j < count($vmparams); $j++) { $item->desc = stristr($vmparams[$j], "desc=") ? str_replace('desc=', '', $vmparams[$j]) : $item->desc; $item->colwidth = stristr($vmparams[$j], "col=") ? str_replace('col=', '', $vmparams[$j]) : $item->colwidth; $item->tagcoltitle = stristr($vmparams[$j], "taghtml=") ? str_replace('taghtml=', '', $vmparams[$j]) : $item->tagcoltitle; $item->tagclass = stristr($vmparams[$j], "tagclass=") ? ' '.str_replace('tagclass=', '', $vmparams[$j]) : $item->tagclass; $item->leftmargin = stristr($vmparams[$j], "leftmargin=") ? str_replace('leftmargin=', '', $vmparams[$j]) : $item->leftmargin; $item->topmargin = stristr($vmparams[$j], "topmargin=") ? str_replace('topmargin=', '', $vmparams[$j]) : $item->topmargin; $item->submenucontainerwidth = stristr($vmparams[$j], "submenuwidth=") ? str_replace('submenuwidth=', '', $vmparams[$j]) : $item->submenuwidth; $item->createnewrow = stristr($vmparams[$j], "newrow") ? 1 : 0; $item->type = stristr($vmparams[$j], "separator") ? 'separator' : $item->type; $imageonly = stristr($vmparams[$j], "notext") ? 1 : $imageonly; } } if ($imageonly) { $item->params->set('menu_text', 0); } $item->classe .= $item->tagclass; // manage tag encapsulation // $item->tagcoltitle = $item->params->set('maximenu_tagcoltitle', $item->taghtml); // variables definition $item->ftitle = stripslashes(htmlspecialchars($item->category_name)); $item->content = ""; $item->rel = ""; // manage images if (!$usevmsuffix) $vmimagesuffix = ''; $item->menu_image = ''; if ($usevmimages) { $imageurl = $item->file_url ? explode(".",$item->file_url): ''; $imagelocation = isset($imageurl[0]) ? $imageurl[0] : ''; $imageext = isset($imageurl[1]) ? $imageurl[1] : ''; if (JFile::exists(JPATH_ROOT . '/'. $imagelocation . $vmimagesuffix . '.' . $imageext)) { $item->menu_image = $imagelocation . $vmimagesuffix . '.' . $imageext; } } // manage columns if ($item->colwidth) { $item->colonne = true; $parentItem = self::getParentItem($item->parent, $items); if (isset($parentItem->submenuswidth)) { $parentItem->submenuswidth = strval($parentItem->submenuswidth) + strval($item->colwidth); } else { if (is_object($parentItem)) $parentItem->submenuswidth = strval($item->colwidth); } if (isset($items[$i-1]) AND $items[$i-1]->deeper) { $items[$i-1]->nextcolumnwidth = $item->colwidth; } $item->columnwidth = $item->colwidth; } if (isset($parentItem->submenucontainerwidth) AND $parentItem->submenucontainerwidth) $parentItem->submenuswidth = $parentItem->submenucontainerwidth; $item->name = $item->ftitle; // get plugin parameters that are used directly in the layout // $item->leftmargin = $item->params->get('maximenu_leftmargin', ''); // $item->topmargin = $item->params->get('maximenu_topmargin', ''); $item->liclass = $item->params->get('maximenu_liclass', ''); $item->colbgcolor = $item->params->get('maximenu_colbgcolor', ''); // $lastitem = $i; } // give the correct deep infos for the last item if (isset($items[$i])) { // $items[$i]->deeper = (($start?$start:1) > $items[$i]->level); // $items[$i]->shallower = (($start?$start:1) < $items[$i]->level); $items[$i]->level_diff = ($items[$i]->level - 1 - $vmcategoryrootitem->level); } return $items; } static function getParentItem($id, $items) { foreach ($items as $item) { if ($item->id == $id) return $item; } } public static function initItem() { $item = new stdClass(); $item->params = new JRegistry(); $item->deeper = false; $item->shallower = false; $item->level_diff = 0; $item->isthirdparty = false; $item->is_end = false; $item->classe = ''; $item->desc = ''; $item->colwidth = ''; $item->tagcoltitle = 'none'; $item->tagclass = ''; $item->leftmargin = ''; $item->topmargin = ''; $item->submenuwidth = ''; $item->liclass = ''; $item->anchor_css = ''; $item->anchor_title = ''; $item->colbgcolor = ''; $item->menu_image = ''; $item->type = ''; $item->content = ''; $item->rel = ''; $item->link = ''; $item->title = ''; $item->parent_id = ''; $item->id = ''; // special for the thirdparty plugins $item->isthirdparty = true; $item->type = 'thirdparty'; return $item; } } PK@A#]�#o,,'maximenuck/virtuemart/helper/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#]�V�+maximenuck/joomshopping/language/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]����00Pmaximenuck/joomshopping/language/en-GB/en-GB.plg_maximenuck_joomshopping.sys.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_JOOMSHOPPING_DESC ="Maximenu CK - Joomshopping. The plugin allows you to load the Joomshopping products into Maximenu CK"PK@A#]5�͛Lmaximenuck/joomshopping/language/en-GB/en-GB.plg_maximenuck_joomshopping.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_SOURCE_JOOMSHOPPING="Joomshopping" MAXIMENUCK_JOOMSHOPPING_DESC ="Maximenu CK - Joomshopping. The plugin allows you to load the Joomshopping into Maximenu CK" MAXIMENUCK_JOOMSHOPPING_TYPE ="Joomshopping list from a category" MAXIMENUCK_JOOMSHOPPING_TYPE_SHORT ="Joomshopping list" MAXIMENUCK_JOOMSHOPPING_LABEL="Joomshopping" PK@A#]�V�1maximenuck/joomshopping/language/en-GB/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]�V�1maximenuck/joomshopping/language/fr-FR/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]�`�66Lmaximenuck/joomshopping/language/fr-FR/fr-FR.plg_maximenuck_joomshopping.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_SOURCE_JOOMSHOPPING="Joomshopping" MAXIMENUCK_JOOMSHOPPING_DESC ="Maximenu CK - Joomshopping. Le plugin permet d'afficher les produits Joomshopping dans le module Maximenu CK" MAXIMENUCK_JOOMSHOPPING_TYPE ="Liste d'joomshopping d'une catégorie" MAXIMENUCK_JOOMSHOPPING_TYPE_SHORT ="Liste d'joomshopping" MAXIMENUCK_JOOMSHOPPING_LABEL="Joomshopping" PK@A#]d�Dg[[Pmaximenuck/joomshopping/language/fr-FR/fr-FR.plg_maximenuck_joomshopping.sys.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_JOOMSHOPPING_DESC ="Maximenu CK - Joomshopping. Le plugin permet d'afficher les produits Joomshopping dans le module Maximenu CK"PK@A#]��:;maximenuck/joomshopping/elements/ckjoomshoppingcategory.phpnu�[���<?php /** * @copyright Copyright (C) 2011 Cedric KEIFLIN alias ced1870 * http://www.joomlack.fr * Module Maximenu CK * @license GNU/GPL * */ defined('JPATH_BASE') or die; jimport('joomla.filesystem.file'); jimport('joomla.form.formfield'); JFormHelper::loadFieldClass('list'); class JFormFieldCkjoomshoppingcategory extends JFormFieldList { protected $type = 'ckjoomshoppingcategory'; protected function getOptions() { // if the component is not installed if (!JFolder::exists(JPATH_ROOT . '/administrator/components/com_jshopping')) { // add the root item $option = new stdClass(); $option->text = JText::_('MOD_MAXIMENUCK_JOOMSHOPPING_NOTFOUND'); $option->value = '0'; $options[] = $option; // Merge any additional options in the XML definition. $options = array_merge(parent::getOptions(), $options); return $options; } // get the categories form the helper $params = new JRegistry(); require_once JPATH_ROOT . '/plugins/maximenuck/joomshopping/helper/helper_joomshopping.php'; $cats = MaximenuckHelpersourceJoomshopping::getItems($params, true); // add the root item $option = new stdClass(); $option->text = JText::_('MOD_MAXIMENUCK_JOOMSHOPPING_ROOTNODE'); $option->value = '0'; $options[] = $option; foreach ($cats as $cat) { $option = new stdClass(); $option->text = str_repeat(" - ", $cat->level - 1) . $cat->name; $option->value = $cat->category_id; $options[] = $option; } // Merge any additional options in the XML definition. $options = array_merge(parent::getOptions(), $options); return $options; } } PK@A#]wtW�+maximenuck/joomshopping/elements/index.htmlnu�[���<html><body></body></html>PK@A#]��/7��(maximenuck/joomshopping/joomshopping.phpnu�[���<?php /** * @copyright Copyright (C) 2020 Cédric KEIFLIN alias ced1870 * https://www.template-creator.com * https://www.joomlack.fr * @license GNU/GPL * */ defined('_JEXEC') or die('Restricted access'); jimport('joomla.event.plugin'); class plgMaximenuckJoomshopping extends JPlugin { private $type = 'joomshopping'; private $shallLoad = true; function __construct(&$subject, $params) { // does not load if the component is not installed $this->shallLoad = file_exists(JPATH_SITE . '/administrator/components/com_joomshopping'); if (! $this->shallLoad) return; parent::__construct($subject, $params); } /* * Initiate the lugin load * * Return mixed */ function registerListeners() { if ($this->shallLoad === true) { parent::registerListeners(); } else { return false; } } /* * Send the infos in the source list to add the type in the plugin options * * Return string the source type */ public function onMaximenuckGetSourceName() { $this->loadLanguage(); return $this->type; } /* * Send the infos in the source list to add the type in the plugin options * * Return string the source type */ public function onMaximenuckGetTypeName() { $this->loadLanguage(); return $this->type; } /* * Display the html code for the item to be used into the frontend page * @param string the item object from simple_html_dom * * Return String the html code */ public function onMaximenuckRenderItemJoomshopping($item) { require_once(__DIR__ . '/helper/helper_' . $this->type . '.php'); $joomshopping = MaximenuckHelpersourceJoomshopping::getItems($item->params); $html = '<ul class="maximenuck2">'; foreach ($joomshopping as $article) { $article->level = $item->level; $article->type = 'article'; $html .= Maximenuck\Helperfront::getHtmlItem($article); } $html .= '</ul>'; return $html; } }PK@A#]�.TOee(maximenuck/joomshopping/joomshopping.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3" type="plugin" group="maximenuck" method="upgrade"> <name>Maximenu CK - Joomshopping</name> <creationDate>January 2020</creationDate> <copyright>Copyright (C) 2020. All rights reserved.</copyright> <license>GNU General Public License version 2 or later</license> <author>Cedric Keiflin</author> <authorEmail>ced1870@gmail.com</authorEmail> <authorUrl>https://www.joomlack.fr</authorUrl> <version>9.1.21</version> <description>Loader of Joomshopping items for Maximenu CK</description> <files> <filename plugin="joomshopping">joomshopping.php</filename> <folder>elements</folder> <folder>helper</folder> <folder>language</folder> <folder>params</folder> </files> <languages folder="language"> <language tag="en-GB">en-GB/en-GB.plg_maximenuck_joomshopping.sys.ini</language> <language tag="en-GB">en-GB/en-GB.plg_maximenuck_joomshopping.ini</language> <language tag="fr-FR">fr-FR/fr-FR.plg_maximenuck_joomshopping.sys.ini</language> <language tag="fr-FR">fr-FR/fr-FR.plg_maximenuck_joomshopping.ini</language> </languages> </extension>PK@A#]�#o,,)maximenuck/joomshopping/params/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#]�a�x x 6maximenuck/joomshopping/params/joomshopping_params.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fields name="params"> <fieldset name="editionfieldset" label="" addfieldpath="/plugins/maximenuck/joomshopping/elements"> <field name="joomshoppingspacer" type="maximenuckspacer" label="MAXIMENUCK_JOOMSHOPPING_LABEL" style="title" showon="source:joomshopping" /> <field name="joomshoppingitemid" type="maximenucktext" label="MOD_MAXIMENUCK_JOOMSHOPPINGITEMID_LABEL" default="0" description="MOD_MAXIMENUCK_JOOMSHOPPINGITEMID_DESC" showon="source:joomshopping" /> <field name="usejoomshoppingimages" type="maximenuckradio" default="0" label="MOD_MAXIMENUCK_USEJOOMSHOPPINGIMAGES_LABEL" description="MOD_MAXIMENUCK_USEJOOMSHOPPINGIMAGES_DESC" class="btn-group" showon="source:joomshopping" icon="images.png"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="usejoomshoppingsuffix" type="maximenuckradio" default="0" label="MOD_MAXIMENUCK_USEJOOMSHOPPINGSUFFIX_LABEL" description="MOD_MAXIMENUCK_USEJOOMSHOPPINGSUFFIX_DESC" showon="source:joomshopping" class="btn-group"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="joomshoppingimagesuffix" type="maximenucktext" default="_mini" label="MOD_MAXIMENUCK_JOOMSHOPPINGIMAGESUFFIX_LABEL" description="MOD_MAXIMENUCK_JOOMSHOPPINGIMAGESUFFIX_DESC" showon="source:joomshopping" icon="image.png" /> <field name="joomshoppingcategoryroot" type="ckjoomshoppingcategory" label="MOD_MAXIMENUCK_JOOMSHOPPINGCATEGORYROOT_LABEL" default="0" description="MOD_MAXIMENUCK_JOOMSHOPPINGCATEGORYROOT_DESC" showon="source:joomshopping" /> <field name="joomshoppingcategorydepth" type="maximenucklist" label="MOD_MAXIMENUCK_JOOMSHOPPINGCATEGORYDEPTH_LABEL" default="0" description="MOD_MAXIMENUCK_JOOMSHOPPINGCATEGORYDEPTH_DESC" showon="source:joomshopping" > <option value="0">JALL</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> </field> </fieldset> </fields> </form>PK@A#]�Uc�"�"6maximenuck/joomshopping/helper/helper_joomshopping.phpnu�[���<?php /** * @name Maximenu CK * @copyright Copyright (C) 2020. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt * @author Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr */ // No direct access defined('_JEXEC') or die; /** * Helper Class. */ class MaximenuckHelpersourceJoomshopping { static $_activeitem; /** * Get a list of the menu items. * * @param JRegistry $params The module options. * * @return array */ static function getItems(&$params, $all) { jimport('joomla.application.module.helper'); $input = new JInput(); $usesuffix = $params->get('usejoomshoppingsuffix', '0'); $imagesuffix = $params->get('joomshoppingimagesuffix', '_mini'); $useimages = $params->get('usejoomshoppingimages', '0'); $categoryroot = $params->get('joomshoppingcategoryroot', '0'); $categorydepth = $params->get('joomshoppingcategorydepth', '0'); $itemid = $params->get('joomshoppingitemid', ''); require_once (JPATH_SITE.'/components/com_jshopping/lib/factory.php'); require_once (JPATH_SITE.'/components/com_jshopping/lib/jtableauto.php'); require_once (JPATH_SITE.'/components/com_jshopping/tables/config.php'); require_once (JPATH_SITE.'/components/com_jshopping/lib/functions.php'); require_once (JPATH_SITE.'/components/com_jshopping/lib/multilangfield.php'); require_once (JPATH_ADMINISTRATOR.'/components/com_jshopping/models/categories.php'); JTable::addIncludePath(JPATH_SITE.'/components/com_jshopping/tables'); // get the active path $category_id = $input->get('category_id', 0, 'int'); $category = JTable::getInstance('category', 'jshop'); $category->load($category_id); $activepath = $category->getTreeParentCategories(); $model = JModelLegacy::getInstance('Categories', 'JshoppingModel'); if ( ($categoryroot && !$all) || $categorydepth) { $items = self::getTreeSubCategories($categoryroot, 0, $categorydepth); } else { $items = $model->getTreeAllCategories(); } $active_category_id = $input->get('category_id', '0', 'int'); if ($active_category_id) self::$_activeitem = $items[$active_category_id]; $lastitem = 0; foreach ($items as $i => &$item) { $item->params = new JRegistry(); $itemid = $itemid ? '&Itemid=' . $itemid : ''; $item->flink = JRoute::_('index.php?option=com_jshopping&controller=category&task=view&category_id=' . $item->category_id . $itemid); $item->deeper = false; $item->shallower = false; $item->level_diff = 0; $item->level = $item->level + 1; if (isset($items[$i - 1])) { $items[$i - 1]->deeper = ($item->level > $items[$i - 1]->level); $items[$i - 1]->shallower = ($item->level < $items[$i - 1]->level); $items[$i - 1]->level_diff = ($items[$i - 1]->level - $item->level); if ($items[$i - 1]->deeper AND $params->get('layout', 'default') != '_:flatlist') $items[$i - 1]->classe .= " parent"; } // test if it is the last item $item->is_end = !isset($items[$i + 1]); // manage item class $item->classe = ' item'.$item->category_id; if (isset($active_category_id) && $active_category_id == $item->category_id) { $item->classe .= ' current'; } if (in_array($item->category_id, $activepath)) { $item->classe .= ' active'; $item->isactive = true; } // search for parameters $patterns = "#{maximenu}(.*){/maximenu}#Uis"; $result = preg_match($patterns, stripslashes($item->description), $results); $item->desc = ''; $item->colwidth = ''; $item->tagcoltitle = 'none'; $item->tagclass = ''; $item->leftmargin = ''; $item->topmargin = ''; $item->submenuwidth = ''; if (isset($results[1])) { $cat_params = explode('|', $results[1]); for ($j = 0; $j < count($cat_params); $j++) { $item->desc = stristr($cat_params[$j], "desc=") ? str_replace('desc=', '', $cat_params[$j]) : $item->desc; $item->colwidth = stristr($cat_params[$j], "col=") ? str_replace('col=', '', $cat_params[$j]) : $item->colwidth; $item->tagcoltitle = stristr($cat_params[$j], "taghtml=") ? str_replace('taghtml=', '', $cat_params[$j]) : $item->tagcoltitle; $item->tagclass = stristr($cat_params[$j], "tagclass=") ? ' ' . str_replace('tagclass=', '', $cat_params[$j]) : $item->tagclass; $item->leftmargin = stristr($cat_params[$j], "leftmargin=") ? str_replace('leftmargin=', '', $cat_params[$j]) : $item->leftmargin; $item->topmargin = stristr($cat_params[$j], "topmargin=") ? str_replace('topmargin=', '', $cat_params[$j]) : $item->topmargin; $item->submenucontainerwidth = stristr($cat_params[$j], "submenuwidth=") ? str_replace('submenuwidth=', '', $cat_params[$j]) : $item->submenuwidth; } } $item->classe .= $item->tagclass; // variables definition $item->ftitle = stripslashes(htmlspecialchars($item->name)); $item->content = ""; $item->rel = ""; // manage images if (!$usesuffix) $imagesuffix = ''; $item->menu_image = ''; if ($useimages) { $imageurl = explode('.', $item->category_image); $imagename = isset($imageurl[0]) ? $imageurl[0] : ''; $imageext = isset($imageurl[1]) ? $imageurl[1] : ''; if (JFile::exists(JPATH_ROOT . '/components/com_jshopping/files/img_categories/' . $imagename . $imagesuffix . '.' . $imageext)) { $item->menu_image = 'components/com_jshopping/files/img_categories/' . $imagename . $imagesuffix . '.' . $imageext; } } // manage columns if ($item->colwidth) { $item->colonne = true; $parentItem = self::getParentItem($item->parent, $items); if (isset($parentItem->submenuswidth)) { $parentItem->submenuswidth = strval($parentItem->submenuswidth) + strval($item->colwidth); } else if( $parentItem ) { $parentItem->submenuswidth = strval($item->colwidth); } if (isset($items[$i - 1]) AND $items[$i - 1]->deeper) { $items[$i - 1]->columnwidth = $item->colwidth; } else { $item->columnwidth = $item->colwidth; } } if (isset($parentItem->submenucontainerwidth) AND $parentItem->submenucontainerwidth) $parentItem->submenuswidth = $parentItem->submenucontainerwidth; $item->name = $item->ftitle; // pour compat avec default.php $item->anchor_css = ''; $item->anchor_title = ''; $item->type = ''; // get plugin parameters that are used directly in the layout $item->liclass = $item->params->get('maximenu_liclass', ''); $item->colbgcolor = $item->params->get('maximenu_colbgcolor', ''); } // give the correct deep infos for the last item if (isset($items[$i])) { $items[$i]->level_diff = ($items[$i]->level - 1); } return $items; } static function getParentItem($id, $items) { foreach ($items as $item) { if ($item->category_id == $id) return $item; } } static public function getTreeSubCategories($categoryroot, $level, $categorydepth) { $category = JTable::getInstance('category', 'jshop'); $category->load($category_id); $model = JModelLegacy::getInstance('Categories', 'JshoppingModel'); $subcatsCount = $model->getAllCatCountSubCat(); $cats = $category->getSubCategories($categoryroot, 'ordering'); $items = Array(); foreach ($cats as $cat) { $cat->level = $level; $items[] = $cat; if ($subcatsCount[$cat->category_id] && ($categorydepth == 0 || $categorydepth > ($level+1)) ) { $subcats = self::getTreeSubCategories($cat->category_id, $cat->level + 1, $categorydepth); foreach ($subcats as $subcat) { $items[] = $subcat; } } } return $items; } } PK@A#]�#o,,)maximenuck/joomshopping/helper/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#]w�y���,maximenuck/articlesbydate/articlesbydate.phpnu�[���<?php /** * @copyright Copyright (C) 2018 Cédric KEIFLIN alias ced1870 * https://www.template-creator.com * https://www.joomlack.fr * @license GNU/GPL * */ defined('_JEXEC') or die('Restricted access'); jimport('joomla.event.plugin'); class plgMaximenuckArticlesbydate extends JPlugin { private $type = 'articlesbydate'; function __construct(&$subject, $params) { parent::__construct($subject, $params); } /* * Send the infos in the source list to add the type in the plugin options * * Return string the source type */ public function onMaximenuckGetSourceName() { $this->loadLanguage(); return $this->type; } }PK@A#]Ds�vv,maximenuck/articlesbydate/articlesbydate.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3" type="plugin" group="maximenuck" method="upgrade"> <name>Maximenu CK - Articles by date</name> <creationDate>June 2020</creationDate> <copyright>Copyright (C) 2018. All rights reserved.</copyright> <license>GNU General Public License version 2 or later</license> <author>Cedric Keiflin</author> <authorEmail>ced1870@gmail.com</authorEmail> <authorUrl>https://www.joomlack.fr</authorUrl> <version>9.1.25</version> <description>Loader of Articles by date items for Maximenu CK</description> <files> <filename plugin="articlesbydate">articlesbydate.php</filename> <folder>elements</folder> <folder>helper</folder> <folder>language</folder> <folder>params</folder> </files> <languages folder="language"> <language tag="en-GB">en-GB/en-GB.plg_maximenuck_articlesbydate.sys.ini</language> <language tag="en-GB">en-GB/en-GB.plg_maximenuck_articlesbydate.ini</language> <language tag="fr-FR">fr-FR/fr-FR.plg_maximenuck_articlesbydate.sys.ini</language> <language tag="fr-FR">fr-FR/fr-FR.plg_maximenuck_articlesbydate.ini</language> </languages> </extension>PK@A#]wtW�-maximenuck/articlesbydate/elements/index.htmlnu�[���<html><body></body></html>PK@A#]�<���4�4:maximenuck/articlesbydate/helper/helper_articlesbydate.phpnu�[���<?php /** * @name Maximenu CK * @copyright Copyright (C) 2018. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt * @author Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr */ // No direct access defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Router\Route; use Joomla\Component\Content\Administrator\Extension\ContentComponent; use Joomla\Component\Content\Site\Helper\RouteHelper; use Joomla\Component\Content\Site\Helper\AssciationHelper; /** * Helper Class. */ class MaximenuckHelpersourceArticlesbydate { private static $params; /* * Get the items from the source */ public static function getItems($params, $all = false, $level = 1, $parent_id = 0) { if (empty(self::$params)) { self::$params = $params; } // Get an instance of the generic articles model $articles = self::getArticlesModel(); // Set application parameters in model $app = JFactory::getApplication(); $appParams = $app->getParams(); $articles->setState('params', $appParams); $articles->setState('filter.published', 1); // Access filter $access = !JComponentHelper::getParams('com_content')->get('show_noauth'); $authorised = JAccess::getAuthorisedViewLevels(JFactory::getUser()->get('id')); $articles->setState('filter.access', $access); // Prep for Normal or Dynamic Modes $mode = $params->get('mode', 'normal'); $option = $app->input->get('option', '', 'cmd'); $view = $app->input->get('view', '', 'cmd'); switch ($mode) { case 'dynamic': if ($option === 'com_content') { switch($view) { case 'category': $catids = array($app->input->get('id', 0, 'int')); break; case 'categories': $catids = array($app->input->get('id', 0, 'int')); break; case 'article': if ($params->get('articlesbydate_show_on_article_page', 1)) { $article_id = $app->input->get('id', 0, 'int'); $catid = $app->input->get('catid', 0, 'int'); if (!$catid) { // Get an instance of the generic article model $article = JModelLegacy::getInstance('Article', 'ContentModel', array('ignore_request' => true)); $article->setState('params', $appParams); $article->setState('filter.published', 1); $article->setState('article.id', (int) $article_id); $item = $article->getItem(); $catids = array($item->catid); } else { $catids = array($catid); } } else { // Return right away if show_on_article_page option is off return; } break; case 'featured': default: // Return right away if not on the category or article views return; } } else { // Return right away if not on a com_content page return; } break; case 'normal': default: $catids = $params->get('articlesbydate_catid'); $articles->setState('filter.category_id.include', (bool) $params->get('articlesbydate_category_filtering_type', 1)); break; } // Category filter if ($catids && !empty($catids) && isset($catids[0]) && $catids[0] !== '') { if ($params->get('articlesbydate_show_child_category_articles', 0) && (int) $params->get('articlesbydate_levels', 0) > 0) { // Get an instance of the generic categories model $categories = JModelLegacy::getInstance('Categories', 'ContentModel', array('ignore_request' => true)); $categories->setState('params', $appParams); $levels = $params->get('articlesbydate_levels', 1) ? $params->get('articlesbydate_levels', 1) : 9999; $categories->setState('filter.get_children', $levels); $categories->setState('filter.published', 1); $categories->setState('filter.access', $access); $additional_catids = array(); foreach($catids as $catid) { $categories->setState('filter.parentId', $catid); $recursive = true; $items = $categories->getItems($recursive); if ($items) { foreach($items as $category) { $condition = (($category->level - $categories->getParent()->level) <= $levels); if ($condition) { $additional_catids[] = $category->id; } } } } $catids = array_unique(array_merge($catids, $additional_catids)); } $articles->setState('filter.category_id', $catids); } // Ordering $articles->setState('list.ordering', 'a.created'); $articles->setState('list.direction', $params->get('articlesbydate_article_ordering_direction', 'DESC')); // New Parameters $articles->setState('filter.featured', $params->get('articlesbydate_show_front', 'show')); // $articles->setState('filter.author_id', $params->get('created_by', "")); // $articles->setState('filter.author_id.include', $params->get('author_filtering_type', 1)); // $articles->setState('filter.author_alias', $params->get('created_by_alias', "")); // $articles->setState('filter.author_alias.include', $params->get('author_alias_filtering_type', 1)); $excluded_articles = $params->get('articlesbydate_excluded_articles', ''); if ($excluded_articles) { $excluded_articles = explode("\r\n", $excluded_articles); $articles->setState('filter.article_id', $excluded_articles); $articles->setState('filter.article_id.include', false); // Exclude } $date_filtering = $params->get('articlesbydate_date_filtering', 'off'); if ($date_filtering !== 'off') { $articles->setState('filter.date_filtering', $date_filtering); $articles->setState('filter.date_field', $params->get('articlesbydate_date_field', 'a.created')); $articles->setState('filter.start_date_range', $params->get('articlesbydate_start_date_range', '1000-01-01 00:00:00')); $articles->setState('filter.end_date_range', $params->get('articlesbydate_end_date_range', '9999-12-31 23:59:59')); $articles->setState('filter.relative_date', $params->get('articlesbydate_relative_date', 30)); } // Filter by language $articles->setState('filter.language', $app->getLanguageFilter()); $items = $articles->getItems(); // Prepare data for display using display options $menuItems = Array(); $years = Array(); $months = Array(); $i = 0; $lastitem = 0; $lastyear = 0; $lastmonth = 0; $countitems = 0; $countitemsmonth = 0; foreach ($items as &$item) { $item->slug = $item->id.':'.$item->alias; $item->catslug = $item->catid ? $item->catid .':'.$item->category_alias : $item->catid; if ($access || in_array($item->access, $authorised)) { // We know that user has the privilege to view the article $item->link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug)); } else { // Angie Fixed Routing $app = JFactory::getApplication(); $menu = $app->getMenu(); $menuitems = $menu->getItems('link', 'index.php?option=com_users&view=login'); if(isset($menuitems[0])) { $Itemid = $menuitems[0]->id; } elseif ($app->input->get('Itemid', 0, 'int') > 0) { //use Itemid from requesting page only if there is no existing menu $Itemid = $app->input->get('Itemid', 0, 'int'); } $item->link = JRoute::_('index.php?option=com_users&view=login&Itemid='.$Itemid); } // add the article to the slide $registry = new JRegistry; $registry->loadString($item->images); $item->images = $registry->toArray(); $article_image = null; $menuItem = self::initItem(); $menuItem->path = $params->get('articlesbydate_articleimgsource', 'introimage') != 'text' ? $article_image : null; $menuItem->flink = $menuItem->link = $item->link; $menuItem->ftitle = $item->title; // $menuItem->article->text = JHTML::_('content.prepare', $menuItem_article_text); // $menuItem->desc = $menuItem_article_text; $menuItem->id = $item->id; $menuItem->level = 3 + ($level - 1); // get active state $fulllink = str_replace(JUri::root(true), trim(JUri::root(), '/'), $item->link); $menuItem->isactive = $menuItem->active = trim(JUri::root(), '/') . '/' . trim($fulllink, '/') == JUri::current(); if ($menuItem->isactive) { $menuItem->classe = ' current active'; $menuItem->anchor_css .= ' isactive'; } $year = $item->created; $year = new DateTime($year); $year = $year->format('Y'); if (! in_array($year, $years)) { $years[] = $year; $yearItem = self::initItem(); $yearItem->ftitle = $year; $yearItem->type = 'separator'; $yearItem->level = 1 + ($level - 1); if ($yearItem->level == $level) { $yearItem->parent_id = $parent_id; } if (isset($menuItems[$lastitem])) { $menuItems[$lastyear]->countitems = $countitemsyear; $menuItems[$lastitem]->deeper = ($yearItem->level > $menuItems[$lastitem]->level); $menuItems[$lastitem]->shallower = ($yearItem->level < $menuItems[$lastitem]->level); $menuItems[$lastitem]->level_diff = ($menuItems[$lastitem]->level - $yearItem->level); if ($menuItems[$lastitem]->deeper AND $params->get('layout', 'default') != '_:flatlist') $menuItems[$lastitem]->classe .= " parent"; } $menuItems[$i] = $yearItem; $countitemsyear = 0; $lastitem = $i; $lastyear = $i; $i++; } $month = $item->created; $month = new DateTime($month); $month = $month->format('F'); if (! in_array($year.$month, $months)) { $months[] = $year.$month; $monthItem = self::initItem(); $monthItem->ftitle = JText::_(strtoupper($month)); $monthItem->type = 'separator'; $monthItem->level = 2 + ($level - 1); if (isset($menuItems[$lastitem])) { $menuItems[$lastmonth]->countitems = $countitemsmonth; $menuItems[$lastitem]->deeper = ($monthItem->level > $menuItems[$lastitem]->level); $menuItems[$lastitem]->shallower = ($monthItem->level < $menuItems[$lastitem]->level); $menuItems[$lastitem]->level_diff = ($menuItems[$lastitem]->level - $monthItem->level); if ($menuItems[$lastitem]->deeper AND $params->get('layout', 'default') != '_:flatlist') $menuItems[$lastitem]->classe .= " parent"; } $menuItems[$i] = $monthItem; $countitemsmonth = 0; $lastitem = $i; $lastmonth = $i; $i++; } if ($menuItem->isactive) { $menuItems[$lastyear]->classe = ' current active'; $menuItems[$lastyear]->anchor_css .= ' isactive'; $menuItems[$lastmonth]->classe = ' current active'; $menuItems[$lastmonth]->anchor_css .= ' isactive'; } // test if it is the last item $menuItem->is_end = !isset($menuItems[$i + 1]); $menuItems[$i] = $menuItem; $countitemsyear++; $countitemsmonth++; if (isset($menuItems[$lastitem])) { $menuItems[$lastyear]->countitems = $countitemsyear; $menuItems[$lastmonth]->countitems = $countitemsmonth; $menuItems[$lastitem]->deeper = ($menuItem->level > $menuItems[$lastitem]->level); $menuItems[$lastitem]->shallower = ($menuItem->level < $menuItems[$lastitem]->level); $menuItems[$lastitem]->level_diff = ($menuItems[$lastitem]->level - $menuItem->level); if ($menuItems[$lastitem]->deeper AND $params->get('layout', 'default') != '_:flatlist') $menuItems[$lastitem]->classe .= " parent"; } $lastitem = $i; $i++; } // give the correct deep infos for the last item if (isset($menuItems[$lastitem])) { $menuItems[$lastitem]->level_diff = ($menuItems[$lastitem]->level - 1 + ((int)$level-1)); } return $menuItems; } public static function initItem() { $item = new stdClass(); $item->params = new JRegistry(); $item->deeper = false; $item->shallower = false; $item->level_diff = 0; $item->isthirdparty = false; $item->is_end = false; $item->classe = ''; $item->desc = ''; $item->colwidth = ''; $item->tagcoltitle = 'none'; $item->tagclass = ''; $item->leftmargin = ''; $item->topmargin = ''; $item->submenuwidth = ''; $item->liclass = ''; $item->anchor_css = ''; $item->anchor_title = ''; $item->colbgcolor = ''; $item->menu_image = ''; $item->type = ''; $item->content = ''; $item->rel = ''; $item->link = ''; $item->title = ''; $item->parent_id = ''; $item->id = ''; // special for the thirdparty plugins $item->isthirdparty = true; $item->type = 'thirdparty'; return $item; } private static function getArticlesModel() { $app = Factory::getApplication(); if (version_compare(JVERSION, '4') >= 0) { $factory = $app->bootComponent('com_content')->getMVCFactory(); // Get an instance of the generic articles model $articles = $factory->createModel('Articles', 'Site', ['ignore_request' => true]); } else { // load the content articles file $com_path = JPATH_SITE . '/components/com_content/'; include_once $com_path . 'router.php'; include_once $com_path . 'helpers/route.php'; JModelLegacy::addIncludePath($com_path . '/models', 'ContentModel'); // Get an instance of the generic articles model $articles = JModelLegacy::getInstance('Articles', 'ContentModel', array('ignore_request' => true)); } return $articles; } } PK@A#]�#o,,+maximenuck/articlesbydate/helper/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#]�o+�:maximenuck/articlesbydate/params/articlesbydate_params.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fields name="params"> <fieldset name="editionfieldset" label=""> <field name="articlesbydatespacer" type="maximenuckspacer" label="PLG_MAXIMENUCK_ARTICLES_LABEL" style="title" showon="source:articlesbydate" /> <field name="articlesbydate_show_front" type="maximenuckradio" default="show" label="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_SHOWFEATURED_LABEL" description="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_SHOWFEATURED_DESC" class="btn-group" icon="star.png" showon="source:articlesbydate" > <option value="show">JSHOW </option> <option value="hide">JHIDE </option> <option value="only">MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_ONLYFEATURED_VALUE </option> </field> <field name="articlesbydate_category_filtering_type" type="maximenuckradio" default="1" label="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATFILTERINGTYPE_LABEL" description="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATFILTERINGTYPE_DESC" class="btn-group" icon="folder_wrench.png" showon="source:articlesbydate" > <option value="1">MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_INCLUSIVE_VALUE </option> <option value="0">MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_EXCLUSIVE_VALUE </option> </field> <field name="articlesbydate_catid" type="category" extension="com_content" multiple="true" size="5" label="JCATEGORY" description="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATEGORY_DESC" icon="folder_explore.png" showon="source:articlesbydate" > <option value="">JOPTION_ALL_CATEGORIES</option> </field> <field name="articlesbydate_show_child_category_articlesbydate" type="maximenuckradio" default="0" label="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_SHOWCHILDCATEGORYARTICLES_LABEL" description="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_SHOWCHILDCATEGORYARTICLES_DESC" class="btn-group" icon="folder_table.png" showon="source:articlesbydate" > <option value="1">MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_INCLUDE_VALUE </option> <option value="0">MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_EXCLUDE_VALUE </option> </field> <field name="articlesbydate_levels" type="maximenucktext" default="1" label="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATDEPTH_LABEL" description="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATDEPTH_DESC" icon="application_side_tree.png" showon="source:articlesbydate" /> <field name="articlesbydate_excluded_articlesbydate" type="textarea" cols="10" rows="3" label="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_EXCLUDEDARTICLES_LABEL" description="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_EXCLUDEDARTICLES_DESC" icon="key_delete.png" showon="source:articlesbydate" /> <field name="articlesbydate_filteringspacer6" type="spacer" hr="true" showon="source:articlesbydate" /> <field name="articlesbydate_date_filtering" type="maximenuckradio" default="off" label="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_DATEFILTERING_LABEL" description="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_DATEFILTERING_DESC" class="btn-group" icon="date.png" showon="source:articlesbydate" > <option value="off">MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_OFF_VALUE </option> <option value="range">MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_DATERANGE_VALUE </option> <option value="relative">MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_RELATIVEDAY_VALUE </option> </field> <field name="articlesbydate_date_field" type="maximenucklist" default="a.created" label="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_DATERANGEFIELD_LABEL" description="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_DATERANGEFIELD_DESC" icon="date_next.png" showon="source:articlesbydate" > <option value="a.created">MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_CREATED_VALUE </option> <option value="a.modified">MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_MODIFIED_VALUE </option> <option value="a.publish_up">MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_STARTPUBLISHING_VALUE </option> </field> <field name="articlesbydate_start_date_range" type="calendar" format="%Y-%m-%d %H:%M:%S" label="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_STARTDATE_LABEL" description="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_STARTDATE_DESC" size="22" filter="user_utc" showon="source:articlesbydate" /> <field name="articlesbydate_end_date_range" type="calendar" format="%Y-%m-%d %H:%M:%S" label="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ENDDATE_LABEL" description="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ENDDATE_DESC" size="22" filter="user_utc" showon="source:articlesbydate" /> <field name="articlesbydate_relative_date" type="maximenucktext" default="30" label="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_RELATIVEDATE_LABEL" description="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_RELATIVEDATE_DESC" icon="date_go.png" showon="source:articlesbydate" /> <field name="articlesbydate_article_ordering_direction" type="maximenucklist" default="ASC" label="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ARTICLEORDERINGDIR_LABEL" description="MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ARTICLEORDERINGDIR_DESC" icon="arrow_direction.png" showon="source:articlesbydate" > <option value="DESC">MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_DESCENDING_VALUE </option> <option value="ASC">MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_ASCENDING_VALUE </option> </field> </fieldset> </fields> </form>PK@A#]�#o,,+maximenuck/articlesbydate/params/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#]�V�-maximenuck/articlesbydate/language/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]p�.<<Tmaximenuck/articlesbydate/language/en-GB/en-GB.plg_maximenuck_articlesbydate.sys.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_ARTICLESBYDATE_DESC ="<p>System - Maximenu CK Articles</p><p>The plugin allows you to load the articles by date into Maximenu CK</p>"PK@A#]T�M7��Pmaximenuck/articlesbydate/language/en-GB/en-GB.plg_maximenuck_articlesbydate.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_SOURCE_ARTICLESBYDATE="Articles by date" MAXIMENUCK_ARTICLESBYDATE_DESC ="Maximenu CK Articles. The plugin allows you to load the articles by date into Maximenu CK</p>" MAXIMENUCK_ARTICLESBYDATE_SPACER_MAXIMENUCKARTICLES_PATCH_INSTALLED="Plugin Maximenu CK Articles installed and activated." PLG_MAXIMENUCK_ARTICLES_LABEL="Articles" MAXIMENUCK_ARTICLESBYDATE_AUTOLOADARTICLECATEGORY="Autoload from a category of articles" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_SHOWFEATURED_DESC="Select to Show, Hide, or Only display Featured Articles." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_SHOWFEATURED_LABEL="Featured Articles" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_COUNT_DESC="The number of items to display. The default value of 0 will display all articles." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_COUNT_LABEL="Count" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_SHOWFEATURED_DESC="Select to Show, Hide, or Only display Featured Articles." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_SHOWFEATURED_LABEL="Featured Articles" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_ONLYFEATURED_VALUE="Only" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATFILTERINGTYPE_DESC="Select Inclusive to Include the Selected Categories, Exclusive to Exclude the Selected Categories." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATFILTERINGTYPE_LABEL="Category Filtering Type" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_INCLUSIVE_VALUE="Inclusive" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_EXCLUSIVE_VALUE="Exclusive" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATEGORY_DESC="Please select one or more categories." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_SHOWCHILDCATEGORYARTICLES_DESC="Include or Exclude Articles from Child Categories." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_SHOWCHILDCATEGORYARTICLES_LABEL="Child Category Articles" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_INCLUDE_VALUE="Include" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_EXCLUDE_VALUE="Exclude" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATDEPTH_DESC="The number of child category levels to return." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATDEPTH_LABEL="Category Depth" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_EXCLUDEDARTICLES_DESC="Please enter each Article ID on a new line." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_EXCLUDEDARTICLES_LABEL="Article IDs to Exclude" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_DATEFILTERING_DESC="Select Date Filtering Type." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_DATEFILTERING_LABEL="Date Filtering" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_OFF_VALUE="Off" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_DATERANGE_VALUE="Date Range" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_RELATIVEDAY_VALUE="Relative Date" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_STARTPUBLISHING_VALUE="Start Publishing Date" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_FINISHPUBLISHING_VALUE="Finish Publishing Date" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_CREATED_VALUE="Created Date" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_DATERANGEFIELD_DESC="Select which date field you want the date range to be applied to." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_DATERANGEFIELD_LABEL="Date Range Field" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_MODIFIED_VALUE="Modified Date" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_STARTDATE_DESC="If Date Range is selected above, please enter a Starting Date." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_STARTDATE_LABEL="Start Date Range" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ENDDATE_DESC="If Date Range is selected above, please enter an End Date." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ENDDATE_LABEL="To Date" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_RELATIVEDATE_DESC="If Relative Date is selected above, please enter in a numeric day value. Results will be retrieved relative to the current date and the value you enter." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_RELATIVEDATE_LABEL="Relative Date" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ARTICLEORDERING_DESC="Select which field you would like Articles to be ordered by. Featured Ordering should only be used when Filtering Option for Featured Articles is set to 'Only'." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ARTICLEORDERING_LABEL="Article Field to Order By" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_ORDERING_VALUE="Article Manager Order" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_ORDERINGFEATURED_VALUE="Featured Articles Order" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_HITS_VALUE="Hits" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_ID_VALUE="ID" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ARTICLEORDERINGDIR_DESC="Select the direction you would like Articles to be ordered by." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ARTICLEORDERINGDIR_LABEL="Ordering Direction" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_ASCENDING_VALUE="Ascending" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_DESCENDING_VALUE="Descending" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_MODE_DESC="Please select the mode you would like to use. If Normal Mode is chosen, then simply configure the module and it will display a static list of Articles on the menu items you assign the module to. If Dynamic Mode is chosen, then you can still configure the module normally, however now the Category option will no longer be used. Instead, the module will dynamically detect whether or not you are on a Category view and will display the list of articles within that Category accordingly. When Dynamic Mode is chosen, it is best to leave the module set to display on all pages, as it will decide whether or not to display anything dynamically." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_MODE_LABEL="Mode" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_NORMAL_VALUE="Normal" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_DYNAMIC_VALUE="Dynamic" MAXIMENUCK_ARTICLESBYDATE_ARTICLEIMAGESOURCE_LABEL="Load articles based on" MAXIMENUCK_ARTICLESBYDATE_ARTICLEIMAGESOURCE_DESC="This filter allows you to select if you want to load all the articles from the filter belows and take the first image in the content, or use the 'intro image' option for each article (if no into image is set the article is not added)" MAXIMENUCK_ARTICLESBYDATE_ARTICLEFROMINTROIMAGE_OPTION="Intro image article option" MAXIMENUCK_ARTICLESBYDATE_ARTICLEFROMFIRSTIMAGE_OPTION="First image in the content" MAXIMENUCK_ARTICLESBYDATE_ARTICLEFROMTEXT_OPTION="Only text" PK@A#]�V�3maximenuck/articlesbydate/language/en-GB/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]�V�3maximenuck/articlesbydate/language/fr-FR/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]��� Pmaximenuck/articlesbydate/language/fr-FR/fr-FR.plg_maximenuck_articlesbydate.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_SOURCE_ARTICLESBYDATE="Articles par date" MAXIMENUCK_ARTICLESBYDATE_DESC ="<p>Maximenu CK Articles</p><p>Le plugin permet d'afficher les articles par date dans le module Maximenu CK</p>" PLG_MAXIMENUCK_ARTICLES_LABEL="Articles" MAXIMENUCK_ARTICLESBYDATE_SPACER_MAXIMENUCKARTICLES_PATCH_INSTALLED="Plugin Maximenu CK Articles installé et activé." MAXIMENUCK_ARTICLESBYDATE_AUTOLOADARTICLECATEGORY="Charger automatiquement depuis une catégorie d'articles" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_SHOWFEATURED_DESC="Afficher, masquer, ou afficher uniquement les articles 'en vedette'." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_SHOWFEATURED_LABEL="Articles 'en vedette'" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_COUNT_DESC="Nombre d'articles à afficher.<br />La valeur '0' affiche tous les articles." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_COUNT_LABEL="Nombre" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATFILTERINGTYPE_DESC="Le mode 'Inclure' inclut uniquement les catégories sélectionnées<br />Le mode 'Exclure' exclut toutes les catégories sélectionnées." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATFILTERINGTYPE_LABEL="Filtre de catégorie" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_ONLYFEATURED_VALUE="Uniquement" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATFILTERINGTYPE_DESC="Le mode 'Inclure' inclut uniquement les catégories sélectionnées<br />Le mode 'Exclure' exclut toutes les catégories sélectionnées." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATFILTERINGTYPE_LABEL="Filtre de catégorie" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_INCLUSIVE_VALUE="Inclure" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_EXCLUSIVE_VALUE="Exclure" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATEGORY_DESC="Veuillez sélectionner une ou plusieurs catégories." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_SHOWCHILDCATEGORYARTICLES_DESC="Inclure ou exclure les articles des catégories enfants." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_SHOWCHILDCATEGORYARTICLES_LABEL="Catégories enfants" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_INCLUDE_VALUE="Inclure" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_EXCLUDE_VALUE="Exclure" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATDEPTH_DESC="Nombre de niveaux de catégories enfants à afficher." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_CATDEPTH_LABEL="Niveaux de catégorie" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_EXCLUDEDARTICLES_DESC="Veuillez saisir chaque ID d'article à exclure sur une nouvelle ligne." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_EXCLUDEDARTICLES_LABEL="ID des articles à exclure" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_DATEFILTERING_DESC="Le mode 'Plage' définit les articles à afficher selon une date de départ et de fin.<br />Le mode 'Relative' définit les articles à afficher selon une date relative basée sur les X derniers jours spécifiés." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_DATEFILTERING_LABEL="Filtre de date" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_OFF_VALUE="Désactivé" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_DATERANGE_VALUE="Plage" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_RELATIVEDAY_VALUE="Relative" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_STARTPUBLISHING_VALUE="Date de début de publication" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_FINISHPUBLISHING_VALUE="Date de fin de publication" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_CREATED_VALUE="Date de création" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_DATERANGEFIELD_DESC="Sélectionnez le champ date auquel appliquer la plage de dates." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_DATERANGEFIELD_LABEL="Plage de dates" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_MODIFIED_VALUE="Date de modification" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_STARTDATE_DESC="Si le mode 'Plage' est sélectionné, saisissez une date de début." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_STARTDATE_LABEL="Début de la plage" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ENDDATE_DESC="Si le mode 'Plage' est sélectionné, saisissez une date de fin." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ENDDATE_LABEL="Fin de la plage" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_RELATIVEDATE_DESC="Si le mode 'Relative' est est sélectionné, saisissez une valeur numérique correspondant au nombre de jours à tenir compte à partir de la date du jour consulté." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_RELATIVEDATE_LABEL="Date relative" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ARTICLEORDERING_DESC="Sélectionnez le champ par lequel les articles sont triés." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ARTICLEORDERING_LABEL="Champ de tri" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_ORDERING_VALUE="Ordre de Joomla!" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_ORDERINGFEATURED_VALUE="Articles en vedette" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_HITS_VALUE="Clics" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_ID_VALUE="ID" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ARTICLEORDERINGDIR_DESC="Sélectionnez le sens de tri des articles. Tri par Articles en vedette ne doit être utilisé que lorsque l'option de tri pour les Articles en vedette est paramètré sur 'Uniquement'." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_ARTICLEORDERINGDIR_LABEL="Sens du tri" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_ASCENDING_VALUE="Ascendant" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_DESCENDING_VALUE="Descendant" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_MODE_DESC="Veuillez sélectionner le mode souhaité.<br />Le mode 'Normal' affiche une liste statique d'articles selon les paramètres du module.<br />Le mode 'Dynamique' affiche une liste d'articles selon les paramètres du module mais également selon la page sur laquelle il est affiché (les paramètres sur les catégories ne sont pas pris en compte) ; le module détecte si vous êtes sur un affichage de type 'Catégorie' et adapte la liste avec des articles de cette catégorie." MAXIMENUCK_ARTICLESBYDATE_CATEGORY_FIELD_MODE_LABEL="Mode" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_NORMAL_VALUE="Normal" MAXIMENUCK_ARTICLESBYDATE_CATEGORY_OPTION_DYNAMIC_VALUE="Dynamique" MAXIMENUCK_ARTICLESBYDATE_ARTICLEIMAGESOURCE_LABEL="Charge les articles en se basant sur" MAXIMENUCK_ARTICLESBYDATE_ARTICLEIMAGESOURCE_DESC="Ce filtre vous permet de choisir si vous voulez que les images soient chargées en cherchant la première image contenue dans l'article, ou alors en se basant sur l'option 'image d'intro' de l'article (si l'article n'a aucune image d'intro il ne sera alors pas chargé dans le slideshow)" MAXIMENUCK_ARTICLESBYDATE_ARTICLEFROMINTROIMAGE_OPTION="Image d'intro de l'article" MAXIMENUCK_ARTICLESBYDATE_ARTICLEFROMFIRSTIMAGE_OPTION="Première image contenu dans l'article" MAXIMENUCK_ARTICLESBYDATE_ARTICLEFROMTEXT_OPTION="Seulement le texte"PK@A#]�K/PjjTmaximenuck/articlesbydate/language/fr-FR/fr-FR.plg_maximenuck_articlesbydate.sys.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_ARTICLESBYDATE_DESC ="<p>Système - Maximenu CK Articles par date</p><p>Le plugin permet d'afficher les articles dans le module Maximenu CK</p>"PK@A#],N� � 4maximenuck/hikashop/elements/ckhikashopcategory2.phpnu�[���<?php /** * @copyright Copyright (C) 2016 Cedric KEIFLIN alias ced1870 * http://www.joomlack.fr * @license GNU/GPL * */ defined('JPATH_BASE') or die; jimport('joomla.filesystem.file'); jimport('joomla.form.formfield'); JFormHelper::loadFieldClass('list'); class JFormFieldCkhikashopcategory2 extends JFormFieldList { protected $type = 'ckhikashopcategory2'; protected function getOptions() { // if the component is not installed if (!JFolder::exists(JPATH_ROOT . '/administrator/components/com_hikashop')) { // add the root item $option = new stdClass(); $option->text = JText::_('PLG_MAXIMENUCK_HIKASHOP_NOTFOUND'); $option->value = '0'; $options[] = $option; // Merge any additional options in the XML definition. $options = array_merge(parent::getOptions(), $options); return $options; } // get the categories // $cats = $this->getCategories(); require_once JPATH_ROOT . '/plugins/maximenuck/hikashop/helper/helper_hikashop.php'; $className = 'MaximenuckHelpersourceHikashop'; $params = new JRegistry(); $cats = $className::getItems($params, $all = false); // add the root item $option = new stdClass(); $option->text = JText::_('PLG_MAXIMENUCK_HIKASHOP_PRODUCT_CATEGORY'); $option->value = '2'; $options[] = $option; foreach ($cats as $cat) { $option = new stdClass(); $option->text = str_repeat(" - ", $cat->level) . $cat->name; $option->value = $cat->id; $options[] = $option; } // Merge any additional options in the XML definition. $options = array_merge(parent::getOptions(), $options); return $options; } protected function getCategories() { $db = JFactory::getDBO(); $query = "SELECT category_name as name," . " #__hikashop_category.category_id as id," . " #__hikashop_category.category_depth-1 as level," . " #__hikashop_category.category_parent_id as parent," . " #__hikashop_category.category_ordering as ordering" . " FROM #__hikashop_category" . " WHERE #__hikashop_category.category_type = 'product'" . " AND #__hikashop_category.category_published = 1" . " AND #__hikashop_category.category_depth > 1" . " ORDER BY parent DESC, ordering ASC"; $db->setQuery($query); if ($db->execute()) { $rows = $db->loadObjectList('id'); } else { echo '<p style="color:red;font-weight:bold;">Error loading SQL data : loading the hikashop categories in Maximenu CK</p>'; return false; } $level = 0; $items = array(); $i = 0; foreach ($rows as $k => &$item) { // saves childs into parents items if ($item->level > 1) { $rows[$item->parent]->haschild = 'yes'; if (isset($item->haschild)) { $rows[$item->parent]->enfants.=$item->id . '|' . $item->enfants; } else { if (isset($rows[$item->parent]->enfants)) { $rows[$item->parent]->enfants.=$item->id . '|'; } else { $rows[$item->parent]->enfants=$item->id . '|'; } } } // create childs after respective parent if ($item->level == 1) { //gestion des droits des parents niveau 0 $items[$i] = $item; if (isset($active_category_id) && $active_category_id == $item->id) { // $active_path[] = $item->id; } $item->path = array(); $item->path[] = $item->id; if (isset($item->haschild)) { $childs = explode("|", $item->enfants); foreach ($childs as $c) { if ($c) { $i++; $item->path[] = $rows[$c]->id; $rows[$c]->path = $item->path; $items[$i] = $rows[$c]; } } } } else { $i--; } $i++; } return $items; } } PK@A#]��\ 550maximenuck/hikashop/elements/ckhikashopcheck.phpnu�[���<?php /** * @copyright Copyright (C) 2020 Cedric KEIFLIN alias ced1870 * https://www.joomlack.fr * @license GNU/GPL * */ defined('JPATH_BASE') or die; jimport('joomla.form.formfield'); class JFormFieldCkhikashopcheck extends JFormField { protected $type = 'ckhikashopcheck'; protected function getLabel() { return ''; } protected function getInput() { $html = ''; if (! file_exists(JPATH_ROOT . '/administrator/components/com_maximenuckhikashop/maximenuckhikashop.php')) { $html .= '<div class="ckinfo"><i class="fas fa-exclamation-triangle" style="color:red;"></i><a href="https://www.joomlack.fr/telecharger-extensions-joomla/view_document/76-patch-maximenu-ck-hikashop-joomla-3-x" target="_blank">' . JText::_('MAXIMENUCK_HIKASHOP_COMPONENT_MISSING') . '</a></div>'; } return $html; } } PK@A#]=.;%BB3maximenuck/hikashop/elements/ckhikashopcategory.phpnu�[���<?php /** * @copyright Copyright (C) 2011 Cedric KEIFLIN alias ced1870 * http://www.joomlack.fr * Module Maximenu CK * @license GNU/GPL * */ defined('JPATH_BASE') or die; jimport('joomla.filesystem.file'); jimport('joomla.form.formfield'); JFormHelper::loadFieldClass('list'); class JFormFieldCkhikashopcategory extends JFormFieldList { protected $type = 'ckhikashopcategory'; protected function getOptions() { // if the component is not installed if (!JFolder::exists(JPATH_ROOT . '/administrator/components/com_hikashop') OR !JFile::exists(JPATH_ROOT . '/modules/mod_maximenuck/helper_hikashop.php')) { // add the root item $option = new stdClass(); $option->text = JText::_('MOD_MAXIMENUCK_HIKASHOP_NOTFOUND'); $option->value = '0'; $options[] = $option; // Merge any additional options in the XML definition. $options = array_merge(parent::getOptions(), $options); return $options; } // get the categories form the helper $params = new JRegistry(); require_once JPATH_ROOT . '/modules/mod_maximenuck/helper_hikashop.php'; $cats = modMaximenuckhikashopHelper::getItems($params); // add the root item $option = new stdClass(); $option->text = JText::_('MOD_MAXIMENUCK_HIKASHOP_ROOTNODE'); $option->value = '0'; $options[] = $option; foreach ($cats as $cat) { $option = new stdClass(); $option->text = str_repeat(" - ", $cat->level - 1) . $cat->name; $option->value = $cat->id; $options[] = $option; } // Merge any additional options in the XML definition. $options = array_merge(parent::getOptions(), $options); return $options; } } PK@A#]wtW�'maximenuck/hikashop/elements/index.htmlnu�[���<html><body></body></html>PK@A#]�#o,,%maximenuck/hikashop/helper/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#]]���@�@.maximenuck/hikashop/helper/helper_hikashop.phpnu�[���<?php /** * @name Maximenu CK * @copyright Copyright (C) 2020. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt * @author Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr */ // No direct access defined('_JEXEC') or die; /** * Helper Class. */ class MaximenuckHelpersourceHikashop { private static $params; private static $categorydepth; private static $root; private static $level; /* * Get the items from the source */ public static function getItems($params, $all = false, $level = 1, $parent_id = 0) { if (empty(self::$params)) { self:$params = $params; } // load the hikashop config class if(!include_once(JPATH_ADMINISTRATOR.'/components/com_hikashop/helpers/helper.php')){ echo 'This module can not work without the Hikashop Component'; return; } $app = JFactory::getApplication(); $input = $app->input; self::$level = $level; self::$params = $params; $usehikashopsuffix = $params->get('usehikashopsuffix', '0'); $hikashopimagesuffix = $params->get('hikashopimagesuffix', '_mini'); $usehikashopimages = $params->get('usehikashopimages', '0'); $categoryroot = $params->get('hikashopcategoryroot', '2'); $categorydepth = self::$categorydepth = $params->get('hikashopcategorydepth', '0'); $hikashopshowall = $params->get('hikashopshowall', '1'); $hikashopitemid = $params->get('hikashopitemid', ''); $active_category_id = ($input->get('ctrl', 'category') == 'category') ? $input->get('cid', '0', 'int') : self::getActiveCategory($input->get('cid', '0', 'int')); $categoryClass = hikashop_get('class.category'); // replace the root category with the active category if we want to show only the cats from the active path if (! $hikashopshowall && $active_category_id != 0) { $categoryroot = $active_category_id; } $db = JFactory::getDBO(); $query = "SELECT category_left, category_right, category_depth" . " FROM #__hikashop_category" . " WHERE category_id = " . (int) $categoryroot ; $db->setQuery($query); if ($db->execute()) { $root = self::$root = $db->loadObject(); } else { echo '<p style="color:red;font-weight:bold;">Error loading SQL data : loading the hikashop root category in Maximenu CK</p>'; return false; } // get the list of categories $rows = array(); $activeCategories = array(); self::getCategoryParentRecurse($active_category_id, $activeCategories); self::recurseCategories($categoryroot, 0, $rows, $categorydepth, $active_category_id); $user = JFactory::getUser(); $groups = implode(',', $user->getAuthorisedGroups()); // reset the array index $items = array(); $i = 0; foreach ($rows as $row) { $element = $categoryClass->get($row->category_id); if(!empty($element->category_id)) { $translationHelper = hikashop_get('helper.translation'); $translationHelper->getTranslations($element); $row->category_name = $element->category_name; $row->category_description = $element->category_description; } // check the access level if (isset($rows[$row->parent]) && $rows[$row->parent]->category_access != 'all' && $row->category_access == 'all') $row->category_access = $rows[$row->parent]->category_access; if ($row->category_access != 'all') { if (!count(array_intersect(explode(',',$groups), explode(',',$row->category_access)))) { unset($rows[$row->category_parent_id]); continue; } } // check if there are some products if ($params->get('hikashopshowemptycats', '1') == '0') { $childProducts = self::getChidrenProducts($row->id); if ((int)$row->category_right - (int)$row->category_left == 1 && $childProducts == 0) { unset($rows[$row->category_id]); continue; } } // check if the parent item is published if ($row->category_parent_id != $categoryroot && ! isset($rows[$row->category_parent_id])) {; unset($rows[$row->category_id]); continue; } $items[$i] = $row; $i++; } $configClass = hikashop_get('class.config'); $uploadfoler = $configClass->get('uploadfolder', 'media/com_hikashop/upload/'); foreach ($items as $i => &$item) { $item->params = new JRegistry(); $itemid = $hikashopitemid ? '&Itemid=' . $hikashopitemid : ''; if(empty($element->category_alias)){ $item->alias = $item->category_name; }else{ $item->alias = $item->category_alias; } if(method_exists($app,'stringURLSafe')){ $itemalias = $app->stringURLSafe(strip_tags($item->alias)); }else{ $itemalias = JFilterOutput::stringURLSafe(strip_tags($item->alias)); } // $item->flink = $item->link = JRoute::_('index.php?option=com_hikashop&ctrl=category&task=listing&cid=' . $item->id . '&name=' . $itemalias . $itemid); $item->flink = $item->link = hikashop_contentLink('category&task=listing&cid='.$item->id.'&name='.$itemalias.$itemid,$item); $item->deeper = false; $item->shallower = false; $item->level_diff = 0; $item->isthirdparty = true; if (isset($items[$i - 1])) { $items[$i - 1]->deeper = ($item->level > $items[$i - 1]->level); $items[$i - 1]->shallower = ($item->level < $items[$i - 1]->level); $items[$i - 1]->level_diff = ($items[$i - 1]->level - $item->level); if ($items[$i - 1]->deeper AND $params->get('layout', 'default') != '_:flatlist') $items[$i - 1]->classe .= " parent"; } // test if it is the last item $item->is_end = !isset($items[$i + 1]); // add some classes $item->classe = " item" . $item->id; if (in_array($item->id, $activeCategories)) { $item->classe .= " active"; } if (isset($active_category_id) && $active_category_id == $item->id) { $item->classe .= " current"; } // search for parameters $patterns = "#{maximenu}(.*){/maximenu}#Uis"; $result = preg_match($patterns, stripslashes($item->category_description), $results); $item->desc = ''; $item->colwidth = ''; $item->tagcoltitle = 'none'; $item->tagclass = ''; $item->leftmargin = ''; $item->topmargin = ''; $item->submenuwidth = ''; // old method - kept for backward compatibility if (isset($results[1])) { $hikashopparams = explode('|', $results[1]); for ($j = 0; $j < count($hikashopparams); $j++) { $item->desc = stristr($hikashopparams[$j], "desc=") ? str_replace('desc=', '', $hikashopparams[$j]) : $item->desc; $item->colwidth = stristr($hikashopparams[$j], "col=") ? str_replace('col=', '', $hikashopparams[$j]) : $item->colwidth; $item->tagcoltitle = stristr($hikashopparams[$j], "taghtml=") ? str_replace('taghtml=', '', $hikashopparams[$j]) : $item->tagcoltitle; $item->tagclass = stristr($hikashopparams[$j], "tagclass=") ? ' ' . str_replace('tagclass=', '', $hikashopparams[$j]) : $item->tagclass; $item->leftmargin = stristr($hikashopparams[$j], "leftmargin=") ? str_replace('leftmargin=', '', $hikashopparams[$j]) : $item->leftmargin; $item->topmargin = stristr($hikashopparams[$j], "topmargin=") ? str_replace('topmargin=', '', $hikashopparams[$j]) : $item->topmargin; $item->submenucontainerwidth = stristr($hikashopparams[$j], "submenuwidth=") ? str_replace('submenuwidth=', '', $hikashopparams[$j]) : $item->submenuwidth; $item->createnewrow = stristr($hikashopparams[$j], "newrow") ? 1 : 0; } } // new method to get the settings $item->ckparams = isset($item->ckparams) ? $item->ckparams : ''; $item->maximenuckparams = new JRegistry($item->ckparams); // $item->maximenuckparams = new JRegistry($item->maximenuckparams->get('maximenu', '')); $item->desc = $item->maximenuckparams->get('maximenu_desc', ''); $item->createcolumn = $item->maximenuckparams->get('maximenu_createcolumn', ''); $item->colwidth = $item->maximenuckparams->get('maximenu_colwidth', '180'); $item->tagcoltitle = $item->maximenuckparams->get('maximenu_tagcoltitle', 'none'); $item->tagclass = $item->maximenuckparams->get('maximenu_tagclass', ''); $item->leftmargin = $item->maximenuckparams->get('maximenu_leftmargin', ''); $item->topmargin = $item->maximenuckparams->get('maximenu_topmargin', ''); $item->submenucontainerwidth = $item->maximenuckparams->get('maximenu_submenucontainerwidth', ''); $item->submenucontainerheight = $item->maximenuckparams->get('maximenu_submenucontainerheight', ''); $item->createnewrow = $item->maximenuckparams->get('maximenu_createnewrow', ''); $item->type = $item->maximenuckparams->get('maximenu_type', ''); $item->params->set('maximenu_icon', $item->maximenuckparams->get('maximenu_icon', '')); $item->liclass = $item->maximenuckparams->get('maximenu_liclass', ''); $item->params = $item->maximenuckparams; $item->classe .= $item->tagclass; // variables definition $item->ftitle = $item->title = stripslashes(htmlspecialchars($item->category_name)); $item->type = 'thirdparty'; $item->content = ""; $item->rel = ""; if ($item->level == $level) { $item->parent_id = $parent_id; } // manage the class to show the item on desktop and mobile if ($item->maximenuckparams->get('maximenu_disablemobile') == '1') { $item->classe .= ' nomobileck'; } if ($item->maximenuckparams->get('maximenu_disabledesktop') == '1') { $item->classe .= ' nodesktopck'; } // manage images if (!$usehikashopsuffix) $hikashopimagesuffix = ''; $item->menu_image = ''; if ($usehikashopimages) { $imageurl = $item->file_path ? explode(".", $item->file_path) : ''; $imagename = isset($imageurl[0]) ? $imageurl[0] : ''; $imageext = isset($imageurl[1]) ? $imageurl[1] : ''; if (JFile::exists(JPATH_ROOT . '/' . trim($uploadfoler, '/') . '/' . $imagename . $hikashopimagesuffix . '.' . $imageext)) { $item->menu_image = JUri::root(true) . '/' . trim($uploadfoler, '/') . '/' . $imagename . $hikashopimagesuffix . '.' . $imageext; } } $parentItem = isset($rows[$item->category_parent_id]) ? $rows[$item->category_parent_id] : null; // manage columns // if (! $parent_id) { if ( (isset($item->createcolumn) && $item->createcolumn && $item->colwidth) || (!isset($item->createcolumn) && $item->colwidth) ) { $item->colonne = true; // $parentItem = self::getParentItem($item->parent, $items); if (isset($parentItem->submenuswidth)) { if (! stristr($item->colwidth, '%') && ! stristr($item->colwidth, 'auto')) $parentItem->submenuswidth = strval($parentItem->submenuswidth) + strval($item->colwidth); } else if (isset($parentItem) && $parentItem) { if (! stristr($item->colwidth, '%') && ! stristr($item->colwidth, 'auto')) $parentItem->submenuswidth = strval($item->colwidth); } if (isset($items[$i - 1]) AND $items[$i - 1]->deeper) { $items[$i - 1]->nextcolumnwidth = $item->colwidth; } $item->columnwidth = $item->colwidth; } if (isset($parentItem->submenucontainerwidth) AND $parentItem->submenucontainerwidth) $parentItem->submenuswidth = $parentItem->submenucontainerwidth; // } $item->name = $item->ftitle; // needed for the layouts $item->anchor_css = ''; $item->anchor_title = ''; // $item->type = ''; // get plugin parameters that are used directly in the layout $item->colbgcolor = ''; } // give the correct deep infos for the last item if (isset($items[$i])) { $items[$i]->level_diff = ($items[$i]->level - 1 + ((int)$level-1)); } return $items; } static function getChidrenItems($parent_id) { $db = JFactory::getDBO(); // $query = "SELECT *," // ." 1 as level" // ." FROM #__hikashop_categories" // ." WHERE published = 1" // ." AND parent = " . (int) $parent_id // ." ORDER BY ordering ASC"; $ordering = self::$params->get('hikashoporderby', 'ordering'); // var_dump(self::$params); switch ($ordering) { case 'name' : $orderby = " ORDER BY #__hikashop_category.category_name ASC"; break; case 'order' : default : $orderby = " ORDER BY ordering ASC"; break; } $query = "SELECT *," . " #__hikashop_category.category_id as id," . " #__hikashop_category.category_depth-".self::$root->category_depth."+".((int)self::$level-1)." as level," . " #__hikashop_category.category_parent_id as parent," . " #__hikashop_category.category_ordering as ordering" . " FROM #__hikashop_category" . " LEFT OUTER JOIN #__hikashop_file" . " ON #__hikashop_file.file_ref_id = #__hikashop_category.category_id" . " AND #__hikashop_file.file_type = 'category'" . " WHERE #__hikashop_category.category_type = 'product'" . " AND #__hikashop_category.category_parent_id = " . (int) $parent_id . " AND #__hikashop_category.category_published = 1" . " AND #__hikashop_category.category_depth > 1" . (self::$categorydepth ? " AND #__hikashop_category.category_depth <= " . ((int)self::$categorydepth + (int)self::$root->category_depth) : "") . " AND #__hikashop_category.category_left > " . self::$root->category_left . " AND #__hikashop_category.category_right <" . self::$root->category_right . $orderby; $db->setQuery($query); if ($db->execute()) { $rows = $db->loadObjectList('id'); return $rows; } else { echo '<p style="color:red;font-weight:bold;">Error loading SQL data : loading the hikashop categories in Maximenu CK</p>'; return false; } } static function getChidrenProducts($parent_id) { $db = JFactory::getDBO(); $query = "SELECT count(#__hikashop_product.product_id)" . " FROM #__hikashop_product_category" . " LEFT JOIN #__hikashop_product" . " ON #__hikashop_product_category.product_id = #__hikashop_product.product_id" . " WHERE #__hikashop_product_category.category_id = " . (int) $parent_id . " AND #__hikashop_product.product_published = '1'" ; $db->setQuery($query); if ($db->execute()) { $rows = $db->loadResult(); return $rows; } else { echo '<p style="color:red;font-weight:bold;">Error loading SQL data : loading the hikashop categories in Maximenu CK</p>'; return false; } } static function recurseCategories($category_id, $level, &$sortedCats, $depth, $active_category_id) { $level++; // if (self::hasChildren($category_id)) { $childCats = self::getChidrenItems($category_id); if(!empty($childCats)){ foreach ($childCats as $childCat) { // $childCat->level = $level; $sortedCats[$childCat->id] = $childCat; if ( ($depth > 0 && $level < $depth) || $depth == 0) { self::recurseCategories($childCat->id, $level, $sortedCats, $depth, $active_category_id); } } } // } } static function getCategoryParentRecurse($category_id, &$activeCategories) { $activeCategories[] = $category_id; $db = JFactory::getDBO(); $query = "SELECT #__hikashop_category.category_parent_id as parent" ." FROM #__hikashop_category" ." WHERE #__hikashop_category.category_published = 1" ." AND #__hikashop_category.category_id = " . (int) $category_id; $db->setQuery($query); if ($db->execute()) { $parent_category_id = (int)$db->loadResult(); } else { $parent_category_id = null; } if($parent_category_id){ self::getCategoryParentRecurse($parent_category_id, $activeCategories); } } static function getParentItem($id, $items) { foreach ($items as $item) { if ($item->id == $id) return $item; } return false; } static function getActiveCategory($productid) { $query = "SELECT category_id" . " FROM #__hikashop_product_category" . " WHERE product_id = " . $productid . ";"; $db = JFactory::getDBO(); $db->setQuery($query); if ($db->execute()) { $categoryid = $db->loadResult(); } else { echo '<p style="color:red;font-weight:bold;">Error loading SQL data : loading the active hikashop category in Maximenu CK</p>'; return false; } return $categoryid; } } PK@A#]�w2�� maximenuck/hikashop/hikashop.phpnu�[���<?php /** * @copyright Copyright (C) 2020 Cédric KEIFLIN alias ced1870 * https://www.template-creator.com * https://www.joomlack.fr * @license GNU/GPL * */ defined('_JEXEC') or die('Restricted access'); jimport('joomla.event.plugin'); class plgMaximenuckHikashop extends JPlugin { private $type = 'hikashop'; private $shallLoad = true; function __construct(&$subject, $params) { // does not load if the component is not installed $this->shallLoad = file_exists(JPATH_SITE . '/administrator/components/com_hikashop'); if (! $this->shallLoad) return; parent::__construct($subject, $params); } /* * Initiate the lugin load * * Return mixed */ function registerListeners() { if ($this->shallLoad === true) { parent::registerListeners(); } else { return false; } } /* * Send the infos in the source list to add the type in the plugin options * * Return string the source type */ public function onMaximenuckGetSourceName() { $this->loadLanguage(); return $this->type; } /* * Send the infos in the source list to add the type in the plugin options * * Return string the source type */ public function onMaximenuckGetTypeName() { $this->loadLanguage(); return $this->type; } /* * Display the html code for the item to be used into the frontend page * @param string the item object from simple_html_dom * * Return String the html code */ public function onMaximenuckRenderItemHikashop($item) { require_once(__DIR__ . '/helper/helper_' . $this->type . '.php'); $hikashop = MaximenuckHelpersourceHikashop::getItems($item->params); $html = '<ul class="maximenuck2">'; foreach ($hikashop as $article) { $article->level = $item->level; $article->type = 'article'; $html .= Maximenuck\Helperfront::getHtmlItem($article); } $html .= '</ul>'; return $html; } }PK@A#] J^EE maximenuck/hikashop/hikashop.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3" type="plugin" group="maximenuck" method="upgrade"> <name>Maximenu CK - Hikashop</name> <creationDate>January 2020</creationDate> <copyright>Copyright (C) 2020. All rights reserved.</copyright> <license>GNU General Public License version 2 or later</license> <author>Cedric Keiflin</author> <authorEmail>ced1870@gmail.com</authorEmail> <authorUrl>https://www.joomlack.fr</authorUrl> <version>9.1.25</version> <description>Loader of Hikashop items for Maximenu CK</description> <files> <filename plugin="hikashop">hikashop.php</filename> <folder>elements</folder> <folder>helper</folder> <folder>language</folder> <folder>params</folder> </files> <languages folder="language"> <language tag="en-GB">en-GB/en-GB.plg_maximenuck_hikashop.sys.ini</language> <language tag="en-GB">en-GB/en-GB.plg_maximenuck_hikashop.ini</language> <language tag="fr-FR">fr-FR/fr-FR.plg_maximenuck_hikashop.sys.ini</language> <language tag="fr-FR">fr-FR/fr-FR.plg_maximenuck_hikashop.ini</language> </languages> </extension>PK@A#]�#o,,%maximenuck/hikashop/params/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#] EE<<.maximenuck/hikashop/params/hikashop_params.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fields name="params"> <fieldset name="editionfieldset" label="" addfieldpath="/plugins/maximenuck/hikashop/elements"> <field name="hikashopspacer" type="maximenuckspacer" label="MAXIMENUCK_HIKASHOP_LABEL" style="title" showon="source:hikashop" /> <field name="hikashopcheck" type="ckhikashopcheck" label="MAXIMENUCK_HIKASHOP_LABEL" style="title" showon="source:hikashop" /> <field name="hikashopdocumentation" type="ckdocumentation" url="https://www.joomlack.fr/en/documentation/maximenu-ck" showon="source:hikashop" /> <field name="hikashopitemid" type="sql" default="0" label="PLG_MAXIMENUCK_HIKASHOP_ITEMID_LABEL" description="PLG_MAXIMENUCK_HIKASHOP_ITEMID_DESC" query="SELECT id AS value, title AS hikashopitemid FROM #__menu WHERE link='index.php?option=com_hikashop&view=category&layout=listing' AND published=1 ORDER BY title ASC" icon="application_form_magnify.png" showon="source:hikashop" /> <field name="usehikashopimages" type="maximenuckradio" class="btn-group" default="0" label="PLG_MAXIMENUCK_HIKASHOP_USE_IMAGES_LABEL" description="PLG_MAXIMENUCK_HIKASHOP_USE_IMAGES_DESC" showon="source:hikashop" icon="images.png"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="usehikashopsuffix" type="maximenuckradio" class="btn-group" default="0" label="PLG_MAXIMENUCK_HIKASHOP_USE_SUFFIX_LABEL" description="PLG_MAXIMENUCK_HIKASHOP_USE_SUFFIX_DESC" showon="source:hikashop" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="hikashopimagesuffix" type="maximenucktext" default="_mini" label="PLG_MAXIMENUCK_HIKASHOP_IMAGESUFFIX_LABEL" description="PLG_MAXIMENUCK_HIKASHOP_IMAGESUFFIX_DESC" showon="source:hikashop" icon="image.png" /> <field name="hikashopcategoryroot" type="ckhikashopcategory2" label="PLG_MAXIMENUCK_HIKASHOP_CATEGORYROOT_LABEL" default="0" description="PLG_MAXIMENUCK_HIKASHOP_CATEGORYROOT_DESC" showon="source:hikashop" /> <field name="hikashopcategorydepth" type="maximenucklist" label="PLG_MAXIMENUCK_HIKASHOP_CATEGORYDEPTH_LABEL" default="0" description="PLG_MAXIMENUCK_HIKASHOP_CATEGORYDEPTH_DESC" showon="source:hikashop" > <option value="0">JALL</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> </field> <field name="hikashopshowall" type="maximenuckradio" class="btn-group" label="PLG_MAXIMENUCK_HIKASHOP_SHOWALL_LABEL" default="1" description="PLG_MAXIMENUCK_HIKASHOP_SHOWALL_DESC" showon="source:hikashop" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="hikashopshowemptycats" type="maximenuckradio" class="btn-group" label="PLG_MAXIMENUCK_HIKASHOP_SHOW_EMPTY_CATS_LABEL" default="1" description="PLG_MAXIMENUCK_HIKASHOP_SHOW_EMPTY_CATS_DESC" showon="source:hikashop" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="hikashoporderby" type="maximenucklist" label="PLG_MAXIMENUCK_HIKASHOP_ORDERBY_LABEL" default="0" description="PLG_MAXIMENUCK_HIKASHOP_ORDERBY_DESC" showon="source:hikashop" > <option value="ordering">PLG_MAXIMENUCK_HIKASHOP_ORDER</option> <option value="name">PLG_MAXIMENUCK_HIKASHOP_NAME</option> </field> </fieldset> </fields> </form>PK@A#]�V�'maximenuck/hikashop/language/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]�Y�OOHmaximenuck/hikashop/language/fr-FR/fr-FR.plg_maximenuck_hikashop.sys.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_HIKASHOP_DESC ="Maximenu CK - Hikashop. Le plugin permet d'afficher les produits Hikashop dans le module Maximenu CK"PK@A#]�V�-maximenuck/hikashop/language/fr-FR/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]L�YffDmaximenuck/hikashop/language/fr-FR/fr-FR.plg_maximenuck_hikashop.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_SOURCE_HIKASHOP="Hikashop" MAXIMENUCK_HIKASHOP_DESC ="Maximenu CK - Hikashop. Le plugin permet d'afficher les produits Hikashop dans le module Maximenu CK" MAXIMENUCK_HIKASHOP_TYPE ="Liste d'hikashop d'une catégorie" MAXIMENUCK_HIKASHOP_TYPE_SHORT ="Liste d'hikashop" MAXIMENUCK_HIKASHOP_LABEL="Hikashop" MAXIMENUCK_HIKASHOP_SPACER_MAXIMENUCK_HIKASHOP_PATCH_INSTALLED="Plugin Maximenu CK Hikashop installé et activé." PLG_MAXIMENUCK_HIKASHOP_SPACER_MAXIMENUCKHIKASHOP_PATCH_INSTALLED="Plugin Maximenu CK Hikashop installé et activé." PLG_MAXIMENUCK_HIKASHOP_PRODUCT_CATEGORY="Catégorie produits - racine" PLG_MAXIMENUCK_HIKASHOP_HIKASHOP_NOTFOUND="Hikashop non trouvé" PLG_MAXIMENUCK_HIKASHOP_CATEGORYROOT_LABEL = "Catégorie parente" PLG_MAXIMENUCK_HIKASHOP_CATEGORYROOT_DESC = "Le menu n'affichera que les catégories en dessous de celle-ci" PLG_MAXIMENUCK_HIKASHOP_CATEGORYDEPTH_LABEL = "Profondeur de catégories" PLG_MAXIMENUCK_HIKASHOP_CATEGORYDEPTH_DESC = "Choisir le nombre de niveaux de catégories à afficher" PLG_MAXIMENUCK_HIKASHOP_NOTFOUND = "Hikashop non trouvé" PLG_MAXIMENUCK_HIKASHOP_ROOTNODE = "Racine de Hikashop" PLG_MAXIMENUCK_HIKASHOP_SHOWALL_LABEL = "Montrer tous les sous-menus" PLG_MAXIMENUCK_HIKASHOP_SHOWALL_DESC = "Affiche tous les sous-menus, ou seulement ceux sous l'item actif" PLG_MAXIMENUCK_HIKASHOP_ITEMID_LABEL = "Itemid de menu" PLG_MAXIMENUCK_HIKASHOP_ITEMID_DESC = "Inscrire l'Itemid du lien de menu qui pointe vers un module de contenu hikashop pour les paramètres d'affichage" PLG_MAXIMENUCK_HIKASHOP_USE_IMAGES_LABEL = "Utiliser des images" PLG_MAXIMENUCK_HIKASHOP_USE_IMAGES_DESC = "Affiche des images à gauche des liens dans le menu. Utilise la miniature de la catégorie et le suffixe" PLG_MAXIMENUCK_HIKASHOP_USE_SUFFIX_LABEL = "Utiliser un suffixe" PLG_MAXIMENUCK_HIKASHOP_USE_SUFFIX_DESC = "Ajoute un suffixe aux miniatures des catégories pour insérer les icônes dans le menu" PLG_MAXIMENUCK_HIKASHOP_IMAGESUFFIX_LABEL = "Suffixe des images" PLG_MAXIMENUCK_HIKASHOP_IMAGESUFFIX_DESC = "On peut définir un suffixe à ajouter à l'image miniature de la catégorie, ça permet d'utiliser une autre icône pour le menu" PLG_MAXIMENUCK_HIKASHOP_LABEL="Compatibilité Hikashop" PLG_MAXIMENUCK_HIKASHOP_ITEM_HEADING="Options du lien" PLG_MAXIMENUCK_HIKASHOP_ITEM_DESCRIPTION="Description" PLG_MAXIMENUCK_HIKASHOP_ICON="Classe CSS de l'icône" PLG_MAXIMENUCK_HIKASHOP_SELECT="Selectionner" PLG_MAXIMENUCK_HIKASHOP_TYPE="Type de lien" PLG_MAXIMENUCK_HIKASHOP_LINK="Lien" PLG_MAXIMENUCK_HIKASHOP_NO_LINK="Aucun lien (separator)" PLG_MAXIMENUCK_HIKASHOP_HEADING="En-tête" PLG_MAXIMENUCK_HIKASHOP_LI_CLASS="Classe CSS du lien LI" PLG_MAXIMENUCK_HIKASHOP_COLUMN_HEADING="Options de colonne" PLG_MAXIMENUCK_HIKASHOP_COLUMN_WIDTH="Largeur de colonne" PLG_MAXIMENUCK_HIKASHOP_SUBMENU_HEADING="Options de sous menu" PLG_MAXIMENUCK_HIKASHOP_SUBMENU_CONTAINER_WIDTH="Largeur du sous menu" PLG_MAXIMENUCK_HIKASHOP_LEFT_MARGIN="Marge gauche du sous menu" PLG_MAXIMENUCK_HIKASHOP_TOP_MARGIN="Marge haute du sous menu" PLG_MAXIMENUCK_HIKASHOP_NEW_ROW="Créer une nouvelle rangée" PLG_MAXIMENUCK_HIKASHOP_BUTTON_DESC="Utilisez ce bouton pour charger l'interface de Maximenu CK afin de paramétrer les catégories pour l'affichage dans le menu" PLG_MAXIMENUCK_HIKASHOP_NEW_COLUMN="Créer une nouvelle colonne" PLG_MAXIMENUCK_HIKASHOP_DISABLE_MOBILE="Désactiver pour mobile" PLG_MAXIMENUCK_HIKASHOP_DISABLE_DESKTOP="Désactiver pour ordinateur" PLG_MAXIMENUCK_HIKASHOP_HTMLTAG_LABEL="Tag Html" ;added 2.0.2 PLG_MAXIMENUCK_HIKASHOP_ORDERBY_LABEL="Trier par" PLG_MAXIMENUCK_HIKASHOP_ORDERBY_DESC="Sélectionner le critère à utiliser pour trier les catégories" PLG_MAXIMENUCK_HIKASHOP_ORDER="Ordre" PLG_MAXIMENUCK_HIKASHOP_NAME="Nom" ;added 2.0.5 PLG_MAXIMENUCK_HIKASHOP_SHOW_EMPTY_CATS_LABEL="Montrer les catégories vides" PLG_MAXIMENUCK_HIKASHOP_SHOW_EMPTY_CATS_DESC="Ne charge pas les catégories qui n'ont ni produit ni sous catégorie"PK@A#]�`��$$Hmaximenuck/hikashop/language/en-GB/en-GB.plg_maximenuck_hikashop.sys.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_HIKASHOP_DESC ="Maximenu CK - Hikashop. The plugin allows you to load the Hikashop products into Maximenu CK"PK@A#]O�q Dmaximenuck/hikashop/language/en-GB/en-GB.plg_maximenuck_hikashop.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_SOURCE_HIKASHOP="Hikashop" MAXIMENUCK_HIKASHOP_DESC ="Maximenu CK - Hikashop. The plugin allows you to load the Hikashop into Maximenu CK" MAXIMENUCK_HIKASHOP_TYPE ="Hikashop list from a category" MAXIMENUCK_HIKASHOP_TYPE_SHORT ="Hikashop list" MAXIMENUCK_HIKASHOP_SPACER_MAXIMENUCK_HIKASHOP_PATCH_INSTALLED="Plugin Maximenu CK Hikashop installed and activated." MAXIMENUCK_HIKASHOP_LABEL="Hikashop" PLG_MAXIMENUCK_HIKASHOP_SPACER_MAXIMENUCKHIKASHOP_PATCH_INSTALLED="Plugin Maximenu CK Hikashop installed and activated." PLG_MAXIMENUCK_HIKASHOP_PRODUCT_CATEGORY="Products Root category" PLG_MAXIMENUCK_HIKASHOP_HIKASHOP_NOTFOUND="Hikashop not found" PLG_MAXIMENUCK_HIKASHOP_CATEGORYROOT_LABEL = "Root category" PLG_MAXIMENUCK_HIKASHOP_CATEGORYROOT_DESC = "The menu will only render the categories under the selected root" PLG_MAXIMENUCK_HIKASHOP_CATEGORYDEPTH_LABEL = "Depth of categories" PLG_MAXIMENUCK_HIKASHOP_CATEGORYDEPTH_DESC = "Select how many levels of categories you want to show" PLG_MAXIMENUCK_HIKASHOP_NOTFOUND = "Hikashop not found" PLG_MAXIMENUCK_HIKASHOP_ROOTNODE = "Root of Hikashop" PLG_MAXIMENUCK_HIKASHOP_SHOWALL_LABEL = "Show all submenus" PLG_MAXIMENUCK_HIKASHOP_SHOWALL_DESC = "Display all submenus, or only the ones under the active item" PLG_MAXIMENUCK_HIKASHOP_ITEMID_LABEL = "Menu Itemid" PLG_MAXIMENUCK_HIKASHOP_ITEMID_DESC = "Menu Itemid related to a hikashop content module to retrieve the display parameters" PLG_MAXIMENUCK_HIKASHOP_USE_IMAGES_LABEL = "Use images" PLG_MAXIMENUCK_HIKASHOP_USE_IMAGES_DESC = "Displays images aside the links. Uses thumbnails of the category with the suffix" PLG_MAXIMENUCK_HIKASHOP_USE_SUFFIX_LABEL = "Use a suffix" PLG_MAXIMENUCK_HIKASHOP_USE_SUFFIX_DESC = "Add a suffix to categories thumbnails to add icons in the menu" PLG_MAXIMENUCK_HIKASHOP_IMAGESUFFIX_LABEL = "Images suffix" PLG_MAXIMENUCK_HIKASHOP_IMAGESUFFIX_DESC = "Define a suffix to use with the thumbnail of the category" PLG_MAXIMENUCK_HIKASHOP_LABEL="Hikashop compatibility" PLG_MAXIMENUCK_HIKASHOP_ITEM_HEADING="Menu item Options" PLG_MAXIMENUCK_HIKASHOP_ITEM_DESCRIPTION="Item description" PLG_MAXIMENUCK_HIKASHOP_ICON="Icon css class" PLG_MAXIMENUCK_HIKASHOP_SELECT="Select" PLG_MAXIMENUCK_HIKASHOP_TYPE="Type of item" PLG_MAXIMENUCK_HIKASHOP_LINK="Link" PLG_MAXIMENUCK_HIKASHOP_NO_LINK="No link (separator)" PLG_MAXIMENUCK_HIKASHOP_HEADING="Heading" PLG_MAXIMENUCK_HIKASHOP_LI_CLASS="Li tag css class" PLG_MAXIMENUCK_HIKASHOP_COLUMN_HEADING="Column Options" PLG_MAXIMENUCK_HIKASHOP_COLUMN_WIDTH="Column width" PLG_MAXIMENUCK_HIKASHOP_SUBMENU_HEADING="Submenu Options" PLG_MAXIMENUCK_HIKASHOP_SUBMENU_CONTAINER_WIDTH="Submenu width" PLG_MAXIMENUCK_HIKASHOP_LEFT_MARGIN="Submenu left margin" PLG_MAXIMENUCK_HIKASHOP_TOP_MARGIN="Submenu top margin" PLG_MAXIMENUCK_HIKASHOP_NEW_ROW="Create new row" PLG_MAXIMENUCK_HIKASHOP_BUTTON_DESC="Use this button to load the Maximenu CK interface to manage the menu layout when using the autoload from Hikashop" PLG_MAXIMENUCK_HIKASHOP_NEW_COLUMN="Create new column" PLG_MAXIMENUCK_HIKASHOP_DISABLE_MOBILE="Hide for mobile" PLG_MAXIMENUCK_HIKASHOP_DISABLE_DESKTOP="Hide for desktop" PLG_MAXIMENUCK_HIKASHOP_HTMLTAG_LABEL="Html tag" ;added 2.0.2 PLG_MAXIMENUCK_HIKASHOP_ORDERBY_LABEL="Order by" PLG_MAXIMENUCK_HIKASHOP_ORDERBY_DESC="Select on which criteria the categories shall be ordered" PLG_MAXIMENUCK_HIKASHOP_ORDER="Order" PLG_MAXIMENUCK_HIKASHOP_NAME="Name" ;added 2.0.5 PLG_MAXIMENUCK_HIKASHOP_SHOW_EMPTY_CATS_LABEL="Show empty categories" PLG_MAXIMENUCK_HIKASHOP_SHOW_EMPTY_CATS_DESC="Does not show the categories that have no products and no subcategory"PK@A#]�V�-maximenuck/hikashop/language/en-GB/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]�#o,,'maximenuck/adsmanager/helper/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#]�`�]]2maximenuck/adsmanager/helper/helper_adsmanager.phpnu�[���<?php /** * @name Maximenu CK * @copyright Copyright (C) 2020. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt * @author Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr */ // No direct access defined('_JEXEC') or die; /** * Helper Class. */ class MaximenuckHelpersourceAdsmanager { /** * Get a list of the menu items. * * @param JRegistry $params The module options. * * @return array */ static function getItems(&$params, $all) { jimport('joomla.application.module.helper'); $input = new JInput(); $usesuffix = $params->get('useadsmanagersuffix', '0'); $imagesuffix = $params->get('adsmanagerimagesuffix', '_mini'); $useimages = $params->get('useadsmanagerimages', '0'); $categoryroot = $params->get('adsmanagercategoryroot', '0'); $categorydepth = $params->get('adsmanagercategorydepth', '0'); $shownumberproducts = (bool) $params->get('adsmanagershownumberproducts', '0'); // $itemid = $params->get('adsmanageritemid', ''); require_once(JPATH_SITE . '/components/com_adsmanager/lib/core.php'); require_once (JPATH_ADMINISTRATOR . '/components/com_adsmanager/models/category.php'); // get the model instance from the component $model = JModelLegacy::getInstance('Category', 'AdsmanagerModel'); // get the active path $active_id = $input->get('catid', 0, 'int'); $activepath = self::getActiveTree($active_id); // get the list of items if (($categoryroot && !$all)) { $tree = $model->getCatTree(true, $shownumberproducts); $model->parseTree($categoryroot, $tree, $items, 0); } else { $items = $model->getFlatTree(true, $shownumberproducts); } $lastitem = 0; foreach ($items as $i => &$item) { // check the tree depth if ($categorydepth AND ( ($item->level + 1) > $categorydepth)) { unset($items[$i]); continue; } $item->params = new JRegistry(); $item->flink = TRoute::_("index.php?option=com_adsmanager&view=list&catid=" . $item->id); $item->deeper = false; $item->shallower = false; $item->level_diff = 0; $item->level = $item->level + 1; if (isset($items[$i - 1])) { $items[$i - 1]->deeper = ($item->level > $items[$i - 1]->level); $items[$i - 1]->shallower = ($item->level < $items[$i - 1]->level); $items[$i - 1]->level_diff = ($items[$i - 1]->level - $item->level); if ($items[$i - 1]->deeper AND $params->get('layout', 'default') != '_:flatlist') $items[$i - 1]->classe .= " parent"; } // test if it is the last item $item->is_end = !isset($items[$i + 1]); // manage item class $item->classe = ' item' . $item->id; if (isset($active_id) && $active_id == $item->id) { $item->classe .= ' current'; } if (in_array($item->id, $activepath)) { $item->classe .= ' active'; $item->isactive = true; } // search for parameters $patterns = "#{maximenu}(.*){/maximenu}#Uis"; $result = preg_match($patterns, stripslashes($item->description), $results); $item->desc = ''; $item->colwidth = ''; $item->tagcoltitle = 'none'; $item->tagclass = ''; $item->leftmargin = ''; $item->topmargin = ''; $item->submenuwidth = ''; if (isset($results[1])) { $cat_params = explode('|', $results[1]); for ($j = 0; $j < count($cat_params); $j++) { $item->desc = stristr($cat_params[$j], "desc=") ? str_replace('desc=', '', $cat_params[$j]) : $item->desc; $item->colwidth = stristr($cat_params[$j], "col=") ? str_replace('col=', '', $cat_params[$j]) : $item->colwidth; $item->tagcoltitle = stristr($cat_params[$j], "taghtml=") ? str_replace('taghtml=', '', $cat_params[$j]) : $item->tagcoltitle; $item->tagclass = stristr($cat_params[$j], "tagclass=") ? ' ' . str_replace('tagclass=', '', $cat_params[$j]) : $item->tagclass; $item->leftmargin = stristr($cat_params[$j], "leftmargin=") ? str_replace('leftmargin=', '', $cat_params[$j]) : $item->leftmargin; $item->topmargin = stristr($cat_params[$j], "topmargin=") ? str_replace('topmargin=', '', $cat_params[$j]) : $item->topmargin; $item->submenucontainerwidth = stristr($cat_params[$j], "submenuwidth=") ? str_replace('submenuwidth=', '', $cat_params[$j]) : $item->submenuwidth; } } $item->classe .= $item->tagclass; // variables definition $item->ftitle = stripslashes(htmlspecialchars($item->name, ENT_COMPAT, 'UTF-8', false)); $item->content = ""; $item->rel = ""; // add number of products to the title if ($shownumberproducts ) { $item->ftitle .= '<span class="maximenuck_nbproducts badge" data-number="' . $item->num_ads . '">' . $item->num_ads . '</span>'; } // manage images if (!$usesuffix) { $imagesuffix = ''; } $item->menu_image = ''; if ($useimages) { $item->menu_image = self::getCatImageUrl($item->id, true, $imagesuffix); } // manage columns if ($item->colwidth) { $item->colonne = true; $parentItem = self::getParentItem($item->parent, $items); if (isset($parentItem->submenuswidth)) { $parentItem->submenuswidth = strval($parentItem->submenuswidth) + strval($item->colwidth); } else if ($parentItem) { $parentItem->submenuswidth = strval($item->colwidth); } if (isset($items[$i - 1]) AND $items[$i - 1]->deeper) { $items[$i - 1]->columnwidth = $item->colwidth; } else { $item->columnwidth = $item->colwidth; } } if (isset($parentItem->submenucontainerwidth) AND $parentItem->submenucontainerwidth) $parentItem->submenuswidth = $parentItem->submenucontainerwidth; $item->name = $item->ftitle; // pour compat avec default.php $item->anchor_css = ''; $item->anchor_title = ''; $item->type = ''; $item->liclass = ''; $item->colbgcolor = ''; } // give the correct deep infos for the last item if (isset($items[$i])) { $items[$i]->level_diff = ($items[$i]->level - 1); } return $items; } /** * Get the parent category * * @param int $id The current category. * @param array $items The list of categories object. * * @return object */ static function getParentItem($id, $items) { foreach ($items as $item) { if ($item->id == $id) return $item; } } /** * Get the tree of the current category * * @param int $catid The current category. * * @return array */ static function getActiveTree($catid, $mode='admin') { $model = JModelLegacy::getInstance('Category', 'AdsmanagerModel'); $cats = $model->getCategories(true, $mode); $orderlist = array(); $active_path = array(); if(isset($cats)) { foreach ($cats as $c ) { $orderlist[$c->id] = $c; } if (($catid != -1)&&($catid != 0)) { $active_path[] = (string) $catid; $i=0; $i++; $current = $catid; while($orderlist[$current]->parent != 0) { $current = $orderlist[$current]->parent; $active_path[] = $orderlist[$current]->id; $i++; } } } return $active_path; } /** * Get the image of the current category * * @param int $catid The current category. * * @return mixed */ static function getCatImageUrl($catid, $thumb=false, $imagesuffix='') { $extensions = array("jpg","png","gif"); $image_name = ($thumb == true) ? "cat_t":"cat"; foreach($extensions as $ext) { if (file_exists(JPATH_ROOT."/images/com_adsmanager/categories/".$catid."$image_name.$ext")) return JURI::root(true)."/images/com_adsmanager/categories/".$catid."$image_name$imagesuffix.$ext"; } return false; } } PK@A#]z@b2� � 2maximenuck/adsmanager/params/adsmanager_params.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fields name="params"> <fieldset name="editionfieldset" label="" addfieldpath="/plugins/maximenuck/adsmanager/elements"> <field name="adsmanagerspacer" type="maximenuckspacer" label="MAXIMENUCK_ADSMANAGER_LABEL" style="title" showon="source:adsmanager" /> <field name="useadsmanagerimages" type="maximenuckradio" class="btn-group" default="0" label="MOD_MAXIMENUCK_USEADSMANAGERIMAGES_LABEL" description="MOD_MAXIMENUCK_USEADSMANAGERIMAGES_DESC" showon="source:adsmanager" icon="images.png"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="useadsmanagersuffix" type="maximenuckradio" class="btn-group" default="0" label="MOD_MAXIMENUCK_USEADSMANAGERSUFFIX_LABEL" description="MOD_MAXIMENUCK_USEADSMANAGERSUFFIX_DESC" showon="source:adsmanager" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="adsmanagerimagesuffix" type="maximenucktext" default="_mini" label="MOD_MAXIMENUCK_ADSMANAGERIMAGESUFFIX_LABEL" description="MOD_MAXIMENUCK_ADSMANAGERIMAGESUFFIX_DESC" showon="source:adsmanager" icon="image.png" /> <field name="adsmanagercategoryroot" type="ckadsmanagercategory" label="MOD_MAXIMENUCK_ADSMANAGERCATEGORYROOT_LABEL" default="0" description="MOD_MAXIMENUCK_ADSMANAGERCATEGORYROOT_DESC" showon="source:adsmanager" /> <field name="adsmanagercategorydepth" type="maximenucklist" label="MOD_MAXIMENUCK_ADSMANAGERCATEGORYDEPTH_LABEL" default="0" description="MOD_MAXIMENUCK_ADSMANAGERCATEGORYDEPTH_DESC" showon="source:adsmanager" > <option value="0">JALL</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> </field> <field name="adsmanagershownumberproducts" type="radio" label="MOD_MAXIMENUCK_ADSMANAGERSHOWNUMBERPRODUCTS_LABEL" default="0" description="MOD_MAXIMENUCK_ADSMANAGERSHOWNUMBERPRODUCTS_DESC" showon="source:adsmanager" class="btn-group" > <option value="1">JYES</option> <option value="0">JNO</option> </field> </fieldset> </fields> </form>PK@A#]�#o,,'maximenuck/adsmanager/params/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#]��+RddHmaximenuck/adsmanager/language/en-GB/en-GB.plg_maximenuck_adsmanager.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_SOURCE_ADSMANAGER="Adsmanager" MAXIMENUCK_ADSMANAGER_DESC ="Maximenu CK - Adsmanager. The plugin allows you to load the Adsmanager into Maximenu CK" MAXIMENUCK_ADSMANAGER_TYPE ="Adsmanager list from a category" MAXIMENUCK_ADSMANAGER_TYPE_SHORT ="Adsmanager list" MAXIMENUCK_ADSMANAGER_SPACER_MAXIMENUCK_ADSMANAGER_PATCH_INSTALLED="Plugin Maximenu CK Adsmanager installed and activated." MAXIMENUCK_ADSMANAGER_LABEL="Adsmanager" MOD_MAXIMENUCK_ADSMANAGER="AdsManager" MOD_MAXIMENUCK_ADSMANAGER_NOTFOUND="AdsManager not found" MOD_MAXIMENUCK_ADSMANAGER_ROOTNODE="AdsManager root" MOD_MAXIMENUCK_SPACER_ADSMANAGER="AdsManager Options" MOD_MAXIMENUCK_USEADSMANAGERIMAGES_LABEL = "Use images" MOD_MAXIMENUCK_USEADSMANAGERIMAGES_DESC = "Displays images aside the links. Uses thumbnails of the category with the suffix" MOD_MAXIMENUCK_USEADSMANAGERSUFFIX_LABEL = "Use a suffix" MOD_MAXIMENUCK_USEADSMANAGERSUFFIX_DESC = "Add a suffix to categories thumbnails to add icons in the menu" MOD_MAXIMENUCK_ADSMANAGERIMAGESUFFIX_LABEL = "Images suffix" MOD_MAXIMENUCK_ADSMANAGERIMAGESUFFIX_DESC = "Define a suffix to use with the thumbnail of the category" MOD_MAXIMENUCK_ADSMANAGERCATEGORYROOT_LABEL = "Root category" MOD_MAXIMENUCK_ADSMANAGERCATEGORYROOT_DESC = "The menu will only render the categories under the selected root" MOD_MAXIMENUCK_ADSMANAGERCATEGORYDEPTH_LABEL = "Depth of categories" MOD_MAXIMENUCK_ADSMANAGERCATEGORYDEPTH_DESC = "Select how many levels of categories you want to show" MOD_MAXIMENUCK_ADSMANAGERSHOWNUMBERPRODUCTS_LABEL="Show the number of Ads" MOD_MAXIMENUCK_ADSMANAGERSHOWNUMBERPRODUCTS_DESC="Adds the number of products in each category and subcategories"PK@A#]�V�/maximenuck/adsmanager/language/en-GB/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]�81�**Lmaximenuck/adsmanager/language/en-GB/en-GB.plg_maximenuck_adsmanager.sys.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_ADSMANAGER_DESC ="Maximenu CK - Adsmanager. The plugin allows you to load the Adsmanager products into Maximenu CK"PK@A#]P̈́i88Hmaximenuck/adsmanager/language/fr-FR/fr-FR.plg_maximenuck_adsmanager.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_SOURCE_ADSMANAGER="Adsmanager" MAXIMENUCK_ADSMANAGER_DESC ="Maximenu CK - Adsmanager. Le plugin permet d'afficher les produits Adsmanager dans le module Maximenu CK" MAXIMENUCK_ADSMANAGER_TYPE ="Liste d'adsmanager d'une catégorie" MAXIMENUCK_ADSMANAGER_TYPE_SHORT ="Liste d'adsmanager" MAXIMENUCK_ADSMANAGER_LABEL="Adsmanager" MAXIMENUCK_ADSMANAGER_SPACER_MAXIMENUCK_ADSMANAGER_PATCH_INSTALLED="Plugin Maximenu CK Adsmanager installé et activé." MOD_MAXIMENUCK_ADSMANAGER="AdsManager" MOD_MAXIMENUCK_ADSMANAGER_NOTFOUND = "AdsManager non trouvé" MOD_MAXIMENUCK_ADSMANAGER_ROOTNODE = "Racine de AdsManager" MOD_MAXIMENUCK_SPACER_ADSMANAGER = "Compatibilité AdsManager" MOD_MAXIMENUCK_USEADSMANAGERIMAGES_LABEL = "Utiliser les images" MOD_MAXIMENUCK_USEADSMANAGERIMAGES_DESC = "Affiche des images à gauche des liens dans le menu. Utilise la miniature de la catégorie et le suffixe" MOD_MAXIMENUCK_USEADSMANAGERSUFFIX_LABEL = "Utiliser un suffixe" MOD_MAXIMENUCK_USEADSMANAGERSUFFIX_DESC = "Ajoute un suffixe aux miniatures des catégories pour insérer les icônes dans le menu" MOD_MAXIMENUCK_ADSMANAGERIMAGESUFFIX_LABEL = "Suffixe des images" MOD_MAXIMENUCK_ADSMANAGERIMAGESUFFIX_DESC = "On peut définir un suffixe à ajouter à l'image miniature de la catégorie, ça permet d'utiliser une autre icône pour le menu" MOD_MAXIMENUCK_ADSMANAGERCATEGORYROOT_LABEL = "Catégorie parente" MOD_MAXIMENUCK_ADSMANAGERCATEGORYROOT_DESC = "Le menu n'affichera que les catégories en dessous de celle-ci" MOD_MAXIMENUCK_ADSMANAGERCATEGORYDEPTH_LABEL = "Profondeur de catégories" MOD_MAXIMENUCK_ADSMANAGERCATEGORYDEPTH_DESC = "Choisir le nombre de niveaux de catégories à afficher" MOD_MAXIMENUCK_ADSMANAGERSHOWNUMBERPRODUCTS_LABEL="Montrer le nombre de produits" MOD_MAXIMENUCK_ADSMANAGERSHOWNUMBERPRODUCTS_DESC="Ajoute le nombre de chaque catégorie et sous catégories après le titre"PK@A#]�V�/maximenuck/adsmanager/language/fr-FR/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]��8UULmaximenuck/adsmanager/language/fr-FR/fr-FR.plg_maximenuck_adsmanager.sys.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_ADSMANAGER_DESC ="Maximenu CK - Adsmanager. Le plugin permet d'afficher les produits Adsmanager dans le module Maximenu CK"PK@A#]�V�)maximenuck/adsmanager/language/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]��v��$maximenuck/adsmanager/adsmanager.phpnu�[���<?php /** * @copyright Copyright (C) 2020 Cédric KEIFLIN alias ced1870 * https://www.template-creator.com * https://www.joomlack.fr * @license GNU/GPL * */ defined('_JEXEC') or die('Restricted access'); jimport('joomla.event.plugin'); class plgMaximenuckAdsmanager extends JPlugin { private $type = 'adsmanager'; private $shallLoad = true; function __construct(&$subject, $params) { // does not load if the component is not installed $this->shallLoad = file_exists(JPATH_SITE . '/administrator/components/com_adsmanager'); if (! $this->shallLoad) return; parent::__construct($subject, $params); } /* * Initiate the lugin load * * Return mixed */ function registerListeners() { if ($this->shallLoad === true) { parent::registerListeners(); } else { return false; } } /* * Send the infos in the source list to add the type in the plugin options * * Return string the source type */ public function onMaximenuckGetSourceName() { $this->loadLanguage(); return $this->type; } /* * Send the infos in the source list to add the type in the plugin options * * Return string the source type */ public function onMaximenuckGetTypeName() { $this->loadLanguage(); return $this->type; } /* * Display the html code for the item to be used into the frontend page * @param string the item object from simple_html_dom * * Return String the html code */ public function onMaximenuckRenderItemAdsmanager($item) { require_once(__DIR__ . '/helper/helper_' . $this->type . '.php'); $adsmanager = MaximenuckHelpersourceAdsmanager::getItems($item->params); $html = '<ul class="maximenuck2">'; foreach ($adsmanager as $article) { $article->level = $item->level; $article->type = 'article'; $html .= Maximenuck\Helperfront::getHtmlItem($article); } $html .= '</ul>'; return $html; } }PK@A#]Q;�UU$maximenuck/adsmanager/adsmanager.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3" type="plugin" group="maximenuck" method="upgrade"> <name>Maximenu CK - Adsmanager</name> <creationDate>January 2020</creationDate> <copyright>Copyright (C) 2020. All rights reserved.</copyright> <license>GNU General Public License version 2 or later</license> <author>Cedric Keiflin</author> <authorEmail>ced1870@gmail.com</authorEmail> <authorUrl>https://www.joomlack.fr</authorUrl> <version>9.1.21</version> <description>Loader of Adsmanager items for Maximenu CK</description> <files> <filename plugin="adsmanager">adsmanager.php</filename> <folder>elements</folder> <folder>helper</folder> <folder>language</folder> <folder>params</folder> </files> <languages folder="language"> <language tag="en-GB">en-GB/en-GB.plg_maximenuck_adsmanager.sys.ini</language> <language tag="en-GB">en-GB/en-GB.plg_maximenuck_adsmanager.ini</language> <language tag="fr-FR">fr-FR/fr-FR.plg_maximenuck_adsmanager.sys.ini</language> <language tag="fr-FR">fr-FR/fr-FR.plg_maximenuck_adsmanager.ini</language> </languages> </extension>PK@A#]wtW�)maximenuck/adsmanager/elements/index.htmlnu�[���<html><body></body></html>PK@A#]@��7maximenuck/adsmanager/elements/ckadsmanagercategory.phpnu�[���<?php /** * @copyright Copyright (C) 2014 Cedric KEIFLIN alias ced1870 * http://www.joomlack.fr * @license GNU/GPL * */ defined('JPATH_BASE') or die; jimport('joomla.filesystem.file'); jimport('joomla.form.formfield'); JFormHelper::loadFieldClass('list'); class JFormFieldCkadsmanagercategory extends JFormFieldList { protected $type = 'ckadsmanagercategory'; protected function getOptions() { // if the component is not installed if (!JFolder::exists(JPATH_ROOT . '/administrator/components/com_adsmanager')) { // add the root item $option = new stdClass(); $option->text = JText::_('MOD_MAXIMENUCK_ADSMANAGER_NOTFOUND'); $option->value = '0'; $options[] = $option; // Merge any additional options in the XML definition. $options = array_merge(parent::getOptions(), $options); return $options; } // get the categories form the helper $params = new JRegistry(); require_once(JPATH_SITE . '/components/com_adsmanager/lib/core.php'); require_once (JPATH_ADMINISTRATOR . '/components/com_adsmanager/models/category.php'); // get the model instance from the component $model = JModelLegacy::getInstance('Category', 'AdsmanagerModel'); // get the list of items $cats = $model->getFlatTree(); // add the root item $option = new stdClass(); $option->text = JText::_('MOD_MAXIMENUCK_ADSMANAGER_ROOTNODE'); $option->value = '0'; $options[] = $option; foreach ($cats as $cat) { $option = new stdClass(); $option->text = str_repeat(" - ", $cat->level + 1) . $cat->name; $option->value = $cat->id; $options[] = $option; } // Merge any additional options in the XML definition. $options = array_merge(parent::getOptions(), $options); return $options; } } PK@A#]wtW�)maximenuck/categories/elements/index.htmlnu�[���<html><body></body></html>PK@A#]��992maximenuck/categories/params/categories_params.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fields name="params"> <fieldset name="editionfieldset" label=""> <field name="categoriesspacer" type="maximenuckspacer" label="PLG_MAXIMENUCK_CATEGORIES_LABEL" style="title" showon="source:categories" /> <field name="categories_catid" type="category" extension="com_content" multiple="false" size="5" label="JCATEGORY" description="MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATEGORY_DESC" icon="folder_explore.png" showon="source:categories" > <option value="">JOPTION_ALL_CATEGORIES</option> </field> <field name="categories_show_articles" type="maximenuckradio" default="1" label="MAXIMENUCK_CATEGORIES_SHOWARTICLES_LABEL" description="MAXIMENUCK_CATEGORIES_SHOWARTICLES_DESC" class="btn-group" icon="folder_table.png" showon="source:categories" > <option value="1">JYES </option> <option value="0">JNO </option> </field> <field name="categories_levels" type="maximenucktext" default="0" label="MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATDEPTH_LABEL" description="MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATDEPTH_DESC" icon="application_side_tree.png" showon="source:categories" /> </fieldset> </fields> </form>PK@A#]�#o,,'maximenuck/categories/params/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#]�#o,,'maximenuck/categories/helper/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK@A#]���&&2maximenuck/categories/helper/helper_categories.phpnu�[���<?php /** * @name Maximenu CK * @copyright Copyright (C) 2018. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt * @author Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr */ // No direct access defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Router\Route; use Joomla\Component\Content\Administrator\Extension\ContentComponent; use Joomla\Component\Content\Site\Helper\RouteHelper; use Joomla\Component\Content\Site\Helper\AssciationHelper; /** * Helper Class. */ class MaximenuckHelpersourceCategories { private static $params; private static $flexi_exists; /* * Get the items from the source */ public static function getItems($params, $all = false, $level = 1, $parent_id = 0) { if (empty(self::$params)) { self::$params = $params; } $input = JFactory::getApplication()->input; $options = array(); $options['countItems'] = $params->get('numitems', 0); $categories = JCategories::getInstance('Content', $options); $category = $categories->get($params->get('categories_catid', 'root')); $categories_items = $category->getChildren(true); // if no categories found, only list the articles if (empty($categories_items)) { $i = 1; $menuItem = self::initItem(); $menuItems = self::getArticles($category->id, $level-1, $i); } else { // load the main helper include_once JPATH_ROOT . '/modules/mod_maximenuck/helper.php'; // load Flexicontent if exists $flexi_path = JPATH_SITE . '/components/com_flexicontent/'; self::$flexi_exists = file_exists($flexi_path); if (self::$flexi_exists) { require_once(JPATH_ADMINISTRATOR . '/components/com_flexicontent/defineconstants.php'); require_once($flexi_path . 'helpers/route.php'); } // List the active items $activeCategories = array(); $isArticle = $input->get('view', 'article') == 'article'; if ($isArticle) { $active_category_id = $input->get('catid', '0', 'int'); } else { $active_category_id = $input->get('id', '0', 'int'); } self::getCategoryParentRecurse($active_category_id, $activeCategories); // Prepare data for display using display options $menuItems = Array(); $i = 0; $lastitem = 0; $countitems = 0; $diff_level = 1 - $categories_items[0]->level; foreach ($categories_items as &$item) { if (self::$flexi_exists) { $item->link = JRoute::_(FlexicontentHelperRoute::getCategoryRoute($item->id)); } else { $item->link = JRoute::_(ContentHelperRoute::getCategoryRoute($item->id)); } $article_image = null; $menuItem = self::initItem(); $menuItem->path = null; $menuItem->flink = $menuItem->link = $item->link; $menuItem->ftitle = $item->title; // $menuItem->article->text = JHTML::_('content.prepare', $menuItem_article_text); // $menuItem->desc = $menuItem_article_text; $menuItem->id = $item->id; $menuItem->level = $item->level + $diff_level + ($level - 1); if ($menuItem->level == $level) { $menuItem->parent_id = $parent_id; } if ($params->get('categories_levels', 0) > 0 && $params->get('categories_levels', 0) < $menuItem->level) continue; // get active state $fulllink = str_replace(JUri::root(true), trim(JUri::root(), '/'), $item->link); $menuItem->isactive = $menuItem->active = $fulllink == JUri::current(); if (in_array($item->id, $activeCategories)) { $menuItem->isactive = true; } if ($menuItem->isactive) { $menuItem->classe = ' current active'; $menuItem->anchor_css .= ' isactive'; } $nbarticles = 0; if ($params->get('categories_show_articles', 1) == 1) { $menuItem->articles = self::getArticles($menuItem->id, $menuItem->level, $i); $nbarticles = count($menuItem->articles); } if ($nbarticles > 0) $menuItem->classe .= " parent"; $menuItems[$i] = $menuItem; if (isset($menuItems[$lastitem])) { $menuItems[$lastitem]->deeper = ($menuItem->level > $menuItems[$lastitem]->level); $menuItems[$lastitem]->shallower = ($menuItem->level < $menuItems[$lastitem]->level); $menuItems[$lastitem]->level_diff = ($menuItems[$lastitem]->level - $menuItem->level); if ($menuItems[$lastitem]->deeper AND $params->get('layout', 'default') != '_:flatlist') { $menuItems[$lastitem]->classe .= " parent"; } } if ($params->get('categories_show_articles', 1) == 1 && $nbarticles > 0) { $menuItems = array_merge($menuItems, $menuItem->articles); $menuItems[$i]->deeper = true; $menuItems[$i]->level_diff = -1; $i += $nbarticles; } else { $nbarticles = 0; } $lastitem = $i; $i++; } if (isset($menuItems[$lastitem])) { $menuItems[$lastitem]->deeper = ($menuItem->level > $menuItems[$lastitem]->level); $menuItems[$lastitem]->shallower = ($menuItem->level < $menuItems[$lastitem]->level); $menuItems[$lastitem]->level_diff = ($menuItems[$lastitem]->level - $menuItem->level); } } return $menuItems; } private static function getArticles($catid, $level, &$i) { $params = self::$params; $articles = self::getArticlesModel(); // Set application parameters in model $app = JFactory::getApplication(); $appParams = $app->getParams(); $articles->setState('params', $appParams); $articles->setState('filter.published', 1); // Access filter $access = !JComponentHelper::getParams('com_content')->get('show_noauth'); $authorised = JAccess::getAuthorisedViewLevels(JFactory::getUser()->get('id')); $articles->setState('filter.access', $access); // Ordering $articles->setState('list.ordering', $params->get('categories_ordering', 'a.ordering')); $articles->setState('list.direction', $params->get('categories_ordering_direction', 'ASC')); // Filter by language $articles->setState('filter.language', $app->getLanguageFilter()); $articles->setState('filter.category_id', $catid); $items = $articles->getItems(); $menuItems = Array(); $j = 1; foreach ($items as &$item) { if ($item->catid != $catid) continue; $item->slug = $item->id.':'.$item->alias; $item->catslug = $item->catid ? $item->catid .':'.$item->category_alias : $item->catid; if (self::$flexi_exists) { $item->link = JRoute::_(FlexicontentHelperRoute::getItemRoute($item->slug, $item->catslug)); } else { $item->link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug)); } $menuItem = self::initItem(); $menuItem->path = null; $menuItem->flink = $menuItem->link = $item->link; $menuItem->ftitle = $item->title; // $menuItem->article->text = JHTML::_('content.prepare', $menuItem_article_text); // $menuItem->desc = $menuItem_article_text; $menuItem->id = $item->id; $menuItem->level = $level + 1; $menuItem->isthirdparty = true; $menuItem->type = 'thirdparty'; // get active state $fulllink = trim(JUri::root(), '/') . str_replace(JUri::root(true), '', $item->link); $menuItem->isactive = $menuItem->active = $fulllink == JUri::current(); if ($menuItem->isactive) { $menuItem->classe = ' current active'; $menuItem->anchor_css .= ' isactive'; } $menuItems[$i + $j] = $menuItem; $j++; } return $menuItems; } static function getCategoryParentRecurse($category_id, &$activeCategories) { $activeCategories[] = $category_id; $db = JFactory::getDBO(); $query = "SELECT parent_id" ." FROM #__categories" ." WHERE published = 1" ." AND id = " . (int) $category_id; $db->setQuery($query); if ($db->execute()) { $parent_category_id = (int)$db->loadResult(); } else { $parent_category_id = null; } if($parent_category_id){ self::getCategoryParentRecurse($parent_category_id, $activeCategories); } } public static function initItem() { $item = new stdClass(); $item->params = new JRegistry(); $item->deeper = false; $item->shallower = false; $item->level_diff = 0; $item->isthirdparty = false; $item->is_end = false; $item->classe = ''; $item->desc = ''; $item->colwidth = ''; $item->tagcoltitle = 'none'; $item->tagclass = ''; $item->leftmargin = ''; $item->topmargin = ''; $item->submenuwidth = ''; $item->liclass = ''; $item->anchor_css = ''; $item->anchor_title = ''; $item->colbgcolor = ''; $item->menu_image = ''; $item->type = ''; $item->content = ''; $item->rel = ''; $item->link = ''; $item->title = ''; $item->parent_id = ''; // special for the thirdparty plugins $item->isthirdparty = true; $item->type = 'thirdparty'; return $item; } private static function getArticlesModel() { $app = Factory::getApplication(); if (version_compare(JVERSION, '4') >= 0) { $factory = $app->bootComponent('com_content')->getMVCFactory(); // Get an instance of the generic articles model $articles = $factory->createModel('Articles', 'Site', ['ignore_request' => true]); } else { // load the content articles file $com_path = JPATH_SITE . '/components/com_content/'; include_once $com_path . 'router.php'; include_once $com_path . 'helpers/route.php'; JModelLegacy::addIncludePath($com_path . '/models', 'ContentModel'); // Get an instance of the generic articles model $articles = JModelLegacy::getInstance('Articles', 'ContentModel', array('ignore_request' => true)); } return $articles; } } PK@A#]�£!RR$maximenuck/categories/categories.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3" type="plugin" group="maximenuck" method="upgrade"> <name>Maximenu CK - Categories</name> <creationDate>June 2020</creationDate> <copyright>Copyright (C) 2020. All rights reserved.</copyright> <license>GNU General Public License version 2 or later</license> <author>Cedric Keiflin</author> <authorEmail>ced1870@gmail.com</authorEmail> <authorUrl>https://www.joomlack.fr</authorUrl> <version>9.1.25</version> <description>Loader of Categories items for Maximenu CK</description> <files> <filename plugin="categories">categories.php</filename> <folder>elements</folder> <folder>helper</folder> <folder>language</folder> <folder>params</folder> </files> <languages folder="language"> <language tag="en-GB">en-GB/en-GB.plg_maximenuck_categories.sys.ini</language> <language tag="en-GB">en-GB/en-GB.plg_maximenuck_categories.ini</language> <language tag="fr-FR">fr-FR/fr-FR.plg_maximenuck_categories.sys.ini</language> <language tag="fr-FR">fr-FR/fr-FR.plg_maximenuck_categories.ini</language> </languages> </extension>PK@A#]�V�)maximenuck/categories/language/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]�V�/maximenuck/categories/language/en-GB/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]���88Lmaximenuck/categories/language/en-GB/en-GB.plg_maximenuck_categories.sys.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_CATEGORIES_DESC ="<p>System - Maximenu CK Articles</p><p>The plugin allows you to load the articles by date into Maximenu CK</p>"PK@A#]G[*44Hmaximenuck/categories/language/en-GB/en-GB.plg_maximenuck_categories.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_SOURCE_CATEGORIES="Categories" MAXIMENUCK_CATEGORIES_DESC ="Maximenu CK Articles. The plugin allows you to load the articles by category into Maximenu CK</p>" MAXIMENUCK_CATEGORIES_SPACER_MAXIMENUCKARTICLES_PATCH_INSTALLED="Plugin Maximenu CK catégories installed and activated." MAXIMENUCK_CATEGORIES_AUTOLOADARTICLECATEGORY="Autoload from a category of articles" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_SHOWFEATURED_DESC="Select to Show, Hide, or Only display Featured Articles." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_SHOWFEATURED_LABEL="Featured Articles" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_COUNT_DESC="The number of items to display. The default value of 0 will display all articles." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_COUNT_LABEL="Count" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_SHOWFEATURED_DESC="Select to Show, Hide, or Only display Featured Articles." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_SHOWFEATURED_LABEL="Featured Articles" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_ONLYFEATURED_VALUE="Only" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATFILTERINGTYPE_DESC="Select Inclusive to Include the Selected Categories, Exclusive to Exclude the Selected Categories." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATFILTERINGTYPE_LABEL="Category Filtering Type" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_INCLUSIVE_VALUE="Inclusive" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_EXCLUSIVE_VALUE="Exclusive" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATEGORY_DESC="Please select one or more categories." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_SHOWCHILDCATEGORYARTICLES_DESC="Include or Exclude Articles from Child Categories." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_SHOWCHILDCATEGORYARTICLES_LABEL="Child Category Articles" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_INCLUDE_VALUE="Include" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_EXCLUDE_VALUE="Exclude" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATDEPTH_DESC="The number of child category levels to return." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATDEPTH_LABEL="Category Depth" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_EXCLUDEDARTICLES_DESC="Please enter each Article ID on a new line." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_EXCLUDEDARTICLES_LABEL="Article IDs to Exclude" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_DATEFILTERING_DESC="Select Date Filtering Type." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_DATEFILTERING_LABEL="Date Filtering" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_OFF_VALUE="Off" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_DATERANGE_VALUE="Date Range" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_RELATIVEDAY_VALUE="Relative Date" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_STARTPUBLISHING_VALUE="Start Publishing Date" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_FINISHPUBLISHING_VALUE="Finish Publishing Date" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_CREATED_VALUE="Created Date" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_DATERANGEFIELD_DESC="Select which date field you want the date range to be applied to." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_DATERANGEFIELD_LABEL="Date Range Field" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_MODIFIED_VALUE="Modified Date" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_STARTDATE_DESC="If Date Range is selected above, please enter a Starting Date." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_STARTDATE_LABEL="Start Date Range" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_ENDDATE_DESC="If Date Range is selected above, please enter an End Date." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_ENDDATE_LABEL="To Date" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_RELATIVEDATE_DESC="If Relative Date is selected above, please enter in a numeric day value. Results will be retrieved relative to the current date and the value you enter." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_RELATIVEDATE_LABEL="Relative Date" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_ARTICLEORDERING_DESC="Select which field you would like Articles to be ordered by. Featured Ordering should only be used when Filtering Option for Featured Articles is set to 'Only'." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_ARTICLEORDERING_LABEL="Article Field to Order By" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_ORDERING_VALUE="Article Manager Order" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_ORDERINGFEATURED_VALUE="Featured Articles Order" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_HITS_VALUE="Hits" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_ID_VALUE="ID" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_ARTICLEORDERINGDIR_DESC="Select the direction you would like Articles to be ordered by." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_ARTICLEORDERINGDIR_LABEL="Ordering Direction" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_ASCENDING_VALUE="Ascending" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_DESCENDING_VALUE="Descending" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_MODE_DESC="Please select the mode you would like to use. If Normal Mode is chosen, then simply configure the module and it will display a static list of Articles on the menu items you assign the module to. If Dynamic Mode is chosen, then you can still configure the module normally, however now the Category option will no longer be used. Instead, the module will dynamically detect whether or not you are on a Category view and will display the list of articles within that Category accordingly. When Dynamic Mode is chosen, it is best to leave the module set to display on all pages, as it will decide whether or not to display anything dynamically." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_MODE_LABEL="Mode" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_NORMAL_VALUE="Normal" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_DYNAMIC_VALUE="Dynamic" MAXIMENUCK_CATEGORIES_ARTICLEIMAGESOURCE_LABEL="Load articles based on" MAXIMENUCK_CATEGORIES_ARTICLEIMAGESOURCE_DESC="This filter allows you to select if you want to load all the articles from the filter belows and take the first image in the content, or use the 'intro image' option for each article (if no into image is set the article is not added)" MAXIMENUCK_CATEGORIES_ARTICLEFROMINTROIMAGE_OPTION="Intro image article option" MAXIMENUCK_CATEGORIES_ARTICLEFROMFIRSTIMAGE_OPTION="First image in the content" MAXIMENUCK_CATEGORIES_ARTICLEFROMTEXT_OPTION="Only text" PLG_MAXIMENUCK_CATEGORIES_LABEL="Categories" MAXIMENUCK_CATEGORIES_SHOWARTICLES_LABEL="Show articles" MAXIMENUCK_CATEGORIES_SHOWARTICLES_DESC="Show articles in each subcategory, or only the subcategory" PK@A#]iGi�ffLmaximenuck/categories/language/fr-FR/fr-FR.plg_maximenuck_categories.sys.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_CATEGORIES_DESC ="<p>Système - Maximenu CK Articles par date</p><p>Le plugin permet d'afficher les articles dans le module Maximenu CK</p>"PK@A#].h����Hmaximenuck/categories/language/fr-FR/fr-FR.plg_maximenuck_categories.ininu�[���; @copyright Copyright (C) 2017 Cédric KEIFLIN alias ced1870 ; https://www.template-creator.com ; https://www.joomlack.fr ; @license GNU/GPL ; Double quotes in the values have to be formatted as "_QQ_" MAXIMENUCK_SOURCE_CATEGORIES="Catégories" MAXIMENUCK_CATEGORIES_DESC ="<p>Maximenu CK Articles</p><p>Le plugin permet d'afficher les articles par catégorie dans le module Maximenu CK</p>" MAXIMENUCK_CATEGORIES_SPACER_MAXIMENUCKARTICLES_PATCH_INSTALLED="Plugin Maximenu CK catégories installé et activé." MAXIMENUCK_CATEGORIES_AUTOLOADARTICLECATEGORY="Charger automatiquement depuis une catégorie d'articles" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_SHOWFEATURED_DESC="Afficher, masquer, ou afficher uniquement les articles 'en vedette'." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_SHOWFEATURED_LABEL="Articles 'en vedette'" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_COUNT_DESC="Nombre d'articles à afficher.<br />La valeur '0' affiche tous les articles." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_COUNT_LABEL="Nombre" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATFILTERINGTYPE_DESC="Le mode 'Inclure' inclut uniquement les catégories sélectionnées<br />Le mode 'Exclure' exclut toutes les catégories sélectionnées." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATFILTERINGTYPE_LABEL="Filtre de catégorie" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_ONLYFEATURED_VALUE="Uniquement" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATFILTERINGTYPE_DESC="Le mode 'Inclure' inclut uniquement les catégories sélectionnées<br />Le mode 'Exclure' exclut toutes les catégories sélectionnées." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATFILTERINGTYPE_LABEL="Filtre de catégorie" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_INCLUSIVE_VALUE="Inclure" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_EXCLUSIVE_VALUE="Exclure" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATEGORY_DESC="Veuillez sélectionner une ou plusieurs catégories." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_SHOWCHILDCATEGORYARTICLES_DESC="Inclure ou exclure les articles des catégories enfants." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_SHOWCHILDCATEGORYARTICLES_LABEL="Catégories enfants" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_INCLUDE_VALUE="Inclure" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_EXCLUDE_VALUE="Exclure" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATDEPTH_DESC="Nombre de niveaux de catégories enfants à afficher." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_CATDEPTH_LABEL="Niveaux de catégorie" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_EXCLUDEDARTICLES_DESC="Veuillez saisir chaque ID d'article à exclure sur une nouvelle ligne." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_EXCLUDEDARTICLES_LABEL="ID des articles à exclure" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_DATEFILTERING_DESC="Le mode 'Plage' définit les articles à afficher selon une date de départ et de fin.<br />Le mode 'Relative' définit les articles à afficher selon une date relative basée sur les X derniers jours spécifiés." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_DATEFILTERING_LABEL="Filtre de date" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_OFF_VALUE="Désactivé" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_DATERANGE_VALUE="Plage" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_RELATIVEDAY_VALUE="Relative" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_STARTPUBLISHING_VALUE="Date de début de publication" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_FINISHPUBLISHING_VALUE="Date de fin de publication" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_CREATED_VALUE="Date de création" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_DATERANGEFIELD_DESC="Sélectionnez le champ date auquel appliquer la plage de dates." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_DATERANGEFIELD_LABEL="Plage de dates" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_MODIFIED_VALUE="Date de modification" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_STARTDATE_DESC="Si le mode 'Plage' est sélectionné, saisissez une date de début." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_STARTDATE_LABEL="Début de la plage" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_ENDDATE_DESC="Si le mode 'Plage' est sélectionné, saisissez une date de fin." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_ENDDATE_LABEL="Fin de la plage" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_RELATIVEDATE_DESC="Si le mode 'Relative' est est sélectionné, saisissez une valeur numérique correspondant au nombre de jours à tenir compte à partir de la date du jour consulté." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_RELATIVEDATE_LABEL="Date relative" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_ARTICLEORDERING_DESC="Sélectionnez le champ par lequel les articles sont triés." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_ARTICLEORDERING_LABEL="Champ de tri" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_ORDERING_VALUE="Ordre de Joomla!" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_ORDERINGFEATURED_VALUE="Articles en vedette" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_HITS_VALUE="Clics" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_ID_VALUE="ID" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_ARTICLEORDERINGDIR_DESC="Sélectionnez le sens de tri des articles. Tri par Articles en vedette ne doit être utilisé que lorsque l'option de tri pour les Articles en vedette est paramètré sur 'Uniquement'." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_ARTICLEORDERINGDIR_LABEL="Sens du tri" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_ASCENDING_VALUE="Ascendant" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_DESCENDING_VALUE="Descendant" MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_MODE_DESC="Veuillez sélectionner le mode souhaité.<br />Le mode 'Normal' affiche une liste statique d'articles selon les paramètres du module.<br />Le mode 'Dynamique' affiche une liste d'articles selon les paramètres du module mais également selon la page sur laquelle il est affiché (les paramètres sur les catégories ne sont pas pris en compte) ; le module détecte si vous êtes sur un affichage de type 'Catégorie' et adapte la liste avec des articles de cette catégorie." MAXIMENUCK_CATEGORIES_CATEGORY_FIELD_MODE_LABEL="Mode" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_NORMAL_VALUE="Normal" MAXIMENUCK_CATEGORIES_CATEGORY_OPTION_DYNAMIC_VALUE="Dynamique" MAXIMENUCK_CATEGORIES_ARTICLEIMAGESOURCE_LABEL="Charge les articles en se basant sur" MAXIMENUCK_CATEGORIES_ARTICLEIMAGESOURCE_DESC="Ce filtre vous permet de choisir si vous voulez que les images soient chargées en cherchant la première image contenue dans l'article, ou alors en se basant sur l'option 'image d'intro' de l'article (si l'article n'a aucune image d'intro il ne sera alors pas chargé dans le slideshow)" MAXIMENUCK_CATEGORIES_ARTICLEFROMINTROIMAGE_OPTION="Image d'intro de l'article" MAXIMENUCK_CATEGORIES_ARTICLEFROMFIRSTIMAGE_OPTION="Première image contenu dans l'article" MAXIMENUCK_CATEGORIES_ARTICLEFROMTEXT_OPTION="Seulement le texte" PLG_MAXIMENUCK_CATEGORIES_LABEL="Catégories" MAXIMENUCK_CATEGORIES_SHOWARTICLES_LABEL="Montrer les articles" MAXIMENUCK_CATEGORIES_SHOWARTICLES_DESC="Montrer les articles dans chaque sous-catégorie, ou uniquement les sous-catégories"PK@A#]�V�/maximenuck/categories/language/fr-FR/index.htmlnu�[���<!DOCTYPE html><title></title> PK@A#]������$maximenuck/categories/categories.phpnu�[���<?php /** * @copyright Copyright (C) 2018 Cédric KEIFLIN alias ced1870 * https://www.template-creator.com * https://www.joomlack.fr * @license GNU/GPL * */ defined('_JEXEC') or die('Restricted access'); jimport('joomla.event.plugin'); class plgMaximenuckCategories extends JPlugin { private $type = 'categories'; function __construct(&$subject, $params) { parent::__construct($subject, $params); } /* * Send the infos in the source list to add the type in the plugin options * * Return string the source type */ public function onMaximenuckGetSourceName() { $this->loadLanguage(); return $this->type; } }PK@A#]>U#content/sppagebuilder/thumbnail.pngnu�[����PNG IHDR��@�h��PLTEGpL^� [�&]�"��1��/��.Y�%Z�%Y�%Z�&Z�%Z�%��0��/��/��0��0Y�&Z�&Z�%��.Z�%��/��/Y�%X�%Y�%Y�&��0��/Z�$��0��/��/��/X�*��/��,Y�&��/��MY�'Z�&Z�&E�0��1��0��3Y�%��/��/Z�#��0��0Y�$�p)��0Z�&��0[�&��)Y�%_�'��0��/Y�%Y�&J�%Y�%Z�&Y�&��.��0��1��0��/��/Z�&Y�%Z�%��/��/Z�%[�&��/Z�&Y�%��.Z�%Y�%��0Y�&��/��/��.Y�%Z�&��/��/Z�%Y�'��.��/��/Z�%��/��/Z�&Y�%Y�%��/��/��/��0��/Z�%��4U�(Z�&��/�$$�%%�%%�%%�%%�&&�%%�''Z�%Z�%�%%Z�%�%%�&&��/�&&�%%�%%�)��0��0��1�&&]� m� m� k�l� m�m� m� m�m��'' m� l��%%l�l��%% l�m��%% m��&&l�l��%%�%%0�l��&&l� l��l��%%l��%% l�m� l� l��%%m�p� m�m��%%m�f� m��%%m� l��%% m� l��%%k��%%�&&�&&�%% l� l�l��%%�&&l��&&m��$$�%% m��,,q� l��%%m�l��%%�&&� �%%�&&�%%�&&m�i��%%�&&�%%�%%�$$n��%%�%% m� l��%%m�n��%%�&&�&&l�m��&&�%%u��%%>����tRNS?@7����N���tAɉNuȱ�8ё)*��j��j�4��3����1�CE��nb��J�\T#!JSɂ��̼g�!`܍X�Px�c�;|p���oVSn̘������$\� ��7�/5��,�f�C�.�B�]�IH[��M������%/��-�%O���3�b�c��`�S�sR����W�d G�����mD���[���q�g�n �i��{iK�X��==Q��9v}C�d:B'� �����IDATx�ۅr#;��' )����������^z�K]����=��k�o�#)h:��h.��_l�� ��&$&.91%���Դt˥�e���L`.���s�k9�fp�!/���Gp�=��x1�+H�'X�.,2�b�Q%N�]z���� ��/��[\E�1b01_i�E�U6��4W��wI� ��Z⸺$c��*b\=��L����̧Z߬ ƕc��� H�߰|���,���� W�VP[;q�䯣��i%u�mdu��X�zz�[}FX���5��]������}MF� ��Z+���+$��.gN68=�#��5.J#�˰.��J48?��q뢉�';��|t�k+��R�h�øij�kr�u{�g��ƈ2'S��W0;99G��_X�Z������ �S�;rg,Ѫq��zֺq��|N�_ZJ���Y����W�I�e�J.��x��Zn�Ӻk�h��RϏ� �Y�0:���k���s��-�6��h}0WA�L#�D�d>��5��iI���|�W<�'�o�K�i.���Ct���d9_e���A�e{��,ʝ&�1a4�tZ���%��0��^ĺ��"P~�Rӭ�-�ˬi���v�\f�:�T��}�[��r[�X� ��9�m�)l����s�k��%�#^�,1�(�x��p�'�<��s'��Ǝ���n\!".7�����ю�Sm�ҡZ#{c{��#L��b`�\���zxŋtD-3M�� ;�]�<q��:��[������>�}g�)T➻�K>�z�Qs�Tcqs�E�{|_�}@�)�o���5�h�x��5<��C��g�N?h�+q��cr�r7��K���� ��'��F�O,�Ͼ�{�:�����)��rI�#D��gHԨP̍����Xn�y@�� ��:�'�R�[�I�2��N�ݳ��$hv���*�bzp��n(]�9���3w��b��b�}fQ�|͂�uO5W.��6.I>�\|����xI��T!�l��������s]�$~����P�\�%��U��ey�IH�y,���,�����^-Zc�ȄUP�}0�l516�����!fՕ�NPs���{/(���4�(f�b��V�RTH��L��r��� �} ���S��� ��������+V��lP�c:b�sF��o�,ZM��G��;��{�g�~�����j|���,����2��1�����7@���#1�9�����$�YA��ӷ�'lm��s&����s� ���T�ap�R&���H�ϝ_����]H�DJ���gEb���>/[_e����k����?��<_�v�����>���1�i���:�d㝁X���嚠̋A��\������,�2_$y���3�{ZI^����� fYf�3���<���Rs���<���l�+��Ƞ���_�X�n�Kn;o�;C����r�t������s�q�G��ҝ��Z�h�����X��������6�&0_b��|�BU_��Olf����W�\���H�m��Z;�*����>���;�PhK0��bU���f�X�ݾ�;�O�7X�x��Y�X���B��9Vv�̢�����i�4��g��*箶�8�8���7�4W�!�}��\nݐ,Ǟ��EfPef�efT��k�-�D�owvg�G��n�9���4����sN �b�Bxa>/�)�E�ܥ��l�%ͅp��b!T�M������b�fS�ߌ�=�Y�>�7s����U!��f.�3W~��a횙��Y��]U ̔��<!��O����s�3�5����X���`Y;7s17+\ڡj!ԙ���U,�j�D,o�8s(*ԛ�`f�\+�b3s���ɐ��X�\�|'+2��9R�f��淹ء�Fِ��\��j�\/Ԛ�X��Ɋ�"�\���ɚ��Zd��r��uN�5�վ���6a���us�R]jV�-��Oa_���us'��&��9�8Ϧ��us/���7��Lf��v�_B�A�2�����v���D�j�/����#�o��ȵ킖�4� ��8'O@�IA��3+圜Ptz�Ԭ@��q5�W�`�N���cs̕�<��V;svM��%/� ,��=U�X�^�}6�Ǐ�'��J>�E��Y� ��x�1P���cU� Ͷ��Ո�@7sl�*X�!����lm��*>G�V��\c&���!XK�h>��6S1��~7@���X�{Y��V�216+U܋�ӗ�� 1����*��e`fg�~ۣz�}��5�uL�>%�b�j����1v*)y�� X=`��c�T\Y��VdH�8�%�`�U���"�eN��>WІ��$��ig�}��� �k8�k>%!Qw��P���`����7o�V��K�K{���}|��%���wo܄���ܽ+H�UY��]P2EL�{s �ݷ�R�[���bi���e��-|@���Fa���4#~�ns?2�fY7�F3�>��7ɚ���RO�B~�f���T�>����25��]���zu��Y�\l���3��`yy����:n�囝m\_:7;˼D�Zvv����l)/kr? �F� �y��F]�G���\�Ul�j��:rryV��X�'HɯW��)�p��c~�_Z�Yb���m&�]�������W��7c2��1s_�ɘ��g��?�x>s�1�ŗ0�Π����R�/�P|eOjc�P9� \�$6�a���&�cn��N�ɝ^�^�1�K�kr������j��U��~Id09��Z��e*����n���<tao���8���ޑ;�u�5��E�t��@-y0o��S�o8�z�W��D�t%�9N�m =7p������a��\�L�#q���.���^�ث]��[݈�ᠺ������>���ל8 ��9x�_�^���VWWo���+��g�0�< �d��� ��n9Z�I��x=�Q��(��5v�v��kGg�44��<9���g���ݐ�< >f}CV0�����YO[�C�l�K���R���i: $j�]ɐ7�J����_A_I�Z�I����mqp�ݓ��:;����~#�4�L���-�4�ǷG����LV�i��(�T�D<XZ�qD:9WiE\r�(͙�#^���k>�k8�����8Z�{�lcĴ��# &��L��"M�`���y/?���l 7����m��0u։4^���\���;�����+�IEND�B`�PK@A#]XCR7,,'content/sppagebuilder/sppagebuilder.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.6" type="plugin" group="content" method="upgrade"> <name>Content - SP Page Builder</name> <author>Joomla! Project</author> <author>JoomShaper.com</author> <creationDate>Sep 2016</creationDate> <copyright>Copyright (C) 2010 - 2016 JoomShaper. All rights reserved.</copyright> <license>http://www.gnu.org/licenses/gpl-2.0.html GPLv2 or later</license> <authorEmail>support@joomshaper.com</authorEmail> <authorUrl>www.joomshaper.com</authorUrl> <version>3.8.10</version> <description>SP Page Builder System plugin to add support for 3rd party components</description> <files> <filename plugin="sppagebuilder">sppagebuilder.php</filename> <filename plugin="sppagebuilder">thumbnail.png</filename> </files> </extension>PK@A#]*�l'content/sppagebuilder/sppagebuilder.phpnu�[���<?php /** * @package SP Page Builder * @author JoomShaper http://www.joomshaper.com * @copyright Copyright (c) 2010 - 2019 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later */ use Joomla\CMS\Factory; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Application\CMSApplication; //no direct accees defined ('_JEXEC') or die ('Restricted access'); $sppb_helper_path = JPATH_ADMINISTRATOR . '/components/com_sppagebuilder/helpers/sppagebuilder.php'; if (!file_exists($sppb_helper_path)) { return; } if (!class_exists('SppagebuilderHelper')) { require_once $sppb_helper_path; } if (!class_exists('SppagebuilderHelperSite')) { require_once JPATH_ROOT . '/components/com_sppagebuilder/helpers/helper.php'; } // Load language file $language = Factory::getLanguage(); $language->load('com_sppagebuilder', JPATH_SITE, 'en-GB', true); $language->load('com_sppagebuilder', JPATH_SITE, null, true); class PlgContentSppagebuilder extends CMSPlugin { protected $autoloadLanguage = true; protected $sppagebuilder_content = ''; protected $sppagebuilder_active = 0; protected $isSppagebuilderEnabled = 0; public function __construct( &$subject, $config ) { $this->isSppagebuilderEnabled = $this->isSppagebuilderEnabled(); parent::__construct($subject, $config); } public function onContentAfterSave($context, $article, $isNew) { if ( !$this->isSppagebuilderEnabled ) return; $input = Factory::getApplication()->input; $option = $input->get('option', '', 'STRING'); $view = 'article'; $form = $input->post->get('jform', array(), 'ARRAY'); $sppagebuilder_active = (isset($form['attribs']['sppagebuilder_active']) && $form['attribs']['sppagebuilder_active']) ? $form['attribs']['sppagebuilder_active'] : 0; $sppagebuilder_content = (isset($form['attribs']['sppagebuilder_content']) && $form['attribs']['sppagebuilder_content']) ? $form['attribs']['sppagebuilder_content'] : '[]'; if (!$sppagebuilder_content) return; if ($context == 'com_content.article') { $article_state = $article->state; if (!$sppagebuilder_active) { $article_state = 0; } $values = array( 'title' => $article->title, 'text' => $sppagebuilder_content, 'option' => $option, 'view' => $view, 'id' => $article->id, 'active' => $sppagebuilder_active, 'published' => $article_state, 'catid' => $article->catid, 'created_on' => $article->created, 'created_by' => $article->created_by, 'modified' => $article->modified, 'modified_by' => $article->modified_by, 'access' => $article->access, 'language' => '*', 'action' => 'apply' ); if ($article->state == 2) { $values['published'] = 1; } if ($sppagebuilder_active) { self::addFullText($article->id, $sppagebuilder_content); } SppagebuilderHelper::onAfterIntegrationSave($values); } } private static function addFullText($id, $data) { $article = new stdClass(); $article->id = $id; $article->fulltext = SppagebuilderHelperSite::getPrettyText($data); $result = Factory::getDbo()->updateObject('#__content', $article, 'id'); } public function onContentPrepare($context, $article, $params, $page) { $input = Factory::getApplication()->input; $option = $input->get('option', '', 'STRING'); $view = $input->get('view', '', 'STRING'); $task = $input->get('task', '', 'STRING'); if (!isset($article->id) || !(int) $article->id) { return true; } if ( $this->isSppagebuilderEnabled ) { if (($option == 'com_content') && ($view == 'article')) { $article->text = SppagebuilderHelper::onIntegrationPrepareContent($article->text, $option, $view, $article->id); } if (($option == 'com_j2store') && ($view == 'products') && ($task == 'view') && ($context == 'com_content.article.productlist')) { $article->text = SppagebuilderHelper::onIntegrationPrepareContent($article->text, 'com_content', 'article', $article->id); } } } public function onContentAfterDelete($context, $data) { if ( $this->isSppagebuilderEnabled ) { $input = Factory::getApplication()->input; $option = $input->get('option', '', 'STRING'); $task = $input->get('task', '', 'STRING'); if ( $option == 'com_content' && $context == 'com_content.article') { $values = array( 'option' => $option, 'view' => 'article', 'id' => $data->id, 'action' => 'delete' ); SppagebuilderHelper::onAfterIntegrationSave($values); } } } public function onContentAfterTitle($context, $article, $params, $limitstart) { $input = Factory::getApplication()->input; $option = $input->get('option', '', 'STRING'); $view = $input->get('view', '', 'STRING'); $task = $input->get('task', '', 'STRING'); if (!isset($article->id) || !(int) $article->id) { return true; } if ( $this->isSppagebuilderEnabled ) { if ($option == 'com_content' && $view == 'article' && $params->get('access-edit')) { $sppbEditLink = $this->displaySPPBEditLink($article, $params); if ($sppbEditLink) { return $sppbEditLink; } } } return; } public function onContentChangeState($context, $pks, $value) { if ( $this->isSppagebuilderEnabled ) { $input = Factory::getApplication()->input; $option = $input->get('option', '', 'STRING'); $view = $input->get('view', '', 'STRING'); $task = $input->get('task', '', 'STRING'); if ( $option == 'com_content' && $context == 'com_content.article') { $actions = array(0,1,-2); if ( !in_array( $value, $actions ) ) return; foreach ( $pks as $id ) { $values = array( 'option' => $option, 'view' => 'article', 'id' => $id, 'published' => $value, 'action' => 'stateChange' ); SppagebuilderHelper::onAfterIntegrationSave($values); } } } } private function isSppagebuilderEnabled() { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName('enabled')) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . '=' . $db->quote('com_sppagebuilder')) ->andWhere($db->quoteName('type') . '=' . $db->quote('component')); $db->setQuery($query); return $db->loadResult(); } private function displaySPPBEditLink( $article, $params ) { $user = Factory::getUser(); // Ignore if in a popup window. if ($params && $params->get('popup')) return; // Ignore if the state is negative (trashed). if ($article->state < 0) return; $item = SppagebuilderHelper::getPageContent('com_content','article',$article->id); if (!$item || !$item->id) return; if (property_exists($article, 'checked_out') && property_exists($article, 'checked_out_time') && $article->checked_out > 0 && $article->checked_out != $user->get('id')){ return '<a href="#"><span class="fa fa-lock"></span> Checked out</a>'; } $app = CMSApplication::getInstance('site'); $router = $app->getRouter(); // Get item language code $lang_code = (isset($item->language) && $item->language && explode('-',$item->language)[0])? explode('-',$item->language)[0] : ''; // check language filter plugin is enable or not $enable_lang_filter = PluginHelper::getPlugin('system', 'languagefilter'); // get joomla config $conf = Factory::getConfig(); $front_link = 'index.php?option=com_sppagebuilder&view=form&tmpl=component&layout=edit&id=' . $item->id; $sefURI = str_replace('/administrator', '', $router->build($front_link)); if ($lang_code && $lang_code !== '*' && $enable_lang_filter && $conf->get('sef') ) { $sefURI = str_replace('/index.php/', '/index.php/' . $lang_code . '/', $sefURI); } elseif($lang_code && $lang_code !== '*') { $sefURI = $sefURI . '&lang=' . $lang_code; } return '<a target="_blank" href="'.$sefURI.'"><span class="fa fa-pencil-square-o"></span> Edit with SP Page Builder</a>'; } }PK@A#]F����!�!/content/loadmodule/src/Extension/LoadModule.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.loadmodule * * @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Content\LoadModule\Extension; use Joomla\CMS\Helper\ModuleHelper; use Joomla\CMS\Plugin\CMSPlugin; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Plugin to enable loading modules into content (e.g. articles) * This uses the {loadmodule} syntax * * @since 1.5 */ final class LoadModule extends CMSPlugin { protected static $modules = []; protected static $mods = []; /** * Plugin that loads module positions within content * * @param string $context The context of the content being passed to the plugin. * @param object &$article The article object. Note $article->text is also available * @param mixed &$params The article params * @param integer $page The 'page' number * * @return void * * @since 1.6 */ public function onContentPrepare($context, &$article, &$params, $page = 0) { // Only execute if $article is an object and has a text property if (!is_object($article) || !property_exists($article, 'text') || is_null($article->text)) { return; } $defaultStyle = $this->params->get('style', 'none'); // Fallback xhtml (used in Joomla 3) to html5 if ($defaultStyle === 'xhtml') { $defaultStyle = 'html5'; } // Expression to search for (positions) $regex = '/{loadposition\s(.*?)}/i'; // Expression to search for(modules) $regexmod = '/{loadmodule\s(.*?)}/i'; // Expression to search for(id) $regexmodid = '/{loadmoduleid\s([1-9][0-9]*)}/i'; // Remove macros and don't run this plugin when the content is being indexed if ($context === 'com_finder.indexer') { if (str_contains($article->text, 'loadposition')) { $article->text = preg_replace($regex, '', $article->text); } if (str_contains($article->text, 'loadmoduleid')) { $article->text = preg_replace($regexmodid, '', $article->text); } if (str_contains($article->text, 'loadmodule')) { $article->text = preg_replace($regexmod, '', $article->text); } return; } if (str_contains($article->text, '{loadposition ')) { // Find all instances of plugin and put in $matches for loadposition // $matches[0] is full pattern match, $matches[1] is the position preg_match_all($regex, $article->text, $matches, PREG_SET_ORDER); // No matches, skip this if ($matches) { foreach ($matches as $match) { $matcheslist = explode(',', $match[1]); // We may not have a module style so fall back to the plugin default. if (!array_key_exists(1, $matcheslist)) { $matcheslist[1] = $defaultStyle; } $position = trim($matcheslist[0]); $style = trim($matcheslist[1]); $output = $this->load($position, $style); // We should replace only first occurrence in order to allow positions with the same name to regenerate their content: if (($start = strpos($article->text, $match[0])) !== false) { $article->text = substr_replace($article->text, $output, $start, strlen($match[0])); } } } } if (str_contains($article->text, '{loadmodule ')) { // Find all instances of plugin and put in $matchesmod for loadmodule preg_match_all($regexmod, $article->text, $matchesmod, PREG_SET_ORDER); // If no matches, skip this if ($matchesmod) { foreach ($matchesmod as $matchmod) { $matchesmodlist = explode(',', $matchmod[1]); // First parameter is the module, will be prefixed with mod_ later $module = trim($matchesmodlist[0]); // Second parameter is the title $title = ''; if (array_key_exists(1, $matchesmodlist)) { $title = htmlspecialchars_decode(trim($matchesmodlist[1])); } // Third parameter is the module style, (fallback is the plugin default set earlier). $stylemod = $defaultStyle; if (array_key_exists(2, $matchesmodlist)) { $stylemod = trim($matchesmodlist[2]); } $output = $this->loadModule($module, $title, $stylemod); // We should replace only first occurrence in order to allow positions with the same name to regenerate their content: if (($start = strpos($article->text, $matchmod[0])) !== false) { $article->text = substr_replace($article->text, $output, $start, strlen($matchmod[0])); } } } } if (str_contains($article->text, '{loadmoduleid ')) { // Find all instances of plugin and put in $matchesmodid for loadmoduleid preg_match_all($regexmodid, $article->text, $matchesmodid, PREG_SET_ORDER); // If no matches, skip this if ($matchesmodid) { foreach ($matchesmodid as $match) { $id = trim($match[1]); $output = $this->loadID($id); // We should replace only first occurrence in order to allow positions with the same name to regenerate their content: if (($start = strpos($article->text, $match[0])) !== false) { $article->text = substr_replace($article->text, $output, $start, strlen($match[0])); } } } } } /** * Loads and renders the module * * @param string $position The position assigned to the module * @param string $style The style assigned to the module * * @return mixed * * @since 1.6 */ private function load($position, $style = 'none') { $document = $this->getApplication()->getDocument(); $renderer = $document->loadRenderer('module'); $modules = ModuleHelper::getModules($position); $params = ['style' => $style]; ob_start(); foreach ($modules as $module) { echo $renderer->render($module, $params); } return ob_get_clean(); } /** * This is always going to get the first instance of the module type unless * there is a title. * * @param string $module The module title * @param string $title The title of the module * @param string $style The style of the module * * @return mixed * * @since 1.6 */ private function loadModule($module, $title, $style = 'none') { $document = $this->getApplication()->getDocument(); $renderer = $document->loadRenderer('module'); $mod = ModuleHelper::getModule($module, $title); // If the module without the mod_ isn't found, try it with mod_. // This allows people to enter it either way in the content if (!isset($mod)) { $name = 'mod_' . $module; $mod = ModuleHelper::getModule($name, $title); } $params = ['style' => $style]; ob_start(); if ($mod->id) { echo $renderer->render($mod, $params); } return ob_get_clean(); } /** * Loads and renders the module * * @param string $id The id of the module * * @return mixed * * @since 3.9.0 */ private function loadID($id) { $document = $this->getApplication()->getDocument(); $renderer = $document->loadRenderer('module'); $modules = ModuleHelper::getModuleById($id); $params = ['style' => 'none']; ob_start(); if ($modules->id > 0) { echo $renderer->render($modules, $params); } return ob_get_clean(); } } PK@A#]�p�99!content/loadmodule/loadmodule.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="content" method="upgrade"> <name>plg_content_loadmodule</name> <author>Joomla! Project</author> <creationDate>2005-11</creationDate> <copyright>(C) 2005 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_LOADMODULE_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Content\LoadModule</namespace> <files> <folder plugin="loadmodule">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_content_loadmodule.ini</language> <language tag="en-GB">language/en-GB/plg_content_loadmodule.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="style" type="list" label="PLG_LOADMODULE_FIELD_STYLE_LABEL" default="none" validate="options" > <option value="none">PLG_LOADMODULE_FIELD_VALUE_RAW</option> <option value="html5">PLG_LOADMODULE_FIELD_VALUE_DIVS</option> <option value="table">PLG_LOADMODULE_FIELD_VALUE_TABLE</option> <!-- @TODO: The following styles don't exist in default installation and can be removed in Joomla 5 --> <option value="horz">PLG_LOADMODULE_FIELD_VALUE_HORIZONTAL</option> <option value="rounded">PLG_LOADMODULE_FIELD_VALUE_MULTIPLEDIVS</option> </field> </fieldset> </fields> </config> </extension> PK@A#]����<<(content/loadmodule/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.loadmodule * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Content\LoadModule\Extension\LoadModule; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new LoadModule( $dispatcher, (array) PluginHelper::getPlugin('content', 'loadmodule') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]*�T���)content/pagenavigation/pagenavigation.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="content" method="upgrade"> <name>plg_content_pagenavigation</name> <author>Joomla! Project</author> <creationDate>2006-01</creationDate> <copyright>(C) 2006 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_PAGENAVIGATION_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Content\PageNavigation</namespace> <files> <folder plugin="pagenavigation">services</folder> <folder>src</folder> <folder>tmpl</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_content_pagenavigation.ini</language> <language tag="en-GB">language/en-GB/plg_content_pagenavigation.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="position" type="list" label="PLG_PAGENAVIGATION_FIELD_POSITION_LABEL" default="1" filter="integer" validate="options" > <option value="1">PLG_PAGENAVIGATION_FIELD_VALUE_BELOW</option> <option value="0">PLG_PAGENAVIGATION_FIELD_VALUE_ABOVE</option> </field> <field name="relative" type="list" label="PLG_PAGENAVIGATION_FIELD_RELATIVE_LABEL" default="1" filter="integer" validate="options" > <option value="1">PLG_PAGENAVIGATION_FIELD_VALUE_ARTICLE</option> <option value="0">PLG_PAGENAVIGATION_FIELD_VALUE_TEXT</option> </field> <field name="display" type="list" label="PLG_PAGENAVIGATION_FIELD_DISPLAY_LABEL" default="0" filter="integer" validate="options" > <option value="0">PLG_PAGENAVIGATION_FIELD_VALUE_NEXTPREV</option> <option value="1">PLG_PAGENAVIGATION_FIELD_VALUE_TITLE</option> </field> </fieldset> </fields> </config> </extension> PK@A#]!���&�&7content/pagenavigation/src/Extension/PageNavigation.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.pagenavigation * * @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Content\PageNavigation\Extension; use Joomla\CMS\Access\Access; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Component\Content\Site\Helper\RouteHelper; use Joomla\Database\DatabaseAwareTrait; use Joomla\Database\ParameterType; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Pagenavigation plugin class. * * @since 1.5 */ final class PageNavigation extends CMSPlugin { use DatabaseAwareTrait; /** * If in the article view and the parameter is enabled shows the page navigation * * @param string $context The context of the content being passed to the plugin * @param object &$row The article object * @param mixed &$params The article params * @param integer $page The 'page' number * * @return mixed void or true * * @since 1.6 */ public function onContentBeforeDisplay($context, &$row, &$params, $page = 0) { $app = $this->getApplication(); $view = $app->getInput()->get('view'); $print = $app->getInput()->getBool('print'); if ($print) { return false; } if ($context === 'com_content.article' && $view === 'article' && $params->get('show_item_navigation')) { $db = $this->getDatabase(); $user = $app->getIdentity(); $lang = $app->getLanguage(); $now = Factory::getDate()->toSql(); $query = $db->getQuery(true); $uid = $row->id; $option = 'com_content'; $canPublish = $user->authorise('core.edit.state', $option . '.article.' . $row->id); /** * The following is needed as different menu items types utilise a different param to control ordering. * For Blogs the `orderby_sec` param is the order controlling param. * For Table and List views it is the `orderby` param. */ $params_list = $params->toArray(); if (array_key_exists('orderby_sec', $params_list)) { $order_method = $params->get('orderby_sec', ''); } else { $order_method = $params->get('orderby', ''); } // Additional check for invalid sort ordering. if ($order_method === 'front') { $order_method = ''; } if (in_array($order_method, ['date', 'rdate'])) { // Get the order code $orderDate = $params->get('order_date'); switch ($orderDate) { // Use created if modified is not set case 'modified': $orderby = 'CASE WHEN ' . $db->quoteName('a.modified') . ' IS NULL THEN ' . $db->quoteName('a.created') . ' ELSE ' . $db->quoteName('a.modified') . ' END'; break; // Use created if publish_up is not set case 'published': $orderby = 'CASE WHEN ' . $db->quoteName('a.publish_up') . ' IS NULL THEN ' . $db->quoteName('a.created') . ' ELSE ' . $db->quoteName('a.publish_up') . ' END'; break; // Use created as default default: $orderby = $db->quoteName('a.created'); break; } if ($order_method === 'rdate') { $orderby .= ' DESC'; } } else { // Determine sort order. switch ($order_method) { case 'alpha': $orderby = $db->quoteName('a.title'); break; case 'ralpha': $orderby = $db->quoteName('a.title') . ' DESC'; break; case 'hits': $orderby = $db->quoteName('a.hits'); break; case 'rhits': $orderby = $db->quoteName('a.hits') . ' DESC'; break; case 'author': $orderby = $db->quoteName(['a.created_by_alias', 'u.name']); break; case 'rauthor': $orderby = $db->quoteName('a.created_by_alias') . ' DESC, ' . $db->quoteName('u.name') . ' DESC'; break; case 'front': $orderby = $db->quoteName('f.ordering'); break; default: $orderby = $db->quoteName('a.ordering'); break; } } $query->order($orderby); $case_when = ' CASE WHEN ' . $query->charLength($db->quoteName('a.alias'), '!=', '0') . ' THEN ' . $query->concatenate([$query->castAsChar($db->quoteName('a.id')), $db->quoteName('a.alias')], ':') . ' ELSE ' . $query->castAsChar('a.id') . ' END AS ' . $db->quoteName('slug'); $case_when1 = ' CASE WHEN ' . $query->charLength($db->quoteName('cc.alias'), '!=', '0') . ' THEN ' . $query->concatenate([$query->castAsChar($db->quoteName('cc.id')), $db->quoteName('cc.alias')], ':') . ' ELSE ' . $query->castAsChar('cc.id') . ' END AS ' . $db->quoteName('catslug'); $query->select($db->quoteName(['a.id', 'a.title', 'a.catid', 'a.language'])) ->select([$case_when, $case_when1]) ->from($db->quoteName('#__content', 'a')) ->join('LEFT', $db->quoteName('#__categories', 'cc'), $db->quoteName('cc.id') . ' = ' . $db->quoteName('a.catid')); if ($order_method === 'author' || $order_method === 'rauthor') { $query->select($db->quoteName(['a.created_by', 'u.name'])); $query->join('LEFT', $db->quoteName('#__users', 'u'), $db->quoteName('u.id') . ' = ' . $db->quoteName('a.created_by')); } $query->where( [ $db->quoteName('a.catid') . ' = :catid', $db->quoteName('a.state') . ' = :state', ] ) ->bind(':catid', $row->catid, ParameterType::INTEGER) ->bind(':state', $row->state, ParameterType::INTEGER); if (!$canPublish) { $query->whereIn($db->quoteName('a.access'), Access::getAuthorisedViewLevels($user->id)); } $query->where( [ '(' . $db->quoteName('publish_up') . ' IS NULL OR ' . $db->quoteName('publish_up') . ' <= :nowDate1)', '(' . $db->quoteName('publish_down') . ' IS NULL OR ' . $db->quoteName('publish_down') . ' >= :nowDate2)', ] ) ->bind(':nowDate1', $now) ->bind(':nowDate2', $now); if ($app->isClient('site') && $app->getLanguageFilter()) { $query->whereIn($db->quoteName('a.language'), [$lang->getTag(), '*'], ParameterType::STRING); } $db->setQuery($query); $list = $db->loadObjectList('id'); // This check needed if incorrect Itemid is given resulting in an incorrect result. if (!is_array($list)) { $list = []; } reset($list); // Location of current content item in array list. $location = array_search($uid, array_keys($list)); $rows = array_values($list); $row->prev = null; $row->next = null; if ($location - 1 >= 0) { // The previous content item cannot be in the array position -1. $row->prev = $rows[$location - 1]; } if (($location + 1) < count($rows)) { // The next content item cannot be in an array position greater than the number of array positions. $row->next = $rows[$location + 1]; } if ($row->prev) { $row->prev_label = ($this->params->get('display', 0) == 0) ? $lang->_('JPREV') : $row->prev->title; $row->prev = RouteHelper::getArticleRoute($row->prev->slug, $row->prev->catid, $row->prev->language); } else { $row->prev_label = ''; $row->prev = ''; } if ($row->next) { $row->next_label = ($this->params->get('display', 0) == 0) ? $lang->_('JNEXT') : $row->next->title; $row->next = RouteHelper::getArticleRoute($row->next->slug, $row->next->catid, $row->next->language); } else { $row->next_label = ''; $row->next = ''; } // Output. if ($row->prev || $row->next) { // Get the path for the layout file $path = PluginHelper::getLayoutPath('content', 'pagenavigation'); // Render the pagenav ob_start(); include $path; $row->pagination = ob_get_clean(); $row->paginationposition = $this->params->get('position', 1); // This will default to the 1.5 and 1.6-1.7 behavior. $row->paginationrelative = $this->params->get('relative', 0); } } } } PK@A#]���4��,content/pagenavigation/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.pagenavigation * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Content\PageNavigation\Extension\PageNavigation; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new PageNavigation( $dispatcher, (array) PluginHelper::getPlugin('content', 'pagenavigation') ); $plugin->setApplication(Factory::getApplication()); $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } }; PK@A#]v]���'content/pagenavigation/tmpl/default.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.pagenavigation * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; $this->loadLanguage(); $lang = $this->getLanguage(); ?> <nav class="pagenavigation" aria-label="<?php echo Text::_('PLG_PAGENAVIGATION_ARIA_LABEL'); ?>"> <span class="pagination ms-0"> <?php if ($row->prev) : $direction = $lang->isRtl() ? 'right' : 'left'; ?> <a class="btn btn-sm btn-secondary previous" href="<?php echo Route::_($row->prev); ?>" rel="prev"> <span class="visually-hidden"> <?php echo Text::sprintf('JPREVIOUS_TITLE', htmlspecialchars($rows[$location - 1]->title)); ?> </span> <?php echo '<span class="icon-chevron-' . $direction . '" aria-hidden="true"></span> <span aria-hidden="true">' . $row->prev_label . '</span>'; ?> </a> <?php endif; ?> <?php if ($row->next) : $direction = $lang->isRtl() ? 'left' : 'right'; ?> <a class="btn btn-sm btn-secondary next" href="<?php echo Route::_($row->next); ?>" rel="next"> <span class="visually-hidden"> <?php echo Text::sprintf('JNEXT_TITLE', htmlspecialchars($rows[$location + 1]->title)); ?> </span> <?php echo '<span aria-hidden="true">' . $row->next_label . '</span> <span class="icon-chevron-' . $direction . '" aria-hidden="true"></span>'; ?> </a> <?php endif; ?> </span> </nav> PK@A#]�%�})content/contact/src/Extension/Contact.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.contact * * @copyright (C) 2014 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Content\Contact\Extension; use Joomla\CMS\Language\Multilanguage; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Router\Route; use Joomla\Component\Contact\Site\Helper\RouteHelper; use Joomla\Database\DatabaseAwareTrait; use Joomla\Database\ParameterType; use Joomla\Registry\Registry; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Contact Plugin * * @since 3.2 */ final class Contact extends CMSPlugin { use DatabaseAwareTrait; /** * Plugin that retrieves contact information for contact * * @param string $context The context of the content being passed to the plugin. * @param mixed &$row An object with a "text" property * @param mixed $params Additional parameters. See {@see PlgContentContent()}. * @param integer $page Optional page number. Unused. Defaults to zero. * * @return void */ public function onContentPrepare($context, &$row, $params, $page = 0) { $allowed_contexts = ['com_content.category', 'com_content.article', 'com_content.featured']; if (!in_array($context, $allowed_contexts)) { return; } // Return if we don't have valid params or don't link the author if (!($params instanceof Registry) || !$params->get('link_author')) { return; } // Return if an alias is used if ((int) $this->params->get('link_to_alias', 0) === 0 && $row->created_by_alias != '') { return; } // Return if we don't have a valid article id if (!isset($row->id) || !(int) $row->id) { return; } $contact = $this->getContactData($row->created_by); if ($contact === null) { return; } $row->contactid = $contact->contactid; $row->webpage = $contact->webpage; $row->email = $contact->email_to; $url = $this->params->get('url', 'url'); if ($row->contactid && $url === 'url') { $row->contact_link = Route::_(RouteHelper::getContactRoute($contact->contactid . ':' . $contact->alias, $contact->catid)); } elseif ($row->webpage && $url === 'webpage') { $row->contact_link = $row->webpage; } elseif ($row->email && $url === 'email') { $row->contact_link = 'mailto:' . $row->email; } else { $row->contact_link = ''; } } /** * Retrieve Contact * * @param int $userId Id of the user who created the article * * @return stdClass|null Object containing contact details or null if not found */ private function getContactData($userId) { static $contacts = []; // Note: don't use isset() because value could be null. if (array_key_exists($userId, $contacts)) { return $contacts[$userId]; } $db = $this->getDatabase(); $query = $db->getQuery(true); $userId = (int) $userId; $query->select($db->quoteName('contact.id', 'contactid')) ->select( $db->quoteName( [ 'contact.alias', 'contact.catid', 'contact.webpage', 'contact.email_to', ] ) ) ->from($db->quoteName('#__contact_details', 'contact')) ->where( [ $db->quoteName('contact.published') . ' = 1', $db->quoteName('contact.user_id') . ' = :createdby', ] ) ->bind(':createdby', $userId, ParameterType::INTEGER); if (Multilanguage::isEnabled() === true) { $query->where( '(' . $db->quoteName('contact.language') . ' IN (' . implode(',', $query->bindArray([$this->getApplication()->getLanguage()->getTag(), '*'], ParameterType::STRING)) . ') OR ' . $db->quoteName('contact.language') . ' IS NULL)' ); } $query->order($db->quoteName('contact.id') . ' DESC') ->setLimit(1); $db->setQuery($query); $contacts[$userId] = $db->loadObject(); return $contacts[$userId]; } } PK@A#]m/�Y��%content/contact/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.contact * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Content\Contact\Extension\Contact; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Contact( $dispatcher, (array) PluginHelper::getPlugin('content', 'contact') ); $plugin->setApplication(Factory::getApplication()); $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } }; PK@A#](�9���content/contact/contact.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="content" method="upgrade"> <name>plg_content_contact</name> <author>Joomla! Project</author> <creationDate>2014-01</creationDate> <copyright>(C) 2014 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.2.2</version> <description>PLG_CONTENT_CONTACT_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Content\Contact</namespace> <files> <folder plugin="contact">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_content_contact.ini</language> <language tag="en-GB">language/en-GB/plg_content_contact.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="url" type="list" label="PLG_CONTENT_CONTACT_PARAM_URL_LABEL" description="PLG_CONTENT_CONTACT_PARAM_URL_DESCRIPTION" default="url" validate="options" > <option value="url">PLG_CONTENT_CONTACT_PARAM_URL_URL</option> <option value="webpage">PLG_CONTENT_CONTACT_PARAM_URL_WEBPAGE</option> <option value="email">PLG_CONTENT_CONTACT_PARAM_URL_EMAIL</option> </field> <field name="link_to_alias" type="radio" label="PLG_CONTENT_CONTACT_PARAM_ALIAS_LABEL" description="PLG_CONTENT_CONTACT_PARAM_ALIAS_DESCRIPTION" default="0" layout="joomla.form.field.radio.switcher" filter="integer" > <option value="0">JNO</option> <option value="1">JYES</option> </field> </fieldset> </fields> </config> </extension> PK@A#],xYcontent/vote/tmpl/rating.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.vote * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->getApplication()->getDocument()->getWebAssetManager(); $wa->registerAndUseStyle('plg_content_vote', 'plg_content_vote/rating.css'); /** * Layout variables * ----------------- * @var string $context The context of the content being passed to the plugin * @var object &$row The article object * @var object &$params The article params * @var integer $page The 'page' number * @var array $parts The context segments * @var string $path Path to this file */ if ($context === 'com_content.categories') { return; } // Get the icons $iconStar = HTMLHelper::_('image', 'plg_content_vote/vote-star.svg', '', '', true, true); $iconHalfstar = HTMLHelper::_('image', 'plg_content_vote/vote-star-half.svg', '', '', true, true); // If you can't find the icons then skip it if ($iconStar === null || $iconHalfstar === null) { return; } // Get paths to icons $pathStar = JPATH_ROOT . substr($iconStar, strlen(Uri::root(true))); $pathHalfstar = JPATH_ROOT . substr($iconHalfstar, strlen(Uri::root(true))); // Write inline '<svg>' elements $star = file_exists($pathStar) ? file_get_contents($pathStar) : ''; $halfstar = file_exists($pathHalfstar) ? file_get_contents($pathHalfstar) : ''; // Get rating $rating = (float) $row->rating; $rcount = (int) $row->rating_count; // Round to 0.5 $rating = round($rating / 0.5) * 0.5; // Determine number of stars $stars = $rating; $img = ''; for ($i = 0; $i < floor($stars); $i++) { $img .= '<li class="vote-star">' . $star . '</li>'; } if (($stars - floor($stars)) >= 0.5) { $img .= '<li class="vote-star-empty">' . $star . '</li>'; $img .= '<li class="vote-star-half">' . $halfstar . '</li>'; ++$stars; } for ($i = $stars; $i < 5; $i++) { $img .= '<li class="vote-star-empty">' . $star . '</li>'; } ?> <div class="content_rating" role="img" aria-label="<?php echo Text::sprintf('PLG_VOTE_STAR_RATING', $rating); ?>"> <?php if ($rcount) : ?> <div class="visually-hidden"> <p itemprop="aggregateRating" itemscope itemtype="https://schema.org/AggregateRating"> <?php echo Text::sprintf('PLG_VOTE_USER_RATING', '<span itemprop="ratingValue">' . $rating . '</span>', '<span itemprop="bestRating">5</span>'); ?> <meta itemprop="ratingCount" content="<?php echo $rcount; ?>"> <meta itemprop="worstRating" content="1"> </p> </div> <?php if ($this->params->get('show_total_votes', 0)) : ?> <?php echo Text::sprintf('PLG_VOTE_TOTAL_VOTES', $rcount); ?> <?php endif; ?> <?php endif; ?> <ul> <?php echo $img; ?> </ul> </div> PK@A#]�06OOcontent/vote/tmpl/vote.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.vote * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; /** * Layout variables * ----------------- * @var string $context The context of the content being passed to the plugin * @var object &$row The article object * @var object &$params The article params * @var integer $page The 'page' number * @var array $parts The context segments * @var string $path Path to this file */ $uri = clone Uri::getInstance(); // Create option list for voting select box $options = []; for ($i = 1; $i < 6; $i++) { $options[] = HTMLHelper::_('select.option', $i, Text::sprintf('PLG_VOTE_VOTE', $i)); } ?> <form method="post" action="<?php echo htmlspecialchars($uri->toString(), ENT_COMPAT, 'UTF-8'); ?>" class="form-inline mb-2"> <span class="content_vote"> <label class="visually-hidden" for="content_vote_<?php echo (int) $row->id; ?>"><?php echo Text::_('PLG_VOTE_LABEL'); ?></label> <?php echo HTMLHelper::_('select.genericlist', $options, 'user_rating', 'class="form-select form-select-sm w-auto"', 'value', 'text', '5', 'content_vote_' . (int) $row->id); ?> <input class="btn btn-sm btn-primary align-baseline" type="submit" name="submit_vote" value="<?php echo Text::_('PLG_VOTE_RATE'); ?>"> <input type="hidden" name="task" value="article.vote"> <input type="hidden" name="hitcount" value="0"> <input type="hidden" name="url" value="<?php echo htmlspecialchars($uri->toString(), ENT_COMPAT, 'UTF-8'); ?>"> <?php echo HTMLHelper::_('form.token'); ?> </span> </form> PK@A#]4ZZ#content/vote/src/Extension/Vote.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.vote * * @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Content\Vote\Extension; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Plugin\PluginHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Vote plugin. * * @since 1.5 */ final class Vote extends CMSPlugin { /** * @var \Joomla\CMS\Application\CMSApplication * * @since 3.7.0 * * @deprecated 4.4.0 will be removed in 6.0 as it is there only for layout overrides * Use getApplication() instead */ protected $app; /** * Displays the voting area when viewing an article and the voting section is displayed before the article * * @param string $context The context of the content being passed to the plugin * @param object &$row The article object * @param object &$params The article params * @param integer $page The 'page' number * * @return string|boolean HTML string containing code for the votes if in com_content else boolean false * * @since 1.6 */ public function onContentBeforeDisplay($context, &$row, &$params, $page = 0) { if ($this->params->get('position', 'top') !== 'top') { return ''; } return $this->displayVotingData($context, $row, $params, $page); } /** * Displays the voting area when viewing an article and the voting section is displayed after the article * * @param string $context The context of the content being passed to the plugin * @param object &$row The article object * @param object &$params The article params * @param integer $page The 'page' number * * @return string|boolean HTML string containing code for the votes if in com_content else boolean false * * @since 3.7.0 */ public function onContentAfterDisplay($context, &$row, &$params, $page = 0) { if ($this->params->get('position', 'top') !== 'bottom') { return ''; } return $this->displayVotingData($context, $row, $params, $page); } /** * Displays the voting area * * @param string $context The context of the content being passed to the plugin * @param object &$row The article object * @param object &$params The article params * @param integer $page The 'page' number * * @return string|boolean HTML string containing code for the votes if in com_content else boolean false * * @since 3.7.0 */ private function displayVotingData($context, &$row, &$params, $page) { $parts = explode('.', $context); if ($parts[0] !== 'com_content') { return false; } if (empty($params) || !$params->get('show_vote', null)) { return ''; } // Load plugin language files only when needed (ex: they are not needed if show_vote is not active). $this->loadLanguage(); // Get the path for the rating summary layout file $path = PluginHelper::getLayoutPath('content', 'vote', 'rating'); // Render the layout ob_start(); include $path; $html = ob_get_clean(); if ($this->getApplication()->getInput()->getString('view', '') === 'article' && $row->state == 1) { // Get the path for the voting form layout file $path = PluginHelper::getLayoutPath('content', 'vote', 'vote'); // Render the layout ob_start(); include $path; $html .= ob_get_clean(); } return $html; } } PK@A#]oGJ���content/vote/vote.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="content" method="upgrade"> <name>plg_content_vote</name> <author>Joomla! Project</author> <creationDate>2005-11</creationDate> <copyright>(C) 2005 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_VOTE_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Content\Vote</namespace> <files> <folder plugin="vote">services</folder> <folder>src</folder> <folder>tmpl</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_content_vote.ini</language> <language tag="en-GB">language/en-GB/plg_content_vote.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="position" type="list" label="PLG_VOTE_POSITION_LABEL" default="top" validate="options" > <option value="top">PLG_VOTE_TOP</option> <option value="bottom">PLG_VOTE_BOTTOM</option> </field> <field name="show_total_votes" type="radio" label="PLG_VOTE_TOTAL_VOTES_LABEL" layout="joomla.form.field.radio.switcher" default="0" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> </fieldset> </fields> </config> </extension> PK@A#]Q�UQ"content/vote/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.vote * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Content\Vote\Extension\Vote; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Vote( $dispatcher, (array) PluginHelper::getPlugin('content', 'vote') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]��ӈ��content/jce/jce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="1.6" type="plugin" group="content" method="upgrade"> <name>plg_content_jce</name> <version>2.9.20</version> <creationDate>10-02-2022</creationDate> <author>Ryan Demmer</author> <authorEmail>info@joomlacontenteditor.net</authorEmail> <authorUrl>http://www.joomlacontenteditor.net</authorUrl> <copyright>Copyright (C) 2006 - 2022 Ryan Demmer. All rights reserved</copyright> <license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license> <description>PLG_CONTENT_JCE_XML_DESCRIPTION</description> <files folder="plugins/content/jce"> <file plugin="jce">jce.php</file> </files> <languages folder="administrator/language/en-GB"> <language tag="en-GB">en-GB.plg_content_jce.ini</language> <language tag="en-GB">en-GB.plg_content_jce.sys.ini</language> </languages> </extension> PK@A#]�F�3content/jce/jce.phpnu�[���<?php /** * @copyright Copyright (C) 2015 Ryan Demmer. All rights reserved * @copyright Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved * @license GNU General Public License version 2 or later */ defined('JPATH_BASE') or die; /** * JCE. * * @since 2.5.20 */ class PlgContentJce extends JPlugin { public function onContentPrepareForm($form, $data) { JFactory::getApplication()->triggerEvent('onPlgSystemJceContentPrepareForm', array($form, $data)); } } PK@A#]�!@\ \ content/pagebreak/pagebreak.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="content" method="upgrade"> <name>plg_content_pagebreak</name> <author>Joomla! Project</author> <creationDate>2005-11</creationDate> <copyright>(C) 2005 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_CONTENT_PAGEBREAK_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Content\PageBreak</namespace> <files> <folder plugin="pagebreak">services</folder> <folder>src</folder> <folder>tmpl</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_content_pagebreak.ini</language> <language tag="en-GB">language/en-GB/plg_content_pagebreak.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="title" type="radio" layout="joomla.form.field.radio.switcher" label="PLG_CONTENT_PAGEBREAK_SITE_TITLE_LABEL" default="1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="article_index" type="radio" layout="joomla.form.field.radio.switcher" label="PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEX_LABEL" default="1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="article_index_text" type="text" label="PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEXTEXT" showon="article_index:1" /> <field name="multipage_toc" type="radio" layout="joomla.form.field.radio.switcher" label="PLG_CONTENT_PAGEBREAK_TOC_LABEL" default="1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="showall" type="radio" layout="joomla.form.field.radio.switcher" label="PLG_CONTENT_PAGEBREAK_SHOW_ALL_LABEL" default="1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="style" type="list" label="PLG_CONTENT_PAGEBREAK_STYLE_LABEL" default="pages" validate="options" > <option value="pages">PLG_CONTENT_PAGEBREAK_PAGES</option> <option value="sliders">PLG_CONTENT_PAGEBREAK_SLIDERS</option> <option value="tabs">PLG_CONTENT_PAGEBREAK_TABS</option> </field> </fieldset> </fields> </config> </extension> PK@A#]��we0e0-content/pagebreak/src/Extension/PageBreak.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.pagebreak * * @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Content\PageBreak\Extension; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Pagination\Pagination; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Utility\Utility; use Joomla\Component\Content\Site\Helper\RouteHelper; use Joomla\String\StringHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Page break plugin * * <strong>Usage:</strong> * <code><hr class="system-pagebreak" /></code> * <code><hr class="system-pagebreak" title="The page title" /></code> * or * <code><hr class="system-pagebreak" alt="The first page" /></code> * or * <code><hr class="system-pagebreak" title="The page title" alt="The first page" /></code> * or * <code><hr class="system-pagebreak" alt="The first page" title="The page title" /></code> * * @since 1.6 */ final class PageBreak extends CMSPlugin { /** * The navigation list with all page objects if parameter 'multipage_toc' is active. * * @var array * @since 4.0.0 */ protected $list = []; /** * Plugin that adds a pagebreak into the text and truncates text at that point * * @param string $context The context of the content being passed to the plugin. * @param object &$row The article object. Note $article->text is also available * @param mixed &$params The article params * @param integer $page The 'page' number * * @return void * * @since 1.6 */ public function onContentPrepare($context, &$row, &$params, $page = 0) { $canProceed = $context === 'com_content.article'; if (!$canProceed) { return; } $style = $this->params->get('style', 'pages'); // Expression to search for. $regex = '#<hr(.*)class="system-pagebreak"(.*)\/?>#iU'; $input = $this->getApplication()->getInput(); $print = $input->getBool('print'); $showall = $input->getBool('showall'); if (!$this->params->get('enabled', 1)) { $print = true; } if ($print) { $row->text = preg_replace($regex, '<br>', $row->text); return; } // Simple performance check to determine whether bot should process further. if (StringHelper::strpos($row->text, 'class="system-pagebreak') === false) { if ($page > 0) { throw new \Exception($this->getApplication()->getLanguage()->_('JERROR_PAGE_NOT_FOUND'), 404); } return; } $view = $input->getString('view'); $full = $input->getBool('fullview'); if (!$page) { $page = 0; } if ($full || $view !== 'article' || $params->get('intro_only') || $params->get('popup')) { $row->text = preg_replace($regex, '', $row->text); return; } // Load plugin language files only when needed (ex: not needed if no system-pagebreak class exists). $this->loadLanguage(); // Find all instances of plugin and put in $matches. $matches = []; preg_match_all($regex, $row->text, $matches, PREG_SET_ORDER); if ($showall && $this->params->get('showall', 1)) { $hasToc = $this->params->get('multipage_toc', 1); if ($hasToc) { // Display TOC. $page = 1; $this->createToc($row, $matches, $page); } else { $row->toc = ''; } $row->text = preg_replace($regex, '<br>', $row->text); return; } // Split the text around the plugin. $text = preg_split($regex, $row->text); if (!isset($text[$page])) { throw new \Exception($this->getApplication()->getLanguage()->_('JERROR_PAGE_NOT_FOUND'), 404); } // Count the number of pages. $n = count($text); // We have found at least one plugin, therefore at least 2 pages. if ($n > 1) { $title = $this->params->get('title', 1); $hasToc = $this->params->get('multipage_toc', 1); // Adds heading or title to <site> Title. if ($title && $page && isset($matches[$page - 1][0])) { $attrs = Utility::parseAttributes($matches[$page - 1][0]); if (isset($attrs['title'])) { $row->page_title = $attrs['title']; } } // Reset the text, we already hold it in the $text array. $row->text = ''; if ($style === 'pages') { // Display TOC. if ($hasToc) { $this->createToc($row, $matches, $page); } else { $row->toc = ''; } // Traditional mos page navigation $pageNav = new Pagination($n, $page, 1); // Flag indicates to not add limitstart=0 to URL $pageNav->hideEmptyLimitstart = true; // Page counter. $row->text .= '<div class="pagenavcounter">'; $row->text .= $pageNav->getPagesCounter(); $row->text .= '</div>'; // Page text. $text[$page] = str_replace('<hr id="system-readmore" />', '', $text[$page]); $row->text .= $text[$page]; // $row->text .= '<br>'; $row->text .= '<div class="pager">'; // Adds navigation between pages to bottom of text. if ($hasToc) { $this->createNavigation($row, $page, $n); } // Page links shown at bottom of page if TOC disabled. if (!$hasToc) { $row->text .= $pageNav->getPagesLinks(); } $row->text .= '</div>'; } else { $t[] = $text[0]; if ($style === 'tabs') { $t[] = (string) HTMLHelper::_('uitab.startTabSet', 'myTab', ['active' => 'article' . $row->id . '-' . $style . '0', 'view' => 'tabs']); } else { $t[] = (string) HTMLHelper::_('bootstrap.startAccordion', 'myAccordion', ['active' => 'article' . $row->id . '-' . $style . '0']); } foreach ($text as $key => $subtext) { $index = 'article' . $row->id . '-' . $style . $key; if ($key >= 1) { $match = $matches[$key - 1]; $match = (array) Utility::parseAttributes($match[0]); if (isset($match['alt'])) { $title = stripslashes($match['alt']); } elseif (isset($match['title'])) { $title = stripslashes($match['title']); } else { $title = Text::sprintf('PLG_CONTENT_PAGEBREAK_PAGE_NUM', $key + 1); } if ($style === 'tabs') { $t[] = (string) HTMLHelper::_('uitab.addTab', 'myTab', $index, $title); } else { $t[] = (string) HTMLHelper::_('bootstrap.addSlide', 'myAccordion', $title, $index); } $t[] = (string) $subtext; if ($style === 'tabs') { $t[] = (string) HTMLHelper::_('uitab.endTab'); } else { $t[] = (string) HTMLHelper::_('bootstrap.endSlide'); } } } if ($style === 'tabs') { $t[] = (string) HTMLHelper::_('uitab.endTabSet'); } else { $t[] = (string) HTMLHelper::_('bootstrap.endAccordion'); } $row->text = implode(' ', $t); } } } /** * Creates a Table of Contents for the pagebreak * * @param object &$row The article object. Note $article->text is also available * @param array &$matches Array of matches of a regex in onContentPrepare * @param integer &$page The 'page' number * * @return void * * @since 1.6 */ private function createToc(&$row, &$matches, &$page) { $heading = $row->title ?? $this->getApplication()->getLanguage()->_('PLG_CONTENT_PAGEBREAK_NO_TITLE'); $input = $this->getApplication()->getInput(); $limitstart = $input->getUint('limitstart', 0); $showall = $input->getInt('showall', 0); $headingtext = ''; if ($this->params->get('article_index', 1) == 1) { $headingtext = $this->getApplication()->getLanguage()->_('PLG_CONTENT_PAGEBREAK_ARTICLE_INDEX'); if ($this->params->get('article_index_text')) { $headingtext = htmlspecialchars($this->params->get('article_index_text'), ENT_QUOTES, 'UTF-8'); } } // TOC first Page link. $this->list[1] = new \stdClass(); $this->list[1]->link = RouteHelper::getArticleRoute($row->slug, $row->catid, $row->language); $this->list[1]->title = $heading; $this->list[1]->active = ($limitstart === 0 && $showall === 0); $i = 2; foreach ($matches as $bot) { if (@$bot[0]) { $attrs2 = Utility::parseAttributes($bot[0]); if (@$attrs2['alt']) { $title = stripslashes($attrs2['alt']); } elseif (@$attrs2['title']) { $title = stripslashes($attrs2['title']); } else { $title = Text::sprintf('PLG_CONTENT_PAGEBREAK_PAGE_NUM', $i); } } else { $title = Text::sprintf('PLG_CONTENT_PAGEBREAK_PAGE_NUM', $i); } $this->list[$i] = new \stdClass(); $this->list[$i]->link = RouteHelper::getArticleRoute($row->slug, $row->catid, $row->language) . '&limitstart=' . ($i - 1); $this->list[$i]->title = $title; $this->list[$i]->active = ($limitstart === $i - 1); $i++; } if ($this->params->get('showall')) { $this->list[$i] = new \stdClass(); $this->list[$i]->link = RouteHelper::getArticleRoute($row->slug, $row->catid, $row->language) . '&showall=1'; $this->list[$i]->title = $this->getApplication()->getLanguage()->_('PLG_CONTENT_PAGEBREAK_ALL_PAGES'); $this->list[$i]->active = ($limitstart === $i - 1); } $list = $this->list; $path = PluginHelper::getLayoutPath('content', 'pagebreak', 'toc'); ob_start(); include $path; $row->toc = ob_get_clean(); } /** * Creates the navigation for the item * * @param object &$row The article object. Note $article->text is also available * @param int $page The page number * @param int $n The total number of pages * * @return void * * @since 1.6 */ private function createNavigation(&$row, $page, $n) { $links = [ 'next' => '', 'previous' => '', ]; if ($page < $n - 1) { $links['next'] = RouteHelper::getArticleRoute($row->slug, $row->catid, $row->language) . '&limitstart=' . ($page + 1); } if ($page > 0) { $links['previous'] = RouteHelper::getArticleRoute($row->slug, $row->catid, $row->language); if ($page > 1) { $links['previous'] .= '&limitstart=' . ($page - 1); } } $path = PluginHelper::getLayoutPath('content', 'pagebreak', 'navigation'); ob_start(); include $path; $row->text .= ob_get_clean(); } } PK@A#]I�@77'content/pagebreak/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.pagebreak * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Content\PageBreak\Extension\PageBreak; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new PageBreak( $dispatcher, (array) PluginHelper::getPlugin('content', 'pagebreak') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]�ㆬ��content/pagebreak/tmpl/toc.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.pagebreak * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Router\Route; ?> <div class="card float-end article-index ms-3 mb-3"> <div class="card-body"> <?php if ($headingtext) : ?> <h3><?php echo $headingtext; ?></h3> <?php endif; ?> <ul class="nav flex-column"> <?php foreach ($list as $listItem) : ?> <?php $class = $listItem->active ? ' active' : ''; ?> <li class="py-1"> <a href="<?php echo Route::_($listItem->link); ?>" class="toclink<?php echo $class; ?>"> <?php echo $listItem->title; ?> </a> </li> <?php endforeach; ?> </ul> </div> </div> PK@A#]c��{��%content/pagebreak/tmpl/navigation.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.pagebreak * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; /** * @var $links array Array with keys 'previous' and 'next' with non-SEO links to the previous and next pages * @var $page integer The page number */ $lang = $this->getApplication()->getLanguage(); ?> <ul class="pagination"> <li class="previous page-item"> <?php if ($links['previous']) : $direction = $lang->isRtl() ? 'right' : 'left'; $title = htmlspecialchars($this->list[$page]->title, ENT_QUOTES, 'UTF-8'); $ariaLabel = Text::_('JPREVIOUS') . ': ' . $title . ' (' . Text::sprintf('JLIB_HTML_PAGE_CURRENT_OF_TOTAL', $page, $n) . ')'; ?> <a class="page-link" href="<?php echo Route::_($links['previous']); ?>" title="<?php echo $title; ?>" aria-label="<?php echo $ariaLabel; ?>" rel="prev"> <?php echo '<span class="icon-chevron-' . $direction . '" aria-hidden="true"></span> ' . Text::_('JPREV'); ?> </a> <?php endif; ?> </li> <li class="next page-item"> <?php if ($links['next']) : $direction = $lang->isRtl() ? 'left' : 'right'; $title = htmlspecialchars($this->list[$page + 2]->title, ENT_QUOTES, 'UTF-8'); $ariaLabel = Text::_('JNEXT') . ': ' . $title . ' (' . Text::sprintf('JLIB_HTML_PAGE_CURRENT_OF_TOTAL', ($page + 2), $n) . ')'; ?> <a class="page-link" href="<?php echo Route::_($links['next']); ?>" title="<?php echo $title; ?>" aria-label="<?php echo $ariaLabel; ?>" rel="next"> <?php echo Text::_('JNEXT') . ' <span class="icon-chevron-' . $direction . '" aria-hidden="true"></span>'; ?> </a> <?php endif; ?> </li> </ul> PK@A#]u99 9 )content/confirmconsent/confirmconsent.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="content" method="upgrade"> <name>plg_content_confirmconsent</name> <author>Joomla! Project</author> <creationDate>2018-05</creationDate> <copyright>(C) 2018 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.9.0</version> <description>PLG_CONTENT_CONFIRMCONSENT_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Content\ConfirmConsent</namespace> <files> <folder plugin="confirmconsent">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_content_confirmconsent.ini</language> <language tag="en-GB">language/en-GB/plg_content_confirmconsent.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic" addfieldprefix="Joomla\Component\Content\Administrator\Field"> <field name="consentbox_text" type="textarea" label="PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_LABEL" description="PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_DESC" hint="PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_DEFAULT" rows="7" cols="20" filter="html" /> <field name="privacy_type" type="list" label="PLG_CONTENT_CONFIRMCONSENT_FIELD_TYPE_LABEL" default="article" validate="options" > <option value="article">PLG_CONTENT_CONFIRMCONSENT_FIELD_TYPE_ARTICLE</option> <option value="menu_item">PLG_CONTENT_CONFIRMCONSENT_FIELD_TYPE_MENU_ITEM</option> </field> <field name="privacy_article" type="modal_article" label="PLG_CONTENT_CONFIRMCONSENT_FIELD_ARTICLE_LABEL" description="PLG_CONTENT_CONFIRMCONSENT_FIELD_ARTICLE_DESC" select="true" new="true" edit="true" clear="true" filter="integer" showon="privacy_type:article" /> <field addfieldprefix="Joomla\Component\Menus\Administrator\Field" name="privacy_menu_item" type="modal_menu" label="PLG_CONTENT_CONFIRMCONSENT_FIELD_MENU_ITEM_LABEL" select="true" new="true" edit="true" clear="true" filter="integer" showon="privacy_type:menu_item" /> </fieldset> </fields> </config> </extension> PK@A#]��`JJ,content/confirmconsent/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.confirmconsent * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Content\ConfirmConsent\Extension\ConfirmConsent; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new ConfirmConsent( $dispatcher, (array) PluginHelper::getPlugin('content', 'confirmconsent') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]�'�L� � 7content/confirmconsent/src/Extension/ConfirmConsent.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.confirmconsent * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Content\ConfirmConsent\Extension; use Joomla\CMS\Form\Form; use Joomla\CMS\Plugin\CMSPlugin; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * The Joomla Core confirm consent plugin * * @since 3.9.0 */ final class ConfirmConsent extends CMSPlugin { /** * Load the language file on instantiation. * * @var boolean * * @since 3.9.0 */ protected $autoloadLanguage = true; /** * The supported form contexts * * @var array * * @since 3.9.0 */ protected $supportedContext = [ 'com_contact.contact', 'com_privacy.request', ]; /** * Add additional fields to the supported forms * * @param Form $form The form to be altered. * @param mixed $data The associated data for the form. * * @return boolean * * @since 3.9.0 */ public function onContentPrepareForm(Form $form, $data) { if ($this->getApplication()->isClient('administrator') || !in_array($form->getName(), $this->supportedContext)) { return true; } // Get the consent box Text & the selected privacyarticle $consentboxText = (string) $this->params->get( 'consentbox_text', $this->getApplication()->getLanguage()->_('PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_DEFAULT') ); $privacyArticle = $this->params->get('privacy_article', false); $privacyType = $this->params->get('privacy_type', 'article'); $privacyMenuItem = $this->params->get('privacy_menu_item', false); $form->load(' <form> <fieldset name="default" addfieldprefix="Joomla\\Plugin\\Content\\ConfirmConsent\\Field"> <field name="consentbox" type="ConsentBox" articleid="' . $privacyArticle . '" menu_item_id="' . $privacyMenuItem . '" privacy_type="' . $privacyType . '" label="PLG_CONTENT_CONFIRMCONSENT_CONSENTBOX_LABEL" required="true" > <option value="0">' . htmlspecialchars($consentboxText, ENT_COMPAT, 'UTF-8') . '</option> </field> </fieldset> </form>'); return true; } } PK@A#]�s�))))4content/confirmconsent/src/Field/ConsentBoxField.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.confirmconsent * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Content\ConfirmConsent\Field; use Joomla\CMS\Factory; use Joomla\CMS\Form\Field\CheckboxesField; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Associations; use Joomla\CMS\Language\Multilanguage; use Joomla\CMS\Router\Route; use Joomla\Component\Content\Site\Helper\RouteHelper; use Joomla\Database\Exception\ExecutionFailureException; use Joomla\Database\ParameterType; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Consentbox Field class for the Confirm Consent Plugin. * * @since 3.9.1 */ class ConsentBoxField extends CheckboxesField { /** * The form field type. * * @var string * @since 3.9.1 */ protected $type = 'ConsentBox'; /** * Flag to tell the field to always be in multiple values mode. * * @var boolean * @since 3.9.1 */ protected $forceMultiple = false; /** * The article ID. * * @var integer * @since 3.9.1 */ protected $articleid; /** * The menu item ID. * * @var integer * @since 4.0.0 */ protected $menuItemId; /** * Type of the privacy policy. * * @var string * @since 4.0.0 */ protected $privacyType; /** * Method to set certain otherwise inaccessible properties of the form field object. * * @param string $name The property name for which to set the value. * @param mixed $value The value of the property. * * @return void * * @since 3.9.1 */ public function __set($name, $value) { switch ($name) { case 'articleid': $this->articleid = (int) $value; break; default: parent::__set($name, $value); } } /** * Method to get certain otherwise inaccessible properties from the form field object. * * @param string $name The property name for which to get the value. * * @return mixed The property value or null. * * @since 3.9.1 */ public function __get($name) { if ($name == 'articleid') { return $this->$name; } return parent::__get($name); } /** * Method to attach a JForm object to the field. * * @param \SimpleXMLElement $element The SimpleXMLElement object representing the `<field>` tag for the form field object. * @param mixed $value The form field value to validate. * @param string $group The field name group control value. This acts as an array container for the field. * For example if the field has name="foo" and the group value is set to "bar" then the * full field name would end up being "bar[foo]". * * @return boolean True on success. * * @see \Joomla\CMS\Form\FormField::setup() * @since 3.9.1 */ public function setup(\SimpleXMLElement $element, $value, $group = null) { $return = parent::setup($element, $value, $group); if ($return) { $this->articleid = (int) $this->element['articleid']; $this->menuItemId = (int) $this->element['menu_item_id']; $this->privacyType = (string) $this->element['privacy_type']; } return $return; } /** * Method to get the field label markup. * * @return string The field label markup. * * @since 3.9.1 */ protected function getLabel() { if ($this->hidden) { return ''; } $data = $this->getLayoutData(); // Forcing the Alias field to display the tip below $position = $this->element['name'] == 'alias' ? ' data-bs-placement="bottom" ' : ''; // When we have an article let's add the modal and make the title clickable $hasLink = ($data['privacyType'] === 'article' && $data['articleid']) || ($data['privacyType'] === 'menu_item' && $data['menuItemId']); if ($hasLink) { $attribs['data-bs-toggle'] = 'modal'; $data['label'] = HTMLHelper::_( 'link', '#modal-' . $this->id, $data['label'], $attribs ); } // Here mainly for B/C with old layouts. This can be done in the layouts directly $extraData = [ 'text' => $data['label'], 'for' => $this->id, 'classes' => explode(' ', $data['labelclass']), 'position' => $position, ]; return $this->getRenderer($this->renderLabelLayout)->render(array_merge($data, $extraData)); } /** * Method to get the field input markup. * * @return string The field input markup. * * @since 4.0.0 */ protected function getInput() { $modalHtml = ''; $layoutData = $this->getLayoutData(); $hasLink = ($this->privacyType === 'article' && $this->articleid) || ($this->privacyType === 'menu_item' && $this->menuItemId); if ($hasLink) { $modalParams['title'] = $layoutData['label']; $modalParams['url'] = ($this->privacyType === 'menu_item') ? $this->getAssignedMenuItemUrl() : $this->getAssignedArticleUrl(); $modalParams['height'] = '100%'; $modalParams['width'] = '100%'; $modalParams['bodyHeight'] = 70; $modalParams['modalWidth'] = 80; $modalHtml = HTMLHelper::_('bootstrap.renderModal', 'modal-' . $this->id, $modalParams); } return $modalHtml . parent::getInput(); } /** * Method to get the data to be passed to the layout for rendering. * * @return array * * @since 3.9.1 */ protected function getLayoutData() { $data = parent::getLayoutData(); $extraData = [ 'articleid' => (int) $this->articleid, 'menuItemId' => (int) $this->menuItemId, 'privacyType' => (string) $this->privacyType, ]; return array_merge($data, $extraData); } /** * Return the url of the assigned article based on the current user language * * @return string Returns the link to the article * * @since 3.9.1 */ private function getAssignedArticleUrl() { $db = $this->getDatabase(); // Get the info from the article $query = $db->getQuery(true) ->select($db->quoteName(['id', 'catid', 'language'])) ->from($db->quoteName('#__content')) ->where($db->quoteName('id') . ' = ' . (int) $this->articleid); $db->setQuery($query); try { $article = $db->loadObject(); } catch (ExecutionFailureException $e) { // Something at the database layer went wrong return Route::_( 'index.php?option=com_content&view=article&id=' . $this->articleid . '&tmpl=component' ); } if (!\is_object($article)) { // We have not found the article object lets show a 404 to the user return Route::_( 'index.php?option=com_content&view=article&id=' . $this->articleid . '&tmpl=component' ); } if (!Associations::isEnabled()) { return Route::_( RouteHelper::getArticleRoute( $article->id, $article->catid, $article->language ) . '&tmpl=component' ); } $associatedArticles = Associations::getAssociations('com_content', '#__content', 'com_content.item', $article->id); $currentLang = Factory::getLanguage()->getTag(); if (isset($associatedArticles) && $currentLang !== $article->language && \array_key_exists($currentLang, $associatedArticles)) { return Route::_( RouteHelper::getArticleRoute( $associatedArticles[$currentLang]->id, $associatedArticles[$currentLang]->catid, $associatedArticles[$currentLang]->language ) . '&tmpl=component' ); } // Association is enabled but this article is not associated return Route::_( 'index.php?option=com_content&view=article&id=' . $article->id . '&catid=' . $article->catid . '&tmpl=component&lang=' . $article->language ); } /** * Get privacy menu item URL. If the site is a multilingual website and there is associated menu item for the * current language, the URL of the associated menu item will be returned. * * @return string * * @since 4.0.0 */ private function getAssignedMenuItemUrl() { $itemId = $this->menuItemId; $languageSuffix = ''; if ($itemId > 0 && Associations::isEnabled()) { $privacyAssociated = Associations::getAssociations('com_menus', '#__menu', 'com_menus.item', $itemId, 'id', '', ''); $currentLang = Factory::getLanguage()->getTag(); if (isset($privacyAssociated[$currentLang])) { $itemId = $privacyAssociated[$currentLang]->id; } if (Multilanguage::isEnabled()) { $db = $this->getDatabase(); $query = $db->getQuery(true) ->select($db->quoteName(['id', 'language'])) ->from($db->quoteName('#__menu')) ->where($db->quoteName('id') . ' = :id') ->bind(':id', $itemId, ParameterType::INTEGER); $db->setQuery($query); $menuItem = $db->loadObject(); $languageSuffix = '&lang=' . $menuItem->language; } } return Route::_( 'index.php?Itemid=' . (int) $itemId . '&tmpl=component' . $languageSuffix ); } } PK@A#].�^�J�J'content/joomla/src/Extension/Joomla.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.joomla * * @copyright (C) 2010 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Content\Joomla\Extension; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Language\Language; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Table\CoreContent; use Joomla\CMS\User\UserFactoryAwareTrait; use Joomla\CMS\Workflow\WorkflowServiceInterface; use Joomla\Component\Workflow\Administrator\Table\StageTable; use Joomla\Component\Workflow\Administrator\Table\WorkflowTable; use Joomla\Database\DatabaseAwareTrait; use Joomla\Database\ParameterType; use Joomla\Utilities\ArrayHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Example Content Plugin * * @since 1.6 */ final class Joomla extends CMSPlugin { use DatabaseAwareTrait; use UserFactoryAwareTrait; /** * The save event. * * @param string $context The context * @param object $table The item * @param boolean $isNew Is new item * @param array $data The validated data * * @return boolean * * @since 4.0.0 */ public function onContentBeforeSave($context, $table, $isNew, $data) { if ($context === 'com_menus.item') { return $this->checkMenuItemBeforeSave($context, $table, $isNew, $data); } // Check we are handling the frontend edit form. if (!in_array($context, ['com_workflow.stage', 'com_workflow.workflow']) || $isNew || !$table->hasField('published')) { return true; } $item = clone $table; $item->load($table->id); $publishedField = $item->getColumnAlias('published'); if ($item->$publishedField > 0 && isset($data[$publishedField]) && $data[$publishedField] < 1) { switch ($context) { case 'com_workflow.workflow': return $this->workflowNotUsed($item->id); case 'com_workflow.stage': return $this->stageNotUsed($item->id); } } return true; } /** * Example after save content method * Article is passed by reference, but after the save, so no changes will be saved. * Method is called right after the content is saved * * @param string $context The context of the content passed to the plugin (added in 1.6) * @param object $article A JTableContent object * @param boolean $isNew If the content is just about to be created * * @return void * * @since 1.6 */ public function onContentAfterSave($context, $article, $isNew): void { // Check we are handling the frontend edit form. if ($context !== 'com_content.form') { return; } // Check if this function is enabled. if (!$this->params->def('email_new_fe', 1)) { return; } // Check this is a new article. if (!$isNew) { return; } $db = $this->getDatabase(); $query = $db->getQuery(true) ->select($db->quoteName('id')) ->from($db->quoteName('#__users')) ->where($db->quoteName('sendEmail') . ' = 1') ->where($db->quoteName('block') . ' = 0'); $db->setQuery($query); $users = (array) $db->loadColumn(); if (empty($users)) { return; } $user = $this->getApplication()->getIdentity(); // Messaging for new items $default_language = ComponentHelper::getParams('com_languages')->get('administrator'); $debug = $this->getApplication()->get('debug_lang'); foreach ($users as $user_id) { if ($user_id != $user->id) { // Load language for messaging $receiver = $this->getUserFactory()->loadUserById($user_id); $lang = Language::getInstance($receiver->getParam('admin_language', $default_language), $debug); $lang->load('com_content'); $message = [ 'user_id_to' => $user_id, 'subject' => $lang->_('COM_CONTENT_NEW_ARTICLE'), 'message' => sprintf($lang->_('COM_CONTENT_ON_NEW_CONTENT'), $user->get('name'), $article->title), ]; $model_message = $this->getApplication()->bootComponent('com_messages')->getMVCFactory() ->createModel('Message', 'Administrator'); $model_message->save($message); } } } /** * Don't allow categories to be deleted if they contain items or subcategories with items * * @param string $context The context for the content passed to the plugin. * @param object $data The data relating to the content that was deleted. * * @return boolean * * @since 1.6 */ public function onContentBeforeDelete($context, $data) { // Skip plugin if we are deleting something other than categories if (!in_array($context, ['com_categories.category', 'com_workflow.stage', 'com_workflow.workflow'])) { return true; } switch ($context) { case 'com_categories.category': return $this->canDeleteCategories($data); case 'com_workflow.workflow': return $this->workflowNotUsed($data->id); case 'com_workflow.stage': return $this->stageNotUsed($data->id); } } /** * Don't allow workflows/stages to be deleted if they contain items * * @param string $context The context for the content passed to the plugin. * @param object $pks The IDs of the records which will be changed. * @param object $value The new state. * * @return boolean * * @since 4.0.0 */ public function onContentBeforeChangeState($context, $pks, $value) { if ($value > 0 || !in_array($context, ['com_workflow.workflow', 'com_workflow.stage'])) { return true; } $result = true; foreach ($pks as $id) { switch ($context) { case 'com_workflow.workflow': $result = $result && $this->workflowNotUsed($id); break; case 'com_workflow.stage': $result = $result && $this->stageNotUsed($id); break; } } return $result; } /** * Checks if a given category can be deleted * * @param object $data The category object * * @return boolean */ private function canDeleteCategories($data) { // Check if this function is enabled. if (!$this->params->def('check_categories', 1)) { return true; } $extension = $this->getApplication()->getInput()->getString('extension'); // Default to true if not a core extension $result = true; $tableInfo = [ 'com_banners' => ['table_name' => '#__banners'], 'com_contact' => ['table_name' => '#__contact_details'], 'com_content' => ['table_name' => '#__content'], 'com_newsfeeds' => ['table_name' => '#__newsfeeds'], 'com_users' => ['table_name' => '#__user_notes'], 'com_weblinks' => ['table_name' => '#__weblinks'], ]; // Now check to see if this is a known core extension if (isset($tableInfo[$extension])) { // Get table name for known core extensions $table = $tableInfo[$extension]['table_name']; // See if this category has any content items $count = $this->countItemsInCategory($table, $data->get('id')); // Return false if db error if ($count === false) { $result = false; } else { // Show error if items are found in the category if ($count > 0) { $msg = Text::sprintf('COM_CATEGORIES_DELETE_NOT_ALLOWED', $data->get('title')) . ' ' . Text::plural('COM_CATEGORIES_N_ITEMS_ASSIGNED', $count); $this->getApplication()->enqueueMessage($msg, 'error'); $result = false; } // Check for items in any child categories (if it is a leaf, there are no child categories) if (!$data->isLeaf()) { $count = $this->countItemsInChildren($table, $data->get('id'), $data); if ($count === false) { $result = false; } elseif ($count > 0) { $msg = Text::sprintf('COM_CATEGORIES_DELETE_NOT_ALLOWED', $data->get('title')) . ' ' . Text::plural('COM_CATEGORIES_HAS_SUBCATEGORY_ITEMS', $count); $this->getApplication()->enqueueMessage($msg, 'error'); $result = false; } } } } return $result; } /** * Checks if a given workflow can be deleted * * @param int $pk The stage ID * * @return boolean * * @since 4.0.0 */ private function workflowNotUsed($pk) { // Check if this workflow is the default stage $table = new WorkflowTable($this->getDatabase()); $table->load($pk); if (empty($table->id)) { return true; } if ($table->default) { throw new \Exception($this->getApplication()->getLanguage()->_('COM_WORKFLOW_MSG_DELETE_IS_DEFAULT')); } $parts = explode('.', $table->extension); $component = $this->getApplication()->bootComponent($parts[0]); $section = ''; if (!empty($parts[1])) { $section = $parts[1]; } // No core interface => we're ok if (!$component instanceof WorkflowServiceInterface) { return true; } /** @var \Joomla\Component\Workflow\Administrator\Model\StagesModel $model */ $model = $this->getApplication()->bootComponent('com_workflow')->getMVCFactory() ->createModel('Stages', 'Administrator', ['ignore_request' => true]); $model->setState('filter.workflow_id', $pk); $model->setState('filter.extension', $table->extension); $stages = $model->getItems(); $stage_ids = array_column($stages, 'id'); $result = $this->countItemsInStage($stage_ids, $table->extension); // Return false if db error if ($result > 0) { throw new \Exception($this->getApplication()->getLanguage()->_('COM_WORKFLOW_MSG_DELETE_WORKFLOW_IS_ASSIGNED')); } return true; } /** * Checks if a given stage can be deleted * * @param int $pk The stage ID * * @return boolean * * @since 4.0.0 */ private function stageNotUsed($pk) { $table = new StageTable($this->getDatabase()); $table->load($pk); if (empty($table->id)) { return true; } // Check if this stage is the default stage if ($table->default) { throw new \Exception($this->getApplication()->getLanguage()->_('COM_WORKFLOW_MSG_DELETE_IS_DEFAULT')); } $workflow = new WorkflowTable($this->getDatabase()); $workflow->load($table->workflow_id); if (empty($workflow->id)) { return true; } $parts = explode('.', $workflow->extension); $component = $this->getApplication()->bootComponent($parts[0]); // No core interface => we're ok if (!$component instanceof WorkflowServiceInterface) { return true; } $stage_ids = [$table->id]; $result = $this->countItemsInStage($stage_ids, $workflow->extension); // Return false if db error if ($result > 0) { throw new \Exception($this->getApplication()->getLanguage()->_('COM_WORKFLOW_MSG_DELETE_STAGE_IS_ASSIGNED')); } return true; } /** * Get count of items in a category * * @param string $table table name of component table (column is catid) * @param integer $catid id of the category to check * * @return mixed count of items found or false if db error * * @since 1.6 */ private function countItemsInCategory($table, $catid) { $db = $this->getDatabase(); $query = $db->getQuery(true); // Count the items in this category $query->select('COUNT(' . $db->quoteName('id') . ')') ->from($db->quoteName($table)) ->where($db->quoteName('catid') . ' = :catid') ->bind(':catid', $catid, ParameterType::INTEGER); $db->setQuery($query); try { $count = $db->loadResult(); } catch (\RuntimeException $e) { $this->getApplication()->enqueueMessage($e->getMessage(), 'error'); return false; } return $count; } /** * Get count of items in assigned to a stage * * @param array $stageIds The stage ids to test for * @param string $extension The extension of the workflow * * @return bool * * @since 4.0.0 */ private function countItemsInStage(array $stageIds, string $extension): bool { $db = $this->getDatabase(); $parts = explode('.', $extension); $stageIds = ArrayHelper::toInteger($stageIds); $stageIds = array_filter($stageIds); $section = ''; if (!empty($parts[1])) { $section = $parts[1]; } $component = $this->getApplication()->bootComponent($parts[0]); $table = $component->getWorkflowTableBySection($section); if (empty($stageIds) || !$table) { return false; } $query = $db->getQuery(true); $query->select('COUNT(' . $db->quoteName('b.id') . ')') ->from($db->quoteName('#__workflow_associations', 'wa')) ->from($db->quoteName('#__workflow_stages', 's')) ->from($db->quoteName($table, 'b')) ->where($db->quoteName('wa.stage_id') . ' = ' . $db->quoteName('s.id')) ->where($db->quoteName('wa.item_id') . ' = ' . $db->quoteName('b.id')) ->whereIn($db->quoteName('s.id'), $stageIds); try { return (int) $db->setQuery($query)->loadResult(); } catch (\Exception $e) { $this->getApplication()->enqueueMessage($e->getMessage(), 'error'); } return false; } /** * Get count of items in a category's child categories * * @param string $table table name of component table (column is catid) * @param integer $catid id of the category to check * @param object $data The data relating to the content that was deleted. * * @return mixed count of items found or false if db error * * @since 1.6 */ private function countItemsInChildren($table, $catid, $data) { $db = $this->getDatabase(); // Create subquery for list of child categories $childCategoryTree = $data->getTree(); // First element in tree is the current category, so we can skip that one unset($childCategoryTree[0]); $childCategoryIds = []; foreach ($childCategoryTree as $node) { $childCategoryIds[] = (int) $node->id; } // Make sure we only do the query if we have some categories to look in if (count($childCategoryIds)) { // Count the items in this category $query = $db->getQuery(true) ->select('COUNT(' . $db->quoteName('id') . ')') ->from($db->quoteName($table)) ->whereIn($db->quoteName('catid'), $childCategoryIds); $db->setQuery($query); try { $count = $db->loadResult(); } catch (\RuntimeException $e) { $this->getApplication()->enqueueMessage($e->getMessage(), 'error'); return false; } return $count; } else { // If we didn't have any categories to check, return 0 return 0; } } /** * Change the state in core_content if the stage in a table is changed * * @param string $context The context for the content passed to the plugin. * @param array $pks A list of primary key ids of the content that has changed stage. * @param integer $value The value of the condition that the content has been changed to * * @return boolean * * @since 3.1 */ public function onContentChangeState($context, $pks, $value) { $pks = ArrayHelper::toInteger($pks); if ($context === 'com_workflow.stage' && $value < 1) { foreach ($pks as $pk) { if (!$this->stageNotUsed($pk)) { return false; } } return true; } $db = $this->getDatabase(); $query = $db->getQuery(true) ->select($db->quoteName('core_content_id')) ->from($db->quoteName('#__ucm_content')) ->where($db->quoteName('core_type_alias') . ' = :context') ->whereIn($db->quoteName('core_content_item_id'), $pks) ->bind(':context', $context); $db->setQuery($query); $ccIds = $db->loadColumn(); $cctable = new CoreContent($db); $cctable->publish($ccIds, $value); return true; } /** * The save event. * * @param string $context The context * @param object $table The item * @param boolean $isNew Is new item * @param array $data The validated data * * @return boolean * * @since 3.9.12 */ private function checkMenuItemBeforeSave($context, $table, $isNew, $data) { // Special case for Create article menu item if ($table->link !== 'index.php?option=com_content&view=form&layout=edit') { return true; } // Display error if catid is not set when enable_category is enabled $params = json_decode($table->params, true); if (isset($params['enable_category']) && $params['enable_category'] === 1 && empty($params['catid'])) { $table->setError($this->getApplication()->getLanguage()->_('COM_CONTENT_CREATE_ARTICLE_ERROR')); return false; } return true; } } PK@A#]{�'^��content/joomla/joomla.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="content" method="upgrade"> <name>plg_content_joomla</name> <author>Joomla! Project</author> <creationDate>2010-11</creationDate> <copyright>(C) 2010 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_CONTENT_JOOMLA_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Content\Joomla</namespace> <files> <folder plugin="joomla">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_content_joomla.ini</language> <language tag="en-GB">language/en-GB/plg_content_joomla.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="check_categories" type="radio" layout="joomla.form.field.radio.switcher" label="PLG_CONTENT_JOOMLA_FIELD_CHECK_CATEGORIES_LABEL" description="PLG_CONTENT_JOOMLA_FIELD_CHECK_CATEGORIES_DESC" default="1" filter="integer" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="email_new_fe" type="radio" label="PLG_CONTENT_JOOMLA_FIELD_EMAIL_NEW_FE_LABEL" description="PLG_CONTENT_JOOMLA_FIELD_EMAIL_NEW_FE_DESC" layout="joomla.form.field.radio.switcher" default="1" filter="integer" > <option value="0">JNO</option> <option value="1">JYES</option> </field> </fieldset> </fields> </config> </extension> PK@A#]�Hx/!!$content/joomla/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.joomla * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\User\UserFactoryInterface; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Content\Joomla\Extension\Joomla; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Joomla( $dispatcher, (array) PluginHelper::getPlugin('content', 'joomla') ); $plugin->setApplication(Factory::getApplication()); $plugin->setDatabase($container->get(DatabaseInterface::class)); $plugin->setUserFactory($container->get(UserFactoryInterface::class)); return $plugin; } ); } }; PK@A#]k�d���content/fields/fields.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="content" method="upgrade"> <name>plg_content_fields</name> <author>Joomla! Project</author> <creationDate>2017-02</creationDate> <copyright>(C) 2017 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.7.0</version> <description>PLG_CONTENT_FIELDS_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Content\Fields</namespace> <files> <folder plugin="fields">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_content_fields.ini</language> <language tag="en-GB">language/en-GB/plg_content_fields.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> </fieldset> </fields> </config> </extension> PK@A#]+#�{{'content/fields/src/Extension/Fields.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.fields * * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Content\Fields\Extension; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Component\Fields\Administrator\Helper\FieldsHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Plug-in to show a custom field in eg an article * This uses the {fields ID} syntax * * @since 3.7.0 */ final class Fields extends CMSPlugin { /** * Plugin that shows a custom field * * @param string $context The context of the content being passed to the plugin. * @param object &$item The item object. Note $article->text is also available * @param object &$params The article params * @param int $page The 'page' number * * @return void * * @since 3.7.0 */ public function onContentPrepare($context, &$item, &$params, $page = 0) { // If the item has a context, overwrite the existing one if ($context === 'com_finder.indexer' && !empty($item->context)) { $context = $item->context; } elseif ($context === 'com_finder.indexer') { // Don't run this plugin when the content is being indexed and we have no real context return; } // This plugin only works if $item is an object if (!is_object($item)) { return; } // Don't run if there is no text property (in case of bad calls) or it is empty if (!property_exists($item, 'text') || empty($item->text)) { return; } // Prepare the text if (property_exists($item, 'text') && strpos($item->text, 'field') !== false) { $item->text = $this->prepare($item->text, $context, $item); } // Prepare the intro text if (property_exists($item, 'introtext') && is_string($item->introtext) && strpos($item->introtext, 'field') !== false) { $item->introtext = $this->prepare($item->introtext, $context, $item); } // Prepare the full text if (!empty($item->fulltext) && strpos($item->fulltext, 'field') !== false) { $item->fulltext = $this->prepare($item->fulltext, $context, $item); } } /** * Prepares the given string by parsing {field} and {fieldgroup} groups and replacing them. * * @param string $string The text to prepare * @param string $context The context of the content * @param object $item The item object * * @return string * * @since 3.8.1 */ private function prepare($string, $context, $item) { // Search for {field ID} or {fieldgroup ID} tags and put the results into $matches. $regex = '/{(field|fieldgroup)\s+(.*?)}/i'; preg_match_all($regex, $string, $matches, PREG_SET_ORDER); if (!$matches) { return $string; } $parts = FieldsHelper::extract($context); if (!$parts || count($parts) < 2) { return $string; } $context = $parts[0] . '.' . $parts[1]; $fields = FieldsHelper::getFields($context, $item, true); $fieldsById = []; $groups = []; // Rearranging fields in arrays for easier lookup later. foreach ($fields as $field) { $fieldsById[$field->id] = $field; $groups[$field->group_id][] = $field; } foreach ($matches as $i => $match) { // $match[0] is the full pattern match, $match[1] is the type (field or fieldgroup) and $match[2] the ID and optional the layout $explode = explode(',', $match[2]); $id = (int) $explode[0]; $output = ''; if ($match[1] === 'field' && $id) { if (isset($fieldsById[$id])) { $layout = !empty($explode[1]) ? trim($explode[1]) : $fieldsById[$id]->params->get('layout', 'render'); $output = FieldsHelper::render( $context, 'field.' . $layout, [ 'item' => $item, 'context' => $context, 'field' => $fieldsById[$id], ] ); } } else { if ($match[2] === '*') { $match[0] = str_replace('*', '\*', $match[0]); $renderFields = $fields; } else { $renderFields = $groups[$id] ?? ''; } if ($renderFields) { $layout = !empty($explode[1]) ? trim($explode[1]) : 'render'; $output = FieldsHelper::render( $context, 'fields.' . $layout, [ 'item' => $item, 'context' => $context, 'fields' => $renderFields, ] ); } } $string = preg_replace("|$match[0]|", addcslashes($output, '\\$'), $string, 1); } return $string; } } PK@A#]������$content/fields/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.fields * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Content\Fields\Extension\Fields; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Fields( $dispatcher, (array) PluginHelper::getPlugin('content', 'fields') ); return $plugin; } ); } }; PK@A#]��Ձ66(content/emailcloak/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.emailcloak * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Content\EmailCloak\Extension\EmailCloak; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new EmailCloak( $dispatcher, (array) PluginHelper::getPlugin('content', 'emailcloak') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]�I��$N$N/content/emailcloak/src/Extension/EmailCloak.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.emailcloak * * @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Content\EmailCloak\Extension; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\String\StringHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Email cloak plugin class. * * @since 1.5 */ final class EmailCloak extends CMSPlugin { /** * Plugin that cloaks all emails in content from spambots via Javascript. * * @param string $context The context of the content being passed to the plugin. * @param mixed &$row An object with a "text" property or the string to be cloaked. * @param mixed &$params Additional parameters. * @param integer $page Optional page number. Unused. Defaults to zero. * * @return void */ public function onContentPrepare($context, &$row, &$params, $page = 0) { // Don't run if in the API Application // Don't run this plugin when the content is being indexed if ($this->getApplication()->isClient('api') || $context === 'com_finder.indexer') { return; } // If the row is not an object or does not have a text property there is nothing to do if (!is_object($row) || !property_exists($row, 'text')) { return; } $this->cloak($row->text, $params); } /** * Generate a search pattern based on link and text. * * @param string $link The target of an email link. * @param string $text The text enclosed by the link. * * @return string A regular expression that matches a link containing the parameters. */ private function getPattern($link, $text) { $pattern = '~(?:<a ([^>]*)href\s*=\s*"mailto:' . $link . '"([^>]*))>' . $text . '</a>~i'; return $pattern; } /** * Cloak all emails in text from spambots via Javascript. * * @param string &$text The string to be cloaked. * @param mixed &$params Additional parameters. Parameter "mode" (integer, default 1) * replaces addresses with "mailto:" links if nonzero. * * @return void */ private function cloak(&$text, &$params) { /* * Check for presence of {emailcloak=off} which is explicits disables this * bot for the item. */ if (StringHelper::strpos($text, '{emailcloak=off}') !== false) { $text = StringHelper::str_ireplace('{emailcloak=off}', '', $text); return; } // Simple performance check to determine whether bot should process further. if (StringHelper::strpos($text, '@') === false) { return; } $mode = (int) $this->params->def('mode', 1); $mode = $mode === 1; // Example: any@example.org $searchEmail = '([\w\.\'\-\+]+\@(?:[a-z0-9\.\-]+\.)+(?:[a-zA-Z0-9\-]{2,24}))'; // Example: any@example.org?subject=anyText $searchEmailLink = $searchEmail . '([?&][\x20-\x7f][^"<>]+)'; // Any Text $searchText = '((?:[\x20-\x7f]|[\xA1-\xFF]|[\xC2-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF4][\x80-\xBF]{3})[^<>]+)'; // Any Image link $searchImage = '(<img[^>]+>)'; // Any Text with <span or <strong $searchTextSpan = '(<span[^>]+>|<span>|<strong>|<strong><span[^>]+>|<strong><span>)' . $searchText . '(</span>|</strong>|</span></strong>)'; // Any address with <span or <strong $searchEmailSpan = '(<span[^>]+>|<span>|<strong>|<strong><span[^>]+>|<strong><span>)' . $searchEmail . '(</span>|</strong>|</span></strong>)'; /* * Search and fix derivatives of link code <a href="http://mce_host/ourdirectory/email@example.org" * >email@example.org</a>. This happens when inserting an email in TinyMCE, cancelling its suggestion to add * the mailto: prefix... */ $pattern = $this->getPattern($searchEmail, $searchEmail); $pattern = str_replace('"mailto:', '"([\x20-\x7f][^<>]+/)', $pattern); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[3][0]; $mailText = $regs[5][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[4][0]; // Check to see if mail text is different from mail addy $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 1, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search and fix derivatives of link code <a href="http://mce_host/ourdirectory/email@example.org" * >anytext</a>. This happens when inserting an email in TinyMCE, cancelling its suggestion to add * the mailto: prefix... */ $pattern = $this->getPattern($searchEmail, $searchText); $pattern = str_replace('"mailto:', '"([\x20-\x7f][^<>]+/)', $pattern); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[3][0]; $mailText = $regs[5][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[4][0]; // Check to see if mail text is different from mail addy $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 0, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for derivatives of link code <a href="mailto:email@example.org" * >email@example.org</a> */ $pattern = $this->getPattern($searchEmail, $searchEmail); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[2][0]; $mailText = $regs[4][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[3][0]; // Check to see if mail text is different from mail addy $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 1, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for derivatives of link code <a href="mailto:email@amail.com" * ><anyspan >email@amail.com</anyspan></a> */ $pattern = $this->getPattern($searchEmail, $searchEmailSpan); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[2][0]; $mailText = $regs[4][0] . $regs[5][0] . $regs[6][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[3][0]; // Check to see if mail text is different from mail addy $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 1, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for derivatives of link code <a href="mailto:email@amail.com"> * <anyspan >anytext</anyspan></a> */ $pattern = $this->getPattern($searchEmail, $searchTextSpan); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[2][0]; $mailText = $regs[4][0] . $regs[5][0] . $regs[6][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[3][0]; $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 0, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for derivatives of link code <a href="mailto:email@example.org"> * anytext</a> */ $pattern = $this->getPattern($searchEmail, $searchText); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[2][0]; $mailText = $regs[4][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[3][0]; $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 0, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for derivatives of link code <a href="mailto:email@example.org"> * <img anything></a> */ $pattern = $this->getPattern($searchEmail, $searchImage); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[2][0]; $mailText = $regs[4][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[3][0]; $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 0, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for derivatives of link code <a href="mailto:email@example.org"> * <img anything>email@example.org</a> */ $pattern = $this->getPattern($searchEmail, $searchImage . $searchEmail); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[2][0]; $mailText = $regs[4][0] . $regs[5][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[3][0]; $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 1, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for derivatives of link code <a href="mailto:email@example.org"> * <img anything>any text</a> */ $pattern = $this->getPattern($searchEmail, $searchImage . $searchText); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[2][0]; $mailText = $regs[4][0] . $regs[5][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[3][0]; $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 0, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for derivatives of link code <a href="mailto:email@example.org? * subject=Text">email@example.org</a> */ $pattern = $this->getPattern($searchEmailLink, $searchEmail); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[2][0] . $regs[3][0]; $mailText = $regs[5][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[4][0]; // Needed for handling of Body parameter $mail = str_replace('&', '&', $mail); // Check to see if mail text is different from mail addy $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 1, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for derivatives of link code <a href="mailto:email@example.org? * subject=Text">anytext</a> */ $pattern = $this->getPattern($searchEmailLink, $searchText); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[2][0] . $regs[3][0]; $mailText = $regs[5][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[4][0]; // Needed for handling of Body parameter $mail = str_replace('&', '&', $mail); $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 0, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for derivatives of link code <a href="mailto:email@amail.com?subject= Text" * ><anyspan >email@amail.com</anyspan></a> */ $pattern = $this->getPattern($searchEmailLink, $searchEmailSpan); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[2][0] . $regs[3][0]; $mailText = $regs[5][0] . $regs[6][0] . $regs[7][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[4][0]; // Check to see if mail text is different from mail addy $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 1, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for derivatives of link code <a href="mailto:email@amail.com?subject= Text"> * <anyspan >anytext</anyspan></a> */ $pattern = $this->getPattern($searchEmailLink, $searchTextSpan); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[2][0] . $regs[3][0]; $mailText = $regs[5][0] . $regs[6][0] . $regs[7][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[4][0]; $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 0, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for derivatives of link code * <a href="mailto:email@amail.com?subject=Text"><img anything></a> */ $pattern = $this->getPattern($searchEmailLink, $searchImage); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[2][0] . $regs[3][0]; $mailText = $regs[5][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[4][0]; // Needed for handling of Body parameter $mail = str_replace('&', '&', $mail); // Check to see if mail text is different from mail addy $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 0, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for derivatives of link code * <a href="mailto:email@amail.com?subject=Text"><img anything>email@amail.com</a> */ $pattern = $this->getPattern($searchEmailLink, $searchImage . $searchEmail); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[2][0] . $regs[3][0]; $mailText = $regs[5][0] . $regs[6][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[4][0]; // Needed for handling of Body parameter $mail = str_replace('&', '&', $mail); // Check to see if mail text is different from mail addy $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 1, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for derivatives of link code * <a href="mailto:email@amail.com?subject=Text"><img anything>any text</a> */ $pattern = $this->getPattern($searchEmailLink, $searchImage . $searchText); while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[2][0] . $regs[3][0]; $mailText = $regs[5][0] . $regs[6][0]; $attribsBefore = $regs[1][0]; $attribsAfter = $regs[4][0]; // Needed for handling of Body parameter $mail = str_replace('&', '&', $mail); // Check to see if mail text is different from mail addy $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mailText, 0, $attribsBefore, $attribsAfter); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0])); } /* * Search for plain text email addresses, such as email@example.org but within HTML tags: * <img src="..." title="email@example.org"> or <input type="text" placeholder="email@example.org"> * The '<[^<]*>(*SKIP)(*F)|' trick is used to exclude this kind of occurrences */ $pattern = '~<[^<]*(?<!\/)>(*SKIP)(*F)|<[^>]+?(\w*=\"' . $searchEmail . '\")[^>]*\/>~i'; while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[0][0]; $replacement = HTMLHelper::_('email.cloak', $mail, 0, $mail); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($mail)); } /* * Search for plain text email addresses, such as email@example.org but within HTML attributes: * <a title="email@example.org" href="#">email</a> or <li title="email@example.org">email</li> */ $pattern = '(<[^>]+?(\w*=\"' . $searchEmail . '")[^>]*>[^<]+<[^<]+>)'; while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[0][0]; $replacement = HTMLHelper::_('email.cloak', $mail, 0, $mail); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[0][1], strlen($mail)); } /* * Search for plain text email addresses, such as email@example.org but not within HTML tags: * <p>email@example.org</p> * The '<[^<]*>(*SKIP)(*F)|' trick is used to exclude this kind of occurrences * The '<[^<]*(?<!\/(?:src))>(*SKIP)(*F)|' exclude image files with @ in filename */ $pattern = '~<[^<]*(?<!\/(?:src))>(*SKIP)(*F)|' . $searchEmail . '~i'; while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE)) { $mail = $regs[1][0]; $replacement = HTMLHelper::_('email.cloak', $mail, $mode, $mail); // Replace the found address with the js cloaked email $text = substr_replace($text, $replacement, $regs[1][1], strlen($mail)); } } } PK@A#]y36!content/emailcloak/emailcloak.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="content" method="upgrade"> <name>plg_content_emailcloak</name> <author>Joomla! Project</author> <creationDate>2005-11</creationDate> <copyright>(C) 2005 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_CONTENT_EMAILCLOAK_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Content\EmailCloak</namespace> <files> <folder plugin="emailcloak">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_content_emailcloak.ini</language> <language tag="en-GB">language/en-GB/plg_content_emailcloak.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="mode" type="list" label="PLG_CONTENT_EMAILCLOAK_MODE_LABEL" default="1" filter="integer" validate="options" > <option value="0">PLG_CONTENT_EMAILCLOAK_NONLINKABLE</option> <option value="1">PLG_CONTENT_EMAILCLOAK_LINKABLE</option> </field> </fieldset> </fields> </config> </extension> PK@A#]/{�'''content/finder/src/Extension/Finder.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.finder * * @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Content\Finder\Extension; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Plugin\PluginHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Smart Search Content Plugin * * @since 2.5 */ final class Finder extends CMSPlugin { /** * Smart Search after save content method. * Content is passed by reference, but after the save, so no changes will be saved. * Method is called right after the content is saved. * * @param string $context The context of the content passed to the plugin (added in 1.6) * @param object $article A JTableContent object * @param bool $isNew If the content has just been created * * @return void * * @since 2.5 */ public function onContentAfterSave($context, $article, $isNew): void { PluginHelper::importPlugin('finder'); // Trigger the onFinderAfterSave event. $this->getApplication()->triggerEvent('onFinderAfterSave', [$context, $article, $isNew]); } /** * Smart Search before save content method. * Content is passed by reference. Method is called before the content is saved. * * @param string $context The context of the content passed to the plugin (added in 1.6). * @param object $article A JTableContent object. * @param bool $isNew If the content is just about to be created. * * @return void * * @since 2.5 */ public function onContentBeforeSave($context, $article, $isNew) { PluginHelper::importPlugin('finder'); // Trigger the onFinderBeforeSave event. $this->getApplication()->triggerEvent('onFinderBeforeSave', [$context, $article, $isNew]); } /** * Smart Search after delete content method. * Content is passed by reference, but after the deletion. * * @param string $context The context of the content passed to the plugin (added in 1.6). * @param object $article A JTableContent object. * * @return void * * @since 2.5 */ public function onContentAfterDelete($context, $article): void { PluginHelper::importPlugin('finder'); // Trigger the onFinderAfterDelete event. $this->getApplication()->triggerEvent('onFinderAfterDelete', [$context, $article]); } /** * Smart Search content state change method. * Method to update the link information for items that have been changed * from outside the edit screen. This is fired when the item is published, * unpublished, archived, or unarchived from the list view. * * @param string $context The context for the content passed to the plugin. * @param array $pks A list of primary key ids of the content that has changed state. * @param integer $value The value of the state that the content has been changed to. * * @return void * * @since 2.5 */ public function onContentChangeState($context, $pks, $value) { PluginHelper::importPlugin('finder'); // Trigger the onFinderChangeState event. $this->getApplication()->triggerEvent('onFinderChangeState', [$context, $pks, $value]); } /** * Smart Search change category state content method. * Method is called when the state of the category to which the * content item belongs is changed. * * @param string $extension The extension whose category has been updated. * @param array $pks A list of primary key ids of the content that has changed state. * @param integer $value The value of the state that the content has been changed to. * * @return void * * @since 2.5 */ public function onCategoryChangeState($extension, $pks, $value) { PluginHelper::importPlugin('finder'); // Trigger the onFinderCategoryChangeState event. $this->getApplication()->triggerEvent('onFinderCategoryChangeState', [$extension, $pks, $value]); } } PK@A#]^�g��content/finder/finder.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="content" method="upgrade"> <name>plg_content_finder</name> <author>Joomla! Project</author> <creationDate>2011-12</creationDate> <copyright>(C) 2011 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_CONTENT_FINDER_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Content\Finder</namespace> <files> <folder plugin="finder">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_content_finder.ini</language> <language tag="en-GB">language/en-GB/plg_content_finder.sys.ini</language> </languages> <config> <fields name="params"> </fields> </config> </extension> PK@A#]�U̪(($content/finder/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Content.finder * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Content\Finder\Extension\Finder; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Finder( $dispatcher, (array) PluginHelper::getPlugin('content', 'finder') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#] ˲�oo@captcha/recaptcha_invisible/src/Extension/InvisibleReCaptcha.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Captcha.invisible_recaptcha * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Captcha\InvisibleReCaptcha\Extension; use Joomla\CMS\Application\CMSWebApplicationInterface; use Joomla\CMS\Form\Field\CaptchaField; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Event\DispatcherInterface; use Joomla\Utilities\IpHelper; use ReCaptcha\ReCaptcha; use ReCaptcha\RequestMethod; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Invisible reCAPTCHA Plugin. * * @since 3.9.0 */ final class InvisibleReCaptcha extends CMSPlugin { /** * Load the language file on instantiation. * * @var boolean * @since 3.9.0 */ protected $autoloadLanguage = true; /** * The http request method * * @var RequestMethod * @since 4.3.0 */ private $requestMethod; /** * Constructor. * * @param DispatcherInterface $dispatcher The dispatcher * @param array $config An optional associative array of configuration settings * @param RequestMethod $requestMethod The http request method * * @since 4.3.0 */ public function __construct(DispatcherInterface $dispatcher, array $config, RequestMethod $requestMethod) { parent::__construct($dispatcher, $config); $this->requestMethod = $requestMethod; } /** * Reports the privacy related capabilities for this plugin to site administrators. * * @return array * * @since 3.9.0 */ public function onPrivacyCollectAdminCapabilities() { $this->loadLanguage(); return [ $this->getApplication()->getLanguage()->_('PLG_CAPTCHA_RECAPTCHA_INVISIBLE') => [ $this->getApplication()->getLanguage()->_('PLG_RECAPTCHA_INVISIBLE_PRIVACY_CAPABILITY_IP_ADDRESS'), ], ]; } /** * Initializes the captcha * * @param string $id The id of the field. * * @return boolean True on success, false otherwise * * @since 3.9.0 * @throws \RuntimeException */ public function onInit($id = 'dynamic_recaptcha_invisible_1') { $app = $this->getApplication(); if (!$app instanceof CMSWebApplicationInterface) { return false; } $pubkey = $this->params->get('public_key', ''); if ($pubkey === '') { throw new \RuntimeException($app->getLanguage()->_('PLG_RECAPTCHA_INVISIBLE_ERROR_NO_PUBLIC_KEY')); } $apiSrc = 'https://www.google.com/recaptcha/api.js?onload=JoomlainitReCaptchaInvisible&render=explicit&hl=' . $app->getLanguage()->getTag(); // Load assets, the callback should be first $app->getDocument()->getWebAssetManager() ->registerAndUseScript('plg_captcha_recaptchainvisible', 'plg_captcha_recaptcha_invisible/recaptcha.min.js', [], ['defer' => true]) ->registerAndUseScript('plg_captcha_recaptchainvisible.api', $apiSrc, [], ['defer' => true], ['plg_captcha_recaptchainvisible']) ->registerAndUseStyle('plg_captcha_recaptchainvisible', 'plg_captcha_recaptcha_invisible/recaptcha_invisible.css'); return true; } /** * Gets the challenge HTML * * @param string $name The name of the field. Not Used. * @param string $id The id of the field. * @param string $class The class of the field. * * @return string The HTML to be embedded in the form. * * @since 3.9.0 */ public function onDisplay($name = null, $id = 'dynamic_recaptcha_invisible_1', $class = '') { $dom = new \DOMDocument('1.0', 'UTF-8'); $ele = $dom->createElement('div'); $ele->setAttribute('id', $id); $ele->setAttribute('class', ((trim($class) == '') ? 'g-recaptcha' : ($class . ' g-recaptcha'))); $ele->setAttribute('data-sitekey', $this->params->get('public_key', '')); $ele->setAttribute('data-badge', $this->params->get('badge', 'bottomright')); $ele->setAttribute('data-size', 'invisible'); $ele->setAttribute('data-tabindex', $this->params->get('tabindex', '0')); $ele->setAttribute('data-callback', $this->params->get('callback', '')); $ele->setAttribute('data-expired-callback', $this->params->get('expired_callback', '')); $ele->setAttribute('data-error-callback', $this->params->get('error_callback', '')); $dom->appendChild($ele); return $dom->saveHTML($ele); } /** * Calls an HTTP POST function to verify if the user's guess was correct * * @param string $code Answer provided by user. Not needed for the Recaptcha implementation * * @return boolean True if the answer is correct, false otherwise * * @since 3.9.0 * @throws \RuntimeException */ public function onCheckAnswer($code = null) { $input = $this->getApplication()->getInput(); $privatekey = $this->params->get('private_key'); $remoteip = IpHelper::getIp(); $response = $input->get('g-recaptcha-response', '', 'string'); // Check for Private Key if (empty($privatekey)) { throw new \RuntimeException($this->getApplication()->getLanguage()->_('PLG_RECAPTCHA_INVISIBLE_ERROR_NO_PRIVATE_KEY')); } // Check for IP if (empty($remoteip)) { throw new \RuntimeException($this->getApplication()->getLanguage()->_('PLG_RECAPTCHA_INVISIBLE_ERROR_NO_IP')); } // Discard spam submissions if (trim($response) == '') { throw new \RuntimeException($this->getApplication()->getLanguage()->_('PLG_RECAPTCHA_INVISIBLE_ERROR_EMPTY_SOLUTION')); } return $this->getResponse($privatekey, $remoteip, $response); } /** * Method to react on the setup of a captcha field. Gives the possibility * to change the field and/or the XML element for the field. * * @param CaptchaField $field Captcha field instance * @param \SimpleXMLElement $element XML form definition * * @return void * * @since 3.9.0 */ public function onSetupField(CaptchaField $field, \SimpleXMLElement $element) { // Hide the label for the invisible recaptcha type $element['hiddenLabel'] = 'true'; } /** * Get the reCaptcha response. * * @param string $privatekey The private key for authentication. * @param string $remoteip The remote IP of the visitor. * @param string $response The response received from Google. * * @return boolean True if response is good | False if response is bad. * * @since 3.9.0 * @throws \RuntimeException */ private function getResponse($privatekey, $remoteip, $response) { $reCaptcha = new ReCaptcha($privatekey, $this->requestMethod); $response = $reCaptcha->verify($response, $remoteip); if (!$response->isSuccess()) { foreach ($response->getErrorCodes() as $error) { throw new \RuntimeException($error); } return false; } return true; } } PK@A#]:�f�BB3captcha/recaptcha_invisible/recaptcha_invisible.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="captcha" method="upgrade"> <name>plg_captcha_recaptcha_invisible</name> <version>3.8</version> <creationDate>2017-11</creationDate> <author>Joomla! Project</author> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <copyright>(C) 2017 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <description>PLG_CAPTCHA_RECAPTCHA_INVISIBLE_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Captcha\InvisibleReCaptcha</namespace> <files> <folder plugin="recaptcha_invisible">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_captcha_recaptcha_invisible.ini</language> <language tag="en-GB">language/en-GB/plg_captcha_recaptcha_invisible.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="public_key" type="text" label="PLG_RECAPTCHA_INVISIBLE_PUBLIC_KEY_LABEL" description="PLG_RECAPTCHA_INVISIBLE_PUBLIC_KEY_DESC" default="" required="true" filter="string" class="input-xxlarge" /> <field name="private_key" type="text" label="PLG_RECAPTCHA_INVISIBLE_PRIVATE_KEY_LABEL" description="PLG_RECAPTCHA_INVISIBLE_PRIVATE_KEY_DESC" default="" required="true" filter="string" class="input-xxlarge" /> <field name="badge" type="list" label="PLG_RECAPTCHA_INVISIBLE_BADGE_LABEL" description="PLG_RECAPTCHA_INVISIBLE_BADGE_DESC" default="bottomright" validate="options" > <option value="bottomright">PLG_RECAPTCHA_INVISIBLE_BADGE_BOTTOMRIGHT</option> <option value="bottomleft">PLG_RECAPTCHA_INVISIBLE_BADGE_BOTTOMLEFT</option> <option value="inline">PLG_RECAPTCHA_INVISIBLE_BADGE_INLINE</option> </field> <field name="tabindex" type="number" label="PLG_RECAPTCHA_INVISIBLE_TABINDEX_LABEL" description="PLG_RECAPTCHA_INVISIBLE_TABINDEX_DESC" default="0" min="0" filter="integer" /> <field name="callback" type="text" label="PLG_RECAPTCHA_INVISIBLE_CALLBACK_LABEL" description="PLG_RECAPTCHA_INVISIBLE_CALLBACK_DESC" default="" filter="string" /> <field name="expired_callback" type="text" label="PLG_RECAPTCHA_INVISIBLE_EXPIRED_CALLBACK_LABEL" description="PLG_RECAPTCHA_INVISIBLE_EXPIRED_CALLBACK_DESC" default="" filter="string" /> <field name="error_callback" type="text" label="PLG_RECAPTCHA_INVISIBLE_ERROR_CALLBACK_LABEL" description="PLG_RECAPTCHA_INVISIBLE_ERROR_CALLBACK_DESC" default="" filter="string" /> </fieldset> </fields> </config> </extension> PK@A#]yYT���1captcha/recaptcha_invisible/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Captcha.invisible_recaptcha * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Captcha\Google\HttpBridgePostRequestMethod; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Captcha\InvisibleReCaptcha\Extension\InvisibleReCaptcha; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $plugin = new InvisibleReCaptcha( $container->get(DispatcherInterface::class), (array) PluginHelper::getPlugin('captcha', 'recaptcha_invisible'), new HttpBridgePostRequestMethod() ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]�ή�captcha/recaptcha/recaptcha.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="captcha" method="upgrade"> <name>plg_captcha_recaptcha</name> <version>3.4.0</version> <creationDate>2011-12</creationDate> <author>Joomla! Project</author> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <copyright>(C) 2011 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <description>PLG_CAPTCHA_RECAPTCHA_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Captcha\ReCaptcha</namespace> <files> <folder plugin="recaptcha">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_captcha_recaptcha.ini</language> <language tag="en-GB">language/en-GB/plg_captcha_recaptcha.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="version" type="list" label="PLG_RECAPTCHA_VERSION_LABEL" default="2.0" validate="options" > <option value="2.0">PLG_RECAPTCHA_VERSION_V2</option> </field> <field name="public_key" type="text" label="PLG_RECAPTCHA_PUBLIC_KEY_LABEL" default="" required="true" filter="string" class="input-xxlarge" /> <field name="private_key" type="text" label="PLG_RECAPTCHA_PRIVATE_KEY_LABEL" default="" required="true" filter="string" class="input-xxlarge" /> <field name="theme2" type="list" label="PLG_RECAPTCHA_THEME_LABEL" default="light" showon="version:2.0" filter="" validate="options" > <option value="light">PLG_RECAPTCHA_THEME_LIGHT</option> <option value="dark">PLG_RECAPTCHA_THEME_DARK</option> </field> <field name="size" type="list" label="PLG_RECAPTCHA_SIZE_LABEL" default="normal" showon="version:2.0" filter="" validate="options" > <option value="normal">PLG_RECAPTCHA_THEME_NORMAL</option> <option value="compact">PLG_RECAPTCHA_THEME_COMPACT</option> </field> <field name="tabindex" type="number" label="PLG_RECAPTCHA_TABINDEX_LABEL" description="PLG_RECAPTCHA_TABINDEX_DESC" filter="integer" default="0" showon="version:2.0" min="0" /> <field name="callback" type="text" label="PLG_RECAPTCHA_CALLBACK_LABEL" description="PLG_RECAPTCHA_CALLBACK_DESC" default="" showon="version:2.0" filter="string" /> <field name="expired_callback" type="text" label="PLG_RECAPTCHA_EXPIRED_CALLBACK_LABEL" description="PLG_RECAPTCHA_EXPIRED_CALLBACK_DESC" default="" showon="version:2.0" filter="string" /> <field name="error_callback" type="text" label="PLG_RECAPTCHA_ERROR_CALLBACK_LABEL" description="PLG_RECAPTCHA_ERROR_CALLBACK_DESC" default="" showon="version:2.0" filter="string" /> </fieldset> </fields> </config> </extension> PK@A#]S&�<tt'captcha/recaptcha/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Captcha.recaptcha * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Captcha\Google\HttpBridgePostRequestMethod; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Captcha\ReCaptcha\Extension\ReCaptcha; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $plugin = new ReCaptcha( $container->get(DispatcherInterface::class), (array) PluginHelper::getPlugin('captcha', 'recaptcha'), new HttpBridgePostRequestMethod() ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]~�v-captcha/recaptcha/src/Extension/ReCaptcha.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Captcha.recaptcha * * @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Captcha\ReCaptcha\Extension; use Joomla\CMS\Application\CMSWebApplicationInterface; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Event\DispatcherInterface; use Joomla\Utilities\IpHelper; use ReCaptcha\ReCaptcha as Captcha; use ReCaptcha\RequestMethod; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Recaptcha Plugin * Based on the official recaptcha library( https://packagist.org/packages/google/recaptcha ) * * @since 2.5 */ final class ReCaptcha extends CMSPlugin { /** * Load the language file on instantiation. * * @var boolean * @since 3.1 */ protected $autoloadLanguage = true; /** * The http request method * * @var RequestMethod * @since 4.3.0 */ private $requestMethod; /** * Constructor. * * @param DispatcherInterface $dispatcher The dispatcher * @param array $config An optional associative array of configuration settings * @param RequestMethod $requestMethod The http request method * * @since 4.3.0 */ public function __construct(DispatcherInterface $dispatcher, array $config, RequestMethod $requestMethod) { parent::__construct($dispatcher, $config); $this->requestMethod = $requestMethod; } /** * Reports the privacy related capabilities for this plugin to site administrators. * * @return array * * @since 3.9.0 */ public function onPrivacyCollectAdminCapabilities() { return [ $this->getApplication()->getLanguage()->_('PLG_CAPTCHA_RECAPTCHA') => [ $this->getApplication()->getLanguage()->_('PLG_RECAPTCHA_PRIVACY_CAPABILITY_IP_ADDRESS'), ], ]; } /** * Initializes the captcha * * @param string $id The id of the field. * * @return Boolean True on success, false otherwise * * @since 2.5 * @throws \RuntimeException */ public function onInit($id = 'dynamic_recaptcha_1') { $app = $this->getApplication(); if (!$app instanceof CMSWebApplicationInterface) { return false; } $pubkey = $this->params->get('public_key', ''); if ($pubkey === '') { throw new \RuntimeException($app->getLanguage()->_('PLG_RECAPTCHA_ERROR_NO_PUBLIC_KEY')); } $apiSrc = 'https://www.google.com/recaptcha/api.js?onload=JoomlainitReCaptcha2&render=explicit&hl=' . $app->getLanguage()->getTag(); // Load assets, the callback should be first $app->getDocument()->getWebAssetManager() ->registerAndUseScript('plg_captcha_recaptcha', 'plg_captcha_recaptcha/recaptcha.min.js', [], ['defer' => true]) ->registerAndUseScript('plg_captcha_recaptcha.api', $apiSrc, [], ['defer' => true], ['plg_captcha_recaptcha']); return true; } /** * Gets the challenge HTML * * @param string $name The name of the field. Not Used. * @param string $id The id of the field. * @param string $class The class of the field. * * @return string The HTML to be embedded in the form. * * @since 2.5 */ public function onDisplay($name = null, $id = 'dynamic_recaptcha_1', $class = '') { $dom = new \DOMDocument('1.0', 'UTF-8'); $ele = $dom->createElement('div'); $ele->setAttribute('id', $id); $ele->setAttribute('class', ((trim($class) == '') ? 'g-recaptcha' : ($class . ' g-recaptcha'))); $ele->setAttribute('data-sitekey', $this->params->get('public_key', '')); $ele->setAttribute('data-theme', $this->params->get('theme2', 'light')); $ele->setAttribute('data-size', $this->params->get('size', 'normal')); $ele->setAttribute('data-tabindex', $this->params->get('tabindex', '0')); $ele->setAttribute('data-callback', $this->params->get('callback', '')); $ele->setAttribute('data-expired-callback', $this->params->get('expired_callback', '')); $ele->setAttribute('data-error-callback', $this->params->get('error_callback', '')); $dom->appendChild($ele); return $dom->saveHTML($ele); } /** * Calls an HTTP POST function to verify if the user's guess was correct * * @param string $code Answer provided by user. Not needed for the Recaptcha implementation * * @return True if the answer is correct, false otherwise * * @since 2.5 * @throws \RuntimeException */ public function onCheckAnswer($code = null) { $input = $this->getApplication()->getInput(); $privatekey = $this->params->get('private_key'); $version = $this->params->get('version', '2.0'); $remoteip = IpHelper::getIp(); $response = null; $spam = false; switch ($version) { case '2.0': $response = $code ?: $input->get('g-recaptcha-response', '', 'string'); $spam = ($response === ''); break; } // Check for Private Key if (empty($privatekey)) { throw new \RuntimeException($this->getApplication()->getLanguage()->_('PLG_RECAPTCHA_ERROR_NO_PRIVATE_KEY'), 500); } // Check for IP if (empty($remoteip)) { throw new \RuntimeException($this->getApplication()->getLanguage()->_('PLG_RECAPTCHA_ERROR_NO_IP'), 500); } // Discard spam submissions if ($spam) { throw new \RuntimeException($this->getApplication()->getLanguage()->_('PLG_RECAPTCHA_ERROR_EMPTY_SOLUTION'), 500); } return $this->getResponse($privatekey, $remoteip, $response); } /** * Get the reCaptcha response. * * @param string $privatekey The private key for authentication. * @param string $remoteip The remote IP of the visitor. * @param string $response The response received from Google. * * @return bool True if response is good | False if response is bad. * * @since 3.4 * @throws \RuntimeException */ private function getResponse(string $privatekey, string $remoteip, string $response) { $version = $this->params->get('version', '2.0'); switch ($version) { case '2.0': $apiResponse = (new Captcha($privatekey, $this->requestMethod))->verify($response, $remoteip); if (!$apiResponse->isSuccess()) { foreach ($apiResponse->getErrorCodes() as $error) { throw new \RuntimeException($error, 403); } return false; } break; } return true; } } PK@A#]rd�ˏ�'installer/urlinstaller/urlinstaller.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="installer"> <name>plg_installer_urlinstaller</name> <author>Joomla! Project</author> <creationDate>2016-05</creationDate> <copyright>(C) 2016 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.6.0</version> <description>PLG_INSTALLER_URLINSTALLER_PLUGIN_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Installer\Url</namespace> <files> <folder plugin="urlinstaller">services</folder> <folder>src</folder> <folder>tmpl</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_installer_urlinstaller.ini</language> <language tag="en-GB">language/en-GB/plg_installer_urlinstaller.sys.ini</language> </languages> </extension> PK@A#]$y/��'installer/urlinstaller/tmpl/default.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Installer.urlinstaller * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\Plugin\Installer\Url\Extension\UrlInstaller; /** @var UrlInstaller $this */ $this->getApplication()->getDocument()->getWebAssetManager() ->registerAndUseScript('plg_installer_urlinstaller.urlinstaller', 'plg_installer_urlinstaller/urlinstaller.js', [], ['defer' => true], ['core']); ?> <legend><?php echo Text::_('PLG_INSTALLER_URLINSTALLER_TEXT'); ?></legend> <div class="control-group"> <label for="install_url" class="control-label"> <?php echo Text::_('PLG_INSTALLER_URLINSTALLER_TEXT'); ?> </label> <div class="controls"> <input type="text" id="install_url" name="install_url" class="form-control" placeholder="https://"> </div> </div> <div class="control-group"> <div class="controls"> <button type="button" class="btn btn-primary" id="installbutton_url" onclick="Joomla.submitbuttonurl()"> <?php echo Text::_('PLG_INSTALLER_URLINSTALLER_BUTTON'); ?> </button> </div> </div> PK@A#]�����5installer/urlinstaller/src/Extension/UrlInstaller.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Installer.urlinstaller * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Installer\Url\Extension; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Plugin\PluginHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * UrlFolderInstaller Plugin. * * @since 3.6.0 */ final class UrlInstaller extends CMSPlugin { /** * Application object. * * @var \Joomla\CMS\Application\CMSApplication * @since 4.0.0 * @deprecated 6.0 Is needed for template overrides, use getApplication instead */ protected $app; /** * Textfield or Form of the Plugin. * * @return array Returns an array with the tab information * * @since 3.6.0 */ public function onInstallerAddInstallationTab() { // Load language files $this->loadLanguage(); $tab = []; $tab['name'] = 'url'; $tab['label'] = $this->getApplication()->getLanguage()->_('PLG_INSTALLER_URLINSTALLER_TEXT'); // Render the input ob_start(); include PluginHelper::getLayoutPath('installer', 'urlinstaller'); $tab['content'] = ob_get_clean(); return $tab; } } PK@A#]��i�==,installer/urlinstaller/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Installer.urlinstaller * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Installer\Url\Extension\UrlInstaller; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new UrlInstaller( $dispatcher, (array) PluginHelper::getPlugin('installer', 'urlinstaller') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]?��yyinstaller/override/override.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="installer" method="upgrade"> <name>plg_installer_override</name> <author>Joomla! Project</author> <creationDate>2018-06</creationDate> <copyright>(C) 2018 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.0.0</version> <description>PLG_INSTALLER_OVERRIDE_PLUGIN_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Installer\Override</namespace> <files> <folder plugin="override">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_installer_override.ini</language> <language tag="en-GB">language/en-GB/plg_installer_override.sys.ini</language> </languages> </extension> PK@A#]�c�;��(installer/override/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Installer.override * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Installer\Override\Extension\Override; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Override( $dispatcher, (array) PluginHelper::getPlugin('installer', 'override') ); $plugin->setApplication(Factory::getApplication()); $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } }; PK@A#]�<�c.(.(-installer/override/src/Extension/Override.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Installer.override * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Installer\Override\Extension; use Joomla\CMS\Date\Date; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Database\DatabaseAwareTrait; use Joomla\Database\ParameterType; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Override Plugin * * @since 4.0.0 */ final class Override extends CMSPlugin { use DatabaseAwareTrait; /** * Load the language file on instantiation. * * @var boolean * * @since 4.0.0 */ protected $autoloadLanguage = true; /** * Method to get com_templates model instance. * * @param string $name The model name. Optional * @param string $prefix The class prefix. Optional * * @return \Joomla\Component\Templates\Administrator\Model\TemplateModel * * @since 4.0.0 * * @throws \Exception */ public function getModel($name = 'Template', $prefix = 'Administrator') { /** @var \Joomla\Component\Templates\Administrator\Extension\TemplatesComponent $templateProvider */ $templateProvider = $this->getApplication()->bootComponent('com_templates'); /** @var \Joomla\Component\Templates\Administrator\Model\TemplateModel $model */ $model = $templateProvider->getMVCFactory()->createModel($name, $prefix); return $model; } /** * Purges session array. * * @return void * * @since 4.0.0 */ public function purge() { // Delete stored session value. $session = $this->getApplication()->getSession(); $session->remove('override.beforeEventFiles'); $session->remove('override.afterEventFiles'); } /** * Method to store files before event. * * @return void * * @since 4.0.0 */ public function storeBeforeEventFiles() { // Delete stored session value. $this->purge(); // Get list and store in session. $list = $this->getOverrideCoreList(); $this->getApplication()->getSession()->set('override.beforeEventFiles', $list); } /** * Method to store files after event. * * @return void * * @since 4.0.0 */ public function storeAfterEventFiles() { // Get list and store in session. $list = $this->getOverrideCoreList(); $this->getApplication()->getSession()->set('override.afterEventFiles', $list); } /** * Method to prepare changed or updated core file. * * @param string $action The name of the action. * * @return array A list of changed files. * * @since 4.0.0 */ public function getUpdatedFiles($action) { $session = $this->getApplication()->getSession(); $after = $session->get('override.afterEventFiles'); $before = $session->get('override.beforeEventFiles'); $result = []; if (!is_array($after) || !is_array($before)) { return $result; } $size1 = count($after); $size2 = count($before); if ($size1 === $size2) { for ($i = 0; $i < $size1; $i++) { if ($after[$i]->coreFile !== $before[$i]->coreFile) { $after[$i]->action = $action; $result[] = $after[$i]; } } } return $result; } /** * Method to get core list of override files. * * @return array The list of core files. * * @since 4.0.0 */ public function getOverrideCoreList() { try { /** @var \Joomla\Component\Templates\Administrator\Model\TemplateModel $templateModel */ $templateModel = $this->getModel(); } catch (\Exception $e) { return []; } return $templateModel->getCoreList(); } /** * Last process of this plugin. * * @param array $result Result array. * * @return void * * @since 4.0.0 */ public function finalize($result) { $num = count($result); $link = 'index.php?option=com_templates&view=templates'; if ($num != 0) { $this->getApplication()->enqueueMessage(Text::plural('PLG_INSTALLER_OVERRIDE_N_FILE_UPDATED', $num, $link), 'notice'); $this->saveOverrides($result); } // Delete stored session value. $this->purge(); } /** * Event before extension update. * * @return void * * @since 4.0.0 */ public function onExtensionBeforeUpdate() { $this->storeBeforeEventFiles(); } /** * Event after extension update. * * @return void * * @since 4.0.0 */ public function onExtensionAfterUpdate() { $this->storeAfterEventFiles(); $result = $this->getUpdatedFiles('Extension Update'); $this->finalize($result); } /** * Event before joomla update. * * @return void * * @since 4.0.0 */ public function onJoomlaBeforeUpdate() { $this->storeBeforeEventFiles(); } /** * Event after joomla update. * * @return void * * @since 4.0.0 */ public function onJoomlaAfterUpdate() { $this->storeAfterEventFiles(); $result = $this->getUpdatedFiles('Joomla Update'); $this->finalize($result); } /** * Event before install. * * @return void * * @since 4.0.0 */ public function onInstallerBeforeInstaller() { $this->storeBeforeEventFiles(); } /** * Event after install. * * @return void * * @since 4.0.0 */ public function onInstallerAfterInstaller() { $this->storeAfterEventFiles(); $result = $this->getUpdatedFiles('Extension Install'); $this->finalize($result); } /** * Check for existing id. * * @param string $id Hash id of file. * @param integer $exid Extension id of file. * * @return boolean True/False * * @since 4.0.0 */ public function load($id, $exid) { $db = $this->getDatabase(); // Create a new query object. $query = $db->getQuery(true); $query ->select($db->quoteName('hash_id')) ->from($db->quoteName('#__template_overrides')) ->where($db->quoteName('hash_id') . ' = :id') ->where($db->quoteName('extension_id') . ' = :exid') ->bind(':id', $id) ->bind(':exid', $exid, ParameterType::INTEGER); $db->setQuery($query); $results = $db->loadObjectList(); if (count($results) === 1) { return true; } return false; } /** * Save the updated files. * * @param array $pks Updated files. * * @return void * * @since 4.0.0 * @throws \Joomla\Database\Exception\ExecutionFailureException|\Joomla\Database\Exception\ConnectionFailureException */ private function saveOverrides($pks) { // Insert columns. $columns = [ 'template', 'hash_id', 'action', 'created_date', 'modified_date', 'extension_id', 'state', 'client_id', ]; $db = $this->getDatabase(); // Create an insert query. $insertQuery = $db->getQuery(true) ->insert($db->quoteName('#__template_overrides')) ->columns($db->quoteName($columns)); foreach ($pks as $pk) { $date = new Date('now'); $createdDate = $date->toSql(); if (empty($pk->coreFile)) { $modifiedDate = null; } else { $modifiedDate = $createdDate; } if ($this->load($pk->id, $pk->extension_id)) { $updateQuery = $db->getQuery(true) ->update($db->quoteName('#__template_overrides')) ->set( [ $db->quoteName('modified_date') . ' = :modifiedDate', $db->quoteName('action') . ' = :pkAction', $db->quoteName('state') . ' = 0', ] ) ->where($db->quoteName('hash_id') . ' = :pkId') ->where($db->quoteName('extension_id') . ' = :exId') ->bind(':modifiedDate', $modifiedDate) ->bind(':pkAction', $pk->action) ->bind(':pkId', $pk->id) ->bind(':exId', $pk->extension_id, ParameterType::INTEGER); // Set the query using our newly populated query object and execute it. $db->setQuery($updateQuery); $db->execute(); continue; } // Insert values, preserve order $bindArray = $insertQuery->bindArray( [ $pk->template, $pk->id, $pk->action, $createdDate, $modifiedDate, ], ParameterType::STRING ); $bindArray = array_merge( $bindArray, $insertQuery->bindArray( [ $pk->extension_id, 0, (int) $pk->client, ], ParameterType::INTEGER ) ); $insertQuery->values(implode(',', $bindArray)); } if (!empty($bindArray)) { $db->setQuery($insertQuery); $db->execute(); } } } PK@A#]p��KLL/installer/folderinstaller/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Installer.folderinstaller * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Installer\Folder\Extension\FolderInstaller; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new FolderInstaller( $dispatcher, (array) PluginHelper::getPlugin('installer', 'folderinstaller') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]c����;installer/folderinstaller/src/Extension/FolderInstaller.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Installer.folderinstaller * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Installer\Folder\Extension; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Plugin\PluginHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * FolderInstaller Plugin. * * @since 3.6.0 */ final class FolderInstaller extends CMSPlugin { /** * Application object. * * @var \Joomla\CMS\Application\CMSApplication * @since 4.0.0 * @deprecated 6.0 Is needed for template overrides, use getApplication instead */ protected $app; /** * Textfield or Form of the Plugin. * * @return array Returns an array with the tab information * * @since 3.6.0 */ public function onInstallerAddInstallationTab() { // Load language files $this->loadLanguage(); $tab = []; $tab['name'] = 'folder'; $tab['label'] = $this->getApplication()->getLanguage()->_('PLG_INSTALLER_FOLDERINSTALLER_TEXT'); // Render the input ob_start(); include PluginHelper::getLayoutPath('installer', 'folderinstaller'); $tab['content'] = ob_get_clean(); return $tab; } } PK@A#]M�ţ��-installer/folderinstaller/folderinstaller.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="installer"> <name>plg_installer_folderinstaller</name> <author>Joomla! Project</author> <creationDate>2016-05</creationDate> <copyright>(C) 2016 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.6.0</version> <description>PLG_INSTALLER_FOLDERINSTALLER_PLUGIN_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Installer\Folder</namespace> <files> <folder plugin="folderinstaller">services</folder> <folder>src</folder> <folder>tmpl</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_installer_folderinstaller.ini</language> <language tag="en-GB">language/en-GB/plg_installer_folderinstaller.sys.ini</language> </languages> </extension> PK@A#]ؼi���*installer/folderinstaller/tmpl/default.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Installer.folderinstaller * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; /** @var PlgInstallerFolderInstaller $this */ Text::script('PLG_INSTALLER_FOLDERINSTALLER_NO_INSTALL_PATH'); $this->getApplication()->getDocument()->getWebAssetManager() ->registerAndUseScript( 'plg_installer_folderinstaller.folderinstaller', 'plg_installer_folderinstaller/folderinstaller.js', [], ['defer' => true], ['core'] ); ?> <legend><?php echo Text::_('PLG_INSTALLER_FOLDERINSTALLER_TEXT'); ?></legend> <div class="control-group"> <label for="install_directory" class="control-label"> <?php echo Text::_('PLG_INSTALLER_FOLDERINSTALLER_TEXT'); ?> </label> <div class="controls"> <input type="text" id="install_directory" name="install_directory" class="form-control" value="<?php echo $this->getApplication()->getInput()->get('install_directory', $this->getApplication()->get('tmp_path')); ?>"> </div> </div> <div class="control-group"> <div class="controls"> <button type="button" class="btn btn-primary" id="installbutton_directory" onclick="Joomla.submitbuttonfolder()"> <?php echo Text::_('PLG_INSTALLER_FOLDERINSTALLER_BUTTON'); ?> </button> </div> </div> PK@A#]:�����+installer/packageinstaller/tmpl/default.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Installer.packageinstaller * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Filesystem\FilesystemHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\Plugin\Installer\Package\Extension\PackageInstaller; /** @var PackageInstaller $this */ HTMLHelper::_('form.csrf'); Text::script('PLG_INSTALLER_PACKAGEINSTALLER_NO_PACKAGE'); Text::script('PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_ERROR_UNKNOWN'); Text::script('PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_ERROR_EMPTY'); Text::script('COM_INSTALLER_MSG_WARNINGS_UPLOADFILETOOBIG'); $this->getApplication()->getDocument()->getWebAssetManager() ->registerAndUseScript( 'plg_installer_packageinstaller.packageinstaller', 'plg_installer_packageinstaller/packageinstaller.js', [], ['defer' => true], ['core'] ); $return = $this->getApplication()->getInput()->getBase64('return'); $maxSizeBytes = FilesystemHelper::fileUploadMaxSize(false); $maxSize = HTMLHelper::_('number.bytes', $maxSizeBytes); ?> <legend><?php echo Text::_('PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_INSTALL_JOOMLA_EXTENSION'); ?></legend> <div id="uploader-wrapper"> <div id="dragarea" data-state="pending"> <div id="dragarea-content" class="text-center"> <p> <span id="upload-icon" class="icon-upload" aria-hidden="true"></span> </p> <div id="upload-progress" class="upload-progress"> <div class="progress"> <div class="progress-bar progress-bar-striped bg-success progress-bar-animated" style="width: 0;" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" ></div> </div> <p class="lead"> <span class="uploading-text"> <?php echo Text::_('PLG_INSTALLER_PACKAGEINSTALLER_UPLOADING'); ?> </span> <span class="uploading-number">0</span><span class="uploading-symbol">%</span> </p> </div> <div class="install-progress"> <div class="progress"> <div class="progress-bar progress-bar-striped" style="width: 100%;"></div> </div> <p class="lead"> <span class="installing-text"> <?php echo Text::_('PLG_INSTALLER_PACKAGEINSTALLER_INSTALLING'); ?> </span> </p> </div> <div class="upload-actions"> <p class="lead"> <?php echo Text::_('PLG_INSTALLER_PACKAGEINSTALLER_DRAG_FILE_HERE'); ?> </p> <p> <button id="select-file-button" type="button" class="btn btn-success"> <span class="icon-copy" aria-hidden="true"></span> <?php echo Text::_('PLG_INSTALLER_PACKAGEINSTALLER_SELECT_FILE'); ?> </button> </p> <p> <?php echo Text::sprintf('JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT', '‎' . $maxSize); ?> </p> </div> </div> </div> </div> <div id="legacy-uploader" class="hidden"> <div class="control-group"> <label for="install_package" class="control-label"><?php echo Text::_('PLG_INSTALLER_PACKAGEINSTALLER_EXTENSION_PACKAGE_FILE'); ?></label> <div class="controls"> <input class="form-control-file" id="install_package" name="install_package" type="file"> <input id="max_upload_size" name="max_upload_size" type="hidden" value="<?php echo $maxSizeBytes; ?>" /> <small class="form-text"><?php echo Text::sprintf('JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT', $maxSize); ?></small> </div> </div> <div class="form-actions"> <button class="btn btn-primary" type="button" id="installbutton_package"> <?php echo Text::_('PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_AND_INSTALL'); ?> </button> </div> <input id="installer-return" name="return" type="hidden" value="<?php echo $return; ?>"> </div> PK@A#]|%�`��=installer/packageinstaller/src/Extension/PackageInstaller.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Installer.packageinstaller * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Installer\Package\Extension; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Plugin\PluginHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * PackageInstaller Plugin. * * @since 3.6.0 */ final class PackageInstaller extends CMSPlugin { /** * Application object * * @var \Joomla\CMS\Application\CMSApplication * @since 4.0.0 * @deprecated 6.0 Is needed for template overrides, use getApplication instead */ protected $app; /** * Textfield or Form of the Plugin. * * @return array Returns an array with the tab information * * @since 3.6.0 */ public function onInstallerAddInstallationTab() { // Load language files $this->loadLanguage(); $tab = []; $tab['name'] = 'package'; $tab['label'] = $this->getApplication()->getLanguage()->_('PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_PACKAGE_FILE'); // Render the input ob_start(); include PluginHelper::getLayoutPath('installer', 'packageinstaller'); $tab['content'] = ob_get_clean(); return $tab; } } PK@A#]�9�QQ0installer/packageinstaller/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Installer.packageinstaller * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Installer\Package\Extension\PackageInstaller; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new PackageInstaller( $dispatcher, (array) PluginHelper::getPlugin('installer', 'packageinstaller') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]L�/��/installer/packageinstaller/packageinstaller.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="installer"> <name>plg_installer_packageinstaller</name> <author>Joomla! Project</author> <creationDate>2016-05</creationDate> <copyright>(C) 2016 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.6.0</version> <description>PLG_INSTALLER_PACKAGEINSTALLER_PLUGIN_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Installer\Package</namespace> <files> <folder plugin="packageinstaller">services</folder> <folder>src</folder> <folder>tmpl</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_installer_packageinstaller.ini</language> <language tag="en-GB">language/en-GB/plg_installer_packageinstaller.sys.ini</language> </languages> </extension> PK@A#]e{j4��'installer/webinstaller/webinstaller.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="installer" method="upgrade"> <name>plg_installer_webinstaller</name> <author>Joomla! Project</author> <creationDate>2017-04</creationDate> <copyright>(C) 2018 Open Source Matters, Inc.</copyright> <license>https://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.0.0</version> <description>PLG_INSTALLER_WEBINSTALLER_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Installer\Web</namespace> <files> <folder plugin="webinstaller">services</folder> <folder>src</folder> <folder>tmpl</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_installer_webinstaller.ini</language> <language tag="en-GB">language/en-GB/plg_installer_webinstaller.sys.ini</language> </languages> </extension> PK@A#]��2 ��'installer/webinstaller/tmpl/default.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Installer.Webinstaller * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; /** @var PlgInstallerWebinstaller $this */ $dir = $this->isRTL() ? ' dir="ltr"' : ''; Text::script('JSEARCH_FILTER_CLEAR'); Text::script('PLG_INSTALLER_WEBINSTALLER_INSTALL_WEB_LOADING_ERROR'); ?> <div id="jed-container" class="tab-pane"> <div class="card" id="web-loader"> <div class="card-body"> <h2 class="card-title"><?php echo Text::_('PLG_INSTALLER_WEBINSTALLER_INSTALL_WEB_LOADING'); ?></h2> </div> </div> <div class="hidden" id="web-loader-error"> </div> </div> <fieldset class="form-group hidden" id="uploadform-web"<?php echo $dir; ?>> <p><strong><?php echo Text::_('PLG_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM'); ?></strong></p> <dl> <dt id="uploadform-web-name-label"><?php echo Text::_('PLG_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM_NAME'); ?></dt> <dd id="uploadform-web-name"></dd> <dt><?php echo Text::_('PLG_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM_URL'); ?></dt> <dd id="uploadform-web-url"></dd> </dl> <div class="card card-light"> <div class="card-body"> <div class="card-text"> <button type="button" class="btn btn-primary" id="uploadform-web-install"><?php echo Text::_('COM_INSTALLER_INSTALL_BUTTON'); ?></button> <button type="button" class="btn btn-secondary" id="uploadform-web-cancel"><?php echo Text::_('JCANCEL'); ?></button> </div> </div> </div> </fieldset> PK@A#]k�mB5installer/webinstaller/src/Extension/WebInstaller.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Installer.webinstaller * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Installer\Web\Extension; use Joomla\CMS\Application\CMSApplication; use Joomla\CMS\Form\Rule\UrlRule; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Updater\Update; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Support for the "Install from Web" tab * * @since 3.2 */ final class WebInstaller extends CMSPlugin { /** * The URL for the remote server. * * @var string * @since 4.0.0 */ public const REMOTE_URL = 'https://appscdn.joomla.org/webapps/'; /** * The application object. * * @var CMSApplication * @since 4.0.0 * @deprecated 6.0 Is needed for template overrides, use getApplication instead */ protected $app; /** * The URL to install from * * @var string|null * @since 4.0.0 */ private $installfrom = null; /** * Flag if the document is in a RTL direction * * @var integer|null * @since 4.0.0 */ private $rtl = null; /** * Event listener for the `onInstallerAddInstallationTab` event. * * @return array Returns an array with the tab information * * @since 4.0.0 */ public function onInstallerAddInstallationTab() { // Load language files $this->loadLanguage(); $installfrom = $this->getInstallFrom(); $doc = $this->getApplication()->getDocument(); $lang = $this->getApplication()->getLanguage(); // Push language strings to the JavaScript store Text::script('PLG_INSTALLER_WEBINSTALLER_CANNOT_INSTALL_EXTENSION_IN_PLUGIN'); Text::script('PLG_INSTALLER_WEBINSTALLER_REDIRECT_TO_EXTERNAL_SITE_TO_INSTALL'); $doc->getWebAssetManager() ->registerAndUseStyle('plg_installer_webinstaller.client', 'plg_installer_webinstaller/client.min.css') ->registerAndUseScript( 'plg_installer_webinstaller.client', 'plg_installer_webinstaller/client.min.js', [], ['type' => 'module'], ['core'] ); $devLevel = Version::PATCH_VERSION; if (!empty(Version::EXTRA_VERSION)) { $devLevel .= '-' . Version::EXTRA_VERSION; } $doc->addScriptOptions( 'plg_installer_webinstaller', [ 'base_url' => addslashes(self::REMOTE_URL), 'installat_url' => base64_encode(Uri::current() . '?option=com_installer&view=install'), 'installfrom_url' => addslashes($installfrom), 'product' => base64_encode(Version::PRODUCT), 'release' => base64_encode(Version::MAJOR_VERSION . '.' . Version::MINOR_VERSION), 'dev_level' => base64_encode($devLevel), 'installfromon' => $installfrom ? 1 : 0, 'language' => base64_encode($lang->getTag()), 'installFrom' => $installfrom != '' ? 4 : 5, ] ); $tab = [ 'name' => 'web', 'label' => $lang->_('PLG_INSTALLER_WEBINSTALLER_TAB_LABEL'), ]; // Render the input ob_start(); include PluginHelper::getLayoutPath('installer', 'webinstaller'); $tab['content'] = ob_get_clean(); $tab['content'] = '<legend>' . $tab['label'] . '</legend>' . $tab['content']; return $tab; } /** * Internal check to determine if the output is in a RTL direction * * @return integer * * @since 3.2 */ private function isRTL() { if ($this->rtl === null) { $this->rtl = strtolower($this->getApplication()->getDocument()->getDirection()) === 'rtl' ? 1 : 0; } return $this->rtl; } /** * Get the install from URL * * @return string * * @since 3.2 */ private function getInstallFrom() { if ($this->installfrom === null) { $installfrom = base64_decode($this->getApplication()->getInput()->getBase64('installfrom', '')); $field = new \SimpleXMLElement('<field></field>'); if ((new UrlRule())->test($field, $installfrom) && preg_match('/\.xml\s*$/', $installfrom)) { $update = new Update(); $update->loadFromXml($installfrom); $package_url = trim($update->get('downloadurl', false)->_data); if ($package_url) { $installfrom = $package_url; } } $this->installfrom = $installfrom; } return $this->installfrom; } } PK@A#]p& ==,installer/webinstaller/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Installer.webinstaller * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Installer\Web\Extension\WebInstaller; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new WebInstaller( $dispatcher, (array) PluginHelper::getPlugin('installer', 'webinstaller') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]�dd�T T installer/jce/jce.phpnu�[���<?php /** * @copyright Copyright (c)2016 - 2020 Ryan Demmer * @license GNU General Public License version 2, or later */ defined('_JEXEC') or die; /** * Handle commercial extension update authorization. * * @since 2.6 */ class plgInstallerJce extends JPlugin { /** * Handle adding credentials to package download request. * * @param string $url url from which package is going to be downloaded * @param array $headers headers to be sent along the download request (key => value format) * * @return bool true if credentials have been added to request or not our business, false otherwise (credentials not set by user) * * @since 3.0 */ public function onInstallerBeforePackageDownload(&$url, &$headers) { $app = JFactory::getApplication(); $uri = JUri::getInstance($url); $host = $uri->getHost(); if ($host !== 'www.joomlacontenteditor.net') { return true; } // Get the subscription key JLoader::import('joomla.application.component.helper'); $component = JComponentHelper::getComponent('com_jce'); // load plugin language for warning messages JFactory::getLanguage()->load('plg_installer_jce', JPATH_ADMINISTRATOR); // check if the key has already been set via the dlid field $dlid = $uri->getVar('key', ''); // check the component params, fallback to the dlid $key = $component->params->get('updates_key', $dlid); // if no key is set... if (empty($key)) { // if we are attempting to update JCE Pro, display a notice message if (strpos($url, 'pkg_jce_pro') !== false) { $app->enqueueMessage(JText::_('PLG_INSTALLER_JCE_KEY_WARNING'), 'notice'); } return true; } // Append the subscription key to the download URL $uri->setVar('key', $key); // create the url string $url = $uri->toString(); // check validity of the key and display a message if it is invalid / expired try { $tmpUri = clone $uri; $tmpUri->setVar('task', 'update.validate'); $tmpUri->delVar('file'); $tmpUrl = $tmpUri->toString(); $response = JHttpFactory::getHttp()->get($tmpUrl, array()); } catch (RuntimeException $exception) {} // invalid key, display a notice message if (403 == $response->code) { $app->enqueueMessage(JText::_('PLG_INSTALLER_JCE_KEY_INVALID'), 'notice'); } return true; } } PK@A#]�fW��installer/jce/jce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.8" type="plugin" group="installer" method="upgrade"> <name>plg_installer_jce</name> <version>2.9.20</version> <creationDate>10-02-2022</creationDate> <author>Ryan Demmer</author> <authorEmail>info@joomlacontenteditor.net</authorEmail> <authorUrl>http://www.joomlacontenteditor.net</authorUrl> <copyright>Copyright (C) 2006 - 2022 Ryan Demmer. All rights reserved</copyright> <license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license> <description>PLG_INSTALLER_JCE_XML_DESCRIPTION</description> <files folder="plugins/installer/jce"> <filename plugin="jce">jce.php</filename> </files> <languages folder="administrator/language/en-GB"> <language tag="en-GB">en-GB.plg_installer_jce.ini</language> <language tag="en-GB">en-GB.plg_installer_jce.sys.ini</language> </languages> </extension> PK@A#]hD�ӄ�multifactorauth/fixed/fixed.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="multifactorauth" method="upgrade"> <name>plg_multifactorauth_fixed</name> <author>Joomla! Project</author> <creationDate>2022-05</creationDate> <copyright>(C) 2022 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.2.0</version> <description>PLG_MULTIFACTORAUTH_FIXED_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Multifactorauth\Fixed</namespace> <files> <folder plugin="fixed">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_multifactorauth_fixed.ini</language> <language tag="en-GB">language/en-GB/plg_multifactorauth_fixed.sys.ini</language> </languages> </extension> PK@A#]X<G���+multifactorauth/fixed/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.fixed * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') || die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Multifactorauth\Fixed\Extension\Fixed; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.2.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $config = (array) PluginHelper::getPlugin('multifactorauth', 'fixed'); $subject = $container->get(DispatcherInterface::class); return new Fixed($subject, $config); } ); } }; PK@A#]����.�.-multifactorauth/fixed/src/Extension/Fixed.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.fixed * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Multifactorauth\Fixed\Extension; use Joomla\CMS\Event\MultiFactor\Captive; use Joomla\CMS\Event\MultiFactor\GetMethod; use Joomla\CMS\Event\MultiFactor\GetSetup; use Joomla\CMS\Event\MultiFactor\SaveSetup; use Joomla\CMS\Event\MultiFactor\Validate; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\User\User; use Joomla\Component\Users\Administrator\DataShape\CaptiveRenderOptions; use Joomla\Component\Users\Administrator\DataShape\MethodDescriptor; use Joomla\Component\Users\Administrator\DataShape\SetupRenderOptions; use Joomla\Component\Users\Administrator\Table\MfaTable; use Joomla\Event\SubscriberInterface; use Joomla\Input\Input; use RuntimeException; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! Multi-factor Authentication using a fixed code. * * Requires a static string (password), different for each user. It effectively works as a second * password. The fixed code is stored hashed, like a regular password. * * This is NOT to be used on production sites. It serves as a demonstration plugin and as a template * for developers to create their own custom Multi-factor Authentication plugins. * * @since 4.2.0 */ class Fixed extends CMSPlugin implements SubscriberInterface { /** * Affects constructor behavior. If true, language files will be loaded automatically. * * @var boolean * @since 4.2.0 */ protected $autoloadLanguage = true; /** * The MFA Method name handled by this plugin * * @var string * @since 4.2.0 */ private $mfaMethodName = 'fixed'; /** * Should I try to detect and register legacy event listeners, i.e. methods which accept unwrapped arguments? While * this maintains a great degree of backwards compatibility to Joomla! 3.x-style plugins it is much slower. You are * advised to implement your plugins using proper Listeners, methods accepting an AbstractEvent as their sole * parameter, for best performance. Also bear in mind that Joomla! 5.x onwards will only allow proper listeners, * removing support for legacy Listeners. * * @var boolean * @since 4.2.0 * * @deprecated 4.3 will be removed in 6.0 * Implement your plugin methods accepting an AbstractEvent object * Example: * onEventTriggerName(AbstractEvent $event) { * $context = $event->getArgument(...); * } */ protected $allowLegacyListeners = false; /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.2.0 */ public static function getSubscribedEvents(): array { return [ 'onUserMultifactorGetMethod' => 'onUserMultifactorGetMethod', 'onUserMultifactorCaptive' => 'onUserMultifactorCaptive', 'onUserMultifactorGetSetup' => 'onUserMultifactorGetSetup', 'onUserMultifactorSaveSetup' => 'onUserMultifactorSaveSetup', 'onUserMultifactorValidate' => 'onUserMultifactorValidate', ]; } /** * Gets the identity of this MFA Method * * @param GetMethod $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorGetMethod(GetMethod $event): void { $event->addResult( new MethodDescriptor( [ 'name' => $this->mfaMethodName, 'display' => Text::_('PLG_MULTIFACTORAUTH_FIXED_LBL_DISPLAYEDAS'), 'shortinfo' => Text::_('PLG_MULTIFACTORAUTH_FIXED_LBL_SHORTINFO'), 'image' => 'media/plg_multifactorauth_fixed/images/fixed.svg', ] ) ); } /** * Returns the information which allows Joomla to render the Captive MFA page. This is the page * which appears right after you log in and asks you to validate your login with MFA. * * @param Captive $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorCaptive(Captive $event): void { /** * @var MfaTable $record The record currently selected by the user. */ $record = $event['record']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { return; } $event->addResult( new CaptiveRenderOptions( [ // Custom HTML to display above the MFA form 'pre_message' => Text::_('PLG_MULTIFACTORAUTH_FIXED_LBL_PREMESSAGE'), // How to render the MFA code field. "input" (HTML input element) or "custom" (custom HTML) 'field_type' => 'input', // The type attribute for the HTML input box. Typically "text" or "password". Use any HTML5 input type. 'input_type' => 'password', // Placeholder text for the HTML input box. Leave empty if you don't need it. 'placeholder' => Text::_('PLG_MULTIFACTORAUTH_FIXED_LBL_PLACEHOLDER'), // Label to show above the HTML input box. Leave empty if you don't need it. 'label' => Text::_('PLG_MULTIFACTORAUTH_FIXED_LBL_LABEL'), // Custom HTML. Only used when field_type = custom. 'html' => '', // Custom HTML to display below the MFA form 'post_message' => Text::_('PLG_MULTIFACTORAUTH_FIXED_LBL_POSTMESSAGE'), ] ) ); } /** * Returns the information which allows Joomla to render the MFA setup page. This is the page * which allows the user to add or modify a MFA Method for their user account. If the record * does not correspond to your plugin return an empty array. * * @param GetSetup $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorGetSetup(GetSetup $event): void { /** @var MfaTable $record The record currently selected by the user. */ $record = $event['record']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { return; } // Load the options from the record (if any) $options = $this->decodeRecordOptions($record); /** * Return the parameters used to render the GUI. * * Some MFA Methods need to display a different interface before and after the setup. For example, when setting * up Google Authenticator or a hardware OTP dongle you need the user to enter a MFA code to verify they are in * possession of a correctly configured device. After the setup is complete you don't want them to see that * field again. In the first state you could use the tabular_data to display the setup values, pre_message to * display the QR code and field_type=input to let the user enter the MFA code. In the second state do the same * BUT set field_type=custom, set html='' and show_submit=false to effectively hide the setup form from the * user. */ $event->addResult( new SetupRenderOptions( [ 'default_title' => Text::_('PLG_MULTIFACTORAUTH_FIXED_LBL_DEFAULTTITLE'), 'pre_message' => Text::_('PLG_MULTIFACTORAUTH_FIXED_LBL_SETUP_PREMESSAGE'), 'field_type' => 'input', 'input_type' => 'password', 'input_value' => $options->fixed_code, 'placeholder' => Text::_('PLG_MULTIFACTORAUTH_FIXED_LBL_PLACEHOLDER'), 'label' => Text::_('PLG_MULTIFACTORAUTH_FIXED_LBL_LABEL'), 'post_message' => Text::_('PLG_MULTIFACTORAUTH_FIXED_LBL_SETUP_POSTMESSAGE'), ] ) ); } /** * Parse the input from the MFA setup page and return the configuration information to be saved to the database. If * the information is invalid throw a RuntimeException to signal the need to display the editor page again. The * message of the exception will be displayed to the user. If the record does not correspond to your plugin return * an empty array. * * @param SaveSetup $event The event we are handling * * @return void The configuration data to save to the database * @since 4.2.0 */ public function onUserMultifactorSaveSetup(SaveSetup $event): void { /** * @var MfaTable $record The record currently selected by the user. * @var Input $input The user input you are going to take into account. */ $record = $event['record']; $input = $event['input']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { return; } // Load the options from the record (if any) $options = $this->decodeRecordOptions($record); // Merge with the submitted form data $code = $input->get('code', $options->fixed_code, 'raw'); // Make sure the code is not empty if (empty($code)) { throw new \RuntimeException(Text::_('PLG_MULTIFACTORAUTH_FIXED_ERR_EMPTYCODE')); } // Return the configuration to be serialized $event->addResult(['fixed_code' => $code]); } /** * Validates the Multi-factor Authentication code submitted by the user in the Multi-Factor * Authentication. If the record does not correspond to your plugin return FALSE. * * @param Validate $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorValidate(Validate $event): void { /** * @var MfaTable $record The MFA Method's record you're validating against * @var User $user The user record * @var string|null $code The submitted code */ $record = $event['record']; $user = $event['user']; $code = $event['code']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { $event->addResult(false); return; } // Load the options from the record (if any) $options = $this->decodeRecordOptions($record); // Double check the MFA Method is for the correct user if ($user->id != $record->user_id) { $event->addResult(false); return; } // Check the MFA code for validity $event->addResult(hash_equals($options->fixed_code, $code ?? '')); } /** * Decodes the options from a record into an options object. * * @param MfaTable $record The record to decode options for * * @return object * @since 4.2.0 */ private function decodeRecordOptions(MfaTable $record): object { $options = [ 'fixed_code' => '', ]; if (!empty($record->options)) { $recordOptions = $record->options; $options = array_merge($options, $recordOptions); } return (object) $options; } } PK@A#]�}^-multifactorauth/yubikey/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.yubikey * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') || die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Multifactorauth\Yubikey\Extension\Yubikey; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.2.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $config = (array) PluginHelper::getPlugin('multifactorauth', 'yubikey'); $subject = $container->get(DispatcherInterface::class); $plugin = new Yubikey($subject, $config); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]�C0�R�R1multifactorauth/yubikey/src/Extension/Yubikey.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.yubikey * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Multifactorauth\Yubikey\Extension; use Exception; use Joomla\CMS\Event\MultiFactor\Captive; use Joomla\CMS\Event\MultiFactor\GetMethod; use Joomla\CMS\Event\MultiFactor\GetSetup; use Joomla\CMS\Event\MultiFactor\SaveSetup; use Joomla\CMS\Event\MultiFactor\Validate; use Joomla\CMS\Http\HttpFactory; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Uri\Uri; use Joomla\CMS\User\User; use Joomla\Component\Users\Administrator\DataShape\CaptiveRenderOptions; use Joomla\Component\Users\Administrator\DataShape\MethodDescriptor; use Joomla\Component\Users\Administrator\DataShape\SetupRenderOptions; use Joomla\Component\Users\Administrator\Helper\Mfa as MfaHelper; use Joomla\Component\Users\Administrator\Table\MfaTable; use Joomla\Event\SubscriberInterface; use Joomla\Input\Input; use RuntimeException; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! Multi-factor Authentication using Yubikey Plugin * * @since 4.2.0 */ class Yubikey extends CMSPlugin implements SubscriberInterface { /** * Affects constructor behavior. If true, language files will be loaded automatically. * * @var boolean * @since 3.2 */ protected $autoloadLanguage = true; /** * The MFA Method name handled by this plugin * * @var string * @since 4.2.0 */ private $mfaMethodName = 'yubikey'; /** * Should I try to detect and register legacy event listeners, i.e. methods which accept unwrapped arguments? While * this maintains a great degree of backwards compatibility to Joomla! 3.x-style plugins it is much slower. You are * advised to implement your plugins using proper Listeners, methods accepting an AbstractEvent as their sole * parameter, for best performance. Also bear in mind that Joomla! 5.x onwards will only allow proper listeners, * removing support for legacy Listeners. * * @var boolean * @since 4.2.0 * * @deprecated 4.3 will be removed in 6.0 * Implement your plugin methods accepting an AbstractEvent object * Example: * onEventTriggerName(AbstractEvent $event) { * $context = $event->getArgument(...); * } */ protected $allowLegacyListeners = false; /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.2.0 */ public static function getSubscribedEvents(): array { return [ 'onUserMultifactorGetMethod' => 'onUserMultifactorGetMethod', 'onUserMultifactorCaptive' => 'onUserMultifactorCaptive', 'onUserMultifactorGetSetup' => 'onUserMultifactorGetSetup', 'onUserMultifactorSaveSetup' => 'onUserMultifactorSaveSetup', 'onUserMultifactorValidate' => 'onUserMultifactorValidate', ]; } /** * Gets the identity of this MFA Method * * @param GetMethod $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorGetMethod(GetMethod $event): void { $event->addResult( new MethodDescriptor( [ 'name' => $this->mfaMethodName, 'display' => Text::_('PLG_MULTIFACTORAUTH_YUBIKEY_METHOD_TITLE'), 'shortinfo' => Text::_('PLG_MULTIFACTORAUTH_YUBIKEY_SHORTINFO'), 'image' => 'media/plg_multifactorauth_yubikey/images/yubikey.svg', 'allowEntryBatching' => true, ] ) ); } /** * Returns the information which allows Joomla to render the Captive MFA page. This is the page * which appears right after you log in and asks you to validate your login with MFA. * * @param Captive $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorCaptive(Captive $event): void { /** * @var MfaTable $record The record currently selected by the user. */ $record = $event['record']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { return; } $event->addResult( new CaptiveRenderOptions( [ // Custom HTML to display above the MFA form 'pre_message' => Text::_('PLG_MULTIFACTORAUTH_YUBIKEY_CAPTIVE_PROMPT'), // How to render the MFA code field. "input" (HTML input element) or "custom" (custom HTML) 'field_type' => 'input', // The type attribute for the HTML input box. Typically "text" or "password". Use any HTML5 input type. 'input_type' => 'text', // Placeholder text for the HTML input box. Leave empty if you don't need it. 'placeholder' => '', // Label to show above the HTML input box. Leave empty if you don't need it. 'label' => Text::_('PLG_MULTIFACTORAUTH_YUBIKEY_CODE_LABEL'), // Custom HTML. Only used when field_type = custom. 'html' => '', // Custom HTML to display below the MFA form 'post_message' => '', // Allow authentication against all entries of this MFA Method. 'allowEntryBatching' => 1, ] ) ); } /** * Returns the information which allows Joomla to render the MFA setup page. This is the page * which allows the user to add or modify a MFA Method for their user account. If the record * does not correspond to your plugin return an empty array. * * @param GetSetup $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorGetSetup(GetSetup $event): void { /** * @var MfaTable $record The record currently selected by the user. */ $record = $event['record']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { return; } // Load the options from the record (if any) $options = $this->decodeRecordOptions($record); $keyID = $options['id'] ?? ''; if (empty($keyID)) { $event->addResult( new SetupRenderOptions( [ 'default_title' => Text::_('PLG_MULTIFACTORAUTH_YUBIKEY_METHOD_TITLE'), 'pre_message' => Text::_('PLG_MULTIFACTORAUTH_YUBIKEY_LBL_SETUP_INSTRUCTIONS'), 'field_type' => 'input', 'input_type' => 'text', 'input_value' => $keyID, 'placeholder' => Text::_('PLG_MULTIFACTORAUTH_YUBIKEY_LBL_SETUP_PLACEHOLDER'), 'label' => Text::_('PLG_MULTIFACTORAUTH_YUBIKEY_LBL_SETUP_LABEL'), ] ) ); } else { $event->addResult( new SetupRenderOptions( [ 'default_title' => Text::_('PLG_MULTIFACTORAUTH_YUBIKEY_METHOD_TITLE'), 'pre_message' => Text::sprintf('PLG_MULTIFACTORAUTH_YUBIKEY_LBL_AFTERSETUP_INSTRUCTIONS', $keyID), 'input_type' => 'hidden', ] ) ); } } /** * Parse the input from the MFA setup page and return the configuration information to be saved to the database. If * the information is invalid throw a RuntimeException to signal the need to display the editor page again. The * message of the exception will be displayed to the user. If the record does not correspond to your plugin return * an empty array. * * @param SaveSetup $event The event we are handling * * @return void The configuration data to save to the database * @throws \Exception * @since 4.2.0 */ public function onUserMultifactorSaveSetup(SaveSetup $event): void { /** * @var MfaTable $record The record currently selected by the user. * @var Input $input The user input you are going to take into account. */ $record = $event['record']; $input = $event['input']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { return; } // Load the options from the record (if any) $options = $this->decodeRecordOptions($record); $keyID = $options['id'] ?? ''; $isKeyAlreadySetup = !empty($keyID); /** * If the submitted code is 12 characters and identical to our existing key there is no change, perform no * further checks. */ $code = $input->getString('code'); if ($isKeyAlreadySetup || ((strlen($code) == 12) && ($code == $keyID))) { $event->addResult($options); return; } // If an empty code or something other than 44 characters was submitted I'm not having any of this! if (empty($code) || (strlen($code) != 44)) { throw new \RuntimeException(Text::_('PLG_MULTIFACTORAUTH_YUBIKEY_ERR_VALIDATIONFAILED'), 500); } // Validate the code $isValid = $this->validateYubikeyOtp($code); if (!$isValid) { throw new \RuntimeException(Text::_('PLG_MULTIFACTORAUTH_YUBIKEY_ERR_VALIDATIONFAILED'), 500); } // The code is valid. Keep the Yubikey ID (first twelve characters) $keyID = substr($code, 0, 12); // Return the configuration to be serialized $event->addResult(['id' => $keyID]); } /** * Validates the Multi-factor Authentication code submitted by the user in the Multi-Factor * Authentication page. If the record does not correspond to your plugin return FALSE. * * @param Validate $event The event we are handling * * @return void * @throws \Exception * @since 4.2.0 */ public function onUserMultifactorValidate(Validate $event): void { /** * @var MfaTable $record The MFA Method's record you're validating against * @var User $user The user record * @var string $code The submitted code */ $record = $event['record']; $user = $event['user']; $code = $event['code']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { $event->addResult(false); return; } // Double check the MFA Method is for the correct user if ($user->id != $record->user_id) { $event->addResult(false); return; } try { $records = MfaHelper::getUserMfaRecords($record->user_id); $records = array_filter( $records, function ($rec) use ($record) { return $rec->method === $record->method; } ); } catch (\Exception $e) { $records = []; } // Loop all records, stop if at least one matches $result = array_reduce( $records, function (bool $carry, $aRecord) use ($code) { return $carry || $this->validateAgainstRecord($aRecord, $code); }, false ); $event->addResult($result); } /** * Validates a Yubikey OTP against the Yubikey servers * * @param string $otp The OTP generated by your Yubikey * * @return boolean True if it's a valid OTP * @throws \Exception * @since 4.2.0 */ private function validateYubikeyOtp(string $otp): bool { // Let the user define a client ID and a secret key in the plugin's configuration $clientID = $this->params->get('client_id', 1); $secretKey = $this->params->get('secret', ''); $serverQueue = trim($this->params->get('servers', '')); if (!empty($serverQueue)) { $serverQueue = explode("\r", $serverQueue); } if (empty($serverQueue)) { $serverQueue = [ 'https://api.yubico.com/wsapi/2.0/verify', 'https://api2.yubico.com/wsapi/2.0/verify', 'https://api3.yubico.com/wsapi/2.0/verify', 'https://api4.yubico.com/wsapi/2.0/verify', 'https://api5.yubico.com/wsapi/2.0/verify', ]; } shuffle($serverQueue); $gotResponse = false; $http = HttpFactory::getHttp(); $token = $this->getApplication()->getFormToken(); $nonce = md5($token . uniqid(random_int(0, mt_getrandmax()))); $response = null; while (!$gotResponse && !empty($serverQueue)) { $server = array_shift($serverQueue); $uri = new Uri($server); // The client ID for signing the response $uri->setVar('id', $clientID); // The OTP we read from the user $uri->setVar('otp', $otp); // This prevents a REPLAYED_OTP status if the token doesn't change after a user submits an invalid OTP $uri->setVar('nonce', $nonce); // Minimum service level required: 50% (at least 50% of the YubiCloud servers must reply positively for the // OTP to validate) $uri->setVar('sl', 50); // Timeout waiting for YubiCloud servers to reply: 5 seconds. $uri->setVar('timeout', 5); // Set up the optional HMAC-SHA1 signature for the request. $this->signRequest($uri, $secretKey); if ($uri->hasVar('h')) { $uri->setVar('h', urlencode($uri->getVar('h'))); } try { $response = $http->get($uri->toString(), [], 6); if (!empty($response)) { $gotResponse = true; } else { continue; } } catch (\Exception $exc) { // No response, continue with the next server continue; } } if (empty($response)) { $gotResponse = false; } // No server replied; we can't validate this OTP if (!$gotResponse) { return false; } // Parse response $lines = explode("\n", $response->body); $data = []; foreach ($lines as $line) { $line = trim($line); $parts = explode('=', $line, 2); if (count($parts) < 2) { continue; } $data[$parts[0]] = $parts[1]; } // Validate the signature $h = $data['h'] ?? null; $fakeUri = Uri::getInstance('http://www.example.com'); $fakeUri->setQuery($data); $this->signRequest($fakeUri, $secretKey); $calculatedH = $fakeUri->getVar('h', null); if ($calculatedH != $h) { return false; } // Validate the response - We need an OK message reply if ($data['status'] !== 'OK') { return false; } // Validate the response - We need a confidence level over 50% if ($data['sl'] < 50) { return false; } // Validate the response - The OTP must match if ($data['otp'] != $otp) { return false; } // Validate the response - The token must match if ($data['nonce'] != $nonce) { return false; } return true; } /** * Sign the request to YubiCloud. * * @param Uri $uri The request URI to sign * @param string $secret The secret key to sign with * * @return void * @since 4.2.0 * * @see https://developers.yubico.com/yubikey-val/Validation_Protocol_V2.0.html */ private function signRequest(Uri $uri, string $secret): void { // Make sure we have an encoding secret $secret = trim($secret); if (empty($secret)) { return; } // I will need base64 encoding and decoding if (!function_exists('base64_encode') || !function_exists('base64_decode')) { return; } // I need HMAC-SHA-1 support. Therefore I check for HMAC and SHA1 support in the PHP 'hash' extension. if (!function_exists('hash_hmac') || !function_exists('hash_algos')) { return; } $algos = hash_algos(); if (!in_array('sha1', $algos)) { return; } // Get the parameters /** @var array $vars I have to explicitly state the type because the Joomla docblock is wrong :( */ $vars = $uri->getQuery(true); // 'h' is the hash and it doesn't participate in the calculation of itself. if (isset($vars['h'])) { unset($vars['h']); } // Alphabetically sort the set of key/value pairs by key order. ksort($vars); /** * Construct a single line with each ordered key/value pair concatenated using &, and each key and value * concatenated with =. Do not add any line breaks. Do not add whitespace. * * Now, if you thought I can't really write PHP code, a.k.a. why not use http_build_query, read on. * * The way YubiKey expects the query to be built is UTTERLY WRONG. They are doing string concatenation, not * URL query building! Therefore you cannot use http_build_query(). Instead, you need to use dumb string * concatenation. I kid you not. If you want to laugh (or cry) read their Auth_Yubico class. It's 1998 all over * again. */ $stringToSign = ''; foreach ($vars as $k => $v) { $stringToSign .= '&' . $k . '=' . $v; } $stringToSign = ltrim($stringToSign, '&'); /** * Apply the HMAC-SHA-1 algorithm on the line as an octet string using the API key as key (remember to * base64decode the API key obtained from Yubico). */ $decodedKey = base64_decode($secret); $hash = hash_hmac('sha1', $stringToSign, $decodedKey, true); /** * Base 64 encode the resulting value according to RFC 4648, for example, t2ZMtKeValdA+H0jVpj3LIichn4= */ $h = base64_encode($hash); /** * Append the value under key h to the message. */ $uri->setVar('h', $h); } /** * Decodes the options from a record into an options object. * * @param MfaTable $record The record to decode * * @return array * @since 4.2.0 */ private function decodeRecordOptions(MfaTable $record): array { $options = [ 'id' => '', ]; if (!empty($record->options)) { $recordOptions = $record->options; $options = array_merge($options, $recordOptions); } return $options; } /** * @param MfaTable $record The record to validate against * @param string $code The code given to us by the user * * @return boolean * @throws \Exception * @since 4.2.0 */ private function validateAgainstRecord(MfaTable $record, string $code): bool { // Load the options from the record (if any) $options = $this->decodeRecordOptions($record); $keyID = $options['id'] ?? ''; // If there is no key in the options throw an error if (empty($keyID)) { return false; } // If the submitted code is empty throw an error if (empty($code)) { return false; } // If the submitted code length is wrong throw an error if (strlen($code) != 44) { return false; } // If the submitted code's key ID does not match the stored throw an error if (substr($code, 0, 12) != $keyID) { return false; } // Check the OTP code for validity return $this->validateYubikeyOtp($code); } } PK@A#]=�z��#multifactorauth/yubikey/yubikey.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="multifactorauth" method="upgrade"> <name>plg_multifactorauth_yubikey</name> <author>Joomla! Project</author> <creationDate>2013-09</creationDate> <copyright>(C) 2013 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.2.0</version> <description>PLG_MULTIFACTORAUTH_YUBIKEY_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Multifactorauth\Yubikey</namespace> <files> <folder plugin="yubikey">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_multifactorauth_yubikey.ini</language> <language tag="en-GB">language/en-GB/plg_multifactorauth_yubikey.sys.ini</language> </languages> </extension> PK@A#]�Pp��+multifactorauth/email/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.email * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') || die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\User\UserFactoryInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Multifactorauth\Email\Extension\Email; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.2.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $config = (array) PluginHelper::getPlugin('multifactorauth', 'email'); $subject = $container->get(DispatcherInterface::class); $plugin = new Email($subject, $config); $plugin->setApplication(Factory::getApplication()); $plugin->setUserFactory($container->get(UserFactoryInterface::class)); return $plugin; } ); } }; PK@A#]�o; �T�T-multifactorauth/email/src/Extension/Email.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.email * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Multifactorauth\Email\Extension; use Exception; use Joomla\CMS\Encrypt\Totp; use Joomla\CMS\Event\MultiFactor\BeforeDisplayMethods; use Joomla\CMS\Event\MultiFactor\Captive; use Joomla\CMS\Event\MultiFactor\GetMethod; use Joomla\CMS\Event\MultiFactor\GetSetup; use Joomla\CMS\Event\MultiFactor\SaveSetup; use Joomla\CMS\Event\MultiFactor\Validate; use Joomla\CMS\Factory; use Joomla\CMS\Input\Input; use Joomla\CMS\Language\Text; use Joomla\CMS\Log\Log; use Joomla\CMS\Mail\Exception\MailDisabledException; use Joomla\CMS\Mail\MailTemplate; use Joomla\CMS\MVC\Factory\MVCFactoryInterface; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Uri\Uri; use Joomla\CMS\User\User; use Joomla\CMS\User\UserFactoryAwareTrait; use Joomla\Component\Users\Administrator\DataShape\CaptiveRenderOptions; use Joomla\Component\Users\Administrator\DataShape\MethodDescriptor; use Joomla\Component\Users\Administrator\DataShape\SetupRenderOptions; use Joomla\Component\Users\Administrator\Helper\Mfa as MfaHelper; use Joomla\Component\Users\Administrator\Table\MfaTable; use Joomla\Event\SubscriberInterface; use PHPMailer\PHPMailer\Exception as phpMailerException; use RuntimeException; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! Multi-factor Authentication using a Validation Code sent by Email. * * Requires entering a 6-digit code sent to the user through email. These codes change automatically * on a frequency set in the plugin options (30 seconds to 5 minutes, default 2 minutes). * * @since 4.2.0 */ class Email extends CMSPlugin implements SubscriberInterface { use UserFactoryAwareTrait; /** * Generated OTP length. Constant: 6 numeric digits. * * @since 4.2.0 */ private const CODE_LENGTH = 6; /** * Length of the secret key used for generating the OTPs. Constant: 20 characters. * * @since 4.2.0 */ private const SECRET_KEY_LENGTH = 20; /** * Should I try to detect and register legacy event listeners, i.e. methods which accept unwrapped arguments? While * this maintains a great degree of backwards compatibility to Joomla! 3.x-style plugins it is much slower. You are * advised to implement your plugins using proper Listeners, methods accepting an AbstractEvent as their sole * parameter, for best performance. Also bear in mind that Joomla! 5.x onwards will only allow proper listeners, * removing support for legacy Listeners. * * @var boolean * @since 4.2.0 * * @deprecated 4.3 will be removed in 6.0 * Implement your plugin methods accepting an AbstractEvent object * Example: * onEventTriggerName(AbstractEvent $event) { * $context = $event->getArgument(...); * } */ protected $allowLegacyListeners = false; /** * Autoload this plugin's language files * * @var boolean * @since 4.2.0 */ protected $autoloadLanguage = true; /** * The MFA Method name handled by this plugin * * @var string * @since 4.2.0 */ private $mfaMethodName = 'email'; /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.2.0 */ public static function getSubscribedEvents(): array { return [ 'onUserMultifactorGetMethod' => 'onUserMultifactorGetMethod', 'onUserMultifactorCaptive' => 'onUserMultifactorCaptive', 'onUserMultifactorGetSetup' => 'onUserMultifactorGetSetup', 'onUserMultifactorSaveSetup' => 'onUserMultifactorSaveSetup', 'onUserMultifactorValidate' => 'onUserMultifactorValidate', 'onUserMultifactorBeforeDisplayMethods' => 'onUserMultifactorBeforeDisplayMethods', ]; } /** * Gets the identity of this MFA Method * * @param GetMethod $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorGetMethod(GetMethod $event): void { $event->addResult( new MethodDescriptor( [ 'name' => $this->mfaMethodName, 'display' => Text::_('PLG_MULTIFACTORAUTH_EMAIL_LBL_DISPLAYEDAS'), 'shortinfo' => Text::_('PLG_MULTIFACTORAUTH_EMAIL_LBL_SHORTINFO'), 'image' => 'media/plg_multifactorauth_email/images/email.svg', ] ) ); } /** * Returns the information which allows Joomla to render the Captive MFA page. This is the page * which appears right after you log in and asks you to validate your login with MFA. * * @param Captive $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorCaptive(Captive $event): void { /** * @var MfaTable $record The record currently selected by the user. */ $record = $event['record']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { return; } // Load the options from the record (if any) $options = $this->decodeRecordOptions($record); $key = $options['key'] ?? ''; // Send an email message with a new code and ask the user to enter it. $user = $this->getUserFactory()->loadUserById($record->user_id); try { $this->sendCode($key, $user); } catch (\Exception $e) { return; } $event->addResult( new CaptiveRenderOptions( [ // Custom HTML to display above the MFA form 'pre_message' => Text::_('PLG_MULTIFACTORAUTH_EMAIL_LBL_PRE_MESSAGE'), // How to render the MFA code field. "input" (HTML input element) or "custom" (custom HTML) 'field_type' => 'input', // The type attribute for the HTML input box. Typically "text" or "password". Use any HTML5 input type. 'input_type' => 'text', // The attributes for the HTML input box. 'input_attributes' => [ 'pattern' => '[0-9]{6}', 'maxlength' => '6', 'inputmode' => 'numeric', 'required' => 'true', 'autocomplete' => 'one-time-code', 'aria-autocomplete' => 'none', ], // Placeholder text for the HTML input box. Leave empty if you don't need it. 'placeholder' => Text::_('PLG_MULTIFACTORAUTH_EMAIL_LBL_SETUP_PLACEHOLDER'), // Label to show above the HTML input box. Leave empty if you don't need it. 'label' => Text::_('PLG_MULTIFACTORAUTH_EMAIL_LBL_LABEL'), // Custom HTML. Only used when field_type = custom. 'html' => '', // Custom HTML to display below the MFA form 'post_message' => '', // Should I hide the default Submit button? 'hide_submit' => false, // Is this MFA method validating against all configured authenticators of the same type? 'allowEntryBatching' => false, ] ) ); } /** * Returns the information which allows Joomla to render the MFA setup page. This is the page * which allows the user to add or modify a MFA Method for their user account. If the record * does not correspond to your plugin return an empty array. * * @param GetSetup $event The event we are handling * * @return void * @throws \Exception * @since 4.2.0 */ public function onUserMultifactorGetSetup(GetSetup $event): void { /** @var MfaTable $record The record currently selected by the user. */ $record = $event['record']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { return; } // Load the options from the record (if any) $options = $this->decodeRecordOptions($record); $key = $options['key'] ?? ''; $isKeyAlreadySetup = !empty($key); // If there's a key in the session use that instead. $session = $this->getApplication()->getSession(); $session->get('plg_multifactorauth_email.emailcode.key', $key); // Initialize objects $timeStep = min(max((int) $this->params->get('timestep', 120), 30), 900); $totp = new Totp($timeStep, self::CODE_LENGTH, self::SECRET_KEY_LENGTH); // If there's still no key in the options, generate one and save it in the session if (!$isKeyAlreadySetup) { $key = $totp->generateSecret(); $session->set('plg_multifactorauth_email.emailcode.key', $key); $session->set('plg_multifactorauth_email.emailcode.user_id', $record->user_id); $user = $this->getUserFactory()->loadUserById($record->user_id); $this->sendCode($key, $user); $event->addResult( new SetupRenderOptions( [ 'default_title' => Text::_('PLG_MULTIFACTORAUTH_EMAIL_LBL_DISPLAYEDAS'), 'hidden_data' => [ 'key' => $key, ], 'field_type' => 'input', 'input_type' => 'text', 'input_attributes' => [ 'pattern' => '[0-9]{6}', 'maxlength' => '6', 'inputmode' => 'numeric', 'required' => 'true', 'autocomplete' => 'one-time-code', 'aria-autocomplete' => 'none', ], 'input_value' => '', 'placeholder' => Text::_('PLG_MULTIFACTORAUTH_EMAIL_LBL_SETUP_PLACEHOLDER'), 'pre_message' => Text::_('PLG_MULTIFACTORAUTH_EMAIL_LBL_PRE_MESSAGE'), 'label' => Text::_('PLG_MULTIFACTORAUTH_EMAIL_LBL_LABEL'), ] ) ); } else { $event->addResult( new SetupRenderOptions( [ 'default_title' => Text::_('PLG_MULTIFACTORAUTH_EMAIL_LBL_DISPLAYEDAS'), 'input_type' => 'hidden', 'html' => '', ] ) ); } } /** * Parse the input from the MFA setup page and return the configuration information to be saved to the database. If * the information is invalid throw a RuntimeException to signal the need to display the editor page again. The * message of the exception will be displayed to the user. If the record does not correspond to your plugin return * an empty array. * * @param SaveSetup $event The event we are handling * * @return void The configuration data to save to the database * @since 4.2.0 */ public function onUserMultifactorSaveSetup(SaveSetup $event): void { /** * @var MfaTable $record The record currently selected by the user. * @var Input $input The user input you are going to take into account. */ $record = $event['record']; $input = $event['input']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { return; } // Load the options from the record (if any) $options = $this->decodeRecordOptions($record); $key = $options['key'] ?? ''; $isKeyAlreadySetup = !empty($key); $session = $this->getApplication()->getSession(); // If there is no key in the options fetch one from the session if (empty($key)) { $key = $session->get('plg_multifactorauth_email.emailcode.key', null); } // If there is still no key in the options throw an error if (empty($key)) { throw new \RuntimeException(Text::_('JERROR_ALERTNOAUTHOR'), 403); } /** * If the code is empty but the key already existed in $options someone is simply changing the title / default * Method status. We can allow this and stop checking anything else now. */ $code = $input->getCmd('code'); if (empty($code) && $isKeyAlreadySetup) { $event->addResult($options); return; } // In any other case validate the submitted code $timeStep = min(max((int) $this->params->get('timestep', 120), 30), 900); $totp = new Totp($timeStep, self::CODE_LENGTH, self::SECRET_KEY_LENGTH); $isValid = $totp->checkCode((string) $key, (string) $code); if (!$isValid) { throw new \RuntimeException(Text::_('PLG_MULTIFACTORAUTH_EMAIL_ERR_INVALID_CODE'), 500); } // The code is valid. Unset the key from the session. $session->set('plg_multifactorauth_email.emailcode.key', null); // Return the configuration to be serialized $event->addResult(['key' => $key]); } /** * Validates the Multi-factor Authentication code submitted by the user in the Multi-Factor * Authentication page. If the record does not correspond to your plugin return FALSE. * * @param Validate $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorValidate(Validate $event): void { /** * @var MfaTable $record The MFA Method's record you're validating against * @var User $user The user record * @var string|null $code The submitted code */ $record = $event['record']; $user = $event['user']; $code = $event['code']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { $event->addResult(false); return; } // Double check the MFA Method is for the correct user if ($user->id != $record->user_id) { $event->addResult(false); return; } // Load the options from the record (if any) $options = $this->decodeRecordOptions($record); $key = $options['key'] ?? ''; // If there is no key in the options throw an error if (empty($key)) { $event->addResult(false); return; } // Check the MFA code for validity $timeStep = min(max((int) $this->params->get('timestep', 120), 30), 900); $totp = new Totp($timeStep, self::CODE_LENGTH, self::SECRET_KEY_LENGTH); $event->addResult($totp->checkCode($key, (string) $code)); } /** * Executes before showing the MFA Methods for the user. Used for the Force Enable feature. * * @param BeforeDisplayMethods $event The event we are handling * * @return void * @throws \Exception * @since 4.2.0 */ public function onUserMultifactorBeforeDisplayMethods(BeforeDisplayMethods $event): void { /** @var ?User $user */ $user = $event['user']; // Is the forced enable feature activated? if ($this->params->get('force_enable', 0) != 1) { return; } // Get MFA Methods for this user $userMfaRecords = MfaHelper::getUserMfaRecords($user->id); // If there are no Methods go back if (\count($userMfaRecords) < 1) { return; } // If the only Method is backup codes go back if (\count($userMfaRecords) == 1) { /** @var MfaTable $record */ $record = reset($userMfaRecords); if ($record->method == 'backupcodes') { return; } } // If I already have the email Method go back $emailRecords = array_filter( $userMfaRecords, function (MfaTable $record) { return $record->method == 'email'; } ); if (\count($emailRecords)) { return; } // Add the email Method try { /** @var MVCFactoryInterface $factory */ $factory = $this->getApplication()->bootComponent('com_users')->getMVCFactory(); /** @var MfaTable $record */ $record = $factory->createTable('Mfa', 'Administrator'); $record->reset(); $timeStep = min(max((int) $this->params->get('timestep', 120), 30), 900); $totp = new Totp($timeStep, self::CODE_LENGTH, self::SECRET_KEY_LENGTH); $record->save( [ 'method' => 'email', 'title' => Text::_('PLG_MULTIFACTORAUTH_EMAIL_LBL_DISPLAYEDAS'), 'options' => [ 'key' => ($totp)->generateSecret(), ], 'default' => 0, 'user_id' => $user->id, ] ); } catch (\Exception $event) { // Fail gracefully } } /** * Decodes the options from a record into an options object. * * @param MfaTable $record The record to decode * * @return array * @since 4.2.0 */ private function decodeRecordOptions(MfaTable $record): array { $options = [ 'key' => '', ]; if (!empty($record->options)) { $recordOptions = $record->options; $options = array_merge($options, $recordOptions); } return $options; } /** * Creates a new TOTP code based on secret key $key and sends it to the user via email. * * @param string $key The TOTP secret key * @param User|null $user The Joomla! user to use * * @return void * @throws \Exception * @since 4.2.0 */ private function sendCode(string $key, ?User $user = null) { static $alreadySent = false; // Make sure we have a user if (!is_object($user) || !($user instanceof User)) { $user = $this->getApplication()->getIdentity() ?: $this->getUserFactory()->loadUserById(0); } if ($alreadySent) { return; } $alreadySent = true; // Get the API objects $timeStep = min(max((int) $this->params->get('timestep', 120), 30), 900); $totp = new Totp($timeStep, self::CODE_LENGTH, self::SECRET_KEY_LENGTH); // Create the list of variable replacements $code = $totp->getCode($key); $replacements = [ 'code' => $code, 'sitename' => $this->getApplication()->get('sitename'), 'siteurl' => Uri::base(), 'username' => $user->username, 'email' => $user->email, 'fullname' => $user->name, ]; try { $jLanguage = $this->getApplication()->getLanguage(); $mailer = new MailTemplate('plg_multifactorauth_email.mail', $jLanguage->getTag()); $mailer->addRecipient($user->email, $user->name); $mailer->addTemplateData($replacements); $didSend = $mailer->send(); } catch (MailDisabledException | phpMailerException $exception) { try { Log::add(Text::_($exception->getMessage()), Log::WARNING, 'jerror'); } catch (\RuntimeException $exception) { $this->getApplication()->enqueueMessage(Text::_($exception->errorMessage()), 'warning'); } } try { // The user somehow managed to not install the mail template. I'll send the email the traditional way. if (isset($didSend) && !$didSend) { $subject = Text::_('PLG_MULTIFACTORAUTH_EMAIL_EMAIL_SUBJECT'); $body = Text::_('PLG_MULTIFACTORAUTH_EMAIL_EMAIL_BODY'); foreach ($replacements as $key => $value) { $subject = str_replace('{' . strtoupper($key) . '}', $value, $subject); $body = str_replace('{' . strtoupper($key) . '}', $value, $body); } $mailer = Factory::getMailer(); $mailer->setSubject($subject); $mailer->setBody($body); $mailer->addRecipient($user->email, $user->name); $mailer->Send(); } } catch (MailDisabledException | phpMailerException $exception) { try { Log::add(Text::_($exception->getMessage()), Log::WARNING, 'jerror'); } catch (\RuntimeException $exception) { $this->getApplication()->enqueueMessage(Text::_($exception->errorMessage()), 'warning'); } } } } PK@A#] Ө��multifactorauth/email/email.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="multifactorauth" method="upgrade"> <name>plg_multifactorauth_email</name> <author>Joomla! Project</author> <creationDate>2022-05</creationDate> <copyright>(C) 2022 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.2.0</version> <description>PLG_MULTIFACTORAUTH_EMAIL_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Multifactorauth\Email</namespace> <files> <folder plugin="email">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_multifactorauth_email.ini</language> <language tag="en-GB">language/en-GB/plg_multifactorauth_email.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="force_enable" type="radio" layout="joomla.form.field.radio.switcher" label="PLG_MULTIFACTORAUTH_EMAIL_CONFIG_FORCE_ENABLE_LABEL" description="PLG_MULTIFACTORAUTH_EMAIL_CONFIG_FORCE_ENABLE_DESC" default="0" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="timestep" type="list" label="PLG_MULTIFACTORAUTH_EMAIL_CONFIG_TIMESTEP_LABEL" description="PLG_MULTIFACTORAUTH_EMAIL_CONFIG_TIMESTEP_DESC" default="120" > <option value="30">PLG_MULTIFACTORAUTH_EMAIL_CONFIG_TIMESTEP_30</option> <option value="60">PLG_MULTIFACTORAUTH_EMAIL_CONFIG_TIMESTEP_60</option> <option value="120">PLG_MULTIFACTORAUTH_EMAIL_CONFIG_TIMESTEP_120</option> <option value="180">PLG_MULTIFACTORAUTH_EMAIL_CONFIG_TIMESTEP_180</option> <option value="300">PLG_MULTIFACTORAUTH_EMAIL_CONFIG_TIMESTEP_300</option> </field> </fieldset> </fields> </config> </extension> PK@A#]3�UY(I(I.multifactorauth/webauthn/src/Hotfix/Server.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.webauthn * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt * @copyright (C) 2014-2019 Spomky-Labs * @license This software may be modified and distributed under the terms * of the MIT license. * See libraries/vendor/web-auth/webauthn-lib/LICENSE */ namespace Joomla\Plugin\Multifactorauth\Webauthn\Hotfix; use Assert\Assertion; use Cose\Algorithm\Algorithm; use Cose\Algorithm\ManagerFactory; use Cose\Algorithm\Signature\ECDSA; use Cose\Algorithm\Signature\EdDSA; use Cose\Algorithm\Signature\RSA; use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; use Psr\Http\Message\ServerRequestInterface; use Webauthn\AttestationStatement\AndroidSafetyNetAttestationStatementSupport; use Webauthn\AttestationStatement\AttestationObjectLoader; use Webauthn\AttestationStatement\AttestationStatementSupportManager; use Webauthn\AttestationStatement\NoneAttestationStatementSupport; use Webauthn\AttestationStatement\PackedAttestationStatementSupport; use Webauthn\AttestationStatement\TPMAttestationStatementSupport; use Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs; use Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler; use Webauthn\AuthenticatorAssertionResponse; use Webauthn\AuthenticatorAssertionResponseValidator; use Webauthn\AuthenticatorAttestationResponse; use Webauthn\AuthenticatorAttestationResponseValidator; use Webauthn\AuthenticatorSelectionCriteria; use Webauthn\MetadataService\MetadataStatementRepository; use Webauthn\PublicKeyCredentialCreationOptions; use Webauthn\PublicKeyCredentialDescriptor; use Webauthn\PublicKeyCredentialLoader; use Webauthn\PublicKeyCredentialParameters; use Webauthn\PublicKeyCredentialRequestOptions; use Webauthn\PublicKeyCredentialRpEntity; use Webauthn\PublicKeyCredentialSource; use Webauthn\PublicKeyCredentialSourceRepository; use Webauthn\PublicKeyCredentialUserEntity; use Webauthn\TokenBinding\TokenBindingNotSupportedHandler; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Customised WebAuthn server object. * * We had to fork the server object from the WebAuthn server package to address an issue with PHP 8. * * We are currently using an older version of the WebAuthn library (2.x) which was written before * PHP 8 was developed. We cannot upgrade the WebAuthn library to a newer major version because of * Joomla's Semantic Versioning promise. * * The FidoU2FAttestationStatementSupport and AndroidKeyAttestationStatementSupport classes force * an assertion on the result of the openssl_pkey_get_public() function, assuming it will return a * resource. However, starting with PHP 8.0 this function returns an OpenSSLAsymmetricKey object * and the assertion fails. As a result, you cannot use Android or FIDO U2F keys with WebAuthn. * * The assertion check is in a private method, therefore we have to fork both attestation support * classes to change the assertion. The assertion takes place through a third party library we * cannot (and should not!) modify. * * The assertions objects, however, are injected to the attestation support manager in a private * method of the Server object. Because literally everything in this class is private we have no * option than to fork the entire class to apply our two forked attestation support classes. * * This is marked as deprecated because we'll be able to upgrade the WebAuthn library on Joomla 5. * * @since 4.2.0 * * @deprecated 4.2 will be removed in 6.0 * Will be removed without replacement * We will upgrade the WebAuthn library to version 3 or later and this will go away. */ class Server extends \Webauthn\Server { /** * @var integer * @since 4.2.0 */ public $timeout = 60000; /** * @var integer * @since 4.2.0 */ public $challengeSize = 32; /** * @var PublicKeyCredentialRpEntity * @since 4.2.0 */ private $rpEntity; /** * @var ManagerFactory * @since 4.2.0 */ private $coseAlgorithmManagerFactory; /** * @var PublicKeyCredentialSourceRepository * @since 4.2.0 */ private $publicKeyCredentialSourceRepository; /** * @var TokenBindingNotSupportedHandler * @since 4.2.0 */ private $tokenBindingHandler; /** * @var ExtensionOutputCheckerHandler * @since 4.2.0 */ private $extensionOutputCheckerHandler; /** * @var string[] * @since 4.2.0 */ private $selectedAlgorithms; /** * @var MetadataStatementRepository|null * @since 4.2.0 */ private $metadataStatementRepository; /** * @var ClientInterface * @since 4.2.0 */ private $httpClient; /** * @var string * @since 4.2.0 */ private $googleApiKey; /** * @var RequestFactoryInterface * @since 4.2.0 */ private $requestFactory; /** * Overridden constructor. * * @param PublicKeyCredentialRpEntity $relayingParty Obvious * @param PublicKeyCredentialSourceRepository $publicKeyCredentialSourceRepository Obvious * @param MetadataStatementRepository|null $metadataStatementRepository Obvious * * @since 4.2.0 */ public function __construct( PublicKeyCredentialRpEntity $relayingParty, PublicKeyCredentialSourceRepository $publicKeyCredentialSourceRepository, ?MetadataStatementRepository $metadataStatementRepository ) { $this->rpEntity = $relayingParty; $this->coseAlgorithmManagerFactory = new ManagerFactory(); $this->coseAlgorithmManagerFactory->add('RS1', new RSA\RS1()); $this->coseAlgorithmManagerFactory->add('RS256', new RSA\RS256()); $this->coseAlgorithmManagerFactory->add('RS384', new RSA\RS384()); $this->coseAlgorithmManagerFactory->add('RS512', new RSA\RS512()); $this->coseAlgorithmManagerFactory->add('PS256', new RSA\PS256()); $this->coseAlgorithmManagerFactory->add('PS384', new RSA\PS384()); $this->coseAlgorithmManagerFactory->add('PS512', new RSA\PS512()); $this->coseAlgorithmManagerFactory->add('ES256', new ECDSA\ES256()); $this->coseAlgorithmManagerFactory->add('ES256K', new ECDSA\ES256K()); $this->coseAlgorithmManagerFactory->add('ES384', new ECDSA\ES384()); $this->coseAlgorithmManagerFactory->add('ES512', new ECDSA\ES512()); $this->coseAlgorithmManagerFactory->add('Ed25519', new EdDSA\Ed25519()); $this->selectedAlgorithms = ['RS256', 'RS512', 'PS256', 'PS512', 'ES256', 'ES512', 'Ed25519']; $this->publicKeyCredentialSourceRepository = $publicKeyCredentialSourceRepository; $this->tokenBindingHandler = new TokenBindingNotSupportedHandler(); $this->extensionOutputCheckerHandler = new ExtensionOutputCheckerHandler(); $this->metadataStatementRepository = $metadataStatementRepository; } /** * @param string[] $selectedAlgorithms Obvious * * @return void * @since 4.2.0 */ public function setSelectedAlgorithms(array $selectedAlgorithms): void { $this->selectedAlgorithms = $selectedAlgorithms; } /** * @param TokenBindingNotSupportedHandler $tokenBindingHandler Obvious * * @return void * @since 4.2.0 */ public function setTokenBindingHandler(TokenBindingNotSupportedHandler $tokenBindingHandler): void { $this->tokenBindingHandler = $tokenBindingHandler; } /** * @param string $alias Obvious * @param Algorithm $algorithm Obvious * * @return void * @since 4.2.0 */ public function addAlgorithm(string $alias, Algorithm $algorithm): void { $this->coseAlgorithmManagerFactory->add($alias, $algorithm); $this->selectedAlgorithms[] = $alias; $this->selectedAlgorithms = array_unique($this->selectedAlgorithms); } /** * @param ExtensionOutputCheckerHandler $extensionOutputCheckerHandler Obvious * * @return void * @since 4.2.0 */ public function setExtensionOutputCheckerHandler(ExtensionOutputCheckerHandler $extensionOutputCheckerHandler): void { $this->extensionOutputCheckerHandler = $extensionOutputCheckerHandler; } /** * @param string|null $userVerification Obvious * @param PublicKeyCredentialDescriptor[] $allowedPublicKeyDescriptors Obvious * @param AuthenticationExtensionsClientInputs|null $extensions Obvious * * @return PublicKeyCredentialRequestOptions * @throws \Exception * @since 4.2.0 */ public function generatePublicKeyCredentialRequestOptions( ?string $userVerification = PublicKeyCredentialRequestOptions::USER_VERIFICATION_REQUIREMENT_PREFERRED, array $allowedPublicKeyDescriptors = [], ?AuthenticationExtensionsClientInputs $extensions = null ): PublicKeyCredentialRequestOptions { return new PublicKeyCredentialRequestOptions( random_bytes($this->challengeSize), $this->timeout, $this->rpEntity->getId(), $allowedPublicKeyDescriptors, $userVerification, $extensions ?? new AuthenticationExtensionsClientInputs() ); } /** * @param PublicKeyCredentialUserEntity $userEntity Obvious * @param string|null $attestationMode Obvious * @param PublicKeyCredentialDescriptor[] $excludedPublicKeyDescriptors Obvious * @param AuthenticatorSelectionCriteria|null $criteria Obvious * @param AuthenticationExtensionsClientInputs|null $extensions Obvious * * @return PublicKeyCredentialCreationOptions * @throws \Exception * @since 4.2.0 */ public function generatePublicKeyCredentialCreationOptions( PublicKeyCredentialUserEntity $userEntity, ?string $attestationMode = PublicKeyCredentialCreationOptions::ATTESTATION_CONVEYANCE_PREFERENCE_NONE, array $excludedPublicKeyDescriptors = [], ?AuthenticatorSelectionCriteria $criteria = null, ?AuthenticationExtensionsClientInputs $extensions = null ): PublicKeyCredentialCreationOptions { $coseAlgorithmManager = $this->coseAlgorithmManagerFactory->create($this->selectedAlgorithms); $publicKeyCredentialParametersList = []; foreach ($coseAlgorithmManager->all() as $algorithm) { $publicKeyCredentialParametersList[] = new PublicKeyCredentialParameters( PublicKeyCredentialDescriptor::CREDENTIAL_TYPE_PUBLIC_KEY, $algorithm::identifier() ); } $criteria = $criteria ?? new AuthenticatorSelectionCriteria(); $extensions = $extensions ?? new AuthenticationExtensionsClientInputs(); $challenge = random_bytes($this->challengeSize); return new PublicKeyCredentialCreationOptions( $this->rpEntity, $userEntity, $challenge, $publicKeyCredentialParametersList, $this->timeout, $excludedPublicKeyDescriptors, $criteria, $attestationMode, $extensions ); } /** * @param string $data Obvious * @param PublicKeyCredentialCreationOptions $publicKeyCredentialCreationOptions Obvious * @param ServerRequestInterface $serverRequest Obvious * * @return PublicKeyCredentialSource * @throws \Assert\AssertionFailedException * @since 4.2.0 */ public function loadAndCheckAttestationResponse( string $data, PublicKeyCredentialCreationOptions $publicKeyCredentialCreationOptions, ServerRequestInterface $serverRequest ): PublicKeyCredentialSource { $attestationStatementSupportManager = $this->getAttestationStatementSupportManager(); $attestationObjectLoader = new AttestationObjectLoader($attestationStatementSupportManager); $publicKeyCredentialLoader = new PublicKeyCredentialLoader($attestationObjectLoader); $publicKeyCredential = $publicKeyCredentialLoader->load($data); $authenticatorResponse = $publicKeyCredential->getResponse(); Assertion::isInstanceOf($authenticatorResponse, AuthenticatorAttestationResponse::class, 'Not an authenticator attestation response'); $authenticatorAttestationResponseValidator = new AuthenticatorAttestationResponseValidator( $attestationStatementSupportManager, $this->publicKeyCredentialSourceRepository, $this->tokenBindingHandler, $this->extensionOutputCheckerHandler ); return $authenticatorAttestationResponseValidator->check($authenticatorResponse, $publicKeyCredentialCreationOptions, $serverRequest); } /** * @param string $data Obvious * @param PublicKeyCredentialRequestOptions $publicKeyCredentialRequestOptions Obvious * @param PublicKeyCredentialUserEntity|null $userEntity Obvious * @param ServerRequestInterface $serverRequest Obvious * * @return PublicKeyCredentialSource * @throws \Assert\AssertionFailedException * @since 4.2.0 */ public function loadAndCheckAssertionResponse( string $data, PublicKeyCredentialRequestOptions $publicKeyCredentialRequestOptions, ?PublicKeyCredentialUserEntity $userEntity, ServerRequestInterface $serverRequest ): PublicKeyCredentialSource { $attestationStatementSupportManager = $this->getAttestationStatementSupportManager(); $attestationObjectLoader = new AttestationObjectLoader($attestationStatementSupportManager); $publicKeyCredentialLoader = new PublicKeyCredentialLoader($attestationObjectLoader); $publicKeyCredential = $publicKeyCredentialLoader->load($data); $authenticatorResponse = $publicKeyCredential->getResponse(); Assertion::isInstanceOf($authenticatorResponse, AuthenticatorAssertionResponse::class, 'Not an authenticator assertion response'); $authenticatorAssertionResponseValidator = new AuthenticatorAssertionResponseValidator( $this->publicKeyCredentialSourceRepository, null, $this->tokenBindingHandler, $this->extensionOutputCheckerHandler, $this->coseAlgorithmManagerFactory->create($this->selectedAlgorithms) ); return $authenticatorAssertionResponseValidator->check( $publicKeyCredential->getRawId(), $authenticatorResponse, $publicKeyCredentialRequestOptions, $serverRequest, null !== $userEntity ? $userEntity->getId() : null ); } /** * @param ClientInterface $client Obvious * @param string $apiKey Obvious * @param RequestFactoryInterface $requestFactory Obvious * * @return void * @since 4.2.0 */ public function enforceAndroidSafetyNetVerification( ClientInterface $client, string $apiKey, RequestFactoryInterface $requestFactory ): void { $this->httpClient = $client; $this->googleApiKey = $apiKey; $this->requestFactory = $requestFactory; } /** * @return AttestationStatementSupportManager * @since 4.2.0 */ private function getAttestationStatementSupportManager(): AttestationStatementSupportManager { $attestationStatementSupportManager = new AttestationStatementSupportManager(); $attestationStatementSupportManager->add(new NoneAttestationStatementSupport()); if ($this->metadataStatementRepository !== null) { $coseAlgorithmManager = $this->coseAlgorithmManagerFactory->create($this->selectedAlgorithms); $attestationStatementSupportManager->add(new FidoU2FAttestationStatementSupport(null, $this->metadataStatementRepository)); /** * Work around a third party library (web-token/jwt-signature-algorithm-eddsa) bug. * * On PHP 8 libsodium is compiled into PHP, it is not an extension. However, the third party library does * not check if the libsodium function are available; it checks if the "sodium" extension is loaded. This of * course causes an immediate failure with a Runtime exception EVEN IF the attested data isn't attested by * Android Safety Net. Therefore we have to not even load the AndroidSafetyNetAttestationStatementSupport * class in this case... */ if (function_exists('sodium_crypto_sign_seed_keypair') && function_exists('extension_loaded') && extension_loaded('sodium')) { $attestationStatementSupportManager->add( new AndroidSafetyNetAttestationStatementSupport( $this->httpClient, $this->googleApiKey, $this->requestFactory, 2000, 60000, $this->metadataStatementRepository ) ); } $attestationStatementSupportManager->add(new AndroidKeyAttestationStatementSupport(null, $this->metadataStatementRepository)); $attestationStatementSupportManager->add(new TPMAttestationStatementSupport($this->metadataStatementRepository)); $attestationStatementSupportManager->add( new PackedAttestationStatementSupport( null, $coseAlgorithmManager, $this->metadataStatementRepository ) ); } return $attestationStatementSupportManager; } } PK@A#]����#�#Jmultifactorauth/webauthn/src/Hotfix/FidoU2FAttestationStatementSupport.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.webauthn * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt * @copyright (C) 2014-2019 Spomky-Labs * @license This software may be modified and distributed under the terms * of the MIT license. * See libraries/vendor/web-auth/webauthn-lib/LICENSE */ namespace Joomla\Plugin\Multifactorauth\Webauthn\Hotfix; use Assert\Assertion; use CBOR\Decoder; use CBOR\MapObject; use CBOR\OtherObject\OtherObjectManager; use CBOR\Tag\TagObjectManager; use Cose\Key\Ec2Key; use Webauthn\AttestationStatement\AttestationStatement; use Webauthn\AttestationStatement\AttestationStatementSupport; use Webauthn\AuthenticatorData; use Webauthn\CertificateToolbox; use Webauthn\MetadataService\MetadataStatementRepository; use Webauthn\StringStream; use Webauthn\TrustPath\CertificateTrustPath; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * We had to fork the key attestation support object from the WebAuthn server package to address an * issue with PHP 8. * * We are currently using an older version of the WebAuthn library (2.x) which was written before * PHP 8 was developed. We cannot upgrade the WebAuthn library to a newer major version because of * Joomla's Semantic Versioning promise. * * The FidoU2FAttestationStatementSupport class forces an assertion on the result of the * openssl_pkey_get_public() function, assuming it will return a resource. However, starting with * PHP 8.0 this function returns an OpenSSLAsymmetricKey object and the assertion fails. As a * result, you cannot use Android or FIDO U2F keys with WebAuthn. * * The assertion check is in a private method, therefore we have to fork both attestation support * class to change the assertion. The assertion takes place through a third party library we cannot * (and should not!) modify. * * @since 4.2.0 * * @deprecated 4.2 will be removed in 6.0 * Will be removed without replacement * We will upgrade the WebAuthn library to version 3 or later and this will go away. */ final class FidoU2FAttestationStatementSupport implements AttestationStatementSupport { /** * @var Decoder * @since 4.2.0 */ private $decoder; /** * @var MetadataStatementRepository|null * @since 4.2.0 */ private $metadataStatementRepository; /** * @param Decoder|null $decoder Obvious * @param MetadataStatementRepository|null $metadataStatementRepository Obvious * * @since 4.2.0 */ public function __construct( ?Decoder $decoder = null, ?MetadataStatementRepository $metadataStatementRepository = null ) { if ($decoder !== null) { @trigger_error('The argument "$decoder" is deprecated since 2.1 and will be removed in v3.0. Set null instead', E_USER_DEPRECATED); } if ($metadataStatementRepository === null) { @trigger_error( 'Setting "null" for argument "$metadataStatementRepository" is deprecated since 2.1 and will be mandatory in v3.0.', E_USER_DEPRECATED ); } $this->decoder = $decoder ?? new Decoder(new TagObjectManager(), new OtherObjectManager()); $this->metadataStatementRepository = $metadataStatementRepository; } /** * @return string * @since 4.2.0 */ public function name(): string { return 'fido-u2f'; } /** * @param array $attestation Obvious * * @return AttestationStatement * @throws \Assert\AssertionFailedException * * @since 4.2.0 */ public function load(array $attestation): AttestationStatement { Assertion::keyExists($attestation, 'attStmt', 'Invalid attestation object'); foreach (['sig', 'x5c'] as $key) { Assertion::keyExists($attestation['attStmt'], $key, sprintf('The attestation statement value "%s" is missing.', $key)); } $certificates = $attestation['attStmt']['x5c']; Assertion::isArray($certificates, 'The attestation statement value "x5c" must be a list with one certificate.'); Assertion::count($certificates, 1, 'The attestation statement value "x5c" must be a list with one certificate.'); Assertion::allString($certificates, 'The attestation statement value "x5c" must be a list with one certificate.'); reset($certificates); $certificates = CertificateToolbox::convertAllDERToPEM($certificates); $this->checkCertificate($certificates[0]); return AttestationStatement::createBasic($attestation['fmt'], $attestation['attStmt'], new CertificateTrustPath($certificates)); } /** * @param string $clientDataJSONHash Obvious * @param AttestationStatement $attestationStatement Obvious * @param AuthenticatorData $authenticatorData Obvious * * @return boolean * @throws \Assert\AssertionFailedException * @since 4.2.0 */ public function isValid( string $clientDataJSONHash, AttestationStatement $attestationStatement, AuthenticatorData $authenticatorData ): bool { Assertion::eq( $authenticatorData->getAttestedCredentialData()->getAaguid()->toString(), '00000000-0000-0000-0000-000000000000', 'Invalid AAGUID for fido-u2f attestation statement. Shall be "00000000-0000-0000-0000-000000000000"' ); if ($this->metadataStatementRepository !== null) { CertificateToolbox::checkAttestationMedata( $attestationStatement, $authenticatorData->getAttestedCredentialData()->getAaguid()->toString(), [], $this->metadataStatementRepository ); } $trustPath = $attestationStatement->getTrustPath(); Assertion::isInstanceOf($trustPath, CertificateTrustPath::class, 'Invalid trust path'); $dataToVerify = "\0"; $dataToVerify .= $authenticatorData->getRpIdHash(); $dataToVerify .= $clientDataJSONHash; $dataToVerify .= $authenticatorData->getAttestedCredentialData()->getCredentialId(); $dataToVerify .= $this->extractPublicKey($authenticatorData->getAttestedCredentialData()->getCredentialPublicKey()); return openssl_verify($dataToVerify, $attestationStatement->get('sig'), $trustPath->getCertificates()[0], OPENSSL_ALGO_SHA256) === 1; } /** * @param string|null $publicKey Obvious * * @return string * @throws \Assert\AssertionFailedException * @since 4.2.0 */ private function extractPublicKey(?string $publicKey): string { Assertion::notNull($publicKey, 'The attested credential data does not contain a valid public key.'); $publicKeyStream = new StringStream($publicKey); $coseKey = $this->decoder->decode($publicKeyStream); Assertion::true($publicKeyStream->isEOF(), 'Invalid public key. Presence of extra bytes.'); $publicKeyStream->close(); Assertion::isInstanceOf($coseKey, MapObject::class, 'The attested credential data does not contain a valid public key.'); $coseKey = $coseKey->getNormalizedData(); $ec2Key = new Ec2Key($coseKey + [Ec2Key::TYPE => 2, Ec2Key::DATA_CURVE => Ec2Key::CURVE_P256]); return "\x04" . $ec2Key->x() . $ec2Key->y(); } /** * @param string $publicKey Obvious * * @return void * @throws \Assert\AssertionFailedException * @since 4.2.0 */ private function checkCertificate(string $publicKey): void { try { $resource = openssl_pkey_get_public($publicKey); if (version_compare(PHP_VERSION, '8.0', 'lt')) { Assertion::isResource($resource, 'Unable to read the certificate'); } else { /** @noinspection PhpElementIsNotAvailableInCurrentPhpVersionInspection */ Assertion::isInstanceOf($resource, \OpenSSLAsymmetricKey::class, 'Unable to read the certificate'); } } catch (\Throwable $throwable) { throw new \InvalidArgumentException('Invalid certificate or certificate chain', 0, $throwable); } $details = openssl_pkey_get_details($resource); Assertion::keyExists($details, 'ec', 'Invalid certificate or certificate chain'); Assertion::keyExists($details['ec'], 'curve_name', 'Invalid certificate or certificate chain'); Assertion::eq($details['ec']['curve_name'], 'prime256v1', 'Invalid certificate or certificate chain'); Assertion::keyExists($details['ec'], 'curve_oid', 'Invalid certificate or certificate chain'); Assertion::eq($details['ec']['curve_oid'], '1.2.840.10045.3.1.7', 'Invalid certificate or certificate chain'); } } PK@A#]N���,�,Mmultifactorauth/webauthn/src/Hotfix/AndroidKeyAttestationStatementSupport.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.webauthn * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt * @copyright (C) 2014-2019 Spomky-Labs * @license This software may be modified and distributed under the terms * of the MIT license. * See libraries/vendor/web-auth/webauthn-lib/LICENSE */ namespace Joomla\Plugin\Multifactorauth\Webauthn\Hotfix; use Assert\Assertion; use CBOR\Decoder; use CBOR\OtherObject\OtherObjectManager; use CBOR\Tag\TagObjectManager; use Cose\Algorithms; use Cose\Key\Ec2Key; use Cose\Key\Key; use Cose\Key\RsaKey; use FG\ASN1\ASNObject; use FG\ASN1\ExplicitlyTaggedObject; use FG\ASN1\Universal\OctetString; use FG\ASN1\Universal\Sequence; use Webauthn\AttestationStatement\AttestationStatement; use Webauthn\AttestationStatement\AttestationStatementSupport; use Webauthn\AuthenticatorData; use Webauthn\CertificateToolbox; use Webauthn\MetadataService\MetadataStatementRepository; use Webauthn\StringStream; use Webauthn\TrustPath\CertificateTrustPath; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * We had to fork the key attestation support object from the WebAuthn server package to address an * issue with PHP 8. * * We are currently using an older version of the WebAuthn library (2.x) which was written before * PHP 8 was developed. We cannot upgrade the WebAuthn library to a newer major version because of * Joomla's Semantic Versioning promise. * * The AndroidKeyAttestationStatementSupport class forces an assertion on the result of the * openssl_pkey_get_public() function, assuming it will return a resource. However, starting with * PHP 8.0 this function returns an OpenSSLAsymmetricKey object and the assertion fails. As a * result, you cannot use Android or FIDO U2F keys with WebAuthn. * * The assertion check is in a private method, therefore we have to fork both attestation support * class to change the assertion. The assertion takes place through a third party library we cannot * (and should not!) modify. * * @since 4.2.0 * * @deprecated 4.2 will be removed in 6.0 * Will be removed without replacement * We will upgrade the WebAuthn library to version 3 or later and this will go away. */ final class AndroidKeyAttestationStatementSupport implements AttestationStatementSupport { /** * @var Decoder * @since 4.2.0 */ private $decoder; /** * @var MetadataStatementRepository|null * @since 4.2.0 */ private $metadataStatementRepository; /** * @param Decoder|null $decoder Obvious * @param MetadataStatementRepository|null $metadataStatementRepository Obvious * * @since 4.2.0 */ public function __construct( ?Decoder $decoder = null, ?MetadataStatementRepository $metadataStatementRepository = null ) { if ($decoder !== null) { @trigger_error('The argument "$decoder" is deprecated since 2.1 and will be removed in v3.0. Set null instead', E_USER_DEPRECATED); } if ($metadataStatementRepository === null) { @trigger_error( 'Setting "null" for argument "$metadataStatementRepository" is deprecated since 2.1 and will be mandatory in v3.0.', E_USER_DEPRECATED ); } $this->decoder = $decoder ?? new Decoder(new TagObjectManager(), new OtherObjectManager()); $this->metadataStatementRepository = $metadataStatementRepository; } /** * @return string * @since 4.2.0 */ public function name(): string { return 'android-key'; } /** * @param array $attestation Obvious * * @return AttestationStatement * @throws \Assert\AssertionFailedException * @since 4.2.0 */ public function load(array $attestation): AttestationStatement { Assertion::keyExists($attestation, 'attStmt', 'Invalid attestation object'); foreach (['sig', 'x5c', 'alg'] as $key) { Assertion::keyExists($attestation['attStmt'], $key, sprintf('The attestation statement value "%s" is missing.', $key)); } $certificates = $attestation['attStmt']['x5c']; Assertion::isArray($certificates, 'The attestation statement value "x5c" must be a list with at least one certificate.'); Assertion::greaterThan(\count($certificates), 0, 'The attestation statement value "x5c" must be a list with at least one certificate.'); Assertion::allString($certificates, 'The attestation statement value "x5c" must be a list with at least one certificate.'); $certificates = CertificateToolbox::convertAllDERToPEM($certificates); return AttestationStatement::createBasic($attestation['fmt'], $attestation['attStmt'], new CertificateTrustPath($certificates)); } /** * @param string $clientDataJSONHash Obvious * @param AttestationStatement $attestationStatement Obvious * @param AuthenticatorData $authenticatorData Obvious * * @return boolean * @throws \Assert\AssertionFailedException * @since 4.2.0 */ public function isValid( string $clientDataJSONHash, AttestationStatement $attestationStatement, AuthenticatorData $authenticatorData ): bool { $trustPath = $attestationStatement->getTrustPath(); Assertion::isInstanceOf($trustPath, CertificateTrustPath::class, 'Invalid trust path'); $certificates = $trustPath->getCertificates(); if ($this->metadataStatementRepository !== null) { $certificates = CertificateToolbox::checkAttestationMedata( $attestationStatement, $authenticatorData->getAttestedCredentialData()->getAaguid()->toString(), $certificates, $this->metadataStatementRepository ); } // Decode leaf attestation certificate $leaf = $certificates[0]; $this->checkCertificateAndGetPublicKey($leaf, $clientDataJSONHash, $authenticatorData); $signedData = $authenticatorData->getAuthData() . $clientDataJSONHash; $alg = $attestationStatement->get('alg'); return openssl_verify($signedData, $attestationStatement->get('sig'), $leaf, Algorithms::getOpensslAlgorithmFor((int) $alg)) === 1; } /** * @param string $certificate Obvious * @param string $clientDataHash Obvious * @param AuthenticatorData $authenticatorData Obvious * * @return void * @throws \Assert\AssertionFailedException * @throws \FG\ASN1\Exception\ParserException * @since 4.2.0 */ private function checkCertificateAndGetPublicKey( string $certificate, string $clientDataHash, AuthenticatorData $authenticatorData ): void { $resource = openssl_pkey_get_public($certificate); if (version_compare(PHP_VERSION, '8.0', 'lt')) { Assertion::isResource($resource, 'Unable to read the certificate'); } else { /** @noinspection PhpElementIsNotAvailableInCurrentPhpVersionInspection */ Assertion::isInstanceOf($resource, \OpenSSLAsymmetricKey::class, 'Unable to read the certificate'); } $details = openssl_pkey_get_details($resource); Assertion::isArray($details, 'Unable to read the certificate'); // Check that authData publicKey matches the public key in the attestation certificate $attestedCredentialData = $authenticatorData->getAttestedCredentialData(); Assertion::notNull($attestedCredentialData, 'No attested credential data found'); $publicKeyData = $attestedCredentialData->getCredentialPublicKey(); Assertion::notNull($publicKeyData, 'No attested public key found'); $publicDataStream = new StringStream($publicKeyData); $coseKey = $this->decoder->decode($publicDataStream)->getNormalizedData(false); Assertion::true($publicDataStream->isEOF(), 'Invalid public key data. Presence of extra bytes.'); $publicDataStream->close(); $publicKey = Key::createFromData($coseKey); Assertion::true(($publicKey instanceof Ec2Key) || ($publicKey instanceof RsaKey), 'Unsupported key type'); Assertion::eq($publicKey->asPEM(), $details['key'], 'Invalid key'); $certDetails = openssl_x509_parse($certificate); // Find Android KeyStore Extension with OID “1.3.6.1.4.1.11129.2.1.17” in certificate extensions Assertion::keyExists($certDetails, 'extensions', 'The certificate has no extension'); Assertion::isArray($certDetails['extensions'], 'The certificate has no extension'); Assertion::keyExists( $certDetails['extensions'], '1.3.6.1.4.1.11129.2.1.17', 'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is missing' ); $extension = $certDetails['extensions']['1.3.6.1.4.1.11129.2.1.17']; $extensionAsAsn1 = ASNObject::fromBinary($extension); Assertion::isInstanceOf($extensionAsAsn1, Sequence::class, 'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid'); $objects = $extensionAsAsn1->getChildren(); // Check that attestationChallenge is set to the clientDataHash. Assertion::keyExists($objects, 4, 'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid'); Assertion::isInstanceOf($objects[4], OctetString::class, 'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid'); Assertion::eq($clientDataHash, hex2bin(($objects[4])->getContent()), 'The client data hash is not valid'); // Check that both teeEnforced and softwareEnforced structures don’t contain allApplications(600) tag. Assertion::keyExists($objects, 6, 'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid'); $softwareEnforcedFlags = $objects[6]; Assertion::isInstanceOf($softwareEnforcedFlags, Sequence::class, 'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid'); $this->checkAbsenceOfAllApplicationsTag($softwareEnforcedFlags); Assertion::keyExists($objects, 7, 'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid'); $teeEnforcedFlags = $objects[6]; Assertion::isInstanceOf($teeEnforcedFlags, Sequence::class, 'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid'); $this->checkAbsenceOfAllApplicationsTag($teeEnforcedFlags); } /** * @param Sequence $sequence Obvious * * @return void * @throws \Assert\AssertionFailedException * @since 4.2.0 */ private function checkAbsenceOfAllApplicationsTag(Sequence $sequence): void { foreach ($sequence->getChildren() as $tag) { Assertion::isInstanceOf($tag, ExplicitlyTaggedObject::class, 'Invalid tag'); /** * @var ExplicitlyTaggedObject $tag It is silly that I have to do that for PHPCS to be happy. */ Assertion::notEq(600, (int) $tag->getTag(), 'Forbidden tag 600 found'); } } } PK@A#]6�28C8C3multifactorauth/webauthn/src/Extension/Webauthn.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.webauthn * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Multifactorauth\Webauthn\Extension; use Exception; use Joomla\CMS\Event\MultiFactor\Captive; use Joomla\CMS\Event\MultiFactor\GetMethod; use Joomla\CMS\Event\MultiFactor\GetSetup; use Joomla\CMS\Event\MultiFactor\SaveSetup; use Joomla\CMS\Event\MultiFactor\Validate; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Uri\Uri; use Joomla\CMS\User\User; use Joomla\CMS\User\UserFactoryAwareTrait; use Joomla\Component\Users\Administrator\DataShape\CaptiveRenderOptions; use Joomla\Component\Users\Administrator\DataShape\MethodDescriptor; use Joomla\Component\Users\Administrator\DataShape\SetupRenderOptions; use Joomla\Component\Users\Administrator\Table\MfaTable; use Joomla\Event\SubscriberInterface; use Joomla\Input\Input; use Joomla\Plugin\Multifactorauth\Webauthn\Helper\Credentials; use RuntimeException; use Webauthn\PublicKeyCredentialRequestOptions; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla Multi-factor Authentication plugin for WebAuthn * * @since 4.2.0 */ class Webauthn extends CMSPlugin implements SubscriberInterface { use UserFactoryAwareTrait; /** * Auto-load the plugin's language files * * @var boolean * @since 4.2.0 */ protected $autoloadLanguage = true; /** * The MFA Method name handled by this plugin * * @var string * @since 4.2.0 */ private $mfaMethodName = 'webauthn'; /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.2.0 */ public static function getSubscribedEvents(): array { return [ 'onUserMultifactorGetMethod' => 'onUserMultifactorGetMethod', 'onUserMultifactorCaptive' => 'onUserMultifactorCaptive', 'onUserMultifactorGetSetup' => 'onUserMultifactorGetSetup', 'onUserMultifactorSaveSetup' => 'onUserMultifactorSaveSetup', 'onUserMultifactorValidate' => 'onUserMultifactorValidate', ]; } /** * Gets the identity of this MFA Method * * @param GetMethod $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorGetMethod(GetMethod $event): void { $event->addResult( new MethodDescriptor( [ 'name' => $this->mfaMethodName, 'display' => Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_LBL_DISPLAYEDAS'), 'shortinfo' => Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_LBL_SHORTINFO'), 'image' => 'media/plg_multifactorauth_webauthn/images/webauthn.svg', 'allowMultiple' => true, 'allowEntryBatching' => true, ] ) ); } /** * Returns the information which allows Joomla to render the MFA setup page. This is the page * which allows the user to add or modify a MFA Method for their user account. If the record * does not correspond to your plugin return an empty array. * * @param GetSetup $event The event we are handling * * @return void * @throws \Exception * @since 4.2.0 */ public function onUserMultifactorGetSetup(GetSetup $event): void { /** * @var MfaTable $record The record currently selected by the user. */ $record = $event['record']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { return; } // Get some values assuming that we are NOT setting up U2F (the key is already registered) $submitClass = ''; $submitIcon = 'icon icon-ok'; $submitText = 'JSAVE'; $preMessage = Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_LBL_CONFIGURED'); $type = 'input'; $html = ''; $hiddenData = []; /** * If there are no authenticators set up yet I need to show a different message and take a different action when * my user clicks the submit button. */ if (!is_array($record->options) || empty($record->options['credentialId'] ?? '')) { $document = $this->getApplication()->getDocument(); $wam = $document->getWebAssetManager(); $wam->getRegistry()->addExtensionRegistryFile('plg_multifactorauth_webauthn'); $layoutPath = PluginHelper::getLayoutPath('multifactorauth', 'webauthn'); ob_start(); include $layoutPath; $html = ob_get_clean(); $type = 'custom'; // Load JS translations Text::script('PLG_MULTIFACTORAUTH_WEBAUTHN_ERR_NOTAVAILABLE_HEAD'); $document->addScriptOptions('com_users.pagetype', 'setup', false); // Save the WebAuthn request to the session $user = $this->getApplication()->getIdentity() ?: $this->getUserFactory()->loadUserById(0); $hiddenData['pkRequest'] = base64_encode(Credentials::requestAttestation($user)); // Special button handling $submitClass = "multifactorauth_webauthn_setup"; $submitIcon = 'icon icon-lock'; $submitText = 'PLG_MULTIFACTORAUTH_WEBAUTHN_LBL_REGISTERKEY'; // Message to display $preMessage = Text::sprintf( 'PLG_MULTIFACTORAUTH_WEBAUTHN_LBL_INSTRUCTIONS', Text::_($submitText) ); } $event->addResult( new SetupRenderOptions( [ 'default_title' => Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_LBL_DISPLAYEDAS'), 'pre_message' => $preMessage, 'hidden_data' => $hiddenData, 'field_type' => $type, 'input_type' => 'hidden', 'html' => $html, 'show_submit' => true, 'submit_class' => $submitClass, 'submit_icon' => $submitIcon, 'submit_text' => $submitText, ] ) ); } /** * Parse the input from the MFA setup page and return the configuration information to be saved to the database. If * the information is invalid throw a RuntimeException to signal the need to display the editor page again. The * message of the exception will be displayed to the user. If the record does not correspond to your plugin return * an empty array. * * @param SaveSetup $event The event we are handling * * @return void The configuration data to save to the database * @since 4.2.0 */ public function onUserMultifactorSaveSetup(SaveSetup $event): void { /** * @var MfaTable $record The record currently selected by the user. * @var Input $input The user input you are going to take into account. */ $record = $event['record']; $input = $event['input']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { return; } // Editing an existing authenticator: only the title is saved if (is_array($record->options) && !empty($record->options['credentialId'] ?? '')) { $event->addResult($record->options); return; } $code = $input->get('code', null, 'base64'); $session = $this->getApplication()->getSession(); $registrationRequest = $session->get('plg_multifactorauth_webauthn.publicKeyCredentialCreationOptions', null); // If there was no registration request BUT there is a registration response throw an error if (empty($registrationRequest) && !empty($code)) { throw new \RuntimeException(Text::_('JERROR_ALERTNOAUTHOR'), 403); } // If there is no registration request (and there isn't a registration response) we are just saving the title. if (empty($registrationRequest)) { $event->addResult($record->options); return; } // In any other case try to authorize the registration try { $publicKeyCredentialSource = Credentials::verifyAttestation($code); } catch (\Exception $err) { throw new \RuntimeException($err->getMessage(), 403); } finally { // Unset the request data from the session. $session->set('plg_multifactorauth_webauthn.publicKeyCredentialCreationOptions', null); $session->set('plg_multifactorauth_webauthn.registration_user_id', null); } // Return the configuration to be serialized $event->addResult( [ 'credentialId' => base64_encode($publicKeyCredentialSource->getAttestedCredentialData()->getCredentialId()), 'pubkeysource' => json_encode($publicKeyCredentialSource), 'counter' => 0, ] ); } /** * Returns the information which allows Joomla to render the Captive MFA page. This is the page * which appears right after you log in and asks you to validate your login with MFA. * * @param Captive $event The event we are handling * * @return void * @throws \Exception * @since 4.2.0 */ public function onUserMultifactorCaptive(Captive $event): void { /** * @var MfaTable $record The record currently selected by the user. */ $record = $event['record']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { return; } /** * The following code looks stupid. An explanation is in order. * * What we normally want to do is save the authentication data returned by getAuthenticateData into the session. * This is what is sent to the authenticator through the Javascript API and signed. The signature is posted back * to the form as the "code" which is read by onUserMultifactorauthValidate. That Method will read the authentication * data from the session and pass it along with the key registration data (from the database) and the * authentication response (the "code" submitted in the form) to the WebAuthn library for validation. * * Validation will work as long as the challenge recorded in the encrypted AUTHENTICATION RESPONSE matches, upon * decryption, the challenge recorded in the AUTHENTICATION DATA. * * I observed that for whatever stupid reason the browser was sometimes sending TWO requests to the server's * Captive login page but only rendered the FIRST. This meant that the authentication data sent to the key had * already been overwritten in the session by the "invisible" second request. As a result the challenge would * not match and we'd get a validation error. * * The code below will attempt to read the authentication data from the session first. If it exists it will NOT * try to replace it (technically it replaces it with a copy of the same data - same difference!). If nothing * exists in the session, however, it WILL store the (random seeded) result of the getAuthenticateData Method. * Therefore the first request to the Captive login page will store a new set of authentication data whereas the * second, "invisible", request will just reuse the same data as the first request, fixing the observed issue in * a way that doesn't compromise security. * * In case you are wondering, yes, the data is removed from the session in the onUserMultifactorauthValidate Method. * In fact it's the first thing we do after reading it, preventing constant reuse of the same set of challenges. * * That was fun to debug - for "poke your eyes with a rusty fork" values of fun. */ $session = $this->getApplication()->getSession(); $pkOptionsEncoded = $session->get('plg_multifactorauth_webauthn.publicKeyCredentialRequestOptions', null); $force = $this->getApplication()->getInput()->getInt('force', 0); try { if ($force) { throw new \RuntimeException('Expected exception (good): force a new key request'); } if (empty($pkOptionsEncoded)) { throw new \RuntimeException('Expected exception (good): we do not have a pending key request'); } $serializedOptions = base64_decode($pkOptionsEncoded); $pkOptions = unserialize($serializedOptions); if (!is_object($pkOptions) || empty($pkOptions) || !($pkOptions instanceof PublicKeyCredentialRequestOptions)) { throw new \RuntimeException('The pending key request is corrupt; a new one will be created'); } $pkRequest = json_encode($pkOptions, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } catch (\Exception $e) { $pkRequest = Credentials::requestAssertion($record->user_id); } $document = $this->getApplication()->getDocument(); $wam = $document->getWebAssetManager(); $wam->getRegistry()->addExtensionRegistryFile('plg_multifactorauth_webauthn'); try { $document->addScriptOptions('com_users.authData', base64_encode($pkRequest), false); $layoutPath = PluginHelper::getLayoutPath('multifactorauth', 'webauthn'); ob_start(); include $layoutPath; $html = ob_get_clean(); } catch (\Exception $e) { return; } // Load JS translations Text::script('PLG_MULTIFACTORAUTH_WEBAUTHN_ERR_NOTAVAILABLE_HEAD'); Text::script('PLG_MULTIFACTORAUTH_WEBAUTHN_ERR_NO_STORED_CREDENTIAL'); $document->addScriptOptions('com_users.pagetype', 'validate', false); $event->addResult( new CaptiveRenderOptions( [ 'pre_message' => Text::sprintf( 'PLG_MULTIFACTORAUTH_WEBAUTHN_LBL_INSTRUCTIONS', Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_LBL_VALIDATEKEY') ), 'field_type' => 'custom', 'input_type' => 'hidden', 'placeholder' => '', 'label' => '', 'html' => $html, 'post_message' => '', 'hide_submit' => false, 'submit_icon' => 'icon icon-lock', 'submit_text' => 'PLG_MULTIFACTORAUTH_WEBAUTHN_LBL_VALIDATEKEY', 'allowEntryBatching' => true, ] ) ); } /** * Validates the Multi-factor Authentication code submitted by the user in the Multi-Factor * Authentication page. If the record does not correspond to your plugin return FALSE. * * @param Validate $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorValidate(Validate $event): void { // This method is only available on HTTPS if (Uri::getInstance()->getScheme() !== 'https') { $event->addResult(false); return; } /** * @var MfaTable $record The MFA Method's record you're validating against * @var User $user The user record * @var string $code The submitted code */ $record = $event['record']; $user = $event['user']; $code = $event['code']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { $event->addResult(false); return; } // Double check the MFA Method is for the correct user if ($user->id != $record->user_id) { $event->addResult(false); return; } try { Credentials::verifyAssertion($code); } catch (\Exception $e) { try { $this->getApplication()->enqueueMessage($e->getMessage(), 'error'); } catch (\Exception $e) { } $event->addResult(false); return; } $event->addResult(true); } } PK@A#]��yK%K%5multifactorauth/webauthn/src/CredentialRepository.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.webauthn * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Multifactorauth\Webauthn; use Joomla\CMS\Factory; use Joomla\CMS\MVC\Factory\MVCFactoryInterface; use Joomla\CMS\User\UserFactoryInterface; use Joomla\Component\Users\Administrator\Helper\Mfa as MfaHelper; use Joomla\Component\Users\Administrator\Table\MfaTable; use Webauthn\AttestationStatement\AttestationStatement; use Webauthn\AttestedCredentialData; use Webauthn\PublicKeyCredentialDescriptor; use Webauthn\PublicKeyCredentialSource; use Webauthn\PublicKeyCredentialSourceRepository; use Webauthn\PublicKeyCredentialUserEntity; use Webauthn\TrustPath\EmptyTrustPath; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Implementation of the credentials repository for the WebAuthn library. * * Important assumption: interaction with Webauthn through the library is only performed for the currently logged in * user. Therefore all Methods which take a credential ID work by checking the Joomla MFA records of the current * user only. This is a necessity. The records are stored encrypted, therefore we cannot do a partial search in the * table. We have to load the records, decrypt them and inspect them. We cannot do that for thousands of records but * we CAN do that for the few records each user has under their account. * * This behavior can be changed by passing a user ID in the constructor of the class. * * @since 4.2.0 */ class CredentialRepository implements PublicKeyCredentialSourceRepository { /** * The user ID we will operate with * * @var integer * @since 4.2.0 */ private $userId = 0; /** * CredentialRepository constructor. * * @param int $userId The user ID this repository will be working with. * * @throws \Exception * @since 4.2.0 */ public function __construct(int $userId = 0) { if (empty($userId)) { $user = Factory::getApplication()->getIdentity() ?: Factory::getContainer()->get(UserFactoryInterface::class)->loadUserById(0); $userId = $user->id; } $this->userId = $userId; } /** * Finds a WebAuthn record given a credential ID * * @param string $publicKeyCredentialId The public credential ID to look for * * @return PublicKeyCredentialSource|null * @since 4.2.0 */ public function findOneByCredentialId(string $publicKeyCredentialId): ?PublicKeyCredentialSource { $publicKeyCredentialUserEntity = new PublicKeyCredentialUserEntity('', $this->userId, '', ''); $credentials = $this->findAllForUserEntity($publicKeyCredentialUserEntity); foreach ($credentials as $record) { if ($record->getAttestedCredentialData()->getCredentialId() != $publicKeyCredentialId) { continue; } return $record; } return null; } /** * Find all WebAuthn entries given a user entity * * @param PublicKeyCredentialUserEntity $publicKeyCredentialUserEntity The user entity to search by * * @return array|PublicKeyCredentialSource[] * @throws \Exception * @since 4.2.0 */ public function findAllForUserEntity(PublicKeyCredentialUserEntity $publicKeyCredentialUserEntity): array { if (empty($publicKeyCredentialUserEntity)) { $userId = $this->userId; } else { $userId = $publicKeyCredentialUserEntity->getId(); } $return = []; $results = MfaHelper::getUserMfaRecords($userId); if (count($results) < 1) { return $return; } /** @var MfaTable $result */ foreach ($results as $result) { $options = $result->options; if (!is_array($options) || empty($options)) { continue; } if (!isset($options['attested']) && !isset($options['pubkeysource'])) { continue; } if (isset($options['attested']) && is_string($options['attested'])) { $options['attested'] = json_decode($options['attested'], true); $return[$result->id] = $this->attestedCredentialToPublicKeyCredentialSource( AttestedCredentialData::createFromArray($options['attested']), $userId ); } elseif (isset($options['pubkeysource']) && is_string($options['pubkeysource'])) { $options['pubkeysource'] = json_decode($options['pubkeysource'], true); $return[$result->id] = PublicKeyCredentialSource::createFromArray($options['pubkeysource']); } elseif (isset($options['pubkeysource']) && is_array($options['pubkeysource'])) { $return[$result->id] = PublicKeyCredentialSource::createFromArray($options['pubkeysource']); } } return $return; } /** * Converts a legacy AttestedCredentialData object stored in the database into a PublicKeyCredentialSource object. * * This makes several assumptions which can be problematic and the reason why the WebAuthn library version 2 moved * away from attested credentials to public key credential sources: * * - The credential is always of the public key type (that's safe as the only option supported) * - You can access it with any kind of authenticator transport: USB, NFC, Internal or Bluetooth LE (possibly * dangerous) * - There is no attestations (generally safe since browsers don't seem to support attestation yet) * - There is no trust path (generally safe since browsers don't seem to provide one) * - No counter was stored (dangerous since it can lead to replay attacks). * * @param AttestedCredentialData $record Legacy attested credential data object * @param int $userId User ID we are getting the credential source for * * @return PublicKeyCredentialSource * @since 4.2.0 */ private function attestedCredentialToPublicKeyCredentialSource(AttestedCredentialData $record, int $userId): PublicKeyCredentialSource { return new PublicKeyCredentialSource( $record->getCredentialId(), PublicKeyCredentialDescriptor::CREDENTIAL_TYPE_PUBLIC_KEY, [ PublicKeyCredentialDescriptor::AUTHENTICATOR_TRANSPORT_USB, PublicKeyCredentialDescriptor::AUTHENTICATOR_TRANSPORT_NFC, PublicKeyCredentialDescriptor::AUTHENTICATOR_TRANSPORT_INTERNAL, PublicKeyCredentialDescriptor::AUTHENTICATOR_TRANSPORT_BLE, ], AttestationStatement::TYPE_NONE, new EmptyTrustPath(), $record->getAaguid(), $record->getCredentialPublicKey(), $userId, 0 ); } /** * Save a WebAuthn record * * @param PublicKeyCredentialSource $publicKeyCredentialSource The record to save * * @return void * @throws \Exception * @since 4.2.0 */ public function saveCredentialSource(PublicKeyCredentialSource $publicKeyCredentialSource): void { // I can only create or update credentials for the user this class was created for if ($publicKeyCredentialSource->getUserHandle() != $this->userId) { throw new \RuntimeException('Cannot create or update WebAuthn credentials for a different user.', 403); } // Do I have an existing record for this credential? $recordId = null; $publicKeyCredentialUserEntity = new PublicKeyCredentialUserEntity('', $this->userId, '', ''); $credentials = $this->findAllForUserEntity($publicKeyCredentialUserEntity); foreach ($credentials as $id => $record) { if ($record->getAttestedCredentialData()->getCredentialId() != $publicKeyCredentialSource->getAttestedCredentialData()->getCredentialId()) { continue; } $recordId = $id; break; } // Create or update a record /** @var MVCFactoryInterface $factory */ $factory = Factory::getApplication()->bootComponent('com_users')->getMVCFactory(); /** @var MfaTable $mfaTable */ $mfaTable = $factory->createTable('Mfa', 'Administrator'); if ($recordId) { $mfaTable->load($recordId); $options = $mfaTable->options; if (isset($options['attested'])) { unset($options['attested']); } $options['pubkeysource'] = $publicKeyCredentialSource; $mfaTable->save( [ 'options' => $options, ] ); } else { $mfaTable->reset(); $mfaTable->save( [ 'user_id' => $this->userId, 'title' => 'WebAuthn auto-save', 'method' => 'webauthn', 'default' => 0, 'options' => ['pubkeysource' => $publicKeyCredentialSource], ] ); } } } PK@A#]\53533multifactorauth/webauthn/src/Helper/Credentials.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.webauthn * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Multifactorauth\Webauthn\Helper; use Exception; use Joomla\CMS\Application\CMSApplication; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; use Joomla\CMS\User\User; use Joomla\CMS\User\UserFactoryInterface; use Joomla\Plugin\Multifactorauth\Webauthn\CredentialRepository; use Joomla\Plugin\Multifactorauth\Webauthn\Hotfix\Server; use Joomla\Session\SessionInterface; use Laminas\Diactoros\ServerRequestFactory; use Webauthn\AttestedCredentialData; use Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs; use Webauthn\AuthenticatorSelectionCriteria; use Webauthn\PublicKeyCredentialCreationOptions; use Webauthn\PublicKeyCredentialDescriptor; use Webauthn\PublicKeyCredentialRequestOptions; use Webauthn\PublicKeyCredentialRpEntity; use Webauthn\PublicKeyCredentialSource; use Webauthn\PublicKeyCredentialUserEntity; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Helper class to aid in credentials creation (link an authenticator to a user account) * * @since 4.2.0 */ abstract class Credentials { /** * Authenticator registration step 1: create a public key for credentials attestation. * * The result is a JSON string which can be used in Javascript code with navigator.credentials.create(). * * @param User $user The Joomla user to create the public key for * * @return string * @throws \Exception On error * @since 4.2.0 */ public static function requestAttestation(User $user): string { $publicKeyCredentialCreationOptions = self::getWebauthnServer($user->id) ->generatePublicKeyCredentialCreationOptions( self::getUserEntity($user), PublicKeyCredentialCreationOptions::ATTESTATION_CONVEYANCE_PREFERENCE_NONE, self::getPubKeyDescriptorsForUser($user), new AuthenticatorSelectionCriteria( AuthenticatorSelectionCriteria::AUTHENTICATOR_ATTACHMENT_NO_PREFERENCE, false, AuthenticatorSelectionCriteria::USER_VERIFICATION_REQUIREMENT_PREFERRED ), new AuthenticationExtensionsClientInputs() ); // Save data in the session $session = Factory::getApplication()->getSession(); $session->set( 'plg_multifactorauth_webauthn.publicKeyCredentialCreationOptions', base64_encode(serialize($publicKeyCredentialCreationOptions)) ); $session->set('plg_multifactorauth_webauthn.registration_user_id', $user->id); return json_encode($publicKeyCredentialCreationOptions, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } /** * Authenticator registration step 2: verify the credentials attestation by the authenticator * * This returns the attested credential data on success. * * An exception will be returned on error. Also, under very rare conditions, you may receive NULL instead of * attested credential data which means that something was off in the returned data from the browser. * * @param string $data The JSON-encoded data returned by the browser during the authentication flow * * @return AttestedCredentialData|null * @throws \Exception When something does not check out * @since 4.2.0 */ public static function verifyAttestation(string $data): ?PublicKeyCredentialSource { $session = Factory::getApplication()->getSession(); // Retrieve the PublicKeyCredentialCreationOptions object created earlier and perform sanity checks $encodedOptions = $session->get('plg_multifactorauth_webauthn.publicKeyCredentialCreationOptions', null); if (empty($encodedOptions)) { throw new \RuntimeException(Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_ERR_CREATE_NO_PK')); } try { $publicKeyCredentialCreationOptions = unserialize(base64_decode($encodedOptions)); } catch (\Exception $e) { $publicKeyCredentialCreationOptions = null; } if (!is_object($publicKeyCredentialCreationOptions) || !($publicKeyCredentialCreationOptions instanceof PublicKeyCredentialCreationOptions)) { throw new \RuntimeException(Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_ERR_CREATE_NO_PK')); } // Retrieve the stored user ID and make sure it's the same one in the request. $storedUserId = $session->get('plg_multifactorauth_webauthn.registration_user_id', 0); $myUser = Factory::getApplication()->getIdentity() ?: Factory::getContainer()->get(UserFactoryInterface::class)->loadUserById(0); $myUserId = $myUser->id; if (($myUser->guest) || ($myUserId != $storedUserId)) { throw new \RuntimeException(Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_ERR_CREATE_INVALID_USER')); } return self::getWebauthnServer($myUser->id)->loadAndCheckAttestationResponse( base64_decode($data), $publicKeyCredentialCreationOptions, ServerRequestFactory::fromGlobals() ); } /** * Authentication step 1: create a challenge for key verification * * @param int $userId The user ID to create a WebAuthn PK for * * @return string * @throws \Exception On error * @since 4.2.0 */ public static function requestAssertion(int $userId): string { $user = Factory::getContainer()->get(UserFactoryInterface::class)->loadUserById($userId); $publicKeyCredentialRequestOptions = self::getWebauthnServer($userId) ->generatePublicKeyCredentialRequestOptions( PublicKeyCredentialRequestOptions::USER_VERIFICATION_REQUIREMENT_PREFERRED, self::getPubKeyDescriptorsForUser($user) ); // Save in session. This is used during the verification stage to prevent replay attacks. /** @var SessionInterface $session */ $session = Factory::getApplication()->getSession(); $session->set('plg_multifactorauth_webauthn.publicKeyCredentialRequestOptions', base64_encode(serialize($publicKeyCredentialRequestOptions))); $session->set('plg_multifactorauth_webauthn.userHandle', $userId); $session->set('plg_multifactorauth_webauthn.userId', $userId); // Return the JSON encoded data to the caller return json_encode($publicKeyCredentialRequestOptions, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } /** * Authentication step 2: Checks if the browser's response to our challenge is valid. * * @param string $response Base64-encoded response * * @return void * @throws \Exception When something does not check out. * @since 4.2.0 */ public static function verifyAssertion(string $response): void { /** @var SessionInterface $session */ $session = Factory::getApplication()->getSession(); $encodedPkOptions = $session->get('plg_multifactorauth_webauthn.publicKeyCredentialRequestOptions', null); $userHandle = $session->get('plg_multifactorauth_webauthn.userHandle', null); $userId = $session->get('plg_multifactorauth_webauthn.userId', null); $session->set('plg_multifactorauth_webauthn.publicKeyCredentialRequestOptions', null); $session->set('plg_multifactorauth_webauthn.userHandle', null); $session->set('plg_multifactorauth_webauthn.userId', null); if (empty($userId)) { throw new \RuntimeException(Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_ERR_CREATE_INVALID_LOGIN_REQUEST')); } // Make sure the user exists $user = Factory::getContainer()->get(UserFactoryInterface::class)->loadUserById($userId); if ($user->id != $userId) { throw new \RuntimeException(Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_ERR_CREATE_INVALID_LOGIN_REQUEST')); } // Make sure the user is ourselves (we cannot perform MFA on behalf of another user!) $currentUser = Factory::getApplication()->getIdentity() ?: Factory::getContainer()->get(UserFactoryInterface::class)->loadUserById(0); if ($currentUser->id != $userId) { throw new \RuntimeException(Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_ERR_CREATE_INVALID_LOGIN_REQUEST')); } // Make sure the public key credential request options in the session are valid $serializedOptions = base64_decode($encodedPkOptions); $publicKeyCredentialRequestOptions = unserialize($serializedOptions); if ( !is_object($publicKeyCredentialRequestOptions) || empty($publicKeyCredentialRequestOptions) || !($publicKeyCredentialRequestOptions instanceof PublicKeyCredentialRequestOptions) ) { throw new \RuntimeException(Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_ERR_CREATE_INVALID_LOGIN_REQUEST')); } // Unserialize the browser response data $data = base64_decode($response); self::getWebauthnServer($user->id)->loadAndCheckAssertionResponse( $data, $publicKeyCredentialRequestOptions, self::getUserEntity($user), ServerRequestFactory::fromGlobals() ); } /** * Get the user's avatar (through Gravatar) * * @param User $user The Joomla user object * @param int $size The dimensions of the image to fetch (default: 64 pixels) * * @return string The URL to the user's avatar * * @since 4.2.0 */ private static function getAvatar(User $user, int $size = 64) { $scheme = Uri::getInstance()->getScheme(); $subdomain = ($scheme == 'https') ? 'secure' : 'www'; return sprintf('%s://%s.gravatar.com/avatar/%s.jpg?s=%u&d=mm', $scheme, $subdomain, md5($user->email), $size); } /** * Get a WebAuthn user entity for a Joomla user * * @param User $user The user to get an entity for * * @return PublicKeyCredentialUserEntity * @since 4.2.0 */ private static function getUserEntity(User $user): PublicKeyCredentialUserEntity { return new PublicKeyCredentialUserEntity( $user->username, $user->id, $user->name, self::getAvatar($user, 64) ); } /** * Get the WebAuthn library server object * * @param int|null $userId The user ID holding the list of valid authenticators * * @return Server * @since 4.2.0 */ private static function getWebauthnServer(?int $userId): Server { /** @var CMSApplication $app */ try { $app = Factory::getApplication(); $siteName = $app->get('sitename'); } catch (\Exception $e) { $siteName = 'Joomla! Site'; } // Credentials repository $repository = new CredentialRepository($userId); // Relaying Party -- Our site $rpEntity = new PublicKeyCredentialRpEntity( $siteName ?? 'Joomla! Site', Uri::getInstance()->toString(['host']), '' ); $refClass = new \ReflectionClass(Server::class); $refConstructor = $refClass->getConstructor(); $params = $refConstructor->getParameters(); if (count($params) === 3) { // WebAuthn library 2, 3 $server = new Server($rpEntity, $repository, null); } else { // WebAuthn library 4 (based on the deprecated comments in library version 3) $server = new Server($rpEntity, $repository); } // Ed25519 is only available with libsodium if (!function_exists('sodium_crypto_sign_seed_keypair')) { $server->setSelectedAlgorithms(['RS256', 'RS512', 'PS256', 'PS512', 'ES256', 'ES512']); } return $server; } /** * Returns an array of the PK credential descriptors (registered authenticators) for the given user. * * @param User $user The user to get the descriptors for * * @return PublicKeyCredentialDescriptor[] * @since 4.2.0 */ private static function getPubKeyDescriptorsForUser(User $user): array { $userEntity = self::getUserEntity($user); $repository = new CredentialRepository($user->id); $descriptors = []; $records = $repository->findAllForUserEntity($userEntity); foreach ($records as $record) { $descriptors[] = $record->getPublicKeyCredentialDescriptor(); } return $descriptors; } } PK@A#]�d���.multifactorauth/webauthn/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.webauthn * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') || die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\User\UserFactoryInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Multifactorauth\Webauthn\Extension\Webauthn; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.2.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $config = (array) PluginHelper::getPlugin('multifactorauth', 'webauthn'); $subject = $container->get(DispatcherInterface::class); $plugin = new Webauthn($subject, $config); $plugin->setApplication(Factory::getApplication()); $plugin->setUserFactory($container->get(UserFactoryInterface::class)); return $plugin; } ); } }; PK@A#]�ɧ��%multifactorauth/webauthn/webauthn.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="multifactorauth" method="upgrade"> <name>plg_multifactorauth_webauthn</name> <author>Joomla! Project</author> <creationDate>2022-05</creationDate> <copyright>(C) 2022 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.2.0</version> <description>PLG_MULTIFACTORAUTH_WEBAUTHN_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Multifactorauth\Webauthn</namespace> <files> <folder plugin="webauthn">services</folder> <folder>src</folder> <folder>tmpl</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_multifactorauth_webauthn.ini</language> <language tag="en-GB">language/en-GB/plg_multifactorauth_webauthn.sys.ini</language> </languages> </extension> PK@A#]a���)multifactorauth/webauthn/tmpl/default.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.webauthn * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ // Prevent direct access defined('_JEXEC') || die; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; // This method is only available on HTTPS if (Uri::getInstance()->getScheme() !== 'https') : ?> <div id="multifactorauth-webauthn-nothttps" class="my-2"> <div class="alert alert-danger"> <h2 class="alert-heading"> <span class="icon-cancel-circle" aria-hidden="true"></span> <?php echo Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_ERR_NOTHTTPS_HEAD'); ?> </h2> <p> <?php echo Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_ERR_NOTHTTPS_BODY'); ?> </p> </div> </div> <?php return; endif; $this->getApplication()->getDocument()->getWebAssetManager()->useScript('plg_multifactorauth_webauthn.webauthn'); ?> <div id="multifactorauth-webauthn-missing" class="my-2"> <div class="alert alert-danger"> <h2 class="alert-heading"> <span class="icon-cancel-circle" aria-hidden="true"></span> <?php echo Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_ERR_NOTAVAILABLE_HEAD'); ?> </h2> <p> <?php echo Text::_('PLG_MULTIFACTORAUTH_WEBAUTHN_ERR_NOTAVAILABLE_BODY'); ?> </p> </div> </div> PK@A#]H?D��*multifactorauth/totp/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.totp * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') || die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\User\UserFactoryInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Multifactorauth\Totp\Extension\Totp; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.2.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $config = (array) PluginHelper::getPlugin('multifactorauth', 'totp'); $subject = $container->get(DispatcherInterface::class); $plugin = new Totp($subject, $config); $plugin->setApplication(Factory::getApplication()); $plugin->setUserFactory($container->get(UserFactoryInterface::class)); return $plugin; } ); } }; PK@A#]�n~~multifactorauth/totp/totp.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="multifactorauth" method="upgrade"> <name>plg_multifactorauth_totp</name> <author>Joomla! Project</author> <creationDate>2013-08</creationDate> <copyright>(C) 2013 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.2.0</version> <description>PLG_MULTIFACTORAUTH_TOTP_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Multifactorauth\Totp</namespace> <files> <folder plugin="totp">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_multifactorauth_totp.ini</language> <language tag="en-GB">language/en-GB/plg_multifactorauth_totp.sys.ini</language> </languages> </extension> PK@A#]m�F7979+multifactorauth/totp/src/Extension/Totp.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Multifactorauth.totp * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Multifactorauth\Totp\Extension; use Joomla\CMS\Encrypt\Totp as TotpHelper; use Joomla\CMS\Event\MultiFactor\Captive; use Joomla\CMS\Event\MultiFactor\GetMethod; use Joomla\CMS\Event\MultiFactor\GetSetup; use Joomla\CMS\Event\MultiFactor\SaveSetup; use Joomla\CMS\Event\MultiFactor\Validate; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Uri\Uri; use Joomla\CMS\User\User; use Joomla\CMS\User\UserFactoryAwareTrait; use Joomla\Component\Users\Administrator\DataShape\CaptiveRenderOptions; use Joomla\Component\Users\Administrator\DataShape\MethodDescriptor; use Joomla\Component\Users\Administrator\DataShape\SetupRenderOptions; use Joomla\Component\Users\Administrator\Table\MfaTable; use Joomla\Event\SubscriberInterface; use Joomla\Input\Input; use RuntimeException; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! Multi-factor Authentication using Google Authenticator TOTP Plugin * * @since 3.2 */ class Totp extends CMSPlugin implements SubscriberInterface { use UserFactoryAwareTrait; /** * Affects constructor behavior. If true, language files will be loaded automatically. * * @var boolean * @since 3.2 */ protected $autoloadLanguage = true; /** * The MFA Method name handled by this plugin * * @var string * @since 4.2.0 */ private $mfaMethodName = 'totp'; /** * Should I try to detect and register legacy event listeners, i.e. methods which accept unwrapped arguments? While * this maintains a great degree of backwards compatibility to Joomla! 3.x-style plugins it is much slower. You are * advised to implement your plugins using proper Listeners, methods accepting an AbstractEvent as their sole * parameter, for best performance. Also bear in mind that Joomla! 5.x onwards will only allow proper listeners, * removing support for legacy Listeners. * * @var boolean * @since 4.2.0 * * @deprecated 4.3 will be removed in 6.0 * Implement your plugin methods accepting an AbstractEvent object * Example: * onEventTriggerName(AbstractEvent $event) { * $context = $event->getArgument(...); * } */ protected $allowLegacyListeners = false; /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.2.0 */ public static function getSubscribedEvents(): array { return [ 'onUserMultifactorGetMethod' => 'onUserMultifactorGetMethod', 'onUserMultifactorCaptive' => 'onUserMultifactorCaptive', 'onUserMultifactorGetSetup' => 'onUserMultifactorGetSetup', 'onUserMultifactorSaveSetup' => 'onUserMultifactorSaveSetup', 'onUserMultifactorValidate' => 'onUserMultifactorValidate', ]; } /** * Gets the identity of this MFA Method * * @param GetMethod $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorGetMethod(GetMethod $event): void { $event->addResult( new MethodDescriptor( [ 'name' => $this->mfaMethodName, 'display' => Text::_('PLG_MULTIFACTORAUTH_TOTP_METHOD_TITLE'), 'shortinfo' => Text::_('PLG_MULTIFACTORAUTH_TOTP_SHORTINFO'), 'image' => 'media/plg_multifactorauth_totp/images/totp.svg', ] ) ); } /** * Returns the information which allows Joomla to render the Captive MFA page. This is the page * which appears right after you log in and asks you to validate your login with MFA. * * @param Captive $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorCaptive(Captive $event): void { /** * @var MfaTable $record The record currently selected by the user. */ $record = $event['record']; // Make sure we are actually meant to handle this Method if ($record->method !== $this->mfaMethodName) { return; } $event->addResult( new CaptiveRenderOptions( [ // Custom HTML to display above the MFA form 'pre_message' => Text::_('PLG_MULTIFACTORAUTH_TOTP_CAPTIVE_PROMPT'), // How to render the MFA code field. "input" (HTML input element) or "custom" (custom HTML) 'field_type' => 'input', // The type attribute for the HTML input box. Typically "text" or "password". Use any HTML5 input type. 'input_type' => 'text', // The attributes for the HTML input box. 'input_attributes' => [ 'pattern' => '[0-9]{6}', 'maxlength' => '6', 'inputmode' => 'numeric', 'required' => 'true', 'autocomplete' => 'one-time-code', 'aria-autocomplete' => 'none', ], // Placeholder text for the HTML input box. Leave empty if you don't need it. 'placeholder' => '', // Label to show above the HTML input box. Leave empty if you don't need it. 'label' => Text::_('PLG_MULTIFACTORAUTH_TOTP_LBL_LABEL'), // Custom HTML. Only used when field_type = custom. 'html' => '', // Custom HTML to display below the MFA form 'post_message' => '', ] ) ); } /** * Returns the information which allows Joomla to render the MFA setup page. This is the page * which allows the user to add or modify a MFA Method for their user account. If the record * does not correspond to your plugin return an empty array. * * @param GetSetup $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorGetSetup(GetSetup $event): void { /** * @var MfaTable $record The record currently selected by the user. */ $record = $event['record']; // Make sure we are actually meant to handle this Method if ($record->method !== $this->mfaMethodName) { return; } $totp = new TotpHelper(); // Load the options from the record (if any) $options = $this->decodeRecordOptions($record); $key = $options['key'] ?? ''; $session = $this->getApplication()->getSession(); $isConfigured = !empty($key); // If there's a key in the session use that instead. $sessionKey = $session->get('com_users.totp.key', null); if (!empty($sessionKey)) { $key = $sessionKey; } // If there's still no key in the options, generate one and save it in the session if (empty($key)) { $key = $totp->generateSecret(); $session->set('com_users.totp.key', $key); } // Generate a QR code for the key $user = $this->getUserFactory()->loadUserById($record->user_id); $hostname = Uri::getInstance()->toString(['host']); $otpURL = sprintf("otpauth://totp/%s@%s?secret=%s", $user->username, $hostname, $key); $document = $this->getApplication()->getDocument(); $wam = $document->getWebAssetManager(); $document->addScriptOptions('plg_multifactorauth_totp.totp.qr', $otpURL); $wam->getRegistry()->addExtensionRegistryFile('plg_multifactorauth_totp'); $wam->useScript('plg_multifactorauth_totp.setup'); $event->addResult( new SetupRenderOptions( [ 'default_title' => Text::_('PLG_MULTIFACTORAUTH_TOTP_METHOD_TITLE'), 'pre_message' => Text::_('PLG_MULTIFACTORAUTH_TOTP_LBL_SETUP_INSTRUCTIONS'), 'table_heading' => Text::_('PLG_MULTIFACTORAUTH_TOTP_LBL_SETUP_TABLE_HEADING'), 'tabular_data' => [ '' => Text::_('PLG_MULTIFACTORAUTH_TOTP_LBL_SETUP_TABLE_SUBHEAD'), Text::_('PLG_MULTIFACTORAUTH_TOTP_LBL_SETUP_TABLE_KEY') => $key, Text::_('PLG_MULTIFACTORAUTH_TOTP_LBL_SETUP_TABLE_QR') => "<span id=\"users-mfa-totp-qrcode\" />", Text::_('PLG_MULTIFACTORAUTH_TOTP_LBL_SETUP_TABLE_LINK') => Text::sprintf('PLG_MULTIFACTORAUTH_TOTP_LBL_SETUP_TABLE_LINK_TEXT', $otpURL) . '<br/><small>' . Text::_('PLG_MULTIFACTORAUTH_TOTP_LBL_SETUP_TABLE_LINK_NOTE') . '</small>', ], 'hidden_data' => [ 'key' => $key, ], 'input_type' => $isConfigured ? 'hidden' : 'text', 'input_attributes' => [ 'pattern' => '[0-9]{6}', 'maxlength' => '6', 'inputmode' => 'numeric', 'required' => 'true', 'autocomplete' => 'one-time-code', 'aria-autocomplete' => 'none', ], 'input_value' => '', 'placeholder' => Text::_('PLG_MULTIFACTORAUTH_TOTP_LBL_SETUP_PLACEHOLDER'), 'label' => Text::_('PLG_MULTIFACTORAUTH_TOTP_LBL_LABEL'), ] ) ); } /** * Parse the input from the MFA setup page and return the configuration information to be saved to the database. If * the information is invalid throw a RuntimeException to signal the need to display the editor page again. The * message of the exception will be displayed to the user. If the record does not correspond to your plugin return * an empty array. * * @param SaveSetup $event The event we are handling * * @return void The configuration data to save to the database * @since 4.2.0 */ public function onUserMultifactorSaveSetup(SaveSetup $event): void { /** * @var MfaTable $record The record currently selected by the user. * @var Input $input The user input you are going to take into account. */ $record = $event['record']; $input = $event['input']; // Make sure we are actually meant to handle this Method if ($record->method != $this->mfaMethodName) { return; } // Load the options from the record (if any) $options = $this->decodeRecordOptions($record); $optionsKey = $options['key'] ?? ''; $key = $optionsKey; $session = $this->getApplication()->getSession(); // If there is no key in the options fetch one from the session if (empty($key)) { $key = $session->get('com_users.totp.key', null); } // If there is still no key in the options throw an error if (empty($key)) { throw new \RuntimeException(Text::_('JERROR_ALERTNOAUTHOR'), 403); } /** * If the code is empty but the key already existed in $options someone is simply changing the title / default * Method status. We can allow this and stop checking anything else now. */ $code = $input->getInt('code'); if (empty($code) && !empty($optionsKey)) { $event->addResult($options); return; } // In any other case validate the submitted code $totp = new TotpHelper(); $isValid = $totp->checkCode($key, $code); if (!$isValid) { throw new \RuntimeException(Text::_('PLG_MULTIFACTORAUTH_TOTP_ERR_VALIDATIONFAILED'), 500); } // The code is valid. Unset the key from the session. $session->set('com_users.totp.key', null); // Return the configuration to be serialized $event->addResult( [ 'key' => $key, ] ); } /** * Validates the Multi-factor Authentication code submitted by the user in the Multi-Factor * Authentication page. If the record does not correspond to your plugin return FALSE. * * @param Validate $event The event we are handling * * @return void * @since 4.2.0 */ public function onUserMultifactorValidate(Validate $event): void { /** * @var MfaTable $record The MFA Method's record you're validating against * @var User $user The user record * @var string $code The submitted code */ $record = $event['record']; $user = $event['user']; $code = $event['code']; // Make sure we are actually meant to handle this Method if ($record->method !== $this->mfaMethodName) { $event->addResult(false); return; } // Double check the MFA Method is for the correct user if ($user->id != $record->user_id) { $event->addResult(false); return; } // Load the options from the record (if any) $options = $this->decodeRecordOptions($record); $key = $options['key'] ?? ''; // If there is no key in the options throw an error if (empty($key)) { $event->addResult(false); return; } // Check the MFA code for validity $event->addResult((new TotpHelper())->checkCode($key, $code)); } /** * Decodes the options from a record into an options object. * * @param MfaTable $record The record to decode options for * * @return array * @since 4.2.0 */ private function decodeRecordOptions(MfaTable $record): array { $options = [ 'key' => '', ]; if (!empty($record->options)) { $recordOptions = $record->options; $options = array_merge($options, $recordOptions); } return $options; } } PK@A#],Q�!!,media-action/resize/src/Extension/Resize.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Media-Action.resize * * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\MediaAction\Resize\Extension; use Joomla\CMS\Image\Image; use Joomla\Component\Media\Administrator\Plugin\MediaActionPlugin; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Media Manager Resize Action * * @since 4.0.0 */ final class Resize extends MediaActionPlugin { /** * The save event. * * @param string $context The context * @param object $item The item * @param boolean $isNew Is new item * @param array $data The validated data * * @return void * * @since 4.0.0 */ public function onContentBeforeSave($context, $item, $isNew, $data = []) { if ($context != 'com_media.file') { return; } if (!$this->params->get('batch_width') && !$this->params->get('batch_height')) { return; } if (!in_array($item->extension, ['jpg', 'jpeg', 'png', 'gif'])) { return; } $imgObject = new Image(imagecreatefromstring($item->data)); if ($imgObject->getWidth() < $this->params->get('batch_width', 0) && $imgObject->getHeight() < $this->params->get('batch_height', 0)) { return; } $imgObject->resize( $this->params->get('batch_width', 0), $this->params->get('batch_height', 0), false, Image::SCALE_INSIDE ); $type = IMAGETYPE_JPEG; switch ($item->extension) { case 'gif': $type = IMAGETYPE_GIF; break; case 'png': $type = IMAGETYPE_PNG; } ob_start(); $imgObject->toFile(null, $type); $item->data = ob_get_contents(); ob_end_clean(); } } PK@A#]���ݦ�media-action/resize/resize.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="media-action" method="upgrade"> <name>plg_media-action_resize</name> <author>Joomla! Project</author> <creationDate>2017-01</creationDate> <copyright>(C) 2017 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.0.0</version> <description>PLG_MEDIA-ACTION_RESIZE_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\MediaAction\Resize</namespace> <files> <folder>form</folder> <folder plugin="resize">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_media-action_resize.ini</language> <language tag="en-GB">language/en-GB/plg_media-action_resize.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="batch" label="PLG_MEDIA-ACTION_RESIZE_BATCH_LABEL" description="PLG_MEDIA-ACTION_RESIZE_BATCH_DESC" > <field name="batch_width" type="text" label="PLG_MEDIA-ACTION_RESIZE_BATCH_MAX_WIDTH_LABEL" addonAfter="px" filter="integer" /> <field name="batch_height" type="text" label="PLG_MEDIA-ACTION_RESIZE_BATCH_MAX_HEIGHT_LABEL" addonAfter="px" filter="integer" /> </fieldset> </fields> </config> </extension> PK@A#]V��66)media-action/resize/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Media-Action.resize * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\MediaAction\Resize\Extension\Resize; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Resize( $dispatcher, (array) PluginHelper::getPlugin('media-action', 'resize') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]H���AA#media-action/resize/form/resize.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <form> <fieldset name="resize" label="PLG_MEDIA-ACTION_RESIZE_LABEL"> <field name="resize_quality" type="number" label="PLG_MEDIA-ACTION_RESIZE_QUALITY" addonBefore="PLG_MEDIA-ACTION_RESIZE_QUALITY" min="1" max="100" step="1" default="80" filter="integer" /> <field type="spacer" hr="true" /> <field name="resize_width" type="text" label="PLG_MEDIA-ACTION_RESIZE_PARAM_WIDTH" hiddenLabel="true" addonBefore="PLG_MEDIA-ACTION_RESIZE_PARAM_WIDTH" addonAfter="px" pattern="\d*\.?\d*" /> <field name="resize_height" type="text" label="PLG_MEDIA-ACTION_RESIZE_PARAM_HEIGHT" hiddenLabel="true" addonBefore="PLG_MEDIA-ACTION_RESIZE_PARAM_HEIGHT" addonAfter="px" pattern="\d*\.?\d*" /> </fieldset> </form> PK@A#]��6,,'media-action/crop/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Media-Action.crop * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\MediaAction\Crop\Extension\Crop; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Crop( $dispatcher, (array) PluginHelper::getPlugin('media-action', 'crop') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]��}��(media-action/crop/src/Extension/Crop.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Media-Action.crop * * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\MediaAction\Crop\Extension; use Joomla\CMS\Application\CMSWebApplicationInterface; use Joomla\Component\Media\Administrator\Plugin\MediaActionPlugin; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Media Manager Crop Action * * @since 4.0.0 */ final class Crop extends MediaActionPlugin { /** * Load the javascript files of the plugin. * * @return void * * @since 4.0.0 */ protected function loadJs() { parent::loadJs(); if (!$this->getApplication() instanceof CMSWebApplicationInterface) { return; } $this->getApplication()->getDocument()->getWebAssetManager()->useScript('cropperjs'); } /** * Load the CSS files of the plugin. * * @return void * * @since 4.0.0 */ protected function loadCss() { parent::loadCss(); if (!$this->getApplication() instanceof CMSWebApplicationInterface) { return; } $this->getApplication()->getDocument()->getWebAssetManager()->useStyle('cropperjs'); } } PK@A#]��{ { media-action/crop/form/crop.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <form> <fieldset name="crop" label="PLG_MEDIA-ACTION_CROP_LABEL"> <field name="crop_quality" type="number" label="PLG_MEDIA-ACTION_CROP_QUALITY" addonBefore="PLG_MEDIA-ACTION_CROP_QUALITY" min="1" max="100" step="1" default="80" filter="integer" /> <field type="spacer" hr="true" /> <field name="crop_x" type="text" label="PLG_MEDIA-ACTION_CROP_PARAM_X" hiddenLabel="true" addonBefore="PLG_MEDIA-ACTION_CROP_PARAM_X" addonAfter="px" pattern="\d*\.?\d*" /> <field name="crop_y" type="text" label="PLG_MEDIA-ACTION_CROP_PARAM_Y" hiddenLabel="true" addonBefore="PLG_MEDIA-ACTION_CROP_PARAM_Y" addonAfter="px" pattern="\d*\.?\d*" /> <field name="crop_width" type="text" label="PLG_MEDIA-ACTION_CROP_PARAM_WIDTH" hiddenLabel="true" addonBefore="PLG_MEDIA-ACTION_CROP_PARAM_WIDTH" addonAfter="px" pattern="\d*\.?\d*" /> <field name="crop_height" type="text" label="PLG_MEDIA-ACTION_CROP_PARAM_HEIGHT" hiddenLabel="true" addonBefore="PLG_MEDIA-ACTION_CROP_PARAM_HEIGHT" addonAfter="px" pattern="\d*\.?\d*" /> <field name="aspectRatio" type="groupedlist" label="PLG_MEDIA-ACTION_CROP_PARAM_ASPECT" hiddenLabel="true" class="crop-aspect-ratio-options" default="1.111" > <option class="crop-aspect-ratio-option" value="1.111">PLG_MEDIA-ACTION_CROP_PARAM_DEFAULT_RATIO</option> <option class="crop-aspect-ratio-option" value="">PLG_MEDIA-ACTION_CROP_PARAM_NO_RATIO</option> <option class="crop-aspect-ratio-option" value="1">1:1</option> <group label="PLG_MEDIA-ACTION_CROP_PARAM_LANDSCAPE"> <option class="crop-aspect-ratio-option" value="1.25">5:4</option> <option class="crop-aspect-ratio-option" value="1.3333333333333333">4:3</option> <option class="crop-aspect-ratio-option" value="1.5">3:2</option> <option class="crop-aspect-ratio-option" value="1.7777777777777777">16:9</option> </group> <group label="PLG_MEDIA-ACTION_CROP_PARAM_PORTRAIT"> <option class="crop-aspect-ratio-option" value="0.8">4:5</option> <option class="crop-aspect-ratio-option" value="0.75">3:4</option> <option class="crop-aspect-ratio-option" value="0.6666666666666667">2:3</option> <option class="crop-aspect-ratio-option" value="0.5625">9:16</option> </group> </field> </fieldset> </form> PK@A#]��H*��media-action/crop/crop.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="media-action" method="upgrade"> <name>plg_media-action_crop</name> <author>Joomla! Project</author> <creationDate>2017-01</creationDate> <copyright>(C) 2017 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.0.0</version> <description>PLG_MEDIA-ACTION_CROP_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\MediaAction\Crop</namespace> <files> <folder>form</folder> <folder plugin="crop">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_media-action_crop.ini</language> <language tag="en-GB">language/en-GB/plg_media-action_crop.sys.ini</language> </languages> </extension> PK@A#]�a`�BB,media-action/rotate/src/Extension/Rotate.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Media-Action.rotate * * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\MediaAction\Rotate\Extension; use Joomla\Component\Media\Administrator\Plugin\MediaActionPlugin; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Media Manager Rotate Action * * @since 4.0.0 */ final class Rotate extends MediaActionPlugin { } PK@A#]�X��66)media-action/rotate/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Media-Action.rotate * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\MediaAction\Rotate\Extension\Rotate; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Rotate( $dispatcher, (array) PluginHelper::getPlugin('media-action', 'rotate') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]\0�A��media-action/rotate/rotate.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="media-action" method="upgrade"> <name>plg_media-action_rotate</name> <author>Joomla! Project</author> <creationDate>2017-01</creationDate> <copyright>(C) 2017 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.0.0</version> <description>PLG_MEDIA-ACTION_ROTATE_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\MediaAction\Rotate</namespace> <files> <folder>form</folder> <folder plugin="rotate">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_media-action_rotate.ini</language> <language tag="en-GB">language/en-GB/plg_media-action_rotate.sys.ini</language> </languages> </extension> PK@A#]��4XX#media-action/rotate/form/rotate.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <form> <fieldset name="rotate" label="PLG_MEDIA-ACTION_ROTATE_LABEL"> <field name="rotate_quality" type="number" label="PLG_MEDIA-ACTION_ROTATE_QUALITY" addonBefore="PLG_MEDIA-ACTION_ROTATE_QUALITY" min="1" max="100" step="1" default="80" filter="integer" /> <field type="spacer" hr="true" /> <field name="rotate_a" type="number" label="PLG_MEDIA-ACTION_ROTATE_PARAM_ANGLE" min="0" max="360" step="1" default="0" filter="integer" /> <field name="rotate_distinct" type="radio" label="PLG_MEDIA-ACTION_ROTATE_PARAM_BUTTONS" class="btn-group" default="" > <option value="0">0</option> <option value="90">90</option> <option value="180">180</option> <option value="270">270</option> </field> </fieldset> </form> PK@A#]2���nn,task/sitestatus/src/Extension/SiteStatus.phpnu�[���<?php /** * @package Joomla.Plugins * @subpackage Task.SiteStatus * * @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Task\SiteStatus\Extension; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Component\Scheduler\Administrator\Event\ExecuteTaskEvent; use Joomla\Component\Scheduler\Administrator\Task\Status; use Joomla\Component\Scheduler\Administrator\Traits\TaskPluginTrait; use Joomla\Event\DispatcherInterface; use Joomla\Event\SubscriberInterface; use Joomla\Filesystem\File; use Joomla\Filesystem\Path; use Joomla\Registry\Registry; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Task plugin with routines to change the offline status of the site. These routines can be used to control planned * maintenance periods and related operations. * * @since 4.1.0 */ final class SiteStatus extends CMSPlugin implements SubscriberInterface { use TaskPluginTrait; /** * @var string[] * @since 4.1.0 */ protected const TASKS_MAP = [ 'plg_task_toggle_offline' => [ 'langConstPrefix' => 'PLG_TASK_SITE_STATUS', 'toggle' => true, ], 'plg_task_toggle_offline_set_online' => [ 'langConstPrefix' => 'PLG_TASK_SITE_STATUS_SET_ONLINE', 'toggle' => false, 'offline' => false, ], 'plg_task_toggle_offline_set_offline' => [ 'langConstPrefix' => 'PLG_TASK_SITE_STATUS_SET_OFFLINE', 'toggle' => false, 'offline' => true, ], ]; /** * Autoload the language file. * * @var boolean * @since 4.1.0 */ protected $autoloadLanguage = true; /** * @inheritDoc * * @return string[] * * @since 4.1.0 */ public static function getSubscribedEvents(): array { return [ 'onTaskOptionsList' => 'advertiseRoutines', 'onExecuteTask' => 'alterSiteStatus', ]; } /** * The old config * * @var array * @since 4.2.0 */ private $oldConfig; /** * The config file * * @var string * @since 4.2.0 */ private $configFile; /** * Constructor. * * @param DispatcherInterface $dispatcher The dispatcher * @param array $config An optional associative array of configuration settings * @param array $oldConfig The old config * @param string $configFile The config * * @since 4.2.0 */ public function __construct(DispatcherInterface $dispatcher, array $config, array $oldConfig, string $configFile) { parent::__construct($dispatcher, $config); $this->oldConfig = $oldConfig; $this->configFile = $configFile; } /** * @param ExecuteTaskEvent $event The onExecuteTask event * * @return void * * @since 4.1.0 * @throws \Exception */ public function alterSiteStatus(ExecuteTaskEvent $event): void { if (!array_key_exists($event->getRoutineId(), self::TASKS_MAP)) { return; } $this->startRoutine($event); $config = $this->oldConfig; $toggle = self::TASKS_MAP[$event->getRoutineId()]['toggle']; $oldStatus = $config['offline'] ? 'offline' : 'online'; if ($toggle) { $config['offline'] = !$config['offline']; } else { $config['offline'] = self::TASKS_MAP[$event->getRoutineId()]['offline']; } $newStatus = $config['offline'] ? 'offline' : 'online'; $exit = $this->writeConfigFile(new Registry($config)); $this->logTask(sprintf($this->getApplication()->getLanguage()->_('PLG_TASK_SITE_STATUS_TASK_LOG_SITE_STATUS'), $oldStatus, $newStatus)); $this->endRoutine($event, $exit); } /** * Method to write the configuration to a file. * * @param Registry $config A Registry object containing all global config data. * * @return integer The task exit code * * @since 4.1.0 * @throws \Exception */ private function writeConfigFile(Registry $config): int { // Set the configuration file path. $file = $this->configFile; // Attempt to make the file writeable. if (file_exists($file) && Path::isOwner($file) && !Path::setPermissions($file)) { $this->logTask($this->getApplication()->getLanguage()->_('PLG_TASK_SITE_STATUS_ERROR_CONFIGURATION_PHP_NOTWRITABLE'), 'notice'); } try { // Attempt to write the configuration file as a PHP class named JConfig. $configuration = $config->toString('PHP', ['class' => 'JConfig', 'closingtag' => false]); File::write($file, $configuration); } catch (\Exception $e) { $this->logTask($this->getApplication()->getLanguage()->_('PLG_TASK_SITE_STATUS_ERROR_WRITE_FAILED'), 'error'); return Status::KNOCKOUT; } // Invalidates the cached configuration file if (function_exists('opcache_invalidate')) { opcache_invalidate($file); } // Attempt to make the file un-writeable. if (Path::isOwner($file) && !Path::setPermissions($file, '0444')) { $this->logTask($this->getApplication()->getLanguage()->_('PLG_TASK_SITE_STATUS_ERROR_CONFIGURATION_PHP_NOTUNWRITABLE'), 'notice'); } return Status::OK; } } PK@A#]� �7``task/sitestatus/sitestatus.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="task" method="upgrade"> <name>plg_task_site_status</name> <author>Joomla! Project</author> <creationDate>2021-08</creationDate> <copyright>(C) 2021 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.1</version> <description>PLG_TASK_SITE_STATUS_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Task\SiteStatus</namespace> <files> <folder plugin="sitestatus">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_task_sitestatus.ini</language> <language tag="en-GB">language/en-GB/plg_task_sitestatus.sys.ini</language> </languages> </extension> PK@A#]�Wa��%task/sitestatus/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Task.SiteStatus * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Task\SiteStatus\Extension\SiteStatus; use Joomla\Utilities\ArrayHelper; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.2.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $plugin = new SiteStatus( $container->get(DispatcherInterface::class), (array) PluginHelper::getPlugin('task', 'sitestatus'), ArrayHelper::fromObject(new JConfig()), JPATH_CONFIGURATION . '/configuration.php' ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]3����*task/demotasks/src/Extension/DemoTasks.phpnu�[���<?php /** * @package Joomla.Plugins * @subpackage Task.DemoTasks * * @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Task\DemoTasks\Extension; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Component\Scheduler\Administrator\Event\ExecuteTaskEvent; use Joomla\Component\Scheduler\Administrator\Task\Status; use Joomla\Component\Scheduler\Administrator\Task\Task; use Joomla\Component\Scheduler\Administrator\Traits\TaskPluginTrait; use Joomla\Event\SubscriberInterface; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * A demo task plugin. Offers 3 task routines and demonstrates the use of {@see TaskPluginTrait}, * {@see ExecuteTaskEvent}. * * @since 4.1.0 */ final class DemoTasks extends CMSPlugin implements SubscriberInterface { use TaskPluginTrait; /** * @var string[] * @since 4.1.0 */ private const TASKS_MAP = [ 'demoTask_r1.sleep' => [ 'langConstPrefix' => 'PLG_TASK_DEMO_TASKS_TASK_SLEEP', 'method' => 'sleep', 'form' => 'testTaskForm', ], 'demoTask_r2.memoryStressTest' => [ 'langConstPrefix' => 'PLG_TASK_DEMO_TASKS_STRESS_MEMORY', 'method' => 'stressMemory', ], 'demoTask_r3.memoryStressTestOverride' => [ 'langConstPrefix' => 'PLG_TASK_DEMO_TASKS_STRESS_MEMORY_OVERRIDE', 'method' => 'stressMemoryRemoveLimit', ], 'demoTask_r4.resumable' => [ 'langConstPrefix' => 'PLG_TASK_DEMO_TASKS_RESUMABLE', 'method' => 'resumable', 'form' => 'testTaskForm', ], ]; /** * @var boolean * @since 4.1.0 */ protected $autoloadLanguage = true; /** * @inheritDoc * * @return string[] * * @since 4.1.0 */ public static function getSubscribedEvents(): array { return [ 'onTaskOptionsList' => 'advertiseRoutines', 'onExecuteTask' => 'standardRoutineHandler', 'onContentPrepareForm' => 'enhanceTaskItemForm', ]; } /** * Sample resumable task. * * Whether the task will resume is random. There's a 40% chance of finishing every time it runs. * * You can use this as a template to create long running tasks which can detect an impending * timeout condition, return Status::WILL_RESUME and resume execution next time they are called. * * @param ExecuteTaskEvent $event The event we are handling * * @return integer * * @since 4.1.0 * @throws \Exception */ private function resumable(ExecuteTaskEvent $event): int { /** @var Task $task */ $task = $event->getArgument('subject'); $timeout = (int) $event->getArgument('params')->timeout ?? 1; $lastStatus = $task->get('last_exit_code', Status::OK); // This is how you detect if you are resuming a task or starting it afresh if ($lastStatus === Status::WILL_RESUME) { $this->logTask(sprintf('Resuming task %d', $task->get('id'))); } else { $this->logTask(sprintf('Starting new task %d', $task->get('id'))); } // Sample task body; we are simply sleeping for some time. $this->logTask(sprintf('Starting %ds timeout', $timeout)); sleep($timeout); $this->logTask(sprintf('%ds timeout over!', $timeout)); // Should I resume the task in the next step (randomly decided)? $willResume = random_int(0, 5) < 4; // Log our intention to resume or not and return the appropriate exit code. if ($willResume) { $this->logTask(sprintf('Task %d will resume', $task->get('id'))); } else { $this->logTask(sprintf('Task %d is now complete', $task->get('id'))); } return $willResume ? Status::WILL_RESUME : Status::OK; } /** * @param ExecuteTaskEvent $event The `onExecuteTask` event. * * @return integer The routine exit code. * * @since 4.1.0 * @throws \Exception */ private function sleep(ExecuteTaskEvent $event): int { $timeout = (int) $event->getArgument('params')->timeout ?? 1; $this->logTask(sprintf('Starting %d timeout', $timeout)); sleep($timeout); $this->logTask(sprintf('%d timeout over!', $timeout)); return Status::OK; } /** * Standard routine method for the memory test routine. * * @param ExecuteTaskEvent $event The `onExecuteTask` event. * * @return integer The routine exit code. * * @since 4.1.0 * @throws \Exception */ private function stressMemory(ExecuteTaskEvent $event): int { $mLimit = $this->getMemoryLimit(); $this->logTask(sprintf('Memory Limit: %d KB', $mLimit)); $iMem = $cMem = memory_get_usage(); $i = 0; while ($cMem + ($cMem - $iMem) / ++$i <= $mLimit) { $this->logTask(sprintf('Current memory usage: %d KB', $cMem)); ${"array" . $i} = array_fill(0, 100000, 1); } return Status::OK; } /** * Standard routine method for the memory test routine, also attempts to override the memory limit set by the PHP * INI. * * @param ExecuteTaskEvent $event The `onExecuteTask` event. * * @return integer The routine exit code. * * @since 4.1.0 * @throws \Exception */ private function stressMemoryRemoveLimit(ExecuteTaskEvent $event): int { $success = false; if (function_exists('ini_set')) { $success = ini_set('memory_limit', -1) !== false; } $this->logTask('Memory limit override ' . $success ? 'successful' : 'failed'); return $this->stressMemory($event); } /** * Processes the PHP ini memory_limit setting, returning the memory limit in KB * * @return float * * @since 4.1.0 */ private function getMemoryLimit(): float { $memoryLimit = ini_get('memory_limit'); if (preg_match('/^(\d+)(.)$/', $memoryLimit, $matches)) { if ($matches[2] == 'M') { // * nnnM -> nnn MB $memoryLimit = $matches[1] * 1024 * 1024; } else { if ($matches[2] == 'K') { // * nnnK -> nnn KB $memoryLimit = $matches[1] * 1024; } } } return (float) $memoryLimit; } } PK@A#]Z��jTT%task/demotasks/forms/testTaskForm.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <form> <fields name="params"> <fieldset name="task_params"> <field name="timeout" type="number" label="PLG_TASK_DEMO_TASKS_SLEEP_TIMEOUT_LABEL" default="1" required="true" min="1" step="1" validate="number" filter="int" /> </fieldset> </fields> </form> PK@A#]>�\sstask/demotasks/demotasks.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="task" method="upgrade"> <name>plg_task_demo_tasks</name> <author>Joomla! Project</author> <creationDate>2021-07</creationDate> <copyright>(C) 2021 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.1</version> <description>PLG_TASK_DEMO_TASKS_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Task\DemoTasks</namespace> <files> <folder plugin="demotasks">services</folder> <folder>src</folder> <folder>forms</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_task_demotasks.ini</language> <language tag="en-GB">language/en-GB/plg_task_demotasks.sys.ini</language> </languages> </extension> PK@A#]A�7[%%$task/demotasks/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Task.DemoTasks * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Task\DemoTasks\Extension\DemoTasks; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.2.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new DemoTasks( $dispatcher, (array) PluginHelper::getPlugin('task', 'demotasks') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]��\��(task/requests/src/Extension/Requests.phpnu�[���<?php /** * @package Joomla.Plugins * @subpackage Task.Requests * * @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Task\Requests\Extension; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Component\Scheduler\Administrator\Event\ExecuteTaskEvent; use Joomla\Component\Scheduler\Administrator\Task\Status as TaskStatus; use Joomla\Component\Scheduler\Administrator\Traits\TaskPluginTrait; use Joomla\Event\DispatcherInterface; use Joomla\Event\SubscriberInterface; use Joomla\Filesystem\File; use Joomla\Filesystem\Path; use Joomla\Http\HttpFactory; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Task plugin with routines to make HTTP requests. * At the moment, offers a single routine for GET requests. * * @since 4.1.0 */ final class Requests extends CMSPlugin implements SubscriberInterface { use TaskPluginTrait; /** * @var string[] * @since 4.1.0 */ protected const TASKS_MAP = [ 'plg_task_requests_task_get' => [ 'langConstPrefix' => 'PLG_TASK_REQUESTS_TASK_GET_REQUEST', 'form' => 'get_requests', 'method' => 'makeGetRequest', ], ]; /** * Returns an array of events this subscriber will listen to. * * @return string[] * * @since 4.1.0 */ public static function getSubscribedEvents(): array { return [ 'onTaskOptionsList' => 'advertiseRoutines', 'onExecuteTask' => 'standardRoutineHandler', 'onContentPrepareForm' => 'enhanceTaskItemForm', ]; } /** * @var boolean * @since 4.1.0 */ protected $autoloadLanguage = true; /** * The http factory * * @var HttpFactory * @since 4.2.0 */ private $httpFactory; /** * The root directory * * @var string * @since 4.2.0 */ private $rootDirectory; /** * Constructor. * * @param DispatcherInterface $dispatcher The dispatcher * @param array $config An optional associative array of configuration settings * @param HttpFactory $httpFactory The http factory * @param string $rootDirectory The root directory to store the output file in * * @since 4.2.0 */ public function __construct(DispatcherInterface $dispatcher, array $config, HttpFactory $httpFactory, string $rootDirectory) { parent::__construct($dispatcher, $config); $this->httpFactory = $httpFactory; $this->rootDirectory = $rootDirectory; } /** * Standard routine method for the get request routine. * * @param ExecuteTaskEvent $event The onExecuteTask event * * @return integer The exit code * * @since 4.1.0 * @throws \Exception */ protected function makeGetRequest(ExecuteTaskEvent $event): int { $id = $event->getTaskId(); $params = $event->getArgument('params'); $url = $params->url; $timeout = $params->timeout; $auth = (string) $params->auth ?? 0; $authType = (string) $params->authType ?? ''; $authKey = (string) $params->authKey ?? ''; $headers = []; if ($auth && $authType && $authKey) { $headers = ['Authorization' => $authType . ' ' . $authKey]; } try { $response = $this->httpFactory->getHttp([])->get($url, $headers, $timeout); } catch (\Exception $e) { $this->logTask($this->getApplication()->getLanguage()->_('PLG_TASK_REQUESTS_TASK_GET_REQUEST_LOG_TIMEOUT')); return TaskStatus::TIMEOUT; } $responseCode = $response->code; $responseBody = $response->body; // @todo this handling must be rethought and made safe. stands as a good demo right now. $responseFilename = Path::clean($this->rootDirectory . "/task_{$id}_response.html"); try { File::write($responseFilename, $responseBody); $this->snapshot['output_file'] = $responseFilename; $responseStatus = 'SAVED'; } catch (\Exception $e) { $this->logTask($this->getApplication()->getLanguage()->_('PLG_TASK_REQUESTS_TASK_GET_REQUEST_LOG_UNWRITEABLE_OUTPUT'), 'error'); $responseStatus = 'NOT_SAVED'; } $this->snapshot['output'] = <<< EOF ======= Task Output Body ======= > URL: $url > Response Code: $responseCode > Response: $responseStatus EOF; $this->logTask(sprintf($this->getApplication()->getLanguage()->_('PLG_TASK_REQUESTS_TASK_GET_REQUEST_LOG_RESPONSE'), $responseCode)); if ($response->code !== 200) { return TaskStatus::KNOCKOUT; } return TaskStatus::OK; } } PK@A#]"�Z�kktask/requests/requests.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="task" method="upgrade"> <name>plg_task_requests</name> <author>Joomla! Project</author> <creationDate>2021-08</creationDate> <copyright>(C) 2021 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.1</version> <description>PLG_TASK_REQUESTS_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Task\Requests</namespace> <files> <folder plugin="requests">services</folder> <folder>src</folder> <folder>forms</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_task_requests.ini</language> <language tag="en-GB">language/en-GB/plg_task_requests.sys.ini</language> </languages> </extension> PK@A#]� o���$task/requests/forms/get_requests.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <form> <fields name="params"> <fieldset name="task_params"> <field name="url" type="url" label="PLG_TASK_REQUESTS_LABEL_REQUEST_URL" required="true" validate="url" filter="url" /> <field name="timeout" type="number" label="PLG_TASK_REQUESTS_LABEL_REQUEST_TIMEOUT" min="1" step="1" default="120" required="true" filter="int" validate="number" /> <field name="auth" type="radio" label="PLG_TASK_REQUESTS_LABEL_AUTH" layout="joomla.form.field.radio.switcher" default="0" required="true" filter="integer" > <option value="0">JDISABLED</option> <option value="1">JENABLED</option> </field> <field name="authType" type="list" label="PLG_TASK_REQUESTS_LABEL_AUTH_HEADER" showon="auth:1" > <option value="Bearer">PLG_TASK_REQUESTS_BEARER</option> <option value="X-Joomla-Token">PLG_TASK_REQUESTS_JOOMLA_TOKEN</option> </field> <field name="authKey" type="text" label="PLG_TASK_REQUESTS_LABEL_AUTH_KEY" showon="auth:1" /> </fieldset> </fields> </form> PK@A#]%��aa#task/requests/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Task.requests * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Http\HttpFactory; use Joomla\Plugin\Task\Requests\Extension\Requests; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.2.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $plugin = new Requests( $container->get(DispatcherInterface::class), (array) PluginHelper::getPlugin('task', 'requests'), new HttpFactory(), JPATH_ROOT . '/tmp' ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]�_++%task/checkfiles/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Task.CheckFiles * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Task\Checkfiles\Extension\Checkfiles; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.2.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $plugin = new Checkfiles( $container->get(DispatcherInterface::class), (array) PluginHelper::getPlugin('task', 'checkfiles'), JPATH_ROOT . '/images/' ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]�]�pyytask/checkfiles/checkfiles.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="task" method="upgrade"> <name>plg_task_check_files</name> <author>Joomla! Project</author> <creationDate>2021-08</creationDate> <copyright>(C) 2021 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.1</version> <description>PLG_TASK_CHECK_FILES_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Task\Checkfiles</namespace> <files> <folder plugin="checkfiles">services</folder> <folder>src</folder> <folder>forms</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_task_checkfiles.ini</language> <language tag="en-GB">language/en-GB/plg_task_checkfiles.sys.ini</language> </languages> </extension> PK@A#]�EoQaa$task/checkfiles/forms/image_size.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <form> <fields name="params"> <fieldset name="task_params"> <field name="path" type="folderlist" label="PLG_TASK_CHECK_FILES_LABEL_DIRECTORY" directory="images" hide_default="true" hide_none="true" required="true" validate="options" > <option value="">JOPTION_DO_NOT_USE</option> </field> <field name="dimension" type="list" label="PLG_TASK_CHECK_FILES_LABEL_IMAGE_DIMENSION" required="true" default="width" > <option value="width">JFIELD_MEDIA_WIDTH_LABEL</option> <option value="height">JFIELD_MEDIA_HEIGHT_LABEL</option> </field> <field name="limit" type="number" label="PLG_TASK_CHECK_FILES_LABEL_DIMENSION_LIMIT" required="true" default="1080" min="1" step="1" filter="int" /> <field name="numImages" type="number" label="PLG_TASK_CHECK_FILES_LABEL_MAXIMAGES" description="PLG_TASK_CHECK_FILES_LABEL_MAXIMAGES_DESC" required="true" min="1" step="1" default="1" filter="int" /> </fieldset> </fields> </form> PK@A#]HI�{{,task/checkfiles/src/Extension/Checkfiles.phpnu�[���<?php /** * @package Joomla.Plugins * @subpackage Task.CheckFiles * * @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Task\Checkfiles\Extension; use Joomla\CMS\Image\Image; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Component\Scheduler\Administrator\Event\ExecuteTaskEvent; use Joomla\Component\Scheduler\Administrator\Task\Status as TaskStatus; use Joomla\Component\Scheduler\Administrator\Traits\TaskPluginTrait; use Joomla\Event\DispatcherInterface; use Joomla\Event\SubscriberInterface; use Joomla\Filesystem\Folder; use Joomla\Filesystem\Path; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Task plugin with routines that offer checks on files. * At the moment, offers a single routine to check and resize image files in a directory. * * @since 4.1.0 */ final class Checkfiles extends CMSPlugin implements SubscriberInterface { use TaskPluginTrait; /** * @var string[] * * @since 4.1.0 */ protected const TASKS_MAP = [ 'checkfiles.imagesize' => [ 'langConstPrefix' => 'PLG_TASK_CHECK_FILES_TASK_IMAGE_SIZE', 'form' => 'image_size', 'method' => 'checkImages', ], ]; /** * @inheritDoc * * @return string[] * * @since 4.1.0 */ public static function getSubscribedEvents(): array { return [ 'onTaskOptionsList' => 'advertiseRoutines', 'onExecuteTask' => 'standardRoutineHandler', 'onContentPrepareForm' => 'enhanceTaskItemForm', ]; } /** * @var boolean * @since 4.1.0 */ protected $autoloadLanguage = true; /** * The root directory path * * @var string * @since 4.2.0 */ private $rootDirectory; /** * Constructor. * * @param DispatcherInterface $dispatcher The dispatcher * @param array $config An optional associative array of configuration settings * @param string $rootDirectory The root directory to look for images * * @since 4.2.0 */ public function __construct(DispatcherInterface $dispatcher, array $config, string $rootDirectory) { parent::__construct($dispatcher, $config); $this->rootDirectory = $rootDirectory; } /** * @param ExecuteTaskEvent $event The onExecuteTask event * * @return integer The exit code * * @since 4.1.0 * @throws \RuntimeException * @throws \LogicException */ protected function checkImages(ExecuteTaskEvent $event): int { $params = $event->getArgument('params'); $path = Path::check($this->rootDirectory . $params->path); $dimension = $params->dimension; $limit = $params->limit; $numImages = max(1, (int) $params->numImages ?? 1); if (!is_dir($path)) { $this->logTask($this->getApplication()->getLanguage()->_('PLG_TASK_CHECK_FILES_LOG_IMAGE_PATH_NA'), 'warning'); return TaskStatus::NO_RUN; } foreach (Folder::files($path, '^.*\.(jpg|jpeg|png|gif|webp)', 2, true) as $imageFilename) { $properties = Image::getImageFileProperties($imageFilename); $resize = $properties->$dimension > $limit; if (!$resize) { continue; } $height = $properties->height; $width = $properties->width; $newHeight = $dimension === 'height' ? $limit : $height * $limit / $width; $newWidth = $dimension === 'width' ? $limit : $width * $limit / $height; $this->logTask(sprintf( $this->getApplication()->getLanguage()->_('PLG_TASK_CHECK_FILES_LOG_RESIZING_IMAGE'), $width, $height, $newWidth, $newHeight, $imageFilename )); $image = new Image($imageFilename); try { $image->resize($newWidth, $newHeight, false); } catch (\LogicException $e) { $this->logTask($this->getApplication()->getLanguage()->_('PLG_TASK_CHECK_FILES_LOG_RESIZE_FAIL'), 'error'); return TaskStatus::KNOCKOUT; } if (!$image->toFile($imageFilename, $properties->type)) { $this->logTask($this->getApplication()->getLanguage()->_('PLG_TASK_CHECK_FILES_LOG_IMAGE_SAVE_FAIL'), 'error'); return TaskStatus::KNOCKOUT; } --$numImages; // We do a limited number of resize per execution if ($numImages == 0) { break; } } return TaskStatus::OK; } } PK@A#]vEA(��5extension/namespacemap/src/Extension/NamespaceMap.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Extension.namespacemap * * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Extension\NamespaceMap\Extension; use Joomla\CMS\Installer\Installer; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Event\DispatcherInterface; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! namespace map creator / updater. * * @since 4.0.0 */ final class NamespaceMap extends CMSPlugin { /** * The namespace map file creator * * @var \JNamespacePsr4Map */ private $fileCreator = null; /** * Constructor * * @param DispatcherInterface $subject The object to observe * @param \JNamespacePsr4Map $map The namespace map creator * @param array $config An optional associative array of configuration settings. * Recognized key values include 'name', 'group', 'params', 'language' * (this list is not meant to be comprehensive). * * @since 4.0.0 */ public function __construct(DispatcherInterface $subject, \JNamespacePsr4Map $map, $config = []) { $this->fileCreator = $map; parent::__construct($subject, $config); } /** * Update / Create map on extension install * * @param Installer $installer Installer instance * @param integer $eid Extension id * * @return void * * @since 4.0.0 */ public function onExtensionAfterInstall($installer, $eid) { // Check that we have a valid extension if ($eid) { // Update / Create new map $this->fileCreator->create(); } } /** * Update / Create map on extension uninstall * * @param Installer $installer Installer instance * @param integer $eid Extension id * @param boolean $removed Installation result * * @return void * * @since 4.0.0 */ public function onExtensionAfterUninstall($installer, $eid, $removed) { // Check that we have a valid extension and that it has been removed if ($eid && $removed) { // Update / Create new map $this->fileCreator->create(); } } /** * Update map on extension update * * @param Installer $installer Installer instance * @param integer $eid Extension id * * @return void * * @since 4.0.0 */ public function onExtensionAfterUpdate($installer, $eid) { // Check that we have a valid extension if ($eid) { // Update / Create new map $this->fileCreator->create(); } } } PK@A#]PDl�,extension/namespacemap/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Extension.namespacemap * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Extension\NamespaceMap\Extension\NamespaceMap; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new NamespaceMap( $dispatcher, new JNamespacePsr4Map(), (array) PluginHelper::getPlugin('extension', 'namespacemap') ); return $plugin; } ); } }; PK@A#]�2hN��'extension/namespacemap/namespacemap.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="extension" method="upgrade"> <name>plg_extension_namespacemap</name> <author>Joomla! Project</author> <creationDate>2017-05</creationDate> <copyright>(C) 2017 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.0.0</version> <description>PLG_EXTENSION_NAMESPACEMAP_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Extension\NamespaceMap</namespace> <files> <folder plugin="namespacemap">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_extension_namespacemap.ini</language> <language tag="en-GB">language/en-GB/plg_extension_namespacemap.sys.ini</language> </languages> </extension> PK@A#]W��ffextension/joomla/joomla.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="extension" method="upgrade"> <name>plg_extension_joomla</name> <author>Joomla! Project</author> <creationDate>2010-05</creationDate> <copyright>(C) 2010 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_EXTENSION_JOOMLA_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Extension\Joomla</namespace> <files> <folder plugin="joomla">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_extension_joomla.ini</language> <language tag="en-GB">language/en-GB/plg_extension_joomla.sys.ini</language> </languages> </extension> PK@A#]�BwDD&extension/joomla/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Extension.joomla * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Extension\Joomla\Extension\Joomla; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Joomla( $dispatcher, (array) PluginHelper::getPlugin('extension', 'joomla') ); $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } }; PK@A#]��@�&�&)extension/joomla/src/Extension/Joomla.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Extension.joomla * * @copyright (C) 2010 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Extension\Joomla\Extension; use Joomla\CMS\Installer\Installer; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Database\DatabaseAwareTrait; use Joomla\Database\ParameterType; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! main extension plugin. * * @since 1.6 */ final class Joomla extends CMSPlugin { use DatabaseAwareTrait; /** * @var integer * * @since 1.6 */ private $eid = 0; /** * @var Installer * * @since 1.6 */ private $installer = null; /** * Load the language file on instantiation. * * @var boolean * * @since 3.1 */ protected $autoloadLanguage = true; /** * Adds an update site to the table if it doesn't exist. * * @param string $name The friendly name of the site * @param string $type The type of site (e.g. collection or extension) * @param string $location The URI for the site * @param boolean $enabled If this site is enabled * @param string $extraQuery Any additional request query to use when updating * * @return void * * @since 1.6 */ private function addUpdateSite($name, $type, $location, $enabled, $extraQuery = '') { // Look if the location is used already; doesn't matter what type you can't have two types at the same address, doesn't make sense $db = $this->getDatabase(); $query = $db->getQuery(true); $query->select($db->quoteName('update_site_id')) ->from($db->quoteName('#__update_sites')) ->where($db->quoteName('location') . ' = :location') ->bind(':location', $location); $db->setQuery($query); $update_site_id = (int) $db->loadResult(); // If it doesn't exist, add it! if (!$update_site_id) { $enabled = (int) $enabled; $query->clear() ->insert($db->quoteName('#__update_sites')) ->columns($db->quoteName(['name', 'type', 'location', 'enabled', 'extra_query'])) ->values(':name, :type, :location, :enabled, :extra_query') ->bind(':name', $name) ->bind(':type', $type) ->bind(':location', $location) ->bind(':enabled', $enabled, ParameterType::INTEGER) ->bind(':extra_query', $extraQuery); $db->setQuery($query); if ($db->execute()) { // Link up this extension to the update site $update_site_id = $db->insertid(); } } // Check if it has an update site id (creation might have failed) if ($update_site_id) { // Look for an update site entry that exists $query->clear() ->select($db->quoteName('update_site_id')) ->from($db->quoteName('#__update_sites_extensions')) ->where( [ $db->quoteName('update_site_id') . ' = :updatesiteid', $db->quoteName('extension_id') . ' = :extensionid', ] ) ->bind(':updatesiteid', $update_site_id, ParameterType::INTEGER) ->bind(':extensionid', $this->eid, ParameterType::INTEGER); $db->setQuery($query); $tmpid = (int) $db->loadResult(); if (!$tmpid) { // Link this extension to the relevant update site $query->clear() ->insert($db->quoteName('#__update_sites_extensions')) ->columns($db->quoteName(['update_site_id', 'extension_id'])) ->values(':updatesiteid, :eid') ->bind(':updatesiteid', $update_site_id, ParameterType::INTEGER) ->bind(':eid', $this->eid, ParameterType::INTEGER); $db->setQuery($query); $db->execute(); } } } /** * Handle post extension install update sites * * @param Installer $installer Installer object * @param integer $eid Extension Identifier * * @return void * * @since 1.6 */ public function onExtensionAfterInstall($installer, $eid) { if ($eid) { $this->installer = $installer; $this->eid = (int) $eid; // After an install we only need to do update sites $this->processUpdateSites(); } } /** * Handle extension uninstall * * @param Installer $installer Installer instance * @param integer $eid Extension id * @param boolean $removed Installation result * * @return void * * @since 1.6 */ public function onExtensionAfterUninstall($installer, $eid, $removed) { // If we have a valid extension ID and the extension was successfully uninstalled wipe out any // update sites for it if ($eid && $removed) { $db = $this->getDatabase(); $query = $db->getQuery(true); $eid = (int) $eid; $query->delete($db->quoteName('#__update_sites_extensions')) ->where($db->quoteName('extension_id') . ' = :eid') ->bind(':eid', $eid, ParameterType::INTEGER); $db->setQuery($query); $db->execute(); // Delete any unused update sites $query->clear() ->select($db->quoteName('update_site_id')) ->from($db->quoteName('#__update_sites_extensions')); $db->setQuery($query); $results = $db->loadColumn(); if (is_array($results)) { // So we need to delete the update sites and their associated updates $updatesite_delete = $db->getQuery(true); $updatesite_delete->delete($db->quoteName('#__update_sites')); $updatesite_query = $db->getQuery(true); $updatesite_query->select($db->quoteName('update_site_id')) ->from($db->quoteName('#__update_sites')); // If we get results back then we can exclude them if (count($results)) { $updatesite_query->whereNotIn($db->quoteName('update_site_id'), $results); $updatesite_delete->whereNotIn($db->quoteName('update_site_id'), $results); } // So let's find what update sites we're about to nuke and remove their associated extensions $db->setQuery($updatesite_query); $update_sites_pending_delete = $db->loadColumn(); if (is_array($update_sites_pending_delete) && count($update_sites_pending_delete)) { // Nuke any pending updates with this site before we delete it // @todo: investigate alternative of using a query after the delete below with a query and not in like above $query->clear() ->delete($db->quoteName('#__updates')) ->whereIn($db->quoteName('update_site_id'), $update_sites_pending_delete); $db->setQuery($query); $db->execute(); } // Note: this might wipe out the entire table if there are no extensions linked $db->setQuery($updatesite_delete); $db->execute(); } // Last but not least we wipe out any pending updates for the extension $query->clear() ->delete($db->quoteName('#__updates')) ->where($db->quoteName('extension_id') . ' = :eid') ->bind(':eid', $eid, ParameterType::INTEGER); $db->setQuery($query); $db->execute(); } } /** * After update of an extension * * @param Installer $installer Installer object * @param integer $eid Extension identifier * * @return void * * @since 1.6 */ public function onExtensionAfterUpdate($installer, $eid) { if ($eid) { $this->installer = $installer; $this->eid = (int) $eid; // Handle any update sites $this->processUpdateSites(); } } /** * Processes the list of update sites for an extension. * * @return void * * @since 1.6 */ private function processUpdateSites() { $manifest = $this->installer->getManifest(); $updateservers = $manifest->updateservers; if ($updateservers) { $children = $updateservers->children(); } else { $children = []; } if (count($children)) { foreach ($children as $child) { $attrs = $child->attributes(); $this->addUpdateSite((string) $attrs['name'], (string) $attrs['type'], trim($child), true, $this->installer->extraQuery); } } else { $data = trim((string) $updateservers); if ($data !== '') { // We have a single entry in the update server line, let us presume this is an extension line $this->addUpdateSite(Text::_('PLG_EXTENSION_JOOMLA_UNKNOWN_SITE'), 'extension', $data, true); } } } } PK@A#]�6ҡ)extension/finder/src/Extension/Finder.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Extension.Finder * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Extension\Finder\Extension; use Joomla\CMS\Installer\Installer; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Component\Finder\Administrator\Indexer\Helper; use Joomla\Database\DatabaseAwareTrait; use Joomla\Database\ParameterType; use Joomla\String\StringHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Finder extension plugin * * @since 4.0.0 */ final class Finder extends CMSPlugin { use DatabaseAwareTrait; /** * Add common words to finder after language got installed * * @param Installer $installer Installer object * @param integer $eid Extension Identifier * * @return void * * @since 4.0.0 */ public function onExtensionAfterInstall($installer, $eid) { if (!$eid) { return; } $db = $this->getDatabase(); $query = $db->getQuery(true) ->select($db->quoteName(['element', 'client_id'])) ->from($db->quoteName('#__extensions')) ->where( [ $db->quoteName('extension_id') . ' = :eid', $db->quoteName('type') . ' = ' . $db->quote('language'), ] ) ->bind(':eid', $eid, ParameterType::INTEGER); $extension = $db->setQuery($query)->loadObject(); if ($extension) { $this->addCommonWords($extension); } } /** * Add common words to finder after language got updated * * @param Installer $installer Installer object * @param integer $eid Extension identifier * * @return void * * @since 4.0.0 */ public function onExtensionAfterUpdate($installer, $eid) { $this->onExtensionAfterInstall($installer, $eid); } /** * Remove common words to finder after language got uninstalled * * @param Installer $installer Installer instance * @param integer $eid Extension id * @param boolean $removed Installation result * * @return void * * @since 4.0.0 */ public function onExtensionAfterUninstall($installer, $eid, $removed) { // Check that the language was successfully uninstalled. if ($eid && $removed && $installer->extension->type === 'language') { $this->removeCommonWords($installer->extension); } } /** * Add common words from a txt file to com_finder * * @param object $extension Extension object * * @return void * * @since 4.0.0 */ protected function addCommonWords($extension) { if ($extension->client_id == 0) { $path = JPATH_SITE . '/language/' . $extension->element . '/com_finder.commonwords.txt'; } else { $path = JPATH_ADMINISTRATOR . '/language/' . $extension->element . '/com_finder.commonwords.txt'; } if (!file_exists($path)) { return; } $this->removeCommonWords($extension); $file_content = file_get_contents($path); $words = explode("\n", $file_content); $words = array_map( function ($word) { // Remove comments if (StringHelper::strpos($word, ';') !== false) { $word = StringHelper::substr($word, 0, StringHelper::strpos($word, ';')); } return $word; }, $words ); $words = array_filter(array_map('trim', $words)); $words = array_unique($words); $db = $this->getDatabase(); $query = $db->getQuery(true); $lang = Helper::getPrimaryLanguage($extension->element); $query->insert($db->quoteName('#__finder_terms_common')) ->columns($db->quoteName(['term', 'language', 'custom'])); foreach ($words as $word) { $bindNames = $query->bindArray([$word, $lang], ParameterType::STRING); $query->values(implode(',', $bindNames) . ', 0'); } try { $db->setQuery($query); $db->execute(); } catch (\Exception $ex) { // It would be nice if the common word is stored to the DB, but it isn't super important } } /** * Remove common words of a language from com_finder * * @param object $extension Extension object * * @return void * * @since 4.0.0 */ protected function removeCommonWords($extension) { $db = $this->getDatabase(); $lang = Helper::getPrimaryLanguage($extension->element); $query = $db->getQuery(true); $query->delete($db->quoteName('#__finder_terms_common')) ->where( [ $db->quoteName('language') . ' = :lang', $db->quoteName('custom') . ' = 0', ] ) ->bind(':lang', $lang); $db->setQuery($query); $db->execute(); } } PK@A#]�G��ffextension/finder/finder.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="extension" method="upgrade"> <name>plg_extension_finder</name> <author>Joomla! Project</author> <creationDate>2018-06</creationDate> <copyright>(C) 2019 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.0.0</version> <description>PLG_EXTENSION_FINDER_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Extension\Finder</namespace> <files> <folder plugin="finder">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_extension_finder.ini</language> <language tag="en-GB">language/en-GB/plg_extension_finder.sys.ini</language> </languages> </extension> PK@A#]l +?DD&extension/finder/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Extension.finder * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Extension\Finder\Extension\Finder; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Finder( $dispatcher, (array) PluginHelper::getPlugin('extension', 'finder') ); $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } }; PK@A#]B�GM��extension/jce/jce.phpnu�[���<?php /** * @copyright Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved * @copyright Copyright (C) 2018 Ryan Demmer. All rights reserved * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; /** * JCE extension plugin. * * @since 2.6 */ class PlgExtensionJce extends JPlugin { /** * Check the installer is for a valid plugin group. * * @param JInstaller $installer Installer object * * @return bool * * @since 2.6 */ private function isValidPlugin($installer) { if (empty($installer->manifest)) { return false; } foreach (array('type', 'group') as $var) { $$var = (string) $installer->manifest->attributes()->{$var}; } return $type === 'plugin' && $group === 'jce'; } public function onExtensionBeforeInstall($method, $type, $manifest, $extension = 0) { if ((string) $type === "file") { // get a reference to the current installer $manifestPath = JInstaller::getInstance()->getPath('manifest'); if (empty($manifestPath)) { return true; } // get the filename of the manifest file, eg: pkg_jce_de-DE $element = basename($manifestPath, '.xml'); // if this matches the current install... if (strpos($element, 'pkg_jce_') !== false) { // find an existing legacy language install, eg: jce-de-DE $element = str_replace('pkg_jce_', 'jce-', $element); $table = JTable::getInstance('extension'); $id = $table->find(array('type' => 'file', 'element' => $element)); if ($id) { $installer = new JInstaller(); // try unisntall, if this fails, delete database entry if (!$installer->uninstall('file', $id)) { $table->delete($id); } } } } } /** * Handle post extension install update sites. * * @param JInstaller $installer Installer object * @param int $eid Extension Identifier * * @since 2.6 */ public function onExtensionAfterInstall($installer, $eid) { if ($eid) { if (!$this->isValidPlugin($installer)) { return false; } $basename = basename($installer->getPath('extension_root')); if (strpos($basename, '-') === false) { return false; } require_once JPATH_ADMINISTRATOR . '/components/com_jce/helpers/plugins.php'; // enable plugin $plugin = JTable::getInstance('extension'); $plugin->load($eid); $plugin->publish(); $parts = explode('-', $basename); $type = $parts[0]; $name = $parts[1]; $plugin = new StdClass(); $plugin->name = $name; if ($type === 'editor') { $plugin->icon = (string) $installer->manifest->icon; $plugin->row = (int) (string) $installer->manifest->attributes()->row; $plugin->type = 'plugin'; } else { $plugin->type = 'extension'; } $plugin->path = $installer->getPath('extension_root'); JcePluginsHelper::postInstall('install', $plugin, $installer); // clean up legacy extensions if ($plugin->type == 'extension') { jimport('joomla.filesystem.folder'); jimport('joomla.filesystem.file'); $path = JPATH_SITE . '/components/com_jce/editor/extensions/' . $type; // delete manifest if (is_file($path . '/' . $plugin->name . '.xml')) { JFile::delete($path . '/' . $plugin->name . '.xml'); } // delete file if (is_file($path . '/' . $plugin->name . '.php')) { JFile::delete($path . '/' . $plugin->name . '.php'); } // delete folder if (is_dir($path . '/' . $plugin->name)) { JFolder::delete($path . '/' . $plugin->name); } } } } /** * Handle extension uninstall. * * @param JInstaller $installer Installer instance * @param int $eid Extension id * @param int $result Installation result * * @since 1.6 */ public function onExtensionAfterUninstall($installer, $eid, $result) { if ($eid) { if (!$this->isValidPlugin($installer)) { return false; } $basename = basename($installer->getPath('extension_root')); if (strpos($basename, '-') === false) { return false; } require_once JPATH_ADMINISTRATOR . '/components/com_jce/helpers/plugins.php'; $parts = explode('-', $basename); $type = $parts[0]; $name = $parts[1]; $plugin = new StdClass(); $plugin->name = $name; if ($type === 'editor') { $plugin->icon = (string) $installer->manifest->icon; $plugin->row = (int) (string) $installer->manifest->attributes()->row; $plugin->type = 'plugin'; } $plugin->path = $installer->getPath('extension_root'); JcePluginsHelper::postInstall('uninstall', $plugin, $installer); } } public function onExtensionAfterSave($context, $table, $result) { if ($context !== 'com_config.component') { return; } if ($table->element !== 'com_jce') { return; } $params = json_decode($table->params, true); if ($params && !empty($params['updates_key'])) { $updatesite = JTable::getInstance('Updatesite'); // sanitize key $key = preg_replace("/[^a-zA-Z0-9]/", "", $params['updates_key']); $db = JFactory::getDBO(); $query = $db->getQuery(true); $query->select($db->qn('update_site_id'))->from('#__update_sites_extensions')->where($db->qn('extension_id') . '=' . (int) $table->package_id); $db->setQuery($query); $update_site_id = $db->loadResult(); if ($update_site_id) { if ($updatesite->load($update_site_id)) { $updatesite->bind(array('extra_query' => 'key=' . $key)); $updatesite->check(); $updatesite->store(); } } } } } PK@A#]7����extension/jce/jce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.8" type="plugin" group="extension" method="upgrade"> <name>plg_extension_jce</name> <version>2.9.20</version> <creationDate>10-02-2022</creationDate> <author>Ryan Demmer</author> <authorEmail>info@joomlacontenteditor.net</authorEmail> <authorUrl>http://www.joomlacontenteditor.net</authorUrl> <copyright>Copyright (C) 2006 - 2022 Ryan Demmer. All rights reserved</copyright> <license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license> <description>PLG_EXTENSION_JCE_XML_DESCRIPTION</description> <files folder="plugins/extension/jce"> <filename plugin="jce">jce.php</filename> </files> <languages folder="administrator/language/en-GB"> <language tag="en-GB">en-GB.plg_extension_jce.ini</language> <language tag="en-GB">en-GB.plg_extension_jce.sys.ini</language> </languages> </extension> PK@A#]7}�aEE3behaviour/versionable/src/Extension/Versionable.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Behaviour.versionable * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Behaviour\Versionable\Extension; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Event\Table\AfterStoreEvent; use Joomla\CMS\Event\Table\BeforeDeleteEvent; use Joomla\CMS\Helper\CMSHelper; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Versioning\VersionableTableInterface; use Joomla\CMS\Versioning\Versioning; use Joomla\Event\DispatcherInterface; use Joomla\Event\SubscriberInterface; use Joomla\Filter\InputFilter; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Implements the Versionable behaviour which allows extensions to automatically support content history for their content items. * * This plugin supersedes JTableObserverContenthistory. * * @since 4.0.0 */ final class Versionable extends CMSPlugin implements SubscriberInterface { /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.2.0 */ public static function getSubscribedEvents(): array { return [ 'onTableAfterStore' => 'onTableAfterStore', 'onTableBeforeDelete' => 'onTableBeforeDelete', ]; } /** * The input filter * * @var InputFilter * @since 4.2.0 */ private $filter; /** * The CMS helper * * @var CMSHelper * @since 4.2.0 */ private $helper; /** * Constructor. * * @param DispatcherInterface $dispatcher The dispatcher * @param array $config An optional associative array of configuration settings * @param InputFilter $filter The input filter * @param CMSHelper $helper The CMS helper * * @since 4.0.0 */ public function __construct(DispatcherInterface $dispatcher, array $config, InputFilter $filter, CMSHelper $helper) { parent::__construct($dispatcher, $config); $this->filter = $filter; $this->helper = $helper; } /** * Post-processor for $table->store($updateNulls) * * @param AfterStoreEvent $event The event to handle * * @return void * * @since 4.0.0 */ public function onTableAfterStore(AfterStoreEvent $event) { // Extract arguments /** @var VersionableTableInterface $table */ $table = $event['subject']; $result = $event['result']; if (!$result) { return; } if (!(is_object($table) && $table instanceof VersionableTableInterface)) { return; } // Get the Tags helper and assign the parsed alias $typeAlias = $table->getTypeAlias(); $aliasParts = explode('.', $typeAlias); if ($aliasParts[0] === '' || !ComponentHelper::getParams($aliasParts[0])->get('save_history', 0)) { return; } $id = $table->getId(); $data = $this->helper->getDataObject($table); $input = $this->getApplication()->getInput(); $jform = $input->get('jform', [], 'array'); $versionNote = ''; if (isset($jform['version_note'])) { $versionNote = $this->filter->clean($jform['version_note'], 'string'); } Versioning::store($typeAlias, $id, $data, $versionNote); } /** * Pre-processor for $table->delete($pk) * * @param BeforeDeleteEvent $event The event to handle * * @return void * * @since 4.0.0 */ public function onTableBeforeDelete(BeforeDeleteEvent $event) { // Extract arguments /** @var VersionableTableInterface $table */ $table = $event['subject']; if (!(is_object($table) && $table instanceof VersionableTableInterface)) { return; } $typeAlias = $table->getTypeAlias(); $aliasParts = explode('.', $typeAlias); if ($aliasParts[0] && ComponentHelper::getParams($aliasParts[0])->get('save_history', 0)) { Versioning::delete($typeAlias, $table->getId()); } } } PK@A#]�Z����+behaviour/versionable/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Behaviour.versionable * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Helper\CMSHelper; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Filter\InputFilter; use Joomla\Plugin\Behaviour\Versionable\Extension\Versionable; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.2.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Versionable( $dispatcher, (array) PluginHelper::getPlugin('behaviour', 'versionable'), new InputFilter(), new CMSHelper() ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]��ѐ�%behaviour/versionable/versionable.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="behaviour" method="upgrade"> <name>plg_behaviour_versionable</name> <version>4.0.0</version> <creationDate>2015-08</creationDate> <author>Joomla! Project</author> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <copyright>(C) 2016 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <description>PLG_BEHAVIOUR_VERSIONABLE_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Behaviour\Versionable</namespace> <files> <folder plugin="versionable">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_behaviour_versionable.ini</language> <language tag="en-GB">language/en-GB/plg_behaviour_versionable.sys.ini</language> </languages> <config /> </extension> PK@A#]���&\\behaviour/compat/compat.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="behaviour" method="upgrade"> <name>plg_behaviour_compat</name> <author>Joomla! Project</author> <creationDate>2023-09</creationDate> <copyright>(C) 2023 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.4.0</version> <description>PLG_COMPAT_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Behaviour\Compat</namespace> <files> <folder plugin="compat">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_behaviour_compat.ini</language> <language tag="en-GB">language/en-GB/plg_behaviour_compat.sys.ini</language> </languages> </extension> PK@A#]�؝��)behaviour/compat/src/Extension/Compat.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Behaviour.compat * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Behaviour\Compat\Extension; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Event\SubscriberInterface; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! Compat Plugin. * * @since 4.4.0 */ final class Compat extends CMSPlugin implements SubscriberInterface { /** * Returns an array of CMS events this plugin will listen to and the respective handlers. * * @return array * * @since 4.4.0 */ public static function getSubscribedEvents(): array { /** * This plugin does not listen to any events. */ return []; } } PK@A#]�6VM&behaviour/compat/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Behaviour.compat * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Behaviour\Compat\Extension\Compat; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * @since 4.4.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $plugin = PluginHelper::getPlugin('behaviour', 'compat'); $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Compat($dispatcher, (array) $plugin); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK@A#]��\��(behaviour/taggable/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Behaviour.taggable * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Behaviour\Taggable\Extension\Taggable; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.2.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Taggable( $dispatcher, (array) PluginHelper::getPlugin('behaviour', 'taggable') ); return $plugin; } ); } }; PK@A#]��~~behaviour/taggable/taggable.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="behaviour" method="upgrade"> <name>plg_behaviour_taggable</name> <version>4.0.0</version> <creationDate>2015-08</creationDate> <author>Joomla! Project</author> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <copyright>(C) 2016 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <description>PLG_BEHAVIOUR_TAGGABLE_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\Behaviour\Taggable</namespace> <files> <folder plugin="taggable">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_behaviour_taggable.ini</language> <language tag="en-GB">language/en-GB/plg_behaviour_taggable.sys.ini</language> </languages> <config /> </extension> PK@A#]��u�'�'-behaviour/taggable/src/Extension/Taggable.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Behaviour.taggable * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\Behaviour\Taggable\Extension; use Joomla\CMS\Event\Model\BeforeBatchEvent; use Joomla\CMS\Event\Table\AfterLoadEvent; use Joomla\CMS\Event\Table\AfterResetEvent; use Joomla\CMS\Event\Table\AfterStoreEvent; use Joomla\CMS\Event\Table\BeforeDeleteEvent; use Joomla\CMS\Event\Table\BeforeStoreEvent; use Joomla\CMS\Event\Table\ObjectCreateEvent; use Joomla\CMS\Event\Table\SetNewTagsEvent; use Joomla\CMS\Helper\TagsHelper; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Table\TableInterface; use Joomla\CMS\Tag\TaggableTableInterface; use Joomla\Event\SubscriberInterface; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Implements the Taggable behaviour which allows extensions to automatically support tags for their content items. * * This plugin supersedes JHelperObserverTags. * * @since 4.0.0 */ final class Taggable extends CMSPlugin implements SubscriberInterface { /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.2.0 */ public static function getSubscribedEvents(): array { return [ 'onTableObjectCreate' => 'onTableObjectCreate', 'onTableBeforeStore' => 'onTableBeforeStore', 'onTableAfterStore' => 'onTableAfterStore', 'onTableBeforeDelete' => 'onTableBeforeDelete', 'onTableSetNewTags' => 'onTableSetNewTags', 'onTableAfterReset' => 'onTableAfterReset', 'onTableAfterLoad' => 'onTableAfterLoad', 'onBeforeBatch' => 'onBeforeBatch', ]; } /** * Runs when a new table object is being created * * @param ObjectCreateEvent $event The event to handle * * @return void * * @since 4.0.0 */ public function onTableObjectCreate(ObjectCreateEvent $event) { // Extract arguments /** @var TableInterface $table */ $table = $event['subject']; // If the tags table doesn't implement the interface bail if (!($table instanceof TaggableTableInterface)) { return; } // If the table already has a tags helper we have nothing to do if (!is_null($table->getTagsHelper())) { return; } $tagsHelper = new TagsHelper(); $tagsHelper->typeAlias = $table->typeAlias; $table->setTagsHelper($tagsHelper); // This is required because getTagIds overrides the tags property of the Tags Helper. $cloneHelper = clone $table->getTagsHelper(); $tagIds = $cloneHelper->getTagIds($table->getId(), $table->getTypeAlias()); if (!empty($tagIds)) { $table->getTagsHelper()->tags = explode(',', $tagIds); } } /** * Pre-processor for $table->store($updateNulls) * * @param BeforeStoreEvent $event The event to handle * * @return void * * @since 4.0.0 */ public function onTableBeforeStore(BeforeStoreEvent $event) { // Extract arguments /** @var TableInterface $table */ $table = $event['subject']; // If the tags table doesn't implement the interface bail if (!($table instanceof TaggableTableInterface)) { return; } // If the table doesn't have a tags helper we can't proceed if (is_null($table->getTagsHelper())) { return; } /** @var TagsHelper $tagsHelper */ $tagsHelper = $table->getTagsHelper(); $tagsHelper->typeAlias = $table->getTypeAlias(); $newTags = $table->newTags ?? []; if (empty($newTags)) { $tagsHelper->preStoreProcess($table); } else { $tagsHelper->preStoreProcess($table, (array) $newTags); } } /** * Post-processor for $table->store($updateNulls) * * @param AfterStoreEvent $event The event to handle * * @return void * * @since 4.0.0 */ public function onTableAfterStore(AfterStoreEvent $event) { // Extract arguments /** @var TableInterface $table */ $table = $event['subject']; $result = $event['result']; if (!$result) { return; } if (!is_object($table) || !($table instanceof TaggableTableInterface)) { return; } // If the table doesn't have a tags helper we can't proceed if (is_null($table->getTagsHelper())) { return; } // Get the Tags helper and assign the parsed alias /** @var TagsHelper $tagsHelper */ $tagsHelper = $table->getTagsHelper(); $tagsHelper->typeAlias = $table->getTypeAlias(); $newTags = $table->newTags ?? []; if (empty($newTags)) { $result = $tagsHelper->postStoreProcess($table); } else { if (is_string($newTags) && (strpos($newTags, ',') !== false)) { $newTags = explode(',', $newTags); } elseif (!is_array($newTags)) { $newTags = (array) $newTags; } $result = $tagsHelper->postStoreProcess($table, $newTags); } } /** * Pre-processor for $table->delete($pk) * * @param BeforeDeleteEvent $event The event to handle * * @return void * * @since 4.0.0 */ public function onTableBeforeDelete(BeforeDeleteEvent $event) { // Extract arguments /** @var TableInterface $table */ $table = $event['subject']; $pk = $event['pk']; // If the tags table doesn't implement the interface bail if (!($table instanceof TaggableTableInterface)) { return; } // If the table doesn't have a tags helper we can't proceed if (is_null($table->getTagsHelper())) { return; } // Get the Tags helper and assign the parsed alias $table->getTagsHelper()->typeAlias = $table->getTypeAlias(); $table->getTagsHelper()->deleteTagData($table, $pk); } /** * Handles the tag setting in $table->batchTag($value, $pks, $contexts) * * @param SetNewTagsEvent $event The event to handle * * @return void * * @since 4.0.0 */ public function onTableSetNewTags(SetNewTagsEvent $event) { // Extract arguments /** @var TableInterface $table */ $table = $event['subject']; $newTags = $event['newTags']; $replaceTags = $event['replaceTags']; // If the tags table doesn't implement the interface bail if (!($table instanceof TaggableTableInterface)) { return; } // If the table doesn't have a tags helper we can't proceed if (is_null($table->getTagsHelper())) { return; } // Get the Tags helper and assign the parsed alias /** @var TagsHelper $tagsHelper */ $tagsHelper = $table->getTagsHelper(); $tagsHelper->typeAlias = $table->getTypeAlias(); if (!$tagsHelper->postStoreProcess($table, $newTags, $replaceTags)) { throw new \RuntimeException($table->getError()); } } /** * Runs when an existing table object is reset * * @param AfterResetEvent $event The event to handle * * @return void * * @since 4.0.0 */ public function onTableAfterReset(AfterResetEvent $event) { // Extract arguments /** @var TableInterface $table */ $table = $event['subject']; // If the tags table doesn't implement the interface bail if (!($table instanceof TaggableTableInterface)) { return; } // Parse the type alias $tagsHelper = new TagsHelper(); $tagsHelper->typeAlias = $table->getTypeAlias(); $table->setTagsHelper($tagsHelper); } /** * Runs when an existing table object has been loaded * * @param AfterLoadEvent $event The event to handle * * @return void * * @since 4.0.0 */ public function onTableAfterLoad(AfterLoadEvent $event) { // Extract arguments /** @var TableInterface $table */ $table = $event['subject']; // If the tags table doesn't implement the interface bail if (!($table instanceof TaggableTableInterface)) { return; } // If the table doesn't have a tags helper we can't proceed if (is_null($table->getTagsHelper())) { return; } // This is required because getTagIds overrides the tags property of the Tags Helper. $cloneHelper = clone $table->getTagsHelper(); $tagIds = $cloneHelper->getTagIds($table->getId(), $table->getTypeAlias()); if (!empty($tagIds)) { $table->getTagsHelper()->tags = explode(',', $tagIds); } } /** * Runs when an existing table object has been loaded * * @param BeforeBatchEvent $event The event to handle * * @return void * * @since 4.0.0 */ public function onBeforeBatch(BeforeBatchEvent $event) { /** @var TableInterface $sourceTable */ $sourceTable = $event['src']; if (!($sourceTable instanceof TaggableTableInterface)) { return; } if ($event['type'] === 'copy') { $sourceTable->newTags = $sourceTable->getTagsHelper()->tags; } else { /** * All other batch actions we don't want the tags to be modified so clear the helper - that way no actions * will be performed on store */ $sourceTable->clearTagsHelper(); } } } PKAA#]"bB�jjengagebox/image/form/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="image"> <fields name="image"> <field name="blockStart" type="nr_well" label="PLG_ENGAGEBOX_IMAGE_ALIAS" description="PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC" /> <field name="type" type="list" label="PLG_ENGAGEBOX_IMAGE_SOURCE" description="PLG_ENGAGEBOX_IMAGE_SOURCE_DESC" filter="intval" size="1" default="1"> <option value="1">NR_UPLOAD</option> <option value="2">PLG_ENGAGEBOX_IMAGE_CUSTOM_URL</option> </field> <field name="imageurl" type="text" hint="http://" label="NR_URL" description="PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC" showon="type:2" /> <field name="imagefile" type="media" label="NR_IMAGE_SELECT" description="COM_CONVERTFORMS_IMAGE_SOURCE" showon="type:1" /> <field name="width" type="text" default="100%" class="input-small" label="NR_WIDTH" description="NR_WIDTH_DESC" hint="100%" /> <field name="height" type="text" default="auto" class="input-small" label="NR_HEIGHT" description="NR_HEIGHT_DESC" hint="auto" /> <field name="alt" type="text" label="PLG_ENGAGEBOX_IMAGE_ALT" description="PLG_ENGAGEBOX_IMAGE_ALT_DESC" hint="PLG_ENGAGEBOX_IMAGE_ALT" /> <field name="class" type="text" label="COM_RSTBOX_ITEM_CLASSSUFFIX" description="COM_RSTBOX_ITEM_CLASSSUFFIX_DESC" hint="COM_RSTBOX_ITEM_CLASSSUFFIX" /> <field name="blockEnd" type="nr_well" end="1" /> <field name="onClickBlockStart" type="nr_well" label="PLG_ENGAGEBOX_IMAGE_ONCLICK" description="PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC" /> <field name="onclick" type="list" label="PLG_ENGAGEBOX_IMAGE_ONCLICK" description="PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC" default="url"> <option value="url">PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL</option> <option value="close">PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE</option> </field> <field name="url" type="url" label="NR_URL" description="PLG_ENGAGEBOX_IMAGE_URL_DESC" showon="onclick:url" hint="http://" class="input-xxlarge" /> <field name="newtab" type="nrtoggle" label="PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB" description="PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC" showon="onclick:url" /> <field name="cookie" type="nrtoggle" label="PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE" description="PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC" /> <field name="onClickBlockEnd" type="nr_well" end="1" /> </fields> </fieldset> </form>PKAA#]���700 engagebox/image/tmpl/default.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); $image = new Joomla\Registry\Registry($box->params->get("image")); $source = $image->get("type", "1") == "1" ? JURI::root() . $image->get("imagefile") : $image->get("imageurl"); $onclick = $image->get("onclick", "url"); $target = $image->get("newtab") ? "_blank" : "_self"; $url = $onclick == "url" ? $image->get("url", "#") : "#"; $cmd = $image->get("cookie") ? "closeKeep" : "close"; $alt = $image->get("alt"); $width = $image->get("width", "auto"); $height = $image->get("height", "auto"); $class = $image->get("class"); ?> <a data-ebox-cmd="<?php echo $cmd ?>" <?php if ($onclick == "url") { ?> data-ebox-prevent="0" target="<?php echo $target ?>" rel="noopener" <?php } ?> href="<?php echo $url; ?>"> <img src="<?php echo $source ?>" width="<?php echo $width ?>" height="<?php echo $height ?>" alt="<?php echo $alt ?>" class="<?php echo $class?>" /> </a>PKAA#]#����<engagebox/image/language/cs-CZ/cs-CZ.plg_engagebox_image.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE_ALIAS="Obrázek" PLG_ENGAGEBOX_IMAGE="Engage Box - Obrázek" PLG_ENGAGEBOX_IMAGE_DESC="Typ vyskakovacího Engage Boxu s obrázkem." PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC="Vyberte obrázek k zobrazení uvnitř okna" PLG_ENGAGEBOX_IMAGE_SOURCE="Zdroj obrázku" PLG_ENGAGEBOX_IMAGE_SOURCE_DESC="Vyberte zdroj obrázku. Můžete nahrát nový nebo použít existující, případně vzdálený přes URL." PLG_ENGAGEBOX_IMAGE_CUSTOM_URL="Vlastní URL" PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC="Zdejte URL k vlastnímu obrázku" COM_CONVERTFORMS_IMAGE_SOURCE="Vyberte existující nebo nahrajte nový obrázek." PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC="Zvolte co se stane, pokud uživatel klikne na obrázek." PLG_ENGAGEBOX_IMAGE_ALT="Alt Text" PLG_ENGAGEBOX_IMAGE_ALT_DESC="Zvolte alternativní text obrázku pro případ, že se obrázek nezobrazí." PLG_ENGAGEBOX_IMAGE_ONCLICK="Po kliknutí" PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE="Zavřít okno" PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL="Jít na URL" PLG_ENGAGEBOX_IMAGE_URL_DESC="URL k přeměrování uživatele" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB="Otevřít nový panel" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC="Otevřít URL v novém panelu" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE="Vložit cookie" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC="Pokud bude dojde k zavření boxu, uloží je do počítače uživetel cookie soubor, který zamezí opětovnému otevření. Cookie je platná po dobu, kterou jste nastavili ve volbě 'Po zavření skrýt'" PKAA#]P)o� � <engagebox/image/language/ru-RU/ru-RU.plg_engagebox_image.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE_ALIAS="Изображение" PLG_ENGAGEBOX_IMAGE="Engage Box - Изображение" PLG_ENGAGEBOX_IMAGE_DESC="Блок по типу выскакивающего окошка с изображением." PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC="Выберите какое изображение будет показано в окошке" PLG_ENGAGEBOX_IMAGE_SOURCE="Источник изображения" PLG_ENGAGEBOX_IMAGE_SOURCE_DESC="Выберите источник изображения. Вы можете либо загрузить какое-либо новое изображение, либо выбрать уже существующее, либо ввести произвольную ссылку URL." PLG_ENGAGEBOX_IMAGE_CUSTOM_URL="Произвольная ссылка URL" PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC="Введите произвольную ссылку URL на изображение" COM_CONVERTFORMS_IMAGE_SOURCE="Выберите существующее изображение или загрузите новое." PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC="Выберите поведение по щелчку пользователя на изображение." PLG_ENGAGEBOX_IMAGE_ALT="Текст тега 'Alt'" PLG_ENGAGEBOX_IMAGE_ALT_DESC="Свойство 'alt' задает текст, который будет показан в случае, когда по какой-либо причине изображение не может быть показано пользователю. " PLG_ENGAGEBOX_IMAGE_ONCLICK="По щелчку" PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE="Закрыть блок" PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL="Пройти по ссылке" PLG_ENGAGEBOX_IMAGE_URL_DESC="Ссылка URL на которую будет перенаправлен пользователь" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB="Открыть новую вкладку" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC="Открыть URL ссылку в новом окне" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE="Разместить cookie" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC="Как только это окошко будет закрыто, для того чтобы предотвратить его повторное выскакивание, в браузере посетителя будет размещен cookie. Cookie будет действовать пока включена опция 'Скрывать после закрытия'" PKAA#]+"�t<engagebox/image/language/ca-ES/ca-ES.plg_engagebox_image.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE_ALIAS="Imatge" PLG_ENGAGEBOX_IMAGE="Engage Box - Imatge" PLG_ENGAGEBOX_IMAGE_DESC="Tipus de caixa emergent d'imatge Engage Box." PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC="Escull una imatge a mostrar dins la caixa" PLG_ENGAGEBOX_IMAGE_SOURCE="Font de la imatge" PLG_ENGAGEBOX_IMAGE_SOURCE_DESC="Escull la font de la imatge. Pots pujar una nova imatge, escollir-ne una d'existent o escriure un URL personalitzat." PLG_ENGAGEBOX_IMAGE_CUSTOM_URL="URL personalitzat" PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC="Escriu un URL d'imatge personalitzada" COM_CONVERTFORMS_IMAGE_SOURCE="Escull una imatge existent o puja'n una nova de nova." PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC="Escull quin serà el comportament quan l'usuari cliqui a la imatge." PLG_ENGAGEBOX_IMAGE_ALT="Text alternatiu" PLG_ENGAGEBOX_IMAGE_ALT_DESC="L'atribut alt especifica un text alternatiu per una imatge, si no es pot mostrar la imatge" PLG_ENGAGEBOX_IMAGE_ONCLICK="En clicar" PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE="Tancar caixa" PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL="Anar a l'URL" PLG_ENGAGEBOX_IMAGE_URL_DESC="L'URL redirigeix l'usuari a" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB="Obrir nova pestanya" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC="Obrir URL a una nova pestanya" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE="Col·locar galeta" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC="Un cop s'ha tancat la caixa, es col·loca una galeta al navegador del visitant per evitar que es torni a obrir la caixa. La galeta serà vàlida durant el temps que hagis configurat a la opció 'Mantenir-se oculta després de tancar'." PKAA#]lq�H��<engagebox/image/language/tr-TR/tr-TR.plg_engagebox_image.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE_ALIAS="Resim" PLG_ENGAGEBOX_IMAGE="Engage Box - Resim" PLG_ENGAGEBOX_IMAGE_DESC="Engage Box Resim açılır kutu tipi." PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC="Kutunun içinde görüntülenecek bir resim seçin" PLG_ENGAGEBOX_IMAGE_SOURCE="Görüntü Kaynağı" PLG_ENGAGEBOX_IMAGE_SOURCE_DESC="Resim kaynağı seçin. Yeni bir resim yükleyebilir, mevcut resmi seçebilir veya özel bir URL girebilirsiniz." PLG_ENGAGEBOX_IMAGE_CUSTOM_URL="Özel URL" PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC="Özel bir resim URL'si girin" COM_CONVERTFORMS_IMAGE_SOURCE="Mevcut bir resmi seçin veya yeni bir resim yükleyin." PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC="Kullanıcı resim tıkladığında davranışın ne olacağını seçin." PLG_ENGAGEBOX_IMAGE_ALT="Alt Metin" PLG_ENGAGEBOX_IMAGE_ALT_DESC="Alt öz niteliği, resim görüntülenemiyor sa bir resim için alternatif bir metin belirtir." PLG_ENGAGEBOX_IMAGE_ONCLICK="Tıklandığında" PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE="Kutuyu Kapat" PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL="URL'ye git" PLG_ENGAGEBOX_IMAGE_URL_DESC="Kullanıcının yönlendirileceği URL" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB="Yeni Sekme Aç" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC="URL'yi yeni bir sekmede aç" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE="Çerez Yerleştir" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC="Kutu kapandıktan sonra, kutunun yeniden açılmasını önlemek için ziyaretçinin tarayıcısına bir çerez yerleştirilir. Çerez, 'Kapandıktan Sonra Gizli Kal' seçeneğini belirlediğiniz sürece geçerli olacaktır." PKAA#].P_�++<engagebox/image/language/nl-NL/nl-NL.plg_engagebox_image.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE_ALIAS="Afbeelding" PLG_ENGAGEBOX_IMAGE="Engage Box - Afbeelding" PLG_ENGAGEBOX_IMAGE_DESC="Engage Box Afbeelding popup box type" PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC="Selecteer een afbeelding om weer te geven in de box" PLG_ENGAGEBOX_IMAGE_SOURCE="Afbeeldingsbestand" PLG_ENGAGEBOX_IMAGE_SOURCE_DESC="Selecteer een afbeelding. Je kan een afbeelding uploaden, een bestaande afbeelding kiezen of een link naar een afbeelding invullen." PLG_ENGAGEBOX_IMAGE_CUSTOM_URL="Link" PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC="Vul een link naar een afbeelding in" COM_CONVERTFORMS_IMAGE_SOURCE="Selecteer een bestaande of upload een nieuwe afbeelding." PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC="Kies de gewenste respons wanneer de gebruiker op de afbeelding klikt." PLG_ENGAGEBOX_IMAGE_ALT="Alt tekst" PLG_ENGAGEBOX_IMAGE_ALT_DESC="Het Alt attribuut bevat een alternatieve tekst voor de afbeelding, indien de afbeelding niet getoond kan worden. " PLG_ENGAGEBOX_IMAGE_ONCLICK="Bij Muisklik" PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE="Sluit Box" PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL="Ga naar URL" PLG_ENGAGEBOX_IMAGE_URL_DESC="De URL waar de gebruiker naartoe wordt gestuurd" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB="Open Nieuw Tabblad" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC="Open URL in een nieuw tabblad" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE="Plaats Cookie" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC="Zodra de box gesloten is, wordt een cookie in de browser van de bezoeker geplaatst om te verhinderen dat de box opnieuw wordt getoond. De cookie zal zolang geldig zijn als is ingesteld in de optie 'Na Sluiten Niet Meer Tonen'." PKAA#]����HH<engagebox/image/language/es-ES/es-ES.plg_engagebox_image.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE_ALIAS="Imagen" PLG_ENGAGEBOX_IMAGE="Engage Box - Imagen" PLG_ENGAGEBOX_IMAGE_DESC="Engage Box Imagen emergente según tipo de caja." PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC="Seleccione una imagen para mostrarla dentro de la caja" PLG_ENGAGEBOX_IMAGE_SOURCE="Origen de la imagen" PLG_ENGAGEBOX_IMAGE_SOURCE_DESC="Seleccione el origen de la imagen. Puede cargar una nueva imagen, seleccionar una ya existente o ingresar una URL personalizada." PLG_ENGAGEBOX_IMAGE_CUSTOM_URL="URL Personalizada" PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC="Introduzca una imagen personalizada desde URL" COM_CONVERTFORMS_IMAGE_SOURCE="Seleccione una imagen existente o cargue una nueva." PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC="Elija cuál será el comportamiento una vez que el usuario haga clic en la imagen." PLG_ENGAGEBOX_IMAGE_ALT="Texto Alt" PLG_ENGAGEBOX_IMAGE_ALT_DESC="El atributo alt especifica un texto alternativo para una imagen, si no se puede mostrar la imagen." PLG_ENGAGEBOX_IMAGE_ONCLICK="Al hacer click" PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE="Cerrar Caja" PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL="Ir a la URL" PLG_ENGAGEBOX_IMAGE_URL_DESC="La URL para redirigir al usuario a" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB="Abrir Nueva Pestaña" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC="Abrir URL en una nueva pestaña" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE="Colocar Cookie" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC="Una vez cerrada la caja, se colocará una cookie en el navegador del visitante para evitar que la caja vuelva a aparecer. La cookie será válida durante el tiempo que haya establecido en la opción \"Mantener oculto después de cerrar\"." PKAA#]Z��hHH<engagebox/image/language/it-IT/it-IT.plg_engagebox_image.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE_ALIAS="Immagine" PLG_ENGAGEBOX_IMAGE="Engage Box - Immagine" PLG_ENGAGEBOX_IMAGE_DESC="Tipo di riquadro popup immagine di Engage Box " PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC="Seleziona un immagine da visualizzare nel riquadro" PLG_ENGAGEBOX_IMAGE_SOURCE="Origine dell'immagine" PLG_ENGAGEBOX_IMAGE_SOURCE_DESC="Seleziona l'origine dell'immagine. Puoi caricare una nuova immagine, selezionarne una esistente o scegliere un URL personalizzato." PLG_ENGAGEBOX_IMAGE_CUSTOM_URL="URL personalizzato" PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC="Scegli un URL personalizzato per l'immagine" COM_CONVERTFORMS_IMAGE_SOURCE="Seleziona un'immagine esistente o caricane una nuova" PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC="Scegli quale sarà il comportamento quando l'utente farà clic sull'immagine." PLG_ENGAGEBOX_IMAGE_ALT="Testo alternativo" PLG_ENGAGEBOX_IMAGE_ALT_DESC="L'attributo alt specifico un testo alternativo per un immagine, se l'immagine non può essere visualizzata." PLG_ENGAGEBOX_IMAGE_ONCLICK="Al Clic" PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE="Chiudi Riquadro" PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL="Vai all'URL" PLG_ENGAGEBOX_IMAGE_URL_DESC="L'URL per reindirizzare l'utente a" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB="Apri nuova scheda" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC="Apri URL in una nuova scheda" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE="Posiziona Cookie" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC="Quando il riquadro è stato chiuso, nel browser del visitatore verrà posizionato un cookie per evitare che il riquadro appaia di nuovo. Il cookie sarà valido per il periodo indicaro nell'opzione 'Dopo la chiusura rimane nascosto'" PKAA#]l�*�II<engagebox/image/language/de-DE/de-DE.plg_engagebox_image.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE_ALIAS="Bild" PLG_ENGAGEBOX_IMAGE="Engage Box - Bild" PLG_ENGAGEBOX_IMAGE_DESC="Engage Box Bild für Popup Boxentyp." PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC="Wähle ein Bild zur Anzeige in der Box" PLG_ENGAGEBOX_IMAGE_SOURCE="Bildquelle" PLG_ENGAGEBOX_IMAGE_SOURCE_DESC="Wählen Sie die Bildquelle. Sie können entweder ein neues Bild hochladen, ein vorhandenes auswählen oder eine benutzerdefinierte URL zum Bild eingeben." PLG_ENGAGEBOX_IMAGE_CUSTOM_URL="Eigene URL" PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC="Geben Sie eine URL zum eigenen Bild ein" COM_CONVERTFORMS_IMAGE_SOURCE="Wählen Sie ein bestehendes Bild aus oder laden Sie ein neues Bild hoch." PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC="Wählen Sie das Verhalten, sobald der Benutzer auf das Bild klickt." PLG_ENGAGEBOX_IMAGE_ALT="Alternativer Text" PLG_ENGAGEBOX_IMAGE_ALT_DESC="Das alt-Attribut gibt einen alternativen Text für ein Bild an, wenn das Bild nicht angezeigt werden kann." PLG_ENGAGEBOX_IMAGE_ONCLICK="beim Klicken" PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE="Box schliessen" PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL="gehe zur URL" PLG_ENGAGEBOX_IMAGE_URL_DESC="Die URL zur Weiterleitung des Nutzers zu" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB="Öffnet einen neuen Tab/Reiter" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC="öffnet die URL im neuen Tab/Reiter" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE="setze ein Cookie" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC="Sobald die Box geschlossen ist, wird ein Cookie im Browser des Besuchers gesetzt, um zu verhindern, dass die Box wieder auftaucht. Der Cookie ist gültig, solange du die Option 'nach Scließen Verstecken' eingestellt hast." PKAA#]�i=G<engagebox/image/language/pl-PL/pl-PL.plg_engagebox_image.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE_ALIAS="Obrazek" PLG_ENGAGEBOX_IMAGE="Engage Box - obrazek" PLG_ENGAGEBOX_IMAGE_DESC="Włącz popup typu Box Image" PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC="Wybierz obraz do wyświetlenia w module" PLG_ENGAGEBOX_IMAGE_SOURCE="Image Source" PLG_ENGAGEBOX_IMAGE_SOURCE_DESC="Wybierz źródło obrazu. Możesz przesłać nowy obrazek, wybrać istniejący lub wprowadzić własny adres URL." PLG_ENGAGEBOX_IMAGE_CUSTOM_URL="Niestandardowy adres URL" PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC="Wprowadź niestandardowy URL obrazu" COM_CONVERTFORMS_IMAGE_SOURCE="Wybierz istniejący obraz lub załaduj nowy." PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC="Wybierz zachowanie, które nastąpi po kliknięciu obrazu przez użytkownika." PLG_ENGAGEBOX_IMAGE_ALT="Tekst Alt" PLG_ENGAGEBOX_IMAGE_ALT_DESC="Atrybut alt określa tekst dla obrazu, jeśli obraz nie może zostać wyświetlony." PLG_ENGAGEBOX_IMAGE_ONCLICK="On Click" PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE="Zamknij moduł" PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL="Idź do URL" PLG_ENGAGEBOX_IMAGE_URL_DESC="Adres URL do przekierowania użytkownika" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB="Otwórz nową kartę" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC="Otwórz adres URL w nowej karcie" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE="Położenie ciasteczka" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC="Po zamknięciu modułu plik ciasteczka zostanie umieszczony w przeglądarce użytkownika, aby zapobiec ponownym pojawieniu się pola. Plik ciasteczka będzie ważny tak długo, jak długo zostanie ustawiony w opcji \"Po zamknięciu pozostań ukryty\"." PKAA#]e��<engagebox/image/language/pt-BR/pt-BR.plg_engagebox_image.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE_ALIAS="Imagem" PLG_ENGAGEBOX_IMAGE="Caixa POP UP - Imagem" PLG_ENGAGEBOX_IMAGE_DESC=" Tipo de imagem popup para Caixa POP UP " PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC=" Selecione uma imagem para mostrar na caixa " PLG_ENGAGEBOX_IMAGE_SOURCE="Fonte da imagem" PLG_ENGAGEBOX_IMAGE_SOURCE_DESC="Selecione a fonte da Imagem. Poderá também fazer o upload de uma nova imagem, selecionar uma existente ou colocar uma URL personalizada." PLG_ENGAGEBOX_IMAGE_CUSTOM_URL="URL personalizado" PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC="Colocar o URL de uma imagem personalizada" COM_CONVERTFORMS_IMAGE_SOURCE="Selecione uma imagem existente ou adicione uma nova" PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC="Escolha qual será o comportamento quando o utilizador clicar na imagem." PLG_ENGAGEBOX_IMAGE_ALT="Todo o Texto" PLG_ENGAGEBOX_IMAGE_ALT_DESC="O atributo alt especifica um texto alternativo para uma imagem, se a imagem não poder ser mostrada." PLG_ENGAGEBOX_IMAGE_ONCLICK="Ao Clicar" PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE="Fechar Caixa" PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL="Ir para o URL" PLG_ENGAGEBOX_IMAGE_URL_DESC="O URL para rederecionar o usuário para" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB="Abrir uma nova Tab" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC="Abrir URL numa nova Tab" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE="Colocar um Cookie" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC="Uma vez a caixa fechada, um cookie será colocado no browser do usuário para prevenir que a caixa faça popup novamente. O cookie será válido pelo tempo que colocou na opção \"Depois de Fechar Permaneça Oculto\"" PKAA#]t��,<engagebox/image/language/pt-PT/pt-PT.plg_engagebox_image.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE_ALIAS="Imagem" PLG_ENGAGEBOX_IMAGE="Caixa-PopUp" PLG_ENGAGEBOX_IMAGE_DESC="Caixa-PopUp Imagem popup Tipo" PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC="Selecione uma imagem para exibir na caixa" PLG_ENGAGEBOX_IMAGE_SOURCE="Fonte da imagem" PLG_ENGAGEBOX_IMAGE_SOURCE_DESC="Selecione a fonte da imagem. Pode fazer upload de uma nova imagem, selecionar uma existente ou inserir um URL personalizado." PLG_ENGAGEBOX_IMAGE_CUSTOM_URL="URL Personalizdo" PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC="Colocar o URL de uma imagem personalizada " COM_CONVERTFORMS_IMAGE_SOURCE="Selecione uma imagem existente ou faça o upload de uma nova." PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC="Escolha qual será o comportamento assim que o utilizador clicar na imagem." PLG_ENGAGEBOX_IMAGE_ALT="Alt Text" PLG_ENGAGEBOX_IMAGE_ALT_DESC="O atributo alt especifica um texto alternativo para uma imagem, se a imagem não puder ser exibida." PLG_ENGAGEBOX_IMAGE_ONCLICK="Ao Clicar" PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE="Fechar a Caixa" PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL="Ir para URL" PLG_ENGAGEBOX_IMAGE_URL_DESC="O URL para redirecionar o utilizador para" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB="Abrir uma nova janela" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC="Abrir a URL numa nova janela" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE="Coloque Cookie" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC="Depois que a caixa for fechada, um cookie será colocado no navegador do visitante para evitar que a caixa seja exibida novamente. O cookie será válido pelo tempo que você definir na opção 'Depois de Fechar Permaneça Oculta'." PKAA#]m�iWW<engagebox/image/language/fr-FR/fr-FR.plg_engagebox_image.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE_ALIAS="Image" PLG_ENGAGEBOX_IMAGE="Boîte d'action - Image" PLG_ENGAGEBOX_IMAGE_DESC="Boîte d'action image de type popup" PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC="Sélectionne une image à afficher avec la boîte" PLG_ENGAGEBOX_IMAGE_SOURCE="Source de l'image" PLG_ENGAGEBOX_IMAGE_SOURCE_DESC="Sélectionne la source de l'image. Vous pouvez au choix téléverser une image, en sélectionner une existante ou entrer une URL personnalisée." PLG_ENGAGEBOX_IMAGE_CUSTOM_URL="URL personnalisée" PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC="Choisit une URL personnalisée de l'image" COM_CONVERTFORMS_IMAGE_SOURCE="Sélectionner une image existante ou en téléverser une nouvelle." PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC="Choisit le comportement à adopter au clic de l'utilisateur sur l'image" PLG_ENGAGEBOX_IMAGE_ALT="Texte alt" PLG_ENGAGEBOX_IMAGE_ALT_DESC="L'attribut alt permet de donner un texte alternatif à une image si celle-ci ne peut s'afficher" PLG_ENGAGEBOX_IMAGE_ONCLICK="On Click" PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE="Fermer la boîte" PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL="Aller à l'URL" PLG_ENGAGEBOX_IMAGE_URL_DESC="L'URL redirige l'utilisateur vers" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB="Ouvrir dans un nouvel onglet" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC="Ouvrir l'URL dans un nouvel onglet" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE="Placer des cookies" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC="Une fois la boîte fermée, un cookie est déposé sur la navigateur du visiteur afin d'éviter que la boîte ne s'affiche à nouveau. Le cookie reste valide aussi longtemps que vous avez défini l'option \"Reste masqué après fermeture\"" PKAA#]��.E� � <engagebox/image/language/uk-UA/uk-UA.plg_engagebox_image.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE_ALIAS="Зображення" PLG_ENGAGEBOX_IMAGE="Включити поле - зображення" PLG_ENGAGEBOX_IMAGE_DESC="Включити тип спливаючого вікна зображення." PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC="Виберіть зображення для відображення у полі" PLG_ENGAGEBOX_IMAGE_SOURCE="Джерело зображення" PLG_ENGAGEBOX_IMAGE_SOURCE_DESC="Вибрати джерело зображення. Ви можете завантажити або завантажити нове зображення, вибрати існуюче або ввести спеціальну URL-адресу." PLG_ENGAGEBOX_IMAGE_CUSTOM_URL="Спеціальна URL-адреса" PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC="Введіть власну URL-адресу зображення" COM_CONVERTFORMS_IMAGE_SOURCE="Виберіть наявне зображення або завантажте нове." PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC="Виберіть, якою буде поведінка, коли користувач натисне на зображення." PLG_ENGAGEBOX_IMAGE_ALT="Alt Text" PLG_ENGAGEBOX_IMAGE_ALT_DESC="Атрибут alt вказує альтернативний текст для зображення, якщо зображення не вдається відобразити." PLG_ENGAGEBOX_IMAGE_ONCLICK="При натисканні" PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE="Закрити коробку" PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL="Перейти до URL-адреси" PLG_ENGAGEBOX_IMAGE_URL_DESC="URL для перенаправлення користувача на" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB="Відкрити нову вкладку" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC="Відкрити URL-адресу на новій вкладці" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE="Місце cookie" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC="Після закриття поля cookie буде розміщено у веб-переглядачі відвідувача, щоб запобігти появі вікна знову. Файл cookie буде дійсним до тих пір, поки ви встановили опцію"_QQ_" Скривати після закриття "_QQ_". " PKAA#]zc��88@engagebox/image/language/en-GB/en-GB.plg_engagebox_image.sys.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE="EngageBox - Image" PLG_ENGAGEBOX_IMAGE_DESC="EngageBox Image popup box type."PKAA#]7�Iu��<engagebox/image/language/en-GB/en-GB.plg_engagebox_image.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IMAGE_ALIAS="Image" PLG_ENGAGEBOX_IMAGE="EngageBox - Image" PLG_ENGAGEBOX_IMAGE_DESC="EngageBox Image popup box type." PLG_ENGAGEBOX_IMAGE_SETTINGS_DESC="Select an image to display within the box" PLG_ENGAGEBOX_IMAGE_SOURCE="Image Source" PLG_ENGAGEBOX_IMAGE_SOURCE_DESC="Select image source. You can either upload a new image, select an existing one or enter a custom URL." PLG_ENGAGEBOX_IMAGE_CUSTOM_URL="Custom URL" PLG_ENGAGEBOX_IMAGE_CUSTOM_URL_DESC="Enter a custom image URL" COM_CONVERTFORMS_IMAGE_SOURCE="Select an existing image or upload a new one." PLG_ENGAGEBOX_IMAGE_ONCLICK_DESC="Choose what the behavior will be once the user clicks on the image." PLG_ENGAGEBOX_IMAGE_ALT="Alt Text" PLG_ENGAGEBOX_IMAGE_ALT_DESC="The alt attribute specifies an alternate text for an image, if the image cannot be displayed." PLG_ENGAGEBOX_IMAGE_ONCLICK="On Click" PLG_ENGAGEBOX_IMAGE_ONCLICK_CLOSE="Close Box" PLG_ENGAGEBOX_IMAGE_ONCLICK_GOTOURL="Go to URL" PLG_ENGAGEBOX_IMAGE_URL_DESC="The URL to redirect the user to" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB="Open New Tab" PLG_ENGAGEBOX_IMAGE_OPEN_IN_NEW_TAB_DESC="Open URL in a new tab" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE="Place Cookie" PLG_ENGAGEBOX_IMAGE_PLACE_COOKIE_DESC="Once the box has been closed, a cookie will be placed on visitor's browser in order to prevent the box to popup again. The cookie will be valid for as long as you have set in the 'After Close Stay Hidden' option."PKAA#]h���engagebox/image/image.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgEngageBoxImage extends EngageBox\Plugin { protected $name = 'image'; }PKAA#]T�O�y9y9)engagebox/image/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgEngageboxImageInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PKAA#]��k;--engagebox/image/image.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="engagebox" method="upgrade"> <name>PLG_ENGAGEBOX_IMAGE</name> <description>PLG_ENGAGEBOX_IMAGE_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c) 2018 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>January 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <folder>form</folder> <folder>tmpl</folder> <filename plugin="image">image.php</filename> <filename>script.install.helper.php</filename> </files> </extension>PKAA#]3�'s��"engagebox/image/script.install.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgEngageBoxImageInstallerScript extends PlgEngageBoxImageInstallerScriptHelper { public $name = 'PLG_ENGAGEBOX_IMAGE'; public $alias = 'image'; public $extension_type = 'plugin'; public $plugin_folder = "engagebox"; public $show_message = false; } PKAA#]�V���>engagebox/custom/language/en-GB/en-GB.plg_engagebox_custom.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_CUSTOM_ALIAS="Freetext" PLG_ENGAGEBOX_CUSTOM="EngageBox - Freetext" PLG_ENGAGEBOX_CUSTOM_DESC="Create a popup box with your own Text or HTML code. No limits!"PKAA#]�V���Bengagebox/custom/language/en-GB/en-GB.plg_engagebox_custom.sys.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_CUSTOM_ALIAS="Freetext" PLG_ENGAGEBOX_CUSTOM="EngageBox - Freetext" PLG_ENGAGEBOX_CUSTOM_DESC="Create a popup box with your own Text or HTML code. No limits!"PKAA#]EC�11engagebox/custom/custom.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="engagebox" method="upgrade"> <name>PLG_ENGAGEBOX_CUSTOM</name> <description>PLG_ENGAGEBOX_CUSTOM_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c) 2018 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>January 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <folder>form</folder> <folder>tmpl</folder> <filename plugin="custom">custom.php</filename> <filename>script.install.helper.php</filename> </files> </extension>PKAA#]�#���engagebox/custom/custom.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgEngageBoxCustom extends EngageBox\Plugin { protected $name = "custom"; }PKAA#]�:w�z9z9*engagebox/custom/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgEngageboxCustomInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PKAA#]W ʱ�#engagebox/custom/script.install.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgEngageBoxCustomInstallerScript extends PlgEngageBoxCustomInstallerScriptHelper { public $name = 'PLG_ENGAGEBOX_CUSTOM'; public $alias = 'custom'; public $extension_type = 'plugin'; public $plugin_folder = "engagebox"; public $show_message = false; } PKAA#]���Z~~engagebox/custom/form/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="custom"> <field name="customhtml" type="editor" label="COM_RSTBOX_TEXT" description="COM_RSTBOX_TEXT_DESC" rows="5" cols="40" filter="raw" buttons="true" hiddenLabel="true" /> </fieldset> </form>PKAA#]�����!engagebox/custom/tmpl/default.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); echo $box->customhtml;PKAA#]��U��&engagebox/smarttags/script.install.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgEngageBoxSmartTagsInstallerScript extends PlgEngageBoxSmartTagsInstallerScriptHelper { public $name = 'PLG_ENGAGEBOX_SMARTTAGS'; public $alias = 'smarttags'; public $extension_type = 'plugin'; public $plugin_folder = "engagebox"; public $show_message = false; }PKAA#]����@@Dengagebox/smarttags/language/en-GB/en-GB.plg_engagebox_smarttags.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_SMARTTAGS="EngageBox - SmartTags" PLG_ENGAGEBOX_SMARTTAGS_DESC="Add SmartTags to your boxes"PKAA#]����@@Hengagebox/smarttags/language/en-GB/en-GB.plg_engagebox_smarttags.sys.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_SMARTTAGS="EngageBox - SmartTags" PLG_ENGAGEBOX_SMARTTAGS_DESC="Add SmartTags to your boxes"PKAA#]V�}9}9-engagebox/smarttags/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgEngageboxSmarttagsInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PKAA#]_��?��!engagebox/smarttags/smarttags.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgEngageBoxSmartTags extends JPlugin { /** * Replaces Smart Tags in a string * * We don't use the afterRender event here because it doesn't allow us to replace tags inside the Custom CSS option which is injected into the <head>. * * @todo Discontinue this plugin and move Smart Tags replacements within the Box::render() method. * * @param string &$box The box instance * * @return void */ public function onEngageBoxBeforeRender(&$box) { $box = \EngageBox\Box::replaceSmartTags($box, $box); } }PKAA#]�]�!engagebox/smarttags/smarttags.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="engagebox" method="upgrade"> <name>PLG_ENGAGEBOX_SMARTTAGS</name> <description>PLG_ENGAGEBOX_SMARTTAGS_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c) 2018 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>January 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="smarttags">smarttags.php</filename> <filename>script.install.helper.php</filename> </files> </extension>PKAA#]��/�z9z9*engagebox/social/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgEngageboxSocialInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PKAA#]-�Skengagebox/social/form/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="social"> <field name="blockStart" type="nr_well" label="PLG_ENGAGEBOX_SOCIAL_ALIAS" description="PLG_ENGAGEBOX_SOCIAL_DESC" /> <field name="socialplugin" type="groupedlist" default="facebook" label="COM_RSTBOX_SOCIAL_PLUGIN" description="COM_RSTBOX_SOCIAL_PLUGIN_DESC"> <option value="fbpagelike">Facebook Page Like</option> <option value="fbpost">Facebook Post</option> <option value="twfollow">Twitter Follow Button</option> </field> <field name="blockEnd" type="nr_well" end="1" /> <field name="blockTwitter" type="nr_well" label="Twitter" description="Create a popup with your Twitter Follow button" showon="socialplugin:twfollow" /> <field name="social_tw_hanbdle" type="text" label="COM_RSTBOX_SOCIAL_TW_HANDLE" description="COM_RSTBOX_SOCIAL_TW_HANDLE_DESC" hint="@twitterhandle" /> <field name="social_tw_largebutton" type="nrtoggle" label="COM_RSTBOX_SOCIAL_TW_LARGE_BUTTON" description="COM_RSTBOX_SOCIAL_TW_LARGE_BUTTON_DESC" class="switcher btn-group btn-group-yesno" checked="true" /> <field name="social_tw_showusername" type="nrtoggle" label="COM_RSTBOX_SOCIAL_TW_SHOW_USERNAME" description="COM_RSTBOX_SOCIAL_TW_SHOW_USERNAME_DESC" checked="true" class="switcher btn-group btn-group-yesno" /> <field name="social_tw_count" type="nrtoggle" label="COM_RSTBOX_SOCIAL_TW_COUNT" description="COM_RSTBOX_SOCIAL_TW_COUNT_DESC" class="switcher btn-group btn-group-yesno" checked="true" /> <field name="blockTwitterEnd" type="nr_well" end="1" /> <field name="blockFBLike" type="nr_well" label="Facebook Page Like" description="Create a popup with your Facebook Page Like button" showon="socialplugin:fbpagelike" /> <field name="socialurl" type="URL" label="COM_RSTBOX_SOCIAL_FB_URL" description="COM_RSTBOX_SOCIAL_FB_URL_DESC" hint="https://www.facebook.com" class="input-xxlarge" /> <field name="fbtabs" type="checkboxes" label="COM_RSTBOX_SOCIAL_FB_TABS" description="COM_RSTBOX_SOCIAL_FB_TABS_DESC" multiple="multiple"> <option value="timeline">Timeline</option> <option value="messages">Messages</option> <option value="events">Events</option> </field> <field name="fbhidecover" type="nrtoggle" label="COM_RSTBOX_SOCIAL_FB_HIDE_COVER" description="COM_RSTBOX_SOCIAL_FB_HIDE_COVER_DESC" class="switcher btn-group btn-group-yesno" /> <field name="fbsmallheader" type="nrtoggle" label="COM_RSTBOX_SOCIAL_FB_SMALL_HEADER" description="COM_RSTBOX_SOCIAL_FB_SMALL_HEADER_DESC" class="switcher btn-group btn-group-yesno" /> <field name="fbfacepile" type="nrtoggle" label="COM_RSTBOX_SOCIAL_FB_FACEPILE" description="COM_RSTBOX_SOCIAL_FB_FACEPILE_DESC" class="switcher btn-group btn-group-yesno" checked="true" /> <field name="socialwidth" type="text" class="input-small" description="NR_WIDTH_DESC" label="NR_WIDTH" hint="200px" /> <field name="socialheight" type="text" class="input-small" label="NR_HEIGHT" hint="200px" description="NR_HEIGHT_DESC" /> <field name="blockFBLikeEnd" type="nr_well" end="1" /> <field name="blockFBPost" type="nr_well" label="Facebook Post" description="Embed a Facebook Post within a popup!" showon="socialplugin:fbpost" /> <field name="social_fb_post_url" type="URL" label="COM_RSTBOX_SOCIAL_FB_POST_URL" description="COM_RSTBOX_SOCIAL_FB_POST_URL_DESC" class="input-xxlarge" hint="https://www.facebook.com/" /> <field name="blockFBPostEnd" type="nr_well" end="1" /> <field name="blockBehavior" type="nr_well" label="COM_RSTBOX_BOX_BEHAVIOR" description="COM_RSTBOX_BOX_BEHAVIOR_DESC" /> <field name="sociallang" type="list" default="auto" showon="socialplugin:fbpagelike,fbpost" class="btn-group btn-group-yesno" label="COM_RSTBOX_SOCIAL_LANG" description="COM_RSTBOX_SOCIAL_LANG_DESC"> <option value="auto">Auto</option> <option value="en_US">English</option> </field> <field name="async" type="list" label="COM_RSTBOX_ASYNC" default="afterOpen" description="COM_RSTBOX_ASYNC_DESC"> <option value="dom">Disable</option> <option value="beforeOpen">Before Box Open</option> <option value="afterOpen">After Box Open</option> <option value="pageLoad">on Page Load</option> </field> <field name="blockBehaviorEnd" type="nr_well" end="1" /> <field name="blockStart3" type="nr_well" label="COM_RSTBOX_TEXT" description="COM_RSTBOX_TEXT_DESC" /> <field name="socialtext" type="editor" filter="raw" label="COM_RSTBOX_TEXT" description="COM_RSTBOX_TEXT_DESC" buttons="true" /> <field name="blockEnd3" type="nr_well" end="1" /> </fieldset> </form>PKAA#]Yh���engagebox/social/social.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgEngageBoxSocial extends EngageBox\Plugin { protected $name = 'social'; }PKAA#]A���� � !engagebox/social/tmpl/default.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); $plugin = $box->params->get("socialplugin"); $async = $box->params->get("async", "afterOpen") == "dom" ? false : $box->params->get("async", "afterOpen"); $lang = ($box->params->get("sociallang", "auto") == "auto") ? str_replace("-","_",JFactory::getLanguage()->getTag()) : "en_US"; $FB_F = '(function(d, s, id) {var js, fjs = d.getElementsByTagName(s)[0];if (d.getElementById(id)) return;js = d.createElement(s); js.id = id;js.src = "//connect.facebook.net/'.$lang.'/sdk.js#xfbml=1&version=v2.5";fjs.parentNode.insertBefore(js, fjs);}(document, "script", "facebook-jssdk"));'; $TW_F = '!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?"http":"https";if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document, "script", "twitter-wjs");'; $header = $box->params->get("socialtext", null); $content = ($plugin == "twfollow") ? $TW_F : $FB_F; if (!$async) { JFactory::getDocument()->addScriptDeclaration($content); } else { JFactory::getDocument()->addScriptDeclaration(' EngageBox.onReady(function() { var box = EngageBox.getInstance(' . $box->id . '); var content = ' . json_encode($content) .'; var async = ' . json_encode($async) .'; if (async == "pageLoad") { window.addEventListener("load", function() { eval(content); }); } else { box.on(async, function() { eval(content); }); } }); '); } ?> <?php if (!empty($header)) { ?> <div class="eb-content-header"> <?php echo $box->params->get("socialtext") ?> </div> <?php } ?> <div class="eb-content-wrap"> <?php if ($plugin == "fbpagelike") { ?> <div class="fb-page" data-href="<?php echo $box->params->get("socialurl") ?>" data-tabs="<?php echo implode(",",$box->params->get("fbtabs", array())) ?>" data-width="<?php echo $box->params->get("socialwidth"); ?>" data-height="<?php echo $box->params->get("socialheight"); ?>" data-small-header="<?php echo $box->params->get("fbsmallheader", "false") ?>" data-adapt-container-width="<?php echo $box->params->get("fbadaptwidth", "true") ?>" data-hide-cover="<?php echo $box->params->get("fbhidecover", "false") ?>" data-show-facepile="<?php echo $box->params->get("fbfacepile", "true") ?>"> </div> <div id="fb-root"></div> <?php } ?> <?php if ($plugin == "fbpost") { ?> <div class="fb-post" data-href="<?php echo $box->params->get("social_fb_post_url") ?>" data-width="<?php echo $box->params->get("socialwidth"); ?>"></div> <div id="fb-root"></div> <?php } ?> <?php if ($plugin == "twfollow") { ?> <a href="https://twitter.com/<?php echo $box->params->get("social_tw_hanbdle")?>" rel="noopener" class="twitter-follow-button" data-show-screen-name="<?php echo $box->params->get("social_tw_showusername", false) ? "true" : "false" ?>" data-show-count="<?php echo $box->params->get("social_tw_count", false) ? "true" : "false" ?>" data-size="<?php echo $box->params->get("social_tw_largebutton") ? "large" : "" ?>"> </a> <?php } ?> </div>PKAA#]�>�<11engagebox/social/social.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="engagebox" method="upgrade"> <name>PLG_ENGAGEBOX_SOCIAL</name> <description>PLG_ENGAGEBOX_SOCIAL_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c) 2018 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>January 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <folder>form</folder> <folder>tmpl</folder> <filename plugin="social">social.php</filename> <filename>script.install.helper.php</filename> </files> </extension>PKAA#]�b���Bengagebox/social/language/en-GB/en-GB.plg_engagebox_social.sys.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_SOCIAL_ALIAS="Social Media" PLG_ENGAGEBOX_SOCIAL="EngageBox - Social Media" PLG_ENGAGEBOX_SOCIAL_DESC="Get more Facebook likes and Twitter Followers with Social Media popups!"PKAA#]�b���>engagebox/social/language/en-GB/en-GB.plg_engagebox_social.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_SOCIAL_ALIAS="Social Media" PLG_ENGAGEBOX_SOCIAL="EngageBox - Social Media" PLG_ENGAGEBOX_SOCIAL_DESC="Get more Facebook likes and Twitter Followers with Social Media popups!"PKAA#]A;���#engagebox/social/script.install.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgEngageBoxSocialInstallerScript extends PlgEngageBoxSocialInstallerScriptHelper { public $name = 'PLG_ENGAGEBOX_SOCIAL'; public $alias = 'social'; public $extension_type = 'plugin'; public $plugin_folder = "engagebox"; public $show_message = false; } PKAA#]��;�__engagebox/phpscripts/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="phpscripts" label="PLG_ENGAGEBOX_PHPSCRIPTS_NAME" description="PLG_ENGAGEBOX_PHPSCRIPTS_FIELDSET_DESC" tag="params" help="https://www.tassos.gr/joomla-extensions/engagebox/docs/working-with-php-scripts"> <fields name="phpscripts"> <field name="beforerender" type="textarea" label="PLG_ENGAGEBOX_PHPSCRIPTS_BEFORERENDER" description="PLG_ENGAGEBOX_PHPSCRIPTS_BEFORERENDER_DESC" rows="10" class="span12" /> <field name="afterrender" type="textarea" label="PLG_ENGAGEBOX_PHPSCRIPTS_AFTERRENDER" description="PLG_ENGAGEBOX_PHPSCRIPTS_AFTERRENDER_DESC" rows="10" class="span12" /> <field name="open" type="textarea" label="PLG_ENGAGEBOX_PHPSCRIPTS_OPEN" description="PLG_ENGAGEBOX_PHPSCRIPTS_OPEN_DESC" rows="10" class="span12" /> <field name="close" type="textarea" label="PLG_ENGAGEBOX_PHPSCRIPTS_CLOSE" description="PLG_ENGAGEBOX_PHPSCRIPTS_CLOSE_DESC" rows="10" class="span12" /> </fields> </fieldset> </form>PKAA#]�FR!��'engagebox/phpscripts/script.install.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgEngageBoxPHPScriptsInstallerScript extends PlgEngageBoxPHPScriptsInstallerScriptHelper { public $name = 'PLG_ENGAGEBOX_PHPSCRIPTS'; public $alias = 'phpscripts'; public $extension_type = 'plugin'; public $plugin_folder = 'engagebox'; public $show_message = false; } PKAA#]G��~9~9.engagebox/phpscripts/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgEngageboxPhpscriptsInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PKAA#]&y?O``Jengagebox/phpscripts/language/en-GB/en-GB.plg_engagebox_phpscripts.sys.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2020 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_PHPSCRIPTS="EngageBox - PHP Scripts" PLG_ENGAGEBOX_PHPSCRIPTS_DESC="Manipulate EngageBox by executing PHP on certain events"PKAA#]��d���Fengagebox/phpscripts/language/en-GB/en-GB.plg_engagebox_phpscripts.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2020 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_PHPSCRIPTS="EngageBox - PHP Scripts" PLG_ENGAGEBOX_PHPSCRIPTS_NAME="PHP Scripts" PLG_ENGAGEBOX_PHPSCRIPTS_DESC="Manipulate EngageBox by executing PHP on certain events" PLG_ENGAGEBOX_PHPSCRIPTS_BEFORERENDER="On Before Render" PLG_ENGAGEBOX_PHPSCRIPTS_BEFORERENDER_DESC="The PHP script added in this area is executed after the box passes the Publishing Assignments checks and before the box's layout is rendered.<br><br>The main focus in this area is the <b>$box</b> (Object) variable which contains the box's settings. <br><br>You don't need to include the <?php and ?> tags." PLG_ENGAGEBOX_PHPSCRIPTS_AFTERRENDER="On After Render" PLG_ENGAGEBOX_PHPSCRIPTS_AFTERRENDER_DESC="The PHP script added in this area is executed after the box's layout is rendered.<br><br>The main focus in this area is the <b>$boxLayout</b> (String) variable which contains the final HTML of the box.<br><br>To access the box settings use the <b>$box</b> (Object) variable.<br><br>You don't need to include the <?php and ?> tags." PLG_ENGAGEBOX_PHPSCRIPTS_OPEN="On Open" PLG_ENGAGEBOX_PHPSCRIPTS_OPEN_DESC="The PHP script added in this area is executed every time the box is opened.<br><br>The main focus in this area is the <b>$box</b> (Object) variable which contains the box's settings. <br><br>You don't need to include the <?php and ?> tags." PLG_ENGAGEBOX_PHPSCRIPTS_CLOSE="On Close" PLG_ENGAGEBOX_PHPSCRIPTS_CLOSE_DESC="The PHP script added in this area is executed every time the box is closed.<br><br>The main focus in this area is the <b>$box</b> (Object) variable which contains the box's settings. <br><br>You don't need to include the <?php and ?> tags." PLG_ENGAGEBOX_PHPSCRIPTS_FIELDSET_DESC="EngageBox fires certain types of events during runtime and enables you to execute PHP when these events occured."PKAA#](X�&&#engagebox/phpscripts/phpscripts.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="engagebox" method="upgrade"> <name>PLG_ENGAGEBOX_PHPSCRIPTS</name> <description>PLG_ENGAGEBOX_PHPSCRIPTS_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c) 2020 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>February 2020</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <filename plugin="phpscripts">phpscripts.php</filename> <filename>form.xml</filename> <filename>script.install.helper.php</filename> </files> </extension>PKAA#][3�11#engagebox/phpscripts/phpscripts.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgEngageBoxPHPScripts extends JPlugin { /** * The box object * * @var object */ private $box; /** * Auto load plugin's language file * * @var boolean */ protected $autoloadLanguage = true; /** * Add PHP Scripts form into the box editing page * * @param object $form * * @return void */ public function onContentPrepareForm($form) { if ($form->getName() != 'com_rstbox.item') { return; } $form->loadFile(__DIR__ . '/form.xml', false); } /** * The BeforeRender event fires before the box's layout is ready. * * @param object $box The box's settings object * * @return void */ public function onEngageBoxBeforeRender($box) { $this->box = $box; $this->runPHPScript('beforerender'); } /** * The AfterRender event fires after the box's layout is ready. * * @param string $boxLayout The box's final HTML output * @param object $box The box's settings object * * @return void */ public function onEngageBoxAfterRender(&$boxLayout, $box) { $this->box = $box; $this->payload = ['boxLayout' => &$boxLayout]; $this->runPHPScript('afterrender'); } /** * The Open event fires every time the box opens * * @param object $box The box's settings object * * @return void */ public function onEngageBoxOpen($box) { $this->box = $box; $this->runPHPScript('open'); } /** * Close event fires every time the box closes * * @param object $box The box's settings object * * @return void */ public function onEngageBoxClose($box) { $this->box = $box; $this->runPHPScript('close'); } /** * Run user-defined PHP scripts * * @param String $script The PHP code to run * * @return void */ private function runPHPScript($php_script) { if (!$php_script = $this->box->params->get('phpscripts.' . $php_script)) { return; } $this->payload['box'] = $this->box; // Run PHP (new \NRFramework\Executer($php_script, $this->payload))->run(); } }PKAA#]�Ʊ�#engagebox/iframe/script.install.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgEngageBoxIFrameInstallerScript extends PlgEngageBoxIFrameInstallerScriptHelper { public $name = 'PLG_ENGAGEBOX_IFRAME'; public $alias = 'iframe'; public $extension_type = 'plugin'; public $plugin_folder = "engagebox"; public $show_message = false; } PKAA#]��K engagebox/iframe/form/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="iframe"> <field name="blockStart" type="nr_well" label="PLG_ENGAGEBOX_IFRAME_ALIAS" description="PLG_ENGAGEBOX_IFRAME_DESC" /> <field name="iframeurl" type="text" label="COM_RSTBOX_IFRAMEURL" class="input-xxlarge" description="COM_RSTBOX_IFRAMEURL_DESC" hint="http://" /> <field name="iframeheight" type="text" default="500px" class="input-small" label="NR_HEIGHT" description="NR_HEIGHT_DESC" /> <field name="iframescrolling" type="list" default="auto" label="COM_RSTBOX_IFRAME_SCROLLING" description="COM_RSTBOX_IFRAME_SCROLLING_DESC"> <option value="yes">JYES</option> <option value="no">JNO</option> <option value="auto">Auto</option> </field> <field name="iframeparams" type="text" label="COM_RSTBOX_IFRAMEPARAMS" description="COM_RSTBOX_IFRAMEPARAMS_DESC" /> <field name="blockStartEnd" type="nr_well" end="1" /> <field name="blockStart2" type="nr_well" label="COM_RSTBOX_BOX_BEHAVIOR" description="COM_RSTBOX_BOX_BEHAVIOR_DESC" /> <field name="iframeasync" type="list" label="COM_RSTBOX_ASYNC" default="afterOpen" description="COM_RSTBOX_ASYNC_DESC"> <option value="dom">Disable</option> <option value="beforeOpen">Before Box Open</option> <option value="afterOpen">After Box Open</option> <option value="pageLoad">on Page Load</option> </field> <field name="removeonclose" type="nrtoggle" label="COM_RSTBOX_IFRAME_REMOVE_ON_CLOSE" description="COM_RSTBOX_IFRAME_REMOVE_ON_CLOSE_DESC" /> <field name="blockStartEnd2" type="nr_well" end="1" /> <field name="blockStart3" type="nr_well" label="COM_RSTBOX_TEXT" description="COM_RSTBOX_TEXT_DESC" /> <field name="iframeheader" type="editor" filter="raw" label="COM_RSTBOX_TEXT" buttons="true" description="COM_RSTBOX_TEXT_DESC" /> <field name="blockStartEnd3" type="nr_well" end="1" /> </fieldset> </form>PKAA#]�LNO}}!engagebox/iframe/tmpl/default.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); $height = $box->params->get("iframeheight", "500px"); $url = $box->params->get("iframeurl"); $scroll = $box->params->get("iframescrolling", "no"); $params = $box->params->get("iframeparams"); $async = $box->params->get("iframeasync", "afterOpen") == "dom" ? false : $box->params->get("iframeasync", "afterOpen"); $header = $box->params->get("iframeheader", null); $class = ($height == "100%") ? "eboxFitFrame" : ""; $content = '<div class="iframeWrapper">' . '<iframe width="100%" height="' . $height . '" src="' . $url . '" scrolling="' . $scroll . '" frameborder="0" allowtransparency="true" ' . $params . ' class="' . $class . '"></iframe>' . '</div>'; ?> <?php if ($header) ?> <div class="eb-content-header"> <?php echo $box->params->get("iframeheader"); ?> </div> <?php ?> <div class="eb-content-wrap"> <?php if (!$async) { echo $content; } ?> </div> <?php if ($async) { JFactory::getDocument()->addScriptDeclaration(' EngageBox.onReady(function() { var box = EngageBox.getInstance(' . $box->id . '); var async = ' . json_encode($async) .'; var content = ' . json_encode($content) .'; var container = box.el.querySelector(".eb-content-wrap"); var removeOnClose = '.json_encode($box->params->get("removeonclose", false)).' if (async == "pageLoad") { window.addEventListener("load", function() { container.innerHTML = content; }); } else { box.on(async, function() { if (container.querySelectorAll("iframe").length == 0) { container.innerHTML = content; } }); } if (removeOnClose) { box.on("afterClose", function() { container.removeChild(container.querySelector(".iframeWrapper")); }); } });' ); }PKAA#]-�d-11engagebox/iframe/iframe.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="engagebox" method="upgrade"> <name>PLG_ENGAGEBOX_IFRAME</name> <description>PLG_ENGAGEBOX_IFRAME_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c) 2018 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>January 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <folder>form</folder> <folder>tmpl</folder> <filename plugin="iframe">iframe.php</filename> <filename>script.install.helper.php</filename> </files> </extension>PKAA#]�� ��engagebox/iframe/iframe.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgEngageBoxIFrame extends EngageBox\Plugin { protected $name = 'iframe'; }PKAA#]���z9z9*engagebox/iframe/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgEngageboxIframeInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PKAA#]�h�W}}Bengagebox/iframe/language/en-GB/en-GB.plg_engagebox_iframe.sys.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IFRAME_ALIAS="IFrame" PLG_ENGAGEBOX_IFRAME="EngageBox - IFrame" PLG_ENGAGEBOX_IFRAME_DESC="Load any external URL within a box with the help of IFrames!"PKAA#]�h�W}}>engagebox/iframe/language/en-GB/en-GB.plg_engagebox_iframe.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_IFRAME_ALIAS="IFrame" PLG_ENGAGEBOX_IFRAME="EngageBox - IFrame" PLG_ENGAGEBOX_IFRAME_DESC="Load any external URL within a box with the help of IFrames!"PKAA#]b��ݑ�engagebox/yesno/yesno.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="engagebox" method="upgrade"> <name>PLG_ENGAGEBOX_YESNO</name> <description>PLG_ENGAGEBOX_YESNO_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c) 2018 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>January 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <folder>form</folder> <folder>tmpl</folder> <filename plugin="yesno">yesno.php</filename> <filename>script.install.helper.php</filename> </files> <media folder="media" destination="plg_engagebox_yesno"> <folder>css</folder> </media> </extension>PKAA#]6��!��engagebox/yesno/yesno.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgEngageBoxYesNo extends EngageBox\Plugin { protected $name = 'yesno'; }PKAA#]�h&���"engagebox/yesno/script.install.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgEngageBoxYesNoInstallerScript extends PlgEngageBoxYesNoInstallerScriptHelper { public $name = 'PLG_ENGAGEBOX_YESNO'; public $alias = 'yesno'; public $extension_type = 'plugin'; public $plugin_folder = "engagebox"; public $show_message = false; } PKAA#]Q���<engagebox/yesno/language/pl-PL/pl-PL.plg_engagebox_yesno.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO_ALIAS="Tak Nie" PLG_ENGAGEBOX_YESNO="Engage Box - Tak Nie" PLG_ENGAGEBOX_YESNO_DESC="Przyciągnij użytkowników do stron docelowych popupami z wyborem Tak / Nie!" PLG_ENGAGEBOX_YESNO_HEADLINE="Nagłówek" PLG_ENGAGEBOX_YESNO_HEADLINE_DESC="Wprowadź treść nagłówka" ; PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE="Headline Font Size" ; PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR="Headline Font Color" PLG_ENGAGEBOX_YESNO_YESBUTTON="Przycisk Tak" PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC="Dostosuj przycisk Tak" PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC="Tekst przycisku" PLG_ENGAGEBOX_YESNO_ONCLICK="On Click" PLG_ENGAGEBOX_YESNO_ONCLICK_DESC="Co chciałbyś zrobić, gdy użytkownik kliknie przycisk?" PLG_ENGAGEBOX_YESNO_GOTOURL="Idź do URL" PLG_ENGAGEBOX_YESNO_OPENBOX="Otwórz moduł" PLG_ENGAGEBOX_YESNO_CLOSEBOX="Zamknij moduł" PLG_ENGAGEBOX_YESNO_URL_DESC="Wprowadź adres URL" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB="Otwórz nową kartę" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC="Czy chcesz, aby przekierowanie nastąpiło w nowej karcie?" PLG_ENGAGEBOX_YESNO_NOBUTTON="Przycisk Nie" PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC="Dostosuj przycisk Nie" PLG_ENGAGEBOX_YESNO_BOX_LIST="Wybierz moduł" PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC="Wybierz moduł do otwarcia" PLG_ENGAGEBOX_YESNO_FOOTER="Tekst stopki" PLG_ENGAGEBOX_YESNO_FOOTER_DESC="Opcjonalnie wpisz tekst stopki, który pojawi się poniżej przycisków." ; PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE="Buttons Width" ; PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC="Buttons minimum width" ; PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT="Subtext" ; PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC="Enter a subtext that will appear under main button's text" ; PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE="Buttons Font Size" ; PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC="Close box before URL redirection" PKAA#]���2��<engagebox/yesno/language/de-DE/de-DE.plg_engagebox_yesno.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO_ALIAS="Ja Nein" PLG_ENGAGEBOX_YESNO="Engage Box - Ja Nein" PLG_ENGAGEBOX_YESNO_DESC="Fesseln Sie Ihre Besucher auf Einstiegs-Seiten mit unwiderstehlichen Ja / Nein Popups!" PLG_ENGAGEBOX_YESNO_HEADLINE="Überschrift" PLG_ENGAGEBOX_YESNO_HEADLINE_DESC="Geben Sie den Überschriften-Text ein" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE="Schriftgröße der Überschrift" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR="Schriftfarbe der Headline" PLG_ENGAGEBOX_YESNO_YESBUTTON="JA - Button" PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC="Passen Sie den Ja-Button an" PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC="Der Button-Text" PLG_ENGAGEBOX_YESNO_ONCLICK="beim Klicken" PLG_ENGAGEBOX_YESNO_ONCLICK_DESC="Was möchten Sie tun, wenn der Benutzer auf die Schaltfläche klickt?" PLG_ENGAGEBOX_YESNO_GOTOURL="gehe zur URL" PLG_ENGAGEBOX_YESNO_OPENBOX="Box öffnen" PLG_ENGAGEBOX_YESNO_CLOSEBOX="Box schliessen" PLG_ENGAGEBOX_YESNO_URL_DESC="URL eingeben" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB="Öffnet einen neuen Tab/Reiter" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC="Möchten Sie, dass die Umleitung in ein neues Tab stattfindet?" PLG_ENGAGEBOX_YESNO_NOBUTTON="NO - Button" PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC="Passen Sie das Nein - Button an" PLG_ENGAGEBOX_YESNO_BOX_LIST="Box auswählen" PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC="wählen Sie eine zu öffnende Box" PLG_ENGAGEBOX_YESNO_FOOTER="Fußtext" PLG_ENGAGEBOX_YESNO_FOOTER_DESC="Geben Sie optional einen Fußzeilentext ein, der unterhalb der Schaltflächen angezeigt werden soll." PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE="Buttonweite" PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC="minimale Buttonweite" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT="Untertext" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC="Geben Sie einen Untertext ein, der unter dem Text der Haupt-Schaltfläche erscheinen soll" PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE="Schriftgröße im Button" PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC="Schließt die Box vor der URL-Umleitung" PKAA#]�G�VV<engagebox/yesno/language/pt-PT/pt-PT.plg_engagebox_yesno.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO_ALIAS="Sim Não" PLG_ENGAGEBOX_YESNO="CAIXA POPUP - Sim Não" PLG_ENGAGEBOX_YESNO_DESC="Direcione os seus visitantes para páginas de destino com pop-ups irresistíveis Sim / Não!" PLG_ENGAGEBOX_YESNO_HEADLINE="Cabeçalho" PLG_ENGAGEBOX_YESNO_HEADLINE_DESC="Digite o texto de cabeçalho" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE="Tamanho da Letra do Título" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR="Cor da Letra do Título" PLG_ENGAGEBOX_YESNO_YESBUTTON="Botão Sim" PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC="Personalize o Botão Sim" PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC="O Texto do Botão " PLG_ENGAGEBOX_YESNO_ONCLICK="Ao Clicar" PLG_ENGAGEBOX_YESNO_ONCLICK_DESC="O que gostaria de fazer quando o utilizador clica no botão?" PLG_ENGAGEBOX_YESNO_GOTOURL="Ir para URL" PLG_ENGAGEBOX_YESNO_OPENBOX="Abrir Caixa" PLG_ENGAGEBOX_YESNO_CLOSEBOX="Fechar a Caixa" PLG_ENGAGEBOX_YESNO_URL_DESC="Coloque o URL" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB="Abrir uma nova janela" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC="Gostaria que o redirecionamento ocorresse numa nova janela?" PLG_ENGAGEBOX_YESNO_NOBUTTON="Sem Botão" PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC="Personalizar o Sem Botão" PLG_ENGAGEBOX_YESNO_BOX_LIST="Caixa de Seleção" PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC="Selecione uma caixa para abrir" PLG_ENGAGEBOX_YESNO_FOOTER="Texto de rodapé" PLG_ENGAGEBOX_YESNO_FOOTER_DESC="Opcionalmente, insira um texto de rodapé que será exibido abaixo dos botões." PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE="Largura dos botões" PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC="Largura mínima dos botões" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT="Subtitulo" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC="Digite um subtítulo que aparecerá no texto do botão principal" PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE="Tamanho da Letra dos Botões " PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC="Fechar caixa antes do redirecionamento de URL" PKAA#]��<engagebox/yesno/language/pt-BR/pt-BR.plg_engagebox_yesno.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO_ALIAS="Sim Não" ; PLG_ENGAGEBOX_YESNO="Engage Box - Yes No" ; PLG_ENGAGEBOX_YESNO_DESC="Funnel your visitors to landing pages with irresistible Yes/No popups!" PLG_ENGAGEBOX_YESNO_HEADLINE="Título" ; PLG_ENGAGEBOX_YESNO_HEADLINE_DESC="Enter headline text" ; PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE="Headline Font Size" ; PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR="Headline Font Color" PLG_ENGAGEBOX_YESNO_YESBUTTON="Botão Sim" ; PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC="Customize the Yes Button" PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC="O texto do botão " PLG_ENGAGEBOX_YESNO_ONCLICK="Ao Clicar" ; PLG_ENGAGEBOX_YESNO_ONCLICK_DESC="What would you like to do when the user clicks on the button?" PLG_ENGAGEBOX_YESNO_GOTOURL="Ir para o URL" ; PLG_ENGAGEBOX_YESNO_OPENBOX="Open Box" PLG_ENGAGEBOX_YESNO_CLOSEBOX="Fechar Caixa" ; PLG_ENGAGEBOX_YESNO_URL_DESC="Enter a URL" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB="Abrir uma nova Tab" ; PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC="Would you like the redirection to take place in a new tab?" ; PLG_ENGAGEBOX_YESNO_NOBUTTON="No Button" ; PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC="Customize the No Button" PLG_ENGAGEBOX_YESNO_BOX_LIST="Selecione a Caixa" PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC="Selecione a caixa a abrir" PLG_ENGAGEBOX_YESNO_FOOTER="Texto de Rodapé" ; PLG_ENGAGEBOX_YESNO_FOOTER_DESC="Optionally enter a footer text that will be appear below the buttons." ; PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE="Buttons Width" ; PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC="Buttons minimum width" ; PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT="Subtext" ; PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC="Enter a subtext that will appear under main button's text" ; PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE="Buttons Font Size" ; PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC="Close box before URL redirection" PKAA#]ъ�4� � <engagebox/yesno/language/uk-UA/uk-UA.plg_engagebox_yesno.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO_ALIAS="Так ні" PLG_ENGAGEBOX_YESNO="Увімкнути ящик - так ні" PLG_ENGAGEBOX_YESNO_DESC="Наведіть своїх відвідувачів на цільові сторінки з непереборними"_QQ_" Так / Ні "_QQ_"." PLG_ENGAGEBOX_YESNO_HEADLINE="Заголовок" PLG_ENGAGEBOX_YESNO_HEADLINE_DESC="Введіть текст заголовка" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE="Розмір шрифту заголовка" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR="Колір шрифту заголовка" PLG_ENGAGEBOX_YESNO_YESBUTTON="Кнопка" PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC="Налаштувати кнопку Так" PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC="Текст кнопки" PLG_ENGAGEBOX_YESNO_ONCLICK="При натисканні" PLG_ENGAGEBOX_YESNO_ONCLICK_DESC="Що б ви хотіли робити, коли користувач натискає кнопку?" PLG_ENGAGEBOX_YESNO_GOTOURL="Перейти до URL-адреси" PLG_ENGAGEBOX_YESNO_OPENBOX="Відкрити вікно" PLG_ENGAGEBOX_YESNO_CLOSEBOX="Закрити коробку" PLG_ENGAGEBOX_YESNO_URL_DESC="Введіть URL-адресу" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB="Відкрити нову вкладку" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC="Чи хочете, щоб перенаправлення відбулося на новій вкладці?" PLG_ENGAGEBOX_YESNO_NOBUTTON="Немає кнопки" PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC="Налаштувати кнопку" PLG_ENGAGEBOX_YESNO_BOX_LIST="Виберіть поле" PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC="Виберіть поле для відкриття" PLG_ENGAGEBOX_YESNO_FOOTER="Текст нижнього колонтитула" PLG_ENGAGEBOX_YESNO_FOOTER_DESC="Необов’язково ввести текст нижнього колонтитула, який відображатиметься під кнопками." PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE="Ширина кнопок" PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC="Кнопки мінімальної ширини" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT="Підтекст" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC="Введіть підтекст, який з’явиться під текстом основної кнопки" PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE="Розмір шрифту кнопок" PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC="Закрити вікно перед перенаправленням URL-адреси" PKAA#]���N��<engagebox/yesno/language/en-GB/en-GB.plg_engagebox_yesno.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO_ALIAS="Yes No" PLG_ENGAGEBOX_YESNO="EngageBox - Yes No" PLG_ENGAGEBOX_YESNO_DESC="Funnel your visitors to landing pages with irresistible Yes/No popups!" PLG_ENGAGEBOX_YESNO_HEADLINE="Headline" PLG_ENGAGEBOX_YESNO_HEADLINE_DESC="Enter headline text" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE="Headline Font Size" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR="Headline Font Color" PLG_ENGAGEBOX_YESNO_YESBUTTON="Yes Button" PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC="Customize the Yes Button" PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC="The button text" PLG_ENGAGEBOX_YESNO_ONCLICK="On Click" PLG_ENGAGEBOX_YESNO_ONCLICK_DESC="What would you like to do when the user clicks on the button?" PLG_ENGAGEBOX_YESNO_GOTOURL="Go to URL" PLG_ENGAGEBOX_YESNO_OPENBOX="Open Box" PLG_ENGAGEBOX_YESNO_CLOSEBOX="Close Box" PLG_ENGAGEBOX_YESNO_URL_DESC="Enter a URL" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB="Open New Tab" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC="Would you like the redirection to take place in a new tab?" PLG_ENGAGEBOX_YESNO_NOBUTTON="No Button" PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC="Customize the No Button" PLG_ENGAGEBOX_YESNO_BOX_LIST="Select Box" PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC="Select a box to open" PLG_ENGAGEBOX_YESNO_FOOTER="Footer Text" PLG_ENGAGEBOX_YESNO_FOOTER_DESC="Optionally enter a footer text that will be appear below the buttons." PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE="Buttons Width" PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC="Buttons minimum width" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT="Subtext" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC="Enter a subtext that will appear under main button's text" PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE="Buttons Font Size" PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC="Close box before URL redirection"PKAA#]��S�``@engagebox/yesno/language/en-GB/en-GB.plg_engagebox_yesno.sys.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO="EngageBox - Yes No" PLG_ENGAGEBOX_YESNO_DESC="Funnel your visitors to landing pages with irresistible Yes/No popups!"PKAA#]Um��pp<engagebox/yesno/language/fr-FR/fr-FR.plg_engagebox_yesno.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO_ALIAS="Oui Non" PLG_ENGAGEBOX_YESNO="Boîte d'action - Oui Non" PLG_ENGAGEBOX_YESNO_DESC="Balader vos visiteurs sur les pages du site avec les irrésistibles popups Oui/Non !" PLG_ENGAGEBOX_YESNO_HEADLINE="Titre" PLG_ENGAGEBOX_YESNO_HEADLINE_DESC="Entrer le texte du titre" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE="Taille de police du titre" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR="Couleur du titre" PLG_ENGAGEBOX_YESNO_YESBUTTON="Bouton Oui" PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC="Personnaliser le bouton Oui" PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC="Le bouton texte" PLG_ENGAGEBOX_YESNO_ONCLICK="On Click" PLG_ENGAGEBOX_YESNO_ONCLICK_DESC="Que voulez-vous lorsque l'utilisateur clique sur le bouton ?" PLG_ENGAGEBOX_YESNO_GOTOURL="Aller à l'URL" PLG_ENGAGEBOX_YESNO_OPENBOX="Ouvrir la boîte" PLG_ENGAGEBOX_YESNO_CLOSEBOX="Fermer la boîte" PLG_ENGAGEBOX_YESNO_URL_DESC="Entrer une URL" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB="Ouvrir dans un nouvel onglet" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC="Souhaitez-vous que la redirection se fasse dans un nouvel onglet ?" PLG_ENGAGEBOX_YESNO_NOBUTTON="Bouton Non" PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC="Personnaliser le bouton Non" PLG_ENGAGEBOX_YESNO_BOX_LIST="Sélectionner la boîte" PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC="Sélectionner la boîte à ouvrir" PLG_ENGAGEBOX_YESNO_FOOTER="Texte du pied de page" PLG_ENGAGEBOX_YESNO_FOOTER_DESC="Optionnel : entrer un texte de pied de page qui s'affichera sous les boutons" PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE="Largeur des boutons" PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC="Largeur minimum des boutons" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT="Sous-texte" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC="Entrer un sous-texte qui apparaîtra en dessous du texte principal des boutons" PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE="Taille de police des boutons" PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC="Fermer la boîte avant la redirection de l'URL" PKAA#]\�Y��<engagebox/yesno/language/ru-RU/ru-RU.plg_engagebox_yesno.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO_ALIAS="Да Нет" PLG_ENGAGEBOX_YESNO="Engage Box - Да Нет" PLG_ENGAGEBOX_YESNO_DESC="Привлекайте своих посетителей на посадочные страницы с помощью потрясающего выскакивающего окошка 'Да/Нет'!" PLG_ENGAGEBOX_YESNO_HEADLINE="Заголовок" PLG_ENGAGEBOX_YESNO_HEADLINE_DESC="Введите текст заголовка" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE="Размер шрифта заголовка" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR="Цвет шрифта заголовка" PLG_ENGAGEBOX_YESNO_YESBUTTON="Кнопка для Да" PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC="Подстроить кнопку 'Да'" PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC="Текст кнопки" PLG_ENGAGEBOX_YESNO_ONCLICK="По щелчку" PLG_ENGAGEBOX_YESNO_ONCLICK_DESC="Что по-Вашему должно случиться после того, как пользователь щелкнет на эту кнопку?" PLG_ENGAGEBOX_YESNO_GOTOURL="Пройти по ссылке" PLG_ENGAGEBOX_YESNO_OPENBOX="Открыть блок" PLG_ENGAGEBOX_YESNO_CLOSEBOX="Закрыть блок" PLG_ENGAGEBOX_YESNO_URL_DESC="Введите URL" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB="Открыть новую вкладку" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC="Хотели бы Вы, чтобы перенаправление происходило в новой вкладке?" PLG_ENGAGEBOX_YESNO_NOBUTTON="Кнопка 'Нет'" PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC="Подстроить кнопку 'Нет'" PLG_ENGAGEBOX_YESNO_BOX_LIST="Выпадающий список" PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC="Выберите какое поле будет открываться" PLG_ENGAGEBOX_YESNO_FOOTER="Текст нижнего колонтитула" PLG_ENGAGEBOX_YESNO_FOOTER_DESC="На выбор, то есть совсем не обязательно, введите текст нижнего колонтитула, который будет показан под кнопками." PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE="Ширина кнопок" PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC="Минимальная ширина кнопок" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT="Дополнительный текст" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC="Введите дополнительный текст, который будет показан под главным текстом кнопки." PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE="Зазмер шрифта кнопки" PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC="Закрыть коробку перед перенаправлением на другой URL" PKAA#]W��3KK<engagebox/yesno/language/cs-CZ/cs-CZ.plg_engagebox_yesno.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO_ALIAS="Ano Ne" PLG_ENGAGEBOX_YESNO="Engage Box - Ano Ne" PLG_ENGAGEBOX_YESNO_DESC="Směrujte návštěvníky na správné stránky díky neodolatelným Ano/ne vyskakovacím oknům!" PLG_ENGAGEBOX_YESNO_HEADLINE="Nadpis" PLG_ENGAGEBOX_YESNO_HEADLINE_DESC="Zadejte text nadpisu" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE="Velikost písma nadpisu" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR="Barva písma nadpisu" PLG_ENGAGEBOX_YESNO_YESBUTTON="Tlačítko Ano" PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC="Upravit tlačítko Ano" PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC="Text na tlačítku" PLG_ENGAGEBOX_YESNO_ONCLICK="Po kliknutí" PLG_ENGAGEBOX_YESNO_ONCLICK_DESC="Co si přejete chcete udělat, když uživatel klikne na tlačítko?" PLG_ENGAGEBOX_YESNO_GOTOURL="Jít na URL" PLG_ENGAGEBOX_YESNO_OPENBOX="Otevřít okno" PLG_ENGAGEBOX_YESNO_CLOSEBOX="Zavřít okno" PLG_ENGAGEBOX_YESNO_URL_DESC="Zadejte URL" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB="Otevřít nový panel" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC="Chcete otevřít obsah přesměrované stránky v novém tabu?" PLG_ENGAGEBOX_YESNO_NOBUTTON="Tlačítko Ne" PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC="Přizpůsobit tlačítko Ne" PLG_ENGAGEBOX_YESNO_BOX_LIST="Vyberte okno" PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC="Vyberte okno k otevření" PLG_ENGAGEBOX_YESNO_FOOTER="Text patičky" PLG_ENGAGEBOX_YESNO_FOOTER_DESC="Volitelně můžete vložit text patičky. který se objeví pod tlačítky." PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE="Šířka tlačítek" PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC="Minimální šířka tlačítka" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT="Podtext" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC="Zadejte popisek, který se zobrazí pod hlavním textu tlačítka" PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE="Velikost písma na tlačítcích" PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC="Zavřít okno před přesměrováním na URL" PKAA#]6��>__<engagebox/yesno/language/tr-TR/tr-TR.plg_engagebox_yesno.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO_ALIAS="Evet Hayır" PLG_ENGAGEBOX_YESNO="Engage Box - Resim" PLG_ENGAGEBOX_YESNO_DESC="Karşı konulmaz Evet/Hayır açılır pencereleri ile ziyaretçilerinizi açılış sayfalarına yönlendirin!" PLG_ENGAGEBOX_YESNO_HEADLINE="Başlık" PLG_ENGAGEBOX_YESNO_HEADLINE_DESC="Başlık metni girin" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE="Başlık Yazı Boyutu" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR="Başlık Yazı Rengi" PLG_ENGAGEBOX_YESNO_YESBUTTON="Evet Düğmesi" PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC="Evet Düğmesini özelleştir" PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC="Düğme metni" PLG_ENGAGEBOX_YESNO_ONCLICK="Tıklandığında" PLG_ENGAGEBOX_YESNO_ONCLICK_DESC="Kullanıcı düğmeyi tıklattığında ne yapmak istersiniz?" PLG_ENGAGEBOX_YESNO_GOTOURL="URL'ye git" PLG_ENGAGEBOX_YESNO_OPENBOX="Kutu Aç" PLG_ENGAGEBOX_YESNO_CLOSEBOX="Kutuyu Kapat" PLG_ENGAGEBOX_YESNO_URL_DESC="Bir URL girin" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB="Yeni Sekme Aç" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC="Yeniden yönlendirmenin yeni bir sekmede yer almasını ister misiniz?" PLG_ENGAGEBOX_YESNO_NOBUTTON="Düğme Yok" PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC="Hayır Düğmesini özelleştir" PLG_ENGAGEBOX_YESNO_BOX_LIST="Kutuyu Seç" PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC="Açılacak bir kutu seçin" PLG_ENGAGEBOX_YESNO_FOOTER="Alt bilgi metni" PLG_ENGAGEBOX_YESNO_FOOTER_DESC="İsteğe bağlı olarak, düğmelerin altında görünecek bir alt bilgi metni girin." PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE="Düğmelerin Genişliği" PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC="Düğmelerin minimum genişliği" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT="Alt metin" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC="Ana düğme metni altında görünecek bir alt metin girin" PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE="Düğmeler Yazı Boyutu" PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC="URL yeniden yönlendirmeden önce kutuyu kapat" PKAA#]�;3�%%<engagebox/yesno/language/ca-ES/ca-ES.plg_engagebox_yesno.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO_ALIAS="Si No" PLG_ENGAGEBOX_YESNO="Engage Box - Si No" PLG_ENGAGEBOX_YESNO_DESC="Encamina els teus visitants a pàgines destí amb emergents Si/No irresistibles!" PLG_ENGAGEBOX_YESNO_HEADLINE="Titular" PLG_ENGAGEBOX_YESNO_HEADLINE_DESC="Escriu el text del titular" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE="Mida de la font de la capçalera" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR="Color de la font de la capçalera" PLG_ENGAGEBOX_YESNO_YESBUTTON="Botó Si" PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC="Personalitza el botó Si" PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC="El text del botó" PLG_ENGAGEBOX_YESNO_ONCLICK="En clicar" PLG_ENGAGEBOX_YESNO_ONCLICK_DESC="Que voldries que fes quan l'usuari clica el botó?" PLG_ENGAGEBOX_YESNO_GOTOURL="Anar a l'URL" PLG_ENGAGEBOX_YESNO_OPENBOX="Obrir una caixa" PLG_ENGAGEBOX_YESNO_CLOSEBOX="Tancar caixa" PLG_ENGAGEBOX_YESNO_URL_DESC="Escriu un URL" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB="Obrir nova pestanya" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC="T'agradaria que la redirecció es fes a una nova pestanya?" PLG_ENGAGEBOX_YESNO_NOBUTTON="Botó No" PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC="Personalitza el botó no" PLG_ENGAGEBOX_YESNO_BOX_LIST="Escull caixa" PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC="Escull una caixa per obrir" PLG_ENGAGEBOX_YESNO_FOOTER="Text del peu" PLG_ENGAGEBOX_YESNO_FOOTER_DESC="Opcionalment, pots escriure un text de peu que apareixerà a tots els botons." PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE="Amplada dels botons" PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC="Amplada mínima de botons" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT="Subtext" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC="Escriu un subtext que apareixerà sota el text principal del botó" PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE="Mida de la font dels botons" PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC="Tanca la caixa abans de la redirecció URL" PKAA#] �;,<engagebox/yesno/language/es-ES/es-ES.plg_engagebox_yesno.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO_ALIAS="Si No" PLG_ENGAGEBOX_YESNO="Engage Box - Si No" PLG_ENGAGEBOX_YESNO_DESC="Concentre sus visitantes a las páginas de destino con irresistible ventanas emergentes Sí/No!" PLG_ENGAGEBOX_YESNO_HEADLINE="Titular" PLG_ENGAGEBOX_YESNO_HEADLINE_DESC="Introduzca el texto del titular" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE="Tamaño fuente del titular" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR="Color fuente del titular" PLG_ENGAGEBOX_YESNO_YESBUTTON="Botón Si" PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC="Personalizar el botón si" PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC="El texto del botón" PLG_ENGAGEBOX_YESNO_ONCLICK="Al hacer click" PLG_ENGAGEBOX_YESNO_ONCLICK_DESC="¿Qué le gustaría hacer cuando el usuario haga clic en el botón?" PLG_ENGAGEBOX_YESNO_GOTOURL="Ir a la URL" PLG_ENGAGEBOX_YESNO_OPENBOX="Abrir Caja" PLG_ENGAGEBOX_YESNO_CLOSEBOX="Cerrar Caja" PLG_ENGAGEBOX_YESNO_URL_DESC="Introduzca una URL" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB="Abrir Nueva Pestaña" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC="¿Desearía que la redirección tenga lugar en una nueva pestaña?" PLG_ENGAGEBOX_YESNO_NOBUTTON="Botón No" PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC="Personalizar el botón No" PLG_ENGAGEBOX_YESNO_BOX_LIST="Seleccionar Caja" PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC="Seleccione una caja para abrir" PLG_ENGAGEBOX_YESNO_FOOTER="Texto de pie de página" PLG_ENGAGEBOX_YESNO_FOOTER_DESC="Opcionalmente, ingrese un texto de pie de página que aparecerá debajo de los botones." PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE="Ancho de los botones" PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC="Ancho mínimo para los botones" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT="Subtexto" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC="Introduzca el subtexto que aparecerá bajo el texto principal del botón" PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE="Tamaño de fuente para los botones" PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC="Cerrar recuadro antes de redirigir a la URL" PKAA#]\_T�JJ<engagebox/yesno/language/it-IT/it-IT.plg_engagebox_yesno.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO_ALIAS="Sì No" PLG_ENGAGEBOX_YESNO="Engage Box - Sì No" PLG_ENGAGEBOX_YESNO_DESC="Attrai i tuoi visitatori su landing page con irresistibili popup Sì/No!" PLG_ENGAGEBOX_YESNO_HEADLINE="Titolo" PLG_ENGAGEBOX_YESNO_HEADLINE_DESC="Testo completo del titolo " PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE="Dimensione font titiolo" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR="Colore font titolo" PLG_ENGAGEBOX_YESNO_YESBUTTON="Pulsante Sì" PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC="Personalizza il pulsante sì" PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC="Il testo del pulsante" PLG_ENGAGEBOX_YESNO_ONCLICK="Al Clic" PLG_ENGAGEBOX_YESNO_ONCLICK_DESC="Cosa vorresti fare quando l'utente fa clic sul pulsante?" PLG_ENGAGEBOX_YESNO_GOTOURL="Vai all'URL" PLG_ENGAGEBOX_YESNO_OPENBOX="Apri riquadro" PLG_ENGAGEBOX_YESNO_CLOSEBOX="Chiudi Riquadro" PLG_ENGAGEBOX_YESNO_URL_DESC="Inserisci un URL" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB="Apri nuova scheda" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC="Vorresti che il reindirizzamento avesse luogo in una nuova scheda?" PLG_ENGAGEBOX_YESNO_NOBUTTON="Pulsante No" PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC="Personalizza il pulsante No" PLG_ENGAGEBOX_YESNO_BOX_LIST="Seleziona riquadro" PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC="Seleziona un riquadro da aprire" PLG_ENGAGEBOX_YESNO_FOOTER="Testo a piè di pagina" PLG_ENGAGEBOX_YESNO_FOOTER_DESC="Inserisci un testo a piè di pagina opzionale che apparirà sotto i pulsanti." PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE="Larghezza pulsanti" PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC="Larghezza minima pulsanti" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT="Sottotesto" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC="Inserisci un sottotesto che apparirà sotto il testo principale del pulsante" PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE="Dimensione font pulsanti" PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC="Chiudi riquadro dopo il reindirizzamento dell'URL" PKAA#]6 ����<engagebox/yesno/language/nl-NL/nl-NL.plg_engagebox_yesno.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2016 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_YESNO_ALIAS="Ja Nee" PLG_ENGAGEBOX_YESNO="Engage Box - Ja Nee" PLG_ENGAGEBOX_YESNO_DESC="Leid je bezoekers naar landingspagina's met onweerstaanbare Ja/Nee pop-ups!" PLG_ENGAGEBOX_YESNO_HEADLINE="Titel" PLG_ENGAGEBOX_YESNO_HEADLINE_DESC="Vul titeltekst in" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE="Koptekst Lettertype Grootte" PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR="Koptekst Lettertype Kleur" PLG_ENGAGEBOX_YESNO_YESBUTTON="Ja knop" PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC="Pas de Ja Knop aan" PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC="De knop tekst" PLG_ENGAGEBOX_YESNO_ONCLICK="Bij Muisklik" PLG_ENGAGEBOX_YESNO_ONCLICK_DESC="Wat wil je doen als de gebruiker op de knop klikt?" PLG_ENGAGEBOX_YESNO_GOTOURL="Ga naar URL" PLG_ENGAGEBOX_YESNO_OPENBOX="Toon Box" PLG_ENGAGEBOX_YESNO_CLOSEBOX="Sluit Box" PLG_ENGAGEBOX_YESNO_URL_DESC="Vul een URL in" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB="Open Nieuw Tabblad" PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC="Wil je de link openen in een nieuw tabblad?" PLG_ENGAGEBOX_YESNO_NOBUTTON="Nee knop" PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC="Pas de Nee Knop aan" PLG_ENGAGEBOX_YESNO_BOX_LIST="Selecteer Box" PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC="Selecteer een weer te geven box" PLG_ENGAGEBOX_YESNO_FOOTER="Footer tekst" PLG_ENGAGEBOX_YESNO_FOOTER_DESC="Vul een optionele tekst in die onder de knoppen wordt getoond." PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE="Knop Breedte" PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC="Knoppen minimum breedte" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT="Subtekst" PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC="Voer een subtekst in die verschijnt onder de tekst van de hoofdknop" PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE="Knoppen Lettertype Grootte" PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC="Sluit Box vóór URL-doorverwijzing" PKAA#]����y9y9)engagebox/yesno/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgEngageboxYesnoInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PKAA#]�|��$�$engagebox/yesno/form/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="yesno"> <fields name="yesno"> <field name="blockStart" type="nr_well" label="PLG_ENGAGEBOX_YESNO_ALIAS" description="PLG_ENGAGEBOX_YESNO_DESC" /> <field name="headline" type="editor" label="PLG_ENGAGEBOX_YESNO_HEADLINE" description="PLG_ENGAGEBOX_YESNO_HEADLINE_DESC" hint="PLG_ENGAGEBOX_YESNO_HEADLINE_DESC" filter="raw" /> <field name="headlinesize" type="nrnumber" label="PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_SIZE" description="NR_FONT_SIZE_DESC" addon="px" default="22" class="input-small" /> <field name="headlinecolor" type="color" label="PLG_ENGAGEBOX_YESNO_HEADLINE_FONT_COLOR" description="NR_COLOR_DESC" default="#888" /> <field name="buttonwidth" type="nrnumber" label="PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE" description="PLG_ENGAGEBOX_YESNO_BUTTON_MIN_SIZE_DESC" addon="px" default="100" class="input-small" step="10" /> <field name="buttontextfontsize" type="nrnumber" label="PLG_ENGAGEBOX_YESNO_BUTTON_FONT_SIZE" description="NR_FONT_SIZE_DESC" addon="px" default="16" class="input-small" /> <field name="blockEnd" type="nr_well" end="1" /> <fields name="yes"> <field name="blockStart" type="nr_well" label="PLG_ENGAGEBOX_YESNO_YESBUTTON" description="PLG_ENGAGEBOX_YESNO_YESBUTTON_DESC" /> <field name="text" type="text" label="NR_TEXT" description="PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC" hint="Yes" default="Yes" /> <field name="subtext" type="text" label="PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT" description="PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC" /> <field name="background" type="color" label="NR_BACKGROUND_COLOR" description="NR_BACKGROUND_COLOR_DESC" default="#2ec664" position="bottom" /> <field name="color" type="color" label="NR_TEXT_COLOR" description="NR_COLOR_DESC" position="bottom" default="#fff" /> <field name="click" type="list" label="PLG_ENGAGEBOX_YESNO_ONCLICK" description="PLG_ENGAGEBOX_YESNO_ONCLICK_DESC" class="btn-group btn-group-yesno" default="url"> <option value="url">PLG_ENGAGEBOX_YESNO_GOTOURL</option> <option value="open">PLG_ENGAGEBOX_YESNO_OPENBOX</option> <option value="close">PLG_ENGAGEBOX_YESNO_CLOSEBOX</option> </field> <field name="box" type="boxes" label="PLG_ENGAGEBOX_YESNO_BOX_LIST" description="PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC" showon="click:open" excludeeditingbox="true" /> <field name="url" type="url" label="NR_URL" description="PLG_ENGAGEBOX_YESNO_URL_DESC" class="input-xxlarge" showon="click:url" hint="http://" /> <field name="newtab" type="nrtoggle" label="PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB" description="PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC" showon="click:url" /> <field name="close" type="nrtoggle" label="PLG_ENGAGEBOX_YESNO_CLOSEBOX" description="PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC" checked="true" showon="click:url"/> <field name="blockEnd" type="nr_well" end="1" /> </fields> <fields name="no"> <field name="blockStart" type="nr_well" label="PLG_ENGAGEBOX_YESNO_NOBUTTON" description="PLG_ENGAGEBOX_YESNO_NOBUTTON_DESC" /> <field name="show" type="nrtoggle" label="JSHOW" checked="true" /> <field name="text" type="text" label="NR_TEXT" description="PLG_ENGAGEBOX_YESNO_BUTTON_TEXT_DESC" hint="No" default="No" showon="show:1" /> <field name="subtext" type="text" label="PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT" description="PLG_ENGAGEBOX_YESNO_BUTTON_SUBTEXT_DESC" showon="show:1" /> <field name="background" type="color" label="NR_BACKGROUND_COLOR" description="NR_BACKGROUND_COLOR_DESC" default="#ef2345" position="bottom" showon="show:1" /> <field name="color" type="color" label="NR_TEXT_COLOR" description="NR_COLOR_DESC" position="bottom" default="#fff" showon="show:1" /> <field name="click" type="list" label="PLG_ENGAGEBOX_YESNO_ONCLICK" description="PLG_ENGAGEBOX_YESNO_ONCLICK_DESC" default="close" showon="show:1"> <option value="url">PLG_ENGAGEBOX_YESNO_GOTOURL</option> <option value="open">PLG_ENGAGEBOX_YESNO_OPENBOX</option> <option value="close">PLG_ENGAGEBOX_YESNO_CLOSEBOX</option> </field> <field name="box" type="boxes" label="PLG_ENGAGEBOX_YESNO_BOX_LIST" description="PLG_ENGAGEBOX_YESNO_BOX_LIST_DESC" showon="click:open[AND]show:1" excludeeditingbox="true" /> <field name="url" type="url" label="NR_URL" description="PLG_ENGAGEBOX_YESNO_URL_DESC" class="input-large" showon="click:url[AND]show:1" hint="http://" /> <field name="newtab" type="radio" label="PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB" description="PLG_ENGAGEBOX_YESNO_OPEN_NEW_TAB_DESC" class="switcher btn-group btn-group-yesno" default="0" showon="click:url[AND]show:1"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="close" type="radio" label="PLG_ENGAGEBOX_YESNO_CLOSEBOX" description="PLG_ENGAGEBOX_YESNO_CLOSEBOX_DESC" class="switcher btn-group btn-group-yesno" default="1" showon="click:url[AND]show:1"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="blockEnd" type="nr_well" end="1" /> </fields> <field name="blockFooterStart" type="nr_well" label="PLG_ENGAGEBOX_YESNO_FOOTER" description="PLG_ENGAGEBOX_YESNO_FOOTER_DESC" /> <field name="footer" type="textarea" label="NR_TEXT" description="PLG_ENGAGEBOX_YESNO_FOOTER_DESC" hint="PLG_ENGAGEBOX_YESNO_FOOTER_DESC" class="span12" rows="5" /> <field name="footersize" type="nrnumber" label="NR_FONT_SIZE" description="NR_FONT_SIZE_DESC" addon="px" default="14" class="input-small" min="1" step="2" /> <field name="footercolor" type="color" label="NR_FONT_COLOR" description="NR_COLOR_DESC" default="#999" /> <field name="blockFooterEnd" type="nr_well" end="1" /> </fields> </fieldset> </form>PKAA#]��`��engagebox/yesno/tmpl/button.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); if (isset($button->show) && !$button->show) { return; } // Close box on redirection? Defaults to Yes. $button->close = !isset($button->close) ? true : (bool) $button->close; ?> <a <?php if ($button->click == "url") { ?> <?php if ($button->close) { ?> data-ebox-prevent="0" data-ebox-cmd="close" <?php } ?> target="<?php echo $button->newtab ? "_blank" : "_self" ?>" href="<?php echo $button->url ?>" rel="noopener" <?php } ?> <?php if ($button->click == "open") { ?> data-ebox-cmd="open" data-ebox="<?php echo $button->box; ?>" href="#" <?php } ?> <?php if ($button->click == "close") { ?> data-ebox-cmd="close" href="#" <?php } ?> <?php $styles = implode(';', array( "background-color:" . $button->background, "color:" . $button->color, "min-width:" . (int) $yesno->get("buttonwidth", "100") . "px" )); ?> class="ebox-ys-btn" style="<?php echo $styles; ?>"> <?php echo $button->text ?> <?php if (isset($button->subtext) && !empty($button->subtext)) { ?> <span class="ebox-ys-subtext"><?php echo $button->subtext ?></span> <?php } ?> </a>PKAA#] ���� engagebox/yesno/tmpl/default.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); use Joomla\Registry\Registry; $yesno = new Registry($box->params->get("yesno")); $buttons = array( $yesno->get("yes"), $yesno->get("no") ); $headline = $yesno->get("headline"); $footer = $yesno->get("footer"); JHtml::stylesheet('plg_engagebox_yesno/styles.css', ['relative' => true, 'version' => 'auto']); ?> <div class="ebox-yes-no"> <div class="ebox-yn-text"> <?php if (!empty($headline)) { ?> <?php $headlineStyles = implode(";", array( "font-size:" . $yesno->get("headlinesize") . "px", "color:" . $yesno->get("headlinecolor") )); ?> <div class="ebox-yn-headline" style="<?php echo $headlineStyles ?>"> <?php echo $headline; ?> </div> <?php } ?> </div> <div class="ebox-ys-buttons" style="font-size: <?php echo (int) $yesno->get('buttontextfontsize', '16'); ?>px;"> <?php $button_layout_path = JPluginHelper::getLayoutPath('engagebox', 'yesno', 'button'); foreach ($buttons as $key => $button) { include $button_layout_path; } ?> </div> <?php if (!empty($footer)) { $footerStyles = implode(";", array( "font-size:" . $yesno->get("footersize", "11") . "px", "color:" . $yesno->get("footercolor", "#ccc") )); ?> <div class="ebox-ys-footer" style="<?php echo $footerStyles ?>"> <?php echo $footer; ?> </div> <?php } ?> </div>PKAA#]�0�==!engagebox/emailform/emailform.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="engagebox" method="upgrade"> <name>PLG_ENGAGEBOX_EMAILFORM</name> <description>PLG_ENGAGEBOX_EMAILFORM_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c) 2018 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>January 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <folder>form</folder> <folder>tmpl</folder> <filename plugin="emailform">emailform.php</filename> <filename>script.install.helper.php</filename> </files> </extension>PKAA#]�fL��!engagebox/emailform/emailform.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgEngageBoxEmailForm extends EngageBox\Plugin { protected $name = 'emailform'; }PKAA#]j���}9}9-engagebox/emailform/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgEngageboxEmailformInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PKAA#]4���nnHengagebox/emailform/language/en-GB/en-GB.plg_engagebox_emailform.sys.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_EMAILFORM="EngageBox - Email Subscription Form" PLG_ENGAGEBOX_EMAILFORM_DESC="Create email subscription popups and grow your list faster!"PKAA#]UappDengagebox/emailform/language/en-GB/en-GB.plg_engagebox_emailform.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_EMAILFORM_ALIAS="Email Subscription Form" PLG_ENGAGEBOX_EMAILFORM="EngageBox - Email Subscription Form" PLG_ENGAGEBOX_EMAILFORM_DESC="Create email subscription popups and grow your list faster!" PLG_ENGAGEBOX_EMAILFORM_FIELDS="Fields" PLG_ENGAGEBOX_EMAILFORM_FIELDS_DESC="Setup form fields" PLG_ENGAGEBOX_EMAILFORM_BUTTON="Form Button" PLG_ENGAGEBOX_EMAILFORM_BUTTON_DESC="Setup form button"PKAA#]���L��&engagebox/emailform/script.install.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgEngageBoxEmailFormInstallerScript extends PlgEngageBoxEmailFormInstallerScriptHelper { public $name = 'PLG_ENGAGEBOX_EMAILFORM'; public $alias = 'emailform'; public $extension_type = 'plugin'; public $plugin_folder = "engagebox"; public $show_message = false; } PKAA#]�5�cc!engagebox/emailform/form/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="emailform"> <field name="blockStart" type="nr_well" label="PLG_ENGAGEBOX_EMAILFORM_ALIAS" description="PLG_ENGAGEBOX_EMAILFORM_DESC" /> <field name="mc_url" type="url" class="input-xxlarge" label="COM_RSTBOX_ITEM_EMAIL_URL" description="COM_RSTBOX_ITEM_EMAIL_URL_DESC" hint="http://" size="40" /> <field name="formtarget" type="list" label="COM_RSTBOX_FORMACTION" default="_self" class="btn-group btn-group-yesno" description="COM_RSTBOX_FORMACTION_DESC"> <option value="_self">Self</option> <option value="_blank">Blank</option> </field> <field name="mc_showlabels" type="list" default="1" label="COM_RSTBOX_ITEM_LABELS_STYLE" description="COM_RSTBOX_ITEM_LABELS_STYLE"> <option value="0">COM_RSTBOX_ITEM_LABELS_STYLE_NORMAL</option> <option value="1">COM_RSTBOX_ITEM_LABELS_STYLE_PLACEHOLDER</option> <option value="2">COM_RSTBOX_ITEM_LABELS_STYLE_BOTH</option> </field> <field name="formorient" type="list" default="ver" label="NR_FORM_ORIENTATION" description="NR_FORM_ORIENTATION_DESC"> <option value="ver">NR_VERTICAL</option> <option value="hor">NR_HORIZONTAL</option> </field> <field name="blockEnd" type="nr_well" end="1" /> <field name="blockFieldsStart" type="nr_well" label="PLG_ENGAGEBOX_EMAILFORM_FIELDS" description="PLG_ENGAGEBOX_EMAILFORM_FIELDS_DESC" /> <field type="spacer" name="merge00" label="COM_RSTBOX_ITEM_FIELD_EMAIL" class="h3" /> <field name="mc_email_namefield" label="COM_RSTBOX_ITEM_FIELD_NAME" size="40" default="email" /> <field name="mc_email_name" label="COM_RSTBOX_ITEM_FIELD_LABEL" size="40" default="Email address" /> <field type="spacer" name="merge1" label="COM_RSTBOX_ITEM_FIELD1" class="h3" /> <field name="mc_merge1_active" type="nrtoggle" label="COM_RSTBOX_ITEM_FIELD_ACTIVE" /> <field name="mc_merge1_required" type="nrtoggle" label="COM_RSTBOX_ITEM_FIELD_REQUIRED" showon="mc_merge1_active:1" /> <field name="mc_merge1_type" type="list" default="0" showon="mc_merge1_active:1" label="COM_RSTBOX_ITEM_FIELD_TYPE"> <option value="text">COM_RSTBOX_ITEM_FIELD_TYPE_TEXT</option> <option value="checkbox">COM_RSTBOX_ITEM_FIELD_TYPE_CHECKBOX</option> <option value="hidden">COM_RSTBOX_ITEM_FIELD_TYPE_HIDDEN</option> </field> <field name="mc_merge1_name" showon="mc_merge1_active:1" label="COM_RSTBOX_ITEM_FIELD_NAME" size="40" /> <field name="mc_merge1_label" type="text" showon="mc_merge1_active:1" label="COM_RSTBOX_ITEM_FIELD_LABEL" size="40" /> <field name="mc_merge1_value" showon="mc_merge1_active:1" label="COM_RSTBOX_ITEM_FIELD_VALUE" size="40" /> <field type="spacer" name="merge2" label="COM_RSTBOX_ITEM_FIELD2" class="h3" /> <field name="mc_merge2_active" type="nrtoggle" label="COM_RSTBOX_ITEM_FIELD_ACTIVE" /> <field name="mc_merge2_required" type="nrtoggle" label="COM_RSTBOX_ITEM_FIELD_REQUIRED" showon="mc_merge2_active:1" /> <field name="mc_merge2_type" type="list" showon="mc_merge2_active:1" default="0" label="COM_RSTBOX_ITEM_FIELD_TYPE"> <option value="text">COM_RSTBOX_ITEM_FIELD_TYPE_TEXT</option> <option value="checkbox">COM_RSTBOX_ITEM_FIELD_TYPE_CHECKBOX</option> <option value="hidden">COM_RSTBOX_ITEM_FIELD_TYPE_HIDDEN</option> </field> <field name="mc_merge2_name" showon="mc_merge2_active:1" label="COM_RSTBOX_ITEM_FIELD_NAME" size="40" /> <field name="mc_merge2_label" type="text" showon="mc_merge2_active:1" label="COM_RSTBOX_ITEM_FIELD_LABEL" size="40" /> <field name="mc_merge2_value" showon="mc_merge2_active:1" label="COM_RSTBOX_ITEM_FIELD_VALUE" size="40" /> <field name="blockFieldsEnd" type="nr_well" end="1" /> <field name="blockButtonStart" type="nr_well" label="PLG_ENGAGEBOX_EMAILFORM_BUTTON" description="PLG_ENGAGEBOX_EMAILFORM_BUTTON_DESC" /> <field name="mc_submit" type="text" default="Sign up" label="COM_RSTBOX_ITEM_FIELD_LABEL" /> <field name="mc_submit_bg" type="color" format="rgba" keywords="none, transparent" default="rgba(93, 183, 93, 1)" label="NR_BACKGROUND_COLOR" description="NR_BACKGROUND_COLOR_DESC" /> <field name="mc_submit_color" type="color" format="rgb" default="rgba(255, 255, 255, 1)" label="NR_TEXT_COLOR" description="NR_COLOR_DESC" /> <field name="mc_submit_set_cookie" type="nrtoggle" label="COM_RSTBOX_SUBMIT_COOKIE" description="COM_RSTBOX_SUBMIT_COOKIE_DESC" checked="true" /> <field name="blockButtonEnd" type="nr_well" end="1" /> <field name="blockTextStart" type="nr_well" label="COM_RSTBOX_TEXT" description="COM_RSTBOX_TEXT_DESC" /> <field name="mc_header" type="editor" filter="raw" label="COM_RSTBOX_TEXT" buttons="true" description="COM_RSTBOX_TEXT_DESC" /> <field name="blockTextEnd" type="nr_well" end="1" /> </fieldset> </form>PKAA#]�����$engagebox/emailform/tmpl/default.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); $params = $box->params; $form_labels = $params->get("mc_showlabels"); $form_labels_show = (($form_labels=="0") || ($form_labels=="2")) ? true : false; $form_placeholders = (($form_labels=="1") || ($form_labels=="2")) ? true : false; $btn_style = array( "background-color:".$params->get("mc_submit_bg", "#5db75d"), "color:".$params->get("mc_submit_color", "#fff") ); /* Prepare Fields Array */ $mail = new stdclass; $mail->name = $params->get("mc_email_namefield"); $mail->type = "email"; $mail->label = $params->get("mc_email_name"); $mail->value = null; $mail->required = true; $mail->active = true; $field1 = new stdclass; $field1->name = $params->get("mc_merge1_name"); $field1->type = $params->get("mc_merge1_type"); $field1->label = $params->get("mc_merge1_label"); $field1->value = $params->get("mc_merge1_value"); $field1->required = $params->get("mc_merge1_required"); $field1->active = $params->get("mc_merge1_active"); $field2 = new stdclass; $field2->name = $params->get("mc_merge2_name"); $field2->type = $params->get("mc_merge2_type"); $field2->label = $params->get("mc_merge2_label"); $field2->value = $params->get("mc_merge2_value"); $field2->required = $params->get("mc_merge2_required"); $field2->active = $params->get("mc_merge2_active"); $fields = array($mail, $field1, $field2); $formname = "mcform-".$box->id; if ($params->get("mc_submit_set_cookie", true)) { JFactory::getDocument()->addScriptDeclaration(' document.addEventListener("DOMContentLoaded", function() { document.querySelector("#'. $formname .'").addEventListener("submit", function() { EngageBox.getInstance(' . $box->id . ').close(); }); }); '); } ?> <form action="<?php echo $params->get("mc_url"); ?>" class="eb" method="post" id="<?php echo $formname ?>" name="<?php echo $formname ?>" target="<?php echo $params->get("formtarget", "_self") ?>"> <?php if ($params->get("mc_header", false)) { ?> <div class="eb-form-header"><?php echo $params->get("mc_header") ?></div> <?php } ?> <?php foreach ($fields as $field) { ?> <?php if ($field->active) { ?> <div class="eb-field-row"> <?php if ($field->type == "checkbox") { ?> <input type="checkbox" name="<?php echo $field->name ?>" id="<?php echo $field->name ?>" value="<?php echo $field->value ?>" <?php echo ($field->required) ? "required" : "" ?>> <?php if (!$form_labels_show) { ?> <label for="<?php echo $field->name ?>"><?php echo $field->label ?></label> <?php } ?> <?php } ?> <?php if ($form_labels_show) { ?> <label for="<?php echo $field->name ?>"><?php echo $field->label ?></label> <?php } ?> <?php if ($field->type != "checkbox") { ?> <input class="eb-input" type="<?php echo $field->type ?>" name="<?php echo $field->name ?>" <?php if ($form_placeholders) { ?> placeholder="<?php echo $field->label ?>" <?php } ?> id="<?php echo $field->name ?>" value="<?php echo $field->value ?>" <?php echo ($field->required) ? "required" : "" ?>> <?php } ?> </div> <?php } ?> <?php } ?> <div class="eb-footer"> <button class="eb-btn" type="submit" name="subscribe" style="<?php echo implode(";", $btn_style) ?>"> <?php echo $box->params->get("mc_submit") ?> </button> </div> </form>PKAA#]=�~��$engagebox/actions/script.install.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgEngageBoxActionsInstallerScript extends PlgEngageBoxActionsInstallerScriptHelper { public $name = 'PLG_ENGAGEBOX_ACTIONS'; public $alias = 'actions'; public $extension_type = 'plugin'; public $plugin_folder = 'engagebox'; public $show_message = false; } PKAA#]#�[@engagebox/actions/language/en-GB/en-GB.plg_engagebox_actions.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2020 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_ACTIONS_NAME="Actions" PLG_ENGAGEBOX_ACTIONS="EngageBox - Actions" PLG_ENGAGEBOX_ACTIONS_DESC="Actions allow you to control easily what happens when a certain box event fires. In EngageBox, every box fires certain types of events like Open and Close. An Action listens to those events and gets executed when the specified event is occured." PLG_ENGAGEBOX_ACTIONS_FIELDSET_DESC="EngageBox fires certain types of events in the browser like Open and Close. An Action listens to those events and gets executed when the specified event is occured." PLG_ENGAGEBOX_ACTIONS_WHEN="Event" PLG_ENGAGEBOX_ACTIONS_WHEN_DESC="Select the event of this box that will fire the specified action.<br><br><b>Before Open: </b>Fires before the box opens. Use it to cancel open by returning false in a script.<br><b>Open:</b> Fires when the box is about to open and the animation starts.<br><b>After Open:</b> Fires when the box is fully opened and the animation has ended.<br><b>Before Close: </b>Fires before the box closes. Use it to cancel close by returning false in a script.<br><b>Close:</b> Fires when the box is about to close and the animation starts.<br><b>After Close:</b> Fires when the box is fully closed and the animation has ended." PLG_ENGAGEBOX_ACTIONS_DO="Action" PLG_ENGAGEBOX_ACTIONS_DO_DESC="Select the action to execute when the specified event fires." PLG_ENGAGEBOX_ACTIONS_OPEN="Open" PLG_ENGAGEBOX_ACTIONS_BEFORE_OPEN="Before Open" PLG_ENGAGEBOX_ACTIONS_AFTER_OPEN="After Open" PLG_ENGAGEBOX_ACTIONS_CLOSE="Close" PLG_ENGAGEBOX_ACTIONS_BEFORE_CLOSE="Before Close" PLG_ENGAGEBOX_ACTIONS_AFTER_CLOSE="After Close" PLG_ENGAGEBOX_ACTIONS_SELECT_EVENT="- Select Event -" PLG_ENGAGEBOX_ACTIONS_SELECT_ACTION="- Select Action -" PLG_ENGAGEBOX_ACTIONS_OPEN_BOX="Open a Box" PLG_ENGAGEBOX_ACTIONS_CLOSE_BOX="Close a Box" PLG_ENGAGEBOX_ACTIONS_CLOSE_ALL="Close all opened Boxes" PLG_ENGAGEBOX_ACTIONS_DESTROY_BOX="Destroy a Box" PLG_ENGAGEBOX_ACTIONS_GO_TO_URL="Redirect to a URL" PLG_ENGAGEBOX_ACTIONS_CUSTOM_JS="Run Javascript" PLG_ENGAGEBOX_ACTIONS_BOX_DESC="Select the box to apply the action to." PLG_ENGAGEBOX_ACTIONS_ENABLED_DESC="Enable or disable this action." PLG_ENGAGEBOX_ACTIONS_JS="Javascript" PLG_ENGAGEBOX_ACTIONS_JS_CODE="Enter the Javascript code to execute. Do not include <script> tags. Use <b>me</b> variable to access current box's instance." PLG_ENGAGEBOX_ACTIONS_URL_DESC="Set the URL to redirect the visitor to. <br><br>You can create dynamic URLs using Smart Tags. Example: <b>{url}?box_closed=true</b> or <b>{site.url}?user={user.id}</b>." PLG_ENGAGEBOX_ACTIONS_NEW_TAB="Open in new tab" PLG_ENGAGEBOX_ACTIONS_NEW_TAB_DESC="Enable to redirect in a new tab." PLG_ENGAGEBOX_ACTIONS_DELAY_DESC="Optionally, delay the execution of the specified Action." PLG_ENGAGEBOX_ACTIONS_RELOAD_PAGE="Reload Page"PKAA#]�&�kDengagebox/actions/language/en-GB/en-GB.plg_engagebox_actions.sys.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2020 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_ACTIONS="EngageBox - Actions" PLG_ENGAGEBOX_ACTIONS_DESC="Actions allow you to control easily what happens when a certain box event fires. In EngageBox, every box fires certain types of events like Open and Close. An Action listens to those events and gets executed when the specified event is occured."PKAA#]+Y��engagebox/actions/actions.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); use Joomla\Registry\Registry; class plgEngageBoxActions extends JPlugin { /** * Action object * * @var object */ protected $action; /** * Auto load plugin's language file * * @var boolean */ protected $autoloadLanguage = true; /** * Add PHP Scripts form into the box editing page * * @param object $form * * @return void */ public function onContentPrepareForm($form) { if ($form->getName() != 'com_rstbox.item') { return; } $form->addFieldPath(__DIR__ . '/form/fields'); $form->loadFile(__DIR__ . '/form/form.xml', false); } /** * The BeforeRender event fires before the box's layout is ready. * * @param object $box The box's settings object * * @return void */ public function onEngageBoxBeforeRender($box) { if (!$actions = $box->params->get('actions')) { return; } $js = ''; foreach ($actions as $action) { $this->action = new Registry($action); // Make sure the action is enabled if (!$this->action->get('enabled', true)) { continue; } // Validate we have a valid event type if (!$this->action->get('when')) { continue; } // Validate action does exist $actionMethod = '_' . $this->action->get('do'); if (!method_exists($this, $actionMethod)) { continue; } // Convert delay from sec to millsec. $this->action->set('delay', $this->action->get('delay', 0) * 1000); // Get action's script if (!$method_result = $this->$actionMethod()) { continue; } // Wrap the code with the event listener block $method_result = 'me.on("' . $this->action['when'] . '", function() { ' . $method_result . ' });'; // Anonymise code block $js .= $this->anonymise($method_result); } if (empty($js)) { return; } $js = ' <!-- EngageBox #' . $box->id . ' Actions Start --> ' . $this->anonymise(' if (!EngageBox) { return; } EngageBox.onReady(function() { var me = EngageBox.getInstance(' . $box->id . '); if (!me) { return; } ' . $js . ' }); ') . ' <!-- EngageBox #' . $box->id . ' Actions End --> '; JFactory::getDocument()->addScriptDeclaration($js); } /** * The script for the "Open a Box" action. It opens the specified the box. * * @return string */ private function _OpenBox() { if (!$this->action['box']) { return; } return $this->delayFunction('EngageBox.getInstance(' . $this->action['box'] . ').open();'); } /** * The script for the "Close a Box" action. It closes the specified the box. * * @return string */ private function _CloseBox() { if (!$this->action['box']) { return; } return $this->delayFunction('EngageBox.getInstance(' . $this->action['box'] . ').close();'); } /** * The script for the "Close all opened Boxes" action. It used the closeAll() static method to close all boxes. * * @return string */ private function _CloseAll() { return 'EngageBox.closeAll();'; } /** * The script for the "Destroy Box" action. It destroys the box instance. * * @return string */ private function _DestroyBox() { if (!$this->action['box']) { return; } return 'EngageBox.getInstance(' . $this->action['box'] . ').destroy();'; } /** * The script for the "Redirect to a URL" action. It redirects the visitor to a URL. * * @return string */ private function _GoToURL() { $target = $this->action->get('newtab', false) ? '_blank' : '_self'; return 'window.open("' . $this->action['url'] . '", "' . $target . '")'; } /** * The script for the "Reload Page" action. * * @return string */ private function _ReloadPage() { return 'location.reload();'; } /** * The script for the "Run Javascript" action. It executes the custom Javascript code specified by the administrator. * * @return string */ private function _Custom() { return $this->action['customcode']; } /** * Execute code block with a delay * * @param string $function * * @return string */ private function delayFunction($function) { $delay = $this->action['delay']; if ($delay == 0) { return $function; } return 'setTimeout(function() { ' . $function . ' }, ' . $delay . ');'; } /** * Protect code scope by wrapping it with an anonymous fuction * * @param string $string The code to anonymise * * @return string */ private function anonymise($string) { // Keep the new line character inside return for code presentation purposes. return ' !(function() { ' . $string . ' })();'; } }PKAA#]��z��engagebox/actions/form/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="actions" label="PLG_ENGAGEBOX_ACTIONS_NAME" description="PLG_ENGAGEBOX_ACTIONS_FIELDSET_DESC" tag="params" help="https://www.tassos.gr/joomla-extensions/engagebox/docs/working-with-actions"> <field name="actions" type="ebactions" label="PLG_ENGAGEBOX_ACTIONS_NAME" hiddenLabel="true" multiple="true"> <form> <field name="enabled" type="nrtoggle" label="JENABLED" description="PLG_ENGAGEBOX_ACTIONS_ENABLED_DESC" checked="true" /> <field name="when" type="list" label="PLG_ENGAGEBOX_ACTIONS_WHEN" description="PLG_ENGAGEBOX_ACTIONS_WHEN_DESC" required="true"> <option disabled="disabled" value="">PLG_ENGAGEBOX_ACTIONS_SELECT_EVENT</option> <option value="beforeOpen">PLG_ENGAGEBOX_ACTIONS_BEFORE_OPEN</option> <option value="open">PLG_ENGAGEBOX_ACTIONS_OPEN</option> <option value="afterOpen">PLG_ENGAGEBOX_ACTIONS_AFTER_OPEN</option> <option value="beforeClose">PLG_ENGAGEBOX_ACTIONS_BEFORE_CLOSE</option> <option value="close">PLG_ENGAGEBOX_ACTIONS_CLOSE</option> <option value="afterClose">PLG_ENGAGEBOX_ACTIONS_AFTER_CLOSE</option> </field> <field name="do" type="groupedlist" label="PLG_ENGAGEBOX_ACTIONS_DO" description="PLG_ENGAGEBOX_ACTIONS_DO_DESC" required="true"> <option disabled="disabled" value="">PLG_ENGAGEBOX_ACTIONS_SELECT_ACTION</option> <group label="Box"> <option value="openbox">PLG_ENGAGEBOX_ACTIONS_OPEN_BOX</option> <option value="closebox">PLG_ENGAGEBOX_ACTIONS_CLOSE_BOX</option> <option value="destroybox">PLG_ENGAGEBOX_ACTIONS_DESTROY_BOX</option> <option value="closeall">PLG_ENGAGEBOX_ACTIONS_CLOSE_ALL</option> </group> <group label="Other"> <option value="gotourl">PLG_ENGAGEBOX_ACTIONS_GO_TO_URL</option> <option value="reloadpage">PLG_ENGAGEBOX_ACTIONS_RELOAD_PAGE</option> <option value="custom">PLG_ENGAGEBOX_ACTIONS_CUSTOM_JS</option> </group> </field> <field name="box" type="boxes" label="COM_RSTBOX_BOX" description="PLG_ENGAGEBOX_ACTIONS_BOX_DESC" showon="do:openbox,closebox,destroybox"> <option value="" disabled="disabled">COM_ENGAGEBOX_SELECT_BOX</option> </field> <field name="delay" type="nrnumber" label="COM_RSTBOX_ITEM_TRIGGER_DELAY" description="PLG_ENGAGEBOX_ACTIONS_DELAY_DESC" default="0" hint="0" addon="sec" min="0" filter="intval" class="input-mini" showon="do:openbox,closebox" /> <field name="customcode" type="textarea" label="PLG_ENGAGEBOX_ACTIONS_JS" description="PLG_ENGAGEBOX_ACTIONS_JS_CODE" filter="raw" rows="7" class="span12 input-full" showon="do:custom" hint='var message = 10; alert(message);' /> <field name="note1" type="note" description='Do more with the <a href="https://www.tassos.gr/joomla-extensions/engagebox/docs/engagebox-javascript-api-2" target="_blank">EngageBox Javascript API</a>' class="note" showon="do:custom" /> <field name="url" type="url" label="NR_URL" description="PLG_ENGAGEBOX_ACTIONS_URL_DESC" hint="https://" showon="do:gotourl" class="input-xxlarge" /> <field name="newtab" type="nrtoggle" label="PLG_ENGAGEBOX_ACTIONS_NEW_TAB" description="PLG_ENGAGEBOX_ACTIONS_NEW_TAB_DESC" showon="do:gotourl" /> </form> </field> </fieldset> </form>PKAA#]�/>gbb+engagebox/actions/form/fields/ebactions.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); JFormHelper::loadFieldClass('subform'); class JFormFieldEBActions extends JFormFieldSubform { /** * Method to get a list of options for a list input. * * @return array An array of JHtml options. */ protected function getInput() { JHtml::stylesheet('plg_engagebox_actions/styles.css', ['relative' => true, 'version' => 'auto']); return '<div class="eb-actions"> ' . parent::getInput() . '</div>'; } }PKAA#]���~~engagebox/actions/actions.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="engagebox" method="upgrade"> <name>PLG_ENGAGEBOX_ACTIONS</name> <description>PLG_ENGAGEBOX_ACTIONS_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c) 2020 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>February 2020</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <folder>form</folder> <filename plugin="actions">actions.php</filename> <filename>script.install.helper.php</filename> </files> <media folder="media" destination="plg_engagebox_actions"> <folder>css</folder> </media> </extension>PKAA#]+~��{9{9+engagebox/actions/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgEngageboxActionsInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PKAA#]!P���>engagebox/module/language/en-GB/en-GB.plg_engagebox_module.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_MODULE_ALIAS="Existing Module" PLG_ENGAGEBOX_MODULE="EngageBox - Existing Module" PLG_ENGAGEBOX_MODULE_DESC="Transform an existing Joomla! module into a popup box."PKAA#]!P���Bengagebox/module/language/en-GB/en-GB.plg_engagebox_module.sys.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_ENGAGEBOX_MODULE_ALIAS="Existing Module" PLG_ENGAGEBOX_MODULE="EngageBox - Existing Module" PLG_ENGAGEBOX_MODULE_DESC="Transform an existing Joomla! module into a popup box."PKAA#]b����engagebox/module/module.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2020 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); class plgEngageBoxModule extends EngageBox\Plugin { protected $name = 'module'; }PKAA#]0)�T11engagebox/module/module.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4.0" type="plugin" group="engagebox" method="upgrade"> <name>PLG_ENGAGEBOX_MODULE</name> <description>PLG_ENGAGEBOX_MODULE_DESC</description> <version>1.0</version> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <copyright>Copyright (c) 2018 Tassos Marinos</copyright> <license>GNU General Public License version 3, or later</license> <creationDate>January 2017</creationDate> <scriptfile>script.install.php</scriptfile> <files> <folder>language</folder> <folder>form</folder> <folder>tmpl</folder> <filename plugin="module">module.php</filename> <filename>script.install.helper.php</filename> </files> </extension>PKAA#]�w#4z9z9*engagebox/module/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgEngageboxModuleInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PKAA#]������#engagebox/module/script.install.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgEngageBoxModuleInstallerScript extends PlgEngageBoxModuleInstallerScriptHelper { public $name = 'PLG_ENGAGEBOX_MODULE'; public $alias = 'module'; public $extension_type = 'plugin'; public $plugin_folder = "engagebox"; public $show_message = false; } PKAA#]��ʽ��!engagebox/module/tmpl/default.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); echo $box->params->get("modulepretext"); echo NRFramework\Functions::loadModule($box->params->get("moduleid"));PKAA#]�_u99*engagebox/module/form/fields/ebmodules.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); JFormHelper::loadFieldClass('modules'); class JFormFieldEBModules extends JFormFieldModules { protected function getInput() { $modalName = 'modal_' . $this->id; JFactory::getDocument()->addScriptDeclaration(' jQuery(function($) { $("#' . $modalName . '").on("shown.bs.modal", function() { var moduleID = $("#' . $this->id . '").val(); var url = "' . JURI::base() . 'index.php?option=com_modules&view=module&task=module.edit&layout=modal&tmpl=component&id=" + moduleID; $("#' . $modalName . ' iframe").attr("src", url); }) }); '); $options = [ 'title' => JText::_('JLIB_HTML_EDIT_MODULE'), 'url' => '#', 'height' => '400px', 'width' => '800px', 'backdrop' => 'static', 'bodyHeight' => '70', 'modalWidth' => '70', 'footer' => '<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" data-dismiss="modal" aria-hidden="true">' . JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button> <button type="button" class="btn btn-primary" aria-hidden="true" <button type="button" class="btn btn-success" aria-hidden="true" onclick="jQuery(\'#' . $modalName . ' iframe\').contents().find(\'#applyBtn\').click();">' . JText::_('JAPPLY') . '</button>', ]; echo JHtml::_('bootstrap.renderModal', $modalName, $options); return parent::getInput() . '<a class="btn btn-small btn-secondary editModule" data-bs-toggle="modal" data-toggle="modal" data-bs-target="#'. $modalName .'" href="#'. $modalName .'"> <span class="icon-edit"></span> ' . JText::_('JLIB_HTML_EDIT_MODULE') . ' </a>'; } }PKAA#]@�ڿHHengagebox/module/form/form.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fieldset name="module" addfieldpath="plugins/engagebox/module/form/fields"> <field name="blockStart" type="nr_well" label="PLG_ENGAGEBOX_MODULE_ALIAS" description="PLG_ENGAGEBOX_MODULE_DESC" /> <field name="moduleid" type="ebmodules" label="COM_RSTBOX_ITEM_MODULEID" description="COM_RSTBOX_ITEM_MODULEID_DESC" showselect="false" client="0" /> <field name="modulepretext" type="editor" label="COM_RSTBOX_TEXT" description="COM_RSTBOX_TEXT_DESC" rows="5" cols="40" buttons="true" filter="raw" /> <field name="blockEnd" type="nr_well" end="1" /> </fieldset> </form>PKAA#]p9�MM+system/schedulerunner/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.schedulerunner * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\ScheduleRunner\Extension\ScheduleRunner; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new ScheduleRunner( $dispatcher, (array) PluginHelper::getPlugin('system', 'schedulerunner') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PKAA#] %|�116system/schedulerunner/src/Extension/ScheduleRunner.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.schedulerunner * * @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\ScheduleRunner\Extension; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\Form\Form; use Joomla\CMS\Log\Log; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Router\Route; use Joomla\CMS\Session\Session; use Joomla\CMS\Table\Extension; use Joomla\CMS\User\UserHelper; use Joomla\Component\Scheduler\Administrator\Model\TasksModel; use Joomla\Component\Scheduler\Administrator\Scheduler\Scheduler; use Joomla\Component\Scheduler\Administrator\Task\Task; use Joomla\Event\Event; use Joomla\Event\EventInterface; use Joomla\Event\SubscriberInterface; use Joomla\Registry\Registry; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * This plugin implements listeners to support a visitor-triggered lazy-scheduling pattern. * If `com_scheduler` is installed/enabled and its configuration allows unprotected lazy scheduling, this plugin * injects into each response with an HTML context a JS file {@see PlgSystemScheduleRunner::injectScheduleRunner()} that * sets up an AJAX callback to trigger the scheduler {@see PlgSystemScheduleRunner::runScheduler()}. This is achieved * through a call to the `com_ajax` component. * Also supports the scheduler component configuration form through auto-generation of the webcron key and injection * of JS of usability enhancement. * * @since 4.1.0 */ final class ScheduleRunner extends CMSPlugin implements SubscriberInterface { /** * Length of auto-generated webcron key. * * @var integer * @since 4.1.0 */ private const WEBCRON_KEY_LENGTH = 20; /** * @inheritDoc * * @return string[] * * @since 4.1.0 * * @throws \Exception */ public static function getSubscribedEvents(): array { $config = ComponentHelper::getParams('com_scheduler'); $app = Factory::getApplication(); $mapping = []; if ($app->isClient('site') || $app->isClient('administrator')) { $mapping['onBeforeCompileHead'] = 'injectLazyJS'; $mapping['onAjaxRunSchedulerLazy'] = 'runLazyCron'; // Only allowed in the frontend if ($app->isClient('site')) { if ($config->get('webcron.enabled')) { $mapping['onAjaxRunSchedulerWebcron'] = 'runWebCron'; } } elseif ($app->isClient('administrator')) { $mapping['onContentPrepareForm'] = 'enhanceSchedulerConfig'; $mapping['onExtensionBeforeSave'] = 'generateWebcronKey'; $mapping['onAjaxRunSchedulerTest'] = 'runTestCron'; } } return $mapping; } /** * Inject JavaScript to trigger the scheduler in HTML contexts. * * @param EventInterface $event The onBeforeCompileHead event. * * @return void * * @since 4.1.0 */ public function injectLazyJS(EventInterface $event): void { // Only inject in HTML documents if ($this->getApplication()->getDocument()->getType() !== 'html') { return; } $config = ComponentHelper::getParams('com_scheduler'); if (!$config->get('lazy_scheduler.enabled', true)) { return; } /** @var TasksModel $model */ $model = $this->getApplication()->bootComponent('com_scheduler') ->getMVCFactory()->createModel('Tasks', 'Administrator', ['ignore_request' => true]); $now = Factory::getDate('now', 'UTC'); if (!$model->hasDueTasks($now)) { return; } // Add configuration options $triggerInterval = $config->get('lazy_scheduler.interval', 300); $this->getApplication()->getDocument()->addScriptOptions('plg_system_schedulerunner', ['interval' => $triggerInterval]); // Load and injection directive $wa = $this->getApplication()->getDocument()->getWebAssetManager(); $wa->getRegistry()->addExtensionRegistryFile('plg_system_schedulerunner'); $wa->useScript('plg_system_schedulerunner.run-schedule'); } /** * Acts on the LazyCron trigger from the frontend when Lazy Cron is enabled in the Scheduler component * configuration. The lazy cron trigger is implemented in client-side JavaScript which is injected on every page * load with an HTML context when the component configuration allows it. This method then triggers the Scheduler, * which effectively runs the next Task in the Scheduler's task queue. * * @param EventInterface $e The onAjaxRunSchedulerLazy event. * * @return void * * @since 4.1.0 * * @throws \Exception */ public function runLazyCron(EventInterface $e) { $config = ComponentHelper::getParams('com_scheduler'); if (!$config->get('lazy_scheduler.enabled', true)) { return; } // Since the request from the frontend may time out, try allowing execution after disconnect. if (function_exists('ignore_user_abort')) { ignore_user_abort(true); } // Prevent PHP from trying to output to the user pipe. PHP may kill the script otherwise if the pipe is not accessible. ob_start(); // Suppress all errors to avoid any output try { $this->runScheduler(); } catch (\Exception $e) { } ob_end_clean(); } /** * This method is responsible for the WebCron functionality of the Scheduler component.<br/> * Acting on a `com_ajax` call, this method can work in two ways: * 1. If no Task ID is specified, it triggers the Scheduler to run the next task in * the task queue. * 2. If a Task ID is specified, it fetches the task (if it exists) from the Scheduler API and executes it.<br/> * * URL query parameters: * - `hash` string (required) Webcron hash (from the Scheduler component configuration). * - `id` int (optional) ID of the task to trigger. * * @param Event $event The onAjaxRunSchedulerWebcron event. * * @return void * * @since 4.1.0 * * @throws \Exception */ public function runWebCron(Event $event) { $config = ComponentHelper::getParams('com_scheduler'); $hash = $config->get('webcron.key', ''); if (!$config->get('webcron.enabled', false)) { Log::add($this->getApplication()->getLanguage()->_('PLG_SYSTEM_SCHEDULE_RUNNER_WEBCRON_DISABLED')); throw new \Exception($this->getApplication()->getLanguage()->_('JERROR_ALERTNOAUTHOR'), 403); } if (!strlen($hash) || $hash !== $this->getApplication()->getInput()->get('hash')) { throw new \Exception($this->getApplication()->getLanguage()->_('JERROR_ALERTNOAUTHOR'), 403); } $id = (int) $this->getApplication()->getInput()->getInt('id', 0); $task = $this->runScheduler($id); if (!empty($task) && !empty($task->getContent()['exception'])) { throw $task->getContent()['exception']; } } /** * This method is responsible for the "test run" functionality in the Scheduler administrator backend interface. * Acting on a `com_ajax` call, this method requires the URL to have a `id` query parameter (corresponding to an * existing Task ID). * * @param Event $event The onAjaxRunScheduler event. * * @return void * * @since 4.1.0 * * @throws \Exception */ public function runTestCron(Event $event) { if (!Session::checkToken('GET')) { return; } $id = (int) $this->getApplication()->getInput()->getInt('id'); $allowConcurrent = $this->getApplication()->getInput()->getBool('allowConcurrent', false); $user = $this->getApplication()->getIdentity(); if (empty($id) || !$user->authorise('core.testrun', 'com_scheduler.task.' . $id)) { throw new \Exception($this->getApplication()->getLanguage()->_('JERROR_ALERTNOAUTHOR'), 403); } /** * ?: About allow simultaneous, how do we detect if it failed because of pre-existing lock? * * We will allow CLI exclusive tasks to be fetched and executed, it's left to routines to do a runtime check * if they want to refuse normal operation. */ $task = (new Scheduler())->getTask( [ 'id' => $id, 'allowDisabled' => true, 'bypassScheduling' => true, 'allowConcurrent' => $allowConcurrent, ] ); if ($task) { $task->run(); $event->addArgument('result', $task->getContent()); } else { /** * Placeholder result, but the idea is if we failed to fetch the task, it's likely because another task was * already running. This is a fair assumption if this test run was triggered through the administrator backend, * so we know the task probably exists and is either enabled/disabled (not trashed). */ // @todo language constant + review if this is done right. $event->addArgument('result', ['message' => 'could not acquire lock on task. retry or allow concurrency.']); } } /** * Run the scheduler, allowing execution of a single due task. * Does not bypass task scheduling, meaning that even if an ID is passed the task is only * triggered if it is due. * * @param integer $id The optional ID of the task to run * * @return ?Task * * @since 4.1.0 * @throws \RuntimeException */ private function runScheduler(int $id = 0): ?Task { return (new Scheduler())->runTask(['id' => $id]); } /** * Enhance the scheduler config form by dynamically populating or removing display fields. * * @param EventInterface $event The onContentPrepareForm event. * * @return void * * @since 4.1.0 * @throws \UnexpectedValueException|\RuntimeException * * @todo Move to another plugin? */ public function enhanceSchedulerConfig(EventInterface $event): void { /** @var Form $form */ [$form, $data] = array_values($event->getArguments()); if ( $form->getName() !== 'com_config.component' || $this->getApplication()->getInput()->get('component') !== 'com_scheduler' ) { return; } if (!empty($data['webcron']['key'])) { $form->removeField('generate_key_on_save', 'webcron'); $relative = 'index.php?option=com_ajax&plugin=RunSchedulerWebcron&group=system&format=json&hash=' . $data['webcron']['key']; $link = Route::link('site', $relative, false, Route::TLS_IGNORE, true); $form->setValue('base_link', 'webcron', $link); } else { $form->removeField('base_link', 'webcron'); $form->removeField('reset_key', 'webcron'); } } /** * Auto-generate a key/hash for the webcron functionality. * This method acts on table save, when a hash doesn't already exist or a reset is required. * @todo Move to another plugin? * * @param EventInterface $event The onExtensionBeforeSave event. * * @return void * * @since 4.1.0 */ public function generateWebcronKey(EventInterface $event): void { /** @var Extension $table */ [$context, $table] = array_values($event->getArguments()); if ($context !== 'com_config.component' || $table->name !== 'com_scheduler') { return; } $params = new Registry($table->params ?? ''); if ( empty($params->get('webcron.key')) || $params->get('webcron.reset_key') === 1 ) { $params->set('webcron.key', UserHelper::genRandomPassword(self::WEBCRON_KEY_LENGTH)); } $params->remove('webcron.base_link'); $params->remove('webcron.reset_key'); $table->params = $params->toString(); } } PKAA#]h��z(system/schedulerunner/schedulerunner.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_schedulerunner</name> <author>Joomla! Project</author> <creationDate>2021-08</creationDate> <copyright>(C) 2021 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.1</version> <description>PLG_SYSTEM_SCHEDULERUNNER_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\ScheduleRunner</namespace> <media destination="plg_system_schedulerunner" folder="media"> <folder>js</folder> <filename>joomla.asset.json</filename> </media> <files> <folder plugin="schedulerunner">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_system_schedulerunner.ini</language> <language tag="en-GB">language/en-GB/plg_system_schedulerunner.sys.ini</language> </languages> </extension> PKAA#]��YYsystem/remember/remember.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_remember</name> <author>Joomla! Project</author> <creationDate>2007-04</creationDate> <copyright>(C) 2007 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_REMEMBER_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\Remember</namespace> <files> <folder plugin="remember">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_system_remember.ini</language> <language tag="en-GB">language/en-GB/plg_system_remember.sys.ini</language> </languages> </extension> PKAA#]��~[***system/remember/src/Extension/Remember.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.remember * * @copyright (C) 2007 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Remember\Extension; use Joomla\CMS\Log\Log; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\User\UserHelper; use Joomla\Database\DatabaseAwareTrait; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! System Remember Me Plugin * * @since 1.5 */ final class Remember extends CMSPlugin { use DatabaseAwareTrait; /** * Remember me method to run onAfterInitialise * Only purpose is to initialise the login authentication process if a cookie is present * * @return void * * @since 1.5 * * @throws InvalidArgumentException */ public function onAfterInitialise() { // No remember me for admin. if (!$this->getApplication()->isClient('site')) { return; } // Check for a cookie if user is not logged in if ($this->getApplication()->getIdentity()->guest) { $cookieName = 'joomla_remember_me_' . UserHelper::getShortHashedUserAgent(); // Check for the cookie if ($this->getApplication()->getInput()->cookie->get($cookieName)) { $this->getApplication()->login(['username' => ''], ['silent' => true]); } } } /** * Imports the authentication plugin on user logout to make sure that the cookie is destroyed. * * @param array $user Holds the user data. * @param array $options Array holding options (remember, autoregister, group). * * @return boolean */ public function onUserLogout($user, $options) { // No remember me for admin if (!$this->getApplication()->isClient('site')) { return true; } $cookieName = 'joomla_remember_me_' . UserHelper::getShortHashedUserAgent(); // Check for the cookie if ($this->getApplication()->getInput()->cookie->get($cookieName)) { // Make sure authentication group is loaded to process onUserAfterLogout event PluginHelper::importPlugin('authentication'); } return true; } /** * Method is called before user data is stored in the database * Invalidate all existing remember-me cookies after a password change * * @param array $user Holds the old user data. * @param boolean $isnew True if a new user is stored. * @param array $data Holds the new user data. * * @return boolean * * @since 3.8.6 */ public function onUserBeforeSave($user, $isnew, $data) { // Irrelevant on new users if ($isnew) { return true; } // Irrelevant, because password was not changed by user if (empty($data['password_clear'])) { return true; } // But now, we need to do something - Delete all tokens for this user! $db = $this->getDatabase(); $query = $db->getQuery(true) ->delete($db->quoteName('#__user_keys')) ->where($db->quoteName('user_id') . ' = :userid') ->bind(':userid', $user['username']); try { $db->setQuery($query)->execute(); } catch (\RuntimeException $e) { // Log an alert for the site admin Log::add( sprintf('Failed to delete cookie token for user %s with the following error: %s', $user['username'], $e->getMessage()), Log::WARNING, 'security' ); } return true; } } PKAA#]7{/,��%system/remember/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.remember * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\Remember\Extension\Remember; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Remember( $dispatcher, (array) PluginHelper::getPlugin('system', 'remember') ); $plugin->setApplication(Factory::getApplication()); $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } }; PKAA#]�,�PP-system/tasknotification/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.tasknotification * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\User\UserFactoryInterface; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\TaskNotification\Extension\TaskNotification; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new TaskNotification( $dispatcher, (array) PluginHelper::getPlugin('system', 'tasknotification') ); $plugin->setApplication(Factory::getApplication()); $plugin->setDatabase($container->get(DatabaseInterface::class)); $plugin->setUserFactory($container->get(UserFactoryInterface::class)); return $plugin; } ); } }; PKAA#]��C`��,system/tasknotification/tasknotification.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_task_notification</name> <author>Joomla! Project</author> <creationDate>2021-09</creationDate> <copyright>(C) 2021 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.1</version> <description>PLG_SYSTEM_TASK_NOTIFICATION_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\TaskNotification</namespace> <files> <folder>forms</folder> <folder plugin="tasknotification">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_system_tasknotification.ini</language> <language tag="en-GB">language/en-GB/plg_system_tasknotification.sys.ini</language> </languages> </extension> PKAA#]˷�)):system/tasknotification/src/Extension/TaskNotification.phpnu�[���<?php /** * @package Joomla.Plugins * @subpackage System.tasknotification * * @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\TaskNotification\Extension; use Joomla\CMS\Factory; use Joomla\CMS\Filesystem\Path; use Joomla\CMS\Form\Form; use Joomla\CMS\Log\Log; use Joomla\CMS\Mail\MailTemplate; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\User\UserFactoryAwareTrait; use Joomla\Component\Scheduler\Administrator\Task\Status; use Joomla\Component\Scheduler\Administrator\Task\Task; use Joomla\Database\DatabaseAwareTrait; use Joomla\Event\Event; use Joomla\Event\EventInterface; use Joomla\Event\SubscriberInterface; use PHPMailer\PHPMailer\Exception as MailerException; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * This plugin implements email notification functionality for Tasks configured through the Scheduler component. * Notification configuration is supported on a per-task basis, which can be set-up through the Task item form, made * possible by injecting the notification fields into the item form with a `onContentPrepareForm` listener.<br/> * * Notifications can be set-up on: task success, failure, fatal failure (task running too long or crashing the request), * or on _orphaned_ task routines (missing parent plugin - either uninstalled, disabled or no longer offering a routine * with the same ID). * * @since 4.1.0 */ final class TaskNotification extends CMSPlugin implements SubscriberInterface { use DatabaseAwareTrait; use UserFactoryAwareTrait; /** * The task notification form. This form is merged into the task item form by {@see * injectTaskNotificationFieldset()}. * * @var string * @since 4.1.0 */ private const TASK_NOTIFICATION_FORM = 'task_notification'; /** * @var boolean * @since 4.1.0 */ protected $autoloadLanguage = true; /** * @inheritDoc * * @return array * * @since 4.1.0 */ public static function getSubscribedEvents(): array { return [ 'onContentPrepareForm' => 'injectTaskNotificationFieldset', 'onTaskExecuteSuccess' => 'notifySuccess', 'onTaskExecuteFailure' => 'notifyFailure', 'onTaskRoutineNotFound' => 'notifyOrphan', 'onTaskRecoverFailure' => 'notifyFatalRecovery', ]; } /** * Inject fields to support configuration of post-execution notifications into the task item form. * * @param EventInterface $event The onContentPrepareForm event. * * @return boolean True if successful. * * @since 4.1.0 */ public function injectTaskNotificationFieldset(EventInterface $event): bool { /** @var Form $form */ [$form] = array_values($event->getArguments()); if ($form->getName() !== 'com_scheduler.task') { return true; } $formFile = JPATH_PLUGINS . '/' . $this->_type . '/' . $this->_name . '/forms/' . self::TASK_NOTIFICATION_FORM . '.xml'; try { $formFile = Path::check($formFile); } catch (\Exception $e) { // Log? return false; } $formFile = Path::clean($formFile); if (!is_file($formFile)) { return false; } return $form->loadFile($formFile); } /** * Send out email notifications on Task execution failure if task configuration allows it. * * @param Event $event The onTaskExecuteFailure event. * * @return void * * @since 4.1.0 * @throws \Exception */ public function notifyFailure(Event $event): void { /** @var Task $task */ $task = $event->getArgument('subject'); if (!(int) $task->get('params.notifications.failure_mail', 1)) { return; } // @todo safety checks, multiple files [?] $outFile = $event->getArgument('subject')->snapshot['output_file'] ?? ''; $data = $this->getDataFromTask($event->getArgument('subject')); $this->sendMail('plg_system_tasknotification.failure_mail', $data, $outFile); } /** * Send out email notifications on orphaned task if task configuration allows.<br/> * A task is `orphaned` if the task's parent plugin has been removed/disabled, or no longer offers a task * with the same routine ID. * * @param Event $event The onTaskRoutineNotFound event. * * @return void * * @since 4.1.0 * @throws \Exception */ public function notifyOrphan(Event $event): void { /** @var Task $task */ $task = $event->getArgument('subject'); if (!(int) $task->get('params.notifications.orphan_mail', 1)) { return; } $data = $this->getDataFromTask($event->getArgument('subject')); $this->sendMail('plg_system_tasknotification.orphan_mail', $data); } /** * Send out email notifications on Task execution success if task configuration allows. * * @param Event $event The onTaskExecuteSuccess event. * * @return void * * @since 4.1.0 * @throws \Exception */ public function notifySuccess(Event $event): void { /** @var Task $task */ $task = $event->getArgument('subject'); if (!(int) $task->get('params.notifications.success_mail', 0)) { return; } // @todo safety checks, multiple files [?] $outFile = $event->getArgument('subject')->snapshot['output_file'] ?? ''; $data = $this->getDataFromTask($event->getArgument('subject')); $this->sendMail('plg_system_tasknotification.success_mail', $data, $outFile); } /** * Send out email notifications on fatal recovery of task execution if task configuration allows.<br/> * Fatal recovery indicated that the task either crashed the parent process or its execution lasted longer * than the global task timeout (this is configurable through the Scheduler component configuration). * In the latter case, the global task timeout should be adjusted so that this false positive can be avoided. * This stands as a limitation of the Scheduler's current task execution implementation, which doesn't involve * keeping track of the parent PHP process which could enable keeping track of the task's status. * * @param Event $event The onTaskRecoverFailure event. * * @return void * * @since 4.1.0 * @throws \Exception */ public function notifyFatalRecovery(Event $event): void { /** @var Task $task */ $task = $event->getArgument('subject'); if (!(int) $task->get('params.notifications.fatal_failure_mail', 1)) { return; } $data = $this->getDataFromTask($event->getArgument('subject')); $this->sendMail('plg_system_tasknotification.fatal_recovery_mail', $data); } /** * @param Task $task A task object * * @return array An array of data to bind to a mail template. * * @since 4.1.0 */ private function getDataFromTask(Task $task): array { $lockOrExecTime = Factory::getDate($task->get('locked') ?? $task->get('last_execution'))->format($this->getApplication()->getLanguage()->_('DATE_FORMAT_LC2')); return [ 'TASK_ID' => $task->get('id'), 'TASK_TITLE' => $task->get('title'), 'EXIT_CODE' => $task->getContent()['status'] ?? Status::NO_EXIT, 'EXEC_DATE_TIME' => $lockOrExecTime, 'TASK_OUTPUT' => $task->getContent()['output_body'] ?? '', ]; } /** * @param string $template The mail template. * @param array $data The data to bind to the mail template. * @param string $attachment The attachment to send with the mail (@todo multiple) * * @return void * * @since 4.1.0 * @throws \Exception */ private function sendMail(string $template, array $data, string $attachment = ''): void { $app = $this->getApplication(); $db = $this->getDatabase(); // Get all users who are not blocked and have opted in for system mails. $query = $db->getQuery(true); $query->select($db->quoteName(['name', 'email', 'sendEmail', 'id'])) ->from($db->quoteName('#__users')) ->where($db->quoteName('sendEmail') . ' = 1') ->where($db->quoteName('block') . ' = 0'); $db->setQuery($query); try { $users = $db->loadObjectList(); } catch (\RuntimeException $e) { return; } if ($users === null) { Log::add($this->getApplication()->getLanguage()->_('PLG_SYSTEM_TASK_NOTIFICATION_USER_FETCH_FAIL'), Log::ERROR); return; } $mailSent = false; // Mail all matching users who also have the `core.manage` privilege for com_scheduler. foreach ($users as $user) { $user = $this->getUserFactory()->loadUserById($user->id); if ($user->authorise('core.manage', 'com_scheduler')) { try { $mailer = new MailTemplate($template, $app->getLanguage()->getTag()); $mailer->addTemplateData($data); $mailer->addRecipient($user->email); if ( !empty($attachment) && is_file($attachment) ) { // @todo we allow multiple files [?] $attachName = pathinfo($attachment, PATHINFO_BASENAME); $mailer->addAttachment($attachName, $attachment); } $mailer->send(); $mailSent = true; } catch (MailerException $exception) { Log::add($this->getApplication()->getLanguage()->_('PLG_SYSTEM_TASK_NOTIFICATION_NOTIFY_SEND_EMAIL_FAIL'), Log::ERROR); } } } if (!$mailSent) { Log::add($this->getApplication()->getLanguage()->_('PLG_SYSTEM_TASK_NOTIFICATION_NO_MAIL_SENT'), Log::WARNING); } } } PKAA#]НsLL3system/tasknotification/forms/task_notification.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <form> <fields name="params"> <fields name="notifications"> <fieldset name="notifications"> <field name="success_mail" type="radio" label="PLG_SYSTEM_TASK_NOTIFICATION_LABEL_SUCCESS_MAIL_TOGGLE" layout="joomla.form.field.radio.switcher" default="0" > <option value="0">JDISABLED</option> <option value="1">JENABLED</option> </field> <field name="failure_mail" type="radio" label="PLG_SYSTEM_TASK_NOTIFICATION_LABEL_FAILURE_MAIL_TOGGLE" layout="joomla.form.field.radio.switcher" default="1" > <option value="0">JDISABLED</option> <option value="1">JENABLED</option> </field> <field name="fatal_failure_mail" type="radio" label="PLG_SYSTEM_TASK_NOTIFICATION_LABEL_FATAL_FAILURE_MAIL_TOGGLE" layout="joomla.form.field.radio.switcher" default="1" > <option value="0">JDISABLED</option> <option value="1">JENABLED</option> </field> <field name="orphan_mail" type="radio" label="PLG_SYSTEM_TASK_NOTIFICATION_LABEL_ORPHANED_TASK_MAIL_TOGGLE" layout="joomla.form.field.radio.switcher" default="1" > <option value="0">JDISABLED</option> <option value="1">JENABLED</option> </field> </fieldset> </fields> </fields> </form> PKAA#]�����:system/sppagebuilderproupdater/sppagebuilderproupdater.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.9" type="plugin" group="system" method="upgrade"> <name>System - SP Page Builder Pro Updater</name> <author>JoomShaper.com</author> <creationDate>Jul 2015</creationDate> <copyright>Copyright (c) 2010 - 2022 JoomShaper. All rights reserved.</copyright> <license>http://www.gnu.org/licenses/gpl-2.0.html GPLv2 or later</license> <authorEmail>support@joomshaper.com</authorEmail> <authorUrl>www.joomshaper.com</authorUrl> <version>3.8.10</version> <description>SP Page Builder Pro Updater Plugin</description> <files> <filename plugin="sppagebuilderproupdater">sppagebuilderproupdater.php</filename> </files> </extension> PKAA#]��h�:system/sppagebuilderproupdater/sppagebuilderproupdater.phpnu�[���<?php /** * @package SP Page Builder * @author JoomShaper http://www.joomshaper.com * @copyright Copyright (c) 2010 - 2022 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later */ use Joomla\CMS\Factory; use Joomla\Registry\Registry; use Joomla\CMS\Plugin\CMSPlugin; //no direct access defined ('_JEXEC') or die ('restricted access'); class plgSystemSppagebuilderproupdater extends CMSPlugin { public function onExtensionAfterSave($option, $data) { if ( ($option == 'com_config.component') && ( $data->element == 'com_sppagebuilder' ) ) { $params = new Registry; $params->loadString($data->params); $email = $params->get('joomshaper_email'); $license_key = $params->get('joomshaper_license_key'); $url = $params->get('updater', ''); $fields = array(); $db = Factory::getDbo(); if (!empty($email) and !empty($license_key)) { $extra_query = 'joomshaper_email=' . urlencode($email); $extra_query .='&joomshaper_license_key=' . urlencode($license_key); $fields = array( $db->quoteName('extra_query') . '=' . $db->quote($extra_query), $db->quoteName('last_check_timestamp') . '=0' ); } if (!empty($url)) { array_push($fields, $db->quoteName('location') . '=' . $db->quote($url)); } //Update column values of #__update_sites table after extension is saved. $db = Factory::getDbo(); $query = $db->getQuery(true) ->update($db->quoteName('#__update_sites')) ->set($fields) ->where($db->quoteName('name') . '=' . $db->quote('SP Page Builder')); $db->setQuery($query); $db->execute(); } } }PKAA#]�yׄ�0system/logrotation/src/Extension/LogRotation.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.logrotation * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\LogRotation\Extension; use Joomla\CMS\Cache\Cache; use Joomla\CMS\Filesystem\Folder; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Database\DatabaseAwareTrait; use Joomla\Filesystem\File; use Joomla\Filesystem\Path; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! Log Rotation plugin * * Rotate the log files created by Joomla core * * @since 3.9.0 */ final class LogRotation extends CMSPlugin { use DatabaseAwareTrait; /** * Load the language file on instantiation. * * @var boolean * * @since 3.9.0 */ protected $autoloadLanguage = true; /** * The log check and rotation code is triggered after the page has fully rendered. * * @return void * * @since 3.9.0 */ public function onAfterRender() { // Get the timeout as configured in plugin parameters /** @var \Joomla\Registry\Registry $params */ $cache_timeout = (int) $this->params->get('cachetimeout', 30); $cache_timeout = 24 * 3600 * $cache_timeout; $logsToKeep = (int) $this->params->get('logstokeep', 1); // Do we need to run? Compare the last run timestamp stored in the plugin's options with the current // timestamp. If the difference is greater than the cache timeout we shall not execute again. $now = time(); $last = (int) $this->params->get('lastrun', 0); if ((abs($now - $last) < $cache_timeout)) { return; } // Update last run status $this->params->set('lastrun', $now); $paramsJson = $this->params->toString('JSON'); $db = $this->getDatabase(); $query = $db->getQuery(true) ->update($db->quoteName('#__extensions')) ->set($db->quoteName('params') . ' = :params') ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) ->where($db->quoteName('folder') . ' = ' . $db->quote('system')) ->where($db->quoteName('element') . ' = ' . $db->quote('logrotation')) ->bind(':params', $paramsJson); try { // Lock the tables to prevent multiple plugin executions causing a race condition $db->lockTable('#__extensions'); } catch (\Exception $e) { // If we can't lock the tables it's too risky to continue execution return; } try { // Update the plugin parameters $result = $db->setQuery($query)->execute(); $this->clearCacheGroups(['com_plugins'], [0, 1]); } catch (\Exception $exc) { // If we failed to execute $db->unlockTables(); $result = false; } try { // Unlock the tables after writing $db->unlockTables(); } catch (\Exception $e) { // If we can't lock the tables assume we have somehow failed $result = false; } // Stop on failure if (!$result) { return; } // Get the log path $logPath = Path::clean($this->getApplication()->get('log_path')); // Invalid path, stop processing further if (!is_dir($logPath)) { return; } $logFiles = $this->getLogFiles($logPath); // Sort log files by version number in reserve order krsort($logFiles, SORT_NUMERIC); foreach ($logFiles as $version => $files) { if ($version >= $logsToKeep) { // Delete files which has version greater than or equals $logsToKeep foreach ($files as $file) { File::delete($logPath . '/' . $file); } } else { // For files which has version smaller than $logsToKeep, rotate (increase version number) foreach ($files as $file) { $this->rotate($logPath, $file, $version); } } } } /** * Get log files from log folder * * @param string $path The folder to get log files * * @return array The log files in the given path grouped by version number (not rotated files has number 0) * * @since 3.9.0 */ private function getLogFiles($path) { $logFiles = []; $files = Folder::files($path, '\.php$'); foreach ($files as $file) { $parts = explode('.', $file); /* * Rotated log file has this filename format [VERSION].[FILENAME].php. So if $parts has at least 3 elements * and the first element is a number, we know that it's a rotated file and can get it's current version */ if (count($parts) >= 3 && is_numeric($parts[0])) { $version = (int) $parts[0]; } else { $version = 0; } if (!isset($logFiles[$version])) { $logFiles[$version] = []; } $logFiles[$version][] = $file; } return $logFiles; } /** * Method to rotate (increase version) of a log file * * @param string $path Path to file to rotate * @param string $filename Name of file to rotate * @param int $currentVersion The current version number * * @return void * * @since 3.9.0 */ private function rotate($path, $filename, $currentVersion) { if ($currentVersion === 0) { $rotatedFile = $path . '/1.' . $filename; } else { /* * Rotated log file has this filename format [VERSION].[FILENAME].php. To rotate it, we just need to explode * the filename into an array, increase value of first element (keep version) and implode it back to get the * rotated file name */ $parts = explode('.', $filename); $parts[0] = $currentVersion + 1; $rotatedFile = $path . '/' . implode('.', $parts); } File::move($path . '/' . $filename, $rotatedFile); } /** * Clears cache groups. We use it to clear the plugins cache after we update the last run timestamp. * * @param array $clearGroups The cache groups to clean * @param array $cacheClients The cache clients (site, admin) to clean * * @return void * * @since 3.9.0 */ private function clearCacheGroups(array $clearGroups, array $cacheClients = [0, 1]) { foreach ($clearGroups as $group) { foreach ($cacheClients as $client_id) { try { $options = [ 'defaultgroup' => $group, 'cachebase' => $client_id ? JPATH_ADMINISTRATOR . '/cache' : $this->getApplication()->get('cache_path', JPATH_SITE . '/cache'), ]; $cache = Cache::getInstance('callback', $options); $cache->clean(); } catch (\Exception $e) { // Ignore it } } } } } PKAA#]A32�"system/logrotation/logrotation.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_logrotation</name> <author>Joomla! Project</author> <creationDate>2018-05</creationDate> <copyright>(C) 2018 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.9.0</version> <description>PLG_SYSTEM_LOGROTATION_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\LogRotation</namespace> <files> <folder plugin="logrotation">services</folder> <folder>src</folder> </files> <languages folder="language"> <language tag="en-GB">language/en-GB/plg_system_logrotation.ini</language> <language tag="en-GB">language/en-GB/plg_system_logrotation.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="cachetimeout" type="integer" label="PLG_SYSTEM_LOGROTATION_CACHETIMEOUT_LABEL" first="0" last="120" step="1" default="30" filter="int" validate="number" /> <field name="logstokeep" type="integer" label="PLG_SYSTEM_LOGROTATION_LOGSTOKEEP_LABEL" first="1" last="10" step="1" default="1" filter="int" validate="number" /> <field name="lastrun" type="hidden" default="0" filter="integer" /> </fieldset> </fields> </config> </extension> PKAA#]��6��(system/logrotation/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.logrotation * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\LogRotation\Extension\LogRotation; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new LogRotation( $dispatcher, (array) PluginHelper::getPlugin('system', 'logrotation') ); $plugin->setApplication(Factory::getApplication()); $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } }; PKAA#]1;HH*system/accessibility/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.accessibility * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\Accessibility\Extension\Accessibility; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Accessibility( $dispatcher, (array) PluginHelper::getPlugin('system', 'accessibility') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PKAA#]�ˍ�cc4system/accessibility/src/Extension/Accessibility.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.accessibility * * @copyright (C) 2020 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Accessibility\Extension; use Joomla\CMS\Plugin\CMSPlugin; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * System plugin to add additional accessibility features to the administrator interface. * * @since 4.0.0 */ final class Accessibility extends CMSPlugin { /** * Add the javascript for the accessibility menu * * @return void * * @since 4.0.0 */ public function onBeforeCompileHead() { $section = $this->params->get('section', 'administrator'); if ($section !== 'both' && $this->getApplication()->isClient($section) !== true) { return; } // Get the document object. $document = $this->getApplication()->getDocument(); if ($document->getType() !== 'html') { return; } // Are we in a modal? if ($this->getApplication()->getInput()->get('tmpl', '', 'cmd') === 'component') { return; } // Load language file. $this->loadLanguage(); // Determine if it is an LTR or RTL language $direction = $this->getApplication()->getLanguage()->isRtl() ? 'right' : 'left'; // Detect the current active language $lang = $this->getApplication()->getLanguage()->getTag(); /** * Add strings for translations in Javascript. * Reference https://ranbuch.github.io/accessibility/ */ $document->addScriptOptions( 'accessibility-options', [ 'labels' => [ 'menuTitle' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_ACCESSIBILITY_MENU_TITLE'), 'increaseText' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_ACCESSIBILITY_INCREASE_TEXT'), 'decreaseText' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_ACCESSIBILITY_DECREASE_TEXT'), 'increaseTextSpacing' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_ACCESSIBILITY_INCREASE_SPACING'), 'decreaseTextSpacing' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_ACCESSIBILITY_DECREASE_SPACING'), 'invertColors' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_ACCESSIBILITY_INVERT_COLORS'), 'grayHues' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_ACCESSIBILITY_GREY'), 'underlineLinks' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_ACCESSIBILITY_UNDERLINE'), 'bigCursor' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_ACCESSIBILITY_CURSOR'), 'readingGuide' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_ACCESSIBILITY_READING'), 'textToSpeech' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_ACCESSIBILITY_TTS'), 'speechToText' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_ACCESSIBILITY_STT'), 'resetTitle' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_ACCESSIBILITY_RESET'), 'closeTitle' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_ACCESSIBILITY_CLOSE'), ], 'icon' => [ 'position' => [ $direction => [ 'size' => '0', 'units' => 'px', ], ], 'useEmojis' => $this->params->get('useEmojis') != 'false' ? true : false, ], 'hotkeys' => [ 'enabled' => true, 'helpTitles' => true, ], 'textToSpeechLang' => [$lang], 'speechToTextLang' => [$lang], ] ); $document->getWebAssetManager() ->useScript('accessibility') ->addInlineScript( 'window.addEventListener("load", function() {' . 'new Accessibility(Joomla.getOptions("accessibility-options") || {});' . '});', ['name' => 'inline.plg.system.accessibility'], ['type' => 'module'], ['accessibility'] ); } } PKAA#]j��l��&system/accessibility/accessibility.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_accessibility</name> <author>Joomla! Project</author> <creationDate>2020-02-15</creationDate> <copyright>(C) 2020 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.0.0</version> <description>PLG_SYSTEM_ACCESSIBILITY_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\Accessibility</namespace> <files> <folder plugin="accessibility">services</folder> <folder>src</folder> </files> <languages folder="admin"> <language tag="en-GB">language/en-GB/plg_system_accessibility.ini</language> <language tag="en-GB">language/en-GB/plg_system_accessibility.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="section" type="list" label="PLG_SYSTEM_ACCESSIBILITY_SECTION" default="administrator" validate="options" > <option value="site">PLG_SYSTEM_ACCESSIBILITY_SECTION_SITE</option> <option value="administrator">PLG_SYSTEM_ACCESSIBILITY_SECTION_ADMIN</option> <option value="both">PLG_SYSTEM_ACCESSIBILITY_SECTION_BOTH</option> </field> <field name="useEmojis" type="list" label="PLG_SYSTEM_ACCESSIBILITY_EMOJIS" default="true" validate="options" > <option value="true">PLG_SYSTEM_ACCESSIBILITY_EMOJIS_TRUE</option> <option value="false">PLG_SYSTEM_ACCESSIBILITY_EMOJIS_FALSE</option> </field> </fieldset> </fields> </config> </extension> PKAA#]k���**$system/jooa11y/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.jooa11y * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\Jooa11y\Extension\Jooa11y; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Jooa11y( $dispatcher, (array) PluginHelper::getPlugin('system', 'jooa11y') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PKAA#]/9 �)�)(system/jooa11y/src/Extension/Jooa11y.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.jooa11y * * @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Jooa11y\Extension; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Event\SubscriberInterface; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Jooa11y plugin to add an accessibility checker * * @since 4.1.0 */ final class Jooa11y extends CMSPlugin implements SubscriberInterface { /** * Affects constructor behavior. If true, language files will be loaded automatically. * * @var boolean * @since 4.1.0 */ protected $autoloadLanguage = true; /** * Subscribe to certain events * * @return string[] An array of event mappings * * @since 4.1.0 * * @throws Exception */ public static function getSubscribedEvents(): array { return ['onBeforeCompileHead' => 'initJooa11y']; } /** * Method to check if the current user is allowed to see the debug information or not. * * @return boolean True if access is allowed. * * @since 4.1.0 */ private function isAuthorisedDisplayChecker(): bool { static $result; if (is_bool($result)) { return $result; } // If the user is not allowed to view the output then end here. $filterGroups = (array) $this->params->get('filter_groups', []); if (!empty($filterGroups)) { $userGroups = $this->getApplication()->getIdentity()->get('groups'); if (!array_intersect($filterGroups, $userGroups)) { $result = false; return $result; } } $result = true; return $result; } /** * Add the checker. * * @return void * * @since 4.1.0 */ public function initJooa11y() { if (!$this->getApplication()->isClient('site')) { return; } // Check if we are in a preview modal or the plugin has enforced loading $showJooa11y = $this->getApplication()->getInput()->get('jooa11y', $this->params->get('showAlways', 0)); // Load the checker if authorised if (!$showJooa11y || !$this->isAuthorisedDisplayChecker()) { return; } // Get the document object. $document = $this->getApplication()->getDocument(); // Add plugin settings from the xml $document->addScriptOptions( 'jooa11yOptions', [ 'checkRoot' => $this->params->get('checkRoot', 'main'), 'readabilityRoot' => $this->params->get('readabilityRoot', 'main'), 'containerIgnore' => $this->params->get('containerIgnore'), ] ); // Add the language constants $constants = [ 'PLG_SYSTEM_JOOA11Y_ALERT_CLOSE', 'PLG_SYSTEM_JOOA11Y_ALERT_TEXT', 'PLG_SYSTEM_JOOA11Y_AVG_WORD_PER_SENTENCE', 'PLG_SYSTEM_JOOA11Y_COMPLEX_WORDS', 'PLG_SYSTEM_JOOA11Y_CONTAINER_LABEL', 'PLG_SYSTEM_JOOA11Y_CONTRAST', 'PLG_SYSTEM_JOOA11Y_CONTRAST_ERROR_INPUT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_CONTRAST_ERROR_INPUT_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_CONTRAST_ERROR_MESSAGE', 'PLG_SYSTEM_JOOA11Y_CONTRAST_ERROR_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_CONTRAST_WARNING_MESSAGE', 'PLG_SYSTEM_JOOA11Y_CONTRAST_WARNING_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_DARK_MODE', 'PLG_SYSTEM_JOOA11Y_DIFFICULT_READABILITY', 'PLG_SYSTEM_JOOA11Y_EMBED_AUDIO', 'PLG_SYSTEM_JOOA11Y_EMBED_GENERAL_WARNING', 'PLG_SYSTEM_JOOA11Y_EMBED_MISSING_TITLE', 'PLG_SYSTEM_JOOA11Y_EMBED_VIDEO', 'PLG_SYSTEM_JOOA11Y_ERROR', 'PLG_SYSTEM_JOOA11Y_FAIRLY_DIFFICULT_READABILITY', 'PLG_SYSTEM_JOOA11Y_FILE_TYPE_WARNING', 'PLG_SYSTEM_JOOA11Y_FILE_TYPE_WARNING_TIP', 'PLG_SYSTEM_JOOA11Y_FORM_LABELS', 'PLG_SYSTEM_JOOA11Y_GOOD', 'PLG_SYSTEM_JOOA11Y_GOOD_READABILITY', 'PLG_SYSTEM_JOOA11Y_HEADING_EMPTY', 'PLG_SYSTEM_JOOA11Y_HEADING_EMPTY_WITH_IMAGE', 'PLG_SYSTEM_JOOA11Y_HEADING_FIRST', 'PLG_SYSTEM_JOOA11Y_HEADING_LONG', 'PLG_SYSTEM_JOOA11Y_HEADING_LONG_INFO', 'PLG_SYSTEM_JOOA11Y_HEADING_MISSING_ONE', 'PLG_SYSTEM_JOOA11Y_HEADING_NON_CONSECUTIVE_LEVEL', 'PLG_SYSTEM_JOOA11Y_HIDE_OUTLINE', 'PLG_SYSTEM_JOOA11Y_HIDE_SETTINGS', 'PLG_SYSTEM_JOOA11Y_HYPERLINK_ALT_LENGTH_MESSAGE', 'PLG_SYSTEM_JOOA11Y_HYPERLINK_ALT_LENGTH_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_IMAGE_FIGURE_DECORATIVE', 'PLG_SYSTEM_JOOA11Y_IMAGE_FIGURE_DECORATIVE_INFO', 'PLG_SYSTEM_JOOA11Y_IMAGE_FIGURE_DUPLICATE_ALT', 'PLG_SYSTEM_JOOA11Y_LABELS_ARIA_LABEL_INPUT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LABELS_ARIA_LABEL_INPUT_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LABELS_INPUT_RESET_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LABELS_INPUT_RESET_MESSAGE_TIP', 'PLG_SYSTEM_JOOA11Y_LABELS_MISSING_IMAGE_INPUT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LABELS_MISSING_LABEL_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LABELS_NO_FOR_ATTRIBUTE_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LABELS_NO_FOR_ATTRIBUTE_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LANG_CODE', 'PLG_SYSTEM_JOOA11Y_LINKS_ADVANCED', 'PLG_SYSTEM_JOOA11Y_LINK_ALT_HAS_BAD_WORD_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_ALT_HAS_BAD_WORD_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LINK_ALT_HAS_SUS_WORD_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_ALT_HAS_SUS_WORD_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LINK_ALT_PLACEHOLDER_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_ALT_TOO_LONG_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_ALT_TOO_LONG_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LINK_ANCHOR_LINK_AND_ALT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_ANCHOR_LINK_AND_ALT_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LINK_BEST_PRACTICES', 'PLG_SYSTEM_JOOA11Y_LINK_BEST_PRACTICES_DETAILS', 'PLG_SYSTEM_JOOA11Y_LINK_DECORATIVE_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_EMPTY', 'PLG_SYSTEM_JOOA11Y_LINK_EMPTY_LINK_NO_LABEL', 'PLG_SYSTEM_JOOA11Y_LINK_HYPERLINKED_IMAGE_ARIA_HIDDEN', 'PLG_SYSTEM_JOOA11Y_LINK_IDENTICAL_NAME', 'PLG_SYSTEM_JOOA11Y_LINK_IDENTICAL_NAME_TIP', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_BAD_ALT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_BAD_ALT_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_LINK_ALT_TEXT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_LINK_ALT_TEXT_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_LINK_NULL_ALT_NO_TEXT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_PLACEHOLDER_ALT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_SUS_ALT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_IMAGE_SUS_ALT_MESSAGE_INFO', 'PLG_SYSTEM_JOOA11Y_LINK_LABEL', 'PLG_SYSTEM_JOOA11Y_LINK_LINK_HAS_ALT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_LINK_PASS_ALT', 'PLG_SYSTEM_JOOA11Y_LINK_STOPWORD', 'PLG_SYSTEM_JOOA11Y_LINK_STOPWORD_TIP', 'PLG_SYSTEM_JOOA11Y_LINK_URL', 'PLG_SYSTEM_JOOA11Y_LINK_URL_TIP', 'PLG_SYSTEM_JOOA11Y_MAIN_TOGGLE_LABEL', 'PLG_SYSTEM_JOOA11Y_MISSING_ALT_LINK_BUT_HAS_TEXT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_MISSING_ALT_LINK_MESSAGE', 'PLG_SYSTEM_JOOA11Y_MISSING_ALT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_NEW_TAB_WARNING', 'PLG_SYSTEM_JOOA11Y_NEW_TAB_WARNING_TIP', 'PLG_SYSTEM_JOOA11Y_OFF', 'PLG_SYSTEM_JOOA11Y_ON', 'PLG_SYSTEM_JOOA11Y_PAGE_OUTLINE', 'PLG_SYSTEM_JOOA11Y_PANEL_HEADING_MISSING_ONE', 'PLG_SYSTEM_JOOA11Y_PANEL_STATUS_BOTH', 'PLG_SYSTEM_JOOA11Y_PANEL_STATUS_ERRORS', 'PLG_SYSTEM_JOOA11Y_PANEL_STATUS_HIDDEN', 'PLG_SYSTEM_JOOA11Y_PANEL_STATUS_ICON', 'PLG_SYSTEM_JOOA11Y_PANEL_STATUS_NONE', 'PLG_SYSTEM_JOOA11Y_PANEL_STATUS_WARNINGS', 'PLG_SYSTEM_JOOA11Y_QA_BAD_ITALICS', 'PLG_SYSTEM_JOOA11Y_QA_BAD_LINK', 'PLG_SYSTEM_JOOA11Y_QA_BLOCKQUOTE_MESSAGE', 'PLG_SYSTEM_JOOA11Y_QA_BLOCKQUOTE_MESSAGE_TIP', 'PLG_SYSTEM_JOOA11Y_QA_DUPLICATE_ID', 'PLG_SYSTEM_JOOA11Y_QA_DUPLICATE_ID_TIP', 'PLG_SYSTEM_JOOA11Y_QA_FAKE_HEADING', 'PLG_SYSTEM_JOOA11Y_QA_FAKE_HEADING_INFO', 'PLG_SYSTEM_JOOA11Y_QA_PAGE_LANGUAGE_MESSAGE', 'PLG_SYSTEM_JOOA11Y_QA_PDF_COUNT', 'PLG_SYSTEM_JOOA11Y_QA_SHOULD_BE_LIST', 'PLG_SYSTEM_JOOA11Y_QA_SHOULD_BE_LIST_TIP', 'PLG_SYSTEM_JOOA11Y_QA_UPPERCASE_WARNING', 'PLG_SYSTEM_JOOA11Y_READABILITY', 'PLG_SYSTEM_JOOA11Y_READABILITY_NOT_ENOUGH_CONTENT_MESSAGE', 'PLG_SYSTEM_JOOA11Y_READABILITY_NO_P_OR_LI_MESSAGE', 'PLG_SYSTEM_JOOA11Y_SETTINGS', 'PLG_SYSTEM_JOOA11Y_SHORTCUT_SR', 'PLG_SYSTEM_JOOA11Y_SHORTCUT_TOOLTIP', 'PLG_SYSTEM_JOOA11Y_SHOW_OUTLINE', 'PLG_SYSTEM_JOOA11Y_SHOW_SETTINGS', 'PLG_SYSTEM_JOOA11Y_TABLES_EMPTY_HEADING', 'PLG_SYSTEM_JOOA11Y_TABLES_EMPTY_HEADING_INFO', 'PLG_SYSTEM_JOOA11Y_TABLES_MISSING_HEADINGS', 'PLG_SYSTEM_JOOA11Y_TABLES_MISSING_HEADINGS_INFO', 'PLG_SYSTEM_JOOA11Y_TABLES_SEMANTIC_HEADING', 'PLG_SYSTEM_JOOA11Y_TABLES_SEMANTIC_HEADING_INFO', 'PLG_SYSTEM_JOOA11Y_TEXT_UNDERLINE_WARNING', 'PLG_SYSTEM_JOOA11Y_TEXT_UNDERLINE_WARNING_TIP', 'PLG_SYSTEM_JOOA11Y_TOTAL_WORDS', 'PLG_SYSTEM_JOOA11Y_VERY_DIFFICULT_READABILITY', 'PLG_SYSTEM_JOOA11Y_WARNING', ]; foreach ($constants as $constant) { Text::script($constant); } /** @var Joomla\CMS\WebAsset\WebAssetManager $wa*/ $wa = $document->getWebAssetManager(); $wa->getRegistry()->addRegistryFile('media/plg_system_jooa11y/joomla.asset.json'); $wa->useScript('plg_system_jooa11y.jooa11y') ->useStyle('plg_system_jooa11y.jooa11y'); return true; } } PKAA#]ըcN��system/jooa11y/jooa11y.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_jooa11y</name> <author>Joomla! Project</author> <creationDate>2022-02</creationDate> <copyright>(C) 2021 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.2.0</version> <description>PLG_SYSTEM_JOOA11Y_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\Jooa11y</namespace> <files> <folder plugin="jooa11y">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_system_jooa11y.ini</language> <language tag="en-GB">language/en-GB/plg_system_jooa11y.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="showAlways" type="radio" label="PLG_SYSTEM_JOOA11Y_FIELD_SHOW_ALWAYS" description="PLG_SYSTEM_JOOA11Y_FIELD_SHOW_ALWAYS_DESC" layout="joomla.form.field.radio.switcher" default="0" filter="integer" > <option value="0">JOFF</option> <option value="1">JON</option> </field> <field name="checkRoot" type="text" label="PLG_SYSTEM_JOOA11Y_FIELD_CHECK_ROOT" description="PLG_SYSTEM_JOOA11Y_FIELD_CHECK_ROOT_DESC" default="main" filter="string" /> <field name="readabilityRoot" type="text" label="PLG_SYSTEM_JOOA11Y_FIELD_READABILITY_ROOT" description="PLG_SYSTEM_JOOA11Y_FIELD_READABILITY_ROOT_DESC" default="main" filter="string" /> <field name="containerIgnore" type="text" label="PLG_SYSTEM_JOOA11Y_FIELD_CONTAINER_IGNORE" description="PLG_SYSTEM_JOOA11Y_FIELD_CONTAINER_IGNORE_DESC" filter="string" /> </fieldset> </fields> </config> </extension> PKAA#]�"���system/log/log.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_log</name> <author>Joomla! Project</author> <creationDate>2007-04</creationDate> <copyright>(C) 2007 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_LOG_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\Log</namespace> <files> <folder plugin="log">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_system_log.ini</language> <language tag="en-GB">language/en-GB/plg_system_log.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="log_username" type="radio" layout="joomla.form.field.radio.switcher" label="PLG_SYSTEM_LOG_FIELD_LOG_USERNAME_LABEL" default="0" filter="integer" > <option value="0">JNO</option> <option value="1">JYES</option> </field> </fieldset> </fields> </config> </extension> PKAA#]�j�� system/log/src/Extension/Log.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.log * * @copyright (C) 2007 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Log\Extension; use Joomla\CMS\Authentication\Authentication; use Joomla\CMS\Log\Log as Logger; use Joomla\CMS\Plugin\CMSPlugin; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! System Logging Plugin. * * @since 1.5 */ final class Log extends CMSPlugin { /** * Called if user fails to be logged in. * * @param array $response Array of response data. * * @return void * * @since 1.5 */ public function onUserLoginFailure($response) { $errorlog = []; switch ($response['status']) { case Authentication::STATUS_SUCCESS: $errorlog['status'] = $response['type'] . ' CANCELED: '; $errorlog['comment'] = $response['error_message']; break; case Authentication::STATUS_FAILURE: $errorlog['status'] = $response['type'] . ' FAILURE: '; if ($this->params->get('log_username', 0)) { $errorlog['comment'] = $response['error_message'] . ' ("' . $response['username'] . '")'; } else { $errorlog['comment'] = $response['error_message']; } break; default: $errorlog['status'] = $response['type'] . ' UNKNOWN ERROR: '; $errorlog['comment'] = $response['error_message']; break; } Logger::addLogger([], Logger::INFO); try { Logger::add($errorlog['comment'], Logger::INFO, $errorlog['status']); } catch (\Exception $e) { // If the log file is unwriteable during login then we should not go to the error page return; } } } PKAA#]��� system/log/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.log * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\Log\Extension\Log; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Log( $dispatcher, (array) PluginHelper::getPlugin('system', 'log') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PKAA#]=ʠ9%%'system/helix3/layouts/frontend/rows.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die('Restricted Access'); use Joomla\CMS\Factory; use Joomla\CMS\Layout\FileLayout; //helper & model $helix3_class = JPATH_ROOT . '/plugins/system/helix3/core/classes/helix3.php'; if (file_exists($helix3_class)) { require_once $helix3_class; } $template = Factory::getApplication()->getTemplate(); $themepath = JPATH_THEMES . '/' . $template; $carea_file = $themepath . '/html/layouts/helix3/frontend/conponentarea.php'; $module_file = $themepath . '/html/layouts/helix3/frontend/modules.php'; $lyt_thm_path = $themepath . '/html/layouts/helix3/'; $layout_path_carea = (file_exists($carea_file)) ? $lyt_thm_path : JPATH_ROOT . '/plugins/system/helix3/layouts'; $layout_path_module = (file_exists($module_file)) ? $lyt_thm_path : JPATH_ROOT . '/plugins/system/helix3/layouts'; $data = $displayData; $output = ''; $output .= '<div class="row">'; foreach ($data['rowColumns'] as $key => $column) { //Responsive Utilities if (isset($column->settings->sm_col) && $column->settings->sm_col) { $column->className = str_replace('col-sm', 'col-md', $column->settings->sm_col) . ' ' . $column->className; } if (isset($column->settings->xs_col) && $column->settings->xs_col) { $column->className = str_replace('col-xs', 'col', $column->settings->xs_col) . ' ' . $column->className; } $hidden_on_phone = isset($column->settings->hidden_xs) && $column->settings->hidden_xs ? true : false; $hidden_on_tablet = isset($column->settings->hidden_sm) && $column->settings->hidden_sm ? true : false; $hidden_on_desktop = isset($column->settings->hidden_md) && $column->settings->hidden_md ? true : false; $responsive_class = ''; if ($hidden_on_desktop && $hidden_on_tablet && $hidden_on_phone) { $responsive_class = 'd-none'; } else if ($hidden_on_desktop && $hidden_on_tablet) { $responsive_class = 'd-block d-md-none'; } else if ($hidden_on_desktop && $hidden_on_phone) { $responsive_class = 'd-none d-md-block d-lg-none'; } else if ($hidden_on_tablet && $hidden_on_phone) { $responsive_class = 'd-none d-lg-block'; } else if ($hidden_on_desktop) { $responsive_class = 'd-lg-none'; } else if ($hidden_on_tablet) { $responsive_class = 'd-md-none d-lg-block'; } else if ($hidden_on_phone) { $responsive_class = 'd-none d-md-block'; } $column->className = $column->className . ' ' . $responsive_class; //End Responsive Utilities if ($column->settings->column_type) { //Component $getLayout = new FileLayout('frontend.conponentarea', $layout_path_carea); $output .= $getLayout->render($column); } else { // Module $getLayout = new FileLayout('frontend.modules', $layout_path_module); $output .= $getLayout->render($column); } } $output .= '</div>'; //.row echo $output; PKAA#]�@����+system/helix3/layouts/frontend/generate.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die('Restricted Access'); use Joomla\CMS\Factory; use Joomla\CMS\Layout\FileLayout; //helper & model $menu_class = JPATH_ROOT . '/plugins/system/helix3/core/classes/helix3.php'; if (file_exists($menu_class)) { require_once $menu_class; } $template = Factory::getApplication()->getTemplate(); $themepath = JPATH_THEMES . '/' . $template; $rows_file = $themepath . '/html/layouts/helix3/frontend/rows.php'; $lyt_thm_path = $themepath . '/html/layouts/helix3/'; $layout_path = (file_exists($rows_file)) ? $lyt_thm_path : JPATH_ROOT . '/plugins/system/helix3/layouts'; $data = $displayData; $output = ''; $output .= '<' . $data['sematic'] . ' id="' . $data['id'] . '"' . $data['row_class'] . '>'; if ($data['componentArea']) { if (! $data['pagebuilder'] && ! $data['fluidrow']) { $output .= '<div class="container">'; } } else { if (! $data['fluidrow']) { $output .= '<div class="container">'; } } $getLayout = new FileLayout('frontend.rows', $layout_path); $output .= $getLayout->render($data); if ($data['componentArea']) { if (! $data['pagebuilder']) { $output .= '</div>'; } } else { if (! $data['fluidrow']) { $output .= '</div>'; } } $output .= '</' . $data['sematic'] . '>'; echo $output; PKAA#]~�n�))*system/helix3/layouts/frontend/modules.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\Filter\OutputFilter; defined('_JEXEC') or die('Restricted Access'); //helper & model $menu_class = JPATH_ROOT . '/plugins/system/helix3/core/classes/helix3.php'; if (file_exists($menu_class)) { require_once $menu_class; } $data = $displayData; $output = ''; $output .= '<div id="sp-' . OutputFilter::stringURLSafe($data->settings->name) . '" class="' . $data->className . '">'; $output .= '<div class="sp-column ' . ($data->settings->custom_class) . '">'; $features = (Helix3::hasFeature($data->settings->name)) ? helix3::getInstance()->loadFeature[$data->settings->name] : []; foreach ($features as $key => $feature) { if (isset($feature['feature']) && $feature['load_pos'] == 'before') { $output .= $feature['feature']; } } $output .= '<jdoc:include type="modules" name="' . $data->settings->name . '" style="sp_xhtml" />'; foreach ($features as $key => $feature) { if (isset($feature['feature']) && $feature['load_pos'] != 'before') { $output .= $feature['feature']; } } $output .= '</div>'; //.sp-column $output .= '</div>'; //.sp- echo $output; PKAA#]nK���0system/helix3/layouts/frontend/conponentarea.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die('Restricted Access'); //Helix3 helix3::addLess('frontend-edit', 'frontend-edit'); helix3::addJS('frontend-edit.js'); $data = $displayData; $output = ''; $output .= '<div id="sp-component" class="' . $data->className . '">'; $output .= '<div class="sp-column ' . ($data->settings->custom_class) . '">'; $output .= '<jdoc:include type="message" />'; $output .= '<jdoc:include type="component" />'; $output .= '</div>'; $output .= '</div>'; echo $output; PKAA#]r}�8�!�!"system/helix3/layout/generated.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Filesystem\Folder; if (version_compare(JVERSION, '5.0', '>=')) { if (! class_exists('Joomla\\CMS\\Filesystem\\Folder') && class_exists('Joomla\\Filesystem\\Folder')) { class_alias('Joomla\\Filesystem\\Folder', 'Joomla\\CMS\\Filesystem\\Folder'); } } use Joomla\CMS\Language\Text; $types = Folder::files(dirname(__FILE__) . '/types', '\.php$', false, true); foreach ($types as $type) { require_once $type; } // require_once 'layout-settings/fields-helper.php'; require_once 'layout-settings/row-column-settings.php'; echo RowColumnSettings::getRowSettings($rowSettings); echo RowColumnSettings::getColumnSettings($columnSettings); $colGrid = [ '12' => '12', '66' => '6,6', '444' => '4,4,4', '3333' => '3,3,3,3', '48' => '4,8', '39' => '3,9', '363' => '3,6,3', '264' => '2,6,4', '210' => '2,10', '57' => '5,7', '237' => '2,3,7', '255' => '2,5,5', '282' => '2,8,2', '2442' => '2,4,4,2', ]; ?> <div class="hidden"> <div class="save-box"> <div class="form-group"> <label> <?php echo Text::_('HELIX_ENTER_LAYOUT_NAME'); ?> <input class="form-control addon-input addon-name" type="text" data-attrname="layout_name" value="" placeholder=""> </label> </div> </div> </div> <!-- Modal for all --> <div class="sp-modal" id="layout-modal" tabindex="-1" role="dialog" aria-labelledby="modal-label" aria-hidden="true"> <div class="sp-modal-dialog"> <div class="sp-modal-content"> <div class="sp-modal-header"> <button type="button" class="<?php echo JVERSION < 4 ? 'close' : 'btn-close'; ?>" data-dismiss="spmodal" aria-hidden="true"><?php echo JVERSION < 4 ? '×' : ''; ?></button> <h3 class="sp-modal-title" id="modal-label"></h3> </div> <div class="sp-modal-body"></div> <div class="sp-modal-footer"> <a href="javascript:void(0)" class="btn btn-success" id="save-settings" data-dismiss="spmodal"><?php echo Text::_('HELIX_APPLY'); ?></a> <button class="btn btn-danger" data-dismiss="spmodal" aria-hidden="true"><?php echo Text::_('HELIX_CANCEL'); ?></button> </div> </div> </div> </div> <div class="hidden"> <div id="layoutbuilder-section"> <div class="settings-section clearfix"> <div class="settings-left pull-left"> <a class="row-move" href="#"><i class="fa fa-arrows"></i></a> <strong class="section-title"><?php echo Text::_('HELIX_SECTION_TITLE'); ?></strong> </div> <div class="settings-right pull-right"> <ul class="button-group"> <li> <a class="btn btn-default btn-small btn-sm add-columns" href="#"><i class="fa fa-columns"></i> <?php echo Text::_('HELIX_ADD_COLUMNS'); ?></a> <ul class="column-list"> <?php foreach ($colGrid as $key => $grid) { $active = ($key == 12) ? ' active' : ''; echo '<li><a href="#" class="column-layout hasTooltip column-layout-' . $key . $active . '" data-layout="' . $grid . '" data-original-title="<strong>' . $grid . '</strong>"></a></li>'; $active = ''; } ?> <li><a href="#" class="hasTooltip column-layout-custom column-layout custom <?php echo $active; ?>" data-layout="" data-type='custom' data-original-title="<strong>Custom Layout</strong>"></a></li> </ul> </li> <li><a class="btn btn-default btn-small btn-sm add-row" href="#"><i class="fa fa-bars"></i> <?php echo Text::_('HELIX_ADD_ROW'); ?></a></li> <li><a class="btn btn-default btn-small btn-sm row-ops-set" href="#"><i class="fa fa-gears"></i> <?php echo Text::_('HELIX_SETTINGS'); ?></a></li> <li><a class="btn btn-danger btn-small remove-row" href="#"><i class="fa fa-times"></i> <?php echo Text::_('HELIX_REMOVE'); ?></a></li> </ul> </div> </div> <div class="row ui-sortable"> <div class="layout-column col-sm-12"> <div class="column"> <h6 class="col-title pull-left"><?php echo Text::_('HELIX_NONE'); ?></h6> <a class="col-ops-set pull-right" href="#" ><i class="fa fa-gears"></i></a> </div> </div> </div> </div> </div> <div class="clearfix"></div> <!-- Layout Builder Section --> <div id="helix-layout-builder" > <?php if ($layout_data) { foreach ($layout_data as $row) { $rowSettings = RowColumnSettings::getSettings($row->settings); $name = Text::_('HELIX_SECTION_TITLE'); if (isset($row->settings->name)) { $name = $row->settings->name; } ?> <div class="layoutbuilder-section" <?php echo $rowSettings; ?>> <div class="settings-section clearfix"> <div class="settings-left pull-left"> <a class="row-move" href="#"><i class="fa fa-arrows"></i></a> <strong class="section-title"><?php echo $name; ?></strong> </div> <div class="settings-right pull-right"> <ul class="button-group"> <li> <a class="btn btn-default btn-small btn-sm add-columns" href="#"><i class="fa fa-columns"></i> <?php echo Text::_('HELIX_ADD_COLUMNS'); ?></a> <ul class="column-list"> <?php $active = ''; foreach ($colGrid as $key => $grid) { if ($key == $row->layout) { $active = 'active'; } echo '<li><a href="#" class="column-layout hasTooltip column-layout-' . $key . ' ' . $active . '" data-layout="' . $grid . '" data-original-title="<strong>' . $grid . '</strong>"></a></li>'; $active = ''; }?> <?php $customLayout = ''; if (! isset($colGrid[$row->layout])) { $active = 'active'; $split = str_split($row->layout); $customLayout = implode(',', $split); } ?> <li><a href="#" class="hasTooltip column-layout-custom column-layout custom <?php echo $active; ?>" data-layout="<?php echo $customLayout; ?>" data-type='custom' data-original-title="<strong>Custom Layout</strong>"></a></li> </ul> </li> <li><a class="btn btn-default btn-small btn-sm add-row" href="#"><i class="fa fa-bars"></i> <?php echo Text::_('HELIX_ADD_ROW'); ?></a></li> <li><a class="btn btn-default btn-small btn-sm row-ops-set" href="#"><i class="fa fa-gears"></i> <?php echo Text::_('HELIX_SETTINGS'); ?></a></li> <li><a class="btn btn-danger btn-small remove-row" href="#"><i class="fa fa-times"></i> <?php echo Text::_('HELIX_REMOVE'); ?></a></li> </ul> </div> </div> <div class="row ui-sortable"> <?php foreach ($row->attr as $column) {$colSettings = RowColumnSettings::getSettings($column->settings); ?> <div class="<?php echo $column->className; ?>" <?php echo $colSettings; ?>> <div class="column"> <?php if (isset($column->settings->column_type) && $column->settings->column_type) { echo '<h6 class="col-title pull-left">Component</h6>'; } else { if (! isset($column->settings->name)) { $column->settings->name = 'none'; } echo '<h6 class="col-title pull-left">' . $column->settings->name . '</h6>'; } ?> <a class="col-ops-set pull-right" href="#" ><i class="fa fa-gears"></i></a> </div> </div> <?php }?> </div> </div> <?php } } ?> </div> <div class="clearfix"></div> PKAA#]�ͺ\��$system/helix3/layout/types/color.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\HTML\HTMLHelper; //no direct accees defined('_JEXEC') or die('resticted aceess'); class SpTypeColor { public static function getInput($key, $attr) { if (! isset($attr['std'])) { $attr['std'] = ''; } // Including fallback code for HTML5 non supported browsers. HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'system/html5fallback.js', ['version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9']); $output = '<div class="form-group">'; $output .= '<label>' . $attr['title'] . '</label>'; $output .= '<input type="text" class="sppb-color addon-input form-control" data-attrname="' . $key . '" placeholder="#rrggbb" value="' . $attr['std'] . '">'; if ((isset($attr['desc'])) && (isset($attr['desc']) != '')) { $output .= '<p class="help-block">' . $attr['desc'] . '</p>'; } $output .= '</div>'; return $output; } } PKAA#]A!�MM%system/helix3/layout/types/select.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); class SpTypeSelect { public static function getInput($key, $attr) { if (! isset($attr['std'])) { $attr['std'] = ''; } $output = '<div class="form-group ' . $key . '">'; $output .= '<label>' . $attr['title'] . '</label>'; $output .= '<select class="form-control form-select addon-input" data-attrname="' . $key . '">'; foreach ($attr['values'] as $key => $value) { $output .= '<option value="' . $key . '" ' . (($attr['std'] == $key) ? 'selected' : '') . '>' . $value . '</option>'; } $output .= '</select>'; if ((isset($attr['desc'])) && (isset($attr['desc']) != '')) { $output .= '<p class="help-block">' . $attr['desc'] . '</p>'; } $output .= '</div>'; return $output; } } PKAA#]"F���$system/helix3/layout/types/media.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; class SpTypeMedia { public static function getInput($key, $attr) { if (! isset($attr['std'])) { $attr['std'] = ''; } if ($attr['std'] != '') { $src = 'src="' . Uri::root() . $attr['std'] . '"'; } else { $src = ''; } $output = '<div class="form-group">'; $output .= '<label>' . $attr['title'] . '</label>'; $output .= '<div class="media">'; // Joomla if (JVERSION < 4) { HTMLHelper::_('jquery.framework'); HTMLHelper::_('behavior.modal'); $output .= '<div class="input-group-j3">'; $output .= '<input type="text" data-attrname="' . $key . '" class="input-media addon-input form-control form-control-w-auto" value="' . htmlspecialchars($attr['std'], ENT_COMPAT, 'UTF-8') . '" readonly="readonly">'; $output .= '<a class="modal sppb-btn sppb-btn-primary button-select" title="Select" rel="{handler: \'iframe\', size: {x: 800, y: 500}}">Select</a>'; $output .= ' <a class="sppb-btn sppb-btn-danger remove-media" href="#"><i class="icon-remove"></i></a>'; $output .= '</div>'; } else { $url = 'index.php?option=com_media&view=media&tmpl=component'; $id = 'helix3_modal'; $modalHTML = HTMLHelper::_( 'bootstrap.renderModal', 'imageModal_' . $id, [ 'url' => $url, 'title' => Text::_('JLIB_FORM_CHANGE_IMAGE'), 'closeButton' => true, 'height' => '100%', 'width' => '100%', 'modalWidth' => '80', 'bodyHeight' => '60', 'footer' => '<button type="button" class="btn btn-success button-save-selected">' . Text::_('JSELECT') . '</button>' . '<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">' . Text::_('JCANCEL') . '</button>', ] ); $output .= '<joomla-field-media class="field-media-wrapper" type="image" base-path="' . Uri::root() . '" root-folder="' . ComponentHelper::getParams('com_media')->get('file_path', 'images') . '" url="' . $url . '" modal-container=".modal" modal-width="100%" modal-height="400px" input=".field-media-input" button-select=".button-select" button-clear=".button-clear" button-save-selected=".button-save-selected">'; $output .= $modalHTML; $output .= '<div class="input-group">'; $output .= '<input type="text" data-attrname="' . $key . '" class="input-media addon-input form-control form-control-w-auto field-media-input" value="' . htmlspecialchars($attr['std'], ENT_COMPAT, 'UTF-8') . '" readonly="readonly">'; $output .= '<button type="button" class="btn btn-success button-select">' . Text::_('JLIB_FORM_BUTTON_SELECT') . '</button>'; $output .= '<button type="button" class="btn btn-danger button-clear"><span class="icon-times" aria-hidden="true"></span><span class="visually-hidden">' . Text::_('JLIB_FORM_BUTTON_CLEAR') . '</span></button>'; $output .= '</div>'; $output .= '</joomla-field-media>'; } $output .= '</div>'; if ((isset($attr['desc'])) && (isset($attr['desc']) != '')) { $output .= '<p class="help-block">' . $attr['desc'] . '</p>'; } $output .= '</div>'; return $output; } } PKAA#]���S#system/helix3/layout/types/text.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); class SpTypeText { public static function getInput($key, $attr) { if (! isset($attr['std'])) { $attr['std'] = ''; } if (! isset($attr['placeholder'])) { $attr['placeholder'] = ''; } $output = '<div class="form-group">'; $output .= '<label>' . $attr['title'] . '</label>'; $output .= '<input class="form-control addon-input addon-' . $key . '" type="text" data-attrname="' . $key . '" value="' . $attr['std'] . '" placeholder="' . $attr['placeholder'] . '" />'; if ((isset($attr['desc'])) && (isset($attr['desc']) != '')) { $output .= '<p class="help-block">' . $attr['desc'] . '</p>'; } $output .= '</div>'; return $output; } } PKAA#]��'jj'system/helix3/layout/types/checkbox.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); class SpTypeCheckbox { public static function getInput($key, $attr) { if (isset($attr['value'])) { $attr['std'] = $attr['value']; } else { if (! isset($attr['std'])) { $attr['std'] = '0'; } } $output = '<div class="form-group">'; $output .= '<div class="checkbox">'; $output .= '<label>'; $output .= '<input class="addon-input input-' . $key . '" data-attrname="' . $key . '" type="checkbox" ' . (($attr['std'] == 1) ? 'checked' : '') . '> ' . $attr['title']; $output .= '</label>'; $output .= '</div>'; if ((isset($attr['desc'])) && (isset($attr['desc']) != '')) { $output .= '<p class="help-block">' . $attr['desc'] . '</p>'; } $output .= '</div>'; return $output; } } PKAA#]��3��6system/helix3/layout/layout-settings/fields-helper.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); if (version_compare(JVERSION, '5.0', '>=')) { if (! class_exists('Joomla\\CMS\\Filesystem\\Folder') && class_exists('Joomla\\Filesystem\\Folder')) { class_alias('Joomla\\Filesystem\\Folder', 'Joomla\\CMS\\Filesystem\\Folder'); } } use Joomla\CMS\Filesystem\Folder; class FieldsHelper { protected function __construct() { $types = Folder::files(dirname(__FILE__) . '/types', '\.php$', false, true); foreach ($types as $type) { require_once $type; } } protected static function getInputElements($key, $attr) { return call_user_func(['SpType' . ucfirst($attr['type']), 'getInput'], $key, $attr); } } PKAA#]lD�U�,�,<system/helix3/layout/layout-settings/row-column-settings.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; $rowSettings = [ 'type' => 'general', 'title' => '', 'attr' => [ 'name' => [ 'type' => 'text', 'title' => Text::_('HELIX_SECTION_TITLE'), 'desc' => Text::_('HELIX_SECTION_TITLE_DESC'), 'std' => '', ], 'background_color' => [ 'type' => 'color', 'title' => Text::_('HELIX_SECTION_BACKGROUND_COLOR'), 'desc' => Text::_('HELIX_SECTION_BACKGROUND_COLOR_DESC'), ], 'color' => [ 'type' => 'color', 'title' => Text::_('HELIX_SECTION_TEXT_COLOR'), 'desc' => Text::_('HELIX_SECTION_TEXT_COLOR_DESC'), ], 'background_image' => [ 'type' => 'media', 'title' => Text::_('HELIX_SECTION_BACKGROUND_IMAGE'), 'desc' => Text::_('HELIX_SECTION_BACKGROUND_IMAGE_DESC'), 'std' => '', ], 'background_repeat' => [ 'type' => 'select', 'title' => Text::_('HELIX_BG_REPEAT'), 'desc' => Text::_('HELIX_BG_REPEAT_DESC'), 'values' => [ 'no-repeat' => Text::_('HELIX_BG_REPEAT_NO'), 'repeat' => Text::_('HELIX_BG_REPEAT_ALL'), 'repeat-x' => Text::_('HELIX_BG_REPEAT_HORIZ'), 'repeat-y' => Text::_('HELIX_BG_REPEAT_VERTI'), 'inherit' => Text::_('HELIX_BG_REPEAT_INHERIT'), ], 'std' => 'no-repeat', ], 'background_size' => [ 'type' => 'select', 'title' => Text::_('HELIX_BG_SIZE'), 'desc' => Text::_('HELIX_BG_SIZE_DESC'), 'values' => [ 'cover' => Text::_('HELIX_BG_COVER'), 'contain' => Text::_('HELIX_BG_CONTAIN'), 'inherit' => Text::_('HELIX_BG_INHERIT'), ], 'std' => 'cover', ], 'background_attachment' => [ 'type' => 'select', 'title' => Text::_('HELIX_BG_ATTACHMENT'), 'desc' => Text::_('HELIX_BG_ATTACHMENT_DESC'), 'values' => [ 'fixed' => Text::_('HELIX_BG_ATTACHMENT_FIXED'), 'scroll' => Text::_('HELIX_BG_ATTACHMENT_SCROLL'), 'inherit' => Text::_('HELIX_BG_ATTACHMENT_INHERIT'), ], 'std' => 'fixed', ], 'background_position' => [ 'type' => 'select', 'title' => Text::_('HELIX_BG_POSITION'), 'desc' => Text::_('HELIX_BG_POSITION_DESC'), 'values' => [ '0 0' => Text::_('HELIX_BG_POSITION_LEFT_TOP'), '0 50%' => Text::_('HELIX_BG_POSITION_LEFT_CENTER'), '0 100%' => Text::_('HELIX_BG_POSITION_LEFT_BOTTOM'), '50% 0' => Text::_('HELIX_BG_POSITION_CENTER_TOP'), '50% 50%' => Text::_('HELIX_BG_POSITION_CENTER_CENTER'), '50% 100%' => Text::_('HELIX_BG_POSITION_CENTER_BOTTOM'), '100% 0' => Text::_('HELIX_BG_POSITION_RIGHT_TOP'), '100% 50%' => Text::_('HELIX_BG_POSITION_RIGHT_CENTER'), '100% 100%' => Text::_('HELIX_BG_POSITION_RIGHT_BOTTOM'), ], 'std' => '0 0', ], 'link_color' => [ 'type' => 'color', 'title' => Text::_('HELIX_LINK_COLOR'), 'desc' => Text::_('HELIX_LINK_COLOR_DESC'), ], 'link_hover_color' => [ 'type' => 'color', 'title' => Text::_('HELIX_LINK_HOVER_COLOR'), 'desc' => Text::_('HELIX_LINK_HOVER_COLOR_DESC'), ], 'hidden_xs' => [ 'type' => 'checkbox', 'title' => Text::_('HELIX_HIDDEN_MOBILE'), 'desc' => Text::_('HELIX_HIDDEN_MOBILE_DESC'), 'std' => '', ], 'hidden_sm' => [ 'type' => 'checkbox', 'title' => Text::_('HELIX_HIDDEN_TABLET'), 'desc' => Text::_('HELIX_HIDDEN_TABLET_DESC'), 'std' => '', ], 'hidden_md' => [ 'type' => 'checkbox', 'title' => Text::_('HELIX_HIDDEN_DESKTOP'), 'desc' => Text::_('HELIX_HIDDEN_DESKTOP_DESC'), 'std' => '', ], 'padding' => [ 'type' => 'text', 'title' => Text::_('HELIX_PADDING'), 'desc' => Text::_('HELIX_PADDING_DESC'), 'std' => '', ], 'margin' => [ 'type' => 'text', 'title' => Text::_('HELIX_MARGIN'), 'desc' => Text::_('HELIX_MARGIN_DESC'), 'std' => '', ], 'fluidrow' => [ 'type' => 'checkbox', 'title' => Text::_('HELIX_ROW_FULL_WIDTH'), 'desc' => Text::_('HELIX_ROW_FULL_WIDTH_DESC'), 'std' => '', ], 'custom_class' => [ 'type' => 'text', 'title' => Text::_('HELIX_CUSTOM_CLASS'), 'desc' => Text::_('HELIX_CUSTOM_CLASS_DESC'), 'std' => '', ], ], ]; $columnSettings = [ 'type' => 'general', 'title' => '', 'attr' => [ 'column_type' => [ 'type' => 'checkbox', 'title' => Text::_('HELIX_COMPONENT'), 'desc' => Text::_('HELIX_COMPONENT_DESC'), 'std' => '', ], 'name' => [ 'type' => 'select', 'title' => Text::_('HELIX_MODULE_POSITION'), 'desc' => Text::_('HELIX_MODULE_POSITION_DESC'), 'values' => [], 'std' => 'none', ], 'hidden_xs' => [ 'type' => 'checkbox', 'title' => Text::_('HELIX_HIDDEN_MOBILE'), 'desc' => Text::_('HELIX_HIDDEN_MOBILE_DESC'), 'std' => '', ], 'hidden_sm' => [ 'type' => 'checkbox', 'title' => Text::_('HELIX_HIDDEN_TABLET'), 'desc' => Text::_('HELIX_HIDDEN_TABLET_DESC'), 'std' => '', ], 'hidden_md' => [ 'type' => 'checkbox', 'title' => Text::_('HELIX_HIDDEN_DESKTOP'), 'desc' => Text::_('HELIX_HIDDEN_DESKTOP_DESC'), 'std' => '', ], 'sm_col' => [ 'type' => 'select', 'title' => Text::_('HELIX_TABLET_LAYOUT'), 'desc' => Text::_('HELIX_TABLET_LAYOUT_DESC'), 'values' => [ '' => "", 'col-sm-1' => 'col-md-1', 'col-sm-2' => 'col-md-2', 'col-sm-3' => 'col-md-3', 'col-sm-4' => 'col-md-4', 'col-sm-5' => 'col-md-5', 'col-sm-6' => 'col-md-6', 'col-sm-7' => 'col-md-7', 'col-sm-8' => 'col-md-8', 'col-sm-9' => 'col-md-9', 'col-sm-10' => 'col-md-10', 'col-sm-11' => 'col-md-11', 'col-sm-12' => 'col-md-12', ], 'std' => '', ], 'xs_col' => [ 'type' => 'select', 'title' => Text::_('HELIX_MOBILE_LAYOUT'), 'desc' => Text::_('HELIX_MOBILE_LAYOUT_DESC'), 'values' => [ '' => "", 'col-xs-1' => 'col-1', 'col-xs-2' => 'col-2', 'col-xs-3' => 'col-3', 'col-xs-4' => 'col-4', 'col-xs-5' => 'col-5', 'col-xs-6' => 'col-6', 'col-xs-7' => 'col-7', 'col-xs-8' => 'col-8', 'col-xs-9' => 'col-9', 'col-xs-10' => 'col-10', 'col-xs-11' => 'col-11', 'col-xs-12' => 'col-12', ], 'std' => '', ], 'custom_class' => [ 'type' => 'text', 'title' => Text::_('HELIX_CUSTOM_CLASS'), 'desc' => Text::_('HELIX_CUSTOM_CLASS_DESC'), 'std' => '', ], ], ]; class RowColumnSettings { private static function getInputElements($key, $attr) { return call_user_func(['SpType' . ucfirst($attr['type']), 'getInput'], $key, $attr); } public static function getRowSettings($row_settings = []) { $output = '<div class="hidden">'; $output .= '<div class="row-settings">'; foreach ($row_settings['attr'] as $key => $rowAttr) { $output .= self::getInputElements($key, $rowAttr); } $output .= '</div>'; $output .= '</div>'; return $output; } public static function getColumnSettings($col_settings = []) { $col_settings['attr']['name']['values'] = self::getPositionss(); $output = '<div class="hidden">'; $output .= '<div class="column-settings">'; foreach ($col_settings['attr'] as $key => $rowAttr) { $output .= self::getInputElements($key, $rowAttr); } $output .= '</div>'; $output .= '</div>'; return $output; } public static function getTemplateName() { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName(['template'])); $query->from($db->quoteName('#__template_styles')); $query->where($db->quoteName('client_id') . ' = 0'); $query->where($db->quoteName('home') . ' = 1'); $db->setQuery($query); return $db->loadObject()->template; } public static function getPositionss() { $db = Factory::getDbo(); $query = 'SELECT `position` FROM `#__modules` WHERE `client_id`=0 AND ( `published` !=-2 AND `published` !=0 ) GROUP BY `position` ORDER BY `position` ASC'; $db->setQuery($query); $dbpositions = (array) $db->loadAssocList(); $template = self::getTemplateName(); $templateXML = JPATH_SITE . '/templates/' . $template . '/templateDetails.xml'; $template = simplexml_load_file($templateXML); $options = []; foreach ($dbpositions as $positions) { $options[] = $positions['position']; } foreach ($template->positions[0] as $position) { $options[] = (string) $position; } $options = array_unique($options); $selectOption = []; sort($selectOption); foreach ($options as $option) { $selectOption[$option] = $option; } return $selectOption; } public static function getSettings($config = null) { $data = ''; if ($config) { foreach ($config as $key => $value) { $data .= ' data-' . $key . '="' . $value . '"'; } } return $data; } } PKAA#]Rz1�T�T#system/helix3/fields/menulayout.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Menu\SiteMenu; use Joomla\CMS\Uri\Uri; $current_menu_id = $this->form->getValue('id'); function create_menu($current_menu_id) { $items = menuItems(); $menus = new SiteMenu(); if (isset($items[$current_menu_id])) { $item = $items[$current_menu_id]; foreach ($item as $key => $item_id) { echo '<li>'; echo $menus->getItem($item_id)->title; echo '</li>'; } } } function menuItems() { $menus = new SiteMenu(); $menus = $menus->getMenu(); $new = []; foreach ($menus as $item) { $new[$item->parent_id][] = $item->id; } return $new; } function getModuleNameId($id = 'all') { $db = Factory::getDbo(); if ($id == 'all') { $query = 'SELECT id, title FROM `#__modules` WHERE ( `published` !=-2 AND `published` !=0 ) AND client_id = 0'; } else { $query = 'SELECT id, title FROM `#__modules` WHERE ( `published` !=-2 AND `published` !=0 ) AND id = ' . $id; } $db->setQuery($query); return $db->loadObjectList(); } $modules = getModuleNameId(); ?> <?php $menu_width = 600; $align = 'right'; $layout = ''; if (isset($menu_data->width)) { $menu_width = $menu_data->width; } if (isset($menu_data->menuAlign)) { $align = $menu_data->menuAlign; } if (isset($menu_data->layout)) { $layout = $menu_data->layout; } ?> <?php $items = menuItems(); $item = []; if (isset($items[$current_menu_id]) && ! empty($items[$current_menu_id])) { $item = $items[$current_menu_id]; } $menuItems = new SiteMenu(); $no_child = true; $count = 0; $x_key = 0; $y_key = 0; $check_child = 0; $item_array = []; foreach ($item as $key => $id) { $status = 0; if (isset($items[$id]) && is_array($items[$id])) { $no_child = false; $count = $count + 1; $check_child = $check_child + 1; $status = 1; } if ($check_child === 2) { $y_key = 0; $x_key = $x_key + 1; $check_child = 1; } $item_array[$x_key][$y_key] = [$id, $status]; $y_key = $y_key + 1; } if ($no_child === true) { $count = 1; } if ($count > 4 && $count != 6) { $count = 4; } ?> <div class="row<?php echo JVERSION < 4 ? '-fluid' : ''; ?>"> <div class="<?php echo JVERSION < 4 ? 'span2' : 'col-lg-2'; ?>"> <h3 class="sidebar-title"><?php echo Text::_('HELIX_MENU_DRAG_MODULE'); ?></h3> <div class="modules-list"> <?php $modules = getModuleNameId(); if ($modules) { foreach ($modules as $module) { echo '<div class="draggable-module" data-mod_id="' . $module->id . '">' . $module->title . '<i class="fa fa-remove"></i><i class="fa fa-arrows"></i></div>'; } }?> </div> </div> <div class="<?php echo JVERSION < 4 ? 'span10' : 'col-lg-10'; ?>"> <div class="action-bar"> <ul> <li> <strong><?php echo Text::_('HELIX_MENU_SUB_WIDTH'); ?></strong> <input type="number" id="menuWidth" class="form-control" name="width" value="<?php echo $menu_width; ?>"> </li> <li id="sizeShape"><a href="#" class="add-layout btn btn-primary"><i class="fa fa-plus"></i> <?php echo Text::_('HELIX_MENU_MANAGE_LAYOUT'); ?></a></li> <li class="btn-group d-inline-flex"> <a class="alignment btn btn-default <?php echo($align == 'left') ? 'active' : ''; ?>" data-al_flag="left" href="#"><?php echo Text::_('HELIX_GLOBAL_LEFT'); ?></a> <a class="alignment btn btn-default <?php echo($align == 'center') ? 'active' : ''; ?>" data-al_flag="center" href="#"><?php echo Text::_('HELIX_GLOBAL_CENTER'); ?></a> <a class="alignment btn btn-default <?php echo($align == 'right') ? 'active' : ''; ?>" data-al_flag="right" href="#"><?php echo Text::_('HELIX_GLOBAL_RIGHT'); ?></a> <a class="alignment btn btn-default <?php echo($align == 'full') ? 'active' : ''; ?>" data-al_flag="full" href="#"><?php echo Text::_('HELIX_GLOBAL_FULL'); ?></a> </li> <li class="btn-group"> <a class="layout-reset btn btn-success"href="#" data-current_item="<?php echo $current_menu_id; ?>"><i class="fa fa-refresh"></i> <?php echo Text::_('HELIX_GLOBAL_RESET'); ?></a> </li> </ul> </div> <div id="megamenulayout" style="width:<?php echo $menu_width; ?>px;" data-width="<?php echo $menu_width; ?>" data-menu_item="<?php echo $count; ?>" data-menu_align="<?php echo $align; ?>"> <?php if ($layout) { foreach ($layout as $key => $row) { ?> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <?php foreach ($row->attr as $key => $column) {?> <div class="column sp-col-sm-<?php echo $column->colGrid; ?>" data-column="<?php echo $column->colGrid; ?>"> <div class="column-items-wrap"> <?php $menus_id = $column->menuParentId; $modId = $column->moduleId; if ($menus_id) { $menu_id_array = explode(',', $menus_id); foreach ($menu_id_array as $menuId) { ?> <?php if (in_array($menuId, $item)) {?> <h4 data-current_child="<?php echo $menuId; ?>" ><?php echo $menuItems->getItem($menuId)->title; ?></h4> <?php } else if ($current_menu_id != $menuId) {?> <h4 style="display:none" data-current_child="<?php echo $menuId; ?>" ><?php echo $menuItems->getItem($current_menu_id)->title; ?></h4> <?php } else if (isset($menuId)) {?> <h4 style="display:none" data-current_child="<?php echo $menuId; ?>" ><?php echo $menuItems->getItem($menuId)->title; ?></h4> <?php }?> <?php if (isset($items[$menuId])) {?> <ul class="child-menu-items"> <?php echo create_menu($menuId); ?> </ul> <?php }?> <?php } } ?> <div class="modules-container"><?php if ($modId) { $modArray = explode(',', $modId); foreach ($modArray as $mod_id) { $modules = getModuleNameId($mod_id); if ($modules) { $module = $modules[0]; ?> <div class='draggable-module' data-mod_id="<?php echo $module->id; ?>"><?php echo $module->title; ?><i class="fa fa-remove"></i><i class="fa fa-arrows"></i></div> <?php } } }?></div> </div> </div> <?php }?> </div> </div> <?php } } else if ($no_child === true) { echo '<div class="menu-section">'; echo '<span class="row-move"><i class="fa fa-bars"></i></span>'; echo '<div class="spmenu sp-row">'; echo '<div class="column sp-col-md-12" data-column="12">'; echo '<div class="column-items-wrap">'; echo '<h4 style="display:none" data-current_child="' . $current_menu_id . '" >' . $menuItems->getItem($current_menu_id)->title . '</h4>'; echo '<ul class="child-menu-items">'; foreach ($item as $key => $id) { echo '<li>' . $menuItems->getItem($id)->title . '</li>'; } echo '</ul>'; echo '<div class="modules-container">'; echo '</div>'; echo '</div>'; echo '</div>'; echo '</div>'; echo '</div>'; } else { echo '<div class="menu-section">'; echo '<span class="row-move"><i class="fa fa-bars"></i></span>'; echo '<div class="spmenu sp-row">'; $columnNumber = 12 / $count; foreach ($item_array as $key => $item_array) { echo '<div class="column sp-col-md-' . $columnNumber . '" data-column="' . $columnNumber . '">'; echo '<div class="column-items-wrap">'; foreach ($item_array as $key => $item) { $id = $item[0]; echo '<h4 data-current_child="' . $id . '" >' . $menuItems->getItem($id)->title . '</h4>'; if ($item[1]) { echo '<ul class="child-menu-items">'; echo create_menu($id); echo '</ul>'; } } echo '<div class="modules-container"></div>'; echo '</div>'; echo '</div>'; } echo '</div>'; echo '</div>'; }?> </div> </div> </div> <div class="sp-modal" id="layout-modal" tabindex="-1" role="dialog" aria-labelledby="modal-label" aria-hidden="true"> <div class="sp-modal-dialog"> <div class="sp-modal-content"> <div class="sp-modal-header"> <?php if (JVERSION < 4): ?> <button type="button" class="close" data-dismiss="spmodal" aria-hidden="true">×</button> <?php else: ?> <button type="button" class="btn-close" data-dismiss="spmodal" aria-hidden="true"></button> <?php endif; ?> <h3 class="sp-modal-title" id="modal-label"><?php echo Text::_('HELIX_MENU_CHOOSE_LAYOUT'); ?></h3> </div> <div class="sp-modal-body"> <ul class="menu-layout-list clearfix"> <li><a href="#" class="layout12" data-layout="12" data-design="layout12"><img src="<?php echo Uri::root(true) . '/plugins/system/helix3/assets/images/megamenu/12.png'; ?>" alt="12"></a></li> <li><a href="#" class="layout66" data-layout="6,6" data-design="layout66"><img src="<?php echo Uri::root(true) . '/plugins/system/helix3/assets/images/megamenu/6-6.png'; ?>" alt="6+6"></a></li> <li><a href="#" class="layout444" data-layout="4,4,4" data-design="layout444"><img src="<?php echo Uri::root(true) . '/plugins/system/helix3/assets/images/megamenu/4-4-4.png'; ?>" alt="4+4+4"></a></li> <li><a href="#" class="layout3333" data-layout="3,3,3,3" data-design="layout3333"><img src="<?php echo Uri::root(true) . '/plugins/system/helix3/assets/images/megamenu/3-3-3-3.png'; ?>" alt="3+3+3+3"></a></li> <li><a href="#" class="layout222222" data-layout="2,2,2,2,2,2" data-design="layout222222"><img src="<?php echo Uri::root(true) . '/plugins/system/helix3/assets/images/megamenu/2-2-2-2-2-2.png'; ?>" alt="2+2+2+2+2+2"></a></li> <li><a href="#" class="layout57" data-layout="5,7" data-design="layout57"><img src="<?php echo Uri::root(true) . '/plugins/system/helix3/assets/images/megamenu/5-7.png'; ?>" alt="5+7"></a></li> <li><a href="#" class="layout48" data-layout="4,8" data-design="layout48"><img src="<?php echo Uri::root(true) . '/plugins/system/helix3/assets/images/megamenu/4-8.png'; ?>" alt="4+8"></a></li> <li><a href="#" class="layout39" data-layout="3,9" data-design="layout39"><img src="<?php echo Uri::root(true) . '/plugins/system/helix3/assets/images/megamenu/3-9.png'; ?>" alt="3+9"></a></li> <li><a href="#" class="layout44412" data-layout="4,4,4,12" data-design="layout44412"><img src="<?php echo Uri::root(true) . '/plugins/system/helix3/assets/images/megamenu/4-4-4-12.png'; ?>" alt="4+4+4+12"></a></li> <li><a href="#" class="layout333312" data-layout="3,3,3,3,12" data-design="layout333312"><img src="<?php echo Uri::root(true) . '/plugins/system/helix3/assets/images/megamenu/3-3-3-3-12.png'; ?>" alt="3+3+3+3+12"></a></li> <li><a href="#" class="layout6612" data-layout="6,6,12" data-design="layout6612"><img src="<?php echo Uri::root(true) . '/plugins/system/helix3/assets/images/megamenu/6-6-12.png'; ?>" alt="6+6+12"></a></li> <li><a href="#" class="layout44466" data-layout="4,4,4,6,6" data-design="layout44466"><img src="<?php echo Uri::root(true) . '/plugins/system/helix3/assets/images/megamenu/4-4-4-6-6.png'; ?>" alt="4+4+4+6+6"></a></li> </ul> </div> </div> </div> </div> <div class="menu-layout"> <div class="layout-design" id="layout12"> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-12" data-column="12"> <div class="column-items-wrap">{0}</div> </div> </div> </div> </div> <div class="layout-design" id="layout66"> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-6" data-column="6"> <div class="column-items-wrap">{0}</div> </div> <div class="column sp-col-sm-6" data-column="6"> <div class="column-items-wrap">{1}</div> </div> </div> </div> </div> <div class="layout-design" id="layout444"> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-4" data-column="4"> <div class="column-items-wrap">{0}</div> </div> <div class="column sp-col-sm-4" data-column="4"> <div class="column-items-wrap">{1}</div> </div> <div class="column sp-col-sm-4" data-column="4"> <div class="column-items-wrap">{2}</div> </div> </div> </div> </div> <div class="layout-design" id="layout3333"> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-3" data-column="3"> <div class="column-items-wrap">{0}</div> </div> <div class="column sp-col-sm-3" data-column="3"> <div class="column-items-wrap">{1}</div> </div> <div class="column sp-col-sm-3" data-column="3"> <div class="column-items-wrap">{2}</div> </div> <div class="column sp-col-sm-3" data-column="3"> <div class="column-items-wrap">{3}</div> </div> </div> </div> </div> <div class="layout-design" id="layout222222"> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-2" data-column="2"> <div class="column-items-wrap">{0}</div> </div> <div class="column sp-col-sm-2" data-column="2"> <div class="column-items-wrap">{1}</div> </div> <div class="column sp-col-sm-2" data-column="2"> <div class="column-items-wrap">{2}</div> </div> <div class="column sp-col-sm-2" data-column="2"> <div class="column-items-wrap">{3}</div> </div> <div class="column sp-col-sm-2" data-column="2"> <div class="column-items-wrap">{4}</div> </div> <div class="column sp-col-sm-2" data-column="2"> <div class="column-items-wrap">{5}</div> </div> </div> </div> </div> <div class="layout-design" id="layout57"> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-5" data-column="5"> <div class="column-items-wrap">{0}</div> </div> <div class="column sp-col-sm-7" data-column="7"> <div class="column-items-wrap">{1}</div> </div> </div> </div> </div> <div class="layout-design" id="layout48"> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-4" data-column="4"> <div class="column-items-wrap">{0}</div> </div> <div class="column sp-col-sm-8" data-column="8"> <div class="column-items-wrap">{1}</div> </div> </div> </div> </div> <div class="layout-design" id="layout39"> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-3" data-column="3"> <div class="column-items-wrap">{0}</div> </div> <div class="column sp-col-sm-9" data-column="9"> <div class="column-items-wrap">{1}</div> </div> </div> </div> </div> <div class="layout-design" id="layout44412"> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-4" data-column="4"> <div class="column-items-wrap">{0}</div> </div> <div class="column sp-col-sm-4" data-column="4"> <div class="column-items-wrap">{1}</div> </div> <div class="column sp-col-sm-4" data-column="4"> <div class="column-items-wrap">{2}</div> </div> </div> </div> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-12" data-column="12"> <div class="column-items-wrap">{3}</div> </div> </div> </div> </div> <div class="layout-design" id="layout333312"> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-3" data-column="3"> <div class="column-items-wrap">{0}</div> </div> <div class="column sp-col-sm-3" data-column="3"> <div class="column-items-wrap">{1}</div> </div> <div class="column sp-col-sm-3" data-column="3"> <div class="column-items-wrap">{2}</div> </div> <div class="column sp-col-sm-3" data-column="3"> <div class="column-items-wrap">{3}</div> </div> </div> </div> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-12" data-column="12"> <div class="column-items-wrap">{4}</div> </div> </div> </div> </div> <div class="layout-design" id="layout6612"> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-6" data-column="6"> <div class="column-items-wrap">{0}</div> </div> <div class="column sp-col-sm-6" data-column="6"> <div class="column-items-wrap">{1}</div> </div> </div> </div> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-12" data-column="12"> <div class="column-items-wrap">{2}</div> </div> </div> </div> </div> <div class="layout-design" id="layout44466"> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-4" data-column="4"> <div class="column-items-wrap">{0}</div> </div> <div class="column sp-col-sm-4" data-column="4"> <div class="column-items-wrap">{1}</div> </div> <div class="column sp-col-sm-4" data-column="4"> <div class="column-items-wrap">{2}</div> </div> </div> </div> <div class="menu-section"> <span class="row-move"><i class="fa fa-bars"></i></span> <div class="spmenu sp-row"> <div class="column sp-col-sm-6" data-column="6"> <div class="column-items-wrap">{3}</div> </div> <div class="column sp-col-sm-6" data-column="6"> <div class="column-items-wrap">{4}</div> </div> </div> </div> </div> </div> PKAA#]pA" system/helix3/fields/presets.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Factory; use Joomla\CMS\Filesystem\Folder; use Joomla\CMS\Form\FormField; if (version_compare(JVERSION, '5.0', '>=')) { if (! class_exists('Joomla\\CMS\\Filesystem\\Folder') && class_exists('Joomla\\Filesystem\\Folder')) { class_alias('Joomla\\Filesystem\\Folder', 'Joomla\\CMS\\Filesystem\\Folder'); } } use Joomla\CMS\Uri\Uri; class JFormFieldPresets extends FormField { protected $type = 'Presets'; protected function getInput() { $template = $this->form->getValue('template'); $templatePresetsDir = JPATH_SITE . '/templates/' . $template . '/images/presets/'; $base_url = Uri::root(true) . '/templates/' . $template . '/images/presets/'; $root_path = JPATH_SITE . '/templates/' . $template . '/images/presets/'; $doc = Factory::getDocument(); $helix_url = Uri::root(true) . '/plugins/system/helix3/'; $folders = Folder::folders($templatePresetsDir); if (! defined('CURRENT_PRESET')) { define('CURRENT_PRESET', $this->value); $doc->addScriptDeclaration('var current_preset = "' . $this->value . '";'); } $html = ''; $app = Factory::getApplication(); $template = $app->getTemplate('shaper_helix3'); $params = $template->params; $variable = $params->get('variable'); natsort($folders); foreach ($folders as $folder) { $preset = basename($folder); $major_color = $preset . '_major'; if (isset($this->form->getValue('params')->$major_color) && $this->form->getValue('params')->$major_color) { $major = $this->form->getValue('params')->$major_color; } else { $major = '#333333'; } $html .= '<div style="background-color: ' . $major . '" data-preset="' . basename($folder) . '" class="preset' . (($this->value == basename($folder)) ? ' active' : '') . '">'; $html .= '<div class="preset-title">'; $html .= basename($folder); $html .= '</div>'; $html .= '<div class="preset-contents">'; $html .= '<label>'; $html .= '</div>'; $html .= '</label>'; $html .= '</div>'; } $html .= '<input type="hidden" id="template-preset" value="' . $this->value . '" name="' . $this->name . '" />'; return $html; } public function getLabel() { return false; } } PKAA#]�Ն+o o "system/helix3/fields/spgallery.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Factory; use Joomla\CMS\Filesystem\File; use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Session\Session; if (version_compare(JVERSION, '5.0', '>=')) { if (! class_exists('Joomla\\CMS\\Filesystem\\File') && class_exists('Joomla\\Filesystem\\File')) { class_alias('Joomla\\Filesystem\\File', 'Joomla\\CMS\\Filesystem\\File'); } } use Joomla\CMS\Uri\Uri; class JFormFieldSpgallery extends FormField { protected $type = 'Spgallery'; protected function getInput() { $doc = Factory::getDocument(); HTMLHelper::_('jquery.framework'); // $doc->addScript($plg_path . '/assets/js/jquery.ui.core.min.js'); // $doc->addScript($plg_path . '/assets/js/jquery.ui.sortable.min.js'); $plg_path = Uri::root(true) . '/plugins/system/helix3'; $doc->addScript($plg_path . '/assets/js/jquery-ui.min.js'); $doc->addScript($plg_path . '/assets/js/spgallery.js'); $doc->addStyleSheet($plg_path . '/assets/css/spgallery.css'); $values = json_decode($this->value); if ($values) { $images = $this->element['name'] . '_images'; $values = $values->$images; } else { $values = []; } $output = '<div class="sp-gallery-field" data-csrf-name="' . Session::getFormToken() . '">'; $output .= '<ul class="sp-gallery-items clearfix">'; if (is_array($values) && $values) { foreach ($values as $key => $value) { $data_src = $value; $src = Uri::root(true) . '/' . $value; $basename = basename($src); $thumbnail = JPATH_ROOT . '/' . dirname($value) . '/' . File::stripExt($basename) . '_thumbnail.' . File::getExt($basename); if (file_exists($thumbnail)) { $src = Uri::root(true) . '/' . dirname($value) . '/' . File::stripExt($basename) . '_thumbnail.' . File::getExt($basename); } $small_size = JPATH_ROOT . '/' . dirname($value) . '/' . File::stripExt($basename) . '_small.' . File::getExt($basename); if (file_exists($small_size)) { $src = Uri::root(true) . '/' . dirname($value) . '/' . File::stripExt($basename) . '_small.' . File::getExt($basename); } $output .= '<li data-src="' . $data_src . '"><a href="#" class="btn btn-mini btn-danger btn-remove-image">Delete</a><img src="' . $src . '" alt=""></li>'; } } $output .= '</ul>'; $output .= '<input type="file" class="sp-gallery-item-upload" accept="image/*" style="display:none;">'; $output .= '<a class="btn btn-default btn-outline-primary btn-sp-gallery-item-upload" href="#"><i class="fa fa-plus"></i> Upload Images</a>'; $output .= '<input type="hidden" name="' . $this->name . '" data-name="' . $this->element['name'] . '_images" id="' . $this->id . '" value="' . htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') . '" class="form-field-spgallery">'; $output .= '</div>'; return $output; } } PKAA#]�3p$��#system/helix3/fields/layoutlist.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Factory; use Joomla\CMS\Filesystem\Folder; use Joomla\CMS\Form\FormField; if (version_compare(JVERSION, '5.0', '>=')) { if (! class_exists('Joomla\\CMS\\Filesystem\\Folder') && class_exists('Joomla\\Filesystem\\Folder')) { class_alias('Joomla\\Filesystem\\Folder', 'Joomla\\CMS\\Filesystem\\Folder'); } } use Joomla\CMS\Language\Text; class JFormFieldLayoutlist extends FormField { protected $type = 'Layoutlist'; public function getInput() { $template = self::getTemplate(); $layoutPath = JPATH_SITE . '/templates/' . $template . '/layout/'; $laoutlist = Folder::files($layoutPath, '.json'); $htmls = '<div class="layoutlist"><select id="' . $this->id . '" class="form-select" name="' . $this->name . '">'; if ($laoutlist) { foreach ($laoutlist as $name) { $htmls .= '<option value="' . $name . '">' . str_replace('.json', '', $name) . '</option>'; } } $htmls .= '</select></div>'; $htmls .= '<div class="layout-button-wrap"><a href="#" class="btn btn-success layout-save-action" data-action="save">' . Text::_('HELIX_SAVE_COPY') . '</a>'; $htmls .= '<a href="#" class="btn btn-danger layout-del-action" data-action="remove">' . Text::_('HELIX_DELETE') . '</a></div>'; return $htmls; } public function getLabel() { return false; } //Get template name private static function getTemplate() { $id = (int) Factory::getApplication()->input->get('id', 0); $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName(['template'])); $query->from($db->quoteName('#__template_styles')); $query->where($db->quoteName('id') . ' = ' . $db->quote($id)); $db->setQuery($query); return $db->loadResult(); } } PKAA#]����system/helix3/fields/button.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Form\FormField; use Joomla\CMS\Language\Text; class JFormFieldButton extends FormField { protected $type = 'Button'; protected function getInput() { $url = ! empty($this->element['url']) ? $this->element['url'] : '#'; $class = ! empty($this->element['class']) ? ' ' . $this->element['class'] : ''; $text = ! empty($this->element['text']) ? $this->element['text'] : 'Button'; $target = ! empty($this->element['target']) ? $this->element['target'] : '_self'; return '<a id="' . $this->id . '" class="btn' . $class . '" href="' . $url . '" target="' . $target . '">' . Text::_($text) . '</a>'; } } PKAA#]"^�ɠ � system/helix3/fields/spimage.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Factory; use Joomla\CMS\Filesystem\File; use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Session\Session; if (version_compare(JVERSION, '5.0', '>=')) { if (! class_exists('Joomla\\CMS\\Filesystem\\File') && class_exists('Joomla\\Filesystem\\File')) { class_alias('Joomla\\Filesystem\\File', 'Joomla\\CMS\\Filesystem\\File'); } } use Joomla\CMS\Uri\Uri; class JFormFieldSpimage extends FormField { protected $type = 'Spimage'; protected function getInput() { $doc = Factory::getDocument(); HTMLHelper::_('jquery.framework'); $plg_path = Uri::root(true) . '/plugins/system/helix3'; $doc->addScript($plg_path . '/assets/js/spimage.js'); $doc->addStyleSheet($plg_path . '/assets/css/spimage.css'); if ($this->value) { $class1 = ' hide'; $class2 = ''; } else { $class1 = ''; $class2 = ' hide'; } $output = '<div class="sp-image-field clearfix" data-csrf-name="' . Session::getFormToken() . '">'; $output .= '<div class="sp-image-upload-wrapper">'; if ($this->value) { $data_src = $this->value; $src = Uri::root(true) . '/' . $data_src; $basename = basename($data_src); $thumbnail = JPATH_ROOT . '/' . dirname($data_src) . '/' . File::stripExt($basename) . '_thumbnail.' . File::getExt($basename); if (file_exists($thumbnail)) { $src = Uri::root(true) . '/' . dirname($data_src) . '/' . File::stripExt($basename) . '_thumbnail.' . File::getExt($basename); } $output .= '<img src="' . $src . '" data-src="' . $data_src . '" alt="">'; } $output .= '</div>'; $output .= '<input type="file" class="sp-image-upload" accept="image/*" style="display:none;">'; $output .= '<a class="btn btn-primary btn-sp-image-upload' . $class1 . '" href="#"><i class="fa fa-plus"></i> Upload Image</a>'; $output .= '<a class="btn btn-danger btn-sp-image-remove' . $class2 . '" href="#"><i class="fa fa-minus-circle"></i> Remove Image</a>'; $output .= '<input type="hidden" name="' . $this->name . '" id="' . $this->id . '" value="' . htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') . '" class="form-field-spimage">'; $output .= '</div>'; return $output; } } PKAA#]���@ @ system/helix3/fields/modpos.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Factory; use Joomla\CMS\Form\FormHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Version; FormHelper::loadFieldClass('text'); $version = new Version(); $JoomlaVersion = $version->getShortVersion(); if (version_compare($JoomlaVersion, '4.0.0', '>=')) { JLoader::registerAlias('JFormFieldText', 'Joomla\CMS\Form\Field\TextField'); } /** * Supports a modal article picker. * * @package Joomla.Administrator * @subpackage com_modules * @since 1.6 */ class JFormFieldModPos extends JFormFieldText { /** * The form field type. * * @var string * @since 1.6 */ protected $type = 'ModPos'; /** * Method to get the field input markup. * * @return string The field input markup. * @since 1.6 */ protected function getInput() { $db = Factory::getDbo(); $query = 'SELECT `position` FROM `#__modules` WHERE `client_id`=0 AND ( `published` !=-2 AND `published` !=0 ) GROUP BY `position` ORDER BY `position` ASC'; $db->setQuery($query); $dbpositions = (array) $db->loadAssocList(); $template = $this->form->getValue('template'); $templateXML = JPATH_SITE . '/templates/' . $template . '/templateDetails.xml'; $template = simplexml_load_file($templateXML); $options = []; foreach ($dbpositions as $positions) { $options[] = $positions['position']; } foreach ($template->positions[0] as $position) { $options[] = (string) $position; } $options = array_unique($options); $selectOption = []; sort($selectOption); foreach ($options as $option) { $selectOption[] = HTMLHelper::_('select.option', $option, $option); } return HTMLHelper::_('select.genericlist', $selectOption, 'jform[params][' . $this->element['name'] . ']', 'class="form-select ' . $this->element['class'] . '"', 'value', 'text', $this->value, 'jform_params_helix_' . $this->element['name']); } } PKAA#]随�#system/helix3/fields/typography.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Factory; use Joomla\CMS\Form\FormField; use Joomla\CMS\Language\Text; class JFormFieldTypography extends FormField { protected $type = 'Typography'; protected function getInput() { $template_path = JPATH_SITE . '/templates/' . self::getTemplate() . '/webfonts/webfonts.json'; $plugin_path = JPATH_PLUGINS . '/system/helix3/assets/webfonts/webfonts.json'; if (file_exists($template_path)) { $json = file_get_contents($template_path); } else { $json = file_get_contents($plugin_path); } $webfonts = json_decode($json); $items = $webfonts->items; $value = json_decode($this->value); if (isset($value->fontFamily)) { $font = self::filterArray($items, $value->fontFamily); } $html = ''; $classes = (! empty($this->element['class'])) ? $this->element['class'] : ''; //Font Family $html .= '<div class="webfont ' . $classes . '">'; $html .= '<div class="row row-fluid">'; $html .= '<div class="col-sm-3 span3 font-families">'; $html .= '<label class="control-label"><strong>' . Text::_('HELIX_FONT_FAMILY') . '</strong></label>'; $html .= '<select class="list-font-families form-select">'; foreach ($items as $item) { if (isset($value->fontFamily) && $item->family == $value->fontFamily) { $html .= '<option selected="selected" value="' . $item->family . '">' . $item->family . '</option>'; } else { $html .= '<option value="' . $item->family . '">' . $item->family . '</option>'; } } $html .= '</select>'; $html .= '</div>'; //Font Weight $html .= '<div class="col-sm-2 span2 font-weight">'; $html .= '<label class="control-label"><strong>' . Text::_('HELIX_FONT_WEIGHT_STYLE') . '</strong></label>'; $html .= '<select class="list-font-weight form-select">'; if (isset($value->fontFamily)) { foreach ($font->variants as $variant) { if ($variant == $value->fontWeight) { $html .= '<option selected="selected" value="' . $variant . '">' . $variant . '</option>'; } else { $html .= '<option value="' . $variant . '">' . $variant . '</option>'; } } } else { foreach ($items[0]->variants as $variant) { $html .= '<option value="' . $variant . '">' . $variant . '</option>'; } } $html .= '</select>'; $html .= '</div>'; //Font Subsets $html .= '<div class="col-sm-2 span2 font-subsets">'; $html .= '<label class="control-label"><strong>' . Text::_('HELIX_FONT_SUBSET') . '</strong></label>'; $html .= '<select class="list-font-subset form-select">'; if (isset($value->fontFamily)) { foreach ($font->subsets as $subset) { if ($subset == $value->fontSubset) { $html .= '<option selected="selected" value="' . $subset . '">' . $subset . '</option>'; } else { $html .= '<option value="' . $subset . '">' . $subset . '</option>'; } } } else { foreach ($items[0]->subsets as $subset) { $html .= '<option value="' . $subset . '">' . $subset . '</option>'; } } $html .= '</select>'; $html .= '</div>'; //Font Size $fontSize = (isset($value->fontSize)) ? $value->fontSize : ''; $html .= '<div class="col-sm-2 span2 font-size">'; $html .= '<label class="control-label"><strong>' . Text::_('HELIX_FONT_SIZE') . '</strong></label>'; $html .= '<input type="number" value="' . $fontSize . '" class="form-control webfont-size" min="1" placeholder="14">'; $html .= '</div>'; $html .= '</div>'; //Preview $html .= '<p style="display:none" class="webfont-preview">1 2 3 4 5 6 7 8 9 0 Grumpy wizards make toxic brew for the evil Queen and Jack.</p>'; $html .= '<input type="hidden" name="' . $this->name . '" value="' . $this->value . '" class="input-webfont" id="' . $this->id . '">'; $html .= '</div>'; return $html; } // Get current font private static function filterArray($items, $key) { foreach ($items as $item) { if ($item->family == $key) { return $item; } } return false; } //Get template name private static function getTemplate() { $id = (int) Factory::getApplication()->input->get('id', 0); $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName(['template'])); $query->from($db->quoteName('#__template_styles')); $query->where($db->quoteName('id') . ' = ' . $db->quote($id)); $db->setQuery($query); return $db->loadResult(); } } PKAA#]6و��!system/helix3/fields/megamenu.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Form\FormField; class JFormFieldMegamenu extends FormField { protected $type = "Megamenu"; public function getInput() { $mega_menu_path = JPATH_SITE . '/plugins/system/helix3/fields/'; $html = $this->getMegaSettings($mega_menu_path, json_decode($this->value)); $html .= '<input type="hidden" name="' . $this->name . '" id="' . $this->id . '" value="' . $this->value . '">'; return $html; } public function getMegaSettings($path, $value = null) { ob_start(); $menu_data = $value; include_once $path . 'menulayout.php'; $html = ob_get_contents(); ob_clean(); return $html; } } PKAA#]�F&� � system/helix3/fields/asset.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Factory; use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Uri\Uri; class JFormFieldAsset extends FormField { protected $type = 'Asset'; protected function getInput() { $v = $this->getVersion(); $helix_plg_url = Uri::root(true) . '/plugins/system/helix3'; $doc = Factory::getDocument(); $doc->addScriptdeclaration('var layoutbuilder_base="' . Uri::root() . '";'); $doc->addScriptDeclaration("var basepath = '{$helix_plg_url}';"); $doc->addScriptDeclaration("var pluginVersion = '{$v}';"); //Core scripts HTMLHelper::_('jquery.framework'); $jVersion = JVERSION < 4 ? '' : '.j4'; if (JVERSION < 4) { HTMLHelper::_('jquery.ui', ['core', 'sortable']); HTMLHelper::_('formbehavior.chosen', 'select'); } else { $doc->addScript($helix_plg_url . '/assets/js/jquery-ui.min.js?' . $v); } $doc->addScript($helix_plg_url . '/assets/js/helper' . $jVersion . '.js?' . $v); $doc->addScript($helix_plg_url . '/assets/js/webfont.js?' . $v); $doc->addScript($helix_plg_url . '/assets/js/modal.js?' . $v); $doc->addScript($helix_plg_url . '/assets/js/admin.general' . $jVersion . '.js?' . $v); $doc->addScript($helix_plg_url . '/assets/js/admin.layout' . $jVersion . '.js?' . $v); //CSS $doc->addStyleSheet($helix_plg_url . '/assets/css/bootstrap.css?' . $v); $doc->addStyleSheet($helix_plg_url . '/assets/css/modal.css?' . $v); $doc->addStyleSheet($helix_plg_url . '/assets/css/font-awesome.min.css?' . $v); $doc->addStyleSheet($helix_plg_url . '/assets/css/admin.general' . $jVersion . '.css?' . $v); } private function getVersion() { $db = Factory::getDbo(); $query = $db->getQuery(true); $query ->select(['*']) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) ->where($db->quoteName('element') . ' = ' . $db->quote('helix3')) ->where($db->quoteName('folder') . ' = ' . $db->quote('system')); $db->setQuery($query); $result = $db->loadObject(); $manifest_cache = json_decode($result->manifest_cache); if (isset($manifest_cache->version)) { return $manifest_cache->version; } return; } } PKAA#]J.D4��!system/helix3/fields/optionio.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Factory; use Joomla\CMS\Form\FormField; use Joomla\CMS\Language\Text; class JFormFieldOptionio extends FormField { protected $type = 'optionio'; protected function getInput() { $input = Factory::getApplication()->input; $template_id = $input->get('id', 0, 'INT'); $url_cureent = "//$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $export_url = $url_cureent . '&helix3task=export'; $output = ''; $output .= '<div class="import-export clearfix" style="margin-bottom:30px;">'; $output .= '<a class="btn btn-success" target="_blank" href="' . $export_url . '">' . Text::_("HELIX_SETTINGS_EXPORT") . '</a>'; $output .= '</div>'; $output .= '<div class="import-export clearfix">'; $output .= '<textarea id="import-data" name="import-data" rows="5" style="margin-bottom:20px;"></textarea>'; $output .= '<div><a id="import-settings" class="btn btn-primary" data-template_id="' . $template_id . '" target="_blank" href="#">' . Text::_("HELIX_SETTINGS_IMPORT") . '</a></div>'; $output .= '</div>'; return $output; } } PKAA#]{�.�aRaRsystem/helix3/fields/icon.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; class JFormFieldIcon extends FormField { protected $type = 'Icon'; public function getInput() { $icons = $this->getIconsList(); $arr = []; $arr[] = HTMLHelper::_('select.option', '', ''); foreach ($icons as $value) { $arr[] = HTMLHelper::_('select.option', $value, str_replace('fa-', '', $value)); } return HTMLHelper::_('select.genericlist', $arr, $this->name, 'class="form-select"', 'value', 'text', $this->value); } /*Icons List*/ private static function getIconsList() { return [ 'fa-500px', 'fa-adjust', 'fa-adn', 'fa-align-center', 'fa-align-justify', 'fa-align-left', 'fa-align-right', 'fa-amazon', 'fa-ambulance', 'fa-anchor', 'fa-android', 'fa-angellist', 'fa-angle-double-down', 'fa-angle-double-left', 'fa-angle-double-right', 'fa-angle-double-up', 'fa-angle-down', 'fa-angle-left', 'fa-angle-right', 'fa-angle-up', 'fa-apple', 'fa-archive', 'fa-area-chart', 'fa-arrow-circle-down', 'fa-arrow-circle-left', 'fa-arrow-circle-o-down', 'fa-arrow-circle-o-left', 'fa-arrow-circle-o-right', 'fa-arrow-circle-o-up', 'fa-arrow-circle-right', 'fa-arrow-circle-up', 'fa-arrow-down', 'fa-arrow-left', 'fa-arrow-right', 'fa-arrow-up', 'fa-arrows', 'fa-arrows-alt', 'fa-arrows-h', 'fa-arrows-v', 'fa-asterisk', 'fa-at', 'fa-automobile', 'fa-backward', 'fa-balance-scale', 'fa-ban', 'fa-bank', 'fa-bar-chart', 'fa-bar-chart-o', 'fa-barcode', 'fa-bars', 'fa-battery0', 'fa-battery1', 'fa-battery2', 'fa-battery3', 'fa-battery4', 'fa-battery-empty', 'fa-battery-full', 'fa-battery-half', 'fa-battery-quarter', 'fa-battery-three-quarters', 'fa-bed', 'fa-beer', 'fa-behance', 'fa-behance-square', 'fa-bell', 'fa-bell-o', 'fa-bell-slash', 'fa-bell-slash-o', 'fa-bicycle', 'fa-binoculars', 'fa-birthday-cake', 'fa-bitbucket', 'fa-bitbucket-square', 'fa-bitcoin', 'fa-black-tie', 'fa-bold', 'fa-bolt', 'fa-bomb', 'fa-book', 'fa-bookmark', 'fa-bookmark-o', 'fa-briefcase', 'fa-btc', 'fa-bug', 'fa-building', 'fa-building-o', 'fa-bullhorn', 'fa-bullseye', 'fa-bus', 'fa-buysellads', 'fa-cab', 'fa-calculator', 'fa-calendar', 'fa-calendar-check-o', 'fa-calendar-minus-o', 'fa-calendar-o', 'fa-calendar-plus-o', 'fa-calendar-times-o', 'fa-camera', 'fa-camera-retro', 'fa-car', 'fa-caret-down', 'fa-caret-left', 'fa-caret-right', 'fa-caret-square-o-down', 'fa-caret-square-o-left', 'fa-caret-square-o-right', 'fa-caret-square-o-up', 'fa-caret-up', 'fa-cart-arrow-down', 'fa-cart-plus', 'fa-cc', 'fa-cc-amex', 'fa-cc-diners-club', 'fa-cc-discover', 'fa-cc-jcb', 'fa-cc-mastercard', 'fa-cc-paypal', 'fa-cc-stripe', 'fa-cc-visa', 'fa-certificate', 'fa-chain', 'fa-chain-broken', 'fa-check', 'fa-check-circle', 'fa-check-circle-o', 'fa-check-square', 'fa-check-square-o', 'fa-chevron-circle-down', 'fa-chevron-circle-left', 'fa-chevron-circle-right', 'fa-chevron-circle-up', 'fa-chevron-down', 'fa-chevron-left', 'fa-chevron-right', 'fa-chevron-up', 'fa-child', 'fa-chrome', 'fa-circle', 'fa-circle-o', 'fa-circle-o-notch', 'fa-circle-thin', 'fa-clipboard', 'fa-clock-o', 'fa-clone', 'fa-close', 'fa-cloud', 'fa-cloud-download', 'fa-cloud-upload', 'fa-cny', 'fa-code', 'fa-code-fork', 'fa-codepen', 'fa-coffee', 'fa-cog', 'fa-cogs', 'fa-columns', 'fa-comment', 'fa-comment-o', 'fa-commenting', 'fa-commenting-o', 'fa-comments', 'fa-comments-o', 'fa-compass', 'fa-compress', 'fa-connectdevelop', 'fa-contao', 'fa-copy', 'fa-copyright', 'fa-creative-commons', 'fa-credit-card', 'fa-crop', 'fa-crosshairs', 'fa-css3', 'fa-cube', 'fa-cubes', 'fa-cut', 'fa-cutlery', 'fa-dashboard', 'fa-dashcube', 'fa-database', 'fa-dedent', 'fa-delicious', 'fa-desktop', 'fa-deviantart', 'fa-diamond', 'fa-digg', 'fa-dollar', 'fa-dot-circle-o', 'fa-download', 'fa-dribbble', 'fa-dropbox', 'fa-drupal', 'fa-edit', 'fa-eject', 'fa-ellipsis-h', 'fa-ellipsis-v', 'fa-empire', 'fa-envelope', 'fa-envelope-o', 'fa-envelope-square', 'fa-eraser', 'fa-eur', 'fa-euro', 'fa-exchange', 'fa-exclamation', 'fa-exclamation-circle', 'fa-exclamation-triangle', 'fa-expand', 'fa-expeditedssl', 'fa-external-link', 'fa-external-link-square', 'fa-eye', 'fa-eye-slash', 'fa-eyedropper', 'fa-facebook', 'fa-facebook-f', 'fa-facebook-official', 'fa-facebook-square', 'fa-fast-backward', 'fa-fast-forward', 'fa-fax', 'fa-female', 'fa-fighter-jet', 'fa-file', 'fa-file-archive-o', 'fa-file-audio-o', 'fa-file-code-o', 'fa-file-excel-o', 'fa-file-image-o', 'fa-file-movie-o', 'fa-file-o', 'fa-file-pdf-o', 'fa-file-photo-o', 'fa-file-picture-o', 'fa-file-powerpoint-o', 'fa-file-sound-o', 'fa-file-text', 'fa-file-text-o', 'fa-file-video-o', 'fa-file-word-o', 'fa-file-zip-o', 'fa-files-o', 'fa-film', 'fa-filter', 'fa-fire', 'fa-fire-extinguisher', 'fa-firefox', 'fa-flag', 'fa-flag-checkered', 'fa-flag-o', 'fa-flash', 'fa-flask', 'fa-flickr', 'fa-floppy-o', 'fa-folder', 'fa-folder-o', 'fa-folder-open', 'fa-folder-open-o', 'fa-font', 'fa-fonticons', 'fa-forumbee', 'fa-forward', 'fa-foursquare', 'fa-frown-o', 'fa-futbol-o', 'fa-gamepad', 'fa-gavel', 'fa-gbp', 'fa-ge', 'fa-gear', 'fa-gears', 'fa-genderless', 'fa-get-pocket', 'fa-gg', 'fa-gg-circle', 'fa-gift', 'fa-git', 'fa-git-square', 'fa-github', 'fa-github-alt', 'fa-github-square', 'fa-gittip', 'fa-glass', 'fa-globe', 'fa-google', 'fa-google-plus', 'fa-google-plus-square', 'fa-google-wallet', 'fa-graduation-cap', 'fa-gratipay', 'fa-group', 'fa-h-square', 'fa-hacker-news', 'fa-hand-grab-o', 'fa-hand-lizard-o', 'fa-hand-o-down', 'fa-hand-o-left', 'fa-hand-o-right', 'fa-hand-o-up', 'fa-hand-paper-o', 'fa-hand-peace-o', 'fa-hand-pointer-o', 'fa-hand-rock-o', 'fa-hand-scissors-o', 'fa-hand-spock-o', 'fa-hand-stop-o', 'fa-hdd-o', 'fa-header', 'fa-headphones', 'fa-heart', 'fa-heart-o', 'fa-heartbeat', 'fa-history', 'fa-home', 'fa-hospital-o', 'fa-hotel', 'fa-hourglass', 'fa-hourglass-1', 'fa-hourglass-2', 'fa-hourglass-3', 'fa-hourglass-end', 'fa-hourglass-half', 'fa-hourglass-o', 'fa-hourglass-start', 'fa-houzz', 'fa-html5', 'fa-i-cursor', 'fa-ils', 'fa-image', 'fa-inbox', 'fa-indent', 'fa-industry', 'fa-info', 'fa-info-circle', 'fa-inr', 'fa-instagram', 'fa-internet-explorer', 'fa-institution', 'fa-ioxhost', 'fa-italic', 'fa-joomla', 'fa-jpy', 'fa-jsfiddle', 'fa-key', 'fa-keyboard-o', 'fa-krw', 'fa-language', 'fa-laptop', 'fa-lastfm', 'fa-lastfm-square', 'fa-leaf', 'fa-leanpub', 'fa-legal', 'fa-lemon-o', 'fa-level-down', 'fa-level-up', 'fa-life-bouy', 'fa-life-buoy', 'fa-life-ring', 'fa-life-saver', 'fa-lightbulb-o', 'fa-line-chart', 'fa-link', 'fa-linkedin', 'fa-linkedin-square', 'fa-linux', 'fa-list', 'fa-list-alt', 'fa-list-ol', 'fa-list-ul', 'fa-location-arrow', 'fa-lock', 'fa-long-arrow-down', 'fa-long-arrow-left', 'fa-long-arrow-right', 'fa-long-arrow-up', 'fa-magic', 'fa-magnet', 'fa-mail-forward', 'fa-mail-reply', 'fa-mail-reply-all', 'fa-male', 'fa-map', 'fa-map-marker', 'fa-map-o', 'fa-map-pin', 'fa-map-signs', 'fa-mars', 'fa-mars-double', 'fa-mars-stroke', 'fa-mars-stroke-h', 'fa-mars-stroke-v', 'fa-maxcdn', 'fa-meanpath', 'fa-medium', 'fa-medkit', 'fa-meh-o', 'fa-mercury', 'fa-microphone', 'fa-microphone-slash', 'fa-minus', 'fa-minus-circle', 'fa-minus-square', 'fa-minus-square-o', 'fa-mobile', 'fa-mobile-phone', 'fa-money', 'fa-moon-o', 'fa-mortar-board', 'fa-motorcycle', 'fa-mouse-pointer', 'fa-music', 'fa-navicon', 'fa-neuter', 'fa-newspaper-o', 'fa-object-group', 'fa-odnoklassniki', 'fa-odnoklassniki-square', 'fa-opencart', 'fa-openid', 'fa-optin-monster', 'fa-outdent', 'fa-pagelines', 'fa-paint-brush', 'fa-paper-plane', 'fa-paper-plane-o', 'fa-paperclip', 'fa-paragraph', 'fa-paste', 'fa-pause', 'fa-paw', 'fa-paypal', 'fa-pencil', 'fa-pencil-square', 'fa-pencil-square-o', 'fa-phone', 'fa-phone-square', 'fa-photo', 'fa-picture-o', 'fa-pie-chart', 'fa-pied-piper', 'fa-pied-piper-alt', 'fa-pinterest', 'fa-pinterest-p', 'fa-pinterest-square', 'fa-plane', 'fa-play', 'fa-play-circle', 'fa-play-circle-o', 'fa-plug', 'fa-plus', 'fa-plus-circle', 'fa-plus-square', 'fa-plus-square-o', 'fa-power-off', 'fa-print', 'fa-puzzle-piece', 'fa-qq', 'fa-qrcode', 'fa-question', 'fa-question-circle', 'fa-quote-left', 'fa-quote-right', 'fa-ra', 'fa-random', 'fa-rebel', 'fa-recycle', 'fa-reddit', 'fa-reddit-square', 'fa-refresh', 'fa-registered', 'fa-remove', 'fa-renren', 'fa-reorder', 'fa-repeat', 'fa-reply', 'fa-reply-all', 'fa-retweet', 'fa-rmb', 'fa-road', 'fa-rocket', 'fa-rotate-left', 'fa-rotate-right', 'fa-rouble', 'fa-rss', 'fa-rss-square', 'fa-rub', 'fa-ruble', 'fa-rupee', 'fa-safari', 'fa-save', 'fa-scissors', 'fa-search', 'fa-search-minus', 'fa-search-plus', 'fa-sellsy', 'fa-send', 'fa-send-o', 'fa-server', 'fa-share', 'fa-share-alt', 'fa-share-alt-square', 'fa-share-square', 'fa-share-square-o', 'fa-shekel', 'fa-sheqel', 'fa-shield', 'fa-ship', 'fa-shirtsinbulk', 'fa-shopping-cart', 'fa-sign-in', 'fa-sign-out', 'fa-signal', 'fa-simplybuilt', 'fa-sitemap', 'fa-skyatlas', 'fa-skype', 'fa-slack', 'fa-sliders', 'fa-slideshare', 'fa-smile-o', 'fa-soccer-ball-o', 'fa-sort', 'fa-sort-alpha-asc', 'fa-sort-alpha-desc', 'fa-sort-amount-asc', 'fa-sort-amount-desc', 'fa-sort-asc', 'fa-sort-desc', 'fa-sort-down', 'fa-sort-numeric-asc', 'fa-sort-numeric-desc', 'fa-sort-up', 'fa-soundcloud', 'fa-space-shuttle', 'fa-spinner', 'fa-spoon', 'fa-spotify', 'fa-square', 'fa-square-o', 'fa-stack-exchange', 'fa-stack-overflow', 'fa-star', 'fa-star-half', 'fa-star-half-empty', 'fa-star-half-full', 'fa-star-half-o', 'fa-star-o', 'fa-steam', 'fa-steam-square', 'fa-step-backward', 'fa-step-forward', 'fa-stethoscope', 'fa-sticky-note-o', 'fa-stop', 'fa-street-view', 'fa-strikethrough', 'fa-stumbleupon', 'fa-stumbleupon-circle', 'fa-subscript', 'fa-subway', 'fa-suitcase', 'fa-sun-o', 'fa-superscript', 'fa-support', 'fa-table', 'fa-tablet', 'fa-tachometer', 'fa-tag', 'fa-tags', 'fa-tasks', 'fa-taxi', 'fa-television', 'fa-tencent-weibo', 'fa-terminal', 'fa-text-height', 'fa-text-width', 'fa-th', 'fa-th-large', 'fa-th-list', 'fa-thumb-tack', 'fa-thumbs-down', 'fa-thumbs-o-down', 'fa-thumbs-o-up', 'fa-thumbs-up', 'fa-ticket', 'fa-times', 'fa-times-circle', 'fa-times-circle-o', 'fa-tint', 'fa-toggle-down', 'fa-toggle-left', 'fa-toggle-off', 'fa-toggle-on', 'fa-toggle-right', 'fa-toggle-up', 'fa-trademark', 'fa-train', 'fa-transgender', 'fa-transgender-alt', 'fa-trash', 'fa-trash-o', 'fa-tree', 'fa-trello', 'fa-trophy', 'fa-truck', 'fa-try', 'fa-tty', 'fa-tumblr', 'fa-tumblr-square', 'fa-turkish-lira', 'fa-tv', 'fa-twitch', 'fa-twitter', 'fa-twitter-square', 'fa-umbrella', 'fa-underline', 'fa-undo', 'fa-university', 'fa-unlink', 'fa-unlock', 'fa-unlock-alt', 'fa-unsorted', 'fa-upload', 'fa-usd', 'fa-user', 'fa-user-md', 'fa-user-plus', 'fa-user-secret', 'fa-user-times', 'fa-users', 'fa-venus', 'fa-venus-double', 'fa-venus-mars', 'fa-viacoin', 'fa-video-camera', 'fa-vimeo', 'fa-vimeo-square', 'fa-vine', 'fa-vk', 'fa-volume-down', 'fa-volume-off', 'fa-volume-up', 'fa-warning', 'fa-wechat', 'fa-weibo', 'fa-weixin', 'fa-whatsapp', 'fa-wheelchair', 'fa-wifi', 'fa-wikipedia-w', 'fa-windows', 'fa-won', 'fa-wordpress', 'fa-wrench', 'fa-xing', 'fa-xing-square', 'fa-yahoo', 'fa-yc', 'fa-yelp', 'fa-yen', 'fa-youtube', 'fa-youtube-play', 'fa-youtube-square', 'fa-address-book', 'fa-address-book-o', 'fa-vcard', 'fa-address-card', 'fa-vcard-o', 'fa-address-card-o', 'fa-bandcamp', 'fa-bathtub', 'fa-s15', 'fa-bath', 'fa-drivers-license', 'fa-id-card', 'fa-drivers-license-o', 'fa-id-card-o', 'fa-eercast', 'fa-envelope-open', 'fa-envelope-open-o', 'fa-etsy', 'fa-free-code-camp', 'fa-grav', 'fa-handshake-o', 'fa-id-badge', 'fa-imdb', 'fa-linode', 'fa-meetup', 'fa-microchip', 'fa-podcast', 'fa-quora', 'fa-ravelry', 'fa-shower', 'fa-snowflake-o', 'fa-superpowers', 'fa-telegram', 'fa-thermometer-4', 'fa-thermometer', 'fa-thermometer-full', 'fa-thermometer-3', 'fa-thermometer-three-quarters', 'fa-thermometer-2', 'fa-thermometer-half', 'fa-thermometer-1', 'fa-thermometer-quarter', 'fa-thermometer-0', 'fa-thermometer-empty', 'fa-times-rectangle', 'fa-window-close', 'fa-times-rectangle-o', 'fa-window-close-o', 'fa-user-circle', 'fa-user-circle-o', 'fa-window-maximize', 'fa-window-minimize', 'fa-window-restore', 'fa-wpexplorer', ]; } } PKAA#]���e��system/helix3/fields/group.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Form\FormField; use Joomla\CMS\Language\Text; class JFormFieldGroup extends FormField { protected $type = 'Group'; public function getInput() { $text = (string) $this->element['title']; $subtitle = (! empty($this->element['subtitle'])) ? '<span>' . Text::_($this->element['subtitle']) . '</span>' : ''; $group = ($this->element['group'] == 'no') ? 'no_group' : 'in_group'; return '<div class="group_separator ' . $group . '" title="' . Text::_($this->element['desc']) . '">' . Text::_($text) . $subtitle . '</div>'; } public function getLabel() { return false; } } PKAA#]�nN��system/helix3/fields/layout.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Factory; use Joomla\CMS\Form\FormField; class JFormFieldLayout extends FormField { protected $type = 'Layout'; public function getInput() { $helix_layout_path = JPATH_SITE . '/plugins/system/helix3/layout/'; $json = json_decode($this->value); if (! empty($json)) { $value = $json; } else { $layout_file = file_get_contents(JPATH_SITE . '/templates/' . $this->getTemplate() . '/layout/default.json'); $value = json_decode($layout_file); } $htmls = $this->generateLayout($helix_layout_path, $value); $htmls .= '<input type="hidden" id="' . $this->id . '" name="' . $this->name . '">'; return $htmls; } private function generateLayout($path, $layout_data = null) { ob_start(); include_once $path . 'generated.php'; $items = ob_get_contents(); ob_end_clean(); return $items; } public function getLabel() { return false; } //Get template name private static function getTemplate() { $id = (int) Factory::getApplication()->input->get('id', 0); $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName(['template'])); $query->from($db->quoteName('#__template_styles')); $query->where($db->quoteName('id') . ' = ' . $db->quote($id)); $db->setQuery($query); return $db->loadResult(); } } PKAA#]�m$L��$system/helix3/params/menu-parent.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fields name="params" addfieldpath="/plugins/system/helix3/fields"> <fieldset name="spmegamenu" label="HELIX_MENU"> <field name="menulayout" type="megamenu" /> <field name="megamenu" type="hidden" default="0" /> <field name="showmenutitle" type="radio" default="1" class="btn-group" label="HELIX_MENU_SHOW_TITLE" description="HELIX_MENU_SHOW_TITLE_DESC"> <option value="1">HELIX_YES</option> <option value="0">HELIX_NO</option> </field> <field name="icon" type="icon" label="HELIX_MENU_ICON" description="HELIX_MENU_ICON_DESC" /> <field name="class" type="text" label="HELIX_MENU_CLASS" description="HELIX_MENU_CLASS_DESC" /> </fieldset> </fields> </form>PKAA#]��b��#system/helix3/params/menu-child.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fields name="params" addfieldpath="/plugins/system/helix3/fields"> <fieldset name="spsubmenu" label="HELIX_SUB_MENU"> <field name="dropdown_position" type="radio" class="btn-group" default="right" label="HELIX_MENU_DROPDOWN_POSITION" description="HELIX_MENU_DROPDOWN_POSITION_DESC"> <option value="left">HELIX_GLOBAL_LEFT</option> <option value="right">HELIX_GLOBAL_RIGHT</option> </field> <field name="showmenutitle" type="radio" default="1" class="btn-group" label="HELIX_MENU_SHOW_TITLE" description="HELIX_MENU_SHOW_TITLE_DESC"> <option value="1">HELIX_YES</option> <option value="0">HELIX_NO</option> </field> <field name="icon" type="icon" label="HELIX_MENU_ICON" description="HELIX_MENU_ICON_DESC" /> <field name="class" type="text" label="HELIX_MENU_CLASS" description="HELIX_MENU_CLASS_DESC" /> </fieldset> </fields> </form> PKAA#]h��O O %system/helix3/params/post-formats.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fields name="attribs" addfieldpath="/plugins/system/helix3/fields"> <fieldset name="sppostformats" label="BLOG_OPTIONS"> <field name="spfeatured_image" type="spimage" label="BLOG_POST_FEATURE_IMAGE" description="BLOG_POST_FORMAT_GALLERY_DESCRIPTION" /> <field name="spfeatured_image_alt" type="text" label="BLOG_POST_FEATURE_IMAGE_ALTER_TEXT" description="BLOG_POST_FEATURE_IMAGE_ALTER_TEXT_DESCRIPTION" hint="Feature image alter text" /> <field name="post_format" type="radio" label="Post Format" default="standard" class="btn-group post-formats" description="Mega Menu Layout"> <option value="standard">BLOG_POST_FORMAT_STANDARD</option> <option value="video">BLOG_POST_FORMAT_VIDEO</option> <option value="gallery">BLOG_POST_FORMAT_GALLERY</option> <option value="audio">BLOG_POST_FORMAT_AUDIO</option> <option value="link">BLOG_POST_FORMAT_LINK</option> <option value="quote">BLOG_POST_FORMAT_QUOTE</option> <option value="status">BLOG_POST_FORMAT_STATUS</option> </field> <field name="gallery" type="spgallery" label="BLOG_POST_FORMAT_GALLERY_LABEL" description="BLOG_POST_FORMAT_GALLERY_DESCRIPTION" /> <field name="audio" type="textarea" rows="5" label="BLOG_POST_FORMAT_AUDIO_LABEL" description="BLOG_POST_FORMAT_AUDIO_DESCRIPTION" class="input-xxlarge" filter="raw" /> <field name="video" type="url" label="BLOG_POST_FORMAT_VIDEO_LABEL" description="BLOG_POST_FORMAT_VIDEO_DESCRIPTION" /> <field name="link_title" type="text" label="BLOG_POST_FORMAT_LINK_TITLE_LABEL" description="BLOG_POST_FORMAT_LINK_TITLE_DESCRIPTION" hint="Best Joomla Templates" /> <field name="link_url" type="url" label="BLOG_POST_FORMAT_LINK_LABEL" description="BLOG_POST_FORMAT_LINK_DESCRIPTION" hint="http://www.joomshaper.com/joomla-templates" /> <field name="quote_text" type="textarea" rows="5" label="BLOG_POST_FORMAT_QUOTE_TEXT_LABEL" description="BLOG_POST_FORMAT_QUOTE_TEXT_DESCRIPTION" class="input-xxlarge" filter="raw" /> <field name="quote_author" type="text" label="BLOG_POST_FORMAT_QUOTE_AUTHOR_LABEL" description="BLOG_POST_FORMAT_QUOTE_AUTHOR_DESCRIPTION" /> <field name="post_status" type="textarea" rows="5" label="BLOG_POST_FORMAT_STATUS_LABEL" description="BLOG_POST_FORMAT_STATUS_DESCRIPTION" class="input-xxlarge" filter="raw" /> </fieldset> </fields> </form>PKAA#]���z��#system/helix3/params/page-title.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fields name="params" addfieldpath="/plugins/system/helix3/fields"> <fieldset name="pagetitle" label="HELIX_PAGE_TITLE"> <field name="enable_page_title" type="radio" class="btn-group" default="0" label="ENABLE_PAGE_TITLE" description="ENABLE_PAGE_TITLE_DESC"> <option value="1">JYES</option> <option value="0">JNO</option> </field> <field name="page_title_alt" type="text" default="" label="PAGE_TITLE_ALT" description="PAGE_TITLE_ALT_DESC" /> <field name="page_subtitle" type="text" default="" label="PAGE_SUBTITLE" description="PAGE_SUBTITLE_DESC" /> <field name="page_title_bg_color" type="color" label="PAGE_BACKGROUND_COLOR" description="PAGE_BACKGROUND_COLOR_DESC" /> <field name="page_title_bg_image" type="media" label="PAGE_BACKGROUND_IMAGE" description="PAGE_BACKGROUND_IMAGE_DESC" /> </fieldset> </fields> </form> PKAA#]sѰ�system/helix3/helix3.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.9" type="plugin" group="system" method="upgrade"> <name>System - Helix3 Framework</name> <author>JoomShaper.com</author> <creationDate>Jan 2015</creationDate> <copyright>Copyright (c) 2010 - 2026 JoomShaper. All rights reserved.</copyright> <license>http://www.gnu.org/licenses/gpl-2.0.html GPLv2 or later</license> <authorEmail>support@joomshaper.com</authorEmail> <authorUrl>http://www.joomshaper.com</authorUrl> <version>3.1.3</version> <description>Helix3 Framework - Joomla Template Framework by JoomShaper</description> <updateservers> <server type="extension" priority="1" name="System - Helix3 Framework">https://www.joomshaper.com/updates/plg-system-helix3.xml</server> </updateservers> <languages folder="language"> <language tag="en-GB">en-GB/en-GB.plg_system_helix3.ini</language> </languages> <files> <filename plugin="helix3">helix3.php</filename> <folder plugin="helix3">assets</folder> <folder plugin="helix3">core</folder> <folder plugin="helix3">fields</folder> <folder plugin="helix3">html</folder> <folder plugin="helix3">layout</folder> <folder plugin="helix3">layouts</folder> <folder plugin="helix3">params</folder> <folder plugin="helix3">language</folder> </files> <fieldset addfieldpath="/plugins/system/helix3/fields"></fieldset> </extension> PKAA#]���up%p%system/helix3/helix3.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Factory; use Joomla\CMS\Filesystem\File; use Joomla\CMS\Form\Form; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Uri\Uri; if (version_compare(JVERSION, '5.0', '>=')) { if (! class_exists('Joomla\\CMS\\Filesystem\\File') && class_exists('Joomla\\Filesystem\\File')) { class_alias('Joomla\\Filesystem\\File', 'Joomla\\CMS\\Filesystem\\File'); } } use Joomla\Registry\Registry; if (! class_exists('Helix3')) { require_once __DIR__ . '/core/helix3.php'; } class plgSystemHelix3 extends CMSPlugin { protected $autoloadLanguage = true; protected $app; /** * Handle the event hook onAfterInitialize. * Here we can override the HTML functions. * * @return void * @since 2.0.0 */ public function onAfterInitialise() { $template = $this->getTemplateName(); if (isset($template) && ! empty($template)) { $bootstrapPath = JPATH_ROOT . '/plugins/system/helix3/html/layouts/libraries/cms/html/bootstrap.php'; if ($this->app->isClient('site') && \file_exists($bootstrapPath)) { if (! class_exists('Helix3Bootstrap')) { require_once $bootstrapPath; } HTMLHelper::register('bootstrap.tooltip', ['Helix3Bootstrap', 'tooltip']); HTMLHelper::register('bootstrap.popover', ['Helix3Bootstrap', 'popover']); } } } // Copied style public function onAfterDispatch() { if (! Factory::getApplication()->isClient('api') && ! Factory::getApplication()->isClient('administrator')) { $activeMenu = Factory::getApplication()->getMenu()->getActive(); if (is_null($activeMenu)) { $template_style_id = 0; } else { $template_style_id = (int) $activeMenu->template_style_id; } if ($template_style_id > 0) { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select(['*']); $query->from($db->quoteName('#__template_styles')); $query->where($db->quoteName('client_id') . ' = 0'); $query->where($db->quoteName('id') . ' = ' . $db->quote($template_style_id)); $db->setQuery($query); $style = $db->loadObject(); if (! empty($style->template) && ! empty($style->params)) { Factory::getApplication()->setTemplate($style->template, $style->params); } } } } public function onContentPrepareForm($form, $data) { $v = self::getVersion(); $doc = Factory::getDocument(); $plg_path = Uri::root(true) . '/plugins/system/helix3'; $plg_path2 = Uri::root() . 'plugins/system/helix3'; Form::addFormPath(JPATH_PLUGINS . '/system/helix3/params'); if ($form->getName() == 'com_menus.item') { //Add Helix menu params to the menu item HTMLHelper::_('jquery.framework'); $data = (array) $data; if ($data['id'] && $data['parent_id'] == 1) { $doc->addStyleSheet($plg_path . '/assets/css/bootstrap.css?' . $v); $doc->addStyleSheet($plg_path . '/assets/css/font-awesome.min.css?' . $v); $doc->addStyleSheet($plg_path . '/assets/css/modal.css?' . $v); $doc->addStyleSheet($plg_path . '/assets/css/menu.generator.css?' . $v); HTMLHelper::_('jquery.framework'); if (JVERSION < 4) { HTMLHelper::_('jquery.ui', ['core', 'more', 'sortable']); $doc->addScript($plg_path . '/assets/js/jquery-ui.draggable.min.js?' . $v); } else { $doc->addScript($plg_path . '/assets/js/jquery-ui.min.js?' . $v); } $doc->addScript($plg_path . '/assets/js/modal.js?' . $v); $doc->addScript($plg_path . '/assets/js/menu.generator.js?' . $v); $form->loadFile('menu-parent', false); } else { $form->loadFile('menu-child', false); } $form->loadFile('page-title', false); } //Article Post format if ($form->getName() == 'com_content.article') { HTMLHelper::_('jquery.framework'); $doc->addStyleSheet($plg_path . '/assets/css/font-awesome.min.css?' . $v); $doc->addScript($plg_path . '/assets/js/post-formats.js?' . $v); $tpl_path = JPATH_ROOT . '/templates/' . $this->getTemplateName(); if (File::exists($tpl_path . '/post-formats.xml')) { Form::addFormPath($tpl_path); } else { Form::addFormPath(JPATH_PLUGINS . '/system/helix3/params'); } $form->loadFile('post-formats', false); } } // Live Update system public function onExtensionAfterSave($option, $data) { if ($option == 'com_templates.style' && ! empty($data->id)) { $params = new Registry; $params->loadString($data->params); $email = $params->get('joomshaper_email'); $license_key = $params->get('joomshaper_license_key'); $template = trim($data->template); if (! empty($email) and ! empty($license_key)) { $extra_query = 'joomshaper_email=' . urlencode($email); $extra_query .= '&joomshaper_license_key=' . urlencode($license_key); $db = Factory::getDbo(); $fields = [ $db->quoteName('extra_query') . '=' . $db->quote($extra_query), $db->quoteName('last_check_timestamp') . '=0', ]; $query = $db->getQuery(true) ->update($db->quoteName('#__update_sites')) ->set($fields) ->where($db->quoteName('name') . '=' . $db->quote($template)); $db->setQuery($query); $db->execute(); } } } public function onAfterRoute() { $japps = Factory::getApplication(); if ($japps->isClient('administrator')) { $user = Factory::getUser(); if (! in_array(8, $user->groups)) { return false; } $inputs = Factory::getApplication()->input; $option = $inputs->get('option', ''); $id = $inputs->get('id', '0', 'INT'); $helix3task = $inputs->get('helix3task', ''); if (strtolower($option) == 'com_templates' && $id && $helix3task == "export") { $db = Factory::getDbo(); $query = $db->getQuery(true); $query ->select('*') ->from($db->quoteName('#__template_styles')) ->where($db->quoteName('id') . ' = ' . $db->quote($id) . ' AND ' . $db->quoteName('client_id') . ' = 0'); $db->setQuery($query); $result = $db->loadObject(); header('Content-Description: File Transfer'); header('Content-type: application/txt'); header('Content-Disposition: attachment; filename="' . $result->template . '_settings_' . date('d-m-Y') . '.json"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); echo $result->params; exit; } } } private function getTemplateName() { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName(['template'])); $query->from($db->quoteName('#__template_styles')); $query->where($db->quoteName('client_id') . ' = 0'); $query->where($db->quoteName('home') . ' = 1'); $db->setQuery($query); return $db->loadObject()->template; } public function onAfterRender() { $app = Factory::getApplication(); if ($app->isClient('administrator')) { return; } $body = Factory::getApplication()->getBody(); $preset = Helix3::Preset(); $body = str_replace('{helix_preset}', ! empty($preset) ? $preset : '', $body); Factory::getApplication()->setBody($body); } private static function getVersion() { $db = Factory::getDbo(); $query = $db->getQuery(true); $query ->select(['*']) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) ->where($db->quoteName('element') . ' = ' . $db->quote('helix3')) ->where($db->quoteName('folder') . ' = ' . $db->quote('system')); $db->setQuery($query); $result = $db->loadObject(); $manifest_cache = json_decode($result->manifest_cache); if (isset($manifest_cache->version)) { return $manifest_cache->version; } return; } } PKAA#]��:}�}�system/helix3/core/helix3.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct access defined('_JEXEC') or die('restricted access'); use Joomla\CMS\Factory; use Joomla\CMS\Filesystem\File; use Joomla\CMS\Filesystem\Folder; use Joomla\CMS\Filter\OutputFilter; use Joomla\CMS\HTML\HTMLHelper; if (version_compare(JVERSION, '5.0', '>=')) { if (! class_exists('Joomla\\CMS\\Filesystem\\File') && class_exists('Joomla\\Filesystem\\File')) { class_alias('Joomla\\Filesystem\\File', 'Joomla\\CMS\\Filesystem\\File'); } if (! class_exists('Joomla\\CMS\\Filesystem\\Folder') && class_exists('Joomla\\Filesystem\\Folder')) { class_alias('Joomla\\Filesystem\\Folder', 'Joomla\\CMS\\Filesystem\\Folder'); } } use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Uri\Uri; class Helix3 { private static $_instance; private $document; private $importedFiles = []; private $_less; private $load_pos; //initialize public function __construct() { } /** * making self object for singleton method * */ final public static function getInstance() { if (! self::$_instance) { self::$_instance = new self(); self::getInstance()->getDocument(); } return self::$_instance; } /** * Get Document * * @param string $key */ public static function getDocument($key = false) { self::getInstance()->document = Factory::getDocument(); $doc = self::getInstance()->document; if (is_string($key)) { return $doc->$key; } return $doc; } public static function getParam($key) { $params = Factory::getApplication()->getTemplate(true)->params; return $params->get($key); } public static function loadHead() { $doc = Factory::getDocument(); $app = Factory::getApplication(); $option = $app->input->get('option', ''); $view = $app->input->get('view', ''); $layout = $app->input->get('layout', ''); // Favicon (HtmlDocument only — not available on JsonDocument during AJAX) if (method_exists($doc, 'addFavicon')) { if ($favicon = self::getParam('favicon')) { $doc->addFavicon(Uri::base(true) . '/' . $favicon); } else { $doc->addFavicon(self::getTemplateUri() . '/images/favicon.ico'); } } // load legacy css if (($view == 'form' && $layout == 'edit') || ($option = 'com_config' && $view == 'modules')) { if (JVERSION < 4) { $doc->addStylesheet(Uri::base(true) . '/plugins/system/helix3/assets/css/system.j3.min.css'); } else { $doc->addStylesheet(Uri::base(true) . '/plugins/system/helix3/assets/css/system.j4.min.css'); } } // web fonts self::loadWebFonts(); HTMLHelper::_('jquery.framework'); // Remove Joomla core bootstrap if (JVERSION < 4) { HTMLHelper::_('bootstrap.framework'); if (isset($doc->_scripts[Uri::base(true) . '/media/jui/js/bootstrap.min.js'])) { unset($doc->_scripts[Uri::base(true) . '/media/jui/js/bootstrap.min.js']); } $doc->addScript(Uri::root(true) . '/plugins/system/helix3/assets/js/bootstrap.legacy.js'); } echo '<jdoc:include type="head" />'; } //Body Class public static function bodyClass($class = '') { $app = Factory::getApplication(); $doc = Factory::getDocument(); $language = $doc->language; $direction = $doc->direction; $option = str_replace('_', '-', $app->input->getCmd('option', '')); $view = $app->input->getCmd('view', ''); $layout = $app->input->getCmd('layout', ''); $task = $app->input->getCmd('task', ''); $itemid = $app->input->getCmd('Itemid', ''); $menu = $app->getMenu()->getActive(); if ($menu) { $pageclass = $menu->getParams()->get('pageclass_sfx'); } if ($view == 'modules') { $layout = 'edit'; } return 'site ' . $option . ' view-' . $view . ($layout ? ' layout-' . $layout : ' no-layout') . ($task ? ' task-' . $task : ' no-task') . ($itemid ? ' itemid-' . $itemid : '') . ($language ? ' ' . $language : '') . ($direction ? ' ' . $direction : '') . (isset($pageclass) && $pageclass ? ' ' . $pageclass : '') . ($class ? ' ' . $class : ''); } //Get view public static function view($class = '') { $app = Factory::getApplication(); $view = $app->input->getCmd('view', ''); $layout = $app->input->getCmd('layout', ''); if (($view == 'modules')) { $layout = 'edit'; } return $layout; } //Get Template name public static function getTemplate() { return Factory::getApplication()->getTemplate(); } //Get Template URI public static function getTemplateUri() { return Uri::base(true) . '/templates/' . self::getTemplate(); } /** * Get or set Template param. If value not setted params get and return, * else set params * * @param string $name * @param mixed $value */ public static function Param($name = true, $value = null) { // if $name = true, this will return all param data if (is_bool($name) and $name == true) { return Factory::getApplication()->getTemplate(true)->params; } // if $value = null, this will return specific param data if (is_null($value)) { return Factory::getApplication()->getTemplate(true)->params->get($name); } // if $value not = null, this will set a value in specific name. $data = Factory::getApplication()->getTemplate(true)->params->get($name); if (is_null($data) or ! isset($data)) { Factory::getApplication()->getTemplate(true)->params->set($name, $value); return $value; } else { return $data; } } /** * Importing features * * @access private */ private $inPositions = []; public $loadFeature = []; private static function importFeatures() { $template = Factory::getApplication()->getTemplate(); $path = JPATH_THEMES . '/' . $template . '/features'; if (file_exists($path)) { $files = Folder::files($path, '.php'); if (count($files)) { foreach ($files as $key => $file) { include_once $path . '/' . $file; $name = File::stripExt($file); $class = 'Helix3Feature' . ucfirst($name); $class = new $class(self::getInstance()); $position = $class->position; $load_pos = (isset($class->load_pos) && $class->load_pos) ? $class->load_pos : ''; self::getInstance()->inPositions[] = $position; if (! empty($position)) { self::getInstance()->loadFeature[$position][$key]['feature'] = $class->renderFeature(); self::getInstance()->loadFeature[$position][$key]['load_pos'] = $load_pos; } } } } return self::getInstance(); } /** * get number from col-xs * * @param string $col_name */ public static function getColXsNo($col_name) { //Remove Classes name $class_remove = ['layout-column', 'column-active', 'col-sm-']; return (int) trim(str_replace($class_remove, '', $col_name)); } public static function generatelayout() { self::getInstance()->addCSS('custom.css'); self::getInstance()->addJS('custom.js'); $doc = Factory::getDocument(); $app = Factory::getApplication(); $option = $app->input->get('option', ''); $view = $app->input->get('view', ''); $layout = $app->input->get('layout', ''); $pagebuilder = false; $params = Factory::getApplication()->getTemplate(true)->params; if ($option == 'com_sppagebuilder') { $doc->addStylesheet(Uri::base(true) . '/plugins/system/helix3/assets/css/pagebuilder.css'); $pagebuilder = true; } // add container width $container_width = (int) $params->get('container_width', 1140); if ($container_width == 1140) { $container_css = "@media (min-width: 1400px) {\n"; $container_css .= ".container {\n"; $container_css .= "max-width: 1140px;\n"; $container_css .= "}\n"; $container_css .= "}"; self::getInstance()->addInlineCSS($container_css); } //Import Features self::importFeatures(); $rows = json_decode($params->get('layout') ?? ''); //Load from file if not exists in database if (empty($rows)) { $layout_file = JPATH_SITE . '/templates/' . self::getTemplate() . '/layout/default.json'; if (is_null($layout_file) || ! File::exists($layout_file)) { die('Default Layout file is not exists! Please goto to template manager and create a new layout first.'); } $rows = json_decode(file_get_contents($layout_file)); } $output = ''; foreach ($rows as $key => $row) { $rowColumns = self::rowColumns($row->attr); if (! empty($rowColumns)) { $componentArea = false; if (self::hasComponent($rowColumns)) { $componentArea = true; } $fluidrow = false; if (! empty($row->settings->fluidrow)) { $fluidrow = $row->settings->fluidrow; } $id = (empty($row->settings->name)) ? 'sp-section-' . ($key + 1) : 'sp-' . OutputFilter::stringURLSafe($row->settings->name); $row_class = ''; $hidden_on_phone = isset($row->settings->hidden_xs) && $row->settings->hidden_xs ? true : false; $hidden_on_tablet = isset($row->settings->hidden_sm) && $row->settings->hidden_sm ? true : false; $hidden_on_desktop = isset($row->settings->hidden_md) && $row->settings->hidden_md ? true : false; if ($hidden_on_desktop && $hidden_on_tablet && $hidden_on_phone) { $row_class = 'd-none'; } else if ($hidden_on_desktop && $hidden_on_tablet) { $row_class = 'd-block d-md-none'; } else if ($hidden_on_desktop && $hidden_on_phone) { $row_class = 'd-none d-md-block d-lg-none'; } else if ($hidden_on_tablet && $hidden_on_phone) { $row_class = 'd-none d-lg-block'; } else if ($hidden_on_desktop) { $row_class = 'd-lg-none'; } else if ($hidden_on_tablet) { $row_class = 'd-md-none d-lg-block'; } else if ($hidden_on_phone) { $row_class = 'd-none d-md-block'; } if (! empty($row->settings->custom_class)) { $row_class .= ' ' . $row->settings->custom_class; } if ($row_class) { $row_class = ' class="' . $row_class . '"'; } else { $row_class = ''; } //css $row_css = ''; if (! empty($row->settings->background_image)) { $row_css .= 'background-image:url("' . Uri::base(true) . '/' . htmlspecialchars((JVERSION < 4 ? $row->settings->background_image : HTMLHelper::cleanImageURL($row->settings->background_image)->url), ENT_COMPAT, 'UTF-8') . '");'; if (! empty($row->settings->background_repeat)) { $row_css .= 'background-repeat:' . $row->settings->background_repeat . ';'; } if (! empty($row->settings->background_size)) { $row_css .= 'background-size:' . $row->settings->background_size . ';'; } if (! empty($row->settings->background_attachment)) { $row_css .= 'background-attachment:' . $row->settings->background_attachment . ';'; } if (! empty($row->settings->background_position)) { $row_css .= 'background-position:' . $row->settings->background_position . ';'; } } if (! empty($row->settings->background_color)) { $row_css .= 'background-color:' . $row->settings->background_color . ';'; } if (! empty($row->settings->color)) { $row_css .= 'color:' . $row->settings->color . ';'; } if (! empty($row->settings->padding)) { $row_css .= 'padding:' . $row->settings->padding . ';'; } if (! empty($row->settings->margin)) { $row_css .= 'margin:' . $row->settings->margin . ';'; } if ($row_css) { $doc->addStyledeclaration('#' . $id . '{ ' . $row_css . ' }'); } //Link Color if (! empty($row->settings->link_color)) { $doc->addStyledeclaration('#' . $id . ' a{color:' . $row->settings->link_color . ';}'); } //Link Hover Color if (! empty($row->settings->link_hover_color)) { $doc->addStyledeclaration('#' . $id . ' a:hover{color:' . $row->settings->link_hover_color . ';}'); } // set html5 stracture $sematic = (! empty($row->settings->name)) ? strtolower($row->settings->name) : 'section'; switch ($sematic) { case "header": $sematic = 'header'; break; case "footer": $sematic = 'footer'; break; default: $sematic = 'section'; break; } $layout_data = [ 'sematic' => $sematic, 'id' => $id, 'row_class' => $row_class, 'componentArea' => $componentArea, 'pagebuilder' => $pagebuilder, 'fluidrow' => $fluidrow, 'rowColumns' => $rowColumns, 'componentArea' => $componentArea, 'componentArea' => $componentArea, ]; $template = Factory::getApplication()->getTemplate(); $themepath = JPATH_THEMES . '/' . $template; $generate_file = $themepath . '/html/layouts/helix3/frontend/generate.php'; $lyt_thm_path = $themepath . '/html/layouts/helix3/'; $layout_path = (file_exists($generate_file)) ? $lyt_thm_path : JPATH_ROOT . '/plugins/system/helix3/layouts'; $getLayout = new FileLayout('frontend.generate', $layout_path); $output .= $getLayout->render($layout_data); } } echo $output; } /* Detect component row */ private static function hasComponent($rowColumns) { $hasComponent = false; foreach ($rowColumns as $key => $column) { if ($column->settings->column_type) { /* Component */ $hasComponent = true; } } return $hasComponent; } //Get Active Columns private static function rowColumns($columns) { $doc = Factory::getDocument(); $cols = []; //Inactive $absspan = 0; // absence span $col_i = 1; $totalPublished = count($columns); // total publish children $hasComponent = false; foreach ($columns as &$column) { $column->settings->name = (! empty($column->settings->name)) ? $column->settings->name : 'none_empty'; $column->settings->column_type = (! empty($column->settings->column_type)) ? $column->settings->column_type : 0; $column->settings->custom_class = (! empty($column->settings->custom_class)) ? $column->settings->custom_class : ''; if (! $column->settings->column_type) { if (! self::countModules($column->settings->name)) { $col_xs_no = self::getColXsNo($column->className); $absspan += $col_xs_no; $totalPublished--; } } else { $hasComponent = true; } } //Active foreach ($columns as &$column) { if ($column->settings->column_type) { $column->className = 'col-lg-' . (self::getColXsNo($column->className) + $absspan); $cols[] = $column; $col_i++; } else { if (self::countModules($column->settings->name)) { $last_col = ($totalPublished == $col_i) ? $absspan : 0; if ($hasComponent) { $column->className = 'col-lg-' . self::getColXsNo($column->className); } else { $column->className = 'col-lg-' . (self::getColXsNo($column->className) + $last_col); } $cols[] = $column; $col_i++; } } } return $cols; } //Count Modules public static function countModules($position) { $doc = Factory::getDocument(); return ($doc->countModules($position) or self::hasFeature($position)); } /** * Has feature * * @param string $position */ public static function hasFeature($position) { if (in_array($position, self::getInstance()->inPositions)) { return true; } else { return false; } } /** * Add stylesheet * * @param mixed $sources . string or array * * @return self */ public static function addCSS($sources, $attribs = []) { $template = Factory::getApplication()->getTemplate(); $path = JPATH_THEMES . '/' . $template . '/css/'; $srcs = []; if (is_string($sources)) { $sources = explode(',', $sources); } if (! is_array($sources)) { $sources = [$sources]; } foreach ((array) $sources as $source) { $srcs[] = trim($source); } foreach ($srcs as $src) { if (file_exists($path . $src)) { self::getInstance()->document->addStyleSheet(Uri::base(true) . '/templates/' . $template . '/css/' . $src, [], $attribs); } else { if ($src != 'custom.css') { self::getInstance()->document->addStyleSheet($src, [], $attribs); } } } return self::getInstance(); } /** * Add javascript * * @param mixed $sources . string or array * @param string $seperator . default is , (comma) * * @return self */ public static function addJS($sources, $seperator = ',') { $srcs = []; $template = Factory::getApplication()->getTemplate(); $path = JPATH_THEMES . '/' . $template . '/js/'; if (is_string($sources)) { $sources = explode($seperator, $sources); } if (! is_array($sources)) { $sources = [$sources]; } foreach ((array) $sources as $source) { $srcs[] = trim($source); } foreach ($srcs as $src) { if (file_exists($path . $src)) { self::getInstance()->document->addScript(Uri::base(true) . '/templates/' . $template . '/js/' . $src); } else { if ($src != 'custom.js') { self::getInstance()->document->addScript($src); } } } return self::getInstance(); } /** * Add Inline Javascript * * @param mixed $code * * @return self */ public function addInlineJS($code) { self::getInstance()->document->addScriptDeclaration($code); return self::getInstance(); } /** * Add Inline CSS * * @param mixed $code * * @return self */ public function addInlineCSS($code) { self::getInstance()->document->addStyleDeclaration($code); return self::getInstance(); } /** * Less Init * */ public static function lessInit() { require_once __DIR__ . '/classes/lessc.inc.php'; self::getInstance()->_less = new helix3_lessc(); return self::getInstance(); } /** * Instance of Less */ public static function less() { return self::getInstance()->_less; } /** * Set Less Variables using array key and value * * @param mixed $array * * @return self */ public static function setLessVariables($array) { self::getInstance()->less()->setVariables($array); return self::getInstance(); } /** * Set less variable using name and value * * @param mixed $name * @param mixed $value * * @return self */ public static function setLessVariable($name, $value) { self::getInstance()->less()->setVariables([$name => $value]); return self::getInstance(); } /** * Compile less to css when less modified or css not exist * * @param mixed $less * @param mixed $css * * @return self */ private static function autoCompileLess($less, $css) { // load the cache $template = Factory::getApplication()->getTemplate(); $cachePath = JPATH_CACHE . '/com_templates/templates/' . $template; $cacheFile = $cachePath . '/' . basename($css . ".cache"); if (file_exists($cacheFile)) { $cache = unserialize(file_get_contents($cacheFile)); //If root changed then do not compile if (isset($cache['root']) && $cache['root']) { if ($cache['root'] != $less) { return self::getInstance(); } } } else { $cache = $less; } $lessInit = self::getInstance()->less(); $newCache = $lessInit->cachedCompile($cache); if (! is_array($cache) || $newCache["updated"] > $cache["updated"]) { if (! file_exists($cachePath)) { Folder::create($cachePath, 0755); } file_put_contents($cacheFile, serialize($newCache)); file_put_contents($css, $newCache['compiled']); } return self::getInstance(); } /** * Add Less * * @param mixed $less * @param mixed $css * * @return self */ public static function addLess($less, $css, $attribs = []) { $template = Factory::getApplication()->getTemplate(); $themepath = JPATH_THEMES . '/' . $template; if (self::getParam('lessoption') and self::getParam('lessoption') == '1') { if (file_exists($themepath . "/less/" . $less . ".less")) { self::getInstance()->autoCompileLess($themepath . "/less/" . $less . ".less", $themepath . "/css/" . $css . ".css"); } } self::getInstance()->addCSS($css . '.css', $attribs); return self::getInstance(); } private static function addLessFiles($less, $css) { $less = self::getInstance()->file('less/' . $less . '.less'); $css = self::getInstance()->file('css/' . $css . '.css'); self::getInstance()->less()->compileFile($less, $css); echo $less; die; return self::getInstance(); } private static function resetCookie($name) { if (JRequest::getVar('reset', '', 'get') == 1) { setcookie($name, '', time() - 3600, '/'); } } /** * Preset * */ public static function Preset() { $template = Factory::getApplication()->getTemplate(); $name = $template . '_preset'; if (isset($_COOKIE[$name])) { $current = $_COOKIE[$name]; } else { $current = self::getParam('preset'); } return $current; } public static function PresetParam($name) { return self::getParam(self::getInstance()->Preset() . $name); } /** * Load Menu * * @since 1.0 */ public static function loadMegaMenu($class = "", $name = '') { require_once __DIR__ . '/classes/menu.php'; return new Helix3Menu($class, $name); } /** * Convert object to array * */ public static function object_to_array($obj) { if (is_object($obj)) { $obj = (array) $obj; } if (is_array($obj)) { $new = []; foreach ($obj as $key => $val) { $new[$key] = self::object_to_array($val); } } else { $new = $obj; } return $new; } /** * Convert object to array * */ public static function font_key_search($font, $fonts) { foreach ($fonts as $key => $value) { if ($value['family'] == $font) { return $key; } } return 0; } /** * Load Web Fonts */ public static function loadWebFonts() { //Body Font $webfonts = []; if (self::getParam('enable_body_font')) { $webfonts['body'] = self::getParam('body_font'); } //Heading1 Font if (self::getParam('enable_h1_font')) { $webfonts['h1'] = self::getParam('h1_font'); } //Heading2 Font if (self::getParam('enable_h2_font')) { $webfonts['h2'] = self::getParam('h2_font'); } //Heading3 Font if (self::getParam('enable_h3_font')) { $webfonts['h3'] = self::getParam('h3_font'); } //Heading4 Font if (self::getParam('enable_h4_font')) { $webfonts['h4'] = self::getParam('h4_font'); } //Heading5 Font if (self::getParam('enable_h5_font')) { $webfonts['h5'] = self::getParam('h5_font'); } //Heading6 Font if (self::getParam('enable_h6_font')) { $webfonts['h6'] = self::getParam('h6_font'); } //Navigation Font if (self::getParam('enable_navigation_font')) { $webfonts['.sp-megamenu-parent'] = self::getParam('navigation_font'); } //Custom Font if (self::getParam('enable_custom_font') && self::getParam('custom_font_selectors')) { $webfonts[self::getParam('custom_font_selectors')] = self::getParam('custom_font'); } self::addGoogleFont($webfonts); } /** * Add Google Fonts * * @param string $name . Name of font. Ex: Yanone+Kaffeesatz:400,700,300,200 or Yanone+Kaffeesatz or Yanone * Kaffeesatz * @param string $field . Applied selector. Ex: h1, h2, #id, .classname */ public static function addGoogleFont($fonts) { $doc = Factory::getDocument(); $webfonts = ''; $tpl_path = JPATH_BASE . '/templates/' . Factory::getApplication()->getTemplate() . '/webfonts/webfonts.json'; $plg_path = JPATH_BASE . '/plugins/system/helix3/assets/webfonts/webfonts.json'; if (file_exists($tpl_path)) { $webfonts = file_get_contents($tpl_path); } else if (file_exists($plg_path)) { $webfonts = file_get_contents($plg_path); } //Families $families = []; foreach ($fonts as $key => $value) { $value = json_decode($value ?? ''); if (isset($value->fontWeight) && $value->fontWeight) { $families[$value->fontFamily]['weight'][] = $value->fontWeight; } if (isset($value->fontSubset) && $value->fontSubset) { $families[$value->fontFamily]['subset'][] = $value->fontSubset; } } //Selectors $selectors = []; foreach ($fonts as $key => $value) { $value = json_decode($value ?? ''); if (isset($value->fontFamily) && $value->fontFamily) { $selectors[$key]['family'] = $value->fontFamily; } if (isset($value->fontSize) && $value->fontSize) { $selectors[$key]['size'] = $value->fontSize; } if (isset($value->fontWeight) && $value->fontWeight) { $selectors[$key]['weight'] = $value->fontWeight; } } //Add Google Font URL foreach ($families as $key => $value) { $output = str_replace(' ', '+', $key); // Weight if ($webfonts) { $fonts_array = self::object_to_array(json_decode($webfonts) ?? '{}'); $font_key = self::font_key_search($key, $fonts_array['items']); $weight_array = $fonts_array['items'][$font_key]['variants']; $output .= ':' . implode(',', $weight_array); } else { $weight = array_unique($value['weight']); if (isset($weight) && $weight) { $output .= ':' . implode(',', $weight); } } // Subset $subset = array_unique($value['subset']); if (isset($subset) && $subset) { $output .= '&subset=' . implode(',', $subset); } $doc->addStylesheet('//fonts.googleapis.com/css?family=' . $output); } //Add font to Selector foreach ($selectors as $key => $value) { if (isset($value['family']) && $value['family']) { $output = 'font-family:' . $value['family'] . ', sans-serif; '; if (isset($value['size']) && $value['size']) { $output .= 'font-size:' . $value['size'] . 'px; '; } if (isset($value['weight']) && $value['weight']) { $output .= 'font-weight:' . str_replace('regular', 'normal', $value['weight']) . '; '; } $selectors = explode(',', $key); foreach ($selectors as $selector) { $style = $selector . '{' . $output . '}'; $doc->addStyledeclaration($style); } } } } //Exclude js and return others js private static function excludeJS($key, $excludes) { $match = false; if ($excludes) { $excludes = explode(',', $excludes); foreach ($excludes as $exclude) { if (basename($key) == trim($exclude)) { $match = true; } } } return $match; } public static function compressJS($excludes = '') { require_once __DIR__ . '/classes/Minifier.php'; $doc = Factory::getDocument(); $app = Factory::getApplication(); $view = $app->input->get('view'); $layout = $app->input->get('layout'); // disable js compress for edit view if ($view == 'form' || $layout == 'edit') { return; } $cachetime = $app->get('cachetime', 15); $all_scripts = $doc->_scripts; $cache_path = JPATH_ROOT . '/cache/com_templates/templates/' . self::getTemplate(); $scripts = []; $root_url = Uri::root(true); $minifiedCode = ''; $md5sum = ''; //Check all local scripts foreach ($all_scripts as $key => $value) { $js_file = str_replace($root_url, JPATH_ROOT, $key); // disable js compress for sp_pagebuilder if (strpos($js_file, 'com_sppagebuilder')) { continue; } if (strpos($js_file, JPATH_ROOT) === false) { $js_file = JPATH_ROOT . $key; } if (File::exists($js_file)) { if (! self::excludeJS($key, $excludes)) { $scripts[] = $key; $md5sum .= md5($key); if (self::isMinifiedJS($js_file)) { $compressed = file_get_contents($js_file); } else { $compressed = \JShrink\Minifier::minify(file_get_contents($js_file), ['flaggedComments' => false]); } $minifiedCode .= "/*------ " . basename($js_file) . " ------*/\n" . $compressed . "\n\n"; //add file name to compressed JS unset($doc->_scripts[$key]); //Remove sripts } } } //Compress All scripts if ($minifiedCode) { if (! Folder::exists($cache_path)) { Folder::create($cache_path, 0755); } else { $file = $cache_path . '/' . md5($md5sum) . '.js'; if (! File::exists($file)) { File::write($file, $minifiedCode); } else { if (filesize($file) == 0 || ((filemtime($file) + $cachetime * 60) < time())) { File::write($file, $minifiedCode); } } $doc->addScript(Uri::base(true) . '/cache/com_templates/templates/' . self::getTemplate() . '/' . md5($md5sum) . '.js'); } } return; } private static function isMinifiedJS($file) { $content = file_get_contents($file); $contentLength = strlen($content); $numberOfLines = preg_match_all("@[\r\n]@", $content); return ($numberOfLines === 1) || (($numberOfLines * 100 / $contentLength) < 1); } //Compress CSS files public static function compressCSS() { //function to compress css files require_once __DIR__ . '/classes/cssmin.php'; $doc = Factory::getDocument(); $app = Factory::getApplication(); $cachetime = $app->get('cachetime', 15); $all_stylesheets = $doc->_styleSheets; $cache_path = JPATH_ROOT . '/cache/com_templates/templates/' . self::getTemplate(); $stylesheets = []; $root_url = Uri::root(true); $minifiedCode = ''; $md5sum = ''; $view = $app->input->get('view'); $layout = $app->input->get('layout'); // disable css compress for edit view if ($view == 'form' || $layout == 'edit') { return; } //Check all local stylesheets foreach ($all_stylesheets as $key => $value) { $css_file = str_replace($root_url, JPATH_ROOT, $key); // disable css compress for sp_pagebuilder if (strpos($css_file, 'com_sppagebuilder')) { continue; } if (strpos($css_file, JPATH_ROOT) === false) { $css_file = JPATH_ROOT . $key; } global $absolute_url; $absolute_url = $key; //absoulte path of each css file if (File::exists($css_file)) { $stylesheets[] = $key; $md5sum .= md5($key); $compressed = CSSMinify::process(file_get_contents($css_file)); $fixUrl = preg_replace_callback('/url\(([^\)]*)\)/', function ($matches) { $url = str_replace(['"', '\''], '', $matches[1]); global $absolute_url; $base = dirname($absolute_url); while (preg_match('/^\.\.\//', $url)) { $base = dirname($base); $url = substr($url, 3); } $url = $base . '/' . $url; return "url('$url')"; }, $compressed); $minifiedCode .= "/*------ " . basename($css_file) . " ------*/\n" . $fixUrl . "\n\n"; //add file name to compressed css unset($doc->_styleSheets[$key]); //Remove scripts } } //Compress All stylesheets if ($minifiedCode) { if (! Folder::exists($cache_path)) { Folder::create($cache_path, 0755); } else { $file = $cache_path . '/' . md5($md5sum) . '.css'; if (! File::exists($file)) { File::write($file, $minifiedCode); } else { if (filesize($file) == 0 || ((filemtime($file) + $cachetime * 60) < time())) { File::write($file, $minifiedCode); } } $doc->addStylesheet(Uri::base(true) . '/cache/com_templates/templates/' . self::getTemplate() . '/' . md5($md5sum) . '.css'); } } return; } } PKAA#]?�\��%system/helix3/core/classes/cssmin.phpnu�[���<?php /** * Class CSSMinify * @package Minify */ /** * Compress CSS * * This is a heavy regex-based removal of whitespace, unnecessary * comments and tokens, and some CSS value minimization, where practical. * Many steps have been taken to avoid breaking comment-based hacks, * including the ie5/mac filter (and its inversion), but expect tricky * hacks involving comment tokens in 'content' value strings to break * minimization badly. A test suite is available. * * @package Minify * @author Stephen Clay <steve@mrclay.org> * @author http://code.google.com/u/1stvamp/ (Issue 64 patch) */ class CSSMinify { /** * Minify a CSS string * * @param string $css * * @param array $options (currently ignored) * * @return string */ public static function process($css, $options = array()) { $obj = new CSSMinify($options); return $obj->_process($css); } /** * @var array options */ protected $_options = null; /** * @var bool Are we "in" a hack? * * I.e. are some browsers targetted until the next comment? */ protected $_inHack = false; /** * Constructor * * @param array $options (currently ignored) * * @return null */ private function __construct($options) { $this->_options = $options; } /** * Minify a CSS string * * @param string $css * * @return string */ protected function _process($css) { $css = str_replace("\r\n", "\n", $css); // preserve empty comment after '>' // http://www.webdevout.net/css-hacks#in_css-selectors $css = preg_replace('@>/\\*\\s*\\*/@', '>/*keep*/', $css); // preserve empty comment between property and value // http://css-discuss.incutio.com/?page=BoxModelHack $css = preg_replace('@/\\*\\s*\\*/\\s*:@', '/*keep*/:', $css); $css = preg_replace('@:\\s*/\\*\\s*\\*/@', ':/*keep*/', $css); // apply callback to all valid comments (and strip out surrounding ws $css = preg_replace_callback('@\\s*/\\*([\\s\\S]*?)\\*/\\s*@' ,array($this, '_commentCB'), $css); // remove ws around { } and last semicolon in declaration block $css = preg_replace('/\\s*{\\s*/', '{', $css); $css = preg_replace('/;?\\s*}\\s*/', '}', $css); // remove ws surrounding semicolons $css = preg_replace('/\\s*;\\s*/', ';', $css); // remove ws around urls $css = preg_replace('/ url\\( # url( \\s* ([^\\)]+?) # 1 = the URL (really just a bunch of non right parenthesis) \\s* \\) # ) /x', 'url($1)', $css); // remove ws between rules and colons $css = preg_replace('/ \\s* ([{;]) # 1 = beginning of block or rule separator \\s* ([\\*_]?[\\w\\-]+) # 2 = property (and maybe IE filter) \\s* : \\s* (\\b|[#\'"]) # 3 = first character of a value /x', '$1$2:$3', $css); // remove ws in selectors $css = preg_replace_callback('/ (?: # non-capture \\s* [^~>+,\\s]+ # selector part \\s* [,>+~] # combinators )+ \\s* [^~>+,\\s]+ # selector part { # open declaration block /x' ,array($this, '_selectorsCB'), $css); // minimize hex colors $css = preg_replace('/([^=])#([a-f\\d])\\2([a-f\\d])\\3([a-f\\d])\\4([\\s;\\}])/i' , '$1#$2$3$4$5', $css); // remove spaces between font families $css = preg_replace_callback('/font-family:([^;}]+)([;}])/' ,array($this, '_fontFamilyCB'), $css); $css = preg_replace('/@import\\s+url/', '@import url', $css); // replace any ws involving newlines with a single newline $css = preg_replace('/[ \\t]*\\n+\\s*/', "\n", $css); // separate common descendent selectors w/ newlines (to limit line lengths) $css = preg_replace('/([\\w#\\.\\*]+)\\s+([\\w#\\.\\*]+){/', "$1\n$2{", $css); // Use newline after 1st numeric value (to limit line lengths). $css = preg_replace('/ ((?:padding|margin|border|outline):\\d+(?:px|em)?) # 1 = prop : 1st numeric value \\s+ /x' ,"$1\n", $css); // prevent triggering IE6 bug: http://www.crankygeek.com/ie6pebug/ $css = preg_replace('/:first-l(etter|ine)\\{/', ':first-l$1 {', $css); return trim($css); } /** * Replace what looks like a set of selectors * * @param array $m regex matches * * @return string */ protected function _selectorsCB($m) { // remove ws around the combinators return preg_replace('/\\s*([,>+~])\\s*/', '$1', $m[0]); } /** * Process a comment and return a replacement * * @param array $m regex matches * * @return string */ protected function _commentCB($m) { $hasSurroundingWs = (trim($m[0]) !== $m[1]); $m = $m[1]; // $m is the comment content w/o the surrounding tokens, // but the return value will replace the entire comment. if ($m === 'keep') { return '/**/'; } if ($m === '" "') { // component of http://tantek.com/CSS/Examples/midpass.html return '/*" "*/'; } if (preg_match('@";\\}\\s*\\}/\\*\\s+@', $m)) { // component of http://tantek.com/CSS/Examples/midpass.html return '/*";}}/* */'; } if ($this->_inHack) { // inversion: feeding only to one browser if (preg_match('@ ^/ # comment started like /*/ \\s* (\\S[\\s\\S]+?) # has at least some non-ws content \\s* /\\* # ends like /*/ or /**/ @x', $m, $n)) { // end hack mode after this comment, but preserve the hack and comment content $this->_inHack = false; return "/*/{$n[1]}/**/"; } } if (substr($m, -1) === '\\') { // comment ends like \*/ // begin hack mode and preserve hack $this->_inHack = true; return '/*\\*/'; } if ($m !== '' && $m[0] === '/') { // comment looks like /*/ foo */ // begin hack mode and preserve hack $this->_inHack = true; return '/*/*/'; } if ($this->_inHack) { // a regular comment ends hack mode but should be preserved $this->_inHack = false; return '/**/'; } // Issue 107: if there's any surrounding whitespace, it may be important, so // replace the comment with a single space return $hasSurroundingWs // remove all other comments ? ' ' : ''; } /** * Process a font-family listing and return a replacement * * @param array $m regex matches * * @return string */ protected function _fontFamilyCB($m) { $m[1] = preg_replace('/ \\s* ( "[^"]+" # 1 = family in double qutoes |\'[^\']+\' # or 1 = family in single quotes |[\\w\\-]+ # or 1 = unquoted family ) \\s* /x', '$1', $m[1]); return 'font-family:' . $m[1] . $m[2]; } } PKAA#]��m����(system/helix3/core/classes/lessc.inc.phpnu�[���<?php /** * lessphp v0.5.0 * http://leafo.net/lessphp * * LESS CSS compiler, adapted from http://lesscss.org * * Copyright 2013, Leaf Corcoran <leafot@gmail.com> * Licensed under MIT or GPLv3, see LICENSE */ /** * The LESS compiler and parser. * * Converting LESS to CSS is a three stage process. The incoming file is parsed * by `lessc_parser` into a syntax tree, then it is compiled into another tree * representing the CSS structure by `lessc`. The CSS tree is fed into a * formatter, like `lessc_formatter` which then outputs CSS as a string. * * During the first compile, all values are *reduced*, which means that their * types are brought to the lowest form before being dump as strings. This * handles math equations, variable dereferences, and the like. * * The `parse` function of `lessc` is the entry point. * * In summary: * * The `lessc` class creates an instance of the parser, feeds it LESS code, * then transforms the resulting tree to a CSS tree. This class also holds the * evaluation context, such as all available mixins and variables at any given * time. * * The `lessc_parser` class is only concerned with parsing its input. * * The `lessc_formatter` takes a CSS tree, and dumps it to a formatted string, * handling things like indentation. */ class helix3_lessc { public static $VERSION = "v0.5.0"; public static $TRUE = array("keyword", "true"); public static $FALSE = array("keyword", "false"); protected $libFunctions = array(); protected $registeredVars = array(); protected $preserveComments = false; public $vPrefix = '@'; // prefix of abstract properties public $mPrefix = '$'; // prefix of abstract blocks public $parentSelector = '&'; public $importDisabled = false; public $importDir = ''; protected $numberPrecision = null; protected $allParsedFiles = array(); // set to the parser that generated the current line when compiling // so we know how to create error messages protected $sourceParser = null; protected $sourceLoc = null; protected static $nextImportId = 0; // uniquely identify imports public $parser; public $count; public $line; public $env; public $buffer; public $seenComments; public $inExp; public $scope; public $indentLevel; public $formatter; // attempts to find the path of an import url, returns null for css files protected function findImport($url) { foreach ((array)$this->importDir as $dir) { $full = $dir.(substr($dir, -1) != '/' ? '/' : '').$url; if ($this->fileExists($file = $full.'.less') || $this->fileExists($file = $full)) { return $file; } } return null; } protected function fileExists($name) { return is_file($name); } public static function compressList($items, $delim) { if (!isset($items[1]) && isset($items[0])) return $items[0]; else return array('list', $delim, $items); } public static function preg_quote($what) { return preg_quote($what, '/'); } protected function tryImport($importPath, $parentBlock, $out) { if ($importPath[0] == "function" && $importPath[1] == "url") { $importPath = $this->flattenList($importPath[2]); } $str = $this->coerceString($importPath); if ($str === null) return false; $url = $this->compileValue($this->lib_e($str)); // don't import if it ends in css if (substr_compare($url, '.css', -4, 4) === 0) return false; $realPath = $this->findImport($url); if ($realPath === null) return false; if ($this->importDisabled) { return array(false, "/* import disabled */"); } if (isset($this->allParsedFiles[realpath($realPath)])) { return array(false, null); } $this->addParsedFile($realPath); $parser = $this->makeParser($realPath); $root = $parser->parse(file_get_contents($realPath)); // set the parents of all the block props foreach ($root->props as $prop) { if ($prop[0] == "block") { $prop[1]->parent = $parentBlock; } } // copy mixins into scope, set their parents // bring blocks from import into current block // TODO: need to mark the source parser these came from this file foreach ($root->children as $childName => $child) { if (isset($parentBlock->children[$childName])) { $parentBlock->children[$childName] = array_merge( $parentBlock->children[$childName], $child); } else { $parentBlock->children[$childName] = $child; } } $pi = pathinfo($realPath); $dir = $pi["dirname"]; list($top, $bottom) = $this->sortProps($root->props, true); $this->compileImportedProps($top, $parentBlock, $out, $parser, $dir); return array(true, $bottom, $parser, $dir); } protected function compileImportedProps($props, $block, $out, $sourceParser, $importDir) { $oldSourceParser = $this->sourceParser; $oldImport = $this->importDir; // TODO: this is because the importDir api is stupid $this->importDir = (array)$this->importDir; array_unshift($this->importDir, $importDir); foreach ($props as $prop) { $this->compileProp($prop, $block, $out); } $this->importDir = $oldImport; $this->sourceParser = $oldSourceParser; } /** * Recursively compiles a block. * * A block is analogous to a CSS block in most cases. A single LESS document * is encapsulated in a block when parsed, but it does not have parent tags * so all of it's children appear on the root level when compiled. * * Blocks are made up of props and children. * * Props are property instructions, array tuples which describe an action * to be taken, eg. write a property, set a variable, mixin a block. * * The children of a block are just all the blocks that are defined within. * This is used to look up mixins when performing a mixin. * * Compiling the block involves pushing a fresh environment on the stack, * and iterating through the props, compiling each one. * * See helix3_lessc::compileProp() * */ protected function compileBlock($block) { switch ($block->type) { case "root": $this->compileRoot($block); break; case null: $this->compileCSSBlock($block); break; case "media": $this->compileMedia($block); break; case "directive": $name = "@" . $block->name; if (!empty($block->value)) { $name .= " " . $this->compileValue($this->reduce($block->value)); } $this->compileNestedBlock($block, array($name)); break; default: $this->throwError("unknown block type: $block->type\n"); } } protected function compileCSSBlock($block) { $env = $this->pushEnv(); $selectors = $this->compileSelectors($block->tags); $env->selectors = $this->multiplySelectors($selectors); $out = $this->makeOutputBlock(null, $env->selectors); $this->scope->children[] = $out; $this->compileProps($block, $out); $block->scope = $env; // mixins carry scope with them! $this->popEnv(); } protected function compileMedia($media) { $env = $this->pushEnv($media); $parentScope = $this->mediaParent($this->scope); $query = $this->compileMediaQuery($this->multiplyMedia($env)); $this->scope = $this->makeOutputBlock($media->type, array($query)); $parentScope->children[] = $this->scope; $this->compileProps($media, $this->scope); if (count($this->scope->lines) > 0) { $orphanSelelectors = $this->findClosestSelectors(); if (!is_null($orphanSelelectors)) { $orphan = $this->makeOutputBlock(null, $orphanSelelectors); $orphan->lines = $this->scope->lines; array_unshift($this->scope->children, $orphan); $this->scope->lines = array(); } } $this->scope = $this->scope->parent; $this->popEnv(); } protected function mediaParent($scope) { while (!empty($scope->parent)) { if (!empty($scope->type) && $scope->type != "media") { break; } $scope = $scope->parent; } return $scope; } protected function compileNestedBlock($block, $selectors) { $this->pushEnv($block); $this->scope = $this->makeOutputBlock($block->type, $selectors); $this->scope->parent->children[] = $this->scope; $this->compileProps($block, $this->scope); $this->scope = $this->scope->parent; $this->popEnv(); } protected function compileRoot($root) { $this->pushEnv(); $this->scope = $this->makeOutputBlock($root->type); $this->compileProps($root, $this->scope); $this->popEnv(); } protected function compileProps($block, $out) { foreach ($this->sortProps($block->props) as $prop) { $this->compileProp($prop, $block, $out); } $out->lines = $this->deduplicate($out->lines); } /** * Deduplicate lines in a block. Comments are not deduplicated. If a * duplicate rule is detected, the comments immediately preceding each * occurence are consolidated. */ protected function deduplicate($lines) { $unique = array(); $comments = array(); foreach ($lines as $line) { if (strpos($line, '/*') === 0) { $comments[] = $line; continue; } if (!in_array($line, $unique)) { $unique[] = $line; } array_splice($unique, array_search($line, $unique), 0, $comments); $comments = array(); } return array_merge($unique, $comments); } protected function sortProps($props, $split = false) { $vars = array(); $imports = array(); $other = array(); $stack = array(); foreach ($props as $prop) { switch ($prop[0]) { case "comment": $stack[] = $prop; break; case "assign": $stack[] = $prop; if (isset($prop[1][0]) && $prop[1][0] == $this->vPrefix) { $vars = array_merge($vars, $stack); } else { $other = array_merge($other, $stack); } $stack = array(); break; case "import": $id = self::$nextImportId++; $prop[] = $id; $stack[] = $prop; $imports = array_merge($imports, $stack); $other[] = array("import_mixin", $id); $stack = array(); break; default: $stack[] = $prop; $other = array_merge($other, $stack); $stack = array(); break; } } $other = array_merge($other, $stack); if ($split) { return array(array_merge($imports, $vars), $other); } else { return array_merge($imports, $vars, $other); } } protected function compileMediaQuery($queries) { $compiledQueries = array(); foreach ($queries as $query) { $parts = array(); foreach ($query as $q) { switch ($q[0]) { case "mediaType": $parts[] = implode(" ", array_slice($q, 1)); break; case "mediaExp": if (isset($q[2])) { $parts[] = "($q[1]: " . $this->compileValue($this->reduce($q[2])) . ")"; } else { $parts[] = "($q[1])"; } break; case "variable": $parts[] = $this->compileValue($this->reduce($q)); break; } } if (count($parts) > 0) { $compiledQueries[] = implode(" and ", $parts); } } $out = "@media"; if (!empty($parts)) { $out .= " " . implode($this->formatter->selectorSeparator, $compiledQueries); } return $out; } protected function multiplyMedia($env, $childQueries = null) { if (is_null($env) || !empty($env->block->type) && $env->block->type != "media" ) { return $childQueries; } // plain old block, skip if (empty($env->block->type)) { return $this->multiplyMedia($env->parent, $childQueries); } $out = array(); $queries = $env->block->queries; if (is_null($childQueries)) { $out = $queries; } else { foreach ($queries as $parent) { foreach ($childQueries as $child) { $out[] = array_merge($parent, $child); } } } return $this->multiplyMedia($env->parent, $out); } protected function expandParentSelectors(&$tag, $replace) { $parts = explode("$&$", $tag); $count = 0; foreach ($parts as &$part) { $part = str_replace($this->parentSelector, $replace, $part, $c); $count += $c; } $tag = implode($this->parentSelector, $parts); return $count; } protected function findClosestSelectors() { $env = $this->env; $selectors = null; while ($env !== null) { if (isset($env->selectors)) { $selectors = $env->selectors; break; } $env = $env->parent; } return $selectors; } // multiply $selectors against the nearest selectors in env protected function multiplySelectors($selectors) { // find parent selectors $parentSelectors = $this->findClosestSelectors(); if (is_null($parentSelectors)) { // kill parent reference in top level selector foreach ($selectors as &$s) { $this->expandParentSelectors($s, ""); } return $selectors; } $out = array(); foreach ($parentSelectors as $parent) { foreach ($selectors as $child) { $count = $this->expandParentSelectors($child, $parent); // don't prepend the parent tag if & was used if ($count > 0) { $out[] = trim($child); } else { $out[] = trim($parent . ' ' . $child); } } } return $out; } // reduces selector expressions protected function compileSelectors($selectors) { $out = array(); foreach ($selectors as $s) { if (is_array($s)) { list(, $value) = $s; $out[] = trim($this->compileValue($this->reduce($value))); } else { $out[] = $s; } } return $out; } protected function eq($left, $right) { return $left == $right; } protected function patternMatch($block, $orderedArgs, $keywordArgs) { // match the guards if it has them // any one of the groups must have all its guards pass for a match if (!empty($block->guards)) { $groupPassed = false; foreach ($block->guards as $guardGroup) { foreach ($guardGroup as $guard) { $this->pushEnv(); $this->zipSetArgs($block->args, $orderedArgs, $keywordArgs); $negate = false; if ($guard[0] == "negate") { $guard = $guard[1]; $negate = true; } $passed = $this->reduce($guard) == self::$TRUE; if ($negate) $passed = !$passed; $this->popEnv(); if ($passed) { $groupPassed = true; } else { $groupPassed = false; break; } } if ($groupPassed) break; } if (!$groupPassed) { return false; } } if (empty($block->args)) { return $block->isVararg || empty($orderedArgs) && empty($keywordArgs); } $remainingArgs = $block->args; if ($keywordArgs) { $remainingArgs = array(); foreach ($block->args as $arg) { if ($arg[0] == "arg" && isset($keywordArgs[$arg[1]])) { continue; } $remainingArgs[] = $arg; } } $i = -1; // no args // try to match by arity or by argument literal foreach ($remainingArgs as $i => $arg) { switch ($arg[0]) { case "lit": if (empty($orderedArgs[$i]) || !$this->eq($arg[1], $orderedArgs[$i])) { return false; } break; case "arg": // no arg and no default value if (!isset($orderedArgs[$i]) && !isset($arg[2])) { return false; } break; case "rest": $i--; // rest can be empty break 2; } } if ($block->isVararg) { return true; // not having enough is handled above } else { $numMatched = $i + 1; // greater than because default values always match return $numMatched >= count($orderedArgs); } } protected function patternMatchAll($blocks, $orderedArgs, $keywordArgs, $skip = array()) { $matches = null; foreach ($blocks as $block) { // skip seen blocks that don't have arguments if (isset($skip[$block->id]) && !isset($block->args)) { continue; } if ($this->patternMatch($block, $orderedArgs, $keywordArgs)) { $matches[] = $block; } } return $matches; } // attempt to find blocks matched by path and args protected function findBlocks($searchIn, $path, $orderedArgs, $keywordArgs, $seen = array()) { if ($searchIn == null) return null; if (isset($seen[$searchIn->id])) return null; $seen[$searchIn->id] = true; $name = $path[0]; if (isset($searchIn->children[$name])) { $blocks = $searchIn->children[$name]; if (count($path) == 1) { $matches = $this->patternMatchAll($blocks, $orderedArgs, $keywordArgs, $seen); if (!empty($matches)) { // This will return all blocks that match in the closest // scope that has any matching block, like lessjs return $matches; } } else { $matches = array(); foreach ($blocks as $subBlock) { $subMatches = $this->findBlocks($subBlock, array_slice($path, 1), $orderedArgs, $keywordArgs, $seen); if (!is_null($subMatches)) { foreach ($subMatches as $sm) { $matches[] = $sm; } } } return count($matches) > 0 ? $matches : null; } } if ($searchIn->parent === $searchIn) return null; return $this->findBlocks($searchIn->parent, $path, $orderedArgs, $keywordArgs, $seen); } // sets all argument names in $args to either the default value // or the one passed in through $values protected function zipSetArgs($args, $orderedValues, $keywordValues) { $assignedValues = array(); $i = 0; foreach ($args as $a) { if ($a[0] == "arg") { if (isset($keywordValues[$a[1]])) { // has keyword arg $value = $keywordValues[$a[1]]; } elseif (isset($orderedValues[$i])) { // has ordered arg $value = $orderedValues[$i]; $i++; } elseif (isset($a[2])) { // has default value $value = $a[2]; } else { $this->throwError("Failed to assign arg " . $a[1]); $value = null; // :( } $value = $this->reduce($value); $this->set($a[1], $value); $assignedValues[] = $value; } else { // a lit $i++; } } // check for a rest $last = end($args); if (isset($last[0]) && $last[0] == "rest") { $rest = array_slice($orderedValues, count($args) - 1); $this->set($last[1], $this->reduce(array("list", " ", $rest))); } // wow is this the only true use of PHP's + operator for arrays? $this->env->arguments = $assignedValues + $orderedValues; } // compile a prop and update $lines or $blocks appropriately protected function compileProp($prop, $block, $out) { // set error position context $this->sourceLoc = isset($prop[-1]) ? $prop[-1] : -1; switch ($prop[0]) { case 'assign': list(, $name, $value) = $prop; if ($name[0] == $this->vPrefix) { $this->set($name, $value); } else { $out->lines[] = $this->formatter->property($name, $this->compileValue($this->reduce($value))); } break; case 'block': list(, $child) = $prop; $this->compileBlock($child); break; case 'mixin': list(, $path, $args, $suffix) = $prop; $orderedArgs = array(); $keywordArgs = array(); foreach ((array)$args as $arg) { $argval = null; switch ($arg[0]) { case "arg": if (!isset($arg[2])) { $orderedArgs[] = $this->reduce(array("variable", $arg[1])); } else { $keywordArgs[$arg[1]] = $this->reduce($arg[2]); } break; case "lit": $orderedArgs[] = $this->reduce($arg[1]); break; default: $this->throwError("Unknown arg type: " . $arg[0]); } } $mixins = $this->findBlocks($block, $path, $orderedArgs, $keywordArgs); if ($mixins === null) { $this->throwError("{$prop[1][0]} is undefined"); } foreach ($mixins as $mixin) { if ($mixin === $block && !$orderedArgs) { continue; } $haveScope = false; if (isset($mixin->parent->scope)) { $haveScope = true; $mixinParentEnv = $this->pushEnv(); $mixinParentEnv->storeParent = $mixin->parent->scope; } $haveArgs = false; if (isset($mixin->args)) { $haveArgs = true; $this->pushEnv(); $this->zipSetArgs($mixin->args, $orderedArgs, $keywordArgs); } $oldParent = $mixin->parent; if ($mixin != $block) $mixin->parent = $block; foreach ($this->sortProps($mixin->props) as $subProp) { if ($suffix !== null && $subProp[0] == "assign" && is_string($subProp[1]) && $subProp[1][0] != $this->vPrefix ) { $subProp[2] = array( 'list', ' ', array($subProp[2], array('keyword', $suffix)) ); } $this->compileProp($subProp, $mixin, $out); } $mixin->parent = $oldParent; if ($haveArgs) $this->popEnv(); if ($haveScope) $this->popEnv(); } break; case 'raw': $out->lines[] = $prop[1]; break; case "directive": list(, $name, $value) = $prop; $out->lines[] = "@$name " . $this->compileValue($this->reduce($value)).';'; break; case "comment": $out->lines[] = $prop[1]; break; case "import": list(, $importPath, $importId) = $prop; $importPath = $this->reduce($importPath); if (!isset($this->env->imports)) { $this->env->imports = array(); } $result = $this->tryImport($importPath, $block, $out); $this->env->imports[$importId] = $result === false ? array(false, "@import " . $this->compileValue($importPath).";") : $result; break; case "import_mixin": list(,$importId) = $prop; $import = $this->env->imports[$importId]; if ($import[0] === false) { if (isset($import[1])) { $out->lines[] = $import[1]; } } else { list(, $bottom, $parser, $importDir) = $import; $this->compileImportedProps($bottom, $block, $out, $parser, $importDir); } break; default: $this->throwError("unknown op: {$prop[0]}\n"); } } /** * Compiles a primitive value into a CSS property value. * * Values in lessphp are typed by being wrapped in arrays, their format is * typically: * * array(type, contents [, additional_contents]*) * * The input is expected to be reduced. This function will not work on * things like expressions and variables. */ public function compileValue($value) { switch ($value[0]) { case 'list': // [1] - delimiter // [2] - array of values return implode($value[1], array_map(array($this, 'compileValue'), $value[2])); case 'raw_color': if (!empty($this->formatter->compressColors)) { return $this->compileValue($this->coerceColor($value)); } return $value[1]; case 'keyword': // [1] - the keyword return $value[1]; case 'number': list(, $num, $unit) = $value; // [1] - the number // [2] - the unit if ($this->numberPrecision !== null) { $num = round($num, $this->numberPrecision); } return $num . $unit; case 'string': // [1] - contents of string (includes quotes) list(, $delim, $content) = $value; foreach ($content as &$part) { if (is_array($part)) { $part = $this->compileValue($part); } } return $delim . implode($content) . $delim; case 'color': // [1] - red component (either number or a %) // [2] - green component // [3] - blue component // [4] - optional alpha component list(, $r, $g, $b) = $value; $r = round($r); $g = round($g); $b = round($b); if (count($value) == 5 && $value[4] != 1) { // rgba return 'rgba('.$r.','.$g.','.$b.','.$value[4].')'; } $h = sprintf("#%02x%02x%02x", $r, $g, $b); if (!empty($this->formatter->compressColors)) { // Converting hex color to short notation (e.g. #003399 to #039) if ($h[1] === $h[2] && $h[3] === $h[4] && $h[5] === $h[6]) { $h = '#' . $h[1] . $h[3] . $h[5]; } } return $h; case 'function': list(, $name, $args) = $value; return $name.'('.$this->compileValue($args).')'; default: // assumed to be unit $this->throwError("unknown value type: $value[0]"); } } protected function lib_pow($args) { list($base, $exp) = $this->assertArgs($args, 2, "pow"); return pow($this->assertNumber($base), $this->assertNumber($exp)); } protected function lib_pi() { return pi(); } protected function lib_mod($args) { list($a, $b) = $this->assertArgs($args, 2, "mod"); return $this->assertNumber($a) % $this->assertNumber($b); } protected function lib_tan($num) { return tan($this->assertNumber($num)); } protected function lib_sin($num) { return sin($this->assertNumber($num)); } protected function lib_cos($num) { return cos($this->assertNumber($num)); } protected function lib_atan($num) { $num = atan($this->assertNumber($num)); return array("number", $num, "rad"); } protected function lib_asin($num) { $num = asin($this->assertNumber($num)); return array("number", $num, "rad"); } protected function lib_acos($num) { $num = acos($this->assertNumber($num)); return array("number", $num, "rad"); } protected function lib_sqrt($num) { return sqrt($this->assertNumber($num)); } protected function lib_extract($value) { list($list, $idx) = $this->assertArgs($value, 2, "extract"); $idx = $this->assertNumber($idx); // 1 indexed if ($list[0] == "list" && isset($list[2][$idx - 1])) { return $list[2][$idx - 1]; } } protected function lib_isnumber($value) { return $this->toBool($value[0] == "number"); } protected function lib_isstring($value) { return $this->toBool($value[0] == "string"); } protected function lib_iscolor($value) { return $this->toBool($this->coerceColor($value)); } protected function lib_iskeyword($value) { return $this->toBool($value[0] == "keyword"); } protected function lib_ispixel($value) { return $this->toBool($value[0] == "number" && $value[2] == "px"); } protected function lib_ispercentage($value) { return $this->toBool($value[0] == "number" && $value[2] == "%"); } protected function lib_isem($value) { return $this->toBool($value[0] == "number" && $value[2] == "em"); } protected function lib_isrem($value) { return $this->toBool($value[0] == "number" && $value[2] == "rem"); } protected function lib_rgbahex($color) { $color = $this->coerceColor($color); if (is_null($color)) { $this->throwError("color expected for rgbahex"); } return sprintf("#%02x%02x%02x%02x", isset($color[4]) ? $color[4] * 255 : 255, $color[1], $color[2], $color[3] ); } protected function lib_argb($color){ return $this->lib_rgbahex($color); } /** * Given an url, decide whether to output a regular link or the base64-encoded contents of the file * * @param array $value either an argument list (two strings) or a single string * @return string formatted url(), either as a link or base64-encoded */ protected function lib_data_uri($value) { $mime = ($value[0] === 'list') ? $value[2][0][2] : null; $url = ($value[0] === 'list') ? $value[2][1][2][0] : $value[2][0]; $fullpath = $this->findImport($url); if ($fullpath && ($fsize = filesize($fullpath)) !== false) { // IE8 can't handle data uris larger than 32KB if ($fsize/1024 < 32) { if (is_null($mime)) { if (class_exists('finfo')) { // php 5.3+ $finfo = new finfo(FILEINFO_MIME); $mime = explode('; ', $finfo->file($fullpath)); $mime = $mime[0]; } elseif (function_exists('mime_content_type')) { // PHP 5.2 $mime = mime_content_type($fullpath); } } if (!is_null($mime)) // fallback if the mime type is still unknown $url = sprintf('data:%s;base64,%s', $mime, base64_encode(file_get_contents($fullpath))); } } return 'url("'.$url.'")'; } // utility func to unquote a string protected function lib_e($arg) { switch ($arg[0]) { case "list": $items = $arg[2]; if (isset($items[0])) { return $this->lib_e($items[0]); } $this->throwError("unrecognised input"); case "string": $arg[1] = ""; return $arg; case "keyword": return $arg; default: return array("keyword", $this->compileValue($arg)); } } protected function lib__sprintf($args) { if ($args[0] != "list") return $args; $values = $args[2]; $string = array_shift($values); $template = $this->compileValue($this->lib_e($string)); $i = 0; if (preg_match_all('/%[dsa]/', $template, $m)) { foreach ($m[0] as $match) { $val = isset($values[$i]) ? $this->reduce($values[$i]) : array('keyword', ''); // lessjs compat, renders fully expanded color, not raw color if ($color = $this->coerceColor($val)) { $val = $color; } $i++; $rep = $this->compileValue($this->lib_e($val)); $template = preg_replace('/'.self::preg_quote($match).'/', $rep, $template, 1); } } $d = $string[0] == "string" ? $string[1] : '"'; return array("string", $d, array($template)); } protected function lib_floor($arg) { $value = $this->assertNumber($arg); return array("number", floor($value), $arg[2]); } protected function lib_ceil($arg) { $value = $this->assertNumber($arg); return array("number", ceil($value), $arg[2]); } protected function lib_round($arg) { if ($arg[0] != "list") { $value = $this->assertNumber($arg); return array("number", round($value), $arg[2]); } else { $value = $this->assertNumber($arg[2][0]); $precision = $this->assertNumber($arg[2][1]); return array("number", round($value, $precision), $arg[2][0][2]); } } protected function lib_unit($arg) { if ($arg[0] == "list") { list($number, $newUnit) = $arg[2]; return array("number", $this->assertNumber($number), $this->compileValue($this->lib_e($newUnit))); } else { return array("number", $this->assertNumber($arg), ""); } } /** * Helper function to get arguments for color manipulation functions. * takes a list that contains a color like thing and a percentage */ public function colorArgs($args) { if ($args[0] != 'list' || count($args[2]) < 2) { return array(array('color', 0, 0, 0), 0); } list($color, $delta) = $args[2]; $color = $this->assertColor($color); $delta = floatval($delta[1]); return array($color, $delta); } protected function lib_darken($args) { list($color, $delta) = $this->colorArgs($args); $hsl = $this->toHSL($color); $hsl[3] = $this->clamp($hsl[3] - $delta, 100); return $this->toRGB($hsl); } protected function lib_lighten($args) { list($color, $delta) = $this->colorArgs($args); $hsl = $this->toHSL($color); $hsl[3] = $this->clamp($hsl[3] + $delta, 100); return $this->toRGB($hsl); } protected function lib_saturate($args) { list($color, $delta) = $this->colorArgs($args); $hsl = $this->toHSL($color); $hsl[2] = $this->clamp($hsl[2] + $delta, 100); return $this->toRGB($hsl); } protected function lib_desaturate($args) { list($color, $delta) = $this->colorArgs($args); $hsl = $this->toHSL($color); $hsl[2] = $this->clamp($hsl[2] - $delta, 100); return $this->toRGB($hsl); } protected function lib_spin($args) { list($color, $delta) = $this->colorArgs($args); $hsl = $this->toHSL($color); $hsl[1] = $hsl[1] + $delta % 360; if ($hsl[1] < 0) { $hsl[1] += 360; } return $this->toRGB($hsl); } protected function lib_fadeout($args) { list($color, $delta) = $this->colorArgs($args); $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) - $delta/100); return $color; } protected function lib_fadein($args) { list($color, $delta) = $this->colorArgs($args); $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) + $delta/100); return $color; } protected function lib_hue($color) { $hsl = $this->toHSL($this->assertColor($color)); return round($hsl[1]); } protected function lib_saturation($color) { $hsl = $this->toHSL($this->assertColor($color)); return round($hsl[2]); } protected function lib_lightness($color) { $hsl = $this->toHSL($this->assertColor($color)); return round($hsl[3]); } // get the alpha of a color // defaults to 1 for non-colors or colors without an alpha protected function lib_alpha($value) { if (!is_null($color = $this->coerceColor($value))) { return isset($color[4]) ? $color[4] : 1; } } // set the alpha of the color protected function lib_fade($args) { list($color, $alpha) = $this->colorArgs($args); $color[4] = $this->clamp($alpha / 100.0); return $color; } protected function lib_percentage($arg) { $num = $this->assertNumber($arg); return array("number", $num*100, "%"); } /** * Mix color with white in variable proportion. * * It is the same as calling `mix(#ffffff, @color, @weight)`. * * tint(@color, [@weight: 50%]); * * http://lesscss.org/functions/#color-operations-tint * * @return array Color */ protected function lib_tint($args) { $white = array('color', 255, 255, 255); if ($args[0] == 'color') { return $this->lib_mix(array( 'list', ',', array($white, $args) )); } elseif ($args[0] == "list" && count($args[2]) == 2) { return $this->lib_mix(array( $args[0], $args[1], array($white, $args[2][0], $args[2][1]) )); } else { $this->throwError("tint expects (color, weight)"); } } /** * Mix color with black in variable proportion. * * It is the same as calling `mix(#000000, @color, @weight)` * * shade(@color, [@weight: 50%]); * * http://lesscss.org/functions/#color-operations-shade * * @return array Color */ protected function lib_shade($args) { $black = array('color', 0, 0, 0); if ($args[0] == 'color') { return $this->lib_mix(array( 'list', ',', array($black, $args) )); } elseif ($args[0] == "list" && count($args[2]) == 2) { return $this->lib_mix(array( $args[0], $args[1], array($black, $args[2][0], $args[2][1]) )); } else { $this->throwError("shade expects (color, weight)"); } } // mixes two colors by weight // mix(@color1, @color2, [@weight: 50%]); // http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#mix-instance_method protected function lib_mix($args) { if ($args[0] != "list" || count($args[2]) < 2) $this->throwError("mix expects (color1, color2, weight)"); list($first, $second) = $args[2]; $first = $this->assertColor($first); $second = $this->assertColor($second); $first_a = $this->lib_alpha($first); $second_a = $this->lib_alpha($second); if (isset($args[2][2])) { $weight = $args[2][2][1] / 100.0; } else { $weight = 0.5; } $w = $weight * 2 - 1; $a = $first_a - $second_a; $w1 = (($w * $a == -1 ? $w : ($w + $a)/(1 + $w * $a)) + 1) / 2.0; $w2 = 1.0 - $w1; $new = array('color', $w1 * $first[1] + $w2 * $second[1], $w1 * $first[2] + $w2 * $second[2], $w1 * $first[3] + $w2 * $second[3], ); if ($first_a != 1.0 || $second_a != 1.0) { $new[] = $first_a * $weight + $second_a * ($weight - 1); } return $this->fixColor($new); } protected function lib_contrast($args) { $darkColor = array('color', 0, 0, 0); $lightColor = array('color', 255, 255, 255); $threshold = 0.43; if ( $args[0] == 'list' ) { $inputColor = ( isset($args[2][0]) ) ? $this->assertColor($args[2][0]) : $lightColor; $darkColor = ( isset($args[2][1]) ) ? $this->assertColor($args[2][1]) : $darkColor; $lightColor = ( isset($args[2][2]) ) ? $this->assertColor($args[2][2]) : $lightColor; $threshold = ( isset($args[2][3]) ) ? $this->assertNumber($args[2][3]) : $threshold; } else { $inputColor = $this->assertColor($args); } $inputColor = $this->coerceColor($inputColor); $darkColor = $this->coerceColor($darkColor); $lightColor = $this->coerceColor($lightColor); //Figure out which is actually light and dark! if ( $this->toLuma($darkColor) > $this->toLuma($lightColor) ) { $t = $lightColor; $lightColor = $darkColor; $darkColor = $t; } $inputColor_alpha = $this->lib_alpha($inputColor); if ( ( $this->toLuma($inputColor) * $inputColor_alpha) < $threshold) { return $lightColor; } return $darkColor; } private function toLuma($color) { list(, $r, $g, $b) = $this->coerceColor($color); $r = $r / 255; $g = $g / 255; $b = $b / 255; $r = ($r <= 0.03928) ? $r / 12.92 : pow((($r + 0.055) / 1.055), 2.4); $g = ($g <= 0.03928) ? $g / 12.92 : pow((($g + 0.055) / 1.055), 2.4); $b = ($b <= 0.03928) ? $b / 12.92 : pow((($b + 0.055) / 1.055), 2.4); return (0.2126 * $r) + (0.7152 * $g) + (0.0722 * $b); } protected function lib_luma($color) { return array("number", round($this->toLuma($color) * 100, 8), "%"); } public function assertColor($value, $error = "expected color value") { $color = $this->coerceColor($value); if (is_null($color)) $this->throwError($error); return $color; } public function assertNumber($value, $error = "expecting number") { if ($value[0] == "number") return $value[1]; $this->throwError($error); } public function assertArgs($value, $expectedArgs, $name = "") { if ($expectedArgs == 1) { return $value; } else { if ($value[0] !== "list" || $value[1] != ",") $this->throwError("expecting list"); $values = $value[2]; $numValues = count($values); if ($expectedArgs != $numValues) { if ($name) { $name = $name . ": "; } $this->throwError("$name expecting $expectedArgs arguments, got $numValues"); } return $values; } } protected function toHSL($color) { if ($color[0] === 'hsl') { return $color; } $r = $color[1] / 255; $g = $color[2] / 255; $b = $color[3] / 255; $min = min($r, $g, $b); $max = max($r, $g, $b); $L = ($min + $max) / 2; if ($min == $max) { $S = $H = 0; } else { if ($L < 0.5) { $S = ($max - $min) / ($max + $min); } else { $S = ($max - $min) / (2.0 - $max - $min); } if ($r == $max) { $H = ($g - $b) / ($max - $min); } elseif ($g == $max) { $H = 2.0 + ($b - $r) / ($max - $min); } elseif ($b == $max) { $H = 4.0 + ($r - $g) / ($max - $min); } } $out = array('hsl', ($H < 0 ? $H + 6 : $H)*60, $S * 100, $L * 100, ); if (count($color) > 4) { // copy alpha $out[] = $color[4]; } return $out; } protected function toRGB_helper($comp, $temp1, $temp2) { if ($comp < 0) { $comp += 1.0; } elseif ($comp > 1) { $comp -= 1.0; } if (6 * $comp < 1) { return $temp1 + ($temp2 - $temp1) * 6 * $comp; } if (2 * $comp < 1) { return $temp2; } if (3 * $comp < 2) { return $temp1 + ($temp2 - $temp1)*((2/3) - $comp) * 6; } return $temp1; } /** * Converts a hsl array into a color value in rgb. * Expects H to be in range of 0 to 360, S and L in 0 to 100 */ protected function toRGB($color) { if ($color[0] === 'color') { return $color; } $H = $color[1] / 360; $S = $color[2] / 100; $L = $color[3] / 100; if ($S == 0) { $r = $g = $b = $L; } else { $temp2 = $L < 0.5 ? $L * (1.0 + $S) : $L + $S - $L * $S; $temp1 = 2.0 * $L - $temp2; $r = $this->toRGB_helper($H + 1/3, $temp1, $temp2); $g = $this->toRGB_helper($H, $temp1, $temp2); $b = $this->toRGB_helper($H - 1/3, $temp1, $temp2); } // $out = array('color', round($r*255), round($g*255), round($b*255)); $out = array('color', $r*255, $g*255, $b*255); if (count($color) > 4) { // copy alpha $out[] = $color[4]; } return $out; } protected function clamp($v, $max = 1, $min = 0) { return min($max, max($min, $v)); } /** * Convert the rgb, rgba, hsl color literals of function type * as returned by the parser into values of color type. */ protected function funcToColor($func) { $fname = $func[1]; if ($func[2][0] != 'list') { // need a list of arguments return false; } $rawComponents = $func[2][2]; if ($fname == 'hsl' || $fname == 'hsla') { $hsl = array('hsl'); $i = 0; foreach ($rawComponents as $c) { $val = $this->reduce($c); $val = isset($val[1]) ? floatval($val[1]) : 0; if ($i == 0) { $clamp = 360; } elseif ($i < 3) { $clamp = 100; } else { $clamp = 1; } $hsl[] = $this->clamp($val, $clamp); $i++; } while (count($hsl) < 4) { $hsl[] = 0; } return $this->toRGB($hsl); } elseif ($fname == 'rgb' || $fname == 'rgba') { $components = array(); $i = 1; foreach ($rawComponents as $c) { $c = $this->reduce($c); if ($i < 4) { if ($c[0] == "number" && $c[2] == "%") { $components[] = 255 * ($c[1] / 100); } else { $components[] = floatval($c[1]); } } elseif ($i == 4) { if ($c[0] == "number" && $c[2] == "%") { $components[] = 1.0 * ($c[1] / 100); } else { $components[] = floatval($c[1]); } } else break; $i++; } while (count($components) < 3) { $components[] = 0; } array_unshift($components, 'color'); return $this->fixColor($components); } return false; } protected function reduce($value, $forExpression = false) { switch ($value[0]) { case "interpolate": $reduced = $this->reduce($value[1]); $var = $this->compileValue($reduced); $res = $this->reduce(array("variable", $this->vPrefix . $var)); if ($res[0] == "raw_color") { $res = $this->coerceColor($res); } if (empty($value[2])) $res = $this->lib_e($res); return $res; case "variable": $key = $value[1]; if (is_array($key)) { $key = $this->reduce($key); $key = $this->vPrefix . $this->compileValue($this->lib_e($key)); } $seen =& $this->env->seenNames; if (!empty($seen[$key])) { $this->throwError("infinite loop detected: $key"); } $seen[$key] = true; $out = $this->reduce($this->get($key)); $seen[$key] = false; return $out; case "list": foreach ($value[2] as &$item) { $item = $this->reduce($item, $forExpression); } return $value; case "expression": return $this->evaluate($value); case "string": foreach ($value[2] as &$part) { if (is_array($part)) { $strip = $part[0] == "variable"; $part = $this->reduce($part); if ($strip) $part = $this->lib_e($part); } } return $value; case "escape": list(,$inner) = $value; return $this->lib_e($this->reduce($inner)); case "function": $color = $this->funcToColor($value); if ($color) return $color; list(, $name, $args) = $value; if ($name == "%") $name = "_sprintf"; $f = isset($this->libFunctions[$name]) ? $this->libFunctions[$name] : array($this, 'lib_'.str_replace('-', '_', $name)); if (is_callable($f)) { if ($args[0] == 'list') $args = self::compressList($args[2], $args[1]); $ret = call_user_func($f, $this->reduce($args, true), $this); if (is_null($ret)) { return array("string", "", array( $name, "(", $args, ")" )); } // convert to a typed value if the result is a php primitive if (is_numeric($ret)) { $ret = array('number', $ret, ""); } elseif (!is_array($ret)) { $ret = array('keyword', $ret); } return $ret; } // plain function, reduce args $value[2] = $this->reduce($value[2]); return $value; case "unary": list(, $op, $exp) = $value; $exp = $this->reduce($exp); if ($exp[0] == "number") { switch ($op) { case "+": return $exp; case "-": $exp[1] *= -1; return $exp; } } return array("string", "", array($op, $exp)); } if ($forExpression) { switch ($value[0]) { case "keyword": if ($color = $this->coerceColor($value)) { return $color; } break; case "raw_color": return $this->coerceColor($value); } } return $value; } // coerce a value for use in color operation protected function coerceColor($value) { switch ($value[0]) { case 'color': return $value; case 'raw_color': $c = array("color", 0, 0, 0); $colorStr = substr($value[1], 1); $num = hexdec($colorStr); $width = strlen($colorStr) == 3 ? 16 : 256; for ($i = 3; $i > 0; $i--) { // 3 2 1 $t = floor($num) % floor($width); $num /= $width; $c[$i] = $t * (256/$width) + $t * floor(16/$width); } return $c; case 'keyword': $name = $value[1]; if (isset(self::$cssColors[$name])) { $rgba = explode(',', self::$cssColors[$name]); if (isset($rgba[3])) { return array('color', $rgba[0], $rgba[1], $rgba[2], $rgba[3]); } return array('color', $rgba[0], $rgba[1], $rgba[2]); } return null; } } // make something string like into a string protected function coerceString($value) { switch ($value[0]) { case "string": return $value; case "keyword": return array("string", "", array($value[1])); } return null; } // turn list of length 1 into value type protected function flattenList($value) { if ($value[0] == "list" && count($value[2]) == 1) { return $this->flattenList($value[2][0]); } return $value; } public function toBool($a) { return $a ? self::$TRUE : self::$FALSE; } // evaluate an expression protected function evaluate($exp) { list(, $op, $left, $right, $whiteBefore, $whiteAfter) = $exp; $left = $this->reduce($left, true); $right = $this->reduce($right, true); if ($leftColor = $this->coerceColor($left)) { $left = $leftColor; } if ($rightColor = $this->coerceColor($right)) { $right = $rightColor; } $ltype = $left[0]; $rtype = $right[0]; // operators that work on all types if ($op == "and") { return $this->toBool($left == self::$TRUE && $right == self::$TRUE); } if ($op == "=") { return $this->toBool($this->eq($left, $right) ); } if ($op == "+" && !is_null($str = $this->stringConcatenate($left, $right))) { return $str; } // type based operators $fname = "op_".$ltype."_".$rtype; if (is_callable(array($this, $fname))) { $out = $this->$fname($op, $left, $right); if (!is_null($out)) return $out; } // make the expression look it did before being parsed $paddedOp = $op; if ($whiteBefore) { $paddedOp = " " . $paddedOp; } if ($whiteAfter) { $paddedOp .= " "; } return array("string", "", array($left, $paddedOp, $right)); } protected function stringConcatenate($left, $right) { if ($strLeft = $this->coerceString($left)) { if ($right[0] == "string") { $right[1] = ""; } $strLeft[2][] = $right; return $strLeft; } if ($strRight = $this->coerceString($right)) { array_unshift($strRight[2], $left); return $strRight; } } // make sure a color's components don't go out of bounds protected function fixColor($c) { foreach (range(1, 3) as $i) { if ($c[$i] < 0) $c[$i] = 0; if ($c[$i] > 255) $c[$i] = 255; } return $c; } protected function op_number_color($op, $lft, $rgt) { if ($op == '+' || $op == '*') { return $this->op_color_number($op, $rgt, $lft); } } protected function op_color_number($op, $lft, $rgt) { if ($rgt[0] == '%') $rgt[1] /= 100; return $this->op_color_color($op, $lft, array_fill(1, count($lft) - 1, $rgt[1])); } protected function op_color_color($op, $left, $right) { $out = array('color'); $max = count($left) > count($right) ? count($left) : count($right); foreach (range(1, $max - 1) as $i) { $lval = isset($left[$i]) ? $left[$i] : 0; $rval = isset($right[$i]) ? $right[$i] : 0; switch ($op) { case '+': $out[] = $lval + $rval; break; case '-': $out[] = $lval - $rval; break; case '*': $out[] = $lval * $rval; break; case '%': $out[] = $lval % $rval; break; case '/': if ($rval == 0) { $this->throwError("evaluate error: can't divide by zero"); } $out[] = $lval / $rval; break; default: $this->throwError('evaluate error: color op number failed on op '.$op); } } return $this->fixColor($out); } public function lib_red($color){ $color = $this->coerceColor($color); if (is_null($color)) { $this->throwError('color expected for red()'); } return $color[1]; } public function lib_green($color){ $color = $this->coerceColor($color); if (is_null($color)) { $this->throwError('color expected for green()'); } return $color[2]; } public function lib_blue($color){ $color = $this->coerceColor($color); if (is_null($color)) { $this->throwError('color expected for blue()'); } return $color[3]; } // operator on two numbers protected function op_number_number($op, $left, $right) { $unit = empty($left[2]) ? $right[2] : $left[2]; $value = 0; switch ($op) { case '+': $value = $left[1] + $right[1]; break; case '*': $value = $left[1] * $right[1]; break; case '-': $value = $left[1] - $right[1]; break; case '%': $value = $left[1] % $right[1]; break; case '/': if ($right[1] == 0) $this->throwError('parse error: divide by zero'); $value = $left[1] / $right[1]; break; case '<': return $this->toBool($left[1] < $right[1]); case '>': return $this->toBool($left[1] > $right[1]); case '>=': return $this->toBool($left[1] >= $right[1]); case '=<': return $this->toBool($left[1] <= $right[1]); default: $this->throwError('parse error: unknown number operator: '.$op); } return array("number", $value, $unit); } /* environment functions */ protected function makeOutputBlock($type, $selectors = null) { $b = new stdclass; $b->lines = array(); $b->children = array(); $b->selectors = $selectors; $b->type = $type; $b->parent = $this->scope; return $b; } // the state of execution protected function pushEnv($block = null) { $e = new stdclass; $e->parent = $this->env; $e->store = array(); $e->block = $block; $this->env = $e; return $e; } // pop something off the stack protected function popEnv() { $old = $this->env; $this->env = $this->env->parent; return $old; } // set something in the current env protected function set($name, $value) { $this->env->store[$name] = $value; } // get the highest occurrence entry for a name protected function get($name) { $current = $this->env; $isArguments = $name == $this->vPrefix . 'arguments'; while ($current) { if ($isArguments && isset($current->arguments)) { return array('list', ' ', $current->arguments); } if (isset($current->store[$name])) { return $current->store[$name]; } $current = isset($current->storeParent) ? $current->storeParent : $current->parent; } $this->throwError("variable $name is undefined"); } // inject array of unparsed strings into environment as variables protected function injectVariables($args) { $this->pushEnv(); $parser = new helix3_lessc_parser($this, __METHOD__); foreach ($args as $name => $strValue) { if ($name[0] !== '@') { $name = '@' . $name; } $parser->count = 0; $parser->buffer = (string)$strValue; if (!$parser->propertyValue($value)) { throw new Exception("failed to parse passed in variable $name: $strValue"); } $this->set($name, $value); } } /** * Initialize any static state, can initialize parser for a file * $opts isn't used yet */ public function __construct($fname = null) { if ($fname !== null) { // used for deprecated parse method $this->_parseFile = $fname; } } public function compile($string, $name = null) { $locale = setlocale(LC_NUMERIC, 0); setlocale(LC_NUMERIC, "C"); $this->parser = $this->makeParser($name); $root = $this->parser->parse($string); $this->env = null; $this->scope = null; $this->formatter = $this->newFormatter(); if (!empty($this->registeredVars)) { $this->injectVariables($this->registeredVars); } $this->sourceParser = $this->parser; // used for error messages $this->compileBlock($root); ob_start(); $this->formatter->block($this->scope); $out = ob_get_clean(); setlocale(LC_NUMERIC, $locale); return $out; } public function compileFile($fname, $outFname = null) { if (!is_readable($fname)) { throw new Exception('load error: failed to find '.$fname); } $pi = pathinfo($fname); $oldImport = $this->importDir; $this->importDir = (array)$this->importDir; $this->importDir[] = $pi['dirname'].'/'; $this->addParsedFile($fname); $out = $this->compile(file_get_contents($fname), $fname); $this->importDir = $oldImport; if ($outFname !== null) { return file_put_contents($outFname, $out); } return $out; } // compile only if changed input has changed or output doesn't exist public function checkedCompile($in, $out) { if (!is_file($out) || filemtime($in) > filemtime($out)) { $this->compileFile($in, $out); return true; } return false; } /** * Execute lessphp on a .less file or a lessphp cache structure * * The lessphp cache structure contains information about a specific * less file having been parsed. It can be used as a hint for future * calls to determine whether or not a rebuild is required. * * The cache structure contains two important keys that may be used * externally: * * compiled: The final compiled CSS * updated: The time (in seconds) the CSS was last compiled * * The cache structure is a plain-ol' PHP associative array and can * be serialized and unserialized without a hitch. * * @param mixed $in Input * @param bool $force Force rebuild? * @return array lessphp cache structure */ public function cachedCompile($in, $force = false) { // assume no root $root = null; if (is_string($in)) { $root = $in; } elseif (is_array($in) && isset($in['root'])) { if ($force || !isset($in['files'])) { // If we are forcing a recompile or if for some reason the // structure does not contain any file information we should // specify the root to trigger a rebuild. $root = $in['root']; } elseif (isset($in['files']) && is_array($in['files'])) { foreach ($in['files'] as $fname => $ftime) { if (!file_exists($fname) || filemtime($fname) > $ftime) { // One of the files we knew about previously has changed // so we should look at our incoming root again. $root = $in['root']; break; } } } } else { // TODO: Throw an exception? We got neither a string nor something // that looks like a compatible lessphp cache structure. return null; } if ($root !== null) { // If we have a root value which means we should rebuild. $out = array(); $out['root'] = $root; $out['compiled'] = $this->compileFile($root); $out['files'] = $this->allParsedFiles(); $out['updated'] = time(); return $out; } else { // No changes, pass back the structure // we were given initially. return $in; } } // parse and compile buffer // This is deprecated public function parse($str = null, $initialVariables = null) { if (is_array($str)) { $initialVariables = $str; $str = null; } $oldVars = $this->registeredVars; if ($initialVariables !== null) { $this->setVariables($initialVariables); } if ($str == null) { if (empty($this->_parseFile)) { throw new exception("nothing to parse"); } $out = $this->compileFile($this->_parseFile); } else { $out = $this->compile($str); } $this->registeredVars = $oldVars; return $out; } protected function makeParser($name) { $parser = new helix3_lessc_parser($this, $name); $parser->writeComments = $this->preserveComments; return $parser; } public function setFormatter($name) { $this->formatterName = $name; } protected function newFormatter() { $className = "helix3_lessc_formatter_lessjs"; if (!empty($this->formatterName)) { if (!is_string($this->formatterName)) return $this->formatterName; $className = "helix3_lessc_formatter_$this->formatterName"; } return new $className; } public function setPreserveComments($preserve) { $this->preserveComments = $preserve; } public function registerFunction($name, $func) { $this->libFunctions[$name] = $func; } public function unregisterFunction($name) { unset($this->libFunctions[$name]); } public function setVariables($variables) { $this->registeredVars = array_merge($this->registeredVars, $variables); } public function unsetVariable($name) { unset($this->registeredVars[$name]); } public function setImportDir($dirs) { $this->importDir = (array)$dirs; } public function addImportDir($dir) { $this->importDir = (array)$this->importDir; $this->importDir[] = $dir; } public function allParsedFiles() { return $this->allParsedFiles; } public function addParsedFile($file) { $this->allParsedFiles[realpath($file)] = filemtime($file); } /** * Uses the current value of $this->count to show line and line number */ public function throwError($msg = null) { if ($this->sourceLoc >= 0) { $this->sourceParser->throwError($msg, $this->sourceLoc); } throw new exception($msg); } // compile file $in to file $out if $in is newer than $out // returns true when it compiles, false otherwise public static function ccompile($in, $out, $less = null) { if ($less === null) { $less = new self; } return $less->checkedCompile($in, $out); } public static function cexecute($in, $force = false, $less = null) { if ($less === null) { $less = new self; } return $less->cachedCompile($in, $force); } protected static $cssColors = array( 'aliceblue' => '240,248,255', 'antiquewhite' => '250,235,215', 'aqua' => '0,255,255', 'aquamarine' => '127,255,212', 'azure' => '240,255,255', 'beige' => '245,245,220', 'bisque' => '255,228,196', 'black' => '0,0,0', 'blanchedalmond' => '255,235,205', 'blue' => '0,0,255', 'blueviolet' => '138,43,226', 'brown' => '165,42,42', 'burlywood' => '222,184,135', 'cadetblue' => '95,158,160', 'chartreuse' => '127,255,0', 'chocolate' => '210,105,30', 'coral' => '255,127,80', 'cornflowerblue' => '100,149,237', 'cornsilk' => '255,248,220', 'crimson' => '220,20,60', 'cyan' => '0,255,255', 'darkblue' => '0,0,139', 'darkcyan' => '0,139,139', 'darkgoldenrod' => '184,134,11', 'darkgray' => '169,169,169', 'darkgreen' => '0,100,0', 'darkgrey' => '169,169,169', 'darkkhaki' => '189,183,107', 'darkmagenta' => '139,0,139', 'darkolivegreen' => '85,107,47', 'darkorange' => '255,140,0', 'darkorchid' => '153,50,204', 'darkred' => '139,0,0', 'darksalmon' => '233,150,122', 'darkseagreen' => '143,188,143', 'darkslateblue' => '72,61,139', 'darkslategray' => '47,79,79', 'darkslategrey' => '47,79,79', 'darkturquoise' => '0,206,209', 'darkviolet' => '148,0,211', 'deeppink' => '255,20,147', 'deepskyblue' => '0,191,255', 'dimgray' => '105,105,105', 'dimgrey' => '105,105,105', 'dodgerblue' => '30,144,255', 'firebrick' => '178,34,34', 'floralwhite' => '255,250,240', 'forestgreen' => '34,139,34', 'fuchsia' => '255,0,255', 'gainsboro' => '220,220,220', 'ghostwhite' => '248,248,255', 'gold' => '255,215,0', 'goldenrod' => '218,165,32', 'gray' => '128,128,128', 'green' => '0,128,0', 'greenyellow' => '173,255,47', 'grey' => '128,128,128', 'honeydew' => '240,255,240', 'hotpink' => '255,105,180', 'indianred' => '205,92,92', 'indigo' => '75,0,130', 'ivory' => '255,255,240', 'khaki' => '240,230,140', 'lavender' => '230,230,250', 'lavenderblush' => '255,240,245', 'lawngreen' => '124,252,0', 'lemonchiffon' => '255,250,205', 'lightblue' => '173,216,230', 'lightcoral' => '240,128,128', 'lightcyan' => '224,255,255', 'lightgoldenrodyellow' => '250,250,210', 'lightgray' => '211,211,211', 'lightgreen' => '144,238,144', 'lightgrey' => '211,211,211', 'lightpink' => '255,182,193', 'lightsalmon' => '255,160,122', 'lightseagreen' => '32,178,170', 'lightskyblue' => '135,206,250', 'lightslategray' => '119,136,153', 'lightslategrey' => '119,136,153', 'lightsteelblue' => '176,196,222', 'lightyellow' => '255,255,224', 'lime' => '0,255,0', 'limegreen' => '50,205,50', 'linen' => '250,240,230', 'magenta' => '255,0,255', 'maroon' => '128,0,0', 'mediumaquamarine' => '102,205,170', 'mediumblue' => '0,0,205', 'mediumorchid' => '186,85,211', 'mediumpurple' => '147,112,219', 'mediumseagreen' => '60,179,113', 'mediumslateblue' => '123,104,238', 'mediumspringgreen' => '0,250,154', 'mediumturquoise' => '72,209,204', 'mediumvioletred' => '199,21,133', 'midnightblue' => '25,25,112', 'mintcream' => '245,255,250', 'mistyrose' => '255,228,225', 'moccasin' => '255,228,181', 'navajowhite' => '255,222,173', 'navy' => '0,0,128', 'oldlace' => '253,245,230', 'olive' => '128,128,0', 'olivedrab' => '107,142,35', 'orange' => '255,165,0', 'orangered' => '255,69,0', 'orchid' => '218,112,214', 'palegoldenrod' => '238,232,170', 'palegreen' => '152,251,152', 'paleturquoise' => '175,238,238', 'palevioletred' => '219,112,147', 'papayawhip' => '255,239,213', 'peachpuff' => '255,218,185', 'peru' => '205,133,63', 'pink' => '255,192,203', 'plum' => '221,160,221', 'powderblue' => '176,224,230', 'purple' => '128,0,128', 'red' => '255,0,0', 'rosybrown' => '188,143,143', 'royalblue' => '65,105,225', 'saddlebrown' => '139,69,19', 'salmon' => '250,128,114', 'sandybrown' => '244,164,96', 'seagreen' => '46,139,87', 'seashell' => '255,245,238', 'sienna' => '160,82,45', 'silver' => '192,192,192', 'skyblue' => '135,206,235', 'slateblue' => '106,90,205', 'slategray' => '112,128,144', 'slategrey' => '112,128,144', 'snow' => '255,250,250', 'springgreen' => '0,255,127', 'steelblue' => '70,130,180', 'tan' => '210,180,140', 'teal' => '0,128,128', 'thistle' => '216,191,216', 'tomato' => '255,99,71', 'transparent' => '0,0,0,0', 'turquoise' => '64,224,208', 'violet' => '238,130,238', 'wheat' => '245,222,179', 'white' => '255,255,255', 'whitesmoke' => '245,245,245', 'yellow' => '255,255,0', 'yellowgreen' => '154,205,50' ); } // responsible for taking a string of LESS code and converting it into a // syntax tree class helix3_lessc_parser { protected static $nextBlockId = 0; // used to uniquely identify blocks protected static $precedence = array( '=<' => 0, '>=' => 0, '=' => 0, '<' => 0, '>' => 0, '+' => 1, '-' => 1, '*' => 2, '/' => 2, '%' => 2, ); protected static $whitePattern; protected static $commentMulti; protected static $commentSingle = "//"; protected static $commentMultiLeft = "/*"; protected static $commentMultiRight = "*/"; // regex string to match any of the operators protected static $operatorString; // these properties will supress division unless it's inside parenthases protected static $supressDivisionProps = array('/border-radius$/i', '/^font$/i'); protected $blockDirectives = array("font-face", "keyframes", "page", "-moz-document", "viewport", "-moz-viewport", "-o-viewport", "-ms-viewport"); protected $lineDirectives = array("charset"); /** * if we are in parens we can be more liberal with whitespace around * operators because it must evaluate to a single value and thus is less * ambiguous. * * Consider: * property1: 10 -5; // is two numbers, 10 and -5 * property2: (10 -5); // should evaluate to 5 */ protected $inParens = false; // caches preg escaped literals protected static $literalCache = array(); public $eatWhiteDefault; public $lessc; public $sourceName; public $writeComments; public $inExp; public $indentLevel; public function __construct($lessc, $sourceName = null) { $this->eatWhiteDefault = true; // reference to less needed for vPrefix, mPrefix, and parentSelector $this->lessc = $lessc; $this->sourceName = $sourceName; // name used for error messages $this->writeComments = false; if (!self::$operatorString) { self::$operatorString = '('.implode('|', array_map(array('helix3_lessc', 'preg_quote'), array_keys(self::$precedence))).')'; $commentSingle = helix3_lessc::preg_quote(self::$commentSingle); $commentMultiLeft = helix3_lessc::preg_quote(self::$commentMultiLeft); $commentMultiRight = helix3_lessc::preg_quote(self::$commentMultiRight); self::$commentMulti = $commentMultiLeft.'.*?'.$commentMultiRight; self::$whitePattern = '/'.$commentSingle.'[^\n]*\s*|('.self::$commentMulti.')\s*|\s+/Ais'; } } public $count; public $line; public $env; public $buffer; public $seenComments; public function parse($buffer) { $this->count = 0; $this->line = 1; $this->env = null; // block stack $this->buffer = $this->writeComments ? $buffer : $this->removeComments($buffer); $this->pushSpecialBlock("root"); $this->eatWhiteDefault = true; $this->seenComments = array(); // trim whitespace on head // if (preg_match('/^\s+/', $this->buffer, $m)) { // $this->line += substr_count($m[0], "\n"); // $this->buffer = ltrim($this->buffer); // } $this->whitespace(); // parse the entire file while (false !== $this->parseChunk()); if ($this->count != strlen($this->buffer)) $this->throwError(); // TODO report where the block was opened if ( !property_exists($this->env, 'parent') || !is_null($this->env->parent) ) throw new exception('parse error: unclosed block'); return $this->env; } /** * Parse a single chunk off the head of the buffer and append it to the * current parse environment. * Returns false when the buffer is empty, or when there is an error. * * This function is called repeatedly until the entire document is * parsed. * * This parser is most similar to a recursive descent parser. Single * functions represent discrete grammatical rules for the language, and * they are able to capture the text that represents those rules. * * Consider the function helix3_lessc::keyword(). (all parse functions are * structured the same) * * The function takes a single reference argument. When calling the * function it will attempt to match a keyword on the head of the buffer. * If it is successful, it will place the keyword in the referenced * argument, advance the position in the buffer, and return true. If it * fails then it won't advance the buffer and it will return false. * * All of these parse functions are powered by helix3_lessc::match(), which behaves * the same way, but takes a literal regular expression. Sometimes it is * more convenient to use match instead of creating a new function. * * Because of the format of the functions, to parse an entire string of * grammatical rules, you can chain them together using &&. * * But, if some of the rules in the chain succeed before one fails, then * the buffer position will be left at an invalid state. In order to * avoid this, helix3_lessc::seek() is used to remember and set buffer positions. * * Before parsing a chain, use $s = $this->seek() to remember the current * position into $s. Then if a chain fails, use $this->seek($s) to * go back where we started. */ protected function parseChunk() { if (empty($this->buffer)) return false; $s = $this->seek(); if ($this->whitespace()) { return true; } // setting a property if ($this->keyword($key) && $this->assign() && $this->propertyValue($value, $key) && $this->end() ) { $this->append(array('assign', $key, $value), $s); return true; } else { $this->seek($s); } // look for special css blocks if ($this->literal('@', false)) { $this->count--; // media if ($this->literal('@media')) { if (($this->mediaQueryList($mediaQueries) || true) && $this->literal('{') ) { $media = $this->pushSpecialBlock("media"); $media->queries = is_null($mediaQueries) ? array() : $mediaQueries; return true; } else { $this->seek($s); return false; } } if ($this->literal("@", false) && $this->keyword($dirName)) { if ($this->isDirective($dirName, $this->blockDirectives)) { if (($this->openString("{", $dirValue, null, array(";")) || true) && $this->literal("{") ) { $dir = $this->pushSpecialBlock("directive"); $dir->name = $dirName; if (isset($dirValue)) $dir->value = $dirValue; return true; } } elseif ($this->isDirective($dirName, $this->lineDirectives)) { if ($this->propertyValue($dirValue) && $this->end()) { $this->append(array("directive", $dirName, $dirValue)); return true; } } } $this->seek($s); } // setting a variable if ($this->variable($var) && $this->assign() && $this->propertyValue($value) && $this->end() ) { $this->append(array('assign', $var, $value), $s); return true; } else { $this->seek($s); } if ($this->import($importValue)) { $this->append($importValue, $s); return true; } // opening parametric mixin if ($this->tag($tag, true) && $this->argumentDef($args, $isVararg) && ($this->guards($guards) || true) && $this->literal('{') ) { $block = $this->pushBlock($this->fixTags(array($tag))); $block->args = $args; $block->isVararg = $isVararg; if (!empty($guards)) $block->guards = $guards; return true; } else { $this->seek($s); } // opening a simple block if ($this->tags($tags) && $this->literal('{', false)) { $tags = $this->fixTags($tags); $this->pushBlock($tags); return true; } else { $this->seek($s); } // closing a block if ($this->literal('}', false)) { try { $block = $this->pop(); } catch (exception $e) { $this->seek($s); $this->throwError($e->getMessage()); } $hidden = false; if (is_null($block->type)) { $hidden = true; if (!isset($block->args)) { foreach ($block->tags as $tag) { if (!is_string($tag) || $tag[0] != $this->lessc->mPrefix) { $hidden = false; break; } } } foreach ($block->tags as $tag) { if (is_string($tag)) { $this->env->children[$tag][] = $block; } } } if (!$hidden) { $this->append(array('block', $block), $s); } // this is done here so comments aren't bundled into he block that // was just closed $this->whitespace(); return true; } // mixin if ($this->mixinTags($tags) && ($this->argumentDef($argv, $isVararg) || true) && ($this->keyword($suffix) || true) && $this->end() ) { $tags = $this->fixTags($tags); $this->append(array('mixin', $tags, $argv, $suffix), $s); return true; } else { $this->seek($s); } // spare ; if ($this->literal(';')) return true; return false; // got nothing, throw error } protected function isDirective($dirname, $directives) { // TODO: cache pattern in parser $pattern = implode("|", array_map(array("helix3_lessc", "preg_quote"), $directives)); $pattern = '/^(-[a-z-]+-)?(' . $pattern . ')$/i'; return preg_match($pattern, $dirname); } protected function fixTags($tags) { // move @ tags out of variable namespace foreach ($tags as &$tag) { if ($tag[0] == $this->lessc->vPrefix) $tag[0] = $this->lessc->mPrefix; } return $tags; } // a list of expressions protected function expressionList(&$exps) { $values = array(); while ($this->expression($exp)) { $values[] = $exp; } if (count($values) == 0) return false; $exps = helix3_lessc::compressList($values, ' '); return true; } /** * Attempt to consume an expression. * @link http://en.wikipedia.org/wiki/Operator-precedence_parser#Pseudo-code */ protected function expression(&$out) { if ($this->value($lhs)) { $out = $this->expHelper($lhs, 0); // look for / shorthand if (!empty($this->env->supressedDivision)) { unset($this->env->supressedDivision); $s = $this->seek(); if ($this->literal("/") && $this->value($rhs)) { $out = array("list", "", array($out, array("keyword", "/"), $rhs)); } else { $this->seek($s); } } return true; } return false; } /** * recursively parse infix equation with $lhs at precedence $minP */ protected function expHelper($lhs, $minP) { $this->inExp = true; $ss = $this->seek(); while (true) { $whiteBefore = isset($this->buffer[$this->count - 1]) && ctype_space($this->buffer[$this->count - 1]); // If there is whitespace before the operator, then we require // whitespace after the operator for it to be an expression $needWhite = $whiteBefore && !$this->inParens; if ($this->match(self::$operatorString.($needWhite ? '\s' : ''), $m) && self::$precedence[$m[1]] >= $minP) { if (!$this->inParens && isset($this->env->currentProperty) && $m[1] == "/" && empty($this->env->supressedDivision)) { foreach (self::$supressDivisionProps as $pattern) { if (preg_match($pattern, $this->env->currentProperty)) { $this->env->supressedDivision = true; break 2; } } } $whiteAfter = isset($this->buffer[$this->count - 1]) && ctype_space($this->buffer[$this->count - 1]); if (!$this->value($rhs)) break; // peek for next operator to see what to do with rhs if ($this->peek(self::$operatorString, $next) && self::$precedence[$next[1]] > self::$precedence[$m[1]]) { $rhs = $this->expHelper($rhs, self::$precedence[$next[1]]); } $lhs = array('expression', $m[1], $lhs, $rhs, $whiteBefore, $whiteAfter); $ss = $this->seek(); continue; } break; } $this->seek($ss); return $lhs; } // consume a list of values for a property public function propertyValue(&$value, $keyName = null) { $values = array(); if ($keyName !== null) $this->env->currentProperty = $keyName; $s = null; while ($this->expressionList($v)) { $values[] = $v; $s = $this->seek(); if (!$this->literal(',')) break; } if ($s) $this->seek($s); if ($keyName !== null) unset($this->env->currentProperty); if (count($values) == 0) return false; $value = helix3_lessc::compressList($values, ', '); return true; } protected function parenValue(&$out) { $s = $this->seek(); // speed shortcut if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "(") { return false; } $inParens = $this->inParens; if ($this->literal("(") && ($this->inParens = true) && $this->expression($exp) && $this->literal(")") ) { $out = $exp; $this->inParens = $inParens; return true; } else { $this->inParens = $inParens; $this->seek($s); } return false; } // a single value protected function value(&$value) { $s = $this->seek(); // speed shortcut if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "-") { // negation if ($this->literal("-", false) && (($this->variable($inner) && $inner = array("variable", $inner)) || $this->unit($inner) || $this->parenValue($inner)) ) { $value = array("unary", "-", $inner); return true; } else { $this->seek($s); } } if ($this->parenValue($value)) return true; if ($this->unit($value)) return true; if ($this->color($value)) return true; if ($this->func($value)) return true; if ($this->string($value)) return true; if ($this->keyword($word)) { $value = array('keyword', $word); return true; } // try a variable if ($this->variable($var)) { $value = array('variable', $var); return true; } // unquote string (should this work on any type? if ($this->literal("~") && $this->string($str)) { $value = array("escape", $str); return true; } else { $this->seek($s); } // css hack: \0 if ($this->literal('\\') && $this->match('([0-9]+)', $m)) { $value = array('keyword', '\\'.$m[1]); return true; } else { $this->seek($s); } return false; } // an import statement protected function import(&$out) { if (!$this->literal('@import')) return false; // @import "something.css" media; // @import url("something.css") media; // @import url(something.css) media; if ($this->propertyValue($value)) { $out = array("import", $value); return true; } } protected function mediaQueryList(&$out) { if ($this->genericList($list, "mediaQuery", ",", false)) { $out = $list[2]; return true; } return false; } protected function mediaQuery(&$out) { $s = $this->seek(); $expressions = null; $parts = array(); if (($this->literal("only") && ($only = true) || $this->literal("not") && ($not = true) || true) && $this->keyword($mediaType)) { $prop = array("mediaType"); if (isset($only)) $prop[] = "only"; if (isset($not)) $prop[] = "not"; $prop[] = $mediaType; $parts[] = $prop; } else { $this->seek($s); } if (!empty($mediaType) && !$this->literal("and")) { // ~ } else { $this->genericList($expressions, "mediaExpression", "and", false); if (is_array($expressions)) $parts = array_merge($parts, $expressions[2]); } if (count($parts) == 0) { $this->seek($s); return false; } $out = $parts; return true; } protected function mediaExpression(&$out) { $s = $this->seek(); $value = null; if ($this->literal("(") && $this->keyword($feature) && ($this->literal(":") && $this->expression($value) || true) && $this->literal(")") ) { $out = array("mediaExp", $feature); if ($value) $out[] = $value; return true; } elseif ($this->variable($variable)) { $out = array('variable', $variable); return true; } $this->seek($s); return false; } // an unbounded string stopped by $end protected function openString($end, &$out, $nestingOpen = null, $rejectStrs = null) { $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = false; $stop = array("'", '"', "@{", $end); $stop = array_map(array("helix3_lessc", "preg_quote"), $stop); // $stop[] = self::$commentMulti; if (!is_null($rejectStrs)) { $stop = array_merge($stop, $rejectStrs); } $patt = '(.*?)('.implode("|", $stop).')'; $nestingLevel = 0; $content = array(); while ($this->match($patt, $m, false)) { if (!empty($m[1])) { $content[] = $m[1]; if ($nestingOpen) { $nestingLevel += substr_count($m[1], $nestingOpen); } } $tok = $m[2]; $this->count-= strlen($tok); if ($tok == $end) { if ($nestingLevel == 0) { break; } else { $nestingLevel--; } } if (($tok == "'" || $tok == '"') && $this->string($str)) { $content[] = $str; continue; } if ($tok == "@{" && $this->interpolation($inter)) { $content[] = $inter; continue; } if (!empty($rejectStrs) && in_array($tok, $rejectStrs)) { break; } $content[] = $tok; $this->count+= strlen($tok); } $this->eatWhiteDefault = $oldWhite; if (count($content) == 0) return false; // trim the end if (is_string(end($content))) { $content[count($content) - 1] = rtrim(end($content)); } $out = array("string", "", $content); return true; } protected function string(&$out) { $s = $this->seek(); if ($this->literal('"', false)) { $delim = '"'; } elseif ($this->literal("'", false)) { $delim = "'"; } else { return false; } $content = array(); // look for either ending delim , escape, or string interpolation $patt = '([^\n]*?)(@\{|\\\\|' . helix3_lessc::preg_quote($delim).')'; $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = false; while ($this->match($patt, $m, false)) { $content[] = $m[1]; if ($m[2] == "@{") { $this->count -= strlen($m[2]); if ($this->interpolation($inter, false)) { $content[] = $inter; } else { $this->count += strlen($m[2]); $content[] = "@{"; // ignore it } } elseif ($m[2] == '\\') { $content[] = $m[2]; if ($this->literal($delim, false)) { $content[] = $delim; } } else { $this->count -= strlen($delim); break; // delim } } $this->eatWhiteDefault = $oldWhite; if ($this->literal($delim)) { $out = array("string", $delim, $content); return true; } $this->seek($s); return false; } protected function interpolation(&$out) { $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = true; $s = $this->seek(); if ($this->literal("@{") && $this->openString("}", $interp, null, array("'", '"', ";")) && $this->literal("}", false) ) { $out = array("interpolate", $interp); $this->eatWhiteDefault = $oldWhite; if ($this->eatWhiteDefault) $this->whitespace(); return true; } $this->eatWhiteDefault = $oldWhite; $this->seek($s); return false; } protected function unit(&$unit) { // speed shortcut if (isset($this->buffer[$this->count])) { $char = $this->buffer[$this->count]; if (!ctype_digit($char) && $char != ".") return false; } if ($this->match('([0-9]+(?:\.[0-9]*)?|\.[0-9]+)([%a-zA-Z]+)?', $m)) { $unit = array("number", $m[1], empty($m[2]) ? "" : $m[2]); return true; } return false; } // a # color protected function color(&$out) { if ($this->match('(#(?:[0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{3}))', $m)) { if (strlen($m[1]) > 7) { $out = array("string", "", array($m[1])); } else { $out = array("raw_color", $m[1]); } return true; } return false; } // consume an argument definition list surrounded by () // each argument is a variable name with optional value // or at the end a ... or a variable named followed by ... // arguments are separated by , unless a ; is in the list, then ; is the // delimiter. protected function argumentDef(&$args, &$isVararg) { $s = $this->seek(); if (!$this->literal('(')) { return false; } $values = array(); $delim = ","; $method = "expressionList"; $isVararg = false; while (true) { if ($this->literal("...")) { $isVararg = true; break; } if ($this->$method($value)) { if ($value[0] == "variable") { $arg = array("arg", $value[1]); $ss = $this->seek(); if ($this->assign() && $this->$method($rhs)) { $arg[] = $rhs; } else { $this->seek($ss); if ($this->literal("...")) { $arg[0] = "rest"; $isVararg = true; } } $values[] = $arg; if ($isVararg) { break; } continue; } else { $values[] = array("lit", $value); } } if (!$this->literal($delim)) { if ($delim == "," && $this->literal(";")) { // found new delim, convert existing args $delim = ";"; $method = "propertyValue"; // transform arg list if (isset($values[1])) { // 2 items $newList = array(); foreach ($values as $i => $arg) { switch ($arg[0]) { case "arg": if ($i) { $this->throwError("Cannot mix ; and , as delimiter types"); } $newList[] = $arg[2]; break; case "lit": $newList[] = $arg[1]; break; case "rest": $this->throwError("Unexpected rest before semicolon"); } } $newList = array("list", ", ", $newList); switch ($values[0][0]) { case "arg": $newArg = array("arg", $values[0][1], $newList); break; case "lit": $newArg = array("lit", $newList); break; } } elseif ($values) { // 1 item $newArg = $values[0]; } if ($newArg) { $values = array($newArg); } } else { break; } } } if (!$this->literal(')')) { $this->seek($s); return false; } $args = $values; return true; } // consume a list of tags // this accepts a hanging delimiter protected function tags(&$tags, $simple = false, $delim = ',') { $tags = array(); while ($this->tag($tt, $simple)) { $tags[] = $tt; if (!$this->literal($delim)) break; } if (count($tags) == 0) return false; return true; } // list of tags of specifying mixin path // optionally separated by > (lazy, accepts extra >) protected function mixinTags(&$tags) { $tags = array(); while ($this->tag($tt, true)) { $tags[] = $tt; $this->literal(">"); } if (!$tags) { return false; } return true; } // a bracketed value (contained within in a tag definition) protected function tagBracket(&$parts, &$hasExpression) { // speed shortcut if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "[") { return false; } $s = $this->seek(); $hasInterpolation = false; if ($this->literal("[", false)) { $attrParts = array("["); // keyword, string, operator while (true) { if ($this->literal("]", false)) { $this->count--; break; // get out early } if ($this->match('\s+', $m)) { $attrParts[] = " "; continue; } if ($this->string($str)) { // escape parent selector, (yuck) foreach ($str[2] as &$chunk) { $chunk = str_replace($this->lessc->parentSelector, "$&$", $chunk); } $attrParts[] = $str; $hasInterpolation = true; continue; } if ($this->keyword($word)) { $attrParts[] = $word; continue; } if ($this->interpolation($inter, false)) { $attrParts[] = $inter; $hasInterpolation = true; continue; } // operator, handles attr namespace too if ($this->match('[|-~\$\*\^=]+', $m)) { $attrParts[] = $m[0]; continue; } break; } if ($this->literal("]", false)) { $attrParts[] = "]"; foreach ($attrParts as $part) { $parts[] = $part; } $hasExpression = $hasExpression || $hasInterpolation; return true; } $this->seek($s); } $this->seek($s); return false; } // a space separated list of selectors protected function tag(&$tag, $simple = false) { if ($simple) { $chars = '^@,:;{}\][>\(\) "\''; } else { $chars = '^@,;{}["\''; } $s = $this->seek(); $hasExpression = false; $parts = array(); while ($this->tagBracket($parts, $hasExpression)); $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = false; while (true) { if ($this->match('(['.$chars.'0-9]['.$chars.']*)', $m)) { $parts[] = $m[1]; if ($simple) break; while ($this->tagBracket($parts, $hasExpression)); continue; } if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "@") { if ($this->interpolation($interp)) { $hasExpression = true; $interp[2] = true; // don't unescape $parts[] = $interp; continue; } if ($this->literal("@")) { $parts[] = "@"; continue; } } if ($this->unit($unit)) { // for keyframes $parts[] = $unit[1]; $parts[] = $unit[2]; continue; } break; } $this->eatWhiteDefault = $oldWhite; if (!$parts) { $this->seek($s); return false; } if ($hasExpression) { $tag = array("exp", array("string", "", $parts)); } else { $tag = trim(implode($parts)); } $this->whitespace(); return true; } // a css function protected function func(&$func) { $s = $this->seek(); if ($this->match('(%|[\w\-_][\w\-_:\.]+|[\w_])', $m) && $this->literal('(')) { $fname = $m[1]; $sPreArgs = $this->seek(); $args = array(); while (true) { $ss = $this->seek(); // this ugly nonsense is for ie filter properties if ($this->keyword($name) && $this->literal('=') && $this->expressionList($value)) { $args[] = array("string", "", array($name, "=", $value)); } else { $this->seek($ss); if ($this->expressionList($value)) { $args[] = $value; } } if (!$this->literal(',')) break; } $args = array('list', ',', $args); if ($this->literal(')')) { $func = array('function', $fname, $args); return true; } elseif ($fname == 'url') { // couldn't parse and in url? treat as string $this->seek($sPreArgs); if ($this->openString(")", $string) && $this->literal(")")) { $func = array('function', $fname, $string); return true; } } } $this->seek($s); return false; } // consume a less variable protected function variable(&$name) { $s = $this->seek(); if ($this->literal($this->lessc->vPrefix, false) && ($this->variable($sub) || $this->keyword($name)) ) { if (!empty($sub)) { $name = array('variable', $sub); } else { $name = $this->lessc->vPrefix.$name; } return true; } $name = null; $this->seek($s); return false; } /** * Consume an assignment operator * Can optionally take a name that will be set to the current property name */ protected function assign($name = null) { if ($name) $this->currentProperty = $name; return $this->literal(':') || $this->literal('='); } // consume a keyword protected function keyword(&$word) { if ($this->match('([\w_\-\*!"][\w\-_"]*)', $m)) { $word = $m[1]; return true; } return false; } // consume an end of statement delimiter protected function end() { if ($this->literal(';', false)) { return true; } elseif ($this->count == strlen($this->buffer) || $this->buffer[$this->count] == '}') { // if there is end of file or a closing block next then we don't need a ; return true; } return false; } protected function guards(&$guards) { $s = $this->seek(); if (!$this->literal("when")) { $this->seek($s); return false; } $guards = array(); while ($this->guardGroup($g)) { $guards[] = $g; if (!$this->literal(",")) break; } if (count($guards) == 0) { $guards = null; $this->seek($s); return false; } return true; } // a bunch of guards that are and'd together // TODO rename to guardGroup protected function guardGroup(&$guardGroup) { $s = $this->seek(); $guardGroup = array(); while ($this->guard($guard)) { $guardGroup[] = $guard; if (!$this->literal("and")) break; } if (count($guardGroup) == 0) { $guardGroup = null; $this->seek($s); return false; } return true; } protected function guard(&$guard) { $s = $this->seek(); $negate = $this->literal("not"); if ($this->literal("(") && $this->expression($exp) && $this->literal(")")) { $guard = $exp; if ($negate) $guard = array("negate", $guard); return true; } $this->seek($s); return false; } /* raw parsing functions */ protected function literal($what, $eatWhitespace = null) { if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault; // shortcut on single letter if (!isset($what[1]) && isset($this->buffer[$this->count])) { if ($this->buffer[$this->count] == $what) { if (!$eatWhitespace) { $this->count++; return true; } // goes below... } else { return false; } } if (!isset(self::$literalCache[$what])) { self::$literalCache[$what] = helix3_lessc::preg_quote($what); } return $this->match(self::$literalCache[$what], $m, $eatWhitespace); } protected function genericList(&$out, $parseItem, $delim = "", $flatten = true) { $s = $this->seek(); $items = array(); while ($this->$parseItem($value)) { $items[] = $value; if ($delim) { if (!$this->literal($delim)) break; } } if (count($items) == 0) { $this->seek($s); return false; } if ($flatten && count($items) == 1) { $out = $items[0]; } else { $out = array("list", $delim, $items); } return true; } // advance counter to next occurrence of $what // $until - don't include $what in advance // $allowNewline, if string, will be used as valid char set protected function to($what, &$out, $until = false, $allowNewline = false) { if (is_string($allowNewline)) { $validChars = $allowNewline; } else { $validChars = $allowNewline ? "." : "[^\n]"; } if (!$this->match('('.$validChars.'*?)'.helix3_lessc::preg_quote($what), $m, !$until)) return false; if ($until) $this->count -= strlen($what); // give back $what $out = $m[1]; return true; } // try to match something on head of buffer protected function match($regex, &$out, $eatWhitespace = null) { if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault; $r = '/'.$regex.($eatWhitespace && !$this->writeComments ? '\s*' : '').'/Ais'; if (preg_match($r, $this->buffer, $out, 0, $this->count)) { $this->count += strlen($out[0]); if ($eatWhitespace && $this->writeComments) $this->whitespace(); return true; } return false; } // match some whitespace protected function whitespace() { if ($this->writeComments) { $gotWhite = false; while (preg_match(self::$whitePattern, $this->buffer, $m, 0, $this->count)) { if (isset($m[1]) && empty($this->seenComments[$this->count])) { $this->append(array("comment", $m[1])); $this->seenComments[$this->count] = true; } $this->count += strlen($m[0]); $gotWhite = true; } return $gotWhite; } else { $this->match("", $m); return strlen($m[0]) > 0; } } // match something without consuming it protected function peek($regex, &$out = null, $from = null) { if (is_null($from)) $from = $this->count; $r = '/'.$regex.'/Ais'; $result = preg_match($r, $this->buffer, $out, 0, $from); return $result; } // seek to a spot in the buffer or return where we are on no argument protected function seek($where = null) { if ($where === null) return $this->count; else $this->count = $where; return true; } /* misc functions */ public function throwError($msg = "parse error", $count = null) { $count = is_null($count) ? $this->count : $count; $line = $this->line + substr_count(substr($this->buffer, 0, $count), "\n"); if (!empty($this->sourceName)) { $loc = "$this->sourceName on line $line"; } else { $loc = "line: $line"; } // TODO this depends on $this->count if ($this->peek("(.*?)(\n|$)", $m, $count)) { throw new exception("$msg: failed at `$m[1]` $loc"); } else { throw new exception("$msg: $loc"); } } protected function pushBlock($selectors = null, $type = null) { $b = new stdclass; $b->parent = $this->env; $b->type = $type; $b->id = self::$nextBlockId++; $b->isVararg = false; // TODO: kill me from here $b->tags = $selectors; $b->props = array(); $b->children = array(); $this->env = $b; return $b; } // push a block that doesn't multiply tags protected function pushSpecialBlock($type) { return $this->pushBlock(null, $type); } // append a property to the current block protected function append($prop, $pos = null) { if ($pos !== null) $prop[-1] = $pos; $this->env->props[] = $prop; } // pop something off the stack protected function pop() { $old = $this->env; $this->env = $this->env->parent; return $old; } // remove comments from $text // todo: make it work for all functions, not just url protected function removeComments($text) { $look = array( 'url(', '//', '/*', '"', "'" ); $out = ''; $min = null; while (true) { // find the next item foreach ($look as $token) { $pos = strpos($text, $token); if ($pos !== false) { if (!isset($min) || $pos < $min[1]) $min = array($token, $pos); } } if (is_null($min)) break; $count = $min[1]; $skip = 0; $newlines = 0; switch ($min[0]) { case 'url(': if (preg_match('/url\(.*?\)/', $text, $m, 0, $count)) $count += strlen($m[0]) - strlen($min[0]); break; case '"': case "'": if (preg_match('/'.$min[0].'.*?(?<!\\\\)'.$min[0].'/', $text, $m, 0, $count)) $count += strlen($m[0]) - 1; break; case '//': $skip = strpos($text, "\n", $count); if ($skip === false) $skip = strlen($text) - $count; else $skip -= $count; break; case '/*': if (preg_match('/\/\*.*?\*\//s', $text, $m, 0, $count)) { $skip = strlen($m[0]); $newlines = substr_count($m[0], "\n"); } break; } if ($skip == 0) $count += strlen($min[0]); $out .= substr($text, 0, $count).str_repeat("\n", $newlines); $text = substr($text, $count + $skip); $min = null; } return $out.$text; } } class helix3_lessc_formatter_classic { public $indentChar = " "; public $break = "\n"; public $open = " {"; public $close = "}"; public $selectorSeparator = ", "; public $assignSeparator = ":"; public $openSingle = " { "; public $closeSingle = " }"; public $disableSingle = false; public $breakSelectors = false; public $compressColors = false; public $indentLevel; public function __construct() { $this->indentLevel = 0; } public function indentStr($n = 0) { return str_repeat($this->indentChar, max($this->indentLevel + $n, 0)); } public function property($name, $value) { return $name . $this->assignSeparator . $value . ";"; } protected function isEmpty($block) { if (empty($block->lines)) { foreach ($block->children as $child) { if (!$this->isEmpty($child)) return false; } return true; } return false; } public function block($block) { if ($this->isEmpty($block)) return; $inner = $pre = $this->indentStr(); $isSingle = !$this->disableSingle && is_null($block->type) && count($block->lines) == 1; if (!empty($block->selectors)) { $this->indentLevel++; if ($this->breakSelectors) { $selectorSeparator = $this->selectorSeparator . $this->break . $pre; } else { $selectorSeparator = $this->selectorSeparator; } echo $pre . implode($selectorSeparator, $block->selectors); if ($isSingle) { echo $this->openSingle; $inner = ""; } else { echo $this->open . $this->break; $inner = $this->indentStr(); } } if (!empty($block->lines)) { $glue = $this->break.$inner; echo $inner . implode($glue, $block->lines); if (!$isSingle && !empty($block->children)) { echo $this->break; } } foreach ($block->children as $child) { $this->block($child); } if (!empty($block->selectors)) { if (!$isSingle && empty($block->children)) echo $this->break; if ($isSingle) { echo $this->closeSingle . $this->break; } else { echo $pre . $this->close . $this->break; } $this->indentLevel--; } } } class helix3_lessc_formatter_compressed extends helix3_lessc_formatter_classic { public $disableSingle = true; public $open = "{"; public $selectorSeparator = ","; public $assignSeparator = ":"; public $break = ""; public $compressColors = true; public function indentStr($n = 0) { return ""; } } class helix3_lessc_formatter_lessjs extends helix3_lessc_formatter_classic { public $disableSingle = true; public $breakSelectors = true; public $assignSeparator = ": "; public $selectorSeparator = ","; }PKAA#]gl�(K(K#system/helix3/core/classes/menu.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ //no direct accees defined('_JEXEC') or die('resticted aceess'); use Joomla\CMS\Factory; use Joomla\CMS\Filter\OutputFilter; use Joomla\CMS\Helper\ModuleHelper; use Joomla\CMS\Router\Route; class Helix3Menu { protected $_items = []; protected $active = 0; protected $active_tree = []; protected $menu = ''; public $_params = null; public $menuname = 'mainmenu'; public $app; public $template; public $extraclass; public $children; public function __construct($class = '', $name = '') { $this->app = Factory::getApplication(); $this->template = $this->app->getTemplate(true); $this->_params = $this->template->params; $this->extraclass = $class; if ($name) { $this->menuname = $name; } else { $this->menuname = $this->_params->get('menu'); } $this->initMenu(); $this->render(); } public function initMenu() { $app = Factory::getApplication(); $menu = $app->getMenu('site'); $attributes = ['menutype']; $menu_name = [$this->menuname]; $items = $menu->getItems($attributes, $menu_name); $active_item = ($menu->getActive()) ? $menu->getActive() : $menu->getDefault(); $this->active = $active_item ? $active_item->id : 0; $this->active_tree = $active_item->tree; foreach ($items as &$item) { if ($item->level >= 2 && ! isset($this->_items[$item->parent_id])) { continue; } $parent = isset($this->children[$item->parent_id]) ? $this->children[$item->parent_id] : []; $parent[] = $item; $this->children[$item->parent_id] = $parent; $this->_items[$item->id] = $item; } foreach ($items as &$item) { $class = ''; if ($item->id == $this->active) { $class .= ' current-item'; } if (in_array($item->id, $this->active_tree)) { $class .= ' active'; } elseif ($item->type == 'alias') { $aliasToId = $item->getParams()->get('aliasoptions'); if (count($this->active_tree) > 0 && $aliasToId == $this->active_tree[count($this->active_tree) - 1]) { $class .= ' active'; } elseif (in_array($aliasToId, $this->active_tree)) { $class .= ' alias-parent-active'; } } $item->class = $class; $item->dropdown = 0; if (isset($this->children[$item->id])) { $item->dropdown = 1; } $item->megamenu = ($item->getParams()->get('megamenu')) ? $item->getParams()->get('megamenu') : 0; $item->flink = $item->link; switch ($item->type) { case 'separator': case 'heading': // No further action needed. break; case 'url': if ((strpos($item->link, 'index.php?') === 0) && (strpos($item->link, 'Itemid=') === false)) { $item->flink = $item->link . '&Itemid=' . $item->id; } break; case 'alias': $item->flink = 'index.php?Itemid=' . $item->getParams()->get('aliasoptions'); break; default: $item->flink = 'index.php?Itemid=' . $item->id; break; } if (strcasecmp(substr($item->flink, 0, 4), 'http') && (strpos($item->flink, 'index.php?') !== false)) { $item->flink = Route::_($item->flink, true, $item->getParams()->get('secure')); } else { $item->flink = Route::_($item->flink); } // We prevent the double encoding because for some reason the $item is shared for menu modules and we get double encoding // when the cause of that is found the argument should be removed $item->title = htmlspecialchars($item->title, ENT_COMPAT, 'UTF-8', false); $item->anchor_css = htmlspecialchars($item->getParams()->get('menu-anchor_css', ''), ENT_COMPAT, 'UTF-8', false); $item->anchor_title = htmlspecialchars($item->getParams()->get('menu-anchor_title', ''), ENT_COMPAT, 'UTF-8', false); $item->menu_image = $item->getParams()->get('menu_image', '') ? htmlspecialchars($item->getParams()->get('menu_image', ''), ENT_COMPAT, 'UTF-8', false) : ''; } } public function render() { $this->menu = ''; $keys = array_keys($this->_items); if (count($keys)) { $this->navigation(null, $keys[0]); } echo $this->menu; } public function navigation($pitem, $start = 0, $end = 0, $class = '') { if ($start > 0) { if (! isset($this->_items[$start])) { return; } $pid = $this->_items[$start]->parent_id; $items = []; $started = false; foreach ($this->children[$pid] as $item) { if ($started) { if ($item->id == $end) { break; } $items[] = $item; } else { if ($item->id == $start) { $started = true; $items[] = $item; } } } if (! count($items)) { return; } } else if ($start === 0) { $pid = $pitem->id; if (! isset($this->children[$pid])) { return; } $items = $this->children[$pid]; } else { return; } //Parent class if ($pid == 1) { if ($this->_params->get('menu_animation') != 'none') { $animation = ' ' . $this->_params->get('menu_animation'); } else { $animation = ''; } $class = 'sp-megamenu-parent' . $animation; if ($this->extraclass) { $class = $class . ' ' . $this->extraclass; } $this->menu .= $this->start_lvl($class); } else { $this->menu .= $this->start_lvl($class); } foreach ($items as $item) { $this->getItem($item); } $this->menu .= $this->end_lvl(); } private function getItem($item) { $this->menu .= $this->start_el(['item' => $item]); $this->menu .= $this->item($item); // get item url if ($item->megamenu) { $this->mega($item); } else if ($item->dropdown) { $this->dropdown($item); } else if (($item->parent_id == 1) && ($item->megamenu == 0)) { $menulayout = json_decode(! empty($this->_items[$item->id]->getParams()->get('menulayout')) ? $this->_items[$item->id]->getParams()->get('menulayout') : ''); if ($menulayout) { $layout = $menulayout->layout; $attr = $layout[0]->attr; if ($attr[0]->moduleId !== '') { $this->mega($item); } } } $this->menu .= $this->end_el(); } private function dropdown($item) { $items = isset($this->children[$item->id]) ? $this->children[$item->id] : []; $firstitem = count($items) ? $items[0]->id : 0; //Dropdown $class = ($item->level == 1) ? 'sp-dropdown sp-dropdown-main' : 'sp-dropdown sp-dropdown-sub'; $dropdown_width = $this->_params->get('dropdown_width'); if (! $dropdown_width) { $dropdown_width = 240; } $dropdown_style = 'width: ' . $dropdown_width . 'px;'; $layout = json_decode(! empty($this->_items[$item->id]->getParams()->get('menulayout')) ? $this->_items[$item->id]->getParams()->get('menulayout') : ''); $sub_alignment = $this->_items[$item->id]->getParams()->get('dropdown_position', 'right'); if (isset($layout->menuAlign) && $layout->menuAlign) { $alignment = $layout->menuAlign; } else { $alignment = 'right'; } if ($alignment == 'center') { $dropdown_style .= 'left: -' . ($dropdown_width / 2) . 'px;'; } else if ($sub_alignment == 'left') { $dropdown_style .= 'left: -' . $dropdown_width . 'px;'; } $this->menu .= '<div class="' . $class . ' sp-menu-' . $alignment . '" style="' . $dropdown_style . '">'; $this->menu .= '<div class="sp-dropdown-inner">'; $this->navigation($item, $firstitem, 0, 'sp-dropdown-items'); $mega_json = $item->getParams()->get('menulayout'); if ($mega_json) { $mega = json_decode($mega_json); $layout = $mega->layout; $layout = $layout[0]; $col = $layout->attr[0]; $mod_ids = ($col->moduleId) ? explode(',', $col->moduleId) : []; if (count($mod_ids)) { foreach ($mod_ids as $mod_id) { $this->menu .= $this->load_module($mod_id); } } } $this->menu .= '</div>'; $this->menu .= '</div>'; } private function mega($item) { $items = isset($this->children[$item->id]) ? $this->children[$item->id] : []; $firstitem = count($items) ? $items[0]->id : 0; $mega_json = $item->getParams()->get('menulayout'); $mega = json_decode($mega_json); $layout = $mega->layout; $mega_style = 'width: ' . $mega->width . 'px;'; if ($mega->menuAlign == 'center') { $mega_style .= 'left: -' . ($mega->width / 2) . 'px;'; } if ($mega->menuAlign == 'full') { $mega_style = ''; $mega->menuAlign = $mega->menuAlign . ' container'; } $this->menu .= '<div class="sp-dropdown sp-dropdown-main sp-dropdown-mega sp-menu-' . $mega->menuAlign . '" style="' . $mega_style . '">'; $this->menu .= '<div class="sp-dropdown-inner">'; foreach ($layout as $row) { $this->menu .= '<div class="row">'; foreach ($row->attr as $col) { $this->menu .= '<div class="col-sm-' . $col->colGrid . '">'; if (count($items)) { $item_ids = ($col->menuParentId) ? explode(',', $col->menuParentId) : []; if (count($item_ids)) { $this->menu .= $this->start_lvl('sp-mega-group'); foreach ($item_ids as $item_id) { if (! empty($this->_items[$item_id])) { $item = $this->_items[$item_id]; $items = isset($this->children[$item_id]) ? $this->children[$item_id] : []; $firstitem = count($items) ? $items[0]->id : 0; $this->menu .= $this->start_el(['item' => $item]); //Mega Group Title if (isset($this->children[$item_id])) { $this->menu .= $this->item($item, 'sp-group-title'); } else { $this->menu .= $this->item($item); } if ($firstitem) { $this->navigation(null, $firstitem, 0, 'sp-mega-group-child sp-dropdown-items'); } $this->menu .= $this->end_el(); } } $this->menu .= $this->end_lvl(); } } $mod_ids = ($col->moduleId) ? explode(',', $col->moduleId) : []; if (count($mod_ids)) { foreach ($mod_ids as $mod_id) { $this->menu .= $this->load_module($mod_id); } } $this->menu .= '</div>'; } $this->menu .= '</div>'; } $this->menu .= '</div>'; $this->menu .= '</div>'; } private function start_lvl($cls = '') { $class = trim($cls); return '<ul class="' . $class . '">'; } private function end_lvl() { return '</ul>'; } private function start_el($args = []) { $item = $args['item']; $class = 'sp-menu-item'; if (! empty($this->children[$item->id])) { $class .= ' sp-has-child'; } else if (isset($item->megamenu) && ($item->megamenu)) { $class .= ' sp-has-child'; } else if (($item->parent_id == 1) && ($item->megamenu == 0)) { $menulayout = json_decode(! empty($this->_items[$item->id]->getParams()->get('menulayout')) ? $this->_items[$item->id]->getParams()->get('menulayout') : ''); if ($menulayout) { $layout = $menulayout->layout; $attr = $layout[0]->attr; if ($attr[0]->moduleId !== '') { $class .= ' sp-has-child'; } } } if ($custom_class = $item->getParams()->get('class')) { $class .= ' ' . $custom_class; } $class .= $item->class; return '<li class="' . $class . '">'; } private function end_el() { return '</li>'; } private function item($item, $extra_class = '') { $class = $extra_class; $title = $item->anchor_title ? 'title="' . $item->anchor_title . '" ' : ''; $class .= ($item->anchor_css && $class) ? ' ' . $item->anchor_css : $item->anchor_css; $class = ($class) ? 'class="' . $class . '"' : ''; if ($item->menu_image) { $item->getParams()->get('menu_text', 1) ? $linktitle = '<img src="' . $item->menu_image . '" alt="' . $item->title . '" /><span class="image-title">' . $item->title . '</span> ' : $linktitle = '<img src="' . $item->menu_image . '" alt="' . $item->title . '" />'; } else { $linktitle = $item->title; } //Hide Link Title if (! $showmenutitle = $item->getParams()->get('showmenutitle', 1)) { $linktitle = ''; } //Add Menu Icon if ($icon = $item->getParams()->get('icon')) { if ($showmenutitle) { $linktitle = '<i class="fa ' . $icon . '"></i> ' . $linktitle; } else { $linktitle = '<i class="fa ' . $icon . '"></i>'; } } $flink = $item->flink; $flink = str_replace('&', '&', OutputFilter::ampReplace(htmlspecialchars($flink))); $output = ''; $options = ''; if ($item->getParams()->get('menu_show', 1) != 0) { switch ($item->browserNav) { default: case 0: $link_rel = ($item->getParams()->get('menu-anchor_rel', '')) ? 'rel="' . $item->getParams()->get('menu-anchor_rel') . '"' : ''; $flink = ($flink) ? $flink : 'javascript:void(0);'; $output .= '<a ' . $class . ' href="' . $flink . '" ' . $link_rel . ' ' . $title . '>' . $linktitle . '</a>'; break; case 1: $link_rel = ($item->getParams()->get('menu-anchor_rel', '') == 'nofollow') ? 'noopener noreferrer nofollow' : 'noopener noreferrer'; $output .= '<a ' . $class . ' href="' . $flink . '" rel="' . $link_rel . '" target="_blank" ' . $title . '>' . $linktitle . '</a>'; break; case 2: $options .= 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,' . $item->getParams()->get('window_open'); $output .= '<a ' . $class . ' href="' . $flink . '" onclick="window.open(this.href,\'targetWindow\',\'' . $options . '\');return false;" ' . $title . '>' . $linktitle . '</a>'; break; } } return $output; } //Load Module by id or position private function load_module($mod) { $app = Factory::getApplication(); $user = Factory::getUser(); $groups = implode(',', $user->getAuthorisedViewLevels()); $lang = Factory::getLanguage()->getTag(); $clientId = (int) $app->getClientId(); $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select('m.id, m.title, m.module, m.position, m.content, m.showtitle, m.params'); $query->from('#__modules AS m'); $query->where('m.published = 1'); $query->where('m.id = ' . $mod); if (is_numeric($mod)) { $query->where('m.id = ' . $mod); } else { $query->where('m.position = "' . $mod . '"'); } $date = Factory::getDate(); $now = $date->toSql(); $nullDate = $db->getNullDate(); $query->where('(m.publish_up IS NULL OR m.publish_up = ' . $db->Quote($nullDate) . ' OR m.publish_up <= ' . $db->Quote($now) . ')'); $query->where('(m.publish_down IS NULL OR m.publish_down = ' . $db->Quote($nullDate) . ' OR m.publish_down >= ' . $db->Quote($now) . ')'); $query->where('m.access IN (' . $groups . ')'); $query->where('m.client_id = ' . $clientId); // Filter by language if ($app->isClient('site') && $app->getLanguageFilter()) { $query->where('m.language IN (' . $db->Quote($lang) . ',' . $db->Quote('*') . ')'); } $query->order('position, ordering'); // Set the query $db->setQuery($query); $modules = $db->loadObjectList(); if (! $modules) { return null; } $options = ['style' => 'sp_xhtml']; $output = ''; ob_start(); foreach ($modules as $module) { $file = $module->module; $custom = substr($file, 0, 4) == 'mod_' ? 0 : 1; $module->user = $custom; $module->name = $custom ? $module->title : substr($file, 4); $module->style = null; $module->client_id = 1; $module->position = strtolower($module->position); $clean[$module->id] = $module; echo ModuleHelper::renderModule($module, $options); } $output = ob_get_clean(); return $output; } } PKAA#]�L�:I:I'system/helix3/core/classes/Minifier.phpnu�[���<?php /* * This file is part of the JShrink package. * * (c) Robert Hafner <tedivm@tedivm.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * JShrink * * * @package JShrink * @author Robert Hafner <tedivm@tedivm.com> */ namespace JShrink; /** * Minifier * * Usage - Minifier::minify($js); * Usage - Minifier::minify($js, $options); * Usage - Minifier::minify($js, array('flaggedComments' => false)); * * @package JShrink * @author Robert Hafner <tedivm@tedivm.com> * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ class Minifier { /** * The input javascript to be minified. * * @var string */ protected $input; /** * Length of input javascript. * * @var int */ protected $len = 0; /** * The location of the character (in the input string) that is next to be * processed. * * @var int */ protected $index = 0; /** * The first of the characters currently being looked at. * * @var string */ protected $a = ''; /** * The next character being looked at (after a); * * @var string */ protected $b = ''; /** * This character is only active when certain look ahead actions take place. * * @var string */ protected $c; /** * Contains the options for the current minification process. * * @var array */ protected $options; /** * These characters are used to define strings. */ protected $stringDelimiters = ['\'' => true, '"' => true, '`' => true]; /** * Contains the default options for minification. This array is merged with * the one passed in by the user to create the request specific set of * options (stored in the $options attribute). * * @var array */ protected static $defaultOptions = ['flaggedComments' => true]; /** * Contains lock ids which are used to replace certain code patterns and * prevent them from being minified * * @var array */ protected $locks = []; /** * Takes a string containing javascript and removes unneeded characters in * order to shrink the code without altering it's functionality. * * @param string $js The raw javascript to be minified * @param array $options Various runtime options in an associative array * @throws \Exception * @return bool|string */ public static function minify($js, $options = []) { try { ob_start(); $jshrink = new Minifier(); $js = $jshrink->lock($js); $jshrink->minifyDirectToOutput($js, $options); // Sometimes there's a leading new line, so we trim that out here. $js = ltrim(ob_get_clean()); $js = $jshrink->unlock($js); unset($jshrink); return $js; } catch (\Exception $e) { if (isset($jshrink)) { // Since the breakdownScript function probably wasn't finished // we clean it out before discarding it. $jshrink->clean(); unset($jshrink); } // without this call things get weird, with partially outputted js. ob_end_clean(); throw $e; } } /** * Processes a javascript string and outputs only the required characters, * stripping out all unneeded characters. * * @param string $js The raw javascript to be minified * @param array $options Various runtime options in an associative array */ protected function minifyDirectToOutput($js, $options) { $this->initialize($js, $options); $this->loop(); $this->clean(); } /** * Initializes internal variables, normalizes new lines, * * @param string $js The raw javascript to be minified * @param array $options Various runtime options in an associative array */ protected function initialize($js, $options) { $this->options = array_merge(static::$defaultOptions, $options); $this->input = str_replace(["\r\n", '/**/', "\r"], ["\n", "", "\n"], $js); // We add a newline to the end of the script to make it easier to deal // with comments at the bottom of the script- this prevents the unclosed // comment error that can otherwise occur. $this->input .= PHP_EOL; // save input length to skip calculation every time $this->len = strlen($this->input); // Populate "a" with a new line, "b" with the first character, before // entering the loop $this->a = "\n"; $this->b = $this->getReal(); } /** * Characters that can't stand alone preserve the newline. * * @var array */ protected $noNewLineCharacters = [ '(' => true, '-' => true, '+' => true, '[' => true, '@' => true]; /** * The primary action occurs here. This function loops through the input string, * outputting anything that's relevant and discarding anything that is not. */ protected function loop() { while ($this->a !== false && !is_null($this->a) && $this->a !== '') { switch ($this->a) { // new lines case "\n": // if the next line is something that can't stand alone preserve the newline if ($this->b !== false && isset($this->noNewLineCharacters[$this->b])) { echo $this->a; $this->saveString(); break; } // if B is a space we skip the rest of the switch block and go down to the // string/regex check below, resetting $this->b with getReal if ($this->b === ' ') { break; } // otherwise we treat the newline like a space // no break case ' ': if (static::isAlphaNumeric($this->b)) { echo $this->a; } $this->saveString(); break; default: switch ($this->b) { case "\n": if (strpos('}])+-"\'', $this->a) !== false) { echo $this->a; $this->saveString(); break; } else { if (static::isAlphaNumeric($this->a)) { echo $this->a; $this->saveString(); } } break; case ' ': if (!static::isAlphaNumeric($this->a)) { break; } // no break default: // check for some regex that breaks stuff if ($this->a === '/' && ($this->b === '\'' || $this->b === '"')) { $this->saveRegex(); continue 3; } echo $this->a; $this->saveString(); break; } } // do reg check of doom $this->b = $this->getReal(); if (($this->b == '/' && strpos('(,=:[!&|?', $this->a) !== false)) { $this->saveRegex(); } } } /** * Resets attributes that do not need to be stored between requests so that * the next request is ready to go. Another reason for this is to make sure * the variables are cleared and are not taking up memory. */ protected function clean() { unset($this->input); $this->len = 0; $this->index = 0; $this->a = $this->b = ''; unset($this->c); unset($this->options); } /** * Returns the next string for processing based off of the current index. * * @return string */ protected function getChar() { // Check to see if we had anything in the look ahead buffer and use that. if (isset($this->c)) { $char = $this->c; unset($this->c); } else { // Otherwise we start pulling from the input. $char = $this->index < $this->len ? $this->input[$this->index] : false; // If the next character doesn't exist return false. if (isset($char) && $char === false) { return false; } // Otherwise increment the pointer and use this char. $this->index++; } // Normalize all whitespace except for the newline character into a // standard space. if ($char !== "\n" && $char < "\x20") { return ' '; } return $char; } /** * This function gets the next "real" character. It is essentially a wrapper * around the getChar function that skips comments. This has significant * performance benefits as the skipping is done using native functions (ie, * c code) rather than in script php. * * * @return string Next 'real' character to be processed. * @throws \RuntimeException */ protected function getReal() { $startIndex = $this->index; $char = $this->getChar(); // Check to see if we're potentially in a comment if ($char !== '/') { return $char; } $this->c = $this->getChar(); if ($this->c === '/') { $this->processOneLineComments($startIndex); return $this->getReal(); } elseif ($this->c === '*') { $this->processMultiLineComments($startIndex); return $this->getReal(); } return $char; } /** * Removed one line comments, with the exception of some very specific types of * conditional comments. * * @param int $startIndex The index point where "getReal" function started * @return void */ protected function processOneLineComments($startIndex) { $thirdCommentString = $this->index < $this->len ? $this->input[$this->index] : false; // kill rest of line $this->getNext("\n"); unset($this->c); if ($thirdCommentString == '@') { $endPoint = $this->index - $startIndex; $this->c = "\n" . substr($this->input, $startIndex, $endPoint); } } /** * Skips multiline comments where appropriate, and includes them where needed. * Conditional comments and "license" style blocks are preserved. * * @param int $startIndex The index point where "getReal" function started * @return void * @throws \RuntimeException Unclosed comments will throw an error */ protected function processMultiLineComments($startIndex) { $this->getChar(); // current C $thirdCommentString = $this->getChar(); // kill everything up to the next */ if it's there if ($this->getNext('*/')) { $this->getChar(); // get * $this->getChar(); // get / $char = $this->getChar(); // get next real character // Now we reinsert conditional comments and YUI-style licensing comments if (($this->options['flaggedComments'] && $thirdCommentString === '!') || ($thirdCommentString === '@')) { // If conditional comments or flagged comments are not the first thing in the script // we need to echo a and fill it with a space before moving on. if ($startIndex > 0) { echo $this->a; $this->a = " "; // If the comment started on a new line we let it stay on the new line if ($this->input[($startIndex - 1)] === "\n") { echo "\n"; } } $endPoint = ($this->index - 1) - $startIndex; echo substr($this->input, $startIndex, $endPoint); $this->c = $char; return; } } else { $char = false; } if ($char === false) { throw new \RuntimeException('Unclosed multiline comment at position: ' . ($this->index - 2)); } // if we're here c is part of the comment and therefore tossed $this->c = $char; } /** * Pushes the index ahead to the next instance of the supplied string. If it * is found the first character of the string is returned and the index is set * to it's position. * * @param string $string * @return string|false Returns the first character of the string or false. */ protected function getNext($string) { // Find the next occurrence of "string" after the current position. $pos = strpos($this->input, $string, $this->index); // If it's not there return false. if ($pos === false) { return false; } // Adjust position of index to jump ahead to the asked for string $this->index = $pos; // Return the first character of that string. return $this->index < $this->len ? $this->input[$this->index] : false; } /** * When a javascript string is detected this function crawls for the end of * it and saves the whole string. * * @throws \RuntimeException Unclosed strings will throw an error */ protected function saveString() { $startpos = $this->index; // saveString is always called after a gets cleared, so we push b into // that spot. $this->a = $this->b; // If this isn't a string we don't need to do anything. if (!isset($this->stringDelimiters[$this->a])) { return; } // String type is the quote used, " or ' $stringType = $this->a; // Echo out that starting quote echo $this->a; // Loop until the string is done // Grab the very next character and load it into a while (($this->a = $this->getChar()) !== false) { switch ($this->a) { // If the string opener (single or double quote) is used // output it and break out of the while loop- // The string is finished! case $stringType: break 2; // New lines in strings without line delimiters are bad- actual // new lines will be represented by the string \n and not the actual // character, so those will be treated just fine using the switch // block below. case "\n": if ($stringType === '`') { echo $this->a; } else { throw new \RuntimeException('Unclosed string at position: ' . $startpos); } break; // Escaped characters get picked up here. If it's an escaped new line it's not really needed case '\\': // a is a slash. We want to keep it, and the next character, // unless it's a new line. New lines as actual strings will be // preserved, but escaped new lines should be reduced. $this->b = $this->getChar(); // If b is a new line we discard a and b and restart the loop. if ($this->b === "\n") { break; } // echo out the escaped character and restart the loop. echo $this->a . $this->b; break; // Since we're not dealing with any special cases we simply // output the character and continue our loop. default: echo $this->a; } } } /** * When a regular expression is detected this function crawls for the end of * it and saves the whole regex. * * @throws \RuntimeException Unclosed regex will throw an error */ protected function saveRegex() { echo $this->a . $this->b; while (($this->a = $this->getChar()) !== false) { if ($this->a === '/') { break; } if ($this->a === '\\') { echo $this->a; $this->a = $this->getChar(); } if ($this->a === "\n") { throw new \RuntimeException('Unclosed regex pattern at position: ' . $this->index); } echo $this->a; } $this->b = $this->getReal(); } /** * Checks to see if a character is alphanumeric. * * @param string $char Just one character * @return bool */ protected static function isAlphaNumeric($char) { return preg_match('/^[\w\$\pL]$/', $char) === 1 || $char == '/'; } /** * Replace patterns in the given string and store the replacement * * @param string $js The string to lock * @return bool */ protected function lock($js) { /* lock things like <code>"asd" + ++x;</code> */ $lock = '"LOCK---' . crc32(time()) . '"'; $matches = []; preg_match('/([+-])(\s+)([+-])/S', $js, $matches); if (empty($matches)) { return $js; } $this->locks[$lock] = $matches[2]; $js = preg_replace('/([+-])\s+([+-])/S', "$1{$lock}$2", $js); /* -- */ return $js; } /** * Replace "locks" with the original characters * * @param string $js The string to unlock * @return bool */ protected function unlock($js) { if (empty($this->locks)) { return $js; } foreach ($this->locks as $lock => $replacement) { $js = str_replace($lock, $replacement, $js); } return $js; } } PKAA#]�ڛGcGc;system/helix3/html/layouts/libraries/cms/html/bootstrap.phpnu�[���<?php /** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Layout\LayoutHelper; /** * Utility class for Bootstrap elements. * * @since 3.0 */ abstract class Helix3Bootstrap { /** * @var array Array containing information for loaded files * @since 3.0 */ protected static $loaded = []; /** * Add javascript support for Bootstrap alerts * * @param string $selector Common class for the alerts * * @return void * * @since 3.0 */ public static function alert($selector = 'alert') { // Only load once if (! empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.alert', [$selector => '']); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap buttons * * @param string $selector Common class for the buttons * * @return void * * @since 3.1 */ public static function button($selector = 'button') { // Only load once if (! empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.button', [$selector]); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap carousels * * @param string $selector Common class for the carousels. * @param array $params An array of options for the carousel. * Options for the carousel can be: * - interval number The amount of time to delay between automatically cycling an item. * If false, carousel will not automatically cycle. * - pause string Pauses the cycling of the carousel on mouseenter and resumes the cycling * of the carousel on mouseleave. * * @return void * * @since 3.0 */ public static function carousel($selector = 'carousel', $params = []) { // Only load once if (! empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['interval'] = isset($params['interval']) ? (int) $params['interval'] : 5000; $opt['pause'] = isset($params['pause']) ? $params['pause'] : 'hover'; Factory::getDocument()->addScriptOptions('bootstrap.carousel', [$selector => $opt]); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap dropdowns * * @param string $selector Common class for the dropdowns * * @return void * * @since 3.0 */ public static function dropdown($selector = 'dropdown-toggle') { // Only load once if (! empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.dropdown', [$selector]); static::$loaded[__METHOD__][$selector] = true; } /** * Method to load the Bootstrap JavaScript framework into the document head * * If debugging mode is on an uncompressed version of Bootstrap is included for easier debugging. * * @param mixed $debug Is debugging mode on? [optional] * * @return void * * @since 3.0 */ public static function framework($debug = null) { // Only load once if (! empty(static::$loaded[__METHOD__])) { return; } $debug = (isset($debug) && $debug != JDEBUG) ? $debug : JDEBUG; // Load the needed scripts HTMLHelper::_('behavior.core'); HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'vendor/tether/tether.min.js', ['version' => 'auto', 'relative' => true, 'detectDebug' => $debug]); HTMLHelper::_('script', 'vendor/bootstrap/bootstrap.min.js', ['version' => 'auto', 'relative' => true, 'detectDebug' => $debug]); HTMLHelper::_('script', 'system/bootstrap-init.min.js', ['version' => 'auto', 'relative' => true, 'detectDebug' => $debug]); static::$loaded[__METHOD__] = true; } /** * Method to render a Bootstrap modal * * @param string $selector The ID selector for the modal. * @param array $params An array of options for the modal. * Options for the modal can be: * - title string The modal title * - backdrop mixed A boolean select if a modal-backdrop element should be included (default = true) * The string 'static' includes a backdrop which doesn't close the modal on click. * - keyboard boolean Closes the modal when escape key is pressed (default = true) * - closeButton boolean Display modal close button (default = true) * - animation boolean Fade in from the top of the page (default = true) * - footer string Optional markup for the modal footer * - url string URL of a resource to be inserted as an `<iframe>` inside the modal body * - height string height of the `<iframe>` containing the remote resource * - width string width of the `<iframe>` containing the remote resource * @param string $body Markup for the modal body. Appended after the `<iframe>` if the URL option is set * * @return string HTML markup for a modal * * @since 3.0 */ public static function renderModal($selector = 'modal', $params = [], $body = '') { // Only load once if (! empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); $layoutData = [ 'selector' => $selector, 'params' => $params, 'body' => $body, ]; static::$loaded[__METHOD__][$selector] = true; return LayoutHelper::render('joomla.modal.main', $layoutData); } /** * Add javascript support for Bootstrap popovers * * Use element's Title as popover content * * @param string $selector Selector for the popover * @param array $params An array of options for the popover. * Options for the popover can be: * animation boolean apply a css fade transition to the popover * container string|boolean Appends the popover to a specific element: { container: 'body' } * content string|function default content value if `data-content` attribute isn't present * delay number|object delay showing and hiding the popover (ms) - does not apply to manual trigger type * If a number is supplied, delay is applied to both hide/show * Object structure is: delay: { show: 500, hide: 100 } * html boolean Insert HTML into the popover. If false, jQuery's text method will be used to insert * content into the dom. * placement string|function how to position the popover - top | bottom | left | right * selector string If a selector is provided, popover objects will be delegated to the specified targets. * template string Base HTML to use when creating the popover. * title string|function default title value if `title` tag isn't present * trigger string how popover is triggered - hover | focus | manual * constraints array An array of constraints - passed through to Tether. * offset string Offset of the popover relative to its target. * * @return void * * @since 3.0 */ public static function popover($selector = '.hasPopover', $params = []) { // Only load once if (isset(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); $opt['animation'] = isset($params['animation']) ? $params['animation'] : null; $opt['container'] = isset($params['container']) ? $params['container'] : 'body'; $opt['content'] = isset($params['content']) ? $params['content'] : null; $opt['delay'] = isset($params['delay']) ? $params['delay'] : null; $opt['html'] = isset($params['html']) ? $params['html'] : true; $opt['placement'] = isset($params['placement']) ? $params['placement'] : null; $opt['selector'] = isset($params['selector']) ? $params['selector'] : null; $opt['template'] = isset($params['template']) ? $params['template'] : null; $opt['title'] = isset($params['title']) ? $params['title'] : null; $opt['trigger'] = isset($params['trigger']) ? $params['trigger'] : 'hover focus'; $opt['constraints'] = isset($params['constraints']) ? $params['constraints'] : ['to' => 'scrollParent', 'attachment' => 'together', 'pin' => true]; $opt['offset'] = isset($params['offset']) ? $params['offset'] : '0 0'; $opt = (object) array_filter((array) $opt); // Factory::getDocument()->addScriptOptions('bootstrap.popover', array($selector => $opt)); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap ScrollSpy * * @param string $selector The ID selector for the ScrollSpy element. * @param array $params An array of options for the ScrollSpy. * Options for the ScrollSpy can be: * - offset number Pixels to offset from top when calculating position of scroll. * * @return void * * @since 3.0 */ public static function scrollspy($selector = 'navbar', $params = []) { // Only load once if (isset(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.scrollspy', [$selector => $params]); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap tooltips * * Add a title attribute to any element in the form * title="title::text" * * @param string $selector The ID selector for the tooltip. * @param array $params An array of options for the tooltip. * Options for the tooltip can be: * animation boolean apply a css fade transition to the popover * container string|boolean Appends the popover to a specific element: { container: 'body' } * delay number|object delay showing and hiding the popover (ms) - does not apply to manual trigger type * If a number is supplied, delay is applied to both hide/show * Object structure is: delay: { show: 500, hide: 100 } * html boolean Insert HTML into the popover. If false, jQuery's text method will be used to insert * content into the dom. * placement string|function how to position the popover - top | bottom | left | right * selector string If a selector is provided, popover objects will be * delegated to the specified targets. * template string Base HTML to use when creating the popover. * title string|function default title value if `title` tag isn't present * trigger string how popover is triggered - hover | focus | manual * constraints array An array of constraints - passed through to Tether. * offset string Offset of the popover relative to its target. * * @return void * * @since 3.0 */ public static function tooltip($selector = '.hasTooltip', $params = []) { if (! isset(static::$loaded[__METHOD__][$selector])) { // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['animation'] = isset($params['animation']) ? (bool) $params['animation'] : null; $opt['html'] = isset($params['html']) ? (bool) $params['html'] : true; $opt['placement'] = isset($params['placement']) ? (string) $params['placement'] : null; $opt['selector'] = isset($params['selector']) ? (string) $params['selector'] : null; $opt['title'] = isset($params['title']) ? (string) $params['title'] : null; $opt['trigger'] = isset($params['trigger']) ? (string) $params['trigger'] : null; $opt['delay'] = isset($params['delay']) ? (is_array($params['delay']) ? $params['delay'] : (int) $params['delay']) : null; $opt['container'] = isset($params['container']) ? $params['container'] : 'body'; $opt['template'] = isset($params['template']) ? (string) $params['template'] : null; $onShow = isset($params['onShow']) ? (string) $params['onShow'] : null; $onShown = isset($params['onShown']) ? (string) $params['onShown'] : null; $onHide = isset($params['onHide']) ? (string) $params['onHide'] : null; $onHidden = isset($params['onHidden']) ? (string) $params['onHidden'] : null; $options = json_encode($opt); // Build the script. $script = ['$(container).find(' . json_encode($selector) . ').tooltip(' . $options . ')']; if ($onShow) { $script[] = 'on("show.bs.tooltip", ' . $onShow . ')'; } if ($onShown) { $script[] = 'on("shown.bs.tooltip", ' . $onShown . ')'; } if ($onHide) { $script[] = 'on("hide.bs.tooltip", ' . $onHide . ')'; } if ($onHidden) { $script[] = 'on("hidden.bs.tooltip", ' . $onHidden . ')'; } // Set static array static::$loaded[__METHOD__][$selector] = true; } return; } /** * Loads js and css files needed by Bootstrap Tooltip Extended plugin * * @param boolean $extended If true, bootstrap-tooltip-extended.js and .css files are loaded * * @return void * * @since 3.6 * * @deprecated 4.0 No replacement, use Bootstrap tooltips. */ public static function tooltipExtended($extended = true) { if ($extended) { HTMLHelper::_('script', 'jui/bootstrap-tooltip-extended.min.js', ['version' => 'auto', 'relative' => true]); HTMLHelper::_('stylesheet', 'jui/bootstrap-tooltip-extended.css', ['version' => 'auto', 'relative' => true]); } } /** * Add javascript support for Bootstrap accordians and insert the accordian * * @param string $selector The ID selector for the tooltip. * @param array $params An array of options for the tooltip. * Options for the tooltip can be: * - parent selector If selector then all collapsible elements under the specified parent will be closed when this * collapsible item is shown. (similar to traditional accordion behavior) * - toggle boolean Toggles the collapsible element on invocation * - active string Sets the active slide during load * * - onShow function This event fires immediately when the show instance method is called. * - onShown function This event is fired when a collapse element has been made visible to the user * (will wait for css transitions to complete). * - onHide function This event is fired immediately when the hide method has been called. * - onHidden function This event is fired when a collapse element has been hidden from the user * (will wait for css transitions to complete). * * @return string HTML for the accordian * * @since 3.0 */ public static function startAccordion($selector = 'myAccordian', $params = []) { // Only load once if (! empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['parent'] = isset($params['parent']) ? ($params['parent'] == true ? '#' . $selector : $params['parent']) : ''; $opt['toggle'] = isset($params['toggle']) ? (bool) $params['toggle'] : ! ($opt['parent'] === false || isset($params['active'])); $opt['onShow'] = isset($params['onShow']) ? (string) $params['onShow'] : null; $opt['onShown'] = isset($params['onShown']) ? (string) $params['onShown'] : null; $opt['onHide'] = isset($params['onHide']) ? (string) $params['onHide'] : null; $opt['onHidden'] = isset($params['onHidden']) ? (string) $params['onHidden'] : null; Factory::getDocument()->addScriptOptions('bootstrap.accordion', [$selector => $opt]); static::$loaded[__METHOD__][$selector] = true; return '<div id="' . $selector . '" class="accordion" role="tablist">'; } /** * Close the current accordion * * @return string HTML to close the accordian * * @since 3.0 */ public static function endAccordion() { return '</div>'; } /** * Begins the display of a new accordion slide. * * @param string $selector Identifier of the accordion group. * @param string $text Text to display. * @param string $id Identifier of the slide. * @param string $class Class of the accordion group. * * @return string HTML to add the slide * * @since 3.0 */ public static function addSlide($selector, $text, $id, $class = '') { $in = (static::$loaded[__CLASS__ . '::startAccordion'][$selector]['active'] == $id) ? ' in' : ''; $collapsed = (static::$loaded[__CLASS__ . '::startAccordion'][$selector]['active'] == $id) ? '' : ' collapsed'; $parent = static::$loaded[__CLASS__ . '::startAccordion'][$selector]['parent'] ? ' data-parent="' . static::$loaded[__CLASS__ . '::startAccordion'][$selector]['parent'] . '"' : ''; $class = (! empty($class)) ? ' ' . $class : ''; $html = '<div class="card mb-2' . $class . '">' . '<a href="#' . $id . '" data-bs-toggle="collapse"' . $parent . ' class="card-header' . $collapsed . '" role="tab">' . $text . '</a>' . '<div class="collapse' . $in . '" id="' . $id . '" role="tabpanel">' . '<div class="card-block">'; return $html; } /** * Close the current slide * * @return string HTML to close the slide * * @since 3.0 */ public static function endSlide() { return '</div></div></div>'; } /** * Creates a tab pane * * @param string $selector The pane identifier. * @param array $params The parameters for the pane * * @return string * * @since 3.1 */ public static function startTabSet($selector = 'myTab', $params = []) { $sig = md5(serialize([$selector, $params])); if (! isset(static::$loaded[__METHOD__][$sig])) { // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['active'] = (isset($params['active']) && ($params['active'])) ? (string) $params['active'] : ''; Factory::getDocument()->addScriptOptions('bootstrap.tabs', [$selector => $opt]); // Set static array static::$loaded[__METHOD__][$sig] = true; static::$loaded[__METHOD__][$selector]['active'] = $opt['active']; } return LayoutHelper::render('libraries.cms.html.bootstrap.starttabset', ['selector' => $selector]); } /** * Close the current tab pane * * @return string HTML to close the pane * * @since 3.1 */ public static function endTabSet() { return LayoutHelper::render('libraries.cms.html.bootstrap.endtabset'); } /** * Begins the display of a new tab content panel. * * @param string $selector Identifier of the panel. * @param string $id The ID of the div element * @param string $title The title text for the new UL tab * * @return string HTML to start a new panel * * @since 3.1 */ public static function addTab($selector, $id, $title) { static $tabScriptLayout = null; static $tabLayout = null; $tabScriptLayout = $tabScriptLayout === null ? new FileLayout('libraries.cms.html.bootstrap.addtabscript') : $tabScriptLayout; $tabLayout = $tabLayout === null ? new FileLayout('libraries.cms.html.bootstrap.addtab') : $tabLayout; $active = (static::$loaded['HTMLHelperBootstrap::startTabSet'][$selector]['active'] == $id) ? ' active' : ''; // Inject tab into UL Factory::getDocument() ->addScriptDeclaration($tabScriptLayout->render(['selector' => $selector, 'id' => $id, 'active' => $active, 'title' => $title])); return $tabLayout->render(['id' => $id, 'active' => $active, 'title' => $title]); } /** * Close the current tab content panel * * @return string HTML to close the pane * * @since 3.1 */ public static function endTab() { return LayoutHelper::render('libraries.cms.html.bootstrap.endtab'); } /** * Loads CSS files needed by Bootstrap * * @param boolean $includeMainCss If true, main bootstrap.css files are loaded * @param string $direction rtl or ltr direction. If empty, ltr is assumed * @param array $attribs Optional array of attributes to be passed to HTMLHelper::_('stylesheet') * * @return void * * @since 3.0 */ public static function loadCss($includeMainCss = true, $direction = 'ltr', $attribs = []) { // Load Bootstrap main CSS if ($includeMainCss) { HTMLHelper::_('stylesheet', 'vendor/bootstrap/bootstrap.min.css', ['version' => 'auto', 'relative' => true], $attribs); } /** * BOOTSTRAP RTL - WILL SORT OUT LATER DOWN THE LINE * Load Bootstrap RTL CSS * if ($direction === 'rtl') * { * HTMLHelper::_('stylesheet', 'jui/bootstrap-rtl.css', array('version' => 'auto', 'relative' => true), $attribs); * } */ } } PKAA#]:�B��*system/helix3/assets/css/system.j3.min.cssnu�[���#sbox-window { width: 80% !important; left: 50% !important; transform: translateX(-50%); } @media (max-width: 767px) { #sbox-window { width: calc(100vw - 40px) !important; } } #sbox-content > iframe { width: 100%; } .com-media .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgb(0 0 0 / 5%); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgb(0 0 0 / 5%); } .com-media #folderlist + .chzn-container { width: 300px !important; } .com-media .row-fluid { display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; margin-right: -15px; margin-left: -15px; box-sizing: border-box; } .com-media .row-fluid [class*="span"] { position: relative; width: 100%; padding-right: 15px; padding-left: 15px; box-sizing: border-box; } .com-media .span12 { flex-basis: 100%; } .com-media .span11 { flex-basis: 91.48936170212765%; } .com-media .span10 { flex-basis: 82.97872340425532%; } .com-media .span9 { flex-basis: 74.46808510638297%; } .com-media .span8 { flex-basis: 65.95744680851064%; } .com-media .span7 { flex-basis: 57.44680851063829%; } .com-media .span6 { flex-basis: 48.93617021276595%; } .com-media .span5 { flex-basis: 40.42553191489362%; } .com-media .span4 { flex-basis: 31.914893617021278%; } .com-media .span3 { flex-basis: 23.404255319148934%; } .com-media .span2 { flex-basis: 14.893617021276595%; } .com-media .span1 { flex-basis: 6.382978723404255%; } .com-media .thumbnails { list-style: none; padding: 0; margin: -7.5px; display: flex; flex-wrap: wrap; } .com-media .thumbnails-media .thumbnail { display: block; background-color: #f4f4f4; border-radius: 3px; border: 0; padding: 0px; height: 100px; width: 100px; margin: 7.5px; position: relative; text-align: center; overflow: hidden; margin-bottom: 18px; box-shadow: 0 0 0 1px rgb(0 0 0 / 5%) inset; } .com-media .height-50 { height: 50px; } .com-media .thumbnails-media .thumbnail .imgFolder span { line-height: 90px; font-size: 38px; margin: 0; width: auto; } .com-media .thumbnails-media .thumbnail .icon-folder, .com-media .thumbnails-media .thumbnail .icon-folder-2 { width: 30px; height: 20px; display: inline-block; margin: auto; position: relative; background-color: #708090; border-radius: 0 3px 3px 3px; margin-bottom: -8px; margin-top: 12px; } .com-media .thumbnails-media .thumbnail .icon-folder:before, .com-media .thumbnails-media .thumbnail .icon-folder-2:before { content: ""; width: 50%; height: 0.2em; border-radius: 0 20px 0 0; background-color: #708090; position: absolute; top: -0.2em; left: 0px; } .com-media .thumbnails-media .thumbnail .small { position: absolute; left: 1px; background-color: #fff; border-color: rgba(0, 0, 0, 0.2); bottom: 1px; line-height: 26px; border: 1px solid rgba(0, 0, 0, 0.1); border-width: 1px 1px 0 0; border-radius: 0 4px 0 4px; z-index: 1; padding: 0 5px; line-height: 20px; color: #555; } .com-media .thumbnails-media .thumbnail .img-preview img { width: auto; max-width: 100%; } .com-media .thumbnails-media .thumbnail > div:first-child { position: relative; z-index: 1; width: 100%; display: inline-block; } .com-media .thumbnails-media .thumbnail .selected > div:first-child:before { content: ""; position: absolute; top: 0; left: 0; right: 0; bottom: 0; border: 3px solid #46a546; border-radius: 3px; z-index: 4; } .com-media .thumbnails-media .thumbnail .selected > div:first-child:after { font-family: "Font Awesome 5 Free"; font-weight: 700; content: "\f00c"; position: absolute; top: 0; right: 0; background-color: #46a546; color: #fff; line-height: 26px; width: 26px; border-color: rgba(0, 0, 0, 0.2); box-shadow: 0 1px 2px rgb(0 0 0 / 5%); border-radius: 0 3px; } PKAA#]/��HH&system/helix3/assets/css/spgallery.cssnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ .sp-gallery-items { list-style: none; padding: 0; margin: -5px; padding-bottom: 20px; } .sp-gallery-items:empty { display: none; } .sp-gallery-items > li { width: 100px; height: 100px; display: block; margin: 5px; background: #f5f5f5; padding: 5px; border: 1px solid #e5e5e5; float: left; position: relative; -webkit-transition: background-color 400ms; transition: background-color 400ms; } .sp-gallery-items > li:hover { cursor: move; background: #e5e5e5; border-color: #e5e5e5; } .sp-gallery-items > li > .btn-remove-image { position: absolute; top: 10px; right: 10px; display: none; } .sp-gallery-items > li:hover > .btn-remove-image { display: inline-block; } .sp-gallery-items img { display: block; height: 100%; width: 100%; } .sp-gallery-items .sp-gallery-item-loader { line-height: 100px; text-align: center; font-size: 24px; } PKAA#]�8�yy-system/helix3/assets/css/font-awesome.min.cssnu�[���/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} PKAA#]$ �GG*system/helix3/assets/css/system.j4.min.cssnu�[���:root { --hue: 214; --template-bg-light: #f0f4fb; --template-text-dark: #495057; --template-text-light: #fff; --template-link-color: #2a69b8; --template-special-color: #001b4c; --template-bg-dark: hsl(var(--hue), 40%, 20%); --template-bg-dark-3: hsl(var(--hue), 40%, 97%); --template-bg-dark-5: hsl(var(--hue), 40%, 95%); --template-bg-dark-7: hsl(var(--hue), 40%, 93%); --template-bg-dark-10: hsl(var(--hue), 40%, 90%); --template-bg-dark-15: hsl(var(--hue), 40%, 85%); --template-bg-dark-20: hsl(var(--hue), 40%, 80%); --template-bg-dark-30: hsl(var(--hue), 40%, 70%); --template-bg-dark-40: hsl(var(--hue), 40%, 60%); --template-bg-dark-50: hsl(var(--hue), 40%, 50%); --template-bg-dark-60: hsl(var(--hue), 40%, 40%); --template-bg-dark-65: hsl(var(--hue), 40%, 35%); --template-bg-dark-70: hsl(var(--hue), 40%, 30%); --template-bg-dark-75: hsl(var(--hue), 40%, 25%); --template-bg-dark-80: hsl(var(--hue), 40%, 20%); --template-bg-dark-90: hsl(var(--hue), 40%, 10%); } /* js tools */ .js-stools-container-bar { padding: 10px 20px; } .js-stools-container-bar .btn-toolbar { justify-content: flex-end; } .js-stools-container-bar .btn-toolbar > * { margin: 4px 0; margin-inline-end: 8px; } .js-stools-container-bar .btn-toolbar .js-stools-btn-clear { background-color: #1e95cc; border: 0; } .js-stools-container-bar .ordering-select { display: flex; } .js-stools-container-filters { display: none; padding: 0 20px; margin-bottom: 20px; } .js-stools-container-filters-visible { display: grid; grid-gap: 8px; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); padding: 10px; background-color: #fff; } .js-stools-container-filters > * { margin: 4px 0; margin-inline-end: 8px; } .js-stools-field-list + .js-stools-field-list { margin-inline-start: 8px; } /* Tooltip */ [role="tooltip"]:not(.show) { right: 5em; z-index: 9999; display: none; max-width: 100%; padding: 0.5em; margin: 0.5em; color: #000; text-align: start; background: #fff; border: 1px solid #e5e5e5; border-radius: 4px; box-shadow: 0 0 0.5rem rgba(0, 0, 0, 0.8); } [role="tooltip"]:not(.show)[id^="editarticle-"] { right: auto; margin-inline-start: -10em; } [role="tooltip"]:not(.show)[id^="editcontact-"] { right: auto; margin-inline-start: -10em; } :focus + [role="tooltip"], :hover + [role="tooltip"] { position: absolute; display: block; } /* toolbar */ .subhead { position: sticky; top: 0; right: 0; left: 0; z-index: 1000; width: auto; min-height: 43px; padding: 8px 1rem; color: #0c192e; background: #fff; background-image: linear-gradient(var(--toolbar-bg), var(--template-bg-dark-3)); box-shadow: 0 2px 10px -8px var(--template-bg-dark-50); } .subhead .row { margin-right: 0; margin-left: 0; } .subhead.noshadow { box-shadow: none; } .subhead joomla-toolbar-button, .subhead .btn-group { margin-inline-start: 0.75rem; } .subhead joomla-toolbar-button:first-child, .subhead .btn-group:first-child { margin-inline-start: 0; } .subhead joomla-toolbar-button .btn > span, .subhead joomla-toolbar-button .dropdown-item > span { margin-inline-end: 0.5rem; width: 1.25em; text-align: center; } .subhead .btn { --subhead-btn-accent: var(--template-text-dark); padding: 0 1rem; margin: 5px 0; font-size: 1rem; line-height: 2.45rem; color: var(--template-text-dark); background: #fff; border-color: #adb5bd; } .subhead .btn > span { display: inline-block; color: var(--subhead-btn-accent); } .subhead .btn:not([disabled]):hover, .subhead .btn:not([disabled]):active, .subhead .btn:not([disabled]):focus { color: rgba(255, 255, 255, 0.9); background-color: var(--subhead-btn-accent); border-color: var(--subhead-btn-accent); } .subhead .btn:not([disabled]):hover > span, .subhead .btn:not([disabled]):active > span, .subhead .btn:not([disabled]):focus > span { color: rgba(255, 255, 255, 0.9); } .subhead .btn.btn-success { --subhead-btn-accent: #198754; } .subhead .btn.btn-danger { --subhead-btn-accent: #dc3545; } .subhead .btn.btn-primary { --subhead-btn-accent: var(--template-link-color); } .subhead .btn.btn-secondary { --subhead-btn-accent: var(--template-special-color); } .subhead .btn.btn-info { --subhead-btn-accent: var(--template-bg-dark); } .subhead .btn.btn-action { --subhead-btn-accent: var(--template-bg-dark); display: flex; align-items: center; } .subhead .btn.btn-action::after { width: 2.375rem; font-family: "Font Awesome 5 Free"; font-weight: 900; content: "\f078"; border: 0; } .subhead .btn[disabled], .subhead .btn.dropdown-toggle[disabled] { --subhead-btn-accent: var(--template-bg-dark); background: rgba(222, 226, 230, 0.8); opacity: 0.5; } .subhead .btn[disabled]:hover, .subhead .btn.dropdown-toggle[disabled]:hover, .subhead .btn[disabled]:active, .subhead .btn.dropdown-toggle[disabled]:active, .subhead .btn[disabled]:focus, .subhead .btn.dropdown-toggle[disabled]:focus { cursor: not-allowed; } .subhead .dropdown-toggle.btn { padding-inline-end: 0; } .subhead .btn-group:not(:last-child) > .dropdown-toggle-split { order: 1; margin-inline-start: -5px; } [dir="ltr"] .subhead .btn-group:not(:last-child) > .dropdown-toggle-split { border-radius: 0 5px 5px 0; } [dir="rtl"] .subhead .btn-group:not(:last-child) > .dropdown-toggle-split { border-radius: 5px 0 0 5px; } .subhead .dropdown-menu joomla-toolbar-button, .subhead .btn-group joomla-toolbar-button { margin-inline-start: 0; } .contentpane .subhead { margin: -15px -15px 0; background-image: none; border-bottom: 1px solid var(--template-bg-dark-7); } @media (min-width: 576px) and (max-width: 767.98px) { joomla-tab[view="accordion"] .col-md-9, joomla-tab[view="accordion"] .col-md-3 { padding: 0.5rem 1rem !important; } #myTab { margin-top: 1rem; margin-bottom: 1.5rem; } joomla-tab[view="accordion"] ul li { width: 100%; } .toggler-toolbar { top: 0; bottom: auto; z-index: 1030; padding: 7px 10px; margin: 5px; background-color: var(--template-bg-dark); border-radius: 30px; } .toggler-toolbar .toggler-toolbar-icon::before { font: normal normal 900 28px/1 "Font Awesome 5 Free"; color: var(--toggle-color); content: "\f00d"; } .toggler-toolbar.collapsed .toggler-toolbar-icon::before { content: "\f085"; } .subhead { padding-right: 0; padding-left: 0; } .subhead joomla-toolbar-button, .subhead .btn-group, .subhead .btn { width: 100%; margin-left: 0; text-align: left; } .subhead .btn-toolbar > .btn-group, .subhead .btn-toolbar > joomla-toolbar-button { margin-left: 0; } .subhead .btn.btn-action::after { text-align: center; margin-inline-start: auto; } .subhead .dropdown-toggle-split { width: auto; } } /* Misc */ .joomla-modal { position: fixed !important; z-index: 99991 !important; } .joomla-modal iframe { width: 100%; } .joomla-modal iframe body { position: relative; display: flex; flex-direction: column; min-height: 100vh; } .modal-dialog.jviewport-width80 { width: 80vw; max-width: none; } .jviewport-height70 { height: 70vh; } [class*="jviewport-height"] iframe { height: 100%; } .hidden { display: none; } /* Choice JS */ .choices { position: relative; margin-bottom: 24px; font-size: 16px; } .choices:focus { outline: none; } .choices:last-child { margin-bottom: 0; } .choices.is-disabled .choices__inner, .choices.is-disabled .choices__input { background-color: #eaeaea; cursor: not-allowed; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .choices.is-disabled .choices__item { cursor: not-allowed; } .choices [hidden] { display: none !important; } .choices[data-type*="select-one"] { cursor: pointer; } .choices[data-type*="select-one"] .choices__inner { padding-bottom: 7.5px; } .choices[data-type*="select-one"] .choices__input { display: block; width: 100%; padding: 10px; border-bottom: 1px solid #dddddd; background-color: #ffffff; margin: 0; } .choices[data-type*="select-one"] .choices__button { background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==); padding: 0; background-size: 8px; position: absolute; top: 50%; right: 0; margin-top: -10px; margin-right: 25px; height: 20px; width: 20px; border-radius: 10em; opacity: 0.5; } .choices[data-type*="select-one"] .choices__button:hover, .choices[data-type*="select-one"] .choices__button:focus { opacity: 1; } .choices[data-type*="select-one"] .choices__button:focus { box-shadow: 0px 0px 0px 2px #00bcd4; } .choices[data-type*="select-one"] .choices__item[data-value=""] .choices__button { display: none; } .choices[data-type*="select-one"]:after { content: ""; height: 0; width: 0; border-style: solid; border-color: #333333 transparent transparent transparent; border-width: 5px; position: absolute; right: 11.5px; top: 50%; margin-top: -2.5px; pointer-events: none; } .choices[data-type*="select-one"].is-open:after { border-color: transparent transparent #333333 transparent; margin-top: -7.5px; } .choices[data-type*="select-one"][dir="rtl"]:after { left: 11.5px; right: auto; } .choices[data-type*="select-one"][dir="rtl"] .choices__button { right: auto; left: 0; margin-left: 25px; margin-right: 0; } .choices[data-type*="select-multiple"] .choices__inner, .choices[data-type*="text"] .choices__inner { cursor: text; } .choices[data-type*="select-multiple"] .choices__button, .choices[data-type*="text"] .choices__button { position: relative; display: inline-block; margin-top: 0; margin-right: -4px; margin-bottom: 0; margin-left: 8px; padding-left: 16px; border-left: 1px solid #008fa1; background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==); background-size: 8px; width: 8px; line-height: 1; opacity: 0.75; border-radius: 0; } .choices[data-type*="select-multiple"] .choices__button:hover, .choices[data-type*="select-multiple"] .choices__button:focus, .choices[data-type*="text"] .choices__button:hover, .choices[data-type*="text"] .choices__button:focus { opacity: 1; } .choices__inner { display: inline-block; vertical-align: top; width: 100%; background-color: #f9f9f9; padding: 7.5px 7.5px 3.75px; border: 1px solid #dddddd; border-radius: 2.5px; font-size: 14px; min-height: 44px; overflow: hidden; } .is-focused .choices__inner, .is-open .choices__inner { border-color: #b7b7b7; } .is-open .choices__inner { border-radius: 2.5px 2.5px 0 0; } .is-flipped.is-open .choices__inner { border-radius: 0 0 2.5px 2.5px; } .choices__list { margin: 0; padding-left: 0; list-style: none; } .choices__list--single { display: inline-block; padding: 4px 16px 4px 4px; width: 100%; } [dir="rtl"] .choices__list--single { padding-right: 4px; padding-left: 16px; } .choices__list--single .choices__item { width: 100%; } .choices__list--multiple { display: inline; } .choices__list--multiple .choices__item { display: inline-block; vertical-align: middle; border-radius: 20px; padding: 4px 10px; font-size: 12px; font-weight: 500; margin-right: 3.75px; margin-bottom: 3.75px; background-color: #00bcd4; border: 1px solid #00a5bb; color: #ffffff; word-break: break-all; box-sizing: border-box; } .choices__list--multiple .choices__item[data-deletable] { padding-right: 5px; } [dir="rtl"] .choices__list--multiple .choices__item { margin-right: 0; margin-left: 3.75px; } .choices__list--multiple .choices__item.is-highlighted { background-color: #00a5bb; border: 1px solid #008fa1; } .is-disabled .choices__list--multiple .choices__item { background-color: #aaaaaa; border: 1px solid #919191; } .choices__list--dropdown { visibility: hidden; z-index: 1; position: absolute; width: 100%; background-color: #ffffff; border: 1px solid #dddddd; top: 100%; margin-top: -1px; border-bottom-left-radius: 2.5px; border-bottom-right-radius: 2.5px; overflow: hidden; word-break: break-all; will-change: visibility; } .choices__list--dropdown.is-active { visibility: visible; } .is-open .choices__list--dropdown { border-color: #b7b7b7; } .is-flipped .choices__list--dropdown { top: auto; bottom: 100%; margin-top: 0; margin-bottom: -1px; border-radius: 0.25rem 0.25rem 0 0; } .choices__list--dropdown .choices__list { position: relative; max-height: 300px; overflow: auto; -webkit-overflow-scrolling: touch; will-change: scroll-position; } .choices__list--dropdown .choices__item { position: relative; padding: 10px; font-size: 14px; } [dir="rtl"] .choices__list--dropdown .choices__item { text-align: right; } @media (min-width: 640px) { .choices__list--dropdown .choices__item--selectable { padding-right: 100px; } .choices__list--dropdown .choices__item--selectable:after { content: attr(data-select-text); font-size: 12px; opacity: 0; position: absolute; right: 10px; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); } [dir="rtl"] .choices__list--dropdown .choices__item--selectable { text-align: right; padding-left: 100px; padding-right: 10px; } [dir="rtl"] .choices__list--dropdown .choices__item--selectable:after { right: auto; left: 10px; } } .choices__list--dropdown .choices__item--selectable.is-highlighted { background-color: #f2f2f2; } .choices__list--dropdown .choices__item--selectable.is-highlighted:after { opacity: 0.5; } .choices__item { cursor: default; } .choices__item--selectable { cursor: pointer; } .choices__item--disabled { cursor: not-allowed; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; opacity: 0.5; } .choices__heading { font-weight: 600; font-size: 12px; padding: 10px; border-bottom: 1px solid #f7f7f7; color: gray; } .choices__button { text-indent: -9999px; -webkit-appearance: none; -moz-appearance: none; appearance: none; border: 0; background-color: transparent; background-repeat: no-repeat; background-position: center; cursor: pointer; } .choices__button:focus { outline: none; } .choices__input { display: inline-block; vertical-align: baseline; background-color: #f9f9f9; font-size: 14px; margin-bottom: 5px; border: 0; border-radius: 0; max-width: 100%; padding: 4px 0 4px 2px; } .choices__input:focus { outline: 0; } [dir="rtl"] .choices__input { padding-right: 2px; padding-left: 0; } .choices__placeholder { opacity: 0.5; } /*===== End of Choices ======*/ .choices { border: 0; border-radius: 0.25rem; } .choices:hover { cursor: pointer; } .choices.is-focused { box-shadow: 0 0 0 0.2rem rgba(0, 0, 0, 0.1); } .choices__inner { padding: 0.4rem 1rem; margin-bottom: 0; font-size: 1rem; border: solid 1px #ced4da; border-radius: 0.25rem; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .is-focused .choices__inner { border-color: #000; } .choices__input { padding: 0; margin-bottom: 0; font-size: 1rem; background-color: transparent; } .choices__input::-moz-placeholder { color: #484f56; opacity: 1; } .choices__input::-webkit-input-placeholder { color: #484f56; opacity: 1; } .choices__list--dropdown { z-index: 1060; } .choices__list--multiple .choices__item { position: relative; margin: 2px; background-color: var(--template-link-color); -webkit-margin-end: 2px; margin-inline-end: 2px; border: 0; border-radius: 0.25rem; } .choices__list--multiple .choices__item.is-highlighted { background-color: var(--template-link-color); opacity: 0.9; } .choices .choices__list--dropdown .choices__item { -webkit-padding-end: 10px; padding-inline-end: 10px; } .choices .choices__list--dropdown .choices__item--selectable::after { display: none; } .choices__button_joomla { position: relative; padding: 0 10px; color: inherit; text-indent: -9999px; cursor: pointer; background: none; border: 0; opacity: 0.5; -webkit-appearance: none; -moz-appearance: none; appearance: none; } .choices__button_joomla::before { position: absolute; top: 0; right: 0; bottom: 0; left: 0; display: block; text-align: center; text-indent: 0; content: "×"; } .choices__button_joomla:hover, .choices__button_joomla:focus { opacity: 1; } .choices__button_joomla:focus { outline: none; } .choices[data-type*="select-one"] .choices__inner, .choices[data-type*="select-multiple"] .choices__inner { -webkit-padding-end: 3rem; padding-inline-end: 3rem; cursor: pointer; background: url("../../../images/select-bg.svg") no-repeat 100%/116rem; background-color: #eaedf0; } [dir="rtl"] .choices[data-type*="select-one"] .choices__inner, [dir="rtl"] .choices[data-type*="select-multiple"] .choices__inner { background: url("../../../images/select-bg-rtl.svg") no-repeat 0/116rem; background-color: #eaedf0; } .choices[data-type*="select-one"] .choices__item { display: flex; justify-content: space-between; } .choices[data-type*="select-one"] .choices__button_joomla { position: absolute; top: 50%; right: 0; width: 20px; height: 20px; padding: 0; margin-top: -10px; margin-right: 50px; border-radius: 10em; opacity: 0.5; } [dir="rtl"] .choices[data-type*="select-one"] .choices__button_joomla { right: auto; left: 0; margin-right: 0; margin-left: 50px; } .choices[data-type*="select-one"] .choices__button_joomla:hover, .choices[data-type*="select-one"] .choices__button_joomla:focus { opacity: 1; } .choices[data-type*="select-one"] .choices__button_joomla:focus { box-shadow: 0 0 0 2px #00bcd4; } .choices[data-type*="select-one"]::after { display: none; } .choices[data-type*="select-multiple"] .choices__input, .choices[data-type*="text"] .choices__input { padding: 0.2rem 0; } .choices__heading { font-size: 1.2rem; } PKAA#]�"0cWcW&system/helix3/assets/css/bootstrap.cssnu�[���/*! * Bootstrap v3.1.1 (http://getbootstrap.com) * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.0 | MIT License | git.io/normalize */ /* Bootstrap 3 class with prefix */ .sp-row * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .sp-row:before, .sp-row:after { content: " "; display: table; } .sp-row:after { clear: both; } .sp-row { margin-left: -5px; margin-right: -5px; } .sp-col-xs-1, .sp-col-sm-1, .sp-col-md-1, .sp-col-lg-1, .sp-col-xs-2, .sp-col-sm-2, .sp-col-md-2, .sp-col-lg-2, .sp-col-xs-3, .sp-col-sm-3, .sp-col-md-3, .sp-col-lg-3, .sp-col-xs-4, .sp-col-sm-4, .sp-col-md-4, .sp-col-lg-4, .sp-col-xs-5, .sp-col-sm-5, .sp-col-md-5, .sp-col-lg-5, .sp-col-xs-6, .sp-col-sm-6, .sp-col-md-6, .sp-col-lg-6, .sp-col-xs-7, .sp-col-sm-7, .sp-col-md-7, .sp-col-lg-7, .sp-col-xs-8, .sp-col-sm-8, .sp-col-md-8, .sp-col-lg-8, .sp-col-xs-9, .sp-col-sm-9, .sp-col-md-9, .sp-col-lg-9, .sp-col-xs-10, .sp-col-sm-10, .sp-col-md-10, .sp-col-lg-10, .sp-col-xs-11, .sp-col-sm-11, .sp-col-md-11, .sp-col-lg-11, .sp-col-xs-12, .sp-col-sm-12, .sp-col-md-12, .sp-col-lg-12 { position: relative; min-height: 1px; padding-left: 5px; padding-right: 5px; } .sp-col-xs-1, .sp-col-xs-2, .sp-col-xs-3, .sp-col-xs-4, .sp-col-xs-5, .sp-col-xs-6, .sp-col-xs-7, .sp-col-xs-8, .sp-col-xs-9, .sp-col-xs-10, .sp-col-xs-11, .sp-col-xs-12 { float: left; } .sp-col-xs-12 { width: 100%; } .sp-col-xs-11 { width: 91.66666667%; } .sp-col-xs-10 { width: 83.33333333%; } .sp-col-xs-9 { width: 75%; } .sp-col-xs-8 { width: 66.66666667%; } .sp-col-xs-7 { width: 58.33333333%; } .sp-col-xs-6 { width: 50%; } .sp-col-xs-5 { width: 41.66666667%; } .sp-col-xs-4 { width: 33.33333333%; } .sp-col-xs-3 { width: 25%; } .sp-col-xs-2 { width: 16.66666667%; } .sp-col-xs-1 { width: 8.33333333%; } .sp-col-xs-pull-12 { right: 100%; } .sp-col-xs-pull-11 { right: 91.66666667%; } .sp-col-xs-pull-10 { right: 83.33333333%; } .sp-col-xs-pull-9 { right: 75%; } .sp-col-xs-pull-8 { right: 66.66666667%; } .sp-col-xs-pull-7 { right: 58.33333333%; } .sp-col-xs-pull-6 { right: 50%; } .sp-col-xs-pull-5 { right: 41.66666667%; } .sp-col-xs-pull-4 { right: 33.33333333%; } .sp-col-xs-pull-3 { right: 25%; } .sp-col-xs-pull-2 { right: 16.66666667%; } .sp-col-xs-pull-1 { right: 8.33333333%; } .sp-col-xs-pull-0 { right: auto; } .sp-col-xs-push-12 { left: 100%; } .sp-col-xs-push-11 { left: 91.66666667%; } .sp-col-xs-push-10 { left: 83.33333333%; } .sp-col-xs-push-9 { left: 75%; } .sp-col-xs-push-8 { left: 66.66666667%; } .sp-col-xs-push-7 { left: 58.33333333%; } .sp-col-xs-push-6 { left: 50%; } .sp-col-xs-push-5 { left: 41.66666667%; } .sp-col-xs-push-4 { left: 33.33333333%; } .sp-col-xs-push-3 { left: 25%; } .sp-col-xs-push-2 { left: 16.66666667%; } .sp-col-xs-push-1 { left: 8.33333333%; } .sp-col-xs-push-0 { left: auto; } .sp-col-xs-offset-12 { margin-left: 100%; } .sp-col-xs-offset-11 { margin-left: 91.66666667%; } .sp-col-xs-offset-10 { margin-left: 83.33333333%; } .sp-col-xs-offset-9 { margin-left: 75%; } .sp-col-xs-offset-8 { margin-left: 66.66666667%; } .sp-col-xs-offset-7 { margin-left: 58.33333333%; } .sp-col-xs-offset-6 { margin-left: 50%; } .sp-col-xs-offset-5 { margin-left: 41.66666667%; } .sp-col-xs-offset-4 { margin-left: 33.33333333%; } .sp-col-xs-offset-3 { margin-left: 25%; } .sp-col-xs-offset-2 { margin-left: 16.66666667%; } .sp-col-xs-offset-1 { margin-left: 8.33333333%; } .sp-col-xs-offset-0 { margin-left: 0%; } @media (min-width: 768px) { .sp-col-sm-1, .sp-col-sm-2, .sp-col-sm-3, .sp-col-sm-4, .sp-col-sm-5, .sp-col-sm-6, .sp-col-sm-7, .sp-col-sm-8, .sp-col-sm-9, .sp-col-sm-10, .sp-col-sm-11, .sp-col-sm-12 { float: left; } .sp-col-sm-12 { width: 100%; } .sp-col-sm-11 { width: 91.66666667%; } .sp-col-sm-10 { width: 83.33333333%; } .sp-col-sm-9 { width: 75%; } .sp-col-sm-8 { width: 66.66666667%; } .sp-col-sm-7 { width: 58.33333333%; } .sp-col-sm-6 { width: 50%; } .sp-col-sm-5 { width: 41.66666667%; } .sp-col-sm-4 { width: 33.33333333%; } .sp-col-sm-3 { width: 25%; } .sp-col-sm-2 { width: 16.66666667%; } .sp-col-sm-1 { width: 8.33333333%; } .sp-col-sm-pull-12 { right: 100%; } .sp-col-sm-pull-11 { right: 91.66666667%; } .sp-col-sm-pull-10 { right: 83.33333333%; } .sp-col-sm-pull-9 { right: 75%; } .sp-col-sm-pull-8 { right: 66.66666667%; } .sp-col-sm-pull-7 { right: 58.33333333%; } .sp-col-sm-pull-6 { right: 50%; } .sp-col-sm-pull-5 { right: 41.66666667%; } .sp-col-sm-pull-4 { right: 33.33333333%; } .sp-col-sm-pull-3 { right: 25%; } .sp-col-sm-pull-2 { right: 16.66666667%; } .sp-col-sm-pull-1 { right: 8.33333333%; } .sp-col-sm-pull-0 { right: auto; } .sp-col-sm-push-12 { left: 100%; } .sp-col-sm-push-11 { left: 91.66666667%; } .sp-col-sm-push-10 { left: 83.33333333%; } .sp-col-sm-push-9 { left: 75%; } .sp-col-sm-push-8 { left: 66.66666667%; } .sp-col-sm-push-7 { left: 58.33333333%; } .sp-col-sm-push-6 { left: 50%; } .sp-col-sm-push-5 { left: 41.66666667%; } .sp-col-sm-push-4 { left: 33.33333333%; } .sp-col-sm-push-3 { left: 25%; } .sp-col-sm-push-2 { left: 16.66666667%; } .sp-col-sm-push-1 { left: 8.33333333%; } .sp-col-sm-push-0 { left: auto; } .sp-col-sm-offset-12 { margin-left: 100%; } .sp-col-sm-offset-11 { margin-left: 91.66666667%; } .sp-col-sm-offset-10 { margin-left: 83.33333333%; } .sp-col-sm-offset-9 { margin-left: 75%; } .sp-col-sm-offset-8 { margin-left: 66.66666667%; } .sp-col-sm-offset-7 { margin-left: 58.33333333%; } .sp-col-sm-offset-6 { margin-left: 50%; } .sp-col-sm-offset-5 { margin-left: 41.66666667%; } .sp-col-sm-offset-4 { margin-left: 33.33333333%; } .sp-col-sm-offset-3 { margin-left: 25%; } .sp-col-sm-offset-2 { margin-left: 16.66666667%; } .sp-col-sm-offset-1 { margin-left: 8.33333333%; } .sp-col-sm-offset-0 { margin-left: 0%; } } @media (min-width: 992px) { .sp-col-md-1, .sp-col-md-2, .sp-col-md-3, .sp-col-md-4, .sp-col-md-5, .sp-col-md-6, .sp-col-md-7, .sp-col-md-8, .sp-col-md-9, .sp-col-md-10, .sp-col-md-11, .sp-col-md-12 { float: left; } .sp-col-md-12 { width: 100%; } .sp-col-md-11 { width: 91.66666667%; } .sp-col-md-10 { width: 83.33333333%; } .sp-col-md-9 { width: 75%; } .sp-col-md-8 { width: 66.66666667%; } .sp-col-md-7 { width: 58.33333333%; } .sp-col-md-6 { width: 50%; } .sp-col-md-5 { width: 41.66666667%; } .sp-col-md-4 { width: 33.33333333%; } .sp-col-md-3 { width: 25%; } .sp-col-md-2 { width: 16.66666667%; } .sp-col-md-1 { width: 8.33333333%; } .sp-col-md-pull-12 { right: 100%; } .sp-col-md-pull-11 { right: 91.66666667%; } .sp-col-md-pull-10 { right: 83.33333333%; } .sp-col-md-pull-9 { right: 75%; } .sp-col-md-pull-8 { right: 66.66666667%; } .sp-col-md-pull-7 { right: 58.33333333%; } .sp-col-md-pull-6 { right: 50%; } .sp-col-md-pull-5 { right: 41.66666667%; } .sp-col-md-pull-4 { right: 33.33333333%; } .sp-col-md-pull-3 { right: 25%; } .sp-col-md-pull-2 { right: 16.66666667%; } .sp-col-md-pull-1 { right: 8.33333333%; } .sp-col-md-pull-0 { right: auto; } .sp-col-md-push-12 { left: 100%; } .sp-col-md-push-11 { left: 91.66666667%; } .sp-col-md-push-10 { left: 83.33333333%; } .sp-col-md-push-9 { left: 75%; } .sp-col-md-push-8 { left: 66.66666667%; } .sp-col-md-push-7 { left: 58.33333333%; } .sp-col-md-push-6 { left: 50%; } .sp-col-md-push-5 { left: 41.66666667%; } .sp-col-md-push-4 { left: 33.33333333%; } .sp-col-md-push-3 { left: 25%; } .sp-col-md-push-2 { left: 16.66666667%; } .sp-col-md-push-1 { left: 8.33333333%; } .sp-col-md-push-0 { left: auto; } .sp-col-md-offset-12 { margin-left: 100%; } .sp-col-md-offset-11 { margin-left: 91.66666667%; } .sp-col-md-offset-10 { margin-left: 83.33333333%; } .sp-col-md-offset-9 { margin-left: 75%; } .sp-col-md-offset-8 { margin-left: 66.66666667%; } .sp-col-md-offset-7 { margin-left: 58.33333333%; } .sp-col-md-offset-6 { margin-left: 50%; } .sp-col-md-offset-5 { margin-left: 41.66666667%; } .sp-col-md-offset-4 { margin-left: 33.33333333%; } .sp-col-md-offset-3 { margin-left: 25%; } .sp-col-md-offset-2 { margin-left: 16.66666667%; } .sp-col-md-offset-1 { margin-left: 8.33333333%; } .sp-col-md-offset-0 { margin-left: 0%; } } @media (min-width: 1200px) { .sp-col-lg-1, .sp-col-lg-2, .sp-col-lg-3, .sp-col-lg-4, .sp-col-lg-5, .sp-col-lg-6, .sp-col-lg-7, .sp-col-lg-8, .sp-col-lg-9, .sp-col-lg-10, .sp-col-lg-11, .sp-col-lg-12 { float: left; } .sp-col-lg-12 { width: 100%; } .sp-col-lg-11 { width: 91.66666667%; } .sp-col-lg-10 { width: 83.33333333%; } .sp-col-lg-9 { width: 75%; } .sp-col-lg-8 { width: 66.66666667%; } .sp-col-lg-7 { width: 58.33333333%; } .sp-col-lg-6 { width: 50%; } .sp-col-lg-5 { width: 41.66666667%; } .sp-col-lg-4 { width: 33.33333333%; } .sp-col-lg-3 { width: 25%; } .sp-col-lg-2 { width: 16.66666667%; } .sp-col-lg-1 { width: 8.33333333%; } .sp-col-lg-pull-12 { right: 100%; } .sp-col-lg-pull-11 { right: 91.66666667%; } .sp-col-lg-pull-10 { right: 83.33333333%; } .sp-col-lg-pull-9 { right: 75%; } .sp-col-lg-pull-8 { right: 66.66666667%; } .sp-col-lg-pull-7 { right: 58.33333333%; } .sp-col-lg-pull-6 { right: 50%; } .sp-col-lg-pull-5 { right: 41.66666667%; } .sp-col-lg-pull-4 { right: 33.33333333%; } .sp-col-lg-pull-3 { right: 25%; } .sp-col-lg-pull-2 { right: 16.66666667%; } .sp-col-lg-pull-1 { right: 8.33333333%; } .sp-col-lg-pull-0 { right: auto; } .sp-col-lg-push-12 { left: 100%; } .sp-col-lg-push-11 { left: 91.66666667%; } .sp-col-lg-push-10 { left: 83.33333333%; } .sp-col-lg-push-9 { left: 75%; } .sp-col-lg-push-8 { left: 66.66666667%; } .sp-col-lg-push-7 { left: 58.33333333%; } .sp-col-lg-push-6 { left: 50%; } .sp-col-lg-push-5 { left: 41.66666667%; } .sp-col-lg-push-4 { left: 33.33333333%; } .sp-col-lg-push-3 { left: 25%; } .sp-col-lg-push-2 { left: 16.66666667%; } .sp-col-lg-push-1 { left: 8.33333333%; } .sp-col-lg-push-0 { left: auto; } .sp-col-lg-offset-12 { margin-left: 100%; } .sp-col-lg-offset-11 { margin-left: 91.66666667%; } .sp-col-lg-offset-10 { margin-left: 83.33333333%; } .sp-col-lg-offset-9 { margin-left: 75%; } .sp-col-lg-offset-8 { margin-left: 66.66666667%; } .sp-col-lg-offset-7 { margin-left: 58.33333333%; } .sp-col-lg-offset-6 { margin-left: 50%; } .sp-col-lg-offset-5 { margin-left: 41.66666667%; } .sp-col-lg-offset-4 { margin-left: 33.33333333%; } .sp-col-lg-offset-3 { margin-left: 25%; } .sp-col-lg-offset-2 { margin-left: 16.66666667%; } .sp-col-lg-offset-1 { margin-left: 8.33333333%; } .sp-col-lg-offset-0 { margin-left: 0%; } } /*Bootstrap 3 class without prefix*/ .row * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .row:before, .row:after { content: " "; display: table; } .row:after { clear: both; } .row { margin-left: -5px; margin-right: -5px; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-left: 5px; padding-right: 5px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-pull-0 { right: auto; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-push-0 { left: auto; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-offset-0 { margin-left: 0%; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-pull-0 { right: auto; } .col-sm-push-12 { left: 100%; } .col-sm-push-11 { left: 91.66666667%; } .col-sm-push-10 { left: 83.33333333%; } .col-sm-push-9 { left: 75%; } .col-sm-push-8 { left: 66.66666667%; } .col-sm-push-7 { left: 58.33333333%; } .col-sm-push-6 { left: 50%; } .col-sm-push-5 { left: 41.66666667%; } .col-sm-push-4 { left: 33.33333333%; } .col-sm-push-3 { left: 25%; } .col-sm-push-2 { left: 16.66666667%; } .col-sm-push-1 { left: 8.33333333%; } .col-sm-push-0 { left: auto; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-offset-11 { margin-left: 91.66666667%; } .col-sm-offset-10 { margin-left: 83.33333333%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-8 { margin-left: 66.66666667%; } .col-sm-offset-7 { margin-left: 58.33333333%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-5 { margin-left: 41.66666667%; } .col-sm-offset-4 { margin-left: 33.33333333%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-2 { margin-left: 16.66666667%; } .col-sm-offset-1 { margin-left: 8.33333333%; } .col-sm-offset-0 { margin-left: 0%; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: auto; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: auto; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0%; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-pull-0 { right: auto; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-push-0 { left: auto; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-offset-0 { margin-left: 0%; } } PKAA#]}�ƻ ( (-system/helix3/assets/css/admin.general.j4.cssnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ /*Main Tab*/ .helix-options joomla-tab > div[role="tablist"] { border-radius: 0; padding-left: 20px; padding-right: 20px; background: #164d7d url(../images/helix-logo.png) no-repeat 100% 50%; border: 0; box-sizing: border-box; } .helix-options joomla-tab > div[role="tablist"] button[role="tab"] { background: none; padding: 25px 15px; line-height: 1; border: 0; border-radius: 0; margin: 0; color: #fff; } .helix-options joomla-tab > div[role="tablist"] button[role="tab"]:hover, .helix-options joomla-tab > div[role="tablist"] button[role="tab"][aria-expanded="true"] { font-weight: inherit; border-top: 5px solid #dbe4f0; background-color: #fff; color: #164d7d; padding: 20px 15px 25px; } .helix-options joomla-tab > div[role="tablist"] button[role="tab"]:after { display: none; } .helix-options joomla-tab > div[role="tablist"] button[role="tab"] i { display: inline-block; margin-right: 5px; } /* Remove fieldset */ .helix-options joomla-tab-element > fieldset { border: 0; padding: 0; } .helix-options joomla-tab-element > fieldset > legend { display: none; } /*Tab Common*/ .control-group.group-separator { border-top: 1px solid #dbe4f0; border-bottom: 1px solid #dbe4f0; padding: 20px 2vw; font-size: 14px; color: #000; line-height: 1; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; margin: 30px -2vw !important; } .control-group.group-separator span { display: block; margin-top: 5px; font-size: 12px; font-weight: normal; text-transform: none; color: #999; } .helix-options joomla-tab-element * > .control-group.group-separator:first-child { border-top: 0; padding-top: 0; margin-top: 0 !important; } .com_templates.view-style .input-append input { float: left; border-radius: 3px 0 0 3px; } .input-append button[type="button"] { float: left; } /* Layout Builder */ #attrib-layout > .control-group > .controls { margin-left: 0; } #attrib-layout > .control-group > .control-label { display: none; } #attrib-layout > div:first-child { margin: 30px 0 40px; } .layout-button-wrap { margin-left: 20px; } .layout-button-wrap .btn { margin-right: 10px; } .layoutbuilder-section { padding: 15px 0; margin-bottom: 30px; background: #f0f0f0; border-radius: 4px; position: relative; } .layoutbuilder-section * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .layoutbuilder-section *:before, .layoutbuilder-section *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .layoutbuilder-section .row { margin-left: 0px; margin-right: 0px; } .settings-section { padding: 0 15px 15px; } .settings-section .settings-left, .settings-section .settings-right { list-style: none; padding: 0; margin: 0; } .settings-section .settings-left a.row-move i { border-radius: 2px; background: #a8a9ad; color: #fff; padding: 5px; margin-right: 5px; } .settings-section .settings-left a { cursor: move; color: #000; } .settings-section .settings-left a:hover i { background: #0072bc; } .layout-column .column { background: #fff; border-radius: 4px; height: 54px; line-height: 54px; color: #000; padding: 0 15px; } .layout-column .column:hover { cursor: move; } .layout-column .column .col-title { margin: 0; font-size: 14px; line-height: 14px; font-weight: normal; display: inline-block; padding: 5px 10px; color: #888; margin-top: 15px; cursor: pointer; border-radius: 3px; } .layout-column .column a { font-size: 18px; color: #97989c; cursor: pointer; } .layout-column .column a:hover { color: #0072bc; } .layoutlist, .layout-button-wrap { float: left; } .com_templates.view-style .layoutlist select { display: inline-block; } /* Menu Assignment */ #assignment { padding: 15px; } #assignment #jform_menuselect-lbl, #assignment .btn-toolbar { display: inline-block; } #assignment .btn-toolbar { margin-right: 30px; } #menu-assignment { margin-top: 20px; } /*Button*/ .button-group { list-style: none; padding: 0; margin: 0; display: flex; } .button-group > li { display: inline-flex; position: relative; } .button-group > li > .btn { border-radius: 0; border-right-width: 0; padding: 2px 10px; border-width: 1px; border-right-width: 0; } .button-group > li:first-child > .btn { border-radius: 3px 0 0 3px; } .button-group > li:last-child > .btn { border-right-width: 1px; border-radius: 0 3px 3px 0; } .button-group > li > ul { list-style: none; padding: 0; margin: 0; position: absolute; top: -5px; right: 100%; width: 505px; padding: 10px 5px; background: #b3b3b3; border-radius: 3px; z-index: 999; text-align: center; display: none; } .button-group > li:hover > ul { display: block; } .arrange-column:hover .add-column { background: #36c77b; color: #fff; } .button-group > li > ul li { display: block; float: left; } .button-group > li > ul li a { text-align: left; display: block; padding: 0; margin: 0 2px; color: #fff; background-color: transparent; width: 29px; height: 17px; border: 0; border-radius: 0; background-repeat: no-repeat; background-position: 50%; -webkit-transition: background-color 400ms; transition: background-color 400ms; } .button-group > li > ul li a.column-layout-12 { background-image: url(../images/layout/12.png); } .button-group > li > ul li a.column-layout-3333 { background-image: url(../images/layout/3333.png); } .button-group > li > ul li a.column-layout-444 { background-image: url(../images/layout/444.png); } .button-group > li > ul li a.column-layout-66 { background-image: url(../images/layout/66.png); } .button-group > li > ul li a.column-layout-48 { background-image: url(../images/layout/48.png); } .button-group > li > ul li a.column-layout-39 { background-image: url(../images/layout/39.png); } .button-group > li > ul li a.column-layout-57 { background-image: url(../images/layout/57.png); } .button-group > li > ul li a.column-layout-363 { background-image: url(../images/layout/363.png); } .button-group > li > ul li a.column-layout-264 { background-image: url(../images/layout/264.png); } .button-group > li > ul li a.column-layout-210 { background-image: url(../images/layout/210.png); } .button-group > li > ul li a.column-layout-237 { background-image: url(../images/layout/237.png); } .button-group > li > ul li a.column-layout-282 { background-image: url(../images/layout/282.png); } .button-group > li > ul li a.column-layout-222222 { background-image: url(../images/layout/222222.png); } .button-group > li > ul li a.column-layout-255 { background-image: url(../images/layout/255.png); } .button-group > li > ul li a.column-layout-2442 { background-image: url(../images/layout/2442.png); } .button-group > li > ul li a.column-layout-custom { background-image: url(../images/layout/custom.png); } .button-group > li ul li a:hover, .button-group > li ul li a.active { background-color: rgba(0, 0, 0, 0.2); } /*Media*/ .controls .input-append .media-preview.add-on, .controls .input-prepend .media-preview.add-on { border: 0; background: none; display: block; float: none; padding: 0; margin-bottom: 20px; } .controls .modal.btn, .controls .button-select.btn { border-radius: 3px 0 0 3px; } .controls .media-preview + input[type="text"] { display: none; } /* Layout Builder */ #fieldset-layout .control-group .control-label { display: none; } /*Presets*/ .presets > div { display: block; padding: 5px; margin: 0 20px 20px 0; width: 120px; height: 80px; float: left; position: relative; cursor: pointer; } .presets > div label { margin: 0; } .presets .preset-title { position: absolute; left: 0; bottom: 0; font-size: 12px; line-height: 1; background: transparent; padding: 5px; color: #fff; text-transform: uppercase; letter-spacing: 2px; } .presets > div.active { -webkit-box-shadow: inset 0 0 0 5px rgba(0, 0, 0, 0.4); box-shadow: inset 0 0 0 5px rgba(0, 0, 0, 0.4); } .presets > div.active .preset-title { background: rgba(0, 0, 0, 0.4); color: #fff; padding: 5px 5px 0 0; left: 5px; bottom: 5px; } .com_templates.view-style .minicolors input[type="text"]:not(.minicolors) { width: 100%; padding-left: 30px; } /*Web Font*/ .webfont input[type="text"], .webfont input[type="number"], .webfont select { width: 100%; } .webfont-preview { margin-top: 10px; margin-bottom: 10px; } .font-update-success, .font-update-failed { margin-top: 10px; font-weight: bold; } .font-update-success { color: #51a351; } .font-update-failed { color: #bd362f; } /*Menu Assignment*/ #menu-assignment .thumbnail { height: 300px; overflow-y: scroll; } /*Others*/ .clr { clear: both; } /* Helix3 Footer Area */ .helix-footer-area { background: #164d78; padding: 40px 0; text-align: center; } .helix-footer-area .helix-logo-area { display: inline-block; width: 130px; height: 40px; background: url(../images/helix-logo.png) no-repeat; background-position: -20px; border: 0; text-indent: -9999px; } .helix-footer-area .template-version { background: #8dc63f; padding: 3px 8px; border-radius: 3px; font-size: 12px; font-weight: bold; color: #fff; } .helix-footer-area .help-links { padding-top: 20px; } .helix-footer-area .help-links a { color: #fff; margin-right: 7px; margin-left: 7px; display: inline-block; } /* Modal */ .sp-modal-header .close { box-sizing: content-box; width: 1em; height: 1em; padding: 0.25em 0.25em; color: #000; background: none; font-size: 16px; border: 0; border-radius: 0.25rem; opacity: 0.5; position: absolute; right: 10px; } /* Radio */ .controls .radio { display: flex; } .controls .radio > .form-check { margin-right: 16px; } /* Button */ .btn.btn-default { background-color: #f8f9fa; border-color: #f8f9fa; } PKAA#] ����+system/helix3/assets/css/menu.generator.cssnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ .megamenu { margin-bottom: 30px; } .sidebar-title { margin: 10 0; font-size: 14px; text-transform: uppercase; line-height: 1; } .modules-list { overflow-y: scroll; height: 400px; margin-bottom: 20px; } .draggable-module { display: block; background: #e5e5e5; padding: 8px 10px; margin-bottom: 3px; border-radius: 3px; cursor: move; position: relative; z-index: 99; transition: background-color 400ms; -webkit-transition: background-color 400ms; } .draggable-module.ui-draggable-dragging { width: 300px; background: #5bb75b; z-index: 99999; color: #fff; } .menu-section-state-highlight { background: #fff; border: 2px dashed #999; border-radius: 3px; margin-bottom: 10px; } .draggable-module:hover { background: #ccc; } .draggable-module .fa { display: block; float: right; font-size: 10px; line-height: 18px; color: #fff; height: 18px; width: 18px; text-align: center; border-radius: 2px; } .draggable-module .fa-arrows { background: #5bb75b; cursor: move; } .draggable-module .fa-remove { background: #da4f49; cursor: pointer; } .modules-list .fa-remove { display: none; } .modules-container .fa-arrows { display: none; } #megamenulayout { margin-left: 30px; background: #e5e5e5; padding: 10px; border-radius: 3px; } #megamenulayout .row-move { position: absolute; top: 0; left: -30px; cursor: move; } .menu-section { background: #ccc; padding: 10px; position: relative; margin-bottom: 10px; border-radius: 4px; } #megamenulayout .menu-section:last-child { margin-bottom: 0; } .menu-section .column { min-height: 40px; } .menu-section .column-items-wrap { background: #fff; padding: 10px; border-radius: 3px; } .menu-section .column-items-wrap h4 { margin: 0 0 10px; padding: 0; font-size: 14px; font-weight: bold; } .menu-section .column-items-wrap ul { list-style: none; padding: 0; margin: 0; } .menu-section .column-items-wrap ul li { display: block; padding: 7px 0; border-top: 1px solid #eee; } .menu-section .ui-state-highlight, .modules-container:empty { border: 2px dashed #999; border-radius: 3px; height: 40px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; -o-box-sizing: border-box; box-sizing: border-box; } .modules-container:empty:after { content: "Drop Module"; line-height: 36px; padding: 0 10px; } /*List Layout*/ .menu-layout { display: none; } .menu-layout-list { list-style: none; padding: 0; margin: -10px; } .menu-layout-list > li { display: block; width: 33.3333%; float: left; } .menu-layout-list > li > a { margin: 10px; display: block; padding: 10px; border: 1px solid #e5e5e5; border-radius: 3px; } .menu-layout-list > li img { max-width: 100%; height: auto; } .action-bar { margin: 0 0 30px 30px; display: flex; align-items: center; } .action-bar ul { list-style: none; display: flex; margin: 0; padding: 0; } .action-bar ul li { display: inline-flex; align-items: center; } .action-bar ul li:not(:last-child) { margin-right: 20px; } .action-bar .btn.btn-default { color: #fff; background-color: #6c757d; border-color: #6c757d; } .action-bar .btn.btn-default:hover, .action-bar .btn.btn-default.active { color: #fff; background-color: #5c636a; border-color: #565e64; } #menuWidth { width: 100px; margin-left: 12px; } .size-shape { padding: 5px; cursor: pointer; border: 1px solid #f0f0f0; margin: 0 1px; } .background { background-color: green; } PKAA#]�~}�%%(system/helix3/assets/css/pagebuilder.cssnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ .sppb-row-container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px; } @media (min-width: 768px) { .sppb-row-container { max-width: 750px; } } @media (min-width: 992px) { .sppb-row-container { max-width: 970px; } } @media (min-width: 1200px) { .sppb-row-container { max-width: 1170px; } } PKAA#]��<�|6|6*system/helix3/assets/css/admin.general.cssnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ body.com_templates { background: #fff; } .container-fluid.container-main { padding-left: 0; padding-right: 0; } .form-inline.form-inline-header { padding: 20px; } .tab-content { padding: 20px; } a, a:hover { text-decoration: none !important; } a.btn-primary, a.btn-success, a.btn-inverse, a.btn-ino { color: #fff; } .helix-group { width: 100%; display: block; } .btn.btn-danger.layout-del-action .fa-spin { margin-left: 5px; display: none; } /*Basic*/ .com_templates.view-style input[type="text"]:not(.minicolors), .com_templates.view-style input[type="url"], .com_templates.view-style input[type="password"], .com_templates.view-style input[type="number"], .com_templates.view-style input[type="email"], .com_templates.view-style textarea, .com_templates.view-style select { display: block; height: 34px; padding: 6px 12px; font-size: 14px; line-height: 1.42857143; color: #555; background-color: #fff; background-image: none; border: 1px solid #e6e6e5; border-bottom-width: 2px; border-radius: 3px; -webkit-box-shadow: none; box-shadow: none; -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s; -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; box-sizing: border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -o-box-sizing: border-box; -ms-box-sizing: border-box; } .com_templates.view-style input[type="text"]:focus, .com_templates.view-style input[type="url"]:focus, .com_templates.view-style input[type="password"]:focus, .com_templates.view-style input[type="number"]:focus, .com_templates.view-style input[type="email"]:focus, .com_templates.view-style textarea:focus, .com_templates.view-style select:focus { border-color: rgba(82, 168, 236, 0.8); outline: 0; outline: thin dotted \9; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); } .com_templates.view-style input[type="text"][disabled], .com_templates.view-style input[type="url"][disabled], .com_templates.view-style input[type="password"][disabled], .com_templates.view-style input[type="number"][disabled], .com_templates.view-style input[type="email"][disabled], .com_templates.view-style textarea[disabled], .com_templates.view-style select[disabled] { cursor: not-allowed; background-color: #eee; opacity: 1; } .com_templates.view-style textarea { height: auto; width: 400px; max-width: 100%; } .form-inline-header input[type="text"], .form-inline-header select { width: 100%; } /*Main Tab*/ .helix-options .nav.nav-tabs { border-radius: 0; padding-left: 20px; padding-right: 20px; background: #164d7d url(../images/helix-logo.png) no-repeat 100% 50%; border: 0; box-sizing: border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -o-box-sizing: border-box; -ms-box-sizing: border-box; } .helix-options .nav.nav-tabs > li { margin: 0; } .helix-options .nav.nav-tabs > li > a { padding: 25px 15px; line-height: 1; border: 0; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; margin: 0; color: #fff; } .helix-options .nav.nav-tabs > li:hover > a, .helix-options .nav.nav-tabs > li.active > a { background-color: #fff; color: #164d7d; padding: 20px 15px 25px; line-height: 1; border: 0; border-top: 5px solid #eee; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .helix-options .nav.nav-tabs > li > a > i { display: inline-block; margin-right: 5px; } /*Tab Common*/ .control-group.group-separator { border-top: 1px solid #eee; border-bottom: 1px solid #eee; padding: 20px; font-size: 14px; color: #000; line-height: 1; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; margin: 30px -20px !important; } .control-group.group-separator span { display: block; margin-top: 5px; font-size: 12px; font-weight: normal; text-transform: none; color: #999; } .tab-pane > .control-group.group-separator:first-child { border-top: 0; padding-top: 0; margin-top: 0 !important; } .com_templates.view-style .input-append input { float: left; border-radius: 3px 0 0 3px; } .input-append button[type="button"] { float: left; } /* Layout Builder */ #attrib-layout > .control-group > .controls { margin-left: 0; } #attrib-layout > .control-group > .control-label { display: none; } #attrib-layout > div:first-child { margin: 30px 0 40px; } .layout-button-wrap { margin-left: 20px; } .layout-button-wrap .btn { margin-right: 10px; } .layoutbuilder-section { padding: 15px 0; margin-bottom: 30px; background: #f0f0f0; border-radius: 4px; position: relative; } .layoutbuilder-section * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .layoutbuilder-section *:before, .layoutbuilder-section *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .layoutbuilder-section .row { margin-left: 0px; margin-right: 0px; } .settings-section { padding: 0 15px 15px; border-bottom: 1px solid #eee; } .settings-section .settings-left, .settings-section .settings-right { list-style: none; padding: 0; margin: 0; } .settings-section .settings-left a.row-move i { border-radius: 2px; background: #a8a9ad; color: #fff; padding: 5px; margin-right: 5px; } .settings-section .settings-left a { cursor: move; color: #000; } .settings-section .settings-left a:hover i { background: #0072bc; } .layout-column .column { background: #fff; border-radius: 4px; height: 54px; line-height: 54px; color: #000; padding: 0 15px; } .layout-column .column:hover { cursor: move; } .layout-column .column .col-title { margin: 0; font-size: 14px; line-height: 14px; font-weight: normal; display: inline-block; padding: 5px 10px; color: #888; margin-top: 15px; cursor: pointer; border-radius: 3px; } .layout-column .column a { font-size: 18px; color: #97989c; cursor: pointer; } .layout-column .column a:hover { color: #0072bc; } .layoutlist, .layout-button-wrap { float: left; } .com_templates.view-style .layoutlist select { display: inline-block; } /* Menu Assignment */ #assignment { padding: 15px; } #assignment #jform_menuselect-lbl, #assignment .btn-toolbar { display: inline-block; } #assignment .btn-toolbar { margin-right: 30px; } #menu-assignment { margin-top: 20px; } /*Button*/ .helix-options .btn, .helix-options .input-append .add-on, .helix-options .input-prepend .add-on { border-color: #e5e5e5; border-width: 0; border-bottom-width: 2px; padding: 7px 15px; background-image: none; -webkit-box-shadow: none; box-shadow: none; -webkit-transition: background-color 400ms; transition: background-color 400ms; text-shadow: none; } .helix-options .btn.active, .helix-options .btn:active { box-shadow: none; -webkit-box-shadow: none; } .helix-options .btn.btn-danger { border-color: #bd362f; background-color: #bd362f; } .helix-options .btn.btn-danger.active, .helix-options .btn.btn-danger:hover { border-color: #a32f29; } .helix-options .btn.btn-success { border-color: #51a351; background-color: #409740; } .helix-options .btn.btn-success.active, .helix-options .btn.btn-success:hover { border-color: #458a45; background-color: #378137; } .helix-options .btn.btn-primary { border-color: #1a5896; } .helix-options .btn.btn-primary.active, .helix-options .btn.btn-primary:hover { border-color: #1a5896; } .button-group { list-style: none; padding: 0; margin: 0; } .button-group > li { display: inline-block; position: relative; float: left; } .button-group > li > .btn { border-radius: 0; border-right-width: 0; padding: 2px 10px; border-width: 1px; border-right-width: 0; } .button-group > li:first-child > .btn { border-radius: 3px 0 0 3px; } .button-group > li:last-child > .btn { border-right-width: 1px; border-radius: 0 3px 3px 0; } .button-group > li > ul { list-style: none; padding: 0; margin: 0; position: absolute; top: -5px; right: 100%; width: 505px; padding: 10px 5px; background: #b3b3b3; border-radius: 3px; z-index: 999; text-align: center; display: none; } .button-group > li:hover > ul { display: block; } .arrange-column:hover .add-column { background: #36c77b; color: #fff; } .button-group > li > ul li { display: block; float: left; } .button-group > li > ul li a { text-align: left; display: block; padding: 0; margin: 0 2px; color: #fff; background-color: transparent; width: 29px; height: 17px; border: 0; border-radius: 0; background-repeat: no-repeat; background-position: 50%; -webkit-transition: background-color 400ms; transition: background-color 400ms; } .button-group > li > ul li a.column-layout-12 { background-image: url(../images/layout/12.png); } .button-group > li > ul li a.column-layout-3333 { background-image: url(../images/layout/3333.png); } .button-group > li > ul li a.column-layout-444 { background-image: url(../images/layout/444.png); } .button-group > li > ul li a.column-layout-66 { background-image: url(../images/layout/66.png); } .button-group > li > ul li a.column-layout-48 { background-image: url(../images/layout/48.png); } .button-group > li > ul li a.column-layout-39 { background-image: url(../images/layout/39.png); } .button-group > li > ul li a.column-layout-57 { background-image: url(../images/layout/57.png); } .button-group > li > ul li a.column-layout-363 { background-image: url(../images/layout/363.png); } .button-group > li > ul li a.column-layout-264 { background-image: url(../images/layout/264.png); } .button-group > li > ul li a.column-layout-210 { background-image: url(../images/layout/210.png); } .button-group > li > ul li a.column-layout-237 { background-image: url(../images/layout/237.png); } .button-group > li > ul li a.column-layout-282 { background-image: url(../images/layout/282.png); } .button-group > li > ul li a.column-layout-222222 { background-image: url(../images/layout/222222.png); } .button-group > li > ul li a.column-layout-255 { background-image: url(../images/layout/255.png); } .button-group > li > ul li a.column-layout-2442 { background-image: url(../images/layout/2442.png); } .button-group > li > ul li a.column-layout-custom { background-image: url(../images/layout/custom.png); } .button-group > li ul li a:hover, .button-group > li ul li a.active { background-color: rgba(0, 0, 0, 0.2); } /*Media*/ .controls .input-append .media-preview.add-on, .controls .input-prepend .media-preview.add-on { border: 0; background: none; display: block; float: none; padding: 0; margin-bottom: 20px; } .controls .modal.btn, .controls .button-select.btn { border-radius: 3px 0 0 3px; } .controls .media-preview + input[type="text"] { display: none; } /*Presets*/ .presets > div { display: block; padding: 5px; margin: 0 20px 20px 0; width: 120px; height: 80px; float: left; position: relative; cursor: pointer; } .presets > div label { margin: 0; } .presets .preset-title { position: absolute; left: 0; bottom: 0; font-size: 12px; line-height: 1; background: transparent; padding: 5px; color: #fff; text-transform: uppercase; letter-spacing: 2px; } .presets > div.active { -webkit-box-shadow: inset 0 0 0 5px rgba(0, 0, 0, 0.4); box-shadow: inset 0 0 0 5px rgba(0, 0, 0, 0.4); } .presets > div.active .preset-title { background: rgba(0, 0, 0, 0.4); color: #fff; padding: 5px 5px 0 0; left: 5px; bottom: 5px; } .com_templates.view-style .minicolors input[type="text"]:not(.minicolors) { width: 100%; padding-left: 30px; } /*Web Font*/ .webfont input[type="text"], .webfont input[type="number"], .webfont select { width: 100%; } .webfont-preview { margin-top: 10px; margin-bottom: 10px; } .font-update-success, .font-update-failed { margin-top: 10px; font-weight: bold; } .font-update-success { color: #51a351; } .font-update-failed { color: #bd362f; } /*Menu Assignment*/ #menu-assignment .thumbnail { height: 300px; overflow-y: scroll; } /*Others*/ .clr { clear: both; } /* Helix3 Footer Area */ .helix-footer-area { background: #164d78; margin-top: 40px; padding: 40px 0; text-align: center; } .helix-footer-area .helix-logo-area { display: inline-block; width: 130px; height: 40px; background: url(../images/helix-logo.png) no-repeat; background-position: -20px; border: 0; text-indent: -9999px; } .helix-footer-area .template-version { background: #8dc63f; padding: 3px 8px; border-radius: 3px; font-size: 12px; font-weight: bold; color: #fff; } .helix-footer-area .help-links { padding-top: 20px; } .helix-footer-area .help-links a { color: #fff; margin-right: 7px; margin-left: 7px; display: inline-block; } /* Joomla 3.7 Compatible */ .helix-options .controls .field-media-wrapper[data-preview-container=".field-media-preview"] .input-append > input[type="text"] { display: none; } .helix-options .control-group .field-media-wrapper .field-media-preview { margin: 0 0 20px 0; } .helix-options .control-group .field-media-wrapper .field-media-preview img { max-height: 200px; max-width: 200px; height: inherit !important; } PKAA#]�5/kk$system/helix3/assets/css/spimage.cssnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ .sp-image-upload-wrapper:empty { display: none; } .sp-image-upload-wrapper { width: 200px; height: 200px; display: block; background: #f5f5f5; padding: 5px; border: 1px solid #e5e5e5; margin-bottom: 20px; } .sp-image-upload-wrapper img { display: block; height: 100%; width: 100%; } .sp-image-item-loader { line-height: 200px; text-align: center; font-size: 24px; } .hide { display: none; } PKAA#]���E�9�9"system/helix3/assets/css/modal.cssnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ .sp-modal-open { overflow: hidden; } .sp-modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; display: none; overflow: auto; overflow-y: scroll; -webkit-overflow-scrolling: touch; outline: 0; } .sp-modal.fade .sp-modal-dialog { -webkit-transition: -webkit-transform 0.3s ease-out; -moz-transition: -moz-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: transform 0.3s ease-out; -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); transform: translate(0, -25%); } .sp-modal.in .sp-modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); transform: translate(0, 0); } .sp-modal-dialog { position: relative; width: auto; margin: 10px; } .sp-modal-content { position: relative; background-color: #fff; background-clip: padding-box; border: 1px solid #999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; outline: none; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); } .sp-modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: rgba(0, 0, 0, 0.6); } .sp-modal-backdrop.fade { filter: alpha(opacity=0); opacity: 0; } .sp-modal-backdrop.fade.in { filter: alpha(opacity=50); opacity: 0.5; } .sp-modal-header { min-height: 16.42857143px; padding: 15px; border-bottom: 1px solid #e5e5e5; } .sp-modal-header .close { margin-top: -2px; } .sp-modal-header .btn-close { position: absolute; right: 20px; top: 20px; } .sp-modal-title { margin: 0; line-height: 1.42857143; } .sp-modal-body { position: relative; padding: 20px; } .sp-modal-footer { padding: 19px 20px 20px; margin-top: 15px; text-align: right; border-top: 1px solid #e5e5e5; } .sp-modal-footer .sppb-btn + .sppb-btn { margin-bottom: 0; margin-left: 5px; } .sp-modal-footer .btn-group .btn + .btn { margin-left: -1px; } .sp-modal-footer .btn-block + .btn-block { margin-left: 0; } @media (min-width: 768px) { .sp-modal-dialog { width: 600px; margin: 30px auto; } .sp-modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } .sp-modal-sm { width: 300px; } } @media (min-width: 992px) { .sp-modal-lg { width: 900px; } .sp-modal-xlg { width: 1270px; } } .sp-modal-footer:before, .sp-modal-footer:after { display: table; content: " "; } /* Form */ .form-group { margin-bottom: 20px; padding-bottom: 20px; margin-left: -20px; margin-right: -20px; padding-left: 20px; padding-right: 20px; border-bottom: 1px solid #e5e5e5; } * > .form-group:last-child { padding-bottom: 0; margin-bottom: 0; border-bottom: 0; } .form-group label { display: block; margin-bottom: 10px; font-weight: 800; color: #000; } .form-group .form-control { display: block; width: 100%; box-sizing: border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -o-box-sizing: border-box; -ms-box-sizing: border-box; } .form-group .form-control:disabled, .form-group .form-control[readonly] { background-color: #e9ecef !important; } .form-group .minicolors-input { min-width: 120px; } .form-group .form-control-w-auto { width: auto; } .form-group input.form-control { min-height: 30px; } .form-group .help-block { display: block; margin-top: 10px; color: #999; } .input-group-j3.input-group-j3 { position: relative; display: flex; flex-wrap: wrap; align-items: stretch; width: 100%; } .input-group-j3:not(.has-validation) > :not(:last-child) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-j3 > :not(:first-child):not(.valid-feedback):not(.invalid-feedback) { margin-left: -1px; border-top-left-radius: 0; border-bottom-left-radius: 0; } .input-group-j3:not(.has-validation) > :not(:last-child) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-j3 > .form-control { position: relative; flex: 1 1 auto; width: 1%; min-width: 0; } .sp-modal .radio, .sp-modal .checkbox { display: block; min-height: 20px; padding-left: 20px; margin-top: 10px; margin-bottom: 10px; } .sp-modal .radio label, .sp-modal .checkbox label { display: inline; font-weight: normal; cursor: pointer; } .sp-modal .radio input[type="radio"], .sp-modal .radio-inline input[type="radio"], .sp-modal .checkbox input[type="checkbox"], .sp-modal .checkbox-inline input[type="checkbox"] { float: left; margin-left: -20px; } .sp-modal .radio + .radio, .sp-modal .checkbox + .checkbox { margin-top: -5px; } .sp-modal .radio-inline, .sp-modal .checkbox-inline { display: inline-block; padding-left: 20px; margin-bottom: 0; font-weight: normal; vertical-align: middle; cursor: pointer; } .sp-modal .radio-inline + .radio-inline, .sp-modal .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } .sp-modal input[type="radio"][disabled], .sp-modal input[type="checkbox"][disabled], .sp-modal .radio[disabled], .sp-modal .radio-inline[disabled], .sp-modal .checkbox[disabled], .sp-modal .checkbox-inline[disabled], .sp-modal fieldset[disabled] input[type="radio"], .sp-modal fieldset[disabled] input[type="checkbox"], .sp-modal fieldset[disabled] .radio, .sp-modal fieldset[disabled] .radio-inline, .sp-modal fieldset[disabled] .checkbox, .sp-modal fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .sp-modal .input-append .btn { padding: 8px 12px; } .sp-modal textarea { height: 120px; } /*Button*/ .sppb-btn { display: inline-block; margin-bottom: 0; font-weight: normal; text-align: center; vertical-align: middle; cursor: pointer; background-image: none; border: 1px solid transparent; white-space: nowrap; padding: 6px 12px; font-size: 14px; line-height: 1.42857143; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .sppb-btn:focus, .sppb-btn:active:focus, .sppb-btn.active:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .sppb-btn:hover, .sppb-btn:focus { color: #333333; text-decoration: none; } .sppb-btn:active, .sppb-btn.active { outline: 0; background-image: none; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .sppb-btn.disabled, .sppb-btn[disabled], fieldset[disabled] .sppb-btn { cursor: not-allowed; pointer-events: none; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; } .sppb-btn-default { color: #333333; background-color: #ffffff; border-color: #cccccc; } .sppb-btn-default:hover, .sppb-btn-default:focus, .sppb-btn-default:active, .sppb-btn-default.active, .open > .dropdown-toggle.sppb-btn-default { color: #333333; background-color: #e6e6e6; border-color: #adadad; } .sppb-btn-default:active, .sppb-btn-default.active, .open > .dropdown-toggle.sppb-btn-default { background-image: none; } .sppb-btn-default.disabled, .sppb-btn-default[disabled], fieldset[disabled] .sppb-btn-default, .sppb-btn-default.disabled:hover, .sppb-btn-default[disabled]:hover, fieldset[disabled] .sppb-btn-default:hover, .sppb-btn-default.disabled:focus, .sppb-btn-default[disabled]:focus, fieldset[disabled] .sppb-btn-default:focus, .sppb-btn-default.disabled:active, .sppb-btn-default[disabled]:active, fieldset[disabled] .sppb-btn-default:active, .sppb-btn-default.disabled.active, .sppb-btn-default[disabled].active, fieldset[disabled] .sppb-btn-default.active { background-color: #ffffff; border-color: #cccccc; } .sppb-btn-default .badge { color: #ffffff; background-color: #333333; } .sppb-btn-primary { color: #ffffff; background-color: #428bca; border-color: #357ebd; } .sppb-btn-primary:hover, .sppb-btn-primary:focus, .sppb-btn-primary:active, .sppb-btn-primary.active, .open > .dropdown-toggle.sppb-btn-primary { color: #ffffff; background-color: #3071a9; border-color: #285e8e; } .sppb-btn-primary:active, .sppb-btn-primary.active, .open > .dropdown-toggle.sppb-btn-primary { background-image: none; } .sppb-btn-primary.disabled, .sppb-btn-primary[disabled], fieldset[disabled] .sppb-btn-primary, .sppb-btn-primary.disabled:hover, .sppb-btn-primary[disabled]:hover, fieldset[disabled] .sppb-btn-primary:hover, .sppb-btn-primary.disabled:focus, .sppb-btn-primary[disabled]:focus, fieldset[disabled] .sppb-btn-primary:focus, .sppb-btn-primary.disabled:active, .sppb-btn-primary[disabled]:active, fieldset[disabled] .sppb-btn-primary:active, .sppb-btn-primary.disabled.active, .sppb-btn-primary[disabled].active, fieldset[disabled] .sppb-btn-primary.active { background-color: #428bca; border-color: #357ebd; } .sppb-btn-primary .badge { color: #428bca; background-color: #ffffff; } .sppb-btn-success { color: #ffffff; background-color: #5cb85c; border-color: #4cae4c; } .sppb-btn-success:hover, .sppb-btn-success:focus, .sppb-btn-success:active, .sppb-btn-success.active, .open > .dropdown-toggle.sppb-btn-success { color: #ffffff; background-color: #449d44; border-color: #398439; } .sppb-btn-success:active, .sppb-btn-success.active, .open > .dropdown-toggle.sppb-btn-success { background-image: none; } .sppb-btn-success.disabled, .sppb-btn-success[disabled], fieldset[disabled] .sppb-btn-success, .sppb-btn-success.disabled:hover, .sppb-btn-success[disabled]:hover, fieldset[disabled] .sppb-btn-success:hover, .sppb-btn-success.disabled:focus, .sppb-btn-success[disabled]:focus, fieldset[disabled] .sppb-btn-success:focus, .sppb-btn-success.disabled:active, .sppb-btn-success[disabled]:active, fieldset[disabled] .sppb-btn-success:active, .sppb-btn-success.disabled.active, .sppb-btn-success[disabled].active, fieldset[disabled] .sppb-btn-success.active { background-color: #5cb85c; border-color: #4cae4c; } .sppb-btn-success .badge { color: #5cb85c; background-color: #ffffff; } .sppb-btn-info { color: #ffffff; background-color: #5bc0de; border-color: #46b8da; } .sppb-btn-info:hover, .sppb-btn-info:focus, .sppb-btn-info:active, .sppb-btn-info.active, .open > .dropdown-toggle.sppb-btn-info { color: #ffffff; background-color: #31b0d5; border-color: #269abc; } .sppb-btn-info:active, .sppb-btn-info.active, .open > .dropdown-toggle.sppb-btn-info { background-image: none; } .sppb-btn-info.disabled, .sppb-btn-info[disabled], fieldset[disabled] .sppb-btn-info, .sppb-btn-info.disabled:hover, .sppb-btn-info[disabled]:hover, fieldset[disabled] .sppb-btn-info:hover, .sppb-btn-info.disabled:focus, .sppb-btn-info[disabled]:focus, fieldset[disabled] .sppb-btn-info:focus, .sppb-btn-info.disabled:active, .sppb-btn-info[disabled]:active, fieldset[disabled] .sppb-btn-info:active, .sppb-btn-info.disabled.active, .sppb-btn-info[disabled].active, fieldset[disabled] .sppb-btn-info.active { background-color: #5bc0de; border-color: #46b8da; } .sppb-btn-info .badge { color: #5bc0de; background-color: #ffffff; } .sppb-btn-warning { color: #ffffff; background-color: #f0ad4e; border-color: #eea236; } .sppb-btn-warning:hover, .sppb-btn-warning:focus, .sppb-btn-warning:active, .sppb-btn-warning.active, .open > .dropdown-toggle.sppb-btn-warning { color: #ffffff; background-color: #ec971f; border-color: #d58512; } .sppb-btn-warning:active, .sppb-btn-warning.active, .open > .dropdown-toggle.sppb-btn-warning { background-image: none; } .sppb-btn-warning.disabled, .sppb-btn-warning[disabled], fieldset[disabled] .sppb-btn-warning, .sppb-btn-warning.disabled:hover, .sppb-btn-warning[disabled]:hover, fieldset[disabled] .sppb-btn-warning:hover, .sppb-btn-warning.disabled:focus, .sppb-btn-warning[disabled]:focus, fieldset[disabled] .sppb-btn-warning:focus, .sppb-btn-warning.disabled:active, .sppb-btn-warning[disabled]:active, fieldset[disabled] .sppb-btn-warning:active, .sppb-btn-warning.disabled.active, .sppb-btn-warning[disabled].active, fieldset[disabled] .sppb-btn-warning.active { background-color: #f0ad4e; border-color: #eea236; } .sppb-btn-warning .badge { color: #f0ad4e; background-color: #ffffff; } .sppb-btn-danger { color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .sppb-btn-danger:hover, .sppb-btn-danger:focus, .sppb-btn-danger:active, .sppb-btn-danger.active, .open > .dropdown-toggle.sppb-btn-danger { color: #ffffff; background-color: #c9302c; border-color: #ac2925; } .sppb-btn-danger:active, .sppb-btn-danger.active, .open > .dropdown-toggle.sppb-btn-danger { background-image: none; } .sppb-btn-danger.disabled, .sppb-btn-danger[disabled], fieldset[disabled] .sppb-btn-danger, .sppb-btn-danger.disabled:hover, .sppb-btn-danger[disabled]:hover, fieldset[disabled] .sppb-btn-danger:hover, .sppb-btn-danger.disabled:focus, .sppb-btn-danger[disabled]:focus, fieldset[disabled] .sppb-btn-danger:focus, .sppb-btn-danger.disabled:active, .sppb-btn-danger[disabled]:active, fieldset[disabled] .sppb-btn-danger:active, .sppb-btn-danger.disabled.active, .sppb-btn-danger[disabled].active, fieldset[disabled] .sppb-btn-danger.active { background-color: #d9534f; border-color: #d43f3a; } .sppb-btn-danger .badge { color: #d9534f; background-color: #ffffff; } .sppb-btn-link { color: #428bca; font-weight: normal; cursor: pointer; border-radius: 0; } .sppb-btn-link, .sppb-btn-link:active, .sppb-btn-link[disabled], fieldset[disabled] .sppb-btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .sppb-btn-link, .sppb-btn-link:hover, .sppb-btn-link:focus, .sppb-btn-link:active { border-color: transparent; } .sppb-btn-link:hover, .sppb-btn-link:focus { color: #2a6496; text-decoration: underline; background-color: transparent; } .sppb-btn-link[disabled]:hover, fieldset[disabled] .sppb-btn-link:hover, .sppb-btn-link[disabled]:focus, fieldset[disabled] .sppb-btn-link:focus { color: #777777; text-decoration: none; } .sppb-btn-lg { padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .sppb-btn-sm { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .sppb-btn-xs { padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .sppb-btn-block { display: block; width: 100%; } .sppb-btn-block + .sppb-btn-block { margin-top: 5px; } /* Joomla 4 */ #imageModal_helix3_modal { width: 100vw; height: 100vh; left: 50%; transform: translateX(-50%); } PKAA#]洈6�6�+system/helix3/assets/webfonts/webfonts.jsonnu�[���{ "kind": "webfonts#webfontList", "items": [ { "kind": "webfonts#webfont", "family": "ABeeZee", "category": "sans-serif", "variants": [ "regular", "italic" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/abeezee/v4/mE5BOuZKGln_Ex0uYKpIaw.ttf", "italic": "http://fonts.gstatic.com/s/abeezee/v4/kpplLynmYgP0YtlJA3atRw.ttf" } }, { "kind": "webfonts#webfont", "family": "Abel", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/abel/v6/RpUKfqNxoyNe_ka23bzQ2A.ttf" } }, { "kind": "webfonts#webfont", "family": "Abril Fatface", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/abrilfatface/v8/X1g_KwGeBV3ajZIXQ9VnDojjx0o0jr6fNXxPgYh_a8Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Aclonica", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/aclonica/v6/M6pHZMPwK3DiBSlo3jwAKQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Acme", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/acme/v5/-J6XNtAHPZBEbsifCdBt-g.ttf" } }, { "kind": "webfonts#webfont", "family": "Actor", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/actor/v6/ugMf40CrRK6Jf6Yz_xNSmQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Adamina", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/adamina/v7/RUQfOodOMiVVYqFZcSlT9w.ttf" } }, { "kind": "webfonts#webfont", "family": "Advent Pro", "category": "sans-serif", "variants": [ "100", "200", "300", "regular", "500", "600", "700" ], "subsets": [ "latin-ext", "latin", "greek" ], "version": "v4", "lastModified": "2014-08-28", "files": { "100": "http://fonts.gstatic.com/s/adventpro/v4/87-JOpSUecTG50PBYK4ysi3USBnSvpkopQaUR-2r7iU.ttf", "200": "http://fonts.gstatic.com/s/adventpro/v4/URTSSjIp0Wr-GrjxFdFWnGeudeTO44zf-ht3k-KNzwg.ttf", "300": "http://fonts.gstatic.com/s/adventpro/v4/sJaBfJYSFgoB80OL1_66m0eOrDcLawS7-ssYqLr2Xp4.ttf", "regular": "http://fonts.gstatic.com/s/adventpro/v4/1NxMBeKVcNNH2H46AUR3wfesZW2xOQ-xsNqO47m55DA.ttf", "500": "http://fonts.gstatic.com/s/adventpro/v4/7kBth2-rT8tP40RmMMXMLJp-63r6doWhTEbsfBIRJ7A.ttf", "600": "http://fonts.gstatic.com/s/adventpro/v4/3Jo-2maCzv2QLzQBzaKHV_pTEJqju4Hz1txDWij77d4.ttf", "700": "http://fonts.gstatic.com/s/adventpro/v4/M4I6QiICt-ey_wZTpR2gKwJKKGfqHaYFsRG-T3ceEVo.ttf" } }, { "kind": "webfonts#webfont", "family": "Aguafina Script", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/aguafinascript/v5/65g7cgMtMGnNlNyq_Z6CvMxLhO8OSNnfAp53LK1_iRs.ttf" } }, { "kind": "webfonts#webfont", "family": "Akronim", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/akronim/v5/qA0L2CSArk3tuOWE1AR1DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Aladin", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/aladin/v5/PyuJ5cVHkduO0j5fAMKvAA.ttf" } }, { "kind": "webfonts#webfont", "family": "Aldrich", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/aldrich/v6/kMMW1S56gFx7RP_mW1g-Eg.ttf" } }, { "kind": "webfonts#webfont", "family": "Alef", "category": "sans-serif", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/alef/v4/ENvZ_P0HBDQxNZYCQO0lUA.ttf", "700": "http://fonts.gstatic.com/s/alef/v4/VDgZJhEwudtOzOFQpZ8MEA.ttf" } }, { "kind": "webfonts#webfont", "family": "Alegreya", "category": "serif", "variants": [ "regular", "italic", "700", "700italic", "900", "900italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/alegreya/v7/62J3atXd6bvMU4qO_ca-eA.ttf", "italic": "http://fonts.gstatic.com/s/alegreya/v7/cbshnQGxwmlHBjUil7DaIfesZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/alegreya/v7/5oZtdI5-wQwgAFrd9erCsaCWcynf_cDxXwCLxiixG1c.ttf", "700italic": "http://fonts.gstatic.com/s/alegreya/v7/IWi8e5bpnqhMRsZKTcTUWgJKKGfqHaYFsRG-T3ceEVo.ttf", "900": "http://fonts.gstatic.com/s/alegreya/v7/oQeMxX-vxGImzDgX6nxA7KCWcynf_cDxXwCLxiixG1c.ttf", "900italic": "http://fonts.gstatic.com/s/alegreya/v7/-L71QLH_XqgYWaI1GbOVhp0EAVxt0G0biEntp43Qt6E.ttf" } }, { "kind": "webfonts#webfont", "family": "Alegreya SC", "category": "serif", "variants": [ "regular", "italic", "700", "700italic", "900", "900italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/alegreyasc/v6/3ozeFnTbygMK6PfHh8B-iqCWcynf_cDxXwCLxiixG1c.ttf", "italic": "http://fonts.gstatic.com/s/alegreyasc/v6/GOqmv3FLsJ2r6ZALMZVBmkeOrDcLawS7-ssYqLr2Xp4.ttf", "700": "http://fonts.gstatic.com/s/alegreyasc/v6/M9OIREoxDkvynwTpBAYUq3e1Pd76Vl7zRpE7NLJQ7XU.ttf", "700italic": "http://fonts.gstatic.com/s/alegreyasc/v6/5PCoU7IUfCicpKBJtBmP6c_zJjSACmk0BRPxQqhnNLU.ttf", "900": "http://fonts.gstatic.com/s/alegreyasc/v6/M9OIREoxDkvynwTpBAYUqyenaqEuufTBk9XMKnKmgDA.ttf", "900italic": "http://fonts.gstatic.com/s/alegreyasc/v6/5PCoU7IUfCicpKBJtBmP6U_yTOUGsoC54csJe1b-IRw.ttf" } }, { "kind": "webfonts#webfont", "family": "Alegreya Sans", "category": "sans-serif", "variants": [ "100", "100italic", "300", "300italic", "regular", "italic", "500", "500italic", "700", "700italic", "800", "800italic", "900", "900italic" ], "subsets": [ "vietnamese", "latin-ext", "latin" ], "version": "v3", "lastModified": "2014-08-28", "files": { "100": "http://fonts.gstatic.com/s/alegreyasans/v3/TKyx_-JJ6MdpQruNk-t-PJFGFO4uyVFMfB6LZsii7kI.ttf", "100italic": "http://fonts.gstatic.com/s/alegreyasans/v3/gRkSP2lBpqoMTVxg7DmVn2cDnjsrnI9_xJ-5gnBaHsE.ttf", "300": "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9acB1LjARzAvdqa1uQC32v70.ttf", "300italic": "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9CnfqlVoxTUFFx1C8tBqmbcg.ttf", "regular": "http://fonts.gstatic.com/s/alegreyasans/v3/KYNzioYhDai7mTMnx_gDgn8f0n03UdmQgF_CLvNR2vg.ttf", "italic": "http://fonts.gstatic.com/s/alegreyasans/v3/TKyx_-JJ6MdpQruNk-t-PD4G9C9ttb0Oz5Cvf0qOitE.ttf", "500": "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9aQqQmZ7VjhwksfpNVG0pqGc.ttf", "500italic": "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9Cs7DCVO6wo6i5LKIyZDzK40.ttf", "700": "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9aVCbmAUID8LN-q3pJpOk3Ys.ttf", "700italic": "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9CpF66r9C4AnxxlBlGd7xY4g.ttf", "800": "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9acxnD5BewVtRRHHljCwR2bM.ttf", "800italic": "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9CicOAJ_9MkLPbDmrtXDPbIU.ttf", "900": "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9aW42xlVP-j5dagE7-AU2zwg.ttf", "900italic": "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9ChRaDUI9aE8-k7PrIG2iiuo.ttf" } }, { "kind": "webfonts#webfont", "family": "Alegreya Sans SC", "category": "sans-serif", "variants": [ "100", "100italic", "300", "300italic", "regular", "italic", "500", "500italic", "700", "700italic", "800", "800italic", "900", "900italic" ], "subsets": [ "vietnamese", "latin-ext", "latin" ], "version": "v3", "lastModified": "2014-08-28", "files": { "100": "http://fonts.gstatic.com/s/alegreyasanssc/v3/trwFkDJLOJf6hqM93944kVnzStfdnFU-MXbO84aBs_M.ttf", "100italic": "http://fonts.gstatic.com/s/alegreyasanssc/v3/qG3gA9iy5RpXMH4crZboqqakMVR0XlJhO7VdJ8yYvA4.ttf", "300": "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR46-1IqtfxJspFjzJp0SaQRcI.ttf", "300italic": "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0CnTKaH808trtzttbEg4yVA.ttf", "regular": "http://fonts.gstatic.com/s/alegreyasanssc/v3/6kgb6ZvOagoVIRZyl8XV-EklWX-XdLVn1WTiuGuvKIU.ttf", "italic": "http://fonts.gstatic.com/s/alegreyasanssc/v3/trwFkDJLOJf6hqM93944kTfqo69HNOlCNZvbwAmUtiA.ttf", "500": "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR46_hHTluI57wqxl55RvSYo3s.ttf", "500italic": "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0NqVvxKdFVwqwzilqfVd39U.ttf", "700": "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR4600aId5t1FC-xZ8nmpa_XLk.ttf", "700italic": "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0IBYn3VD6xMEnodOh8pnFw4.ttf", "800": "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR46wQgSHD3Lo1Mif2Wkk5swWA.ttf", "800italic": "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0HStmCm6Rs90XeztCALm0H8.ttf", "900": "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR461Rf9EWUSEX_PR1d_gLKfpM.ttf", "900italic": "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0IvtwEfTCJoOJugANj-jWDI.ttf" } }, { "kind": "webfonts#webfont", "family": "Alex Brush", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/alexbrush/v6/ooh3KJFbKJSUoIRWfiu8o_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Alfa Slab One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/alfaslabone/v5/Qx6FPcitRwTC_k88tLPc-Yjjx0o0jr6fNXxPgYh_a8Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Alice", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/alice/v7/wZTAfivekBqIg-rk63nFvQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Alike", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/alike/v7/Ho8YpRKNk_202fwDiGNIyw.ttf" } }, { "kind": "webfonts#webfont", "family": "Alike Angular", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/alikeangular/v6/OpeCu4xxI3qO1C7CZcJtPT3XH2uEnVI__ynTBvNyki8.ttf" } }, { "kind": "webfonts#webfont", "family": "Allan", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/allan/v7/T3lemhgZmLQkQI2Qc2bQHA.ttf", "700": "http://fonts.gstatic.com/s/allan/v7/zSxQiwo7wgnr7KkMXhSiag.ttf" } }, { "kind": "webfonts#webfont", "family": "Allerta", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/allerta/v7/s9FOEuiJFTNbMe06ifzV8g.ttf" } }, { "kind": "webfonts#webfont", "family": "Allerta Stencil", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/allertastencil/v7/CdSZfRtHbQrBohqmzSdDYFf2eT4jUldwg_9fgfY_tHc.ttf" } }, { "kind": "webfonts#webfont", "family": "Allura", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/allura/v4/4hcqgZanyuJ2gMYWffIR6A.ttf" } }, { "kind": "webfonts#webfont", "family": "Almendra", "category": "serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/almendra/v8/PDpbB-ZF7deXAAEYPkQOeg.ttf", "italic": "http://fonts.gstatic.com/s/almendra/v8/CNWLyiDucqVKVgr4EMidi_esZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/almendra/v8/ZpLdQMj7Q2AFio4nNO6A76CWcynf_cDxXwCLxiixG1c.ttf", "700italic": "http://fonts.gstatic.com/s/almendra/v8/-tXHKMcnn6FqrhJV3l1e3QJKKGfqHaYFsRG-T3ceEVo.ttf" } }, { "kind": "webfonts#webfont", "family": "Almendra Display", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/almendradisplay/v6/2Zuu97WJ_ez-87yz5Ai8fF6uyC_qD11hrFQ6EGgTJWI.ttf" } }, { "kind": "webfonts#webfont", "family": "Almendra SC", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/almendrasc/v6/IuiLd8Fm9I6raSalxMoWeaCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Amarante", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/amarante/v4/2dQHjIBWSpydit5zkJZnOw.ttf" } }, { "kind": "webfonts#webfont", "family": "Amaranth", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/amaranth/v6/7VcBog22JBHsHXHdnnycTA.ttf", "italic": "http://fonts.gstatic.com/s/amaranth/v6/UrJlRY9LcVERJSvggsdBqPesZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/amaranth/v6/j5OFHqadfxyLnQRxFeox6qCWcynf_cDxXwCLxiixG1c.ttf", "700italic": "http://fonts.gstatic.com/s/amaranth/v6/BHyuYFj9nqLFNvOvGh0xTwJKKGfqHaYFsRG-T3ceEVo.ttf" } }, { "kind": "webfonts#webfont", "family": "Amatic SC", "category": "handwriting", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/amaticsc/v6/MldbRWLFytvqxU1y81xSVg.ttf", "700": "http://fonts.gstatic.com/s/amaticsc/v6/IDnkRTPGcrSVo50UyYNK7y3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Amethysta", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/amethysta/v4/1jEo9tOFIJDolAUpBnWbnA.ttf" } }, { "kind": "webfonts#webfont", "family": "Anaheim", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/anaheim/v4/t-z8aXHMpgI2gjN_rIflKA.ttf" } }, { "kind": "webfonts#webfont", "family": "Andada", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/andada/v7/rSFaDqNNQBRw3y19MB5Y4w.ttf" } }, { "kind": "webfonts#webfont", "family": "Andika", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic-ext", "cyrillic" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/andika/v6/oe-ag1G0lcqZ3IXfeEgaGg.ttf" } }, { "kind": "webfonts#webfont", "family": "Angkor", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/angkor/v8/DLpLgIS-8F10ecwKqCm95Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Annie Use Your Telescope", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/annieuseyourtelescope/v6/2cuiO5VmaR09C8SLGEQjGqbp7mtG8sPlcZvOaO8HBak.ttf" } }, { "kind": "webfonts#webfont", "family": "Anonymous Pro", "category": "monospace", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin", "greek", "cyrillic" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/anonymouspro/v8/Zhfjj_gat3waL4JSju74E-V_5zh5b-_HiooIRUBwn1A.ttf", "italic": "http://fonts.gstatic.com/s/anonymouspro/v8/q0u6LFHwttnT_69euiDbWKwIsuKDCXG0NQm7BvAgx-c.ttf", "700": "http://fonts.gstatic.com/s/anonymouspro/v8/WDf5lZYgdmmKhO8E1AQud--Cz_5MeePnXDAcLNWyBME.ttf", "700italic": "http://fonts.gstatic.com/s/anonymouspro/v8/_fVr_XGln-cetWSUc-JpfA1LL9bfs7wyIp6F8OC9RxA.ttf" } }, { "kind": "webfonts#webfont", "family": "Antic", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/antic/v7/hEa8XCNM7tXGzD0Uk0AipA.ttf" } }, { "kind": "webfonts#webfont", "family": "Antic Didone", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/anticdidone/v4/r3nJcTDuOluOL6LGDV1vRy3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Antic Slab", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/anticslab/v4/PSbJCTKkAS7skPdkd7AKEvesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Anton", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/anton/v6/XIbCenm-W0IRHWYIh7CGUQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Arapey", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/arapey/v5/dqu823lrSYn8T2gApTdslA.ttf", "italic": "http://fonts.gstatic.com/s/arapey/v5/pY-Xi5JNBpaWxy2tZhEm5A.ttf" } }, { "kind": "webfonts#webfont", "family": "Arbutus", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/arbutus/v5/Go_hurxoUsn5MnqNVQgodQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Arbutus Slab", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/arbutusslab/v4/6k3Yp6iS9l4jRIpynA8qMy3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Architects Daughter", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/architectsdaughter/v6/RXTgOOQ9AAtaVOHxx0IUBMCy0EhZjHzu-y0e6uLf4Fg.ttf" } }, { "kind": "webfonts#webfont", "family": "Archivo Black", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/archivoblack/v4/WoAoVT7K3k7hHfxKbvB6B51XQG8isOYYJhPIYAyrESQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Archivo Narrow", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/archivonarrow/v5/DsLzC9scoPnrGiwYYMQXppTvAuddT2xDMbdz0mdLyZY.ttf", "italic": "http://fonts.gstatic.com/s/archivonarrow/v5/vqsrtPCpTU3tJlKfuXP5zUpmlyBQEFfdE6dERLXdQGQ.ttf", "700": "http://fonts.gstatic.com/s/archivonarrow/v5/M__Wu4PAmHf4YZvQM8tWsMLtdzs3iyjn_YuT226ZsLU.ttf", "700italic": "http://fonts.gstatic.com/s/archivonarrow/v5/wG6O733y5zHl4EKCOh8rSTg5KB8MNJ4uPAETq9naQO8.ttf" } }, { "kind": "webfonts#webfont", "family": "Arimo", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "greek-ext", "vietnamese", "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/arimo/v8/Gpeo80g-5ji2CcyXWnzh7g.ttf", "italic": "http://fonts.gstatic.com/s/arimo/v8/_OdGbnX2-qQ96C4OjhyuPw.ttf", "700": "http://fonts.gstatic.com/s/arimo/v8/ZItXugREyvV9LnbY_gxAmw.ttf", "700italic": "http://fonts.gstatic.com/s/arimo/v8/__nOLWqmeXdhfr0g7GaFePesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Arizonia", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/arizonia/v6/yzJqkHZqryZBTM7RKYV9Wg.ttf" } }, { "kind": "webfonts#webfont", "family": "Armata", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/armata/v6/1H8FwGgIRrbYtxSfXhOHlQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Artifika", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/artifika/v6/Ekfp4H4QG7D-WsABDOyj8g.ttf" } }, { "kind": "webfonts#webfont", "family": "Arvo", "category": "serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/arvo/v8/vvWPwz-PlZEwjOOIKqoZzA.ttf", "italic": "http://fonts.gstatic.com/s/arvo/v8/id5a4BCjbenl5Gkqonw_Rw.ttf", "700": "http://fonts.gstatic.com/s/arvo/v8/OB3FDST7U38u3OjPK_vvRQ.ttf", "700italic": "http://fonts.gstatic.com/s/arvo/v8/Hvl2MuWoXLaCy2v6MD4Yvw.ttf" } }, { "kind": "webfonts#webfont", "family": "Asap", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/asap/v4/2lf-1MDR8tsTpEtvJmr2hA.ttf", "italic": "http://fonts.gstatic.com/s/asap/v4/mwxNHf8QS8gNWCAMwkJNIg.ttf", "700": "http://fonts.gstatic.com/s/asap/v4/o5RUA7SsJ80M8oDFBnrDbg.ttf", "700italic": "http://fonts.gstatic.com/s/asap/v4/_rZz9y2oXc09jT5T6BexLQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Asset", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/asset/v6/hfPmqY-JzuR1lULlQf9iTg.ttf" } }, { "kind": "webfonts#webfont", "family": "Astloch", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/astloch/v6/fmbitVmHYLQP7MGPuFgpag.ttf", "700": "http://fonts.gstatic.com/s/astloch/v6/aPkhM2tL-tz1jX6aX2rvo_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Asul", "category": "sans-serif", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/asul/v5/9qpsNR_OOwyOYyo2N0IbBw.ttf", "700": "http://fonts.gstatic.com/s/asul/v5/uO8uNmxaq87-DdPmkEg5Gg.ttf" } }, { "kind": "webfonts#webfont", "family": "Atomic Age", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/atomicage/v6/WvBMe4FxANIKpo6Oi0mVJ_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Aubrey", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/aubrey/v8/zo9w8klO8bmOQIMajQ2aTA.ttf" } }, { "kind": "webfonts#webfont", "family": "Audiowide", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/audiowide/v4/yGcwRZB6VmoYhPUYT-mEow.ttf" } }, { "kind": "webfonts#webfont", "family": "Autour One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/autourone/v4/2xmQBcg7FN72jaQRFZPIDvesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Average", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/average/v4/aHUibBqdDbVYl5FM48pxyQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Average Sans", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/averagesans/v4/dnU3R-5A_43y5bIyLztPsS3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Averia Gruesa Libre", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/averiagruesalibre/v4/10vbZTOoN6T8D-nvDzwRFyXcKHuZXlCN8VkWHpkUzKM.ttf" } }, { "kind": "webfonts#webfont", "family": "Averia Libre", "category": "display", "variants": [ "300", "300italic", "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/averialibre/v4/r6hGL8sSLm4dTzOPXgx5XacQoVhARpoaILP7amxE_8g.ttf", "300italic": "http://fonts.gstatic.com/s/averialibre/v4/I6wAYuAvOgT7el2ePj2nkina0FLWfcB-J_SAYmcAXaI.ttf", "regular": "http://fonts.gstatic.com/s/averialibre/v4/rYVgHZZQICWnhjguGsBspC3USBnSvpkopQaUR-2r7iU.ttf", "italic": "http://fonts.gstatic.com/s/averialibre/v4/1etzuoNxVHR8F533EkD1WfMZXuCXbOrAvx5R0IT5Oyo.ttf", "700": "http://fonts.gstatic.com/s/averialibre/v4/r6hGL8sSLm4dTzOPXgx5XUD2ttfZwueP-QU272T9-k4.ttf", "700italic": "http://fonts.gstatic.com/s/averialibre/v4/I6wAYuAvOgT7el2ePj2nkvAs9-1nE9qOqhChW0m4nDE.ttf" } }, { "kind": "webfonts#webfont", "family": "Averia Sans Libre", "category": "display", "variants": [ "300", "300italic", "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/averiasanslibre/v4/_9-jTfQjaBsWAF_yp5z-V4CP_KG_g80s1KXiBtJHoNc.ttf", "300italic": "http://fonts.gstatic.com/s/averiasanslibre/v4/o7BEIK-fG3Ykc5Rzteh88YuyGu4JqttndUh4gRKxic0.ttf", "regular": "http://fonts.gstatic.com/s/averiasanslibre/v4/yRJpjT39KxACO9F31mj_LqV8_KRn4epKAjTFK1s1fsg.ttf", "italic": "http://fonts.gstatic.com/s/averiasanslibre/v4/COEzR_NPBSUOl3pFwPbPoCZU2HnUZT1xVKaIrHDioao.ttf", "700": "http://fonts.gstatic.com/s/averiasanslibre/v4/_9-jTfQjaBsWAF_yp5z-V8QwVOrz1y5GihpZmtKLhlI.ttf", "700italic": "http://fonts.gstatic.com/s/averiasanslibre/v4/o7BEIK-fG3Ykc5Rzteh88bXy1DXgmJcVtKjM5UWamMs.ttf" } }, { "kind": "webfonts#webfont", "family": "Averia Serif Libre", "category": "display", "variants": [ "300", "300italic", "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/averiaseriflibre/v5/yvITAdr5D1nlsdFswJAb8SmC4gFJ2PHmfdVKEd_5S9M.ttf", "300italic": "http://fonts.gstatic.com/s/averiaseriflibre/v5/YOLFXyye4sZt6AZk1QybCG2okl0bU63CauowU4iApig.ttf", "regular": "http://fonts.gstatic.com/s/averiaseriflibre/v5/fdtF30xa_Erw0zAzOoG4BZqY66i8AUyI16fGqw0iAew.ttf", "italic": "http://fonts.gstatic.com/s/averiaseriflibre/v5/o9qhvK9iT5iDWfyhQUe-6Ru_b0bTq5iipbJ9hhgHJ6U.ttf", "700": "http://fonts.gstatic.com/s/averiaseriflibre/v5/yvITAdr5D1nlsdFswJAb8Q50KV5TaOVolur4zV2iZsg.ttf", "700italic": "http://fonts.gstatic.com/s/averiaseriflibre/v5/YOLFXyye4sZt6AZk1QybCNxohRXP4tNDqG3X4Hqn21k.ttf" } }, { "kind": "webfonts#webfont", "family": "Bad Script", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin", "cyrillic" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/badscript/v5/cRyUs0nJ2eMQFHwBsZNRXfesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Balthazar", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/balthazar/v5/WgbaSIs6dJAGXJ0qbz2xlw.ttf" } }, { "kind": "webfonts#webfont", "family": "Bangers", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bangers/v7/WAffdge5w99Xif-DLeqmcA.ttf" } }, { "kind": "webfonts#webfont", "family": "Basic", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/basic/v6/hNII2mS5Dxw5C0u_m3mXgA.ttf" } }, { "kind": "webfonts#webfont", "family": "Battambang", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "khmer" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/battambang/v9/MzrUfQLefYum5vVGM3EZVPesZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/battambang/v9/dezbRtMzfzAA99DmrCYRMgJKKGfqHaYFsRG-T3ceEVo.ttf" } }, { "kind": "webfonts#webfont", "family": "Baumans", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/baumans/v5/o0bFdPW1H5kd5saqqOcoVg.ttf" } }, { "kind": "webfonts#webfont", "family": "Bayon", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bayon/v8/yTubusjTnpNRZwA4_50iVw.ttf" } }, { "kind": "webfonts#webfont", "family": "Belgrano", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/belgrano/v6/iq8DUa2s7g6WRCeMiFrmtQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Belleza", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/belleza/v4/wchA3BWJlVqvIcSeNZyXew.ttf" } }, { "kind": "webfonts#webfont", "family": "BenchNine", "category": "sans-serif", "variants": [ "300", "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/benchnine/v4/ah9xtUy9wLQ3qnWa2p-piS3USBnSvpkopQaUR-2r7iU.ttf", "regular": "http://fonts.gstatic.com/s/benchnine/v4/h3OAlYqU3aOeNkuXgH2Q2w.ttf", "700": "http://fonts.gstatic.com/s/benchnine/v4/qZpi6ZVZg3L2RL_xoBLxWS3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Bentham", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bentham/v6/5-Mo8Fe7yg5tzV0GlQIuzQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Berkshire Swash", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/berkshireswash/v4/4RZJjVRPjYnC2939hKCAimKfbtsIjCZP_edQljX9gR0.ttf" } }, { "kind": "webfonts#webfont", "family": "Bevan", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bevan/v7/Rtg3zDsCeQiaJ_Qno22OJA.ttf" } }, { "kind": "webfonts#webfont", "family": "Bigelow Rules", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bigelowrules/v4/FEJCPLwo07FS-6SK6Al50X8f0n03UdmQgF_CLvNR2vg.ttf" } }, { "kind": "webfonts#webfont", "family": "Bigshot One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bigshotone/v6/wSyZjBNTWDQHnvWE2jt6j6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Bilbo", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bilbo/v6/-ty-lPs5H7OIucWbnpFrkA.ttf" } }, { "kind": "webfonts#webfont", "family": "Bilbo Swash Caps", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bilboswashcaps/v7/UB_-crLvhx-PwGKW1oosDmYeFSdnSpRYv5h9gpdlD1g.ttf" } }, { "kind": "webfonts#webfont", "family": "Bitter", "category": "serif", "variants": [ "regular", "italic", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bitter/v7/w_BNdJvVZDRmqy5aSfB2kQ.ttf", "italic": "http://fonts.gstatic.com/s/bitter/v7/TC0FZEVzXQIGgzmRfKPZbA.ttf", "700": "http://fonts.gstatic.com/s/bitter/v7/4dUtr_4BvHuoRU35suyOAg.ttf" } }, { "kind": "webfonts#webfont", "family": "Black Ops One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/blackopsone/v7/2XW-DmDsGbDLE372KrMW1Yjjx0o0jr6fNXxPgYh_a8Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Bokor", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bokor/v8/uAKdo0A85WW23Gs6mcbw7A.ttf" } }, { "kind": "webfonts#webfont", "family": "Bonbon", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bonbon/v6/IW3u1yzG1knyW5oz0s9_6Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Boogaloo", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/boogaloo/v6/4Wu1tvFMoB80fSu8qLgQfQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Bowlby One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bowlbyone/v7/eKpHjHfjoxM2bX36YNucefesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Bowlby One SC", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bowlbyonesc/v8/8ZkeXftTuzKBtmxOYXoRedDkZCMxWJecxjvKm2f8MJw.ttf" } }, { "kind": "webfonts#webfont", "family": "Brawler", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/brawler/v6/3gfSw6imxQnQxweVITqUrg.ttf" } }, { "kind": "webfonts#webfont", "family": "Bree Serif", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/breeserif/v5/5h9crBVIrvZqgf34FHcnEfesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Bubblegum Sans", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bubblegumsans/v5/Y9iTUUNz6lbl6TrvV4iwsytnKWgpfO2iSkLzTz-AABg.ttf" } }, { "kind": "webfonts#webfont", "family": "Bubbler One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/bubblerone/v4/e8S0qevkZAFaBybtt_SU4qCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Buda", "category": "display", "variants": [ "300" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/buda/v6/hLtAmNUmEMJH2yx7NGUjnA.ttf" } }, { "kind": "webfonts#webfont", "family": "Buenard", "category": "serif", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/buenard/v6/NSpMPGKAUgrLrlstYVvIXQ.ttf", "700": "http://fonts.gstatic.com/s/buenard/v6/yUlGE115dGr7O9w9FlP3UvesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Butcherman", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/butcherman/v7/bxiJmD567sPBVpJsT0XR0vesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Butterfly Kids", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/butterflykids/v4/J4NTF5M25htqeTffYImtlUZaDk62iwTBnbnvwSjZciA.ttf" } }, { "kind": "webfonts#webfont", "family": "Cabin", "category": "sans-serif", "variants": [ "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cabin/v7/XeuAFYo2xAPHxZGBbQtHhA.ttf", "italic": "http://fonts.gstatic.com/s/cabin/v7/0tJ9k3DI5xC4GBgs1E_Jxw.ttf", "500": "http://fonts.gstatic.com/s/cabin/v7/HgsCQ-k3_Z_uQ86aFolNBg.ttf", "500italic": "http://fonts.gstatic.com/s/cabin/v7/50sjhrGE0njyO-7mGDhGP_esZW2xOQ-xsNqO47m55DA.ttf", "600": "http://fonts.gstatic.com/s/cabin/v7/eUDAvKhBtmTCkeVBsFk34A.ttf", "600italic": "http://fonts.gstatic.com/s/cabin/v7/sFQpQDBd3G2om0Nl5dD2CvesZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/cabin/v7/4EKhProuY1hq_WCAomq9Dg.ttf", "700italic": "http://fonts.gstatic.com/s/cabin/v7/K83QKi8MOKLEqj6bgZ7LrfesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Cabin Condensed", "category": "sans-serif", "variants": [ "regular", "500", "600", "700" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cabincondensed/v7/B0txb0blf2N29WdYPJjMSiQPsWWoiv__AzYJ9Zzn9II.ttf", "500": "http://fonts.gstatic.com/s/cabincondensed/v7/Ez4zJbsGr2BgXcNUWBVgEARL_-ABKXdjsJSPT0lc2Bk.ttf", "600": "http://fonts.gstatic.com/s/cabincondensed/v7/Ez4zJbsGr2BgXcNUWBVgELS5sSASxc8z4EQTQj7DCAI.ttf", "700": "http://fonts.gstatic.com/s/cabincondensed/v7/Ez4zJbsGr2BgXcNUWBVgEMAWgzcA047xWLixhLCofl8.ttf" } }, { "kind": "webfonts#webfont", "family": "Cabin Sketch", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cabinsketch/v8/d9fijO34zQajqQvl3YHRCS3USBnSvpkopQaUR-2r7iU.ttf", "700": "http://fonts.gstatic.com/s/cabinsketch/v8/ki3SSN5HMOO0-IOLOj069ED2ttfZwueP-QU272T9-k4.ttf" } }, { "kind": "webfonts#webfont", "family": "Caesar Dressing", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/caesardressing/v5/2T_WzBgE2Xz3FsyJMq34T9gR43u4FvCuJwIfF5Zxl6Y.ttf" } }, { "kind": "webfonts#webfont", "family": "Cagliostro", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cagliostro/v5/i85oXbtdSatNEzss99bpj_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Calligraffitti", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/calligraffitti/v7/vLVN2Y-z65rVu1R7lWdvyDXz_orj3gX0_NzfmYulrko.ttf" } }, { "kind": "webfonts#webfont", "family": "Cambo", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cambo/v5/PnwpRuTdkYCf8qk4ajmNRA.ttf" } }, { "kind": "webfonts#webfont", "family": "Candal", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/candal/v6/x44dDW28zK7GR1gGDBmj9g.ttf" } }, { "kind": "webfonts#webfont", "family": "Cantarell", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cantarell/v6/p5ydP_uWQ5lsFzcP_XVMEw.ttf", "italic": "http://fonts.gstatic.com/s/cantarell/v6/DTCLtOSqP-7dgM-V_xKUjqCWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/cantarell/v6/Yir4ZDsCn4g1kWopdg-ehC3USBnSvpkopQaUR-2r7iU.ttf", "700italic": "http://fonts.gstatic.com/s/cantarell/v6/weehrwMeZBXb0QyrWnRwFXe1Pd76Vl7zRpE7NLJQ7XU.ttf" } }, { "kind": "webfonts#webfont", "family": "Cantata One", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cantataone/v5/-a5FDvnBqaBMDaGgZYnEfqCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Cantora One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cantoraone/v5/oI-DS62RbHI8ZREjp73ehqCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Capriola", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/capriola/v4/JxXPlkdzWwF9Cwelbvi9jA.ttf" } }, { "kind": "webfonts#webfont", "family": "Cardo", "category": "serif", "variants": [ "regular", "italic", "700" ], "subsets": [ "greek-ext", "latin-ext", "latin", "greek" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cardo/v8/jbkF2_R0FKUEZTq5dwSknQ.ttf", "italic": "http://fonts.gstatic.com/s/cardo/v8/pcv4Np9tUkq0YREYUcEEJQ.ttf", "700": "http://fonts.gstatic.com/s/cardo/v8/lQN30weILimrKvp8rZhF1w.ttf" } }, { "kind": "webfonts#webfont", "family": "Carme", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/carme/v7/08E0NP1eRBEyFRUadmMfgA.ttf" } }, { "kind": "webfonts#webfont", "family": "Carrois Gothic", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/carroisgothic/v4/GCgb7bssGpwp7V5ynxmWy2x3d0cwUleGuRTmCYfCUaM.ttf" } }, { "kind": "webfonts#webfont", "family": "Carrois Gothic SC", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/carroisgothicsc/v4/bVp4nhwFIXU-r3LqUR8DSJTdPW1ioadGi2uRiKgJVCY.ttf" } }, { "kind": "webfonts#webfont", "family": "Carter One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/carterone/v8/5X_LFvdbcB7OBG7hBgZ7fPesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Caudex", "category": "serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "greek-ext", "latin-ext", "latin", "greek" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/caudex/v6/PWEexiHLDmQbn2b1OPZWfg.ttf", "italic": "http://fonts.gstatic.com/s/caudex/v6/XjMZF6XCisvV3qapD4oJdw.ttf", "700": "http://fonts.gstatic.com/s/caudex/v6/PetCI4GyQ5Q3LiOzUu_mMg.ttf", "700italic": "http://fonts.gstatic.com/s/caudex/v6/yT8YeHLjaJvQXlUEYOA8gqCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Cedarville Cursive", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cedarvillecursive/v6/cuCe6HrkcqrWTWTUE7dw-41zwq9-z_Lf44CzRAA0d0Y.ttf" } }, { "kind": "webfonts#webfont", "family": "Ceviche One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cevicheone/v6/WOaXIMBD4VYMy39MsobJhKCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Changa One", "category": "display", "variants": [ "regular", "italic" ], "subsets": [ "latin" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/changaone/v9/dr4qjce4W3kxFrZRkVD87fesZW2xOQ-xsNqO47m55DA.ttf", "italic": "http://fonts.gstatic.com/s/changaone/v9/wJVQlUs1lAZel-WdTo2U9y3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Chango", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/chango/v5/3W3AeMMtRTH08t5qLOjBmg.ttf" } }, { "kind": "webfonts#webfont", "family": "Chau Philomene One", "category": "sans-serif", "variants": [ "regular", "italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/chauphilomeneone/v4/KKc5egCL-a2fFVoOA2x6tBFi5dxgSTdxqnMJgWkBJcg.ttf", "italic": "http://fonts.gstatic.com/s/chauphilomeneone/v4/eJj1PY_iN4KiIuyOvtMHJP6uyLkxyiC4WcYA74sfquE.ttf" } }, { "kind": "webfonts#webfont", "family": "Chela One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/chelaone/v4/h5O0dEnpnIq6jQnWxZybrA.ttf" } }, { "kind": "webfonts#webfont", "family": "Chelsea Market", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/chelseamarket/v4/qSdzwh2A4BbNemy78sJLfAAI1i8fIftCBXsBF2v9UMI.ttf" } }, { "kind": "webfonts#webfont", "family": "Chenla", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/chenla/v9/aLNpdAUDq2MZbWz2U1a16g.ttf" } }, { "kind": "webfonts#webfont", "family": "Cherry Cream Soda", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cherrycreamsoda/v6/OrD-AUnFcZeeKa6F_c0_WxOiHiuAPYA9ry3O1RG2XIU.ttf" } }, { "kind": "webfonts#webfont", "family": "Cherry Swash", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cherryswash/v4/HqOk7C7J1TZ5i3L-ejF0vi3USBnSvpkopQaUR-2r7iU.ttf", "700": "http://fonts.gstatic.com/s/cherryswash/v4/-CfyMyQqfucZPQNB0nvYyED2ttfZwueP-QU272T9-k4.ttf" } }, { "kind": "webfonts#webfont", "family": "Chewy", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/chewy/v7/hcDN5cvQdIu6Bx4mg_TSyw.ttf" } }, { "kind": "webfonts#webfont", "family": "Chicle", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/chicle/v5/xg4q57Ut9ZmyFwLp51JLgg.ttf" } }, { "kind": "webfonts#webfont", "family": "Chivo", "category": "sans-serif", "variants": [ "regular", "italic", "900", "900italic" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/chivo/v7/L88PEuzS9eRfHRZhAPhZyw.ttf", "italic": "http://fonts.gstatic.com/s/chivo/v7/Oe3-Q-a2kBzPnhHck_baMg.ttf", "900": "http://fonts.gstatic.com/s/chivo/v7/JAdkiWd46QCW4vOsj3dzTA.ttf", "900italic": "http://fonts.gstatic.com/s/chivo/v7/LoszYnE86q2wJEOjCigBQ_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Cinzel", "category": "serif", "variants": [ "regular", "700", "900" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cinzel/v4/GF7dy_Nc-a6EaHYSyGd-EA.ttf", "700": "http://fonts.gstatic.com/s/cinzel/v4/nYcFQ6_3pf_6YDrOFjBR8Q.ttf", "900": "http://fonts.gstatic.com/s/cinzel/v4/FTBj72ozM2cEOSxiVsRb3A.ttf" } }, { "kind": "webfonts#webfont", "family": "Cinzel Decorative", "category": "display", "variants": [ "regular", "700", "900" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cinzeldecorative/v4/fmgK7oaJJIXAkhd9798yQgT5USbJx2F82lQbogPy2bY.ttf", "700": "http://fonts.gstatic.com/s/cinzeldecorative/v4/pXhIVnhFtL_B9Vb1wq2F95-YYVDmZkJErg0zgx9XuZI.ttf", "900": "http://fonts.gstatic.com/s/cinzeldecorative/v4/pXhIVnhFtL_B9Vb1wq2F97Khqbv0zQZa0g-9HOXAalU.ttf" } }, { "kind": "webfonts#webfont", "family": "Clicker Script", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/clickerscript/v4/Zupmk8XwADjufGxWB9KThBnpV0hQCek3EmWnCPrvGRM.ttf" } }, { "kind": "webfonts#webfont", "family": "Coda", "category": "display", "variants": [ "regular", "800" ], "subsets": [ "latin" ], "version": "v10", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/coda/v10/yHDvulhg-P-p2KRgRrnUYw.ttf", "800": "http://fonts.gstatic.com/s/coda/v10/6ZIw0sbALY0KTMWllZB3hQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Coda Caption", "category": "sans-serif", "variants": [ "800" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "800": "http://fonts.gstatic.com/s/codacaption/v8/YDl6urZh-DUFhiMBTgAnz_qsay_1ZmRGmC8pVRdIfAg.ttf" } }, { "kind": "webfonts#webfont", "family": "Codystar", "category": "display", "variants": [ "300", "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/codystar/v4/EVaUzfJkcb8Zqx9kzQLXqqCWcynf_cDxXwCLxiixG1c.ttf", "regular": "http://fonts.gstatic.com/s/codystar/v4/EN-CPFKYowSI7SuR7-0cZA.ttf" } }, { "kind": "webfonts#webfont", "family": "Combo", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/combo/v5/Nab98KjR3JZSSPGtzLyXNw.ttf" } }, { "kind": "webfonts#webfont", "family": "Comfortaa", "category": "display", "variants": [ "300", "regular", "700" ], "subsets": [ "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v7", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/comfortaa/v7/r_tUZNl0G8xCoOmp_JkSCi3USBnSvpkopQaUR-2r7iU.ttf", "regular": "http://fonts.gstatic.com/s/comfortaa/v7/lZx6C1VViPgSOhCBUP7hXA.ttf", "700": "http://fonts.gstatic.com/s/comfortaa/v7/fND5XPYKrF2tQDwwfWZJIy3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Coming Soon", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/comingsoon/v6/Yz2z3IAe2HSQAOWsSG8COKCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Concert One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/concertone/v7/N5IWCIGhUNdPZn_efTxKN6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Condiment", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/condiment/v4/CstmdiPpgFSV0FUNL5LrJA.ttf" } }, { "kind": "webfonts#webfont", "family": "Content", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "khmer" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/content/v8/l8qaLjygvOkDEU2G6-cjfQ.ttf", "700": "http://fonts.gstatic.com/s/content/v8/7PivP8Zvs2qn6F6aNbSQe_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Contrail One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/contrailone/v6/b41KxjgiyqX-hkggANDU6C3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Convergence", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/convergence/v5/eykrGz1NN_YpQmkAZjW-qKCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Cookie", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cookie/v7/HxeUC62y_YdDbiFlze357A.ttf" } }, { "kind": "webfonts#webfont", "family": "Copse", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/copse/v6/wikLrtPGjZDvZ5w2i5HLWg.ttf" } }, { "kind": "webfonts#webfont", "family": "Corben", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/corben/v8/tTysMZkt-j8Y5yhkgsoajQ.ttf", "700": "http://fonts.gstatic.com/s/corben/v8/lirJaFSQWdGQuV--fksg5g.ttf" } }, { "kind": "webfonts#webfont", "family": "Courgette", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/courgette/v4/2YO0EYtyE9HUPLZprahpZA.ttf" } }, { "kind": "webfonts#webfont", "family": "Cousine", "category": "monospace", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "greek-ext", "vietnamese", "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cousine/v9/GYX4bPXObJNJo63QJEUnLg.ttf", "italic": "http://fonts.gstatic.com/s/cousine/v9/1WtIuajLoo8vjVwsrZ3eOg.ttf", "700": "http://fonts.gstatic.com/s/cousine/v9/FXEOnNUcCzhdtoBxiq-lovesZW2xOQ-xsNqO47m55DA.ttf", "700italic": "http://fonts.gstatic.com/s/cousine/v9/y_AZ5Sz-FwL1lux2xLSTZS3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Coustard", "category": "serif", "variants": [ "regular", "900" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/coustard/v6/iO2Rs5PmqAEAXoU3SkMVBg.ttf", "900": "http://fonts.gstatic.com/s/coustard/v6/W02OCWO6OfMUHz6aVyegQ6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Covered By Your Grace", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/coveredbyyourgrace/v6/6ozZp4BPlrbDRWPe3EBGA6CVUMdvnk-GcAiZQrX9Gek.ttf" } }, { "kind": "webfonts#webfont", "family": "Crafty Girls", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/craftygirls/v5/0Sv8UWFFdhQmesHL32H8oy3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Creepster", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/creepster/v5/0vdr5kWJ6aJlOg5JvxnXzQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Crete Round", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/creteround/v5/B8EwN421qqOCCT8vOH4wJ6CWcynf_cDxXwCLxiixG1c.ttf", "italic": "http://fonts.gstatic.com/s/creteround/v5/5xAt7XK2vkUdjhGtt98unUeOrDcLawS7-ssYqLr2Xp4.ttf" } }, { "kind": "webfonts#webfont", "family": "Crimson Text", "category": "serif", "variants": [ "regular", "italic", "600", "600italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/crimsontext/v6/3IFMwfRa07i-auYR-B-zNS3USBnSvpkopQaUR-2r7iU.ttf", "italic": "http://fonts.gstatic.com/s/crimsontext/v6/a5QZnvmn5amyNI-t2BMkWPMZXuCXbOrAvx5R0IT5Oyo.ttf", "600": "http://fonts.gstatic.com/s/crimsontext/v6/rEy5tGc5HdXy56Xvd4f3I2v8CylhIUtwUiYO7Z2wXbE.ttf", "600italic": "http://fonts.gstatic.com/s/crimsontext/v6/4j4TR-EfnvCt43InYpUNDIR-5-urNOGAobhAyctHvW8.ttf", "700": "http://fonts.gstatic.com/s/crimsontext/v6/rEy5tGc5HdXy56Xvd4f3I0D2ttfZwueP-QU272T9-k4.ttf", "700italic": "http://fonts.gstatic.com/s/crimsontext/v6/4j4TR-EfnvCt43InYpUNDPAs9-1nE9qOqhChW0m4nDE.ttf" } }, { "kind": "webfonts#webfont", "family": "Croissant One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/croissantone/v4/mPjsOObnC77fp1cvZlOfIYjjx0o0jr6fNXxPgYh_a8Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Crushed", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/crushed/v6/aHwSejs3Kt0Lg95u7j32jA.ttf" } }, { "kind": "webfonts#webfont", "family": "Cuprum", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cuprum/v7/JgXs0F_UiaEdAS74msmFNg.ttf", "italic": "http://fonts.gstatic.com/s/cuprum/v7/cLEz0KV6OxInnktSzpk58g.ttf", "700": "http://fonts.gstatic.com/s/cuprum/v7/6tl3_FkDeXSD72oEHuJh4w.ttf", "700italic": "http://fonts.gstatic.com/s/cuprum/v7/bnkXaBfoYvaJ75axRPSwVKCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Cutive", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cutive/v7/G2bW-ImyOCwKxBkLyz39YQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Cutive Mono", "category": "monospace", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/cutivemono/v4/ncWQtFVKcSs8OW798v30k6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Damion", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/damion/v6/13XtECwKxhD_VrOqXL4SiA.ttf" } }, { "kind": "webfonts#webfont", "family": "Dancing Script", "category": "handwriting", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/dancingscript/v6/DK0eTGXiZjN6yA8zAEyM2RnpV0hQCek3EmWnCPrvGRM.ttf", "700": "http://fonts.gstatic.com/s/dancingscript/v6/KGBfwabt0ZRLA5W1ywjowb_dAmXiKjTPGCuO6G2MbfA.ttf" } }, { "kind": "webfonts#webfont", "family": "Dangrek", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/dangrek/v8/LOaFhBT-EHNxZjV8DAW_ew.ttf" } }, { "kind": "webfonts#webfont", "family": "Dawning of a New Day", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/dawningofanewday/v7/JiDsRhiKZt8uz3NJ5xA06gXLnohmOYWQZqo_sW8GLTk.ttf" } }, { "kind": "webfonts#webfont", "family": "Days One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/daysone/v6/kzwZjNhc1iabMsrc_hKBIA.ttf" } }, { "kind": "webfonts#webfont", "family": "Delius", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/delius/v6/TQA163qafki2-gV-B6F_ag.ttf" } }, { "kind": "webfonts#webfont", "family": "Delius Swash Caps", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/deliusswashcaps/v8/uXyrEUnoWApxIOICunRq7yIrxb5zDVgU2N3VzXm7zq4.ttf" } }, { "kind": "webfonts#webfont", "family": "Delius Unicase", "category": "handwriting", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/deliusunicase/v9/b2sKujV3Q48RV2PQ0k1vqu6rPKfVZo7L2bERcf0BDns.ttf", "700": "http://fonts.gstatic.com/s/deliusunicase/v9/7FTMTITcb4dxUp99FAdTqNy5weKXdcrx-wE0cgECMq8.ttf" } }, { "kind": "webfonts#webfont", "family": "Della Respira", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/dellarespira/v4/F4E6Lo_IZ6L9AJCcbqtDVeDcg5akpSnIcsPhLOFv7l8.ttf" } }, { "kind": "webfonts#webfont", "family": "Denk One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/denkone/v4/TdXOeA4eA_hEx4W8Sh9wPw.ttf" } }, { "kind": "webfonts#webfont", "family": "Devonshire", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/devonshire/v5/I3ct_2t12SYizP8ZC-KFi_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Dhurjati", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin", "telugu" ], "version": "v4", "lastModified": "2014-12-10", "files": { "regular": "http://fonts.gstatic.com/s/dhurjati/v4/uV6jO5e2iFMbGB0z79Cy5g.ttf" } }, { "kind": "webfonts#webfont", "family": "Didact Gothic", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "greek-ext", "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/didactgothic/v7/v8_72sD3DYMKyM0dn3LtWotBLojGU5Qdl8-5NL4v70w.ttf" } }, { "kind": "webfonts#webfont", "family": "Diplomata", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/diplomata/v6/u-ByBiKgN6rTMA36H3kcKg.ttf" } }, { "kind": "webfonts#webfont", "family": "Diplomata SC", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/diplomatasc/v5/JdVwAwfE1a_pahXjk5qpNi3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Domine", "category": "serif", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/domine/v4/wfVIgamVFjMNQAEWurCiHA.ttf", "700": "http://fonts.gstatic.com/s/domine/v4/phBcG1ZbQFxUIt18hPVxnw.ttf" } }, { "kind": "webfonts#webfont", "family": "Donegal One", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/donegalone/v4/6kN4-fDxz7T9s5U61HwfF6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Doppio One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/doppioone/v4/WHZ3HJQotpk_4aSMNBo_t_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Dorsa", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/dorsa/v7/wCc3cUe6XrmG2LQE6GlIrw.ttf" } }, { "kind": "webfonts#webfont", "family": "Dosis", "category": "sans-serif", "variants": [ "200", "300", "regular", "500", "600", "700", "800" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "200": "http://fonts.gstatic.com/s/dosis/v4/ztftab0r6hcd7AeurUGrSQ.ttf", "300": "http://fonts.gstatic.com/s/dosis/v4/awIB6L0h5mb0plIKorXmuA.ttf", "regular": "http://fonts.gstatic.com/s/dosis/v4/rJRlixu-w0JZ1MyhJpao_Q.ttf", "500": "http://fonts.gstatic.com/s/dosis/v4/ruEXDOFMxDPGnjCBKRqdAQ.ttf", "600": "http://fonts.gstatic.com/s/dosis/v4/KNAswRNwm3tfONddYyidxg.ttf", "700": "http://fonts.gstatic.com/s/dosis/v4/AEEAj0ONidK8NQQMBBlSig.ttf", "800": "http://fonts.gstatic.com/s/dosis/v4/nlrKd8E69vvUU39XGsvR7Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Dr Sugiyama", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/drsugiyama/v5/S5Yx3MIckgoyHhhS4C9Tv6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Droid Sans", "category": "sans-serif", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/droidsans/v6/rS9BT6-asrfjpkcV3DXf__esZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/droidsans/v6/EFpQQyG9GqCrobXxL-KRMQJKKGfqHaYFsRG-T3ceEVo.ttf" } }, { "kind": "webfonts#webfont", "family": "Droid Sans Mono", "category": "monospace", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/droidsansmono/v7/ns-m2xQYezAtqh7ai59hJcwD6PD0c3_abh9zHKQtbGU.ttf" } }, { "kind": "webfonts#webfont", "family": "Droid Serif", "category": "serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/droidserif/v6/DgAtPy6rIVa2Zx3Xh9KaNaCWcynf_cDxXwCLxiixG1c.ttf", "italic": "http://fonts.gstatic.com/s/droidserif/v6/cj2hUnSRBhwmSPr9kS5890eOrDcLawS7-ssYqLr2Xp4.ttf", "700": "http://fonts.gstatic.com/s/droidserif/v6/QQt14e8dY39u-eYBZmppwXe1Pd76Vl7zRpE7NLJQ7XU.ttf", "700italic": "http://fonts.gstatic.com/s/droidserif/v6/c92rD_x0V1LslSFt3-QEps_zJjSACmk0BRPxQqhnNLU.ttf" } }, { "kind": "webfonts#webfont", "family": "Duru Sans", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/durusans/v8/R1xHvAOARPh8_so9_UKw1w.ttf" } }, { "kind": "webfonts#webfont", "family": "Dynalight", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/dynalight/v5/-CWsIe8OUDWTIHjSAh41kA.ttf" } }, { "kind": "webfonts#webfont", "family": "EB Garamond", "category": "serif", "variants": [ "regular" ], "subsets": [ "vietnamese", "latin-ext", "latin", "cyrillic-ext", "cyrillic" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ebgaramond/v7/CDR0kuiFK7I1OZ2hSdR7G6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Eagle Lake", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/eaglelake/v4/ZKlYin7caemhx9eSg6RvPfesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Eater", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/eater/v5/gm6f3OmYEdbs3lPQtUfBkA.ttf" } }, { "kind": "webfonts#webfont", "family": "Economica", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/economica/v4/G4rJRujzZbq9Nxngu9l3hg.ttf", "italic": "http://fonts.gstatic.com/s/economica/v4/p5O9AVeUqx_n35xQRinNYaCWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/economica/v4/UK4l2VEpwjv3gdcwbwXE9C3USBnSvpkopQaUR-2r7iU.ttf", "700italic": "http://fonts.gstatic.com/s/economica/v4/ac5dlUsedQ03RqGOeay-3Xe1Pd76Vl7zRpE7NLJQ7XU.ttf" } }, { "kind": "webfonts#webfont", "family": "Ek Mukta", "category": "sans-serif", "variants": [ "200", "300", "regular", "500", "600", "700", "800" ], "subsets": [ "latin-ext", "latin", "devanagari" ], "version": "v7", "lastModified": "2014-08-28", "files": { "200": "http://fonts.gstatic.com/s/ekmukta/v7/crtkNHh5JcM3VJKG0E-B36CWcynf_cDxXwCLxiixG1c.ttf", "300": "http://fonts.gstatic.com/s/ekmukta/v7/mpaAv7CIyk0VnZlqSneVxKCWcynf_cDxXwCLxiixG1c.ttf", "regular": "http://fonts.gstatic.com/s/ekmukta/v7/aFcjXdC5jyJ1p8w54wIIrg.ttf", "500": "http://fonts.gstatic.com/s/ekmukta/v7/PZ1y2MstFczWvBlFSgzMyaCWcynf_cDxXwCLxiixG1c.ttf", "600": "http://fonts.gstatic.com/s/ekmukta/v7/Z5Mfzeu6M3emakcJO2QeTqCWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/ekmukta/v7/4ugcOGR28Jn-oBIn0-qLYaCWcynf_cDxXwCLxiixG1c.ttf", "800": "http://fonts.gstatic.com/s/ekmukta/v7/O68TH5OjEhVmn9_gIrcfS6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Electrolize", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/electrolize/v5/yFVu5iokC-nt4B1Cyfxb9aCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Elsie", "category": "display", "variants": [ "regular", "900" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/elsie/v5/gwspePauE45BJu6Ok1QrfQ.ttf", "900": "http://fonts.gstatic.com/s/elsie/v5/1t-9f0N2NFYwAgN7oaISqg.ttf" } }, { "kind": "webfonts#webfont", "family": "Elsie Swash Caps", "category": "display", "variants": [ "regular", "900" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/elsieswashcaps/v4/9L3hIJMPCf6sxCltnxd6X2YeFSdnSpRYv5h9gpdlD1g.ttf", "900": "http://fonts.gstatic.com/s/elsieswashcaps/v4/iZnus9qif0tR5pGaDv5zdKoKBWBozTtxi30NfZDOXXU.ttf" } }, { "kind": "webfonts#webfont", "family": "Emblema One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/emblemaone/v5/7IlBUjBWPIiw7cr_O2IfSaCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Emilys Candy", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/emilyscandy/v4/PofLVm6v1SwZGOzC8s-I3S3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Engagement", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/engagement/v5/4Uz0Jii7oVPcaFRYmbpU6vesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Englebert", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/englebert/v4/sll38iOvOuarDTYBchlP3Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Enriqueta", "category": "serif", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/enriqueta/v5/_p90TrIwR1SC-vDKtmrv6A.ttf", "700": "http://fonts.gstatic.com/s/enriqueta/v5/I27Pb-wEGH2ajLYP0QrtSC3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Erica One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ericaone/v6/cIBnH2VAqQMIGYAcE4ufvQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Esteban", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/esteban/v4/ESyhLgqDDyK5JcFPp2svDw.ttf" } }, { "kind": "webfonts#webfont", "family": "Euphoria Script", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/euphoriascript/v4/c4XB4Iijj_NvSsCF4I0O2MxLhO8OSNnfAp53LK1_iRs.ttf" } }, { "kind": "webfonts#webfont", "family": "Ewert", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ewert/v4/Em8hrzuzSbfHcTVqMjbAQg.ttf" } }, { "kind": "webfonts#webfont", "family": "Exo", "category": "sans-serif", "variants": [ "100", "100italic", "200", "200italic", "300", "300italic", "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic", "800", "800italic", "900", "900italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "100": "http://fonts.gstatic.com/s/exo/v4/RI7A9uwjRmPbVp0n8e-Jvg.ttf", "100italic": "http://fonts.gstatic.com/s/exo/v4/qtGyZZlWb2EEvby3ZPosxw.ttf", "200": "http://fonts.gstatic.com/s/exo/v4/F8OfC_swrRRxpFt-tlXZQg.ttf", "200italic": "http://fonts.gstatic.com/s/exo/v4/fr4HBfXHYiIngW2_bhlgRw.ttf", "300": "http://fonts.gstatic.com/s/exo/v4/SBrN7TKUqgGUvfxqHqsnNw.ttf", "300italic": "http://fonts.gstatic.com/s/exo/v4/3gmiLjBegIfcDLISjTGA1g.ttf", "regular": "http://fonts.gstatic.com/s/exo/v4/eUEzTFueNXRVhbt4PEB8kQ.ttf", "italic": "http://fonts.gstatic.com/s/exo/v4/cfgolWisMSURhpQeVHl_NA.ttf", "500": "http://fonts.gstatic.com/s/exo/v4/jCg6DmGGXt_OVyp5ofQHPw.ttf", "500italic": "http://fonts.gstatic.com/s/exo/v4/lo5eTdCNJZQVN08p8RnzAQ.ttf", "600": "http://fonts.gstatic.com/s/exo/v4/q_SG5kXUmOcIvFpgtdZnlw.ttf", "600italic": "http://fonts.gstatic.com/s/exo/v4/0cExa8K_pxS2lTuMr68XUA.ttf", "700": "http://fonts.gstatic.com/s/exo/v4/3_jwsL4v9uHjl5Q37G57mw.ttf", "700italic": "http://fonts.gstatic.com/s/exo/v4/0me55yJIxd5vyQ9bF7SsiA.ttf", "800": "http://fonts.gstatic.com/s/exo/v4/yLPuxBuV0lzqibRJyooOJg.ttf", "800italic": "http://fonts.gstatic.com/s/exo/v4/n3LejeKVj_8gtZq5fIgNYw.ttf", "900": "http://fonts.gstatic.com/s/exo/v4/97d0nd6Yv4-SA_X92xAuZA.ttf", "900italic": "http://fonts.gstatic.com/s/exo/v4/JHTkQVhzyLtkY13Ye95TJQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Exo 2", "category": "sans-serif", "variants": [ "100", "100italic", "200", "200italic", "300", "300italic", "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic", "800", "800italic", "900", "900italic" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v3", "lastModified": "2014-08-28", "files": { "100": "http://fonts.gstatic.com/s/exo2/v3/oVOtQy53isv97g4UhBUDqg.ttf", "100italic": "http://fonts.gstatic.com/s/exo2/v3/LNYVgsJcaCxoKFHmd4AZcg.ttf", "200": "http://fonts.gstatic.com/s/exo2/v3/qa-Ci2pBwJdCxciE1ErifQ.ttf", "200italic": "http://fonts.gstatic.com/s/exo2/v3/DCrVxDVvS69n50O-5erZVvesZW2xOQ-xsNqO47m55DA.ttf", "300": "http://fonts.gstatic.com/s/exo2/v3/nLUBdz_lHHoVIPor05Byhw.ttf", "300italic": "http://fonts.gstatic.com/s/exo2/v3/iSy9VTeUTiqiurQg2ywtu_esZW2xOQ-xsNqO47m55DA.ttf", "regular": "http://fonts.gstatic.com/s/exo2/v3/Pf_kZuIH5c5WKVkQUaeSWQ.ttf", "italic": "http://fonts.gstatic.com/s/exo2/v3/xxA5ZscX9sTU6U0lZJUlYA.ttf", "500": "http://fonts.gstatic.com/s/exo2/v3/oM0rzUuPqVJpW-VEIpuW5w.ttf", "500italic": "http://fonts.gstatic.com/s/exo2/v3/amzRVCB-gipwdihZZ2LtT_esZW2xOQ-xsNqO47m55DA.ttf", "600": "http://fonts.gstatic.com/s/exo2/v3/YnSn3HsyvyI1feGSdRMYqA.ttf", "600italic": "http://fonts.gstatic.com/s/exo2/v3/Vmo58BiptGwfVFb0teU5gPesZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/exo2/v3/2DiK4XkdTckfTk6we73-bQ.ttf", "700italic": "http://fonts.gstatic.com/s/exo2/v3/Sdo-zW-4_--pDkTg6bYrY_esZW2xOQ-xsNqO47m55DA.ttf", "800": "http://fonts.gstatic.com/s/exo2/v3/IVYl_7dJruOg8zKRpC8Hrw.ttf", "800italic": "http://fonts.gstatic.com/s/exo2/v3/p0TA6KeOz1o4rySEbvUxI_esZW2xOQ-xsNqO47m55DA.ttf", "900": "http://fonts.gstatic.com/s/exo2/v3/e8csG8Wnu87AF6uCndkFRQ.ttf", "900italic": "http://fonts.gstatic.com/s/exo2/v3/KPhsGCoT2-7Uj6pMlRscH_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Expletus Sans", "category": "display", "variants": [ "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/expletussans/v7/gegTSDBDs5le3g6uxU1ZsX8f0n03UdmQgF_CLvNR2vg.ttf", "italic": "http://fonts.gstatic.com/s/expletussans/v7/Y-erXmY0b6DU_i2Qu0hTJj4G9C9ttb0Oz5Cvf0qOitE.ttf", "500": "http://fonts.gstatic.com/s/expletussans/v7/cl6rhMY77Ilk8lB_uYRRwAqQmZ7VjhwksfpNVG0pqGc.ttf", "500italic": "http://fonts.gstatic.com/s/expletussans/v7/sRBNtc46w65uJE451UYmW87DCVO6wo6i5LKIyZDzK40.ttf", "600": "http://fonts.gstatic.com/s/expletussans/v7/cl6rhMY77Ilk8lB_uYRRwCvj1tU7IJMS3CS9kCx2B3U.ttf", "600italic": "http://fonts.gstatic.com/s/expletussans/v7/sRBNtc46w65uJE451UYmW8yKH23ZS6zCKOFHG0e_4JE.ttf", "700": "http://fonts.gstatic.com/s/expletussans/v7/cl6rhMY77Ilk8lB_uYRRwFCbmAUID8LN-q3pJpOk3Ys.ttf", "700italic": "http://fonts.gstatic.com/s/expletussans/v7/sRBNtc46w65uJE451UYmW5F66r9C4AnxxlBlGd7xY4g.ttf" } }, { "kind": "webfonts#webfont", "family": "Fanwood Text", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/fanwoodtext/v6/hDNDHUlsSb8bgnEmDp4T_i3USBnSvpkopQaUR-2r7iU.ttf", "italic": "http://fonts.gstatic.com/s/fanwoodtext/v6/0J3SBbkMZqBV-3iGxs5E9_MZXuCXbOrAvx5R0IT5Oyo.ttf" } }, { "kind": "webfonts#webfont", "family": "Fascinate", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/fascinate/v5/ZE0637WWkBPKt1AmFaqD3Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Fascinate Inline", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/fascinateinline/v6/lRguYfMfWArflkm5aOQ5QJmp8DTZ6iHear7UV05iykg.ttf" } }, { "kind": "webfonts#webfont", "family": "Faster One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/fasterone/v5/YxTOW2sf56uxD1T7byP5K_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Fasthand", "category": "serif", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/fasthand/v7/6XAagHH_KmpZL67wTvsETQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Fauna One", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/faunaone/v4/8kL-wpAPofcAMELI_5NRnQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Federant", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/federant/v7/tddZFSiGvxICNOGra0i5aA.ttf" } }, { "kind": "webfonts#webfont", "family": "Federo", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/federo/v8/JPhe1S2tujeyaR79gXBLeQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Felipa", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/felipa/v4/SeyfyFZY7abAQXGrOIYnYg.ttf" } }, { "kind": "webfonts#webfont", "family": "Fenix", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/fenix/v4/Ak8wR3VSlAN7VN_eMeJj7Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Finger Paint", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/fingerpaint/v4/m_ZRbiY-aPb13R3DWPBGXy3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Fira Mono", "category": "monospace", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v3", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/firamono/v3/WQOm1D4RO-yvA9q9trJc8g.ttf", "700": "http://fonts.gstatic.com/s/firamono/v3/l24Wph3FsyKAbJ8dfExTZy3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Fira Sans", "category": "sans-serif", "variants": [ "300", "300italic", "regular", "italic", "500", "500italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v5", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/firasans/v5/VTBnrK42EiOBncVyQXZ7jy3USBnSvpkopQaUR-2r7iU.ttf", "300italic": "http://fonts.gstatic.com/s/firasans/v5/6s0YCA9oCTF6hM60YM-qTS9-WlPSxbfiI49GsXo3q0g.ttf", "regular": "http://fonts.gstatic.com/s/firasans/v5/nsT0isDy56OkSX99sFQbXw.ttf", "italic": "http://fonts.gstatic.com/s/firasans/v5/cPT_2ddmoxsUuMtQqa8zGqCWcynf_cDxXwCLxiixG1c.ttf", "500": "http://fonts.gstatic.com/s/firasans/v5/zM2u8V3CuPVwAAXFQcDi4C3USBnSvpkopQaUR-2r7iU.ttf", "500italic": "http://fonts.gstatic.com/s/firasans/v5/6s0YCA9oCTF6hM60YM-qTcCNfqCYlB_eIx7H1TVXe60.ttf", "700": "http://fonts.gstatic.com/s/firasans/v5/DugPdSljmOTocZOR2CItOi3USBnSvpkopQaUR-2r7iU.ttf", "700italic": "http://fonts.gstatic.com/s/firasans/v5/6s0YCA9oCTF6hM60YM-qTXe1Pd76Vl7zRpE7NLJQ7XU.ttf" } }, { "kind": "webfonts#webfont", "family": "Fjalla One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/fjallaone/v4/3b7vWCfOZsU53vMa8LWsf_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Fjord One", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/fjordone/v5/R_YHK8au2uFPw5tNu5N7zw.ttf" } }, { "kind": "webfonts#webfont", "family": "Flamenco", "category": "display", "variants": [ "300", "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/flamenco/v6/x9iI5CogvuZVCGoRHwXuo6CWcynf_cDxXwCLxiixG1c.ttf", "regular": "http://fonts.gstatic.com/s/flamenco/v6/HC0ugfLLgt26I5_BWD1PZA.ttf" } }, { "kind": "webfonts#webfont", "family": "Flavors", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/flavors/v5/SPJi5QclATvon8ExcKGRvQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Fondamento", "category": "handwriting", "variants": [ "regular", "italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/fondamento/v5/6LWXcjT1B7bnWluAOSNfMPesZW2xOQ-xsNqO47m55DA.ttf", "italic": "http://fonts.gstatic.com/s/fondamento/v5/y6TmwhSbZ8rYq7OTFyo7OS3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Fontdiner Swanky", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/fontdinerswanky/v6/8_GxIO5ixMtn5P6COsF3TlBjMPLzPAFJwRBn-s1U7kA.ttf" } }, { "kind": "webfonts#webfont", "family": "Forum", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic-ext", "cyrillic" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/forum/v7/MZUpsq1VfLrqv8eSDcbrrQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Francois One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v9", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/francoisone/v9/bYbkq2nU2TSx4SwFbz5sCC3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Freckle Face", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/freckleface/v4/7-B8j9BPJgazdHIGqPNv8y3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Fredericka the Great", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/frederickathegreat/v5/7Es8Lxoku-e5eOZWpxw18nrnet6gXN1McwdQxS1dVrI.ttf" } }, { "kind": "webfonts#webfont", "family": "Fredoka One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/fredokaone/v4/QKfwXi-z-KtJAlnO2ethYqCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Freehand", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/freehand/v8/uEBQxvA0lnn_BrD6krlxMw.ttf" } }, { "kind": "webfonts#webfont", "family": "Fresca", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/fresca/v5/2q7Qm9sCo1tWvVgSDVWNIw.ttf" } }, { "kind": "webfonts#webfont", "family": "Frijole", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/frijole/v5/L2MfZse-2gCascuD-nLhWg.ttf" } }, { "kind": "webfonts#webfont", "family": "Fruktur", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/fruktur/v6/PnQvfEi1LssAvhJsCwH__w.ttf" } }, { "kind": "webfonts#webfont", "family": "Fugaz One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/fugazone/v6/5tteVDCwxsr8-5RuSiRWOw.ttf" } }, { "kind": "webfonts#webfont", "family": "GFS Didot", "category": "serif", "variants": [ "regular" ], "subsets": [ "greek" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/gfsdidot/v6/jQKxZy2RU-h9tkPZcRVluA.ttf" } }, { "kind": "webfonts#webfont", "family": "GFS Neohellenic", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "greek" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/gfsneohellenic/v7/B4xRqbn-tANVqVgamMsSDiayCZa0z7CpFzlkqoCHztc.ttf", "italic": "http://fonts.gstatic.com/s/gfsneohellenic/v7/KnaWrO4awITAqigQIIYXKkCTdomiyJpIzPbEbIES3rU.ttf", "700": "http://fonts.gstatic.com/s/gfsneohellenic/v7/7HwjPQa7qNiOsnUce2h4448_BwCLZY3eDSV6kppAwI8.ttf", "700italic": "http://fonts.gstatic.com/s/gfsneohellenic/v7/FwWjoX6XqT-szJFyqsu_GYFF0fM4h-krcpQk7emtCpE.ttf" } }, { "kind": "webfonts#webfont", "family": "Gabriela", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/gabriela/v4/B-2ZfbAO3HDrxqV6lR5tdA.ttf" } }, { "kind": "webfonts#webfont", "family": "Gafata", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/gafata/v5/aTFqlki_3Dc3geo-FxHTvQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Galdeano", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/galdeano/v6/ZKFMQI6HxEG1jOT0UGSZUg.ttf" } }, { "kind": "webfonts#webfont", "family": "Galindo", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/galindo/v4/2lafAS_ZEfB33OJryhXDUg.ttf" } }, { "kind": "webfonts#webfont", "family": "Gentium Basic", "category": "serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/gentiumbasic/v7/KCktj43blvLkhOTolFn-MYtBLojGU5Qdl8-5NL4v70w.ttf", "italic": "http://fonts.gstatic.com/s/gentiumbasic/v7/qoFz4NSMaYC2UmsMAG3lyTj3mvXnCeAk09uTtmkJGRc.ttf", "700": "http://fonts.gstatic.com/s/gentiumbasic/v7/2qL6yulgGf0wwgOp-UqGyLNuTeOOLg3nUymsEEGmdO0.ttf", "700italic": "http://fonts.gstatic.com/s/gentiumbasic/v7/8N9-c_aQDJ8LbI1NGVMrwtswO1vWwP9exiF8s0wqW10.ttf" } }, { "kind": "webfonts#webfont", "family": "Gentium Book Basic", "category": "serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/gentiumbookbasic/v6/IRFxB2matTxrjZt6a3FUnrWDjKAyldGEr6eEi2MBNeY.ttf", "italic": "http://fonts.gstatic.com/s/gentiumbookbasic/v6/qHqW2lwKO8-uTfIkh8FsUfXfjMwrYnmPVsQth2IcAPY.ttf", "700": "http://fonts.gstatic.com/s/gentiumbookbasic/v6/T2vUYmWzlqUtgLYdlemGnaWESMHIjnSjm9UUxYtEOko.ttf", "700italic": "http://fonts.gstatic.com/s/gentiumbookbasic/v6/632u7TMIoFDWQYUaHFUp5PA2A9KyRZEkn4TZVuhsWRM.ttf" } }, { "kind": "webfonts#webfont", "family": "Geo", "category": "sans-serif", "variants": [ "regular", "italic" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/geo/v8/mJuJYk5Pww84B4uHAQ1XaA.ttf", "italic": "http://fonts.gstatic.com/s/geo/v8/8_r1wToF7nPdDuX1qxel6Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Geostar", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/geostar/v6/A8WQbhQbpYx3GWWaShJ9GA.ttf" } }, { "kind": "webfonts#webfont", "family": "Geostar Fill", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/geostarfill/v6/Y5ovXPPOHYTfQzK2aM-hui3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Germania One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/germaniaone/v4/3_6AyUql_-FbDi1e68jHdC3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Gidugu", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin", "telugu" ], "version": "v3", "lastModified": "2014-12-10", "files": { "regular": "http://fonts.gstatic.com/s/gidugu/v3/Ey6Eq3hrT6MM58iFItFcgw.ttf" } }, { "kind": "webfonts#webfont", "family": "Gilda Display", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/gildadisplay/v4/8yAVUZLLZ3wb7dSsjix0CADHmap7fRWINAsw8-RaxNg.ttf" } }, { "kind": "webfonts#webfont", "family": "Give You Glory", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/giveyouglory/v6/DFEWZFgGmfseyIdGRJAxuBwwkpSPZdvjnMtysdqprfI.ttf" } }, { "kind": "webfonts#webfont", "family": "Glass Antiqua", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/glassantiqua/v4/0yLrXKplgdUDIMz5TnCHNODcg5akpSnIcsPhLOFv7l8.ttf" } }, { "kind": "webfonts#webfont", "family": "Glegoo", "category": "serif", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin", "devanagari" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/glegoo/v5/2tf-h3n2A_SNYXEO0C8bKw.ttf", "700": "http://fonts.gstatic.com/s/glegoo/v5/TlLolbauH0-0Aiz1LUH5og.ttf" } }, { "kind": "webfonts#webfont", "family": "Gloria Hallelujah", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/gloriahallelujah/v7/CA1k7SlXcY5kvI81M_R28Q3RdPdyebSUyJECJouPsvA.ttf" } }, { "kind": "webfonts#webfont", "family": "Goblin One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/goblinone/v6/331XtzoXgpVEvNTVcBJ_C_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Gochi Hand", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/gochihand/v7/KT1-WxgHsittJ34_20IfAPesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Gorditas", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/gorditas/v4/uMgZhXUyH6qNGF3QsjQT5Q.ttf", "700": "http://fonts.gstatic.com/s/gorditas/v4/6-XCeknmxaon8AUqVkMnHaCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Goudy Bookletter 1911", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/goudybookletter1911/v6/l5lwlGTN3pEY5Bf-rQEuIIjNDsyURsIKu4GSfvSE4mA.ttf" } }, { "kind": "webfonts#webfont", "family": "Graduate", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/graduate/v4/JpAmYLHqcIh9_Ff35HHwiA.ttf" } }, { "kind": "webfonts#webfont", "family": "Grand Hotel", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/grandhotel/v4/C_A8HiFZjXPpnMt38XnK7qCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Gravitas One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/gravitasone/v6/nBHdBv6zVNU8MtP6w9FwTS3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Great Vibes", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/greatvibes/v4/4Mi5RG_9LjQYrTU55GN_L6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Griffy", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/griffy/v4/vWkyYGBSyE5xjnShNtJtzw.ttf" } }, { "kind": "webfonts#webfont", "family": "Gruppo", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/gruppo/v7/pS_JM0cK_piBZve-lfUq9w.ttf" } }, { "kind": "webfonts#webfont", "family": "Gudea", "category": "sans-serif", "variants": [ "regular", "italic", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/gudea/v4/S-4QqBlkMPiiA3jNeCR5yw.ttf", "italic": "http://fonts.gstatic.com/s/gudea/v4/7mNgsGw_vfS-uUgRVXNDSw.ttf", "700": "http://fonts.gstatic.com/s/gudea/v4/lsip4aiWhJ9bx172Y9FN_w.ttf" } }, { "kind": "webfonts#webfont", "family": "Habibi", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/habibi/v5/YYyqXF6pWpL7kmKgS_2iUA.ttf" } }, { "kind": "webfonts#webfont", "family": "Halant", "category": "serif", "variants": [ "300", "regular", "500", "600", "700" ], "subsets": [ "latin-ext", "latin", "devanagari" ], "version": "v1", "lastModified": "2014-08-27", "files": { "300": "http://fonts.gstatic.com/s/halant/v1/dM3ItAOWNNod_Cf3MnLlEg.ttf", "regular": "http://fonts.gstatic.com/s/halant/v1/rEs7Jk3SVyt3cTx6DoTu1w.ttf", "500": "http://fonts.gstatic.com/s/halant/v1/tlsNj3K-hJKtiirTDtUbkQ.ttf", "600": "http://fonts.gstatic.com/s/halant/v1/zNR2WvI_V8o652vIZp3X4Q.ttf", "700": "http://fonts.gstatic.com/s/halant/v1/D9FN7OH89AuCmZDLHbPQfA.ttf" } }, { "kind": "webfonts#webfont", "family": "Hammersmith One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/hammersmithone/v7/FWNn6ITYqL6or7ZTmBxRhjjVlsJB_M_Q_LtZxsoxvlw.ttf" } }, { "kind": "webfonts#webfont", "family": "Hanalei", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/hanalei/v6/Sx8vVMBnXSQyK6Cn0CBJ3A.ttf" } }, { "kind": "webfonts#webfont", "family": "Hanalei Fill", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/hanaleifill/v5/5uPeWLnaDdtm4UBG26Ds6C3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Handlee", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/handlee/v5/6OfkXkyC0E5NZN80ED8u3A.ttf" } }, { "kind": "webfonts#webfont", "family": "Hanuman", "category": "serif", "variants": [ "regular", "700" ], "subsets": [ "khmer" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/hanuman/v8/hRhwOGGmElJSl6KSPvEnOQ.ttf", "700": "http://fonts.gstatic.com/s/hanuman/v8/lzzXZ2l84x88giDrbfq76vesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Happy Monkey", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/happymonkey/v5/c2o0ps8nkBmaOYctqBq1rS3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Headland One", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/headlandone/v4/iGmBeOvQGfq9DSbjJ8jDVy3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Henny Penny", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/hennypenny/v4/XRgo3ogXyi3tpsFfjImRF6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Herr Von Muellerhoff", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/herrvonmuellerhoff/v6/mmy24EUmk4tjm4gAEjUd7NLGIYrUsBdh-JWHYgiDiMU.ttf" } }, { "kind": "webfonts#webfont", "family": "Hind", "category": "sans-serif", "variants": [ "300", "regular", "500", "600", "700" ], "subsets": [ "latin-ext", "latin", "devanagari" ], "version": "v5", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/hind/v5/qa346Adgv9kPDXoD1my4kA.ttf", "regular": "http://fonts.gstatic.com/s/hind/v5/mktFHh5Z5P9YjGKSslSUtA.ttf", "500": "http://fonts.gstatic.com/s/hind/v5/2cs8RCVcYtiv4iNDH1UsQQ.ttf", "600": "http://fonts.gstatic.com/s/hind/v5/TUKUmFMXSoxloBP1ni08oA.ttf", "700": "http://fonts.gstatic.com/s/hind/v5/cXJJavLdUbCfjxlsA6DqTw.ttf" } }, { "kind": "webfonts#webfont", "family": "Holtwood One SC", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/holtwoodonesc/v7/sToOq3cIxbfnhbEkgYNuBbAgSRh1LpJXlLfl8IbsmHg.ttf" } }, { "kind": "webfonts#webfont", "family": "Homemade Apple", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/homemadeapple/v6/yg3UMEsefgZ8IHz_ryz86BiPOmFWYV1WlrJkRafc4c0.ttf" } }, { "kind": "webfonts#webfont", "family": "Homenaje", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/homenaje/v5/v0YBU0iBRrGdVjDNQILxtA.ttf" } }, { "kind": "webfonts#webfont", "family": "IM Fell DW Pica", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/imfelldwpica/v6/W81bfaWiUicLSPbJhW-ATsA5qm663gJGVdtpamafG5A.ttf", "italic": "http://fonts.gstatic.com/s/imfelldwpica/v6/alQJ8SK5aSOZVaelYoyT4PL2asmh5DlYQYCosKo6yQs.ttf" } }, { "kind": "webfonts#webfont", "family": "IM Fell DW Pica SC", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/imfelldwpicasc/v6/xBKKJV4z2KsrtQnmjGO17JZ9RBdEL0H9o5qzT1Rtof4.ttf" } }, { "kind": "webfonts#webfont", "family": "IM Fell Double Pica", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/imfelldoublepica/v6/yN1wY_01BkQnO0LYAhXdUol14jEdVOhEmvtCMCVwYak.ttf", "italic": "http://fonts.gstatic.com/s/imfelldoublepica/v6/64odUh2hAw8D9dkFKTlWYq0AWwkgdQfsRHec8TYi4mI.ttf" } }, { "kind": "webfonts#webfont", "family": "IM Fell Double Pica SC", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/imfelldoublepicasc/v6/jkrUtrLFpMw4ZazhfkKsGwc4LoC4OJUqLw9omnT3VOU.ttf" } }, { "kind": "webfonts#webfont", "family": "IM Fell English", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/imfellenglish/v6/xwIisCqGFi8pff-oa9uSVHGNmx1fDm-u2eBJHQkdrmk.ttf", "italic": "http://fonts.gstatic.com/s/imfellenglish/v6/Z3cnIAI_L3XTRfz4JuZKbuewladMPCWTthtMv9cPS-c.ttf" } }, { "kind": "webfonts#webfont", "family": "IM Fell English SC", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/imfellenglishsc/v6/h3Tn6yWfw4b5qaLD1RWvz5ATixNthKRRR1XVH3rJNiw.ttf" } }, { "kind": "webfonts#webfont", "family": "IM Fell French Canon", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/imfellfrenchcanon/v6/iKB0WL1BagSpNPz3NLMdsJ3V2FNpBrlLSvqUnERhBP8.ttf", "italic": "http://fonts.gstatic.com/s/imfellfrenchcanon/v6/owCuNQkLLFW7TBBPJbMnhRa-QL94KdW80H29tcyld2A.ttf" } }, { "kind": "webfonts#webfont", "family": "IM Fell French Canon SC", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/imfellfrenchcanonsc/v6/kA3bS19-tQbeT_iG32EZmaiyyzHwYrAbmNulTz423iM.ttf" } }, { "kind": "webfonts#webfont", "family": "IM Fell Great Primer", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/imfellgreatprimer/v6/AL8ALGNthei20f9Cu3e93rgeX3ROgtTz44CitKAxzKI.ttf", "italic": "http://fonts.gstatic.com/s/imfellgreatprimer/v6/1a-artkXMVg682r7TTxVY1_YG2SFv8Ma7CxRl1S3o7g.ttf" } }, { "kind": "webfonts#webfont", "family": "IM Fell Great Primer SC", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/imfellgreatprimersc/v6/A313vRj97hMMGFjt6rgSJtRg-ciw1Y27JeXb2Zv4lZQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Iceberg", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/iceberg/v4/p2XVm4M-N0AOEEOymFKC5w.ttf" } }, { "kind": "webfonts#webfont", "family": "Iceland", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/iceland/v5/kq3uTMGgvzWGNi39B_WxGA.ttf" } }, { "kind": "webfonts#webfont", "family": "Imprima", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/imprima/v4/eRjquWLjwLGnTEhLH7u3kA.ttf" } }, { "kind": "webfonts#webfont", "family": "Inconsolata", "category": "monospace", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v10", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/inconsolata/v10/7bMKuoy6Nh0ft0SHnIGMuaCWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/inconsolata/v10/AIed271kqQlcIRSOnQH0yXe1Pd76Vl7zRpE7NLJQ7XU.ttf" } }, { "kind": "webfonts#webfont", "family": "Inder", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/inder/v5/C38TwecLTfKxIHDc_Adcrw.ttf" } }, { "kind": "webfonts#webfont", "family": "Indie Flower", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/indieflower/v7/10JVD_humAd5zP2yrFqw6i3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Inika", "category": "serif", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/inika/v4/eZCrULQGaIxkrRoGz_DjhQ.ttf", "700": "http://fonts.gstatic.com/s/inika/v4/bl3ZoTyrWsFun2zYbsgJrA.ttf" } }, { "kind": "webfonts#webfont", "family": "Irish Grover", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/irishgrover/v6/kUp7uUPooL-KsLGzeVJbBC3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Istok Web", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin", "cyrillic-ext", "cyrillic" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/istokweb/v8/RYLSjEXQ0nNtLLc4n7--dQ.ttf", "italic": "http://fonts.gstatic.com/s/istokweb/v8/kvcT2SlTjmGbC3YlZxmrl6CWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/istokweb/v8/2koEo4AKFSvK4B52O_Mwai3USBnSvpkopQaUR-2r7iU.ttf", "700italic": "http://fonts.gstatic.com/s/istokweb/v8/ycQ3g52ELrh3o_HYCNNUw3e1Pd76Vl7zRpE7NLJQ7XU.ttf" } }, { "kind": "webfonts#webfont", "family": "Italiana", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/italiana/v4/dt95fkCSTOF-c6QNjwSycA.ttf" } }, { "kind": "webfonts#webfont", "family": "Italianno", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/italianno/v6/HsyHnLpKf8uP7aMpDQHZmg.ttf" } }, { "kind": "webfonts#webfont", "family": "Jacques Francois", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/jacquesfrancois/v4/_-0XWPQIW6tOzTHg4KaJ_M13D_4KM32Q4UmTSjpuNGQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Jacques Francois Shadow", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/jacquesfrancoisshadow/v4/V14y0H3vq56fY9SV4OL_FASt0D_oLVawA8L8b9iKjbs.ttf" } }, { "kind": "webfonts#webfont", "family": "Jim Nightshade", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/jimnightshade/v4/_n43lYHXVWNgXegdYRIK9CF1W_bo0EdycfH0kHciIic.ttf" } }, { "kind": "webfonts#webfont", "family": "Jockey One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/jockeyone/v6/cAucnOZLvFo07w2AbufBCfesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Jolly Lodger", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/jollylodger/v4/RX8HnkBgaEKQSHQyP9itiS3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Josefin Sans", "category": "sans-serif", "variants": [ "100", "100italic", "300", "300italic", "regular", "italic", "600", "600italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v9", "lastModified": "2014-10-07", "files": { "100": "http://fonts.gstatic.com/s/josefinsans/v9/q9w3H4aeBxj0hZ8Osfi3d8SVQ0giZ-l_NELu3lgGyYw.ttf", "100italic": "http://fonts.gstatic.com/s/josefinsans/v9/s7-P1gqRNRNn-YWdOYnAOXXcj1rQwlNLIS625o-SrL0.ttf", "300": "http://fonts.gstatic.com/s/josefinsans/v9/C6HYlRF50SGJq1XyXj04z6cQoVhARpoaILP7amxE_8g.ttf", "300italic": "http://fonts.gstatic.com/s/josefinsans/v9/ppse0J9fKSaoxCIIJb33Gyna0FLWfcB-J_SAYmcAXaI.ttf", "regular": "http://fonts.gstatic.com/s/josefinsans/v9/xgzbb53t8j-Mo-vYa23n5i3USBnSvpkopQaUR-2r7iU.ttf", "italic": "http://fonts.gstatic.com/s/josefinsans/v9/q9w3H4aeBxj0hZ8Osfi3d_MZXuCXbOrAvx5R0IT5Oyo.ttf", "600": "http://fonts.gstatic.com/s/josefinsans/v9/C6HYlRF50SGJq1XyXj04z2v8CylhIUtwUiYO7Z2wXbE.ttf", "600italic": "http://fonts.gstatic.com/s/josefinsans/v9/ppse0J9fKSaoxCIIJb33G4R-5-urNOGAobhAyctHvW8.ttf", "700": "http://fonts.gstatic.com/s/josefinsans/v9/C6HYlRF50SGJq1XyXj04z0D2ttfZwueP-QU272T9-k4.ttf", "700italic": "http://fonts.gstatic.com/s/josefinsans/v9/ppse0J9fKSaoxCIIJb33G_As9-1nE9qOqhChW0m4nDE.ttf" } }, { "kind": "webfonts#webfont", "family": "Josefin Slab", "category": "serif", "variants": [ "100", "100italic", "300", "300italic", "regular", "italic", "600", "600italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "100": "http://fonts.gstatic.com/s/josefinslab/v6/etsUjZYO8lTLU85lDhZwUsSVQ0giZ-l_NELu3lgGyYw.ttf", "100italic": "http://fonts.gstatic.com/s/josefinslab/v6/8BjDChqLgBF3RJKfwHIYh3Xcj1rQwlNLIS625o-SrL0.ttf", "300": "http://fonts.gstatic.com/s/josefinslab/v6/NbE6ykYuM2IyEwxQxOIi2KcQoVhARpoaILP7amxE_8g.ttf", "300italic": "http://fonts.gstatic.com/s/josefinslab/v6/af9sBoKGPbGO0r21xJulyyna0FLWfcB-J_SAYmcAXaI.ttf", "regular": "http://fonts.gstatic.com/s/josefinslab/v6/46aYWdgz-1oFX11flmyEfS3USBnSvpkopQaUR-2r7iU.ttf", "italic": "http://fonts.gstatic.com/s/josefinslab/v6/etsUjZYO8lTLU85lDhZwUvMZXuCXbOrAvx5R0IT5Oyo.ttf", "600": "http://fonts.gstatic.com/s/josefinslab/v6/NbE6ykYuM2IyEwxQxOIi2Gv8CylhIUtwUiYO7Z2wXbE.ttf", "600italic": "http://fonts.gstatic.com/s/josefinslab/v6/af9sBoKGPbGO0r21xJuly4R-5-urNOGAobhAyctHvW8.ttf", "700": "http://fonts.gstatic.com/s/josefinslab/v6/NbE6ykYuM2IyEwxQxOIi2ED2ttfZwueP-QU272T9-k4.ttf", "700italic": "http://fonts.gstatic.com/s/josefinslab/v6/af9sBoKGPbGO0r21xJuly_As9-1nE9qOqhChW0m4nDE.ttf" } }, { "kind": "webfonts#webfont", "family": "Joti One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/jotione/v4/P3r_Th0ESHJdzunsvWgUfQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Judson", "category": "serif", "variants": [ "regular", "italic", "700" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/judson/v7/znM1AAs0eytUaJzf1CrYZQ.ttf", "italic": "http://fonts.gstatic.com/s/judson/v7/GVqQW9P52ygW-ySq-CLwAA.ttf", "700": "http://fonts.gstatic.com/s/judson/v7/he4a2LwiPJc7r8x0oKCKiA.ttf" } }, { "kind": "webfonts#webfont", "family": "Julee", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/julee/v6/CAib-jsUsSO8SvVRnE9fHA.ttf" } }, { "kind": "webfonts#webfont", "family": "Julius Sans One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/juliussansone/v4/iU65JP9acQHPDLkdalCF7jjVlsJB_M_Q_LtZxsoxvlw.ttf" } }, { "kind": "webfonts#webfont", "family": "Junge", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/junge/v4/j4IXCXtxrw9qIBheercp3A.ttf" } }, { "kind": "webfonts#webfont", "family": "Jura", "category": "sans-serif", "variants": [ "300", "regular", "500", "600" ], "subsets": [ "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v7", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/jura/v7/Rqx_xy1UnN0C7wD3FUSyPQ.ttf", "regular": "http://fonts.gstatic.com/s/jura/v7/YAWMwF3sN0KCbynMq-Yr_Q.ttf", "500": "http://fonts.gstatic.com/s/jura/v7/16xhfjHCiaLj3tsqqgmtGg.ttf", "600": "http://fonts.gstatic.com/s/jura/v7/iwseduOwJSdY8wQ1Y6CJdA.ttf" } }, { "kind": "webfonts#webfont", "family": "Just Another Hand", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/justanotherhand/v7/fKV8XYuRNNagXr38eqbRf99BnJIEGrvoojniP57E51c.ttf" } }, { "kind": "webfonts#webfont", "family": "Just Me Again Down Here", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/justmeagaindownhere/v8/sN06iTc9ITubLTgXoG-kc3M9eVLpVTSK6TqZTIgBrWQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Kalam", "category": "handwriting", "variants": [ "300", "regular", "700" ], "subsets": [ "latin-ext", "latin", "devanagari" ], "version": "v6", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/kalam/v6/MgQQlk1SgPEHdlkWMNh7Jg.ttf", "regular": "http://fonts.gstatic.com/s/kalam/v6/hNEJkp2K-aql7e5WQish4Q.ttf", "700": "http://fonts.gstatic.com/s/kalam/v6/95nLItUGyWtNLZjSckluLQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Kameron", "category": "serif", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/kameron/v7/9r8HYhqDSwcq9WMjupL82A.ttf", "700": "http://fonts.gstatic.com/s/kameron/v7/rabVVbzlflqvmXJUFlKnu_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Kantumruy", "category": "sans-serif", "variants": [ "300", "regular", "700" ], "subsets": [ "khmer" ], "version": "v3", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/kantumruy/v3/ERRwQE0WG5uanaZWmOFXNi3USBnSvpkopQaUR-2r7iU.ttf", "regular": "http://fonts.gstatic.com/s/kantumruy/v3/kQfXNYElQxr5dS8FyjD39Q.ttf", "700": "http://fonts.gstatic.com/s/kantumruy/v3/gie_zErpGf_rNzs920C2Ji3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Karla", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/karla/v5/78UgGRwJFkhqaoFimqoKpQ.ttf", "italic": "http://fonts.gstatic.com/s/karla/v5/51UBKly9RQOnOkj95ZwEFw.ttf", "700": "http://fonts.gstatic.com/s/karla/v5/JS501sZLxZ4zraLQdncOUA.ttf", "700italic": "http://fonts.gstatic.com/s/karla/v5/3YDyi09gQjCRh-5-SVhTTvesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Karma", "category": "serif", "variants": [ "300", "regular", "500", "600", "700" ], "subsets": [ "latin-ext", "latin", "devanagari" ], "version": "v5", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/karma/v5/lH6ijJnguWR2Sz7tEl6MQQ.ttf", "regular": "http://fonts.gstatic.com/s/karma/v5/wvqTxAGBUrTqU0urTEoPIw.ttf", "500": "http://fonts.gstatic.com/s/karma/v5/9YGjxi6Hcvz2Kh-rzO_cAw.ttf", "600": "http://fonts.gstatic.com/s/karma/v5/h_CVzXXtqSxjfS2sIwaejA.ttf", "700": "http://fonts.gstatic.com/s/karma/v5/smuSM08oApsQPPVYbHd1CA.ttf" } }, { "kind": "webfonts#webfont", "family": "Kaushan Script", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/kaushanscript/v4/qx1LSqts-NtiKcLw4N03IBnpV0hQCek3EmWnCPrvGRM.ttf" } }, { "kind": "webfonts#webfont", "family": "Kavoon", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/kavoon/v4/382m-6baKXqJFQjEgobt6Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Kdam Thmor", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v3", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/kdamthmor/v3/otCdP6UU-VBIrBfVDWBQJ_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Keania One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/keaniaone/v4/PACrDKZWngXzgo-ucl6buvesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Kelly Slab", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/kellyslab/v6/F_2oS1e9XdYx1MAi8XEVefesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Kenia", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/kenia/v8/OLM9-XfITK9PsTLKbGBrwg.ttf" } }, { "kind": "webfonts#webfont", "family": "Khand", "category": "sans-serif", "variants": [ "300", "regular", "500", "600", "700" ], "subsets": [ "latin-ext", "latin", "devanagari" ], "version": "v4", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/khand/v4/072zRl4OU9Pinjjkg174LA.ttf", "regular": "http://fonts.gstatic.com/s/khand/v4/HdLdTNFqNIDGJZl1ZEj84w.ttf", "500": "http://fonts.gstatic.com/s/khand/v4/46_p-SqtuMe56nxQdteWxg.ttf", "600": "http://fonts.gstatic.com/s/khand/v4/zggGWYIiPJyMTgkfxP_kaA.ttf", "700": "http://fonts.gstatic.com/s/khand/v4/0I0UWaN-X5QBmfexpXKhqg.ttf" } }, { "kind": "webfonts#webfont", "family": "Khmer", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/khmer/v9/vWaBJIbaQuBNz02ALIKJ3A.ttf" } }, { "kind": "webfonts#webfont", "family": "Kite One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/kiteone/v4/8ojWmgUc97m0f_i6sTqLoQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Knewave", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/knewave/v5/KGHM4XWr4iKnBMqzZLkPBg.ttf" } }, { "kind": "webfonts#webfont", "family": "Kotta One", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/kottaone/v4/AB2Q7hVw6niJYDgLvFXu5w.ttf" } }, { "kind": "webfonts#webfont", "family": "Koulen", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v10", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/koulen/v10/AAYOK8RSRO7FTskTzFuzNw.ttf" } }, { "kind": "webfonts#webfont", "family": "Kranky", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/kranky/v6/C8dxxTS99-fZ84vWk8SDrg.ttf" } }, { "kind": "webfonts#webfont", "family": "Kreon", "category": "serif", "variants": [ "300", "regular", "700" ], "subsets": [ "latin" ], "version": "v9", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/kreon/v9/HKtJRiq5C2zbq5N1IX32sA.ttf", "regular": "http://fonts.gstatic.com/s/kreon/v9/zA_IZt0u0S3cvHJu-n1oEg.ttf", "700": "http://fonts.gstatic.com/s/kreon/v9/jh0dSmaPodjxISiblIUTkw.ttf" } }, { "kind": "webfonts#webfont", "family": "Kristi", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/kristi/v7/aRsgBQrkQkMlu4UPSnJyOQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Krona One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/kronaone/v4/zcQj4ljqTo166AdourlF9w.ttf" } }, { "kind": "webfonts#webfont", "family": "La Belle Aurore", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/labelleaurore/v6/Irdbc4ASuUoWDjd_Wc3md123K2iuuhwZgaKapkyRTY8.ttf" } }, { "kind": "webfonts#webfont", "family": "Laila", "category": "serif", "variants": [ "300", "regular", "500", "600", "700" ], "subsets": [ "latin-ext", "latin", "devanagari" ], "version": "v1", "lastModified": "2014-08-27", "files": { "300": "http://fonts.gstatic.com/s/laila/v1/bLbIVEZF3IWSZ-in72GJvA.ttf", "regular": "http://fonts.gstatic.com/s/laila/v1/6iYor3edprH7360qtBGoag.ttf", "500": "http://fonts.gstatic.com/s/laila/v1/tkf8VtFvW9g3VsxQCA6WOQ.ttf", "600": "http://fonts.gstatic.com/s/laila/v1/3EMP2L6JRQ4GaHIxCldCeA.ttf", "700": "http://fonts.gstatic.com/s/laila/v1/R7P4z1xjcjecmjZ9GyhqHQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Lancelot", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/lancelot/v5/XMT7T_oo_MQUGAnU2v-sdA.ttf" } }, { "kind": "webfonts#webfont", "family": "Lato", "category": "sans-serif", "variants": [ "100", "100italic", "300", "300italic", "regular", "italic", "700", "700italic", "900", "900italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v11", "lastModified": "2014-10-07", "files": { "100": "http://fonts.gstatic.com/s/lato/v11/Upp-ka9rLQmHYCsFgwL-eg.ttf", "100italic": "http://fonts.gstatic.com/s/lato/v11/zLegi10uS_9-fnUDISl0KA.ttf", "300": "http://fonts.gstatic.com/s/lato/v11/Ja02qOppOVq9jeRjWekbHg.ttf", "300italic": "http://fonts.gstatic.com/s/lato/v11/dVebFcn7EV7wAKwgYestUg.ttf", "regular": "http://fonts.gstatic.com/s/lato/v11/h7rISIcQapZBpei-sXwIwg.ttf", "italic": "http://fonts.gstatic.com/s/lato/v11/P_dJOFJylV3A870UIOtr0w.ttf", "700": "http://fonts.gstatic.com/s/lato/v11/iX_QxBBZLhNj5JHlTzHQzg.ttf", "700italic": "http://fonts.gstatic.com/s/lato/v11/WFcZakHrrCKeUJxHA4T_gw.ttf", "900": "http://fonts.gstatic.com/s/lato/v11/8TPEV6NbYWZlNsXjbYVv7w.ttf", "900italic": "http://fonts.gstatic.com/s/lato/v11/draWperrI7n2xi35Cl08fA.ttf" } }, { "kind": "webfonts#webfont", "family": "League Script", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/leaguescript/v7/wnRFLvfabWK_DauqppD6vSeUSrabuTpOsMEiRLtKwk0.ttf" } }, { "kind": "webfonts#webfont", "family": "Leckerli One", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/leckerlione/v7/S2Y_iLrItTu8kIJTkS7DrC3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Ledger", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ledger/v4/G432jp-tahOfWHbCYkI0jw.ttf" } }, { "kind": "webfonts#webfont", "family": "Lekton", "category": "sans-serif", "variants": [ "regular", "italic", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/lekton/v7/r483JYmxf5PjIm4jVAm8Yg.ttf", "italic": "http://fonts.gstatic.com/s/lekton/v7/_UbDIPBA1wDqSbhp-OED7A.ttf", "700": "http://fonts.gstatic.com/s/lekton/v7/WZw-uL8WTkx3SBVfTlevXQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Lemon", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/lemon/v5/wed1nNu4LNSu-3RoRVUhUw.ttf" } }, { "kind": "webfonts#webfont", "family": "Libre Baskerville", "category": "serif", "variants": [ "regular", "italic", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/librebaskerville/v4/pR0sBQVcY0JZc_ciXjFsKyyZRYCSvpCzQKuMWnP5NDY.ttf", "italic": "http://fonts.gstatic.com/s/librebaskerville/v4/QHIOz1iKF3bIEzRdDFaf5QnhapNS5Oi8FPrBRDLbsW4.ttf", "700": "http://fonts.gstatic.com/s/librebaskerville/v4/kH7K4InNTm7mmOXXjrA5v-xuswJKUVpBRfYFpz0W3Iw.ttf" } }, { "kind": "webfonts#webfont", "family": "Life Savers", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/lifesavers/v6/g49cUDk4Y1P0G5NMkMAm7qCWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/lifesavers/v6/THQKqChyYUm97rNPVFdGGXe1Pd76Vl7zRpE7NLJQ7XU.ttf" } }, { "kind": "webfonts#webfont", "family": "Lilita One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/lilitaone/v4/vTxJQjbNV6BCBHx8sGDCVvesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Lily Script One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/lilyscriptone/v4/uPWsLVW8uiXqIBnE8ZwGPDjVlsJB_M_Q_LtZxsoxvlw.ttf" } }, { "kind": "webfonts#webfont", "family": "Limelight", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/limelight/v7/5dTfN6igsXjLjOy8QQShcg.ttf" } }, { "kind": "webfonts#webfont", "family": "Linden Hill", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/lindenhill/v6/UgsC0txqd-E1yjvjutwm_KCWcynf_cDxXwCLxiixG1c.ttf", "italic": "http://fonts.gstatic.com/s/lindenhill/v6/OcS3bZcu8vJvIDH8Zic83keOrDcLawS7-ssYqLr2Xp4.ttf" } }, { "kind": "webfonts#webfont", "family": "Lobster", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v11", "lastModified": "2014-10-21", "files": { "regular": "http://fonts.gstatic.com/s/lobster/v11/9LpJGtNuM1D8FAZ2BkJH2Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Lobster Two", "category": "display", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/lobstertwo/v7/xb9aY4w9ceh8JRzobID1naCWcynf_cDxXwCLxiixG1c.ttf", "italic": "http://fonts.gstatic.com/s/lobstertwo/v7/Ul_16MSbfayQv1I4QhLEoEeOrDcLawS7-ssYqLr2Xp4.ttf", "700": "http://fonts.gstatic.com/s/lobstertwo/v7/bmdxOflBqMqjEC0-kGsIiHe1Pd76Vl7zRpE7NLJQ7XU.ttf", "700italic": "http://fonts.gstatic.com/s/lobstertwo/v7/LEkN2_no_6kFvRfiBZ8xpM_zJjSACmk0BRPxQqhnNLU.ttf" } }, { "kind": "webfonts#webfont", "family": "Londrina Outline", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/londrinaoutline/v5/lls08GOa1eT74p072l1AWJmp8DTZ6iHear7UV05iykg.ttf" } }, { "kind": "webfonts#webfont", "family": "Londrina Shadow", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/londrinashadow/v4/dNYuzPS_7eYgXFJBzMoKdbw6Z3rVA5KDSi7aQxS92Nk.ttf" } }, { "kind": "webfonts#webfont", "family": "Londrina Sketch", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/londrinasketch/v4/p7Ai06aT1Ycp_D2fyE3z69d6z_uhFGnpCOifUY1fJQo.ttf" } }, { "kind": "webfonts#webfont", "family": "Londrina Solid", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/londrinasolid/v4/yysorIEiYSBb0ylZjg791MR125CwGqh8XBqkBzea0LA.ttf" } }, { "kind": "webfonts#webfont", "family": "Lora", "category": "serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v9", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/lora/v9/aXJ7KVIGcejEy1abawZazg.ttf", "italic": "http://fonts.gstatic.com/s/lora/v9/AN2EZaj2tFRpyveuNn9BOg.ttf", "700": "http://fonts.gstatic.com/s/lora/v9/enKND5SfzQKkggBA_VnT1A.ttf", "700italic": "http://fonts.gstatic.com/s/lora/v9/ivs9j3kYU65pR9QD9YFdzQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Love Ya Like A Sister", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/loveyalikeasister/v7/LzkxWS-af0Br2Sk_YgSJY-ad1xEP8DQfgfY8MH9aBUg.ttf" } }, { "kind": "webfonts#webfont", "family": "Loved by the King", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/lovedbytheking/v6/wg03xD4cWigj4YDufLBSr8io2AFEwwMpu7y5KyiyAJc.ttf" } }, { "kind": "webfonts#webfont", "family": "Lovers Quarrel", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/loversquarrel/v4/gipdZ8b7pKb89MzQLAtJHLHLxci2ElvNEmOB303HLk0.ttf" } }, { "kind": "webfonts#webfont", "family": "Luckiest Guy", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/luckiestguy/v6/5718gH8nDy3hFVihOpkY5C3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Lusitana", "category": "serif", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/lusitana/v4/l1h9VDomkwbdzbPdmLcUIw.ttf", "700": "http://fonts.gstatic.com/s/lusitana/v4/GWtZyUsONxgkdl3Mc1P7FKCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Lustria", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/lustria/v4/gXAk0s4ai0X-TAOhYzZd1w.ttf" } }, { "kind": "webfonts#webfont", "family": "Macondo", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/macondo/v5/G6yPNUscRPQ8ufBXs_8yRQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Macondo Swash Caps", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/macondoswashcaps/v4/SsSR706z-MlvEH7_LS6JAPkkgYRHs6GSG949m-K6x2k.ttf" } }, { "kind": "webfonts#webfont", "family": "Magra", "category": "sans-serif", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/magra/v4/hoZ13bwCXBxuGZqAudgc5A.ttf", "700": "http://fonts.gstatic.com/s/magra/v4/6fOM5sq5cIn8D0RjX8Lztw.ttf" } }, { "kind": "webfonts#webfont", "family": "Maiden Orange", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/maidenorange/v6/ZhKIA2SPisEwdhW7g0RUWojjx0o0jr6fNXxPgYh_a8Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Mako", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/mako/v7/z5zSLmfPlv1uTVAdmJBLXg.ttf" } }, { "kind": "webfonts#webfont", "family": "Mallanna", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin", "telugu" ], "version": "v4", "lastModified": "2014-12-10", "files": { "regular": "http://fonts.gstatic.com/s/mallanna/v4/krCTa-CfMbtxqF0689CbuQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Mandali", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin", "telugu" ], "version": "v4", "lastModified": "2014-12-10", "files": { "regular": "http://fonts.gstatic.com/s/mandali/v4/0lF8yJ7fkyjXuqtSi5bWbQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Marcellus", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/marcellus/v4/UjiLZzumxWC9whJ86UtaYw.ttf" } }, { "kind": "webfonts#webfont", "family": "Marcellus SC", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/marcellussc/v4/_jugwxhkkynrvsfrxVx8gS3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Marck Script", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/marckscript/v7/O_D1NAZVOFOobLbVtW3bci3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Margarine", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/margarine/v5/DJnJwIrcO_cGkjSzY3MERw.ttf" } }, { "kind": "webfonts#webfont", "family": "Marko One", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/markoone/v6/hpP7j861sOAco43iDc4n4w.ttf" } }, { "kind": "webfonts#webfont", "family": "Marmelad", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/marmelad/v6/jI0_FBlSOIRLL0ePWOhOwQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Marvel", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/marvel/v6/Fg1dO8tWVb-MlyqhsbXEkg.ttf", "italic": "http://fonts.gstatic.com/s/marvel/v6/HzyjFB-oR5usrc7Lxz9g8w.ttf", "700": "http://fonts.gstatic.com/s/marvel/v6/WrHDBL1RupWGo2UcdgxB3Q.ttf", "700italic": "http://fonts.gstatic.com/s/marvel/v6/Gzf5NT09Y6xskdQRj2kz1qCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Mate", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/mate/v5/ooFviPcJ6hZP5bAE71Cawg.ttf", "italic": "http://fonts.gstatic.com/s/mate/v5/5XwW6_cbisGvCX5qmNiqfA.ttf" } }, { "kind": "webfonts#webfont", "family": "Mate SC", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/matesc/v5/-YkIT2TZoPZF6pawKzDpWw.ttf" } }, { "kind": "webfonts#webfont", "family": "Maven Pro", "category": "sans-serif", "variants": [ "regular", "500", "700", "900" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/mavenpro/v7/sqPJIFG4gqsjl-0q_46Gbw.ttf", "500": "http://fonts.gstatic.com/s/mavenpro/v7/SQVfzoJBbj9t3aVcmbspRi3USBnSvpkopQaUR-2r7iU.ttf", "700": "http://fonts.gstatic.com/s/mavenpro/v7/uDssvmXgp7Nj3i336k_dSi3USBnSvpkopQaUR-2r7iU.ttf", "900": "http://fonts.gstatic.com/s/mavenpro/v7/-91TwiFzqeL1F7Kh91APwS3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "McLaren", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/mclaren/v4/OprvTGxaiINBKW_1_U0eoQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Meddon", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/meddon/v7/f8zJO98uu2EtSj9p7ci9RA.ttf" } }, { "kind": "webfonts#webfont", "family": "MedievalSharp", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/medievalsharp/v8/85X_PjV6tftJ0-rX7KYQkOe45sJkivqprK7VkUlzfg0.ttf" } }, { "kind": "webfonts#webfont", "family": "Medula One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/medulaone/v6/AasPgDQak81dsTGQHc5zUPesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Megrim", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/megrim/v7/e-9jVUC9lv1zxaFQARuftw.ttf" } }, { "kind": "webfonts#webfont", "family": "Meie Script", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/meiescript/v4/oTIWE5MmPye-rCyVp_6KEqCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Merienda", "category": "handwriting", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/merienda/v4/MYY6Og1qZlOQtPW2G95Y3A.ttf", "700": "http://fonts.gstatic.com/s/merienda/v4/GlwcvRLlgiVE2MBFQ4r0sKCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Merienda One", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/meriendaone/v7/bCA-uDdUx6nTO8SjzCLXvS3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Merriweather", "category": "serif", "variants": [ "300", "300italic", "regular", "italic", "700", "700italic", "900", "900italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v8", "lastModified": "2014-10-07", "files": { "300": "http://fonts.gstatic.com/s/merriweather/v8/ZvcMqxEwPfh2qDWBPxn6nqcQoVhARpoaILP7amxE_8g.ttf", "300italic": "http://fonts.gstatic.com/s/merriweather/v8/EYh7Vl4ywhowqULgRdYwICna0FLWfcB-J_SAYmcAXaI.ttf", "regular": "http://fonts.gstatic.com/s/merriweather/v8/RFda8w1V0eDZheqfcyQ4EC3USBnSvpkopQaUR-2r7iU.ttf", "italic": "http://fonts.gstatic.com/s/merriweather/v8/So5lHxHT37p2SS4-t60SlPMZXuCXbOrAvx5R0IT5Oyo.ttf", "700": "http://fonts.gstatic.com/s/merriweather/v8/ZvcMqxEwPfh2qDWBPxn6nkD2ttfZwueP-QU272T9-k4.ttf", "700italic": "http://fonts.gstatic.com/s/merriweather/v8/EYh7Vl4ywhowqULgRdYwIPAs9-1nE9qOqhChW0m4nDE.ttf", "900": "http://fonts.gstatic.com/s/merriweather/v8/ZvcMqxEwPfh2qDWBPxn6nqObDOjC3UL77puoeHsE3fw.ttf", "900italic": "http://fonts.gstatic.com/s/merriweather/v8/EYh7Vl4ywhowqULgRdYwIBd0_s6jQr9r5s5OZYvtzBY.ttf" } }, { "kind": "webfonts#webfont", "family": "Merriweather Sans", "category": "sans-serif", "variants": [ "300", "300italic", "regular", "italic", "700", "700italic", "800", "800italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-10-07", "files": { "300": "http://fonts.gstatic.com/s/merriweathersans/v5/6LmGj5dOJopQKEkt88Gowan5N8K-_DP0e9e_v51obXQ.ttf", "300italic": "http://fonts.gstatic.com/s/merriweathersans/v5/nAqt4hiqwq3tzCecpgPmVdytE4nGXk2hYD5nJ740tBw.ttf", "regular": "http://fonts.gstatic.com/s/merriweathersans/v5/AKu1CjQ4qnV8MUltkAX3sOAj_ty82iuwwDTNEYXGiyQ.ttf", "italic": "http://fonts.gstatic.com/s/merriweathersans/v5/3Mz4hOHzs2npRMG3B1ascZ32VBCoA_HLsn85tSWZmdo.ttf", "700": "http://fonts.gstatic.com/s/merriweathersans/v5/6LmGj5dOJopQKEkt88GowbqxG25nQNOioCZSK4sU-CA.ttf", "700italic": "http://fonts.gstatic.com/s/merriweathersans/v5/nAqt4hiqwq3tzCecpgPmVbuqAJxizi8Dk_SK5et7kMg.ttf", "800": "http://fonts.gstatic.com/s/merriweathersans/v5/6LmGj5dOJopQKEkt88GowYufzO2zUYSj5LqoJ3UGkco.ttf", "800italic": "http://fonts.gstatic.com/s/merriweathersans/v5/nAqt4hiqwq3tzCecpgPmVdDmPrYMy3aZO4LmnZsxTQw.ttf" } }, { "kind": "webfonts#webfont", "family": "Metal", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/metal/v9/zA3UOP13ooQcxjv04BZX5g.ttf" } }, { "kind": "webfonts#webfont", "family": "Metal Mania", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/metalmania/v6/isriV_rAUgj6bPWPN6l9QKCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Metamorphous", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/metamorphous/v6/wGqUKXRinIYggz-BTRU9ei3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Metrophobic", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/metrophobic/v6/SaglWZWCrrv_D17u1i4v_aCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Michroma", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/michroma/v7/0c2XrW81_QsiKV8T9thumA.ttf" } }, { "kind": "webfonts#webfont", "family": "Milonga", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/milonga/v4/dzNdIUSTGFmy2ahovDRcWg.ttf" } }, { "kind": "webfonts#webfont", "family": "Miltonian", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/miltonian/v8/Z4HrYZyqm0BnNNzcCUfzoQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Miltonian Tattoo", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/miltoniantattoo/v9/1oU_8OGYwW46eh02YHydn2uk0YtI6thZkz1Hmh-odwg.ttf" } }, { "kind": "webfonts#webfont", "family": "Miniver", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/miniver/v5/4yTQohOH_cWKRS5laRFhYg.ttf" } }, { "kind": "webfonts#webfont", "family": "Miss Fajardose", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/missfajardose/v6/WcXjlQPKn6nBfr8LY3ktNu6rPKfVZo7L2bERcf0BDns.ttf" } }, { "kind": "webfonts#webfont", "family": "Modern Antiqua", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/modernantiqua/v6/8qX_tr6Xzy4t9fvZDXPkh6rFJ4O13IHVxZbM6yoslpo.ttf" } }, { "kind": "webfonts#webfont", "family": "Molengo", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/molengo/v7/jcjgeGuzv83I55AzOTpXNQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Molle", "category": "handwriting", "variants": [ "italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "italic": "http://fonts.gstatic.com/s/molle/v4/9XTdCsjPXifLqo5et-YoGA.ttf" } }, { "kind": "webfonts#webfont", "family": "Monda", "category": "sans-serif", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/monda/v4/qFMHZ9zvR6B_gnoIgosPrw.ttf", "700": "http://fonts.gstatic.com/s/monda/v4/EVOzZUyc_j1w2GuTgTAW1g.ttf" } }, { "kind": "webfonts#webfont", "family": "Monofett", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/monofett/v6/C6K5L799Rgxzg2brgOaqAw.ttf" } }, { "kind": "webfonts#webfont", "family": "Monoton", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/monoton/v6/aCz8ja_bE4dg-7agSvExdw.ttf" } }, { "kind": "webfonts#webfont", "family": "Monsieur La Doulaise", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/monsieurladoulaise/v5/IMAdMj6Eq9jZ46CPctFtMKP61oAqTJXlx5ZVOBmcPdM.ttf" } }, { "kind": "webfonts#webfont", "family": "Montaga", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/montaga/v4/PwTwUboiD-M4-mFjZfJs2A.ttf" } }, { "kind": "webfonts#webfont", "family": "Montez", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/montez/v6/kx58rLOWQQLGFM4pDHv5Ng.ttf" } }, { "kind": "webfonts#webfont", "family": "Montserrat", "category": "sans-serif", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/montserrat/v6/Kqy6-utIpx_30Xzecmeo8_esZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/montserrat/v6/IQHow_FEYlDC4Gzy_m8fcgJKKGfqHaYFsRG-T3ceEVo.ttf" } }, { "kind": "webfonts#webfont", "family": "Montserrat Alternates", "category": "sans-serif", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/montserratalternates/v4/z2n1Sjxk9souK3HCtdHuklPuEVRGaG9GCQnmM16YWq0.ttf", "700": "http://fonts.gstatic.com/s/montserratalternates/v4/YENqOGAVzwIHjYNjmKuAZpeqBKvsAhm-s2I4RVSXFfc.ttf" } }, { "kind": "webfonts#webfont", "family": "Montserrat Subrayada", "category": "sans-serif", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/montserratsubrayada/v4/nzoCWCz0e9c7Mr2Gl8bbgrJymm6ilkk9f0nDA_sC_qk.ttf", "700": "http://fonts.gstatic.com/s/montserratsubrayada/v4/wf-IKpsHcfm0C9uaz9IeGJvEcF1LWArDbGWgKZSH9go.ttf" } }, { "kind": "webfonts#webfont", "family": "Moul", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/moul/v8/Kb0ALQnfyXawP1a_P_gpTQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Moulpali", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/moulpali/v9/diD74BprGhmVkJoerKmrKA.ttf" } }, { "kind": "webfonts#webfont", "family": "Mountains of Christmas", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/mountainsofchristmas/v8/dVGBFPwd6G44IWDbQtPew2Auds3jz1Fxb61CgfaGDr4.ttf", "700": "http://fonts.gstatic.com/s/mountainsofchristmas/v8/PymufKtHszoLrY0uiAYKNM9cPTbSBTrQyTa5TWAe3vE.ttf" } }, { "kind": "webfonts#webfont", "family": "Mouse Memoirs", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/mousememoirs/v4/NBFaaJFux_j0AQbAsW3QeH8f0n03UdmQgF_CLvNR2vg.ttf" } }, { "kind": "webfonts#webfont", "family": "Mr Bedfort", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/mrbedfort/v5/81bGgHTRikLs_puEGshl7_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Mr Dafoe", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/mrdafoe/v5/s32Q1S6ZkT7EaX53mUirvQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Mr De Haviland", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/mrdehaviland/v5/fD8y4L6PJ4vqDk7z8Y8e27v4lrhng1lzu7-weKO6cw8.ttf" } }, { "kind": "webfonts#webfont", "family": "Mrs Saint Delafield", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/mrssaintdelafield/v4/vuWagfFT7bj9lFtZOFBwmjHMBelqWf3tJeGyts2SmKU.ttf" } }, { "kind": "webfonts#webfont", "family": "Mrs Sheppards", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/mrssheppards/v5/2WFsWMV3VUeCz6UVH7UjCn8f0n03UdmQgF_CLvNR2vg.ttf" } }, { "kind": "webfonts#webfont", "family": "Muli", "category": "sans-serif", "variants": [ "300", "300italic", "regular", "italic" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-10-07", "files": { "300": "http://fonts.gstatic.com/s/muli/v7/VJw4F3ZHRAZ7Hmg3nQu5YQ.ttf", "300italic": "http://fonts.gstatic.com/s/muli/v7/s-NKMCru8HiyjEt0ZDoBoA.ttf", "regular": "http://fonts.gstatic.com/s/muli/v7/KJiP6KznxbALQgfJcDdPAw.ttf", "italic": "http://fonts.gstatic.com/s/muli/v7/Cg0K_IWANs9xkNoxV7H1_w.ttf" } }, { "kind": "webfonts#webfont", "family": "Mystery Quest", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/mysteryquest/v4/467jJvg0c7HgucvBB9PLDyeUSrabuTpOsMEiRLtKwk0.ttf" } }, { "kind": "webfonts#webfont", "family": "NTR", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin", "telugu" ], "version": "v4", "lastModified": "2014-12-10", "files": { "regular": "http://fonts.gstatic.com/s/ntr/v4/e7H4ZLtGfVOYyOupo6T12g.ttf" } }, { "kind": "webfonts#webfont", "family": "Neucha", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin", "cyrillic" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/neucha/v7/bijdhB-TzQdtpl0ykhGh4Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Neuton", "category": "serif", "variants": [ "200", "300", "regular", "italic", "700", "800" ], "subsets": [ "latin-ext", "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "200": "http://fonts.gstatic.com/s/neuton/v8/DA3Mkew3XqSkPpi1f4tJow.ttf", "300": "http://fonts.gstatic.com/s/neuton/v8/xrc_aZ2hx-gdeV0mlY8Vww.ttf", "regular": "http://fonts.gstatic.com/s/neuton/v8/9R-MGIOQUdjAVeB6nE6PcQ.ttf", "italic": "http://fonts.gstatic.com/s/neuton/v8/uVMT3JOB5BNFi3lgPp6kEg.ttf", "700": "http://fonts.gstatic.com/s/neuton/v8/gnWpkWY7DirkKiovncYrfg.ttf", "800": "http://fonts.gstatic.com/s/neuton/v8/XPzBQV4lY6enLxQG9cF1jw.ttf" } }, { "kind": "webfonts#webfont", "family": "New Rocker", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/newrocker/v5/EFUWzHJedEkpW399zYOHofesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "News Cycle", "category": "sans-serif", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v12", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/newscycle/v12/xyMAr8VfiUzIOvS1abHJO_esZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/newscycle/v12/G28Ny31cr5orMqEQy6ljtwJKKGfqHaYFsRG-T3ceEVo.ttf" } }, { "kind": "webfonts#webfont", "family": "Niconne", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/niconne/v6/ZA-mFw2QNXodx5y7kfELBg.ttf" } }, { "kind": "webfonts#webfont", "family": "Nixie One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/nixieone/v7/h6kQfmzm0Shdnp3eswRaqQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Nobile", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/nobile/v7/lC_lPi1ddtN38iXTCRh6ow.ttf", "italic": "http://fonts.gstatic.com/s/nobile/v7/vGmrpKzWQQSrb-PR6FWBIA.ttf", "700": "http://fonts.gstatic.com/s/nobile/v7/9p6M-Yrg_r_QPmSD1skrOg.ttf", "700italic": "http://fonts.gstatic.com/s/nobile/v7/oQ1eYPaXV638N03KvsNvyKCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Nokora", "category": "serif", "variants": [ "regular", "700" ], "subsets": [ "khmer" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/nokora/v9/dRyz1JfnyKPNaRcBNX9F9A.ttf", "700": "http://fonts.gstatic.com/s/nokora/v9/QMqqa4QEOhQpiig3cAPmbQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Norican", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/norican/v4/SHnSqhYAWG5sZTWcPzEHig.ttf" } }, { "kind": "webfonts#webfont", "family": "Nosifer", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/nosifer/v5/7eJGoIuHRrtcG00j6CptSA.ttf" } }, { "kind": "webfonts#webfont", "family": "Nothing You Could Do", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/nothingyoucoulddo/v6/jpk1K3jbJoyoK0XKaSyQAf-TpkXjXYGWiJZAEtBRjPU.ttf" } }, { "kind": "webfonts#webfont", "family": "Noticia Text", "category": "serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "vietnamese", "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/noticiatext/v6/wdyV6x3eKpdeUPQ7BJ5uUC3USBnSvpkopQaUR-2r7iU.ttf", "italic": "http://fonts.gstatic.com/s/noticiatext/v6/dAuxVpkYE_Q_IwIm6elsKPMZXuCXbOrAvx5R0IT5Oyo.ttf", "700": "http://fonts.gstatic.com/s/noticiatext/v6/pEko-RqEtp45bE2P80AAKUD2ttfZwueP-QU272T9-k4.ttf", "700italic": "http://fonts.gstatic.com/s/noticiatext/v6/-rQ7V8ARjf28_b7kRa0JuvAs9-1nE9qOqhChW0m4nDE.ttf" } }, { "kind": "webfonts#webfont", "family": "Noto Sans", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "greek-ext", "vietnamese", "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic", "devanagari" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/notosans/v6/0Ue9FiUJwVhi4NGfHJS5uA.ttf", "italic": "http://fonts.gstatic.com/s/notosans/v6/dLcNKMgJ1H5RVoZFraDz0qCWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/notosans/v6/PIbvSEyHEdL91QLOQRnZ1y3USBnSvpkopQaUR-2r7iU.ttf", "700italic": "http://fonts.gstatic.com/s/notosans/v6/9Z3uUWMRR7crzm1TjRicDne1Pd76Vl7zRpE7NLJQ7XU.ttf" } }, { "kind": "webfonts#webfont", "family": "Noto Serif", "category": "serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "greek-ext", "vietnamese", "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/notoserif/v4/zW6mc7bC1CWw8dH0yxY8JfesZW2xOQ-xsNqO47m55DA.ttf", "italic": "http://fonts.gstatic.com/s/notoserif/v4/HQXBIwLHsOJCNEQeX9kNzy3USBnSvpkopQaUR-2r7iU.ttf", "700": "http://fonts.gstatic.com/s/notoserif/v4/lJAvZoKA5NttpPc9yc6lPQJKKGfqHaYFsRG-T3ceEVo.ttf", "700italic": "http://fonts.gstatic.com/s/notoserif/v4/Wreg0Be4tcFGM2t6VWytvED2ttfZwueP-QU272T9-k4.ttf" } }, { "kind": "webfonts#webfont", "family": "Nova Cut", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/novacut/v8/6q12jWcBvj0KO2cMRP97tA.ttf" } }, { "kind": "webfonts#webfont", "family": "Nova Flat", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/novaflat/v8/pK7a0CoGzI684qe_XSHBqQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Nova Mono", "category": "monospace", "variants": [ "regular" ], "subsets": [ "latin", "greek" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/novamono/v7/6-SChr5ZIaaasJFBkgrLNw.ttf" } }, { "kind": "webfonts#webfont", "family": "Nova Oval", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/novaoval/v8/VuukVpKP8BwUf8o9W5LYQQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Nova Round", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/novaround/v8/7-cK3Ari_8XYYFgVMxVhDvesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Nova Script", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/novascript/v8/dEvxQDLgx1M1TKY-NmBWYaCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Nova Slim", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/novaslim/v8/rPYXC81_VL2EW-4CzBX65g.ttf" } }, { "kind": "webfonts#webfont", "family": "Nova Square", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/novasquare/v8/BcBzXoaDzYX78rquGXVuSqCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Numans", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/numans/v6/g5snI2p6OEjjTNmTHyBdiQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Nunito", "category": "sans-serif", "variants": [ "300", "regular", "700" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-10-07", "files": { "300": "http://fonts.gstatic.com/s/nunito/v7/zXQvrWBJqUooM7Xv98MrQw.ttf", "regular": "http://fonts.gstatic.com/s/nunito/v7/ySZTeT3IuzJj0GK6uGpbBg.ttf", "700": "http://fonts.gstatic.com/s/nunito/v7/aEdlqgMuYbpe4U3TnqOQMA.ttf" } }, { "kind": "webfonts#webfont", "family": "Odor Mean Chey", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/odormeanchey/v8/GK3E7EjPoBkeZhYshGFo0eVKG8sq4NyGgdteJLvqLDs.ttf" } }, { "kind": "webfonts#webfont", "family": "Offside", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/offside/v4/v0C913SB8wqQUvcu1faUqw.ttf" } }, { "kind": "webfonts#webfont", "family": "Old Standard TT", "category": "serif", "variants": [ "regular", "italic", "700" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/oldstandardtt/v7/n6RTCDcIPWSE8UNBa4k-DLcB5jyhm1VsHs65c3QNDr0.ttf", "italic": "http://fonts.gstatic.com/s/oldstandardtt/v7/QQT_AUSp4AV4dpJfIN7U5PWrQzeMtsHf8QsWQ2cZg3c.ttf", "700": "http://fonts.gstatic.com/s/oldstandardtt/v7/5Ywdce7XEbTSbxs__4X1_HJqbZqK7TdZ58X80Q_Lw8Y.ttf" } }, { "kind": "webfonts#webfont", "family": "Oldenburg", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/oldenburg/v4/dqA_M_uoCVXZbCO-oKBTnQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Oleo Script", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/oleoscript/v5/21stZcmPyzbQVXtmGegyqKCWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/oleoscript/v5/hudNQFKFl98JdNnlo363fne1Pd76Vl7zRpE7NLJQ7XU.ttf" } }, { "kind": "webfonts#webfont", "family": "Oleo Script Swash Caps", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/oleoscriptswashcaps/v4/vdWhGqsBUAP-FF3NOYTe4iMF4kXAPemmyaDpMXQ31P0.ttf", "700": "http://fonts.gstatic.com/s/oleoscriptswashcaps/v4/HMO3ftxA9AU5floml9c755reFYaXZ4zuJXJ8fr8OO1g.ttf" } }, { "kind": "webfonts#webfont", "family": "Open Sans", "category": "sans-serif", "variants": [ "300", "300italic", "regular", "italic", "600", "600italic", "700", "700italic", "800", "800italic" ], "subsets": [ "greek-ext", "vietnamese", "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic", "devanagari" ], "version": "v10", "lastModified": "2014-10-17", "files": { "300": "http://fonts.gstatic.com/s/opensans/v10/DXI1ORHCpsQm3Vp6mXoaTS3USBnSvpkopQaUR-2r7iU.ttf", "300italic": "http://fonts.gstatic.com/s/opensans/v10/PRmiXeptR36kaC0GEAetxi9-WlPSxbfiI49GsXo3q0g.ttf", "regular": "http://fonts.gstatic.com/s/opensans/v10/IgZJs4-7SA1XX_edsoXWog.ttf", "italic": "http://fonts.gstatic.com/s/opensans/v10/O4NhV7_qs9r9seTo7fnsVKCWcynf_cDxXwCLxiixG1c.ttf", "600": "http://fonts.gstatic.com/s/opensans/v10/MTP_ySUJH_bn48VBG8sNSi3USBnSvpkopQaUR-2r7iU.ttf", "600italic": "http://fonts.gstatic.com/s/opensans/v10/PRmiXeptR36kaC0GEAetxpZ7xm-Bj30Bj2KNdXDzSZg.ttf", "700": "http://fonts.gstatic.com/s/opensans/v10/k3k702ZOKiLJc3WVjuplzC3USBnSvpkopQaUR-2r7iU.ttf", "700italic": "http://fonts.gstatic.com/s/opensans/v10/PRmiXeptR36kaC0GEAetxne1Pd76Vl7zRpE7NLJQ7XU.ttf", "800": "http://fonts.gstatic.com/s/opensans/v10/EInbV5DfGHOiMmvb1Xr-hi3USBnSvpkopQaUR-2r7iU.ttf", "800italic": "http://fonts.gstatic.com/s/opensans/v10/PRmiXeptR36kaC0GEAetxg89PwPrYLaRFJ-HNCU9NbA.ttf" } }, { "kind": "webfonts#webfont", "family": "Open Sans Condensed", "category": "sans-serif", "variants": [ "300", "300italic", "700" ], "subsets": [ "greek-ext", "vietnamese", "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v10", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/opensanscondensed/v10/gk5FxslNkTTHtojXrkp-xEMwSSh38KQVJx4ABtsZTnA.ttf", "300italic": "http://fonts.gstatic.com/s/opensanscondensed/v10/jIXlqT1WKafUSwj6s9AzV4_LkTZ_uhAwfmGJ084hlvM.ttf", "700": "http://fonts.gstatic.com/s/opensanscondensed/v10/gk5FxslNkTTHtojXrkp-xBEM87DM3yorPOrvA-vB930.ttf" } }, { "kind": "webfonts#webfont", "family": "Oranienbaum", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic-ext", "cyrillic" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/oranienbaum/v4/M98jYwCSn0PaFhXXgviCoaCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Orbitron", "category": "sans-serif", "variants": [ "regular", "500", "700", "900" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/orbitron/v6/DY8swouAZjR3RaUPRf0HDQ.ttf", "500": "http://fonts.gstatic.com/s/orbitron/v6/p-y_ffzMdo5JN_7ia0vYEqCWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/orbitron/v6/PS9_6SLkY1Y6OgPO3APr6qCWcynf_cDxXwCLxiixG1c.ttf", "900": "http://fonts.gstatic.com/s/orbitron/v6/2I3-8i9hT294TE_pyjy9SaCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Oregano", "category": "display", "variants": [ "regular", "italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/oregano/v4/UiLhqNixVv2EpjRoBG6axA.ttf", "italic": "http://fonts.gstatic.com/s/oregano/v4/_iwqGEht6XsAuEaCbYG64Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Orienta", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/orienta/v4/_NKSk93mMs0xsqtfjCsB3Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Original Surfer", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/originalsurfer/v5/gdHw6HpSIN4D6Xt7pi1-qIkEz33TDwAZczo_6fY7eg0.ttf" } }, { "kind": "webfonts#webfont", "family": "Oswald", "category": "sans-serif", "variants": [ "300", "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v10", "lastModified": "2014-10-07", "files": { "300": "http://fonts.gstatic.com/s/oswald/v10/y3tZpCdiRD4oNRRYFcAR5Q.ttf", "regular": "http://fonts.gstatic.com/s/oswald/v10/uLEd2g2vJglLPfsBF91DCg.ttf", "700": "http://fonts.gstatic.com/s/oswald/v10/7wj8ldV_5Ti37rHa0m1DDw.ttf" } }, { "kind": "webfonts#webfont", "family": "Over the Rainbow", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/overtherainbow/v7/6gp-gkpI2kie2dHQQLM2jQBdxkZd83xOSx-PAQ2QmiI.ttf" } }, { "kind": "webfonts#webfont", "family": "Overlock", "category": "display", "variants": [ "regular", "italic", "700", "700italic", "900", "900italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/overlock/v5/Z8oYsGi88-E1cUB8YBFMAg.ttf", "italic": "http://fonts.gstatic.com/s/overlock/v5/rq6EacukHROOBrFrK_zF6_esZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/overlock/v5/Fexr8SqXM8Bm_gEVUA7AKaCWcynf_cDxXwCLxiixG1c.ttf", "700italic": "http://fonts.gstatic.com/s/overlock/v5/wFWnYgeXKYBks6gEUwYnfAJKKGfqHaYFsRG-T3ceEVo.ttf", "900": "http://fonts.gstatic.com/s/overlock/v5/YPJCVTT8ZbG3899l_-KIGqCWcynf_cDxXwCLxiixG1c.ttf", "900italic": "http://fonts.gstatic.com/s/overlock/v5/iOZhxT2zlg7W5ij_lb-oDp0EAVxt0G0biEntp43Qt6E.ttf" } }, { "kind": "webfonts#webfont", "family": "Overlock SC", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/overlocksc/v5/8D7HYDsvS_g1GhBnlHzgzaCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Ovo", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ovo/v7/mFg27dimu3s9t09qjCwB1g.ttf" } }, { "kind": "webfonts#webfont", "family": "Oxygen", "category": "sans-serif", "variants": [ "300", "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-10-07", "files": { "300": "http://fonts.gstatic.com/s/oxygen/v5/lZ31r0bR1Bzt_DfGZu1S8A.ttf", "regular": "http://fonts.gstatic.com/s/oxygen/v5/uhoyAE7XlQL22abzQieHjw.ttf", "700": "http://fonts.gstatic.com/s/oxygen/v5/yLqkmDwuNtt5pSqsJmhyrg.ttf" } }, { "kind": "webfonts#webfont", "family": "Oxygen Mono", "category": "monospace", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/oxygenmono/v4/DigTu7k4b7OmM8ubt1Qza6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "PT Mono", "category": "monospace", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic-ext", "cyrillic" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ptmono/v4/QUbM8H9yJK5NhpQ0REO6Wg.ttf" } }, { "kind": "webfonts#webfont", "family": "PT Sans", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin", "cyrillic-ext", "cyrillic" ], "version": "v8", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/ptsans/v8/UFoEz2uiuMypUGZL1NKoeg.ttf", "italic": "http://fonts.gstatic.com/s/ptsans/v8/yls9EYWOd496wiu7qzfgNg.ttf", "700": "http://fonts.gstatic.com/s/ptsans/v8/F51BEgHuR0tYHxF0bD4vwvesZW2xOQ-xsNqO47m55DA.ttf", "700italic": "http://fonts.gstatic.com/s/ptsans/v8/lILlYDvubYemzYzN7GbLkC3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "PT Sans Caption", "category": "sans-serif", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin", "cyrillic-ext", "cyrillic" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ptsanscaption/v9/OXYTDOzBcXU8MTNBvBHeSW8by34Z3mUMtM-o4y-SHCY.ttf", "700": "http://fonts.gstatic.com/s/ptsanscaption/v9/Q-gJrFokeE7JydPpxASt25tc0eyfI4QDEsobEEpk_hA.ttf" } }, { "kind": "webfonts#webfont", "family": "PT Sans Narrow", "category": "sans-serif", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin", "cyrillic-ext", "cyrillic" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ptsansnarrow/v7/UyYrYy3ltEffJV9QueSi4ZTvAuddT2xDMbdz0mdLyZY.ttf", "700": "http://fonts.gstatic.com/s/ptsansnarrow/v7/Q_pTky3Sc3ubRibGToTAYsLtdzs3iyjn_YuT226ZsLU.ttf" } }, { "kind": "webfonts#webfont", "family": "PT Serif", "category": "serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin", "cyrillic-ext", "cyrillic" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ptserif/v8/sAo427rn3-QL9sWCbMZXhA.ttf", "italic": "http://fonts.gstatic.com/s/ptserif/v8/9khWhKzhpkH0OkNnBKS3n_esZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/ptserif/v8/kyZw18tqQ5if-_wpmxxOeKCWcynf_cDxXwCLxiixG1c.ttf", "700italic": "http://fonts.gstatic.com/s/ptserif/v8/Foydq9xJp--nfYIx2TBz9QJKKGfqHaYFsRG-T3ceEVo.ttf" } }, { "kind": "webfonts#webfont", "family": "PT Serif Caption", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin-ext", "latin", "cyrillic-ext", "cyrillic" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ptserifcaption/v8/7xkFOeTxxO1GMC1suOUYWVsRioCqs5fohhaYel24W3k.ttf", "italic": "http://fonts.gstatic.com/s/ptserifcaption/v8/0kfPsmrmTSgiec7u_Wa0DB1mqvzPHelJwRcF_s_EUM0.ttf" } }, { "kind": "webfonts#webfont", "family": "Pacifico", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/pacifico/v7/GIrpeRY1r5CzbfL8r182lw.ttf" } }, { "kind": "webfonts#webfont", "family": "Paprika", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/paprika/v4/b-VpyoRSieBdB5BPJVF8HQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Parisienne", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/parisienne/v4/TW74B5QISJNx9moxGlmJfvesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Passero One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/passeroone/v8/Yc-7nH5deCCv9Ed0MMnAQqCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Passion One", "category": "display", "variants": [ "regular", "700", "900" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/passionone/v6/1UIK1tg3bKJ4J3o35M4heqCWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/passionone/v6/feOcYDy2R-f3Ysy72PYJ2ne1Pd76Vl7zRpE7NLJQ7XU.ttf", "900": "http://fonts.gstatic.com/s/passionone/v6/feOcYDy2R-f3Ysy72PYJ2ienaqEuufTBk9XMKnKmgDA.ttf" } }, { "kind": "webfonts#webfont", "family": "Pathway Gothic One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/pathwaygothicone/v4/Lqv9ztoTUV8Q0FmQZzPqaA6A6xIYD7vYcYDop1i-K-c.ttf" } }, { "kind": "webfonts#webfont", "family": "Patrick Hand", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "vietnamese", "latin-ext", "latin" ], "version": "v10", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/patrickhand/v10/9BG3JJgt_HlF3NpEUehL0C3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Patrick Hand SC", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "vietnamese", "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/patrickhandsc/v4/OYFWCgfCR-7uHIovjUZXsbAgSRh1LpJXlLfl8IbsmHg.ttf" } }, { "kind": "webfonts#webfont", "family": "Patua One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/patuaone/v6/njZwotTYjswR4qdhsW-kJw.ttf" } }, { "kind": "webfonts#webfont", "family": "Paytone One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/paytoneone/v8/3WCxC7JAJjQHQVoIE0ZwvqCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Peralta", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/peralta/v4/cTJX5KEuc0GKRU9NXSm-8Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Permanent Marker", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/permanentmarker/v5/9vYsg5VgPHKK8SXYbf3sMol14xj5tdg9OHF8w4E7StQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Petit Formal Script", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/petitformalscript/v4/OEZwr2-ovBsq2n3ACCKoEvVPl2Gjtxj0D6F7QLy1VQc.ttf" } }, { "kind": "webfonts#webfont", "family": "Petrona", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/petrona/v5/nnQwxlP6dhrGovYEFtemTg.ttf" } }, { "kind": "webfonts#webfont", "family": "Philosopher", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin", "cyrillic" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/philosopher/v7/oZLTrB9jmJsyV0u_T0TKEaCWcynf_cDxXwCLxiixG1c.ttf", "italic": "http://fonts.gstatic.com/s/philosopher/v7/_9Hnc_gz9k7Qq6uKaeHKmUeOrDcLawS7-ssYqLr2Xp4.ttf", "700": "http://fonts.gstatic.com/s/philosopher/v7/napvkewXG9Gqby5vwGHICHe1Pd76Vl7zRpE7NLJQ7XU.ttf", "700italic": "http://fonts.gstatic.com/s/philosopher/v7/PuKlryTcvTj7-qZWfLCFIM_zJjSACmk0BRPxQqhnNLU.ttf" } }, { "kind": "webfonts#webfont", "family": "Piedra", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/piedra/v5/owf-AvEEyAj9LJ2tVZ_3Mw.ttf" } }, { "kind": "webfonts#webfont", "family": "Pinyon Script", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/pinyonscript/v6/TzghnhfCn7TuE73f-CBQ0CeUSrabuTpOsMEiRLtKwk0.ttf" } }, { "kind": "webfonts#webfont", "family": "Pirata One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/pirataone/v4/WnbD86B4vB2ckYcL7oxuhvesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Plaster", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/plaster/v7/O4QG9Z5116CXyfJdR9zxLw.ttf" } }, { "kind": "webfonts#webfont", "family": "Play", "category": "sans-serif", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v6", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/play/v6/GWvfObW8LhtsOX333MCpBg.ttf", "700": "http://fonts.gstatic.com/s/play/v6/crPhg6I0alLI-MpB3vW-zw.ttf" } }, { "kind": "webfonts#webfont", "family": "Playball", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/playball/v6/3hOFiQm_EUzycTpcN9uz4w.ttf" } }, { "kind": "webfonts#webfont", "family": "Playfair Display", "category": "serif", "variants": [ "regular", "italic", "700", "700italic", "900", "900italic" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v10", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/playfairdisplay/v10/2NBgzUtEeyB-Xtpr9bm1CV6uyC_qD11hrFQ6EGgTJWI.ttf", "italic": "http://fonts.gstatic.com/s/playfairdisplay/v10/9MkijrV-dEJ0-_NWV7E6NzMsbnvDNEBX25F5HWk9AhI.ttf", "700": "http://fonts.gstatic.com/s/playfairdisplay/v10/UC3ZEjagJi85gF9qFaBgICsv6SrURqJprbhH_C1Mw8w.ttf", "700italic": "http://fonts.gstatic.com/s/playfairdisplay/v10/n7G4PqJvFP2Kubl0VBLDECsYW3XoOVcYyYdp9NzzS9E.ttf", "900": "http://fonts.gstatic.com/s/playfairdisplay/v10/UC3ZEjagJi85gF9qFaBgIKqwMe2wjvZrAR44M0BJZ48.ttf", "900italic": "http://fonts.gstatic.com/s/playfairdisplay/v10/n7G4PqJvFP2Kubl0VBLDEC0JfJ4xmm7j1kL6D7mPxrA.ttf" } }, { "kind": "webfonts#webfont", "family": "Playfair Display SC", "category": "serif", "variants": [ "regular", "italic", "700", "700italic", "900", "900italic" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/playfairdisplaysc/v4/G0-tvBxd4eQRdwFKB8dRkcpjYTDWIvcAwAccqeW9uNM.ttf", "italic": "http://fonts.gstatic.com/s/playfairdisplaysc/v4/myuYiFR-4NTrUT4w6TKls2klJsJYggW8rlNoTOTuau0.ttf", "700": "http://fonts.gstatic.com/s/playfairdisplaysc/v4/5ggqGkvWJU_TtW2W8cEubA-Amcyomnuy4WsCiPxGHjw.ttf", "700italic": "http://fonts.gstatic.com/s/playfairdisplaysc/v4/6X0OQrQhEEnPo56RalREX4krgPi80XvBcbTwmz-rgmU.ttf", "900": "http://fonts.gstatic.com/s/playfairdisplaysc/v4/5ggqGkvWJU_TtW2W8cEubKXL3C32k275YmX_AcBPZ7w.ttf", "900italic": "http://fonts.gstatic.com/s/playfairdisplaysc/v4/6X0OQrQhEEnPo56RalREX8Zag2q3ssKz8uH1RU4a9gs.ttf" } }, { "kind": "webfonts#webfont", "family": "Podkova", "category": "serif", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/podkova/v8/eylljyGVfB8ZUQjYY3WZRQ.ttf", "700": "http://fonts.gstatic.com/s/podkova/v8/SqW4aa8m_KVrOgYSydQ33vesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Poiret One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v4", "lastModified": "2014-10-07", "files": { "regular": "http://fonts.gstatic.com/s/poiretone/v4/dWcYed048E5gHGDIt8i1CPesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Poller One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/pollerone/v6/dkctmDlTPcZ6boC8662RA_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Poly", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/poly/v7/bcMAuiacS2qkd54BcwW6_Q.ttf", "italic": "http://fonts.gstatic.com/s/poly/v7/Zkx-eIlZSjKUrPGYhV5PeA.ttf" } }, { "kind": "webfonts#webfont", "family": "Pompiere", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/pompiere/v6/o_va2p9CD5JfmFohAkGZIA.ttf" } }, { "kind": "webfonts#webfont", "family": "Pontano Sans", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/pontanosans/v4/gTHiwyxi6S7iiHpqAoiE3C3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Port Lligat Sans", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/portlligatsans/v5/CUEdhRk7oC7up0p6t0g4P6mASEpx5X0ZpsuJOuvfOGA.ttf" } }, { "kind": "webfonts#webfont", "family": "Port Lligat Slab", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/portlligatslab/v5/CUEdhRk7oC7up0p6t0g4PxLSPACXvawUYCBEnHsOe30.ttf" } }, { "kind": "webfonts#webfont", "family": "Prata", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/prata/v6/3gmx8r842loRRm9iQkCDGg.ttf" } }, { "kind": "webfonts#webfont", "family": "Preahvihear", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/preahvihear/v8/82tDI-xTc53CxxOzEG4hDaCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Press Start 2P", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "greek", "cyrillic" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/pressstart2p/v4/8Lg6LX8-ntOHUQnvQ0E7o1jfl3W46Sz5gOkEVhcFWF4.ttf" } }, { "kind": "webfonts#webfont", "family": "Princess Sofia", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/princesssofia/v4/8g5l8r9BM0t1QsXLTajDe-wjmA7ie-lFcByzHGRhCIg.ttf" } }, { "kind": "webfonts#webfont", "family": "Prociono", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/prociono/v6/43ZYDHWogdFeNBWTl6ksmw.ttf" } }, { "kind": "webfonts#webfont", "family": "Prosto One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/prostoone/v4/bsqnAElAqk9kX7eABTRFJPesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Puritan", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/puritan/v7/wv_RtgVBSCn-or2MC0n4Kg.ttf", "italic": "http://fonts.gstatic.com/s/puritan/v7/BqZX8Tp200LeMv1KlzXgLQ.ttf", "700": "http://fonts.gstatic.com/s/puritan/v7/pJS2SdwI0SCiVnO0iQSFT_esZW2xOQ-xsNqO47m55DA.ttf", "700italic": "http://fonts.gstatic.com/s/puritan/v7/rFG3XkMJL75nUNZwCEIJqC3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Purple Purse", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/purplepurse/v5/Q5heFUrdmei9axbMITxxxS3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Quando", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/quando/v4/03nDiEZuO2-h3xvtG6UmHg.ttf" } }, { "kind": "webfonts#webfont", "family": "Quantico", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/quantico/v5/pwSnP8Xpaix2rIz99HrSlQ.ttf", "italic": "http://fonts.gstatic.com/s/quantico/v5/KQhDd2OsZi6HiITUeFQ2U_esZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/quantico/v5/OVZZzjcZ3Hkq2ojVcUtDjaCWcynf_cDxXwCLxiixG1c.ttf", "700italic": "http://fonts.gstatic.com/s/quantico/v5/HeCYRcZbdRso3ZUu01ELbQJKKGfqHaYFsRG-T3ceEVo.ttf" } }, { "kind": "webfonts#webfont", "family": "Quattrocento", "category": "serif", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/quattrocento/v7/WZDISdyil4HsmirlOdBRFC3USBnSvpkopQaUR-2r7iU.ttf", "700": "http://fonts.gstatic.com/s/quattrocento/v7/Uvi-cRwyvqFpl9j3oT2mqkD2ttfZwueP-QU272T9-k4.ttf" } }, { "kind": "webfonts#webfont", "family": "Quattrocento Sans", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/quattrocentosans/v8/efd6FGWWGX5Z3ztwLBrG9eAj_ty82iuwwDTNEYXGiyQ.ttf", "italic": "http://fonts.gstatic.com/s/quattrocentosans/v8/8PXYbvM__bjl0rBnKiByg532VBCoA_HLsn85tSWZmdo.ttf", "700": "http://fonts.gstatic.com/s/quattrocentosans/v8/tXSgPxDl7Lk8Zr_5qX8FIbqxG25nQNOioCZSK4sU-CA.ttf", "700italic": "http://fonts.gstatic.com/s/quattrocentosans/v8/8N1PdXpbG6RtFvTjl-5E7buqAJxizi8Dk_SK5et7kMg.ttf" } }, { "kind": "webfonts#webfont", "family": "Questrial", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/questrial/v6/MoHHaw_WwNs_hd9ob1zTVw.ttf" } }, { "kind": "webfonts#webfont", "family": "Quicksand", "category": "sans-serif", "variants": [ "300", "regular", "700" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/quicksand/v5/qhfoJiLu10kFjChCCTvGlC3USBnSvpkopQaUR-2r7iU.ttf", "regular": "http://fonts.gstatic.com/s/quicksand/v5/Ngv3fIJjKB7sD-bTUGIFCA.ttf", "700": "http://fonts.gstatic.com/s/quicksand/v5/32nyIRHyCu6iqEka_hbKsi3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Quintessential", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/quintessential/v4/mmk6ioesnTrEky_Zb92E5s02lXbtMOtZWfuxKeMZO8Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Qwigley", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/qwigley/v6/aDqxws-KubFID85TZHFouw.ttf" } }, { "kind": "webfonts#webfont", "family": "Racing Sans One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/racingsansone/v4/1r3DpWaCiT7y3PD4KgkNyDjVlsJB_M_Q_LtZxsoxvlw.ttf" } }, { "kind": "webfonts#webfont", "family": "Radley", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/radley/v9/FgE9di09a-mXGzAIyI6Q9Q.ttf", "italic": "http://fonts.gstatic.com/s/radley/v9/Z_JcACuPAOO2f9kzQcGRug.ttf" } }, { "kind": "webfonts#webfont", "family": "Rajdhani", "category": "sans-serif", "variants": [ "300", "regular", "500", "600", "700" ], "subsets": [ "latin-ext", "latin", "devanagari" ], "version": "v5", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/rajdhani/v5/9pItuEhQZVGdq8spnHTku6CWcynf_cDxXwCLxiixG1c.ttf", "regular": "http://fonts.gstatic.com/s/rajdhani/v5/Wfy5zp4PGFAFS7-Wetehzw.ttf", "500": "http://fonts.gstatic.com/s/rajdhani/v5/nd_5ZpVwm710HcLual0fBqCWcynf_cDxXwCLxiixG1c.ttf", "600": "http://fonts.gstatic.com/s/rajdhani/v5/5fnmZahByDeTtgxIiqbJSaCWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/rajdhani/v5/UBK6d2Hg7X7wYLlF92aXW6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Raleway", "category": "sans-serif", "variants": [ "100", "200", "300", "regular", "500", "600", "700", "800", "900" ], "subsets": [ "latin" ], "version": "v9", "lastModified": "2014-08-28", "files": { "100": "http://fonts.gstatic.com/s/raleway/v9/UDfD6oxBaBnmFJwQ7XAFNw.ttf", "200": "http://fonts.gstatic.com/s/raleway/v9/LAQwev4hdCtYkOYX4Oc7nPesZW2xOQ-xsNqO47m55DA.ttf", "300": "http://fonts.gstatic.com/s/raleway/v9/2VvSZU2kb4DZwFfRM4fLQPesZW2xOQ-xsNqO47m55DA.ttf", "regular": "http://fonts.gstatic.com/s/raleway/v9/_dCzxpXzIS3sL-gdJWAP8A.ttf", "500": "http://fonts.gstatic.com/s/raleway/v9/348gn6PEmbLDWlHbbV15d_esZW2xOQ-xsNqO47m55DA.ttf", "600": "http://fonts.gstatic.com/s/raleway/v9/M7no6oPkwKYJkedjB1wqEvesZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/raleway/v9/VGEV9-DrblisWOWLbK-1XPesZW2xOQ-xsNqO47m55DA.ttf", "800": "http://fonts.gstatic.com/s/raleway/v9/mMh0JrsYMXcLO69jgJwpUvesZW2xOQ-xsNqO47m55DA.ttf", "900": "http://fonts.gstatic.com/s/raleway/v9/ajQQGcDBLcyLpaUfD76UuPesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Raleway Dots", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ralewaydots/v4/lhLgmWCRcyz-QXo8LCzTfC3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Ramabhadra", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin", "telugu" ], "version": "v5", "lastModified": "2014-12-10", "files": { "regular": "http://fonts.gstatic.com/s/ramabhadra/v5/JyhxLXRVQChLDGADS_c5MPesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Rambla", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rambla/v4/YaTmpvm5gFg_ShJKTQmdzg.ttf", "italic": "http://fonts.gstatic.com/s/rambla/v4/mhUgsKmp0qw3uATdDDAuwA.ttf", "700": "http://fonts.gstatic.com/s/rambla/v4/C5VZH8BxQKmnBuoC00UPpw.ttf", "700italic": "http://fonts.gstatic.com/s/rambla/v4/ziMzUZya6QahrKONSI1TzqCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Rammetto One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rammettoone/v5/mh0uQ1tV8QgSx9v_KyEYPC3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Ranchers", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ranchers/v4/9ya8CZYhqT66VERfjQ7eLA.ttf" } }, { "kind": "webfonts#webfont", "family": "Rancho", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rancho/v6/ekp3-4QykC4--6KaslRgHA.ttf" } }, { "kind": "webfonts#webfont", "family": "Rationale", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rationale/v7/7M2eN-di0NGLQse7HzJRfg.ttf" } }, { "kind": "webfonts#webfont", "family": "Redressed", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/redressed/v6/3aZ5sTBppH3oSm5SabegtA.ttf" } }, { "kind": "webfonts#webfont", "family": "Reenie Beanie", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/reeniebeanie/v6/ljpKc6CdXusL1cnGUSamX4jjx0o0jr6fNXxPgYh_a8Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Revalia", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/revalia/v4/1TKw66fF5_poiL0Ktgo4_A.ttf" } }, { "kind": "webfonts#webfont", "family": "Ribeye", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ribeye/v5/e5w3VE8HnWBln4Ll6lUj3Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Ribeye Marrow", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ribeyemarrow/v6/q7cBSA-4ErAXBCDFPrhlY0cTNmV93fYG7UKgsLQNQWs.ttf" } }, { "kind": "webfonts#webfont", "family": "Righteous", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/righteous/v5/0nRRWM_gCGCt2S-BCfN8WQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Risque", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/risque/v4/92RnElGnl8yHP97-KV3Fyg.ttf" } }, { "kind": "webfonts#webfont", "family": "Roboto", "category": "sans-serif", "variants": [ "100", "100italic", "300", "300italic", "regular", "italic", "500", "500italic", "700", "700italic", "900", "900italic" ], "subsets": [ "greek-ext", "vietnamese", "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v14", "lastModified": "2014-12-03", "files": { "100": "http://fonts.gstatic.com/s/roboto/v14/7MygqTe2zs9YkP0adA9QQQ.ttf", "100italic": "http://fonts.gstatic.com/s/roboto/v14/T1xnudodhcgwXCmZQ490TPesZW2xOQ-xsNqO47m55DA.ttf", "300": "http://fonts.gstatic.com/s/roboto/v14/dtpHsbgPEm2lVWciJZ0P-A.ttf", "300italic": "http://fonts.gstatic.com/s/roboto/v14/iE8HhaRzdhPxC93dOdA056CWcynf_cDxXwCLxiixG1c.ttf", "regular": "http://fonts.gstatic.com/s/roboto/v14/W5F8_SL0XFawnjxHGsZjJA.ttf", "italic": "http://fonts.gstatic.com/s/roboto/v14/hcKoSgxdnKlbH5dlTwKbow.ttf", "500": "http://fonts.gstatic.com/s/roboto/v14/Uxzkqj-MIMWle-XP2pDNAA.ttf", "500italic": "http://fonts.gstatic.com/s/roboto/v14/daIfzbEw-lbjMyv4rMUUTqCWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/roboto/v14/bdHGHleUa-ndQCOrdpfxfw.ttf", "700italic": "http://fonts.gstatic.com/s/roboto/v14/owYYXKukxFDFjr0ZO8NXh6CWcynf_cDxXwCLxiixG1c.ttf", "900": "http://fonts.gstatic.com/s/roboto/v14/H1vB34nOKWXqzKotq25pcg.ttf", "900italic": "http://fonts.gstatic.com/s/roboto/v14/b9PWBSMHrT2zM5FgUdtu0aCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Roboto Condensed", "category": "sans-serif", "variants": [ "300", "300italic", "regular", "italic", "700", "700italic" ], "subsets": [ "greek-ext", "vietnamese", "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v12", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/robotocondensed/v12/b9QBgL0iMZfDSpmcXcE8nJRhFVcex_hajThhFkHyhYk.ttf", "300italic": "http://fonts.gstatic.com/s/robotocondensed/v12/mg0cGfGRUERshzBlvqxeAPYa9bgCHecWXGgisnodcS0.ttf", "regular": "http://fonts.gstatic.com/s/robotocondensed/v12/Zd2E9abXLFGSr9G3YK2MsKDbm6fPDOZJsR8PmdG62gY.ttf", "italic": "http://fonts.gstatic.com/s/robotocondensed/v12/BP5K8ZAJv9qEbmuFp8RpJY_eiqgTfYGaH0bJiUDZ5GA.ttf", "700": "http://fonts.gstatic.com/s/robotocondensed/v12/b9QBgL0iMZfDSpmcXcE8nPOYkGiSOYDq_T7HbIOV1hA.ttf", "700italic": "http://fonts.gstatic.com/s/robotocondensed/v12/mg0cGfGRUERshzBlvqxeAE2zk2RGRC3SlyyLLQfjS_8.ttf" } }, { "kind": "webfonts#webfont", "family": "Roboto Slab", "category": "serif", "variants": [ "100", "300", "regular", "700" ], "subsets": [ "greek-ext", "vietnamese", "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v6", "lastModified": "2014-08-28", "files": { "100": "http://fonts.gstatic.com/s/robotoslab/v6/MEz38VLIFL-t46JUtkIEgIAWxXGWZ3yJw6KhWS7MxOk.ttf", "300": "http://fonts.gstatic.com/s/robotoslab/v6/dazS1PrQQuCxC3iOAJFEJS9-WlPSxbfiI49GsXo3q0g.ttf", "regular": "http://fonts.gstatic.com/s/robotoslab/v6/3__ulTNA7unv0UtplybPiqCWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/robotoslab/v6/dazS1PrQQuCxC3iOAJFEJXe1Pd76Vl7zRpE7NLJQ7XU.ttf" } }, { "kind": "webfonts#webfont", "family": "Rochester", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rochester/v6/bnj8tmQBiOkdji_G_yvypg.ttf" } }, { "kind": "webfonts#webfont", "family": "Rock Salt", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rocksalt/v6/Zy7JF9h9WbhD9V3SFMQ1UQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Rokkitt", "category": "serif", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rokkitt/v8/GMA7Z_ToF8uSvpZAgnp_VQ.ttf", "700": "http://fonts.gstatic.com/s/rokkitt/v8/gxlo-sr3rPmvgSixYog_ofesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Romanesco", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/romanesco/v5/2udIjUrpK_CPzYSxRVzD4Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Ropa Sans", "category": "sans-serif", "variants": [ "regular", "italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ropasans/v5/Gba7ZzVBuhg6nX_AoSwlkQ.ttf", "italic": "http://fonts.gstatic.com/s/ropasans/v5/V1zbhZQscNrh63dy5Jk2nqCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Rosario", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v10", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rosario/v10/bL-cEh8dXtDupB2WccA2LA.ttf", "italic": "http://fonts.gstatic.com/s/rosario/v10/pkflNy18HEuVVx4EOjeb_Q.ttf", "700": "http://fonts.gstatic.com/s/rosario/v10/nrS6PJvDWN42RP4TFWccd_esZW2xOQ-xsNqO47m55DA.ttf", "700italic": "http://fonts.gstatic.com/s/rosario/v10/EOgFX2Va5VGrkhn_eDpIRS3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Rosarivo", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rosarivo/v4/EmPiINK0qyqc7KSsNjJamA.ttf", "italic": "http://fonts.gstatic.com/s/rosarivo/v4/u3VuWsWQlX1pDqsbz4paNPesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Rouge Script", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rougescript/v5/AgXDSqZJmy12qS0ixjs6Vy3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Rozha One", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "devanagari" ], "version": "v2", "lastModified": "2014-09-04", "files": { "regular": "http://fonts.gstatic.com/s/rozhaone/v2/PyrMHQ6lucEIxwKmhqsX8A.ttf" } }, { "kind": "webfonts#webfont", "family": "Rubik Mono One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v3", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rubikmonoone/v3/e_cupPtD4BrZzotubJD7UbAREgn5xbW23GEXXnhMQ5Y.ttf" } }, { "kind": "webfonts#webfont", "family": "Rubik One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v3", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rubikone/v3/Zs6TtctNRSIR8T5PO018rQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Ruda", "category": "sans-serif", "variants": [ "regular", "700", "900" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ruda/v7/jPEIPB7DM2DNK_uBGv2HGw.ttf", "700": "http://fonts.gstatic.com/s/ruda/v7/JABOu1SYOHcGXVejUq4w6g.ttf", "900": "http://fonts.gstatic.com/s/ruda/v7/Uzusv-enCjoIrznlJJaBRw.ttf" } }, { "kind": "webfonts#webfont", "family": "Rufina", "category": "serif", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rufina/v4/s9IFr_fIemiohfZS-ZRDbQ.ttf", "700": "http://fonts.gstatic.com/s/rufina/v4/D0RUjXFr55y4MVZY2Ww_RA.ttf" } }, { "kind": "webfonts#webfont", "family": "Ruge Boogie", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rugeboogie/v7/U-TTmltL8aENLVIqYbI5QaCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Ruluko", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ruluko/v4/lv4cMwJtrx_dzmlK5SDc1g.ttf" } }, { "kind": "webfonts#webfont", "family": "Rum Raisin", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rumraisin/v4/kDiL-ntDOEq26B7kYM7cx_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Ruslan Display", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ruslandisplay/v7/SREdhlyLNUfU1VssRBfs3rgH88D3l9N4auRNHrNS708.ttf" } }, { "kind": "webfonts#webfont", "family": "Russo One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/russoone/v4/zfwxZ--UhUc7FVfgT21PRQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Ruthie", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ruthie/v6/vJ2LorukHSbWYoEs5juivg.ttf" } }, { "kind": "webfonts#webfont", "family": "Rye", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/rye/v4/VUrJlpPpSZxspl3w_yNOrQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Sacramento", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sacramento/v4/_kv-qycSHMNdhjiv0Kj7BvesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Sail", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sail/v6/iuEoG6kt-bePGvtdpL0GUQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Salsa", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/salsa/v6/BnpUCBmYdvggScEPs5JbpA.ttf" } }, { "kind": "webfonts#webfont", "family": "Sanchez", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sanchez/v4/BEL8ao-E2LJ5eHPLB2UAiw.ttf", "italic": "http://fonts.gstatic.com/s/sanchez/v4/iSrhkWLexUZzDeNxNEHtzA.ttf" } }, { "kind": "webfonts#webfont", "family": "Sancreek", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sancreek/v7/8ZacBMraWMvHly4IJI3esw.ttf" } }, { "kind": "webfonts#webfont", "family": "Sansita One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sansitaone/v6/xWqf68oB50JXqGIRR0h2hqCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Sarina", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sarina/v5/XYtRfaSknHIU3NHdfTdXoQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Sarpanch", "category": "sans-serif", "variants": [ "regular", "500", "600", "700", "800", "900" ], "subsets": [ "latin-ext", "latin", "devanagari" ], "version": "v1", "lastModified": "2014-09-04", "files": { "regular": "http://fonts.gstatic.com/s/sarpanch/v1/YMBZdT27b6O5a1DADbAGSg.ttf", "500": "http://fonts.gstatic.com/s/sarpanch/v1/Ov7BxSrFSZYrfuJxL1LzQaCWcynf_cDxXwCLxiixG1c.ttf", "600": "http://fonts.gstatic.com/s/sarpanch/v1/WTnP2wnc0qSbUaaDG-2OQ6CWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/sarpanch/v1/57kYsSpovYmFaEt2hsZhv6CWcynf_cDxXwCLxiixG1c.ttf", "800": "http://fonts.gstatic.com/s/sarpanch/v1/OKyqPLjdnuVghR-1TV6RzaCWcynf_cDxXwCLxiixG1c.ttf", "900": "http://fonts.gstatic.com/s/sarpanch/v1/JhYc2cr6kqWTo_P0vfvJR6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Satisfy", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/satisfy/v6/PRlyepkd-JCGHiN8e9WV2w.ttf" } }, { "kind": "webfonts#webfont", "family": "Scada", "category": "sans-serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/scada/v4/iZNC3ZEYwe3je6H-28d5Ug.ttf", "italic": "http://fonts.gstatic.com/s/scada/v4/PCGyLT1qNawkOUQ3uHFhBw.ttf", "700": "http://fonts.gstatic.com/s/scada/v4/t6XNWdMdVWUz93EuRVmifQ.ttf", "700italic": "http://fonts.gstatic.com/s/scada/v4/kLrBIf7V4mDMwcd_Yw7-D_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Schoolbell", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/schoolbell/v6/95-3djEuubb3cJx-6E7j4vesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Seaweed Script", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/seaweedscript/v4/eorWAPpOvvWrPw5IHwE60BnpV0hQCek3EmWnCPrvGRM.ttf" } }, { "kind": "webfonts#webfont", "family": "Sevillana", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sevillana/v4/6m1Nh35oP7YEt00U80Smiw.ttf" } }, { "kind": "webfonts#webfont", "family": "Seymour One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/seymourone/v4/HrdG2AEG_870Xb7xBVv6C6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Shadows Into Light", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/shadowsintolight/v6/clhLqOv7MXn459PTh0gXYAW_5bEze-iLRNvGrRpJsfM.ttf" } }, { "kind": "webfonts#webfont", "family": "Shadows Into Light Two", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/shadowsintolighttwo/v4/gDxHeefcXIo-lOuZFCn2xVQrZk-Pga5KeEE_oZjkQjQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Shanti", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/shanti/v7/lc4nG_JG6Q-2FQSOMMhb_w.ttf" } }, { "kind": "webfonts#webfont", "family": "Share", "category": "display", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/share/v5/1ytD7zSb_-g9I2GG67vmVw.ttf", "italic": "http://fonts.gstatic.com/s/share/v5/a9YGdQWFRlNJ0zClJVaY3Q.ttf", "700": "http://fonts.gstatic.com/s/share/v5/XrU8e7a1YKurguyY2azk1Q.ttf", "700italic": "http://fonts.gstatic.com/s/share/v5/A992-bLVYwAflKu6iaznufesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Share Tech", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sharetech/v4/Dq3DuZ5_0SW3oEfAWFpen_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Share Tech Mono", "category": "monospace", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sharetechmono/v4/RQxK-3RA0Lnf3gnnnNrAscwD6PD0c3_abh9zHKQtbGU.ttf" } }, { "kind": "webfonts#webfont", "family": "Shojumaru", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/shojumaru/v4/WP8cxonzQQVAoI3RJQ2wug.ttf" } }, { "kind": "webfonts#webfont", "family": "Short Stack", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/shortstack/v6/v4dXPI0Rm8XN9gk4SDdqlqCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Siemreap", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/siemreap/v9/JSK-mOIsXwxo-zE9XDDl_g.ttf" } }, { "kind": "webfonts#webfont", "family": "Sigmar One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sigmarone/v6/oh_5NxD5JBZksdo2EntKefesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Signika", "category": "sans-serif", "variants": [ "300", "regular", "600", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/signika/v6/0wDPonOzsYeEo-1KO78w4fesZW2xOQ-xsNqO47m55DA.ttf", "regular": "http://fonts.gstatic.com/s/signika/v6/WvDswbww0oAtvBg2l1L-9w.ttf", "600": "http://fonts.gstatic.com/s/signika/v6/lQMOF6NUN2ooR7WvB7tADvesZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/signika/v6/lEcnfPBICWJPv5BbVNnFJPesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Signika Negative", "category": "sans-serif", "variants": [ "300", "regular", "600", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/signikanegative/v5/q5TOjIw4CenPw6C-TW06FjYFXpUPtCmIEFDvjUnLLaI.ttf", "regular": "http://fonts.gstatic.com/s/signikanegative/v5/Z-Q1hzbY8uAo3TpTyPFMXVM1lnCWMnren5_v6047e5A.ttf", "600": "http://fonts.gstatic.com/s/signikanegative/v5/q5TOjIw4CenPw6C-TW06FrKLaDJM01OezSVA2R_O3qI.ttf", "700": "http://fonts.gstatic.com/s/signikanegative/v5/q5TOjIw4CenPw6C-TW06FpYzPxtVvobH1w3hEppR8WI.ttf" } }, { "kind": "webfonts#webfont", "family": "Simonetta", "category": "display", "variants": [ "regular", "italic", "900", "900italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/simonetta/v5/fN8puNuahBo4EYMQgp12Yg.ttf", "italic": "http://fonts.gstatic.com/s/simonetta/v5/ynxQ3FqfF_Nziwy3T9ZwL6CWcynf_cDxXwCLxiixG1c.ttf", "900": "http://fonts.gstatic.com/s/simonetta/v5/22EwvvJ2r1VwVCxit5LcVi3USBnSvpkopQaUR-2r7iU.ttf", "900italic": "http://fonts.gstatic.com/s/simonetta/v5/WUXOpCgBZaRPrWtMCpeKoienaqEuufTBk9XMKnKmgDA.ttf" } }, { "kind": "webfonts#webfont", "family": "Sintony", "category": "sans-serif", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sintony/v4/IDhCijoIMev2L6Lg5QsduQ.ttf", "700": "http://fonts.gstatic.com/s/sintony/v4/zVXQB1wqJn6PE4dWXoYpvPesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Sirin Stencil", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sirinstencil/v5/pRpLdo0SawzO7MoBpvowsImg74kgS1F7KeR8rWhYwkU.ttf" } }, { "kind": "webfonts#webfont", "family": "Six Caps", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sixcaps/v7/_XeDnO0HOV8Er9u97If1tQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Skranji", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/skranji/v4/jnOLPS0iZmDL7dfWnW3nIw.ttf", "700": "http://fonts.gstatic.com/s/skranji/v4/Lcrhg-fviVkxiEgoadsI1vesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Slabo 13px", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v2", "lastModified": "2014-12-03", "files": { "regular": "http://fonts.gstatic.com/s/slabo13px/v2/jPGWFTjRXfCSzy0qd1nqdvesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Slabo 27px", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v2", "lastModified": "2014-12-03", "files": { "regular": "http://fonts.gstatic.com/s/slabo27px/v2/gC0o8B9eU21EafNkXlRAfPesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Slackey", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/slackey/v6/evRIMNhGVCRJvCPv4kteeA.ttf" } }, { "kind": "webfonts#webfont", "family": "Smokum", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/smokum/v6/8YP4BuAcy97X8WfdKfxVRw.ttf" } }, { "kind": "webfonts#webfont", "family": "Smythe", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/smythe/v7/yACD1gy_MpbB9Ft42fUvYw.ttf" } }, { "kind": "webfonts#webfont", "family": "Sniglet", "category": "display", "variants": [ "regular", "800" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sniglet/v7/XWhyQLHH4SpCVsHRPRgu9w.ttf", "800": "http://fonts.gstatic.com/s/sniglet/v7/NLF91nBmcEfkBgcEWbHFa_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Snippet", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/snippet/v6/eUcYMLq2GtHZovLlQH_9kA.ttf" } }, { "kind": "webfonts#webfont", "family": "Snowburst One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/snowburstone/v4/zSQzKOPukXRux2oTqfYJjIjjx0o0jr6fNXxPgYh_a8Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Sofadi One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sofadione/v4/nirf4G12IcJ6KI8Eoj119fesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Sofia", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sofia/v5/Imnvx0Ag9r6iDBFUY5_RaQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Sonsie One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sonsieone/v5/KSP7xT1OSy0q2ob6RQOTWPesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Sorts Mill Goudy", "category": "serif", "variants": [ "regular", "italic" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sortsmillgoudy/v6/JzRrPKdwEnE8F1TDmDLMUlIL2Qjg-Xlsg_fhGbe2P5U.ttf", "italic": "http://fonts.gstatic.com/s/sortsmillgoudy/v6/UUu1lKiy4hRmBWk599VL1TYNkCNSzLyoucKmbTguvr0.ttf" } }, { "kind": "webfonts#webfont", "family": "Source Code Pro", "category": "monospace", "variants": [ "200", "300", "regular", "500", "600", "700", "900" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "200": "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqaXvKVW_haheDNrHjziJZVk.ttf", "300": "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqVP7R5lD_au4SZC6Ks_vyWs.ttf", "regular": "http://fonts.gstatic.com/s/sourcecodepro/v6/mrl8jkM18OlOQN8JLgasD9Rl0pGnog23EMYRrBmUzJQ.ttf", "500": "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqX63uKwMO11Of4rJWV582wg.ttf", "600": "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqeiMeWyi5E_-XkTgB5psiDg.ttf", "700": "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqfgXsetDviZcdR5OzC1KPcw.ttf", "900": "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqRA_awHl7mXRjE_LQVochcU.ttf" } }, { "kind": "webfonts#webfont", "family": "Source Sans Pro", "category": "sans-serif", "variants": [ "200", "200italic", "300", "300italic", "regular", "italic", "600", "600italic", "700", "700italic", "900", "900italic" ], "subsets": [ "vietnamese", "latin-ext", "latin" ], "version": "v9", "lastModified": "2014-08-28", "files": { "200": "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGKXvKVW_haheDNrHjziJZVk.ttf", "200italic": "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6OptKU7UIBg2hLM7eMTU8bI.ttf", "300": "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGFP7R5lD_au4SZC6Ks_vyWs.ttf", "300italic": "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6DUpNKoQAsDux-Todp8f29w.ttf", "regular": "http://fonts.gstatic.com/s/sourcesanspro/v9/ODelI1aHBYDBqgeIAH2zlNRl0pGnog23EMYRrBmUzJQ.ttf", "italic": "http://fonts.gstatic.com/s/sourcesanspro/v9/M2Jd71oPJhLKp0zdtTvoMwRX4TIfMQQEXLu74GftruE.ttf", "600": "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGOiMeWyi5E_-XkTgB5psiDg.ttf", "600italic": "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6Pp6lGoTTgjlW0sC4r900Co.ttf", "700": "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGPgXsetDviZcdR5OzC1KPcw.ttf", "700italic": "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6LVT4locI09aamSzFGQlDMY.ttf", "900": "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGBA_awHl7mXRjE_LQVochcU.ttf", "900italic": "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6A0NcF6HPGWR298uWIdxWv0.ttf" } }, { "kind": "webfonts#webfont", "family": "Source Serif Pro", "category": "serif", "variants": [ "regular", "600", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sourceserifpro/v4/CeUM4np2c42DV49nanp55YGL0S0YDpKs5GpLtZIQ0m4.ttf", "600": "http://fonts.gstatic.com/s/sourceserifpro/v4/yd5lDMt8Sva2PE17yiLarGi4cQnvCGV11m1KlXh97aQ.ttf", "700": "http://fonts.gstatic.com/s/sourceserifpro/v4/yd5lDMt8Sva2PE17yiLarEkpYHRvxGNSCrR82n_RDNk.ttf" } }, { "kind": "webfonts#webfont", "family": "Special Elite", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/specialelite/v6/9-wW4zu3WNoD5Fjka35Jm4jjx0o0jr6fNXxPgYh_a8Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Spicy Rice", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/spicyrice/v5/WGCtz7cLoggXARPi9OGD6_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Spinnaker", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/spinnaker/v8/MQdIXivKITpjROUdiN6Jgg.ttf" } }, { "kind": "webfonts#webfont", "family": "Spirax", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/spirax/v5/IOKqhk-Ccl7y31yDsePPkw.ttf" } }, { "kind": "webfonts#webfont", "family": "Squada One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/squadaone/v5/3tzGuaJdD65cZVgfQzN8uvesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Stalemate", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/stalemate/v4/wQLCnG0qB6mOu2Wit2dt_w.ttf" } }, { "kind": "webfonts#webfont", "family": "Stalinist One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/stalinistone/v6/ltOD4Zj3WJDXYjAIR-9vZojjx0o0jr6fNXxPgYh_a8Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Stardos Stencil", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/stardosstencil/v6/ygEOyTW9a6u4fi4OXEZeTFf2eT4jUldwg_9fgfY_tHc.ttf", "700": "http://fonts.gstatic.com/s/stardosstencil/v6/h4ExtgvoXhPtv9Ieqd-XC81wDCbBgmIo8UyjIhmkeSM.ttf" } }, { "kind": "webfonts#webfont", "family": "Stint Ultra Condensed", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/stintultracondensed/v5/8DqLK6-YSClFZt3u3EgOUYelbRYnLTTQA1Z5cVLnsI4.ttf" } }, { "kind": "webfonts#webfont", "family": "Stint Ultra Expanded", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/stintultraexpanded/v4/FeigX-wDDgHMCKuhekhedQ7dxr0N5HY0cZKknTIL6n4.ttf" } }, { "kind": "webfonts#webfont", "family": "Stoke", "category": "serif", "variants": [ "300", "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/stoke/v6/Sell9475FOS8jUqQsfFsUQ.ttf", "regular": "http://fonts.gstatic.com/s/stoke/v6/A7qJNoqOm2d6o1E6e0yUFg.ttf" } }, { "kind": "webfonts#webfont", "family": "Strait", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/strait/v4/m4W73ViNmProETY2ybc-Bg.ttf" } }, { "kind": "webfonts#webfont", "family": "Sue Ellen Francisco", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sueellenfrancisco/v7/TwHX4vSxMUnJUdEz1JIgrhzazJzPVbGl8jnf1tisRz4.ttf" } }, { "kind": "webfonts#webfont", "family": "Sunshiney", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/sunshiney/v6/kaWOb4pGbwNijM7CkxK1sQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Supermercado One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/supermercadoone/v6/kMGPVTNFiFEp1U274uBMb4mm5hmSKNFf3C5YoMa-lrM.ttf" } }, { "kind": "webfonts#webfont", "family": "Suwannaphum", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/suwannaphum/v9/1jIPOyXied3T79GCnSlCN6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Swanky and Moo Moo", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/swankyandmoomoo/v6/orVNZ9kDeE3lWp3U3YELu9DVLKqNC3_XMNHhr8S94FU.ttf" } }, { "kind": "webfonts#webfont", "family": "Syncopate", "category": "sans-serif", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/syncopate/v6/RQVwO52fAH6MI764EcaYtw.ttf", "700": "http://fonts.gstatic.com/s/syncopate/v6/S5z8ixiOoC4WJ1im6jAlYC3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Tangerine", "category": "handwriting", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/tangerine/v6/DTPeM3IROhnkz7aYG2a9sA.ttf", "700": "http://fonts.gstatic.com/s/tangerine/v6/UkFsr-RwJB_d2l9fIWsx3i3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Taprom", "category": "display", "variants": [ "regular" ], "subsets": [ "khmer" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/taprom/v8/-KByU3BaUsyIvQs79qFObg.ttf" } }, { "kind": "webfonts#webfont", "family": "Tauri", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/tauri/v4/XIWeYJDXNqiVNej0zEqtGg.ttf" } }, { "kind": "webfonts#webfont", "family": "Teko", "category": "sans-serif", "variants": [ "300", "regular", "500", "600", "700" ], "subsets": [ "latin-ext", "latin", "devanagari" ], "version": "v5", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/teko/v5/OobFGE9eo24rcBpN6zXDaQ.ttf", "regular": "http://fonts.gstatic.com/s/teko/v5/UtekqODEqZXSN2L-njejpA.ttf", "500": "http://fonts.gstatic.com/s/teko/v5/FQ0duU7gWM4cSaImOfAjBA.ttf", "600": "http://fonts.gstatic.com/s/teko/v5/QDx_i8H-TZ1IK1JEVrqwEQ.ttf", "700": "http://fonts.gstatic.com/s/teko/v5/xKfTxe_SWpH4xU75vmvylA.ttf" } }, { "kind": "webfonts#webfont", "family": "Telex", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/telex/v4/24-3xP9ywYeHOcFU3iGk8A.ttf" } }, { "kind": "webfonts#webfont", "family": "Tenor Sans", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/tenorsans/v7/dUBulmjNJJInvK5vL7O9yfesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Text Me One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/textmeone/v4/9em_3ckd_P5PQkP4aDyDLqCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "The Girl Next Door", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/thegirlnextdoor/v7/cWRA4JVGeEcHGcPl5hmX7kzo0nFFoM60ux_D9BUymX4.ttf" } }, { "kind": "webfonts#webfont", "family": "Tienne", "category": "serif", "variants": [ "regular", "700", "900" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/tienne/v8/-IIfDl701C0z7-fy2kmGvA.ttf", "700": "http://fonts.gstatic.com/s/tienne/v8/JvoCDOlyOSEyYGRwCyfs3g.ttf", "900": "http://fonts.gstatic.com/s/tienne/v8/FBano5T521OWexj2iRYLMw.ttf" } }, { "kind": "webfonts#webfont", "family": "Tinos", "category": "serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "greek-ext", "vietnamese", "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/tinos/v8/EqpUbkVmutfwZ0PjpoGwCg.ttf", "italic": "http://fonts.gstatic.com/s/tinos/v8/slfyzlasCr9vTsaP4lUh9A.ttf", "700": "http://fonts.gstatic.com/s/tinos/v8/vHXfhX8jZuQruowfon93yQ.ttf", "700italic": "http://fonts.gstatic.com/s/tinos/v8/M6kfzvDMM0CdxdraoFpG6vesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Titan One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/titanone/v4/FbvpRvzfV_oipS0De3iAZg.ttf" } }, { "kind": "webfonts#webfont", "family": "Titillium Web", "category": "sans-serif", "variants": [ "200", "200italic", "300", "300italic", "regular", "italic", "600", "600italic", "700", "700italic", "900" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "200": "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wprzOdCrLccoxq42eaxM802O0.ttf", "200italic": "http://fonts.gstatic.com/s/titilliumweb/v4/RZunN20OBmkvrU7sA4GPPj4N98U-66ThNJvtgddRfBE.ttf", "300": "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wpr9ZAkYT8DuUZELiKLwMGWAo.ttf", "300italic": "http://fonts.gstatic.com/s/titilliumweb/v4/RZunN20OBmkvrU7sA4GPPrfzCkqg7ORZlRf2cc4mXu8.ttf", "regular": "http://fonts.gstatic.com/s/titilliumweb/v4/7XUFZ5tgS-tD6QamInJTcTyagQBwYgYywpS70xNq8SQ.ttf", "italic": "http://fonts.gstatic.com/s/titilliumweb/v4/r9OmwyQxrgzUAhaLET_KO-ixohbIP6lHkU-1Mgq95cY.ttf", "600": "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wpr28K9dEd5Ue-HTQrlA7E2xQ.ttf", "600italic": "http://fonts.gstatic.com/s/titilliumweb/v4/RZunN20OBmkvrU7sA4GPPgOhzTSndyK8UWja2yJjKLc.ttf", "700": "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wpr2-6tpSbB9YhmWtmd1_gi_U.ttf", "700italic": "http://fonts.gstatic.com/s/titilliumweb/v4/RZunN20OBmkvrU7sA4GPPio3LEw-4MM8Ao2j9wPOfpw.ttf", "900": "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wpr7L0GmZLri-m-nfoo0Vul4Y.ttf" } }, { "kind": "webfonts#webfont", "family": "Trade Winds", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/tradewinds/v5/sDOCVgAxw6PEUi2xdMsoDaCWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Trocchi", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/trocchi/v4/uldNPaKrUGVeGCVsmacLwA.ttf" } }, { "kind": "webfonts#webfont", "family": "Trochut", "category": "display", "variants": [ "regular", "italic", "700" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/trochut/v4/6Y65B0x-2JsnYt16OH5omw.ttf", "italic": "http://fonts.gstatic.com/s/trochut/v4/pczUwr4ZFvC79TgNO5cZng.ttf", "700": "http://fonts.gstatic.com/s/trochut/v4/lWqNOv6ISR8ehNzGLFLnJ_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Trykker", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/trykker/v5/YiVrVJpBFN7I1l_CWk6yYQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Tulpen One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/tulpenone/v6/lwcTfVIEVxpZLZlWzR5baPesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Ubuntu", "category": "sans-serif", "variants": [ "300", "300italic", "regular", "italic", "500", "500italic", "700", "700italic" ], "subsets": [ "greek-ext", "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v7", "lastModified": "2014-08-28", "files": { "300": "http://fonts.gstatic.com/s/ubuntu/v7/7-wH0j2QCTHKgp7vLh9-sQ.ttf", "300italic": "http://fonts.gstatic.com/s/ubuntu/v7/j-TYDdXcC_eQzhhp386SjaCWcynf_cDxXwCLxiixG1c.ttf", "regular": "http://fonts.gstatic.com/s/ubuntu/v7/lhhB5ZCwEkBRbHMSnYuKyA.ttf", "italic": "http://fonts.gstatic.com/s/ubuntu/v7/b9hP8wd30SygxZjGGk4DCQ.ttf", "500": "http://fonts.gstatic.com/s/ubuntu/v7/bMbHEMwSUmkzcK2x_74QbA.ttf", "500italic": "http://fonts.gstatic.com/s/ubuntu/v7/NWdMogIO7U6AtEM4dDdf_aCWcynf_cDxXwCLxiixG1c.ttf", "700": "http://fonts.gstatic.com/s/ubuntu/v7/B7BtHjNYwAp3HgLNagENOQ.ttf", "700italic": "http://fonts.gstatic.com/s/ubuntu/v7/pqisLQoeO9YTDCNnlQ9bf6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Ubuntu Condensed", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "greek-ext", "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ubuntucondensed/v6/DBCt-NXN57MTAFjitYxdrKDbm6fPDOZJsR8PmdG62gY.ttf" } }, { "kind": "webfonts#webfont", "family": "Ubuntu Mono", "category": "monospace", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "greek-ext", "latin-ext", "latin", "greek", "cyrillic-ext", "cyrillic" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ubuntumono/v6/EgeuS9OtEmA0y_JRo03MQaCWcynf_cDxXwCLxiixG1c.ttf", "italic": "http://fonts.gstatic.com/s/ubuntumono/v6/KAKuHXAHZOeECOWAHsRKA0eOrDcLawS7-ssYqLr2Xp4.ttf", "700": "http://fonts.gstatic.com/s/ubuntumono/v6/ceqTZGKHipo8pJj4molytne1Pd76Vl7zRpE7NLJQ7XU.ttf", "700italic": "http://fonts.gstatic.com/s/ubuntumono/v6/n_d8tv_JOIiYyMXR4eaV9c_zJjSACmk0BRPxQqhnNLU.ttf" } }, { "kind": "webfonts#webfont", "family": "Ultra", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/ultra/v8/OW8uXkOstRADuhEmGOFQLA.ttf" } }, { "kind": "webfonts#webfont", "family": "Uncial Antiqua", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/uncialantiqua/v4/F-leefDiFwQXsyd6eaSllqrFJ4O13IHVxZbM6yoslpo.ttf" } }, { "kind": "webfonts#webfont", "family": "Underdog", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/underdog/v5/gBv9yjez_-5PnTprHWq0ig.ttf" } }, { "kind": "webfonts#webfont", "family": "Unica One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/unicaone/v4/KbYKlhWMDpatWViqDkNQgA.ttf" } }, { "kind": "webfonts#webfont", "family": "UnifrakturCook", "category": "display", "variants": [ "700" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "700": "http://fonts.gstatic.com/s/unifrakturcook/v8/ASwh69ykD8iaoYijVEU6RrWZkcsCTHKV51zmcUsafQ0.ttf" } }, { "kind": "webfonts#webfont", "family": "UnifrakturMaguntia", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/unifrakturmaguntia/v7/7KWy3ymCVR_xfAvvcIXm3-kdNg30GQauG_DE-tMYtWk.ttf" } }, { "kind": "webfonts#webfont", "family": "Unkempt", "category": "display", "variants": [ "regular", "700" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/unkempt/v7/NLLBeNSspr0RGs71R5LHWA.ttf", "700": "http://fonts.gstatic.com/s/unkempt/v7/V7H-GCl9bgwGwqFqTTgDHvesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Unlock", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/unlock/v6/rXEQzK7uIAlhoyoAEiMy1w.ttf" } }, { "kind": "webfonts#webfont", "family": "Unna", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/unna/v8/UAS0AM7AmbdCNY_80xyAZQ.ttf" } }, { "kind": "webfonts#webfont", "family": "VT323", "category": "monospace", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/vt323/v7/ITU2YQfM073o1iYK3nSOmQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Vampiro One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/vampiroone/v6/OVDs4gY4WpS5u3Qd1gXRW6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Varela", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/varela/v7/ON7qs0cKUUixhhDFXlZUjw.ttf" } }, { "kind": "webfonts#webfont", "family": "Varela Round", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/varelaround/v6/APH4jr0uSos5wiut5cpjri3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Vast Shadow", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/vastshadow/v6/io4hqKX3ibiqQQjYfW0-h6CWcynf_cDxXwCLxiixG1c.ttf" } }, { "kind": "webfonts#webfont", "family": "Vesper Libre", "category": "serif", "variants": [ "regular", "500", "700", "900" ], "subsets": [ "latin-ext", "latin", "devanagari" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/vesperlibre/v5/Cg-TeZFsqV8BaOcoVwzu2C3USBnSvpkopQaUR-2r7iU.ttf", "500": "http://fonts.gstatic.com/s/vesperlibre/v5/0liLgNkygqH6EOtsVjZDsZMQuUSAwdHsY8ov_6tk1oA.ttf", "700": "http://fonts.gstatic.com/s/vesperlibre/v5/0liLgNkygqH6EOtsVjZDsUD2ttfZwueP-QU272T9-k4.ttf", "900": "http://fonts.gstatic.com/s/vesperlibre/v5/0liLgNkygqH6EOtsVjZDsaObDOjC3UL77puoeHsE3fw.ttf" } }, { "kind": "webfonts#webfont", "family": "Vibur", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/vibur/v7/xB9aKsUbJo68XP0bAg2iLw.ttf" } }, { "kind": "webfonts#webfont", "family": "Vidaloka", "category": "serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/vidaloka/v8/C6Nul0ogKUWkx356rrt9RA.ttf" } }, { "kind": "webfonts#webfont", "family": "Viga", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/viga/v5/uD87gDbhS7frHLX4uL6agg.ttf" } }, { "kind": "webfonts#webfont", "family": "Voces", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/voces/v4/QoBH6g6yKgNIgvL8A2aE2Q.ttf" } }, { "kind": "webfonts#webfont", "family": "Volkhov", "category": "serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v8", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/volkhov/v8/MDIZAofe1T_J3un5Kgo8zg.ttf", "italic": "http://fonts.gstatic.com/s/volkhov/v8/1rTjmztKEpbkKH06JwF8Yw.ttf", "700": "http://fonts.gstatic.com/s/volkhov/v8/L8PbKS-kEoLHm7nP--NCzPesZW2xOQ-xsNqO47m55DA.ttf", "700italic": "http://fonts.gstatic.com/s/volkhov/v8/W6oG0QDDjCgj0gmsHE520C3USBnSvpkopQaUR-2r7iU.ttf" } }, { "kind": "webfonts#webfont", "family": "Vollkorn", "category": "serif", "variants": [ "regular", "italic", "700", "700italic" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/vollkorn/v6/IiexqYAeh8uII223thYx3w.ttf", "italic": "http://fonts.gstatic.com/s/vollkorn/v6/UuIzosgR1ovBhJFdwVp3fvesZW2xOQ-xsNqO47m55DA.ttf", "700": "http://fonts.gstatic.com/s/vollkorn/v6/gOwQjJVGXlDOONC12hVoBqCWcynf_cDxXwCLxiixG1c.ttf", "700italic": "http://fonts.gstatic.com/s/vollkorn/v6/KNiAlx6phRqXCwnZZG51JAJKKGfqHaYFsRG-T3ceEVo.ttf" } }, { "kind": "webfonts#webfont", "family": "Voltaire", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/voltaire/v6/WvqBzaGEBbRV-hrahwO2cA.ttf" } }, { "kind": "webfonts#webfont", "family": "Waiting for the Sunrise", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/waitingforthesunrise/v7/eNfH7kLpF1PZWpsetF-ha9TChrNgrDiT3Zy6yGf3FnM.ttf" } }, { "kind": "webfonts#webfont", "family": "Wallpoet", "category": "display", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/wallpoet/v7/hmum4WuBN4A0Z_7367NDIg.ttf" } }, { "kind": "webfonts#webfont", "family": "Walter Turncoat", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/walterturncoat/v6/sG9su5g4GXy1KP73cU3hvQplL2YwNeota48DxFlGDUo.ttf" } }, { "kind": "webfonts#webfont", "family": "Warnes", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/warnes/v6/MXG7_Phj4YpzAXxKGItuBw.ttf" } }, { "kind": "webfonts#webfont", "family": "Wellfleet", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/wellfleet/v4/J5tOx72iFRPgHYpbK9J4XQ.ttf" } }, { "kind": "webfonts#webfont", "family": "Wendy One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin" ], "version": "v4", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/wendyone/v4/R8CJT2oDXdMk_ZtuHTxoxw.ttf" } }, { "kind": "webfonts#webfont", "family": "Wire One", "category": "sans-serif", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/wireone/v6/sRLhaQOQpWnvXwIx0CycQw.ttf" } }, { "kind": "webfonts#webfont", "family": "Yanone Kaffeesatz", "category": "sans-serif", "variants": [ "200", "300", "regular", "700" ], "subsets": [ "latin-ext", "latin" ], "version": "v7", "lastModified": "2014-08-28", "files": { "200": "http://fonts.gstatic.com/s/yanonekaffeesatz/v7/We_iSDqttE3etzfdfhuPRbq92v6XxU4pSv06GI0NsGc.ttf", "300": "http://fonts.gstatic.com/s/yanonekaffeesatz/v7/We_iSDqttE3etzfdfhuPRZlIwXPiNoNT_wxzJ2t3mTE.ttf", "regular": "http://fonts.gstatic.com/s/yanonekaffeesatz/v7/YDAoLskQQ5MOAgvHUQCcLdXn3cHbFGWU4T2HrSN6JF4.ttf", "700": "http://fonts.gstatic.com/s/yanonekaffeesatz/v7/We_iSDqttE3etzfdfhuPRf2R4S6PlKaGXWPfWpHpcl0.ttf" } }, { "kind": "webfonts#webfont", "family": "Yellowtail", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/yellowtail/v6/HLrU6lhCTjXfLZ7X60LcB_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Yeseva One", "category": "display", "variants": [ "regular" ], "subsets": [ "latin-ext", "latin", "cyrillic" ], "version": "v9", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/yesevaone/v9/eenQQxvpzSA80JmisGcgX_esZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Yesteryear", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v5", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/yesteryear/v5/dv09hP_ZrdjVOfZQXKXuZvesZW2xOQ-xsNqO47m55DA.ttf" } }, { "kind": "webfonts#webfont", "family": "Zeyada", "category": "handwriting", "variants": [ "regular" ], "subsets": [ "latin" ], "version": "v6", "lastModified": "2014-08-28", "files": { "regular": "http://fonts.gstatic.com/s/zeyada/v6/hmonmGYYFwqTZQfG2nRswQ.ttf" } } ] } PKAA#]\�DŬ���2system/helix3/assets/fonts/fontawesome-webfont.ttfnu�[��� �PFFTMk�G���GDEF��p OS/2�2z@X`cmap �:��gasp���hglyf���M�L�head��-�6hhea �$hmtxEy�� �loca��\�maxp,8 name㗋�gh�post����k�uː�xY_<��3�2�3�2��� � ���� ��'@i��3��3s�pyrs@ �� �pU�]�����y�n�����2��@������ ��������z���Z@�5�5 ���z���ZZ����@���������,_���@������s���@ ��@��(������@�����@��@- �M�M�-� �M�M�����@�����@@� �-����`��b���� ���$����6�4�8�"�"""""���@�D@���,,@� ��������� m��)@�@ ' D9>dY* ' � �� ��T �@ f� %RE $!k(D�' �� �%�� �% �� ��0%�/�&��p@0 �����!"""`���>�N�^�n�~��������������.�>�N�^�n�~��������������>�N�^�n�~������������ �����!"""`���!�@�P�`�p�������������� �0�@�P�`�p��������������!�@�P�`�p�������������\�X�S�B�1����ݬ ���������������������������������� � ,,,,,,,,,,,,,��t�L�T$�l x � T(�� d����l,����4d�pH�$d,t( � �!�"0# $,$�&D'�(�)T**�,,�-�.@.�/`/�00�1�2�3d444�5 5�5�6 6\6�7H7�88`8�9L9�:h:�;�<p=p><>�?h?�@H@�A0A�BXB�CdC�DLD�E�F�G0G�H�I�J8K�L�MdN,N�N�O�P`P�Q4Q�RRlS,S�T`U0W�X�Z[@[�\<\�]�^(^�_�`pb,b�dd�ePe�f�g`g�iLi�jDkk�l�m@n,oLp�q�r�sxtt�uD{`||�}}�~��������H��������l�@����������l�H� ���T��H�������`����@�����$�\�X��D�������T�X�����D�P�,���8���d�\����������������H���x��� �t���X���p��d��������x�t�������������@�������\� ļ�ŸƔ�0���d��ʨˀ����͔�x��ϰЌ�,ш�҈�ӌ���8�,՜�`���l�Hش�`���Tڸ�۔�@���l��ބ�߬��l�p� ������������������������������4�����X���$�l���(����`���������� d �� ,�,��8��(�X���x|T�@��| �!�"x##l$$�'h(�*L,T.L1t1�2�303�4�5t6T7$89H::�;�<�<�?X@A�B�C�D�EHFHGpHHIxJ J�K�L�MN@P@Q�R�SDT ULV`V�WXX4X�ZZ�[d[�\|]�^�`�aHa�b�cXd�etfhg�h�i\jxn�p@s�vw�x�y�z�{h|�}}�\���l�t���4���������t���8�8���L���T�������������|�������|�������4�x�����L����������X�(� ������� ������@�����l���t����$����x�L�L��� �H������Ġ�T�(����ʈˠ��ϔ�l�d���P�Մ�x�p���ڬ�T�T���ވ�L�����<�H��$���l������4����������� �P�l����,���x���p�,�x�t��d����4���4,h�P 4 �� �4�<,,408$�8�T� |!h"�$L%0&H'�(�)�*0*�+�,�.$.�0�1�2@2�3�4t5$6�9 :�:�;;�<(<�=4?�@�A�C�D�F�H`H�I�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�p7!!!���@p�p �p�]���!2#!"&463!&54>3!2�+��@&&��&&@��+$(�($F#+���&4&&4&x+#��+".4>32".4>32467632DhgZghDDhg-iW�DhgZghDDhg-iW&@(8 ��2N++NdN+'�;2N++NdN+'�3 8���! #"'#"$&6$ �������rL46$������oo��o|W%r��������4L&V|o��oo����ܳ��%��=M%+".'&%&'3!26<.#!";2>767>7#!"&5463!2� %��3@m00m@3���% � �@ ���:"7..7":�6]�^B�@B^^B�B^ $΄+0110+��$� ( �t��1%%1��+�`��B^^B@B^^���"'.54632>32�4�� #L</��>�oP$$Po�>���Z$_d�C�+I@$$@I+��������"#"'%#"&547&547%62���V�?�?V��8��<��8y��� ���b% I�))�9I ���� + %%#"'%#"&547&547%62q2�Z���Z2Izy���V)�?�?V��8��<��8)>~��>��[�� ��� 2���b% I�))�9I ���%#!"&54>3 72 &6 }X��X}.GuL�l�LuG.�����>�m��mU��mE��Em�������>����/?O_o���54&+";2654&+";2654&+";264&#!"3!2654&+";2654&+";264&#!"3!2654&+";2654&+";2654&+";267#!"&5463!2�&�&&�&&�&&�&&�&&�&&�&&&�&�&&�&�&�&&�&��&�&&&�&�&&�&&�&&�&&�&&�&�^B��B^^B@B^@�&&�&&��&&�&&��&&�&&�&&�&&��&&�&&���&&�&&&&�&&���&&�&&��&&�&&��&&�&&���B^^B@B^^��/?#!"&5463!2#!"&5463!2#!"&5463!2#!"&5463!2L4�4LL44LL4�4LL44L�L4�4LL44LL4�4LL44L��4LL4�4LL��4LL4�4LL���4LL4�4LL��4LL4�4LL �/?O_o�#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28(��(88(@(88(��(88(@(8�8(��(88(@(8��8(��(88(@(8�8(��(88(@(8�8(��(88(@(8��8(��(88(@(8�8(��(88(@(88(��(88(@(8 �(88(�(88�(88(�(88��(88(�(88�(88(�(88��(88(�(88��(88(�(88�(88(�(88��(88(�(88�(88(�(88�/?O_#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28(��(88(@(88(��(88(@(88(�@(88(�(8�8(��(88(@(88(�@(88(�(88(�@(88(�(8 �(88(�(88�(88(�(88��(88(�(88�(88(�(88��(88(�(88�(88(�(88y��"/&4?62 62��,�P����P&�P��P�,��jP�����n���#$"' "/&47 &4?62 62 �P���P�&���P&&P���&�P�&���P&&P���&�P������#+D++"&=#"&=46;546;232 #"'#"$&6$ � @ � � @ � �������rK56$������oo��o|W�@ � � @ � ��r��������jK&V|o��oo����ܳ�����0#!"&=463!2 #"'#"$&6$ �� @ �������rK56$������oo��o|W�@ @ �r��������jK&V|o��oo����ܳ����)5 $&54762>54&'.7>"&5462z�����z��+i *bkQ��н�Qkb* j*����LhLLhL�����zz���Bm +*i J�yh��QQ��hy�J i*+ m��J��4LL4�4LL���/?O%+"&=46;2%+"&546;2%+"&546;2+"&546;2+"&546;2��������������`��r��@�@r�@��@����n4&"2#"/+"&/&'#"'&'&547>7&/.=46?67&'&547>3267676;27632�Ԗ����#H ��,/ �1)� ~'H� �(C � �,/ �1)� �$H� Ԗ�Ԗm�6%2X %� l�2 �k r6 [21 �..9Q $� k�2 �k w3[20����/;Cg+"&546;2+"&546;2+"&546;2!3!2>!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@���@�`�0 �� o`^B��B^`5FN(@(NF5 ��@��@��@���L%%Ju �@�LSyuS�@�%44%�f5#!!!"&5465 7#"' '&/&6762546;2�&�����&??�> �L�L > � X ��� � &���&��&AJ A�� J W���h��##!"&5463!2!&'&!"&5!�(8(��(88(�(`�x ��c�`(8��`(��(88(@(8(D��9�8(����� ,#!"&=46;46;2. 6 $$ ����@��������(�r���^����a�a�@@`��(��������_�^����a�a��2NC5.+";26#!26'.#!"3!"547>3!";26/.#!2W � ��.�@ �� �@.�$S � S$�@ ���9I � I6> �� ��>�%=$4&"2$4&"2#!"&5463!2?!2"'&763!463!2!2&4&&4&&4&&4�8(�@(88(ч:�:��(8���@6�@*&&*�4&&4&&4&&4& ��(88(@(8�88�8)�@�)'�&&�@���$0"'&76;46;232 >& $$ ` ������������(���r���^����a�a`�� @`��2�������(���^����a�a�����$0++"&5#"&54762 >& $$ ^��� ?@�����(���r���^����a�a���`? ����������(���^����a�a�� #!.'!!!%#!"&547>3!2�<�<�<_@`&��&� 5@5 �@����&&�>=(""��=���'#"'&5476. 6 $$ � �� ! ��������(�r���^����a�a�J�� %�%���(��������_�^����a�a�����3#!"'&?&#"3267672#"$&6$3276&�@*���h��QQ��hw�I � m�ʬ����zz���k�)'�@&('��Q��н�Qh_ � ��z�8�zoe����$G!"$'"&5463!23267676;2#!"&4?&#"+"&=!2762�@�h���k�4&&�&�G�a��F*� &�@&��Ɇ�F*� A��k�4&���nf�&�&&4�BH�rd�@&&4���rd Moe�&�/?O_o+"&=46;25+"&=46;25+"&=46;2#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!26#!"&5463!2� @ @ @ @ @ @ � �@ � �@ � �@ � � �@ � �^B�@B^^B�B^`@ @ �@ @ �@ @ ��@ @ �@ @ �@ @ �3@ �� M��B^^B@B^^��!54&"#!"&546;54 32@�Ԗ@8(�@(88( p (8�j��j��(88(@(8������8@���7+"&5&5462#".#"#"&5476763232>32@@ @ @KjK�ך=}\�I���&:�k�~&26]S &H&� �&H5KKu�t,4,� &� x:;*4*&��K#+"&546;227654$ >3546;2+"&="&/&546$ �<��X@@Gv"D�����װD"vG@@X��<��4L4����1!Sk @ G<_b������b_<G �� kS!1����zz�� �"'!"&5463!62&4����&&M4&���&M&�&M& ��-"'!"&5463!62#"&54>4.54632&4����&&M4&�UF &""""& F���&M&�&M&���%/B/%���G-Ik"'!"&5463!62#"&54>4.54632#"&54767>4&'&'&54632#"&547>7676'&'.'&54632&4����&&M4&�UF &""""& FU�� &'8JSSJ8'& ���� &'.${��{$.'& ����&M&�&M&���%/B/%7���;&'6���6'&;��4�[&$ [2[ $&[��#/37#5#5!#5!!!!!!!#5!#5!5##!35!!!����������������������������������������������������������������������������#'+/37;?3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3???? ^��>>~??�??�??~??~??^??�^^? ^??������������������������������������4&"2#"'.5463!2�KjKKjv%�'45%�5&5L4�5�&�%jKKjK�@5%�%%�%�5�4L5&�6'��k�54&"2#"'.5463!2#"&'654'.#32�KjKKjv%�'45%�5&5L4�5�&�%�%�'4$.�%%�5&�5�5�&�%jKKjK�@5%�%%�%�5�4L5&�6'45%�%�%54'�&55&�6' ��y�Tdt#!"&'&74676&7>7>76&7>7>76&7>7>76&7>7>63!2#!"3!2676'3!26?6&#!"3!26?6&#!"g(��sA�eM�,*$/ !'& �JP��$G]�� x�6,&��` �� h` �� "9H�v@WkNC<. &k& ("$p" . #u&# %!' pJ�vwEF�# @ �� @ ���2#"' #"'.546763�!''!0#�G�G$/!''!� 8"��"8 ��X! 8" "8 ����<)!!#"&=!4&"27+#!"&=#"&546;463!232������(8���&4&&4� �8(�@(8� qO@8(�(`�(@Oq��8(��&4&&4&@�` �(88(� �Oq (8(�`(�q���!)2"&42#!"&546;7>3!2 I��j��j��j��j�3e55e3�gr������`��I�j��j��j�j��1GG1���r��������P2327&7>7;"&#"4?2>54.'%3"&#"#ժ!�9&W��B03&�K5�!�)V�?�@L��'� >R�>e;&L:�:%P�>��vO 'h�� N��_"�:-&+# ��:�� ' ����+a%3 4'.#"32>54.#"7>7><5'./6$3232#"&#"+JBx)EB_I:I*CRzb3:dtB2P���$$5.3b�ZF�|\8!-T>5��Fu��\,�,j�n OrB,<! 5�4wJ]�?tTFi; 2�3j.�p^%/2�+ S:T}K4W9: #ƕd�fE���:7>7676'5.'732>7"#"&#&#"OA zj=N!�}:0e��% y� +t�D3�~U#B4# g '2 %/!: ���T bRU,7����}%2"/&6;#"&?62+326323!2>?23&'.'.#"&"$#"#&=>764=464.'&#"&'�!~:~!PP!~:~!P��6�,�,$�$%*' c2N (�$"L��A2�3Yl�!x!*�%��%%��%�� p�P,T NE Q7^���oH!+( 3 *Ue�eu wg��a�32632$?23&'.5&'&#"&"5$#"#&=>7>4&54&54>.'&#"&'2#".465!#".'&47>32!4&4>Q6�,�,Faw!*' =~Pl* (�$"L��A2�3Yl �)�!*<7@@7< � <7@@7< p�P,T MF Q7�47ƢHoH!+( 3 t���JHQ6wh��',686,'$##$',686,'$##$�/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&��&&�&��&�&&&&�&&&��&��&&�&��&&�&&f�&&�&&f�&&�&&f�&&�&&�/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&��&&�&��&��&&�&&��&&�&��&��&&�&��&&�&&f�&&�&&f�&&�&&f�&&�&&�/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&��&&�&&�&&&&�&&&&��&&�&��&&�&&f�&&�&&f�&&�&&f�&&�&&�/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&��&&�&&��&&�&&��&&�&&��&&�&��&&�&&f�&&�&&f�&&�&&f�&&�&&�/?O_o%+"&=46;2+"&=46;2+"&=46;2#!"&=463!2+"&=46;2#!"&=463!2#!"&=463!2#!"&=463!2 � � � � � � �� @ � � � �� @ �� @ �� @ � � s� � s� � �� � s� � �� � s� � s� � �/?O#"'&47632#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2� �� � �@ � �� @ �� @ �@ � � �� � s� � s� � s� � �/?O#"&54632 #!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2` �� � �@ � �� @ �� @ �@ � � �� @ �� � � s� � s� � s� � #"'#!"&5463!2632' �m�w�@w��w�w�� '���*��w��w�w��w������."&462!5 !"3!2654&#!"&5463!2�p�pp�p��@��� @ �^B��B^^B@B^�pp�p���@�@� �@ � �@B^^B�B^^���k%!7'34#"3276' !7632k[�[�v �� 6����`�%��`�$65&�%[�[k���� �`����5%���&&�'���4&"2"&'&54 �Ԗ���!��?H?��!,�,Ԗ�ԖmF��!&&!Fm�,�����%" $$ ���������^����a�a`@������^����a�a���-4'.'&"26% 547>7>2"KjK��X��QqYn 243nYqQ�$!+!77!+!$5KK���,ԑ� ���]""]ً� ��9>H7'3&7#!"&5463!2'&#!"3!26=4?6 !762xt�t` �� ^Q�w��w��w@?61��B^^B@B^ @(` �`��\\��\P�`t�t8`� �� ^�Ͼw��w@w�1^B��B^^B~ @��` \ \�P�+Z#!"&5463!12+"3!26=47676#"'&=# #"'.54>;547632��w��w��w� M8 pB^^B@B^� '���sw- 9*##;No��j�' �#��w��w@w� "^B��B^^B� ��*����� "g`�81T`PSA:'�*��4�/D#!"&5463!2#"'&#!"3!26=4?632"'&4?62 62��w��w��w@?61 ��B^^B@B^ @ ��B�RnB�Bn^��w��w@w�1 ^B��B^^B� @ ���Bn���nB�C"&=!32"'&46;!"'&4762!#"&4762+!5462�4&���&�4�&���&4�4&��&4&��&4�4�&���&4�4&��&4&��&4�4&���&����6'&'+"&546;267��: &�&&�& s�@� �Z&&�&&�Z ���+6'&''&'+"&546;267667��: �: &�&&�& � s�@� �:� �Z&&�&&�Z ��: z����6'&''&47667S�: �:� s�@� �:�4��: �|� &546h��!!0a� � � $���#!"&5463!2#!"&5463!2&�&&&��&�&&&@��&&�&&��&&�&&���#!"&5463!2&��&&�&@��&&�&&���&54646&5-� ��: s��: ��:4�:� ���+&5464646;2+"&5&5-� � &�&&�& �: s��: ��: �&&��&&� �:� ���&54646;2+"&5-� &�&&�& s��: �&&��&&� 62#!"&!"&5463!2�4��@��&&�&&-��:��&&&�&����� "'&4762����4��4����4��4��4Z��f� "/&47 &4?62S�4����4����44��4���#/54&#!4&+"!"3!;265!26 $$ �&�&�&�&&&�&&@���^����a�a@�&&&�&�&�&&&+�^����a�a�����54&#!"3!26 $$ �&�&&&@���^����a�a@�&&�&&+�^����a�a�����+74/7654/&#"'&#"32?32?6 $$ }��Z��Z��Z��Z����^����a�a���Z��Z��Z��Z�^����a�a�����#4/&"'&"327> $$ [4�h�4[j����^����a�a"Z�i�Z��J�^����a�a�����:F%54&+";264.#"32767632;265467>$ $$ ���o�W�� 5!"40K(0?i�+! ":����^����a�a����X�R�dD4!&.uC$=1/J=�^����a�a�����.:%54&+4&#!";#"3!2654&+";26 $$ `��``��������^����a�a�����������^����a�a�����/_#"&=46;.'+"&=32+546;2>++"&=.'#"&=46;>7546;232�m&&m �l&�&l� m&&m �l&�&l�s&�%�&�&��%�&&�%�&�&��%�&&�&l� m&&m �l&�&l� m&&m �,�&��%�&&�%�&�&��%�&&�%�&���#/;"/"/&4?'&4?627626. 6 $$ I� �� � �� � �� � �� ͒������(�r���^����a�aɒ �� � �� � �� � �� (��������_�^����a�a����� , "'&4?6262. 6 $$ ��Z4��f4�4fz�������(�r���^����a�a�Z&4f�f4�(��������_�^����a�a����� "4'32>&#" $&6$ W���oɒV��� z�����zz�8�����YW�˼�[����?����zz�:�zz�@�5K #!#"'&547632!2A4�@%&&K%54'�u%%�&54&K&&���4A��5K��$l$L%%�%54'�&&J&j&��K�5�K #"/&47!"&=463!&4?632�%�u'43'K&&%�@4AA4���&&K&45&�%@6%�u%%K&j&%K5�5K&$l$K&&�u#5��K@!#"'+"&5"/&547632K%K&56$��K5�5K��$l$K&&�#76%�%53'K&&%�@4AA4���&&K&45&�%%�u'5��K�"#"'&54?63246;2632K%�u'45%�u&&J'45%&L4�4L&%54'K%�5%�t%%�$65&K%%���4LL4�@&%%K'���,"&5#"#"'.'547!3462�4&�b��qb>#5���&4�4�&6Uu�e7D# "�dž�&����/#!"&546262"/"/&47'&463!2� ���&�@&&4�L r&4��� r L�&�&� ���4&&�&�L rI�@&��� r L�4&& ���s/"/"/&47'&463!2#!"&546262&4��� r L�&�&� ���&�@&&4�L r@�@&��� r L�4&&� ���4&&�&�L r��##!+"&5!"&=463!46;2!2�8(�`8(�(8�`(88(�8(�(8�(8 �(8�`(88(�8(�(8�(88(�`8��#!"&=463!2�8(�@(88(�(8 �(88(�(88z���5'%+"&5&/&67-.?>46;2%6�.@g.��L4�4L��.g@. ��.@g. L4�4L .g@.���g.n.���4LL43�.n.g��g.n.�34LL4�͙.n.g����- $54&+";264'&+";26/�a����^����� � � � �����^����a�a�� � fm�� @ J%55!;263'&#"$4&#"32+#!"&5#"&5463!"&46327632#!2���$�$�8�~+(88�8(+}�(�`8(��(8`�]��]k=��=k]��]��8���,8e�8P88P8�����`(88(�@���M��M����N4&#"327>76$32#"'.#"#"&'.54>54&'&54>7>7>32&����z&^��&.������/+>+)>J> W��m7����' '"''? &4&c��&^|h_b��ml/J@L@#* #M6:D 35sҟw$ '% ' \�t��3#!"&=463!2'.54>54''� �� @ �1O``O1CZ��Z71O``O1BZ��Z7�@ @ N�]SHH[3`�)Tt��bN�]SHH[3^�)Tt���!1&' 547 $4&#"2654632 '&476 ���=������=嘅�����}�(zVl��'��'���ٌ@�uhy����yhu����9(�}Vz��D#���#D#������� =CU%7.5474&#"2654632%#"'&547.'&476!27632#76$7&'7+NWb=嘧�}�(zV�j�\i1 z,��X�� Y[6 $!%���'F��u�J�iys�?_�9ɍ?�kyhu�n(�}Vz����YF KA؉L�a �0��2�-�F"@Q���sp@�_���!3%54&+";264'&+";26#!"&'&7>2 � � � � #%;"�";%#<F<������7 ���??""??�$$ll2#"'&' +&/&'&?632 &'&?67>`,@L�����5 ` �� ` �����L�`4�L��H` ����` �� a 5� ��L@��#37;?Os!!!!%!!!!%!!!!!!!!%!!4&+";26!!%!!!!74&+";26%#!"&546;546;2!546;232� ��`@���� ��`@���� ���@����@�� ��@���� @ @ � ��@��� �� @ @ �L4��4LL4�^B@B^�^B@B^�4L� �� @@��@@ � � � @@ �� ��@@ �� � �� M�4LL44L`B^^B``B^^B`L���7q.+"&=46;2#"&=".'673!54632#"&=!"+"&=46;2>767>3!54632�<M33K,�� �� j8Z4L2B4:;M33K,? �� �0N<* .)C=W]xD��0N<* .)C=W]xD?\�-7H)�� �� �".=']�-7H)� ��w �� �<?.>mBZxPV3!�<?.>mBZxPV3!� ���&#"'&'5&6&>7>7&54>$32�d�FK��1A 0)����L���.���٫�C58.H(Y���e����#3C $=463!22>=463!2#!"&5463!2#!"&5463!2���H���&�&/<R.*.R</&�&�&��&&�&&��&&�&������Bɀ&&�4L&&L4�&&f��&&�&&��&&�&&Z� %"' "/&4762��4���4��4�ͥ���5��5Z���� "'&4?62 62��4��44���5����5��%K%#!".<=#"&54762+!2"'&546;!"/&5463!232 �@�&@<@&�@ ����:��&��� � ��& ��&���&��� ����&�� ��`&���:$"&462"&462!2#!"&54>7#"&463!2!2�LhLLh�LhLLh�!�� �&&�&��&&�&4hLLhLLhLLhL��%z< 0&4&&)17&4& &&��#!"&5463!2!2��\�@\��\@\��\���@\��\�\��\ �W�*#!"&547>3!2!"4&5463!2!2W��+�B��"5P+�B@"5����^�=���\@\� \�H#�t3G#�3G:�_H�t�\��\ �@��+32"'&46;#"&4762�&��&�4�&��&4�4&�&4�4&&4�@�"&=!"'&4762!5462�4&�&4�4&&4�4�&��&4&��&���� !!!3!!��������������������������0@67&#".'&'#"'#"'32>54'6#!"&5463!28ADAE=\W{��O[/5dI kDt���pČe1?*�w�@w��w�w�� (M& B{Wta28r=Ku?RZ^Gw��T -�@w��w�w�����$2+37#546375&#"#3!"&5463�w��w���/Dz?s�����w��w��w�@w�S�88� �����w�w����#'.>4&#"26546326"&462!5!& !5!!=!!%#!"&5463!2�B^8(�Ԗ���������>��������@�|�K5�5KK55K�^B(8Ԗ�Ԗ�>�������v����5KK55KK�H��G4&"&#"2654'32#".'#"'#"&54$327.54632@p�p)*Ppp�p)*P�b '"+`�N*(�a���;2��̓c`." b PTY9��ppP*)p�ppP*)�b ".`�(*N��ͣ�2�ͣ����`+"' b MRZB�����4&"24&"264&"26#"/+"&/&'#"'&547>7&/.=46?67&'&547>3267676;27632#"&'"'#"'&547&'&=4767&547>32626?2#"&'"'#"'&547&'&=4767&547>32626?2��Ԗ���LhLKjKLhLKjK�� �"8w s%(�")v � >� �"8x s"+�")v �<� ��3zLLz3�� 3>8L3)x3 ��3zLLz3�� 3>8L3)x3 �Ԗ�Ԗ�4LL45KK54LL45KK��� #)0C wZl/ � Y� N,&� #)0C vZl. � Y�L0"��qG^^Gq�q$ ]G)Fq�qG^^Gq�q$ ]G)Fq��%O#"'#"&'&4>7>7.546$ '&'&'# '32$7>54'�����VZ|�$2$ |��E~E<�| $2$�|ZV���:�(t}�������X( &%(H�w�쉉��x�H(%& (X�ZT\�MKG���<m$4&"24&#!4654&#+32;254'>4'654&'>7+"&'&#!"&5463!6767>763232&4&&4�N2��`@`%)7&,$)' %/0Ӄy�#5 +�1 &<��$]`�{t��5KK5$e:1&+'3T�F0�h��4&&4&�3M:�;b^v�+D2 5#$��I�IJ 2E=\$YJ!$MCeM��-+(K5�5K�K5y�*%A�u]c���>q4&"24&'>54'654&'654&+"+322654&5!267+#"'.'&'&'!"&5463!27>;2&4&&4�+ 5#bW���0/% ')$,&7)%`@``2N��h�0##�T3'"(0;e$��5KK5 t��ip��<& 1&4&&4&�#\=E2&%IURI��$#5 2D+�v^b;�:M2g�c]vDEA%!bSV2M�K5�5K(,,��MeCM$!I��@�#"&547&547%6@�?V��8������b% I�)���94.""'." 67"'.54632>32�+C`\hxeH>Hexh\`C+�ED���4�� #L</��>�oP$$Po�>��Q|I.3MCCM3.I|Q����/����Z$_d�C�+I@$$@I+� (@%#!"&5463!2#!"3!:"&5!"&5463!462� ��w��w@ ��B^^B ���4&�@&&�&4 ` �w�w� ^B�@B^24��& &�& &�����%573#7.";2634&#"35#347>32#!"&5463!2���FtIG9;HI�x�I��<,tԩw�@w��w�w�z��4DD43EE�����ueB����s�@w��w�w�����.4&"26#!+"'!"&5463"&463!2#2��&�S3L�l&�c4LL4�4LL4c����@��&��&{�LhLLhL��'?#!"&5463!2#!"3!26546;2"/"/&47'&463!2��w��w��w��@B^^B@B^@�&4��t r ��&&`��w��w@w�@^B��B^^B@R�&��t r ��4&&@"&5!"&5463!462 #!"&54&>3!2654&#!*.54&>3!2���4&�@&&�&4 s�w�� @B^^B�� @w��4��& &�& &��3�@w� ^B�B^ ����� I&5!%5!>732#!"&=4632654&'&'.=463!5463!2!2�J���J���S��q*5&=CKu��uKC=&5*q͍S8( ^B@B^ (8���`N��`Ѣ�G�tO6)"M36J[E@@E[J63M")6Ot�G�(8`B^^B`8 ���',2��6'&'&76'6'&6&'&6'&4#"7&64 654'.'&'.63226767.547&7662>76#!"&5463!2 /[ . =���X��Ě4,+"*+, 1JH'5G:�:#L5+@=&#���w�@w��w�w�P.1GE�,��ԧ��44+ ;/5cFO:>JJ>:O9W5$@(b4��@w��w�w������'?$4&"2$4&"2#!"&5463!3!267!2#!#!"&5!"'&762&4&&4&&4&&4�8(�@(88(�c==c�(8��*�&�&�*�6�&4&&4&&4&&4& ��(88(@(88HH88`(�@&&�('��@����1c4&'.54654'&#"#"&#"32632327>7#"&#"#"&54654&54>76763232632 N<�;+gC8�A`1a9�9�g��w����|�9�8aIe$I�VN��z<�:LQJ �,�-[% 061I��(�)W,$-������7,oIX(�)o�ζA;=N0 eTZ (���O#".'&'&'&'.54767>3232>32�e^\4?P bM��O0#382W#& 9C9 Lĉ" 82<*9FF(W283#0OMb P?4\^eFF9*<28 "��L 9C9 &#��!"3!2654&#!"&5463!2`��B^^B@B^^ީw��w��w@w�^B��B^^B@B^���w��w@w�����#!72#"' #"'.546763���YY�!''!0#�G�G$/!''!�&�UU�jZ 8"��"8 ��X! 8" "8 ���GW4.'.#"#".'.'.54>54.'.#"32676#!"&5463!2 1.- +$) c�8 )1) 05.D <9�0)$9��w�@w��w�w�W )1) 7�c )$+ -.1 �9$)0���< D.59�@w��w�w��,T1# '327.'327.=.547&54632676TC_L��Ҭ���#+�i�!+*p�DNBN,y[����`m`%i]hbE����m��}a�u&,�SXK�� &$��f9s? _���#"!#!#!54632��V<%'����Э��HH��� �(ں����T\dksz�� &54654'>54'6'&&"."&'./"?'&546'&6'&6'&6'&6'&74"727&6/�a���49[aA)O%-j'&]�]5r-%O)@a[9' 0BA;+ >HC���U # $ 2 AC: �����oM�=a-6O�UwW[q ( - q[WwU�P6$C +) ( 8&/ &eM���a� & $ ��%+"&54&"32#!"&5463!54 �&@&�Ԗ`(88(�@(88(�r��&&j��j�8(��(88(@(8��������#'+2#!"&5463"!54ĉ!375!35!�B^^B��B^^B � �� `���^B�@B^^B�B^� �� � `�� �������!="&462+"&'&'.=476;+"&'&$'.=476;�p�pp�p�$���!�$qr� �%���}�#ߺ���pp�p��!�E$� �rq�ܢ#��� %� ֻ��!)?"&462"&4624&#!"3!26!.#!"#!"&547>3!2/B//B//B//B� �@ � �2�����^B�@B^�\77\�aB//B//B//B/�@ �� �� �~��B^^B@2^5BB5��2���.42##%&'.67#"&=463! 2�5KK5L4�_�u:B&1/&��.- zB^^B���4L��v��y�KjK��4L[!^k'!A3;):2*�<vTq6^B�B^�L4�$���)��*@��A4#"&54"3!4."#!"&5!"&5>547&5462�;U gI�v��0Z���Z0�L4�@�Ԗ�@4L2RX='�8P8��'=XR� U;Ig0,3lb??bl3���4Lj��jL4*\���(88(�����\���}I/#"/'&/'&?'&'&?'&76?'&7676767676`� (�5)�0 )��*) 0�)5�( �� (�5)�0 ))��)) 0�)5�( ��*) 0�)5�(�� )�5)�0 )*��*) 0�)5�) �� )�5)�0 )*���5h$4&"24&#!4>54&#"+323254'>4'654&'!267+#"'&#!"&5463!2>767>32!2&4&&4�N2��$YGB (HGEG H��Q�#5K4L��i�!<�����;��5KK5 A# ("/?&}�vh��4&&4&�3M95S+C=�,@QQ9��@@�IJ 2E=L5i�>9eM��E;K5�5K J7R>@#�zD<����5=q%3#".'&'&'&'.#"!"3!32>$4&"2#!"#"&?&547&'#"&5463!&546323!2` #A<(H(GY$��2NL4K5#aWTƾh&4&&4�K5��;����=!�i��hv�}&?/"( #A 5K��2*! Q@.'!&=C+S59M34L=E2 JI UR@@&4&&4&���5K;E��Lf9>�ig�<Dz�#@>R7J K�5h4&"24#"."&#"4&#"".#"!54>7#!"&54.'&'.5463246326326&4&&4��IJ 2E=L43M95S+C=�,@QQ9�@@�E;K5��5K J7R>@#�zD<�gi�>9eM��Z4&&4&<�#5K4LN2��$YGB (HGEG H��V���;��5KK5 A# ("/?&}�vh��i�!<��4<p4.=!32>332653272673264&"2/#"'#"&5#"&54>767>5463!2�@@��2*! Q@.'!&=C+S59M34L.9E2 JI UR�&4&&4&��Lf6A�ig�6Jy�#@>R7J K5�5K;E@TƾH #A<(H(GY$��2NL4K#5#a=4&&4&�D��=�i��hv�}&?/"( #A 5KK5��;�����+54&#!764/&"2?64/!26 $$ &� �[6��[[j6[��&���^����a�a@�&�4[��[6[��[6�&+�^����a�a�����+4/&"!"3!277$ $$ [��6[�� &&��[6j[ ���^����a�ae6[j[6�&�&�4[j[��^����a�a�����+4''&"2?;2652?$ $$ ��[6[��[6�&�&�4[���^����a�af6j[[��6[�� &&��[��^����a�a�����+4/&"4&+"'&"2? $$ [6�&�&�4[j[6[j���^����a�ad6[��&&� �[6��[[j��^����a�a������ $2>767676&67>?&'4&'.'.'."#&6'&6&'3.'.&'&'&&'&6'&>567>#7>7636''&'&&'.'"6&'6'..'/"&'&76.'7>767&.'"76.7"7"#76'&'.'2#22676767765'4.6326&'.'&'"'>7>&&'.54>'>7>67&'ʢ&7767>&/45'.67>76'27".#6'>776'>7647>?6#76'6&'676'&67.'&'6.'.#&'.&6'&.5/�a����^����D&" 4 $! # .0"�Y + ! $ " + �Α ����^����a�a�� P� '-( # * $ " ! * ! ( ��$� 2 �~�/$4&"2 #"/&547#"32>32�&4&&4��V%54'j&&�'��/덹���:,���{ &4&&4&�V%%l$65&�b��'C��r!"��k[G�+;%!5!!5!!5!#!"&5463!2#!"&5463!2#!"&5463!2����������&��&&�&&��&&�&&��&&�&�������@�&&&&�&&&&�&&&&��{#"'&5&763!2{�' ��**�)��*��)'/!5!#!"&5!3!26=#!5!463!5463!2!2���^B�@B^�&@&`��^B`8(@(8`B^��� B^^B�&&�����B^�(88(�^���G 76#!"'&? #!"&5476 #"'&5463!2 '&763!2#"'��c�)'&�@*������*�@&('�c���(&�*�cc�*�&' ����*�@&('�c���'(&�*�cc�*�&('���c�'(&�@*��19AS[#"&532327#!"&54>322>32"&462 &6 +&'654'32>32"&462Q�g�Rp|Kx;CB��y��y� 6Fe= BP���PB =eF6 ��Ԗ��V����>!pR�g�QBC;xK|��Ԗ���{QNa*+%��x��x5eud_C(+5++5+(C_due2Ԗ�Ԗ�����>�NQ{u�%+*jԖ�Ԗ��p�!Ci4/&#"#".'32?64/&#"327.546326#"/&547'#"/&4?632632��(* 8(!�)(��A�('��)* 8(!U�SxyS�SXXVzxT�TU�SxyS�SXXVzxT�@(� (8 *(���(��'(�(8 ���S�SU�Sx{VXXT�T�S�SU�Sx{VXXT���#!"5467&5432632�������t,Ԟ;F`j�)��������6�,��>�jK?�s�� �!%#!"&7#"&463!2+!'5#�8Ej��jE8�@&&&&@������XYY�&4&&4&�qD�S�%��q%��N\jx��2"&4#"'#"'&7>76326?'&'#"'.'&676326326&'&#"32>'&#"3254?''7�4&&4&l�� �NnbS���VZbR��SD zz DS��Rb)+U���Sbn� ��\.2Q\dJ'.2Q\dJ.Q2.'Jd\Q2.'Jd`!O�`�� `�����&4&&4�r$#@�B10M�5TNT{L�5T II T5�L;l'OT4�M01B�@#$�*�3;$*�3;�;3�*$;3�*$�:$/� @@�Qq`��@���"%3<2#!"&5!"&5467>3!263! !!#!!46!#!�(88(�@(8��(8(�`(�(8D<���+����+�<��8(�`(��8(�`�8(�@(88( 8(�(`�(8(��(������<��`(8��(`����`(8����||?%#"'&54632#"'&#"32654'&#"#"'&54632|�u�d��qܟ�s] = ��Ofj�L?R@T?��"&� > �f?rRX=Ed�u�ds���q�� = _M�jiL��?T@R?E& �f > �=XRr?��b���!1E)!34&'.##!"&5#3463!24&+";26#!"&5463!2���� �� 08(��(8��8(@(8�� � � �8(��(88(�(`(����1 �`(88(���(88(@ �� �`(88(@(8(��`���#!"&5463!2�w�@w��w�w�`�@w��w�w��/%#!"&=463!2#!"&=463!2#!"&=463!2&��&&�&&��&&�&&��&&�&��&&�&&�&&�&&�&&�&&��@'7G$"&462"&462#!"&=463!2"&462#!"&=463!2#!"&=463!2�p�pp�pp�pp�� �@ � ��p�pp�� �@ � �@ � Рpp�p��pp�p��� � �pp�p��� � � � ��<L\l|#"'732654'>75"##5!!&54>54&#"'>3235#!"&=463!2!5346=#'73#!"&=463!2#!"&=463!2}mQjB919+i1$AjM_3<��/BB/.#U_:IdDRE� �@ � ����k*G�j� �@ � �@ � TP\BX-@8 C)5�XsJ@�$3T4+,:;39SG2S.7<��� �vcc)�)%L�l�}� �� � ���5e2#!"&=463%&'&5476!2/&'&#"!#"/&'&=4'&?5732767654'&��@�0��2uBo T25XzrDCBB�Eh:%��)0%HPIP{rQ�9f#-+>;I@KM-/Q"�@@@#-bZ��$&P{<�8[;:XICC>.�'5oe80#.0( l0&%,"J&9%$<=DTI���cs&/6323276727#"327676767654./&'&'737#"'&'&'&54'&54&#!"3!260% <4�"VRt8<@< -#=XYhW8+0$"+dT�Lx-'I&JKkm��uw<=V�@�!X@ v '��|N;!/!$8:I�Ob�V;C#V & (���mL.A:9 !./KLwP�M�$��@@ ��/?O_o��%54&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!26#!"&5463!2��@��@��@���@��@��@���@��@��@�^B��B^^B@B^�����������������������������N��B^^B@B^^���#+3 '$"/&4762%/?/?/?/?�%k��*��6�6��bbbb|��<<��<�bbbb��bbbb�%k���6���6Ƒbbb��<<��<<�^bbbbbb@��M$4&"2!#"4&"2&#"&5!"&5#".54634&>?>;5463!2�LhLLh���� � LhLLhL!'�Ԗ���Ԗ@'!& �?�&&LhLLhL� � ��hLLhL�� j��jj��j &@6/" ��&&���J#"'676732>54.#"7>76'&54632#"&7>54&#"&54$ ���ok; -j=y�hw�i�[+PM3ѩ���k=J%62>Vc��a�aQ�^��� ]G"�'9��r�~:`}�Ch� 0=Z�٤���W=#uY2BrUI1�^Fk[|��a�����L2#!67673254.#"67676'&54632#"&7>54&#"#"&5463�w��w�+U ,i<��F{�jh�}Z+OM 2ϧ���j<J%51=Ub�w��w��w�@w�zX"�'8'�T�yI9`{�Bf� ,>X�բ���W<"uW1AqSH1�bd��w�w����'74'!3#"&46327&#"326%35#5##33#!"&5463!2����0U6c��c\=hl���ࠥ�Ymmnnnn�w�@w��w�w�w&�46#�Ȏ;ed����wnnnnn��@w��w�w���� ]#/#"$&6$3 &#"32>7!5!%##5#5353����Е���tt����u�{�zz�{S�ZC�`�c�����o���t�*�t��q|��|.EXN#�??�������,<!5##673#$".4>2"&5!#2!46#!"&5463!2��r�M* �*M~�~M**M~�~M*j����jj����&�&&&�`��P%��挐|NN|���|NN|�*�jj���jj�@��&&�&&@� "'&463!2�@4�@&�Z4�@�4&@ #!"&4762&��&�4�Z4&&4��@@��� "'&4762�&4�@�4&@��&�4�&�@� "&5462@�@4&&4��4�@&�&�@���� 3!!%!!26#!"&5463!2�`��m��` �^B��B^^B@B^��� `���@B^^B�B^^��@ "'&463!2#!"&4762�@4�@&�&&��&�4��4�@�4&Z4&&4��@�� "'&463!2�@4�@&��4�@�4&@ #!"&4762&��&�4�Z4&&4��@��:#!"&5;2>76%6+".'&$'.5463!2^B�@B^,9j�9Gv33vG9�H9+bI��\ A+=66=+A [��">nSM�A_:��B^^B1&�c*/11/*{�'VO�3��@/$$/@�*�?Nh^��l+!+"&5462!4&#"!/!#>32]��_gTRdg�d���QV?U��I*Gg?����!�2IbbIJaa���iwE33����00� 08����4#"$'&6?6332>4.#"#!"&54766$32z�䜬��m� I�wh��QQ��hb�F�*�@&('�k�������z�� � _hQ��н�QGB�'(&�*�eoz�(���q!#"'&547"'#"'&54>7632&4762.547>32#".'632�%k'45%��&+�~( (�h & \( (� & ~+54'k%5%l%%l$65+~ & �( (\ & �h( (~�+%��'��!)19K4&"24&"26.676&$4&"24&"24&"2#!"'&46$ �KjKKjKjKKj�e2.e<^P��,bKjKKj��KjKKjKjKKj��#��#���LlL�KjKKjKjKKjK��~-��M<M�(PM<rjKKjK�jKKjKujKKjK�������L���< 6?32$6&#"'#"&'5&6&>7>7&54$ L�h��я�W.�{+9E=�c��Q�d�FK��1A 0)���������p�J2`[Q?l&������٫�C58.H(Y��'����:d 6?32$64&$ #"'#"&'&4>7>7.546'&'&'# '32$7>54'Y����j`a#",5NK� ����~E�����VZ|�$2$ |��: $2$�|ZV���:�(t}�����h�fR�88T h�̲����X( &%(H�w��(%& (X�ZT\�MKG�{x��|�!#"'.7#"'&7>3!2%632u�� �j �H����{(e9 �1b���U#!"&546;5!32#!"&546;5!32#!"&546;5463!5#"&5463!2+!2328(��(88(`�`(88(��(88(`�`(88(��(88(`L4`(88(@(88(`4L`(8 ��(88(@(8��8(��(88(@(8��8(��(88(@(8�4L�8(@(88(��(8�L4�8����OY"&546226562#"'.#"#"'.'."#"'.'.#"#"&5476$32&"5462��И&4&NdN!>! 1X:Dx++w�w++xD:X1 -�U�� �!�*,*&4&��h��h&&2NN2D& ..J< $$ <JJ< $$ <J.. ��P���bb&&�7!!"&5!54&#!"3!26! #!"&=!"&5463!2��`(8�� �@ � +��8(�@(8��(88(@(8�(��8(� @ @ �m+�U�`(88(�8(@(88(�� �h`���(\"&54&#"&46324."367>767#"&'"&547&547&547.'&54>2�l4 2cK�Eo���oED ) � � � ) D�g-;</- ?.P^P.? -/<;-gY�����Y� .2 L4H|O--O|HeO,����,Oe�q1Ls26%%4.2,44,2.4%%62sL1q�c�qAAq����4#!#"'&547632!2#"&=!"&=463!54632 �� �� @ ` �� �� `?`� � @ @ �! �� � � � ����54&+4&+"#"276#!"5467&5432632� � � ` _ �������v,Ԝ;G_j�)��`` �� �� _ԟ����7 �,��>�jL>���54'&";;265326#!"5467&5432632 �� �� � � � �������v,Ԝ;G_j�)��� ` ���� `������7 �,��>�jL>�����X`$"&462#!"&54>72654&'547 7"2654'54622654'54&'46.' &6 �&4&&4&�y��y�%:hD:Fp�pG9�F�j� 8P8 LhL 8P8 E; Dh:%������>�4&&4&}y��yD~�s[4D�d=PppP=d�>hh>@�jY*(88(*Y4LL4Y*(88(*YDw" A4*[s�~����>�����M4&"27 $=.54632>32#"' 65#"&4632632 65.5462&4&&4�G9��������& <#5KK5!��!5KK5#< &ܤ��9Gp�p&4&&4&@>b�u��ោؐ&$KjK�nj��j�KjK$&����j��j�b>Ppp��� %!5!#"&5463!!35463!2+32����@\��\���8(@(8�\@@\������\@\���(88(��\��@��34#"&54"3#!"&5!"&5>547&5462�;U gI@L4�@�Ԗ�@4L2RX='�8P8��'=XR� U;Ig04Lj��jL4*\���(88(�����\��@"4&+32!#!"&+#!"&5463!2�pP@@P���j�j�@�@�\�@\�&��0�p����j�� ��� \��\�&��-B+"&5.5462265462265462+"&5#"&5463!2�G9L4�4L9G&4&&4&&4&&4&&4&L4�4L� ��&���=d��4LL4d=�&&�`&&�&&�`&&�&&��4LL4 ��&�#3CS#!"&5463!2!&'&!"&5!463!2#!"&52#!"&=4632#!"&=463�(8(��(88(�(`�x ��c�`(8���@��@��@�`(��(88(@(8(D��9�8(��`@�@@�@@��/?O_o��������-=%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!!5463!2#!"&5463!2� @ @ @ @ @ @ � @ @ @ @ � @ @ � @ @ � @ @ @ @ � @ @ � @ @ � @ @ @ @ � @ @ � @ @ @ @ � @ @ @ @ ����� @ &�&&&�@ @ �@ @ @ @ �@ @ ��@ @ �@ @ �@ @ �@ @ ��@ @ �@ @ �@ @ �@ @ ��@ @ �@ @ �@ @ ��@ @ �@ @ @ @ ���� `��&&�&& ��/?O_o�����%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!#!"&=!!5463!24&+"#54&+";26=3;26%#!"&5463!463!2!2� @ @ @ @ @ @ � @ @ @ @ � @ @ � @ @ @ @ � @ @ @ @ ���8(�@(8�� @ @ � @ @ � @ &�&&@8(�(8@&�@ @ �@ @ @ @ �@ @ ��@ @ �@ @ �@ @ ��@ @ �@ @ @ @ ��� (88( ��� �@ `` �� `` -�&&& (88(��&@����<c$4&"2!#4&"254&+54&+"#";;26=326+"&5!"&5#"&46346?>;463!2�KjKKj�����KjKKj�������&��Ԗ���Ԗ�&&�@�&�&KjKKjK�� ��jKKjK ������.��&j��jj��j&4&�@�@&&���#'1?I54&+54&+"#";;26=326!5!#"&5463!!35463!2+32����������� \��\����8(@(8�\ \����������\@\���(88(��\����: #32+53##'53535'575#5#5733#5;2+3����@��E&&`�@@��` ���� `��@@�`&&E%@�`��@ @ @�� �� � � � �� ��@ 0 @��!3!57#"&5'7!7!��K5�������@ � � @���5K�@����@@��� �����#3%4&+"!4&+";265!;26#!"&5463!2&�&�&�&&�&&�&�w�@w��w�w���&&��@&&��&&@��&&��@w��w�w�����#354&#!4&+"!"3!;265!26#!"&5463!2&��&�&��&&@&�&@&�w�@w��w�w�@�&@&&��&�&��&&@&:�@w��w�w��-M�3)$"'&4762 "'&4762 s 2 �. � 2 �w�� 2 �. � 2 �w�� 2 � � 2 �w�w 2 � � 2 �w�w M�3)"/&47 &4?62"/&47 &4?62S �. 2 ��w 2 �� �. 2 ��w 2 �M �. 2 �� 2 �. �. 2 �� 2 �.M�3S)$"' "/&4762"' "/&47623 2 �w�w 2 � � 2 �w�w 2 � �� 2 ��w 2 � �.v 2 ��w 2 � �.M�3s)"'&4?62 62"'&4?62 623 �. �. 2 �� 2 �. �. 2 �� 2� �. � 2 �w� 2v �. � 2 �w� 2-Ms3 "'&4762s �w� 2 �. � 2� �w�w 2 � � 2 MS3"/&47 &4?62S �. 2 ��w 2 �M �. 2 �� 2 �.M 3S"' "/&47623 2 �w�w 2 � �m 2 ��w 2 � �.M-3s"'&4?62 623 �. �. 2 �� 2- �. � 2 �w� 2���/4&#!"3!26#!#!"&54>5!"&5463!2 �� @ �^B�� &�& ��B^^B@B^ @ �� M��B^%Q= &&<P&^B@B^^�+3"&5463!2#3!2654&#!"3#!"&=324+"3�B^^B@B^^B�� @ �� `�^B��B^�p�^B�B^^B�@B^`�@ � �S`(88(`` ��'$4&"2%4&#!"3!26#!"&5463!2�&4&&4� �� @ �^B��B^^B@B^f4&&4&�� �@ ��B^^B@B^^/$4&"2%4&#!"3!264+";%#!"&5463!2�/B//B� � ���0L4�4LL44L_B//B/�� �@ M �4LL44LL��� >& $$ ������(���r���^����a�a��������(���^����a�a����!C#!"&54>;2+";2#!"&54>;2+";2pP��PpQ��h@&&@j�8(�Pp�pP��PpQ��h@&&@j�8(�Pp@��PppP�h��Q&�&�j (8pP��PppP�h��Q&�&�j (8p��!C+"&=46;26=4&+"&5463!2+"&=46;26=4&+"&5463!2Q��h@&&@j�8(�PppP�Pp�Q��h@&&@j�8(�PppP�Pp��@h��Q&�&�j (8pP�PppP�@h��Q&�&�j (8pP�Ppp@�@� #+3;G$#"&5462"&462"&462#"&462"&462"&462"&462#"&54632K54LKj=KjKKj��KjKKj�L45KKjK�<^�^^��KjKKj��p�pp���\]��]\��jKL45K��jKKjKujKKjK��4LKjKK�^^�^��jKKjK��pp�p�r]��]\����� $$ ���^����a�aQ�^����a�a�����,#"&5465654.+"'&47623 #>bq��b�&4�4&�ɢ5����" #D7e�uU6�&4&��m����1X".4>2".4>24&#""'&#";2>#".'&547&5472632>3�=T==T=�=T==T=��v)�G�G�+v�@b��R�R��b@�=&����\N����j!>�3l�k����i�k3�hPTDDTPTDDTPTDDTPTDD|x��xX�K--K��|Mp<# )>dA{��RXtfOT# RNftWQ���,%4&#!"&=4&#!"3!26#!"&5463!2!28(�@(88(��(88(�(8��\�@\��\@\��\���(88(@(88(�@(88�@\��\�\��\ �u�'E4#!"3!2676%!54&#!"&=4&#!">#!"&5463!2!232�5��([��5@(\&��8(��(88(��(8,�9.��+�C��\��\@\� \��6Z]#+��#,k��(88(@(88(��;5E�>:��5E�\�\��\ �\�1. ���$4@"&'&676267>"&462"&462. > $$ n%��%/���02� KjKKjKKjKKjKf���ff�������^����a�a�y��y/PccP/�jKKjKKjKKjK���ff���ff�@�^����a�a�����$4@&'."'.7>2"&462"&462. > $$ n20���/%��7KjKKjKKjKKjKf���ff�������^����a�a3/PccP/y�� jKKjKKjKKjK���ff���ff�@�^����a�a�����+7#!"&463!2"&462"&462. > $$ �&��&&��&KjKKjKKjKKjKf���ff�������^����a�a�4&&4&�jKKjKKjKKjK���ff���ff�@�^����a�a���#+3C54&+54&+"#";;26=3264&"24&"2$#"'##"3!2@������@KjKKjKKjKKjK����ܒ���,����������gjKKjKKjKKjK�X�Ԁ�,�,��#/;GS_kw�����+"=4;27+"=4;2'+"=4;2#!"=43!2%+"=4;2'+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;54;2!#!"&5463!2�``����``��`��``�``�``�``�``�``�````�p`���K5��5KK5�5Kp``�``�``��``�``�``��``�``��``��``�````��`��������5KK5�5KK@���*V#"'.#"63232+"&5.5462#"/.#"#"'&547>32327676���R?d�^��7ac77,9x�m#@#KjK�# ڗXF@Fp:f��_ #W��Ip�p&3z� �h[ 17��q%q#:��:#5KKu�'t#!X: %�#+=&>7p@���*2Fr56565'5&'. #"32325#"'+"&5.5462#"/.#"#"'&547>32327676@��ͳ�����8 2.,#,f�k*1x���-!���#@#KjK�# ڗXF@Fp:f��_ #W��Ip�p&3z� �e�`��v�o�8�t-� �:5 ��[�*�#:��:#5KKu�'t#!X: %�#+=&>7p �3$ "/&47 &4?62#!"&=463!2I�. 2 ��w 2 � -�@�)�. 2 �� 2 �. �-@@-��S�$9%"'&4762 /.7> "/&47 &4?62i2 �. � 2 �w� E��> u> ��. 2 ��w 2 � �2 � � 2 �w�w !�� �h�. 2 �� 2 �. ���;#"'&476#"'&7'.'#"'&476�' �)'�s "+5+�@ա' �)'����F*4*E�r4�M:�}}8��GO �*4*������~� (-/' #"'%#"&7&67%632���B�;><���V�?�?V�� -����-C�4 <B�=�cB5���!%��%!�b 7I�))�9I7��� #"'.5!".67632y��( ��# ��##@,( �)���8! !++"&=!"&5#"&=46;546;2!76232-S��S����������S� ��S��S�`���`��� ������K$4&"24&"24&"27"&5467.546267>5.5462 8P88P88P88P�8P88P�4,�C��S,4p�p4,,4p�p4,6d7AL*',4p�pP88P8�P88P8HP88P8`4Y��&+(>EY4PppP4Y4Y4PppP4Y�%*<O4Y4Ppp��� %@\ht� "'&4762"&5462&#!"&463!2#"'&'7?654'7&#"&'&54?632#!"&463!2"&5462"'&4762�� ����@U�SxyS���R���#PT����('�#��TU�SxySN���@���� � 3��@��xS�SUO#���'(���V^�'(���PVvxS�SU��i��@�� `�<+"&=46;2+"&=467>54&#"#"/.7!2���<'G,')7��N;2]=A+#H � �0P��R��H6^;<T%-S�#:/*@Z} >h���.%#!"&=46;#"&=463!232#!"&=463!2�&�&&@@&&�&@&�&�&&&��&&�&�&�&&��&f�&&�&&b�#!"&=463!2#!"&'&63!2&�&&&'�'%@% �&&�&&�&&&&�k%J%#/&'#!53#5!36?!#!'&54>54&#"'6763235��� ����Ź���}���4NZN4;)3.i%Sin�1KXL7觧�* ��#��& *������@jC?.>!&1'\%Awc8^;:+<!P��%I%#/&'#!53#5!36?!#!'&54>54&#"'6763235��� ����Ź���}���4NZN4;)3.i%Pln�EcdJ觧�* ��#��& *������-@jC?.>!&1'\%AwcBiC:D'P%! #!"&'&6763!2�P������&:�&?�&:&?����5"K�,)""K,)���h#".#""#"&54>54&#"#"'./"'"5327654.54632326732>32�YO)I-D%n "h.=T#)#lQTv%.%P_� % %�_P%.%vUPl#)#T=@�/#,-91P+R[�Ql#)#|'�' 59%D-I)OY[R+P19-,##,-91P+R[YO)I-D%95%�_P%.%v���'3!2#!"&463!5&=462 =462 &546 ����&&��&&��&4&r&4&�������@����&4&&4&�G݀&&������&&f�������� ��sCK&=462 #"'32=462!2#!"&463!5&'"/&4762%4632e*&4&i����76`al�&4&���&&��&&}n� R � R �z����f�Oego�&&�5�����`3��&&����&4&&4&� D� R � R z����v���"!676"'.5463!2@�@w^�Cc�t~55~t�cC&�&@���?J���V��|RIIR|��V&&��#G!!%4&+";26%4&+";26%#!"&546;546;2!546;232�����@@@@�L4��4LL4�^B@B^�^B@B^�4L�� �� ��N�4LL44L`B^^B``B^^B`L����L4&"2%#"'%.5!#!"&54675#"#"'.7>7&5462!467%632&4&&4��@�o�&�&}c ;pG=( 8Ai8^�^.�&4&&4&`�� `f�s��&& j�o/;J!#2 KAE*,B^^B!` $� ��-4&"2#"/&7#"/&767%676$!2�8P88P��Qr�� @ U��� @� {`P�TP88P8�����P`�� � @U @�rQ���!6'&+!!!!2Ѥ��� 8�������̙�e�;<*��@8 !�G��G�GQII���� %764' 64/&"2 $$ �f��3f4�:�4����^����a�a�f4334f�:4�:�^����a�a����� %64'&" 2 $$ ���:4f3��f4F���^����a�a��4�f4���4f�^����a�a����� 764'&"27 2 $$ �f�:4�:f4334����^����a�a�f4��:4f3���^����a�a����� %64/&" &"2 $$ -�f4���4f�4����^����a�a��4f��3f4�:w�^����a�a���@��7!!/#35%!'!%j��/d�� �jg2�|�8�����������55���dc ��b���@��! !%!!7!���FG)��D�H:�&�H����d���S)��U4&"2#"/ $'#"'&5463!2#"&=46;5.546232+>7'&763!2�&4&&4f]w�q�4�qw] `dC���&&�:F�ԖF:�&&���Cd`�4&&4&���� ]����] `d[}�&�&�"uFj��jFu"�&�&�y}[d�#2#!"&546;4 +"&54&" (88(�@(88( r&@&�Ԗ8(��(88(@(8@����&&j��j�����'3"&462& . > $$ �Ԗ������>a��X��,��f���ff�������^����a�a�Ԗ�Ԗ�a>����T�X��,�,�~�ff���ff�@�^����a�a����/+"&=46;2+"&=46;2+"&=46;2�8(�(88(�(88(�(88(�(88(�(88(�(8 �(88(�(88(�(88(�(88(�(88(�(88��/+"&=46;2+"&=46;2+"&=46;2�8(�(88(�(88(�(88(�(88(�(88(�(8 �(88(�(88�(88(�(88�(88(�(88���5E$4&"2%&'&;26%&.$'&;276#!"&5463!2KjKKj� ��� �� � f��� �\� � �w�@w��w�w��jKKjK"�G � ܚ ��f � ��� �@w��w�w����� $64'&327/�a����^����� ��! ����^����a�a��J@%��% 6�5��/ 64'&"2 "/64&"'&476227<���ij��6��j6��u%k%~8p�8}%%�%k%}8p�8~%<���<�ij4j��4����t%%~8�p8~%k%�%%}8�p8}%k���54&#!"3!26#!"&5463!2&��&&�&�w�@w��w�w�@�&&�&&:�@w��w�w����/#!"&=463!24&#!"3!26#!"&5463!2���@�^B��B^^B@B^��w��w��w@w��@@�2@B^^B��B^^���w��w@w���+#!"'&?63!#"'&762�(��@� @�(@>@�%����%%��� ���!232"'&76;!"/&76 � �($��>��(���� ��J ���&%�����$%64/&"'&"2#!"&5463!2�ff4�-�4ff4f�w�@w��w�w��f4f�-�f4����@w��w�w�����/#5#5'&76 764/&"%#!"&5463!2��48`��� #�� ����\�P\��w�@w��w�w���4`8� �� #�@ ���`\P�\`�@w��w�w�����)4&#!"273276#!"&5463!2&� *���f4� '�w�@w��w�w�`�&')���4f�*�@w��w�w�����%5 64'&"3276'7>332#!"&5463!2�`��'(wa8! �,j.��(&�w�@w��w�w��`4`*�'?_`ze<�� bw4/�*��@w��w�w�����-. 6 $$ ���� �������(�r���^����a�a���O����(��������_�^����a�a����� -"'&763!24&#!"3!26#!"&5463!2y��B��(�(� �@ � �w�@w��w�w�]#�@�##� � �@ �@w��w�w����� -#!"'&7624&#!"3!26#!"&5463!2y(��(@B@u �@ � �w�@w��w�w��###��@��� �@ �@w��w�w����� -'&54764&#!"3!26#!"&5463!2@�@####���@��w�@w��w�w��B��(�(������@�@w��w�w����`%#"'#"&=46;&7#"&=46;632/.#"!2#!!2#!32>?6�# !"'�?_ BCbCa�f\ + ~�2� �� �}0�$ �� q 90r� � �pr%Dpu���?#!"&=46;#"&=46;54632'.#"!2#!!546;2��D a__���� g *`-Uh1 �������� �߫�} $^L�� ��� 4��b+"&=.'&?676032654.'.5467546;2'.#"�ǟ� B{PDg q�%%Q{%P46'-N/B).ĝ �9kC<Q 7>W*_x*%K./58`7E%_��� � ,-3� cVO2")#,)9;J)��� �"!*� #VD,'#/&>AX��>++"''&=46;267!"&=463!&+"&=463!2+32��Ԫ�$ � �� p���U�9ӑ @�/�*f�����o� VRfq �f=S��E!#"&5!"&=463!5!"&=46;&76;2>76;232#!!2#![� �� �� �� � �% )�� ��� ��" ��Jg Uh B�W&WX��� hU g�� �84&#!!2#!!2#!+"&=#"&=46;5#"&=46;463!2�j��@jo����� ������g�|�@��~�v����v� u�n#467!!3'##467!++"'#+"&'#"&=46;'#"&=46;&76;2!6;2!6;232+32Q�Kt#�� ��#F�N�Qo!��"�դ��ѧ����!�mY �Zga~bm]� [o�"�U+��������,����� @��h�� h@�@X ��h��h ��@�8���3H\#5"'#"&+73273&#&+5275363534."#22>4.#2>��ut 3NtR�P*�H�o2 Lo�@!�R(�Ozh=�,G<X2O:&D1A.1G$<2I+A;"B,;&$��L��GlF/�����3�D�����;a��$8$��".�!3! ��.�3!#!"&5463!���8( 8(��(88( ��h (8��(88(@(8�(8H!!#!"&5463!54&#!"3!2654&#!"3!2654&#!"3!26��(D 8(��(88( 8��@��@��@�$����(88(@(8��(8� @@@@@@"�} $BR3/&5##"'&76;46;232!56?5"#+#5!76;5!53'#3!533��H�� �� �����D��q �x7�� ���K/�/K��F��h�/"��� @`����Z s�Y��w�jj��jj��j"�} $4R%3/&5##"'&76;46;232!53'#3!533!56?5"#+#5!76;5��H�� �� ��������K/�/K��F����q �x7�� �h�/"��� @`����jj��jj��j�Z s�Y�� w"�)9IY%#"'&76;46;232#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2� �� ����� ��@������@���`�� @`�����������"�)9IY#!"&=463!2%#"'&76;46;232#!"&=463!2#!"&=463!2#!"&=463!2��� �� �������@��������@ ��r�� @`��r������"�� $CV%4&#"326#"'&76;46;232%#"'&'73267##"&54632!5346=#'73BX;4>ID2F�� �� ������8PuE>.'%&TeQ,j��m{��+�>R�{�?jJrL6V�� @`��7>wmR1q uW�ei��/rr� :V��r"�� $7V4&#"326#"'&76;46;232!5346=#'73#"'&'73267##"&54632BX;4>ID2F�� �� ������+�>R�{�8PuE>.'%&TeQ,j��m{��?jJrL6���� @`���rr� :V��r3>wmR1q uW�ei����@�\%4&#"326#!"&5463!2+".'&'.5467>767>7>7632!2&%%&�&��&& &�7.' :@�$LB�WM{#&$h1D! .I/! Nr�&&%%��&&�&&V?, L=8=9%pEL+%�%r@W!<%*',<2(<&L,"r�@\#"&546324&#!"3!26%#!#"'.'.'&'.'.546767>;&%%&�&��&& &i7qN�� !/I. !D1h$&#{MW�BL$�@: '.�&&%%���&&��&&�=XNr%(M&<(2<,'*%<!W@r%�%+LEp%9=8=L ��� +=\d����%54#"327354"%###5#5#"'&53327#"'#3632#"'&=4762#3274645"=424'.'&! 7>76#'#3%54'&#"32763##"'&5#327#!"&5463!2��BB��PJN�C'%! B?)#!CC $)�54f�"��@@ B+����,A A+�&�+A � ZK35N #J!1331�CCC $)��w�@w��w�w��2��"33�F�Y�F~��(-%"��o�4*)$�(*� (&;�;&&9LA38�33�4��S,;;,W��T+<<+T;(��\g7�x�:&&:�:&&<r����%-�@w��w�w���� +=[c}���#"'632#542%35!33!3##"'&5#327%54'&#"5#353276%5##"=354'&#"32767654"2 '.'&547>76 3#&'&'3#"'&=47632%#5#"'&53327�''RZZ�:k��id YYY.06� 62+YY-06 R[!.�'CD''EH$��VV�X:���:Y X;��:Y �fyd/%jG�&DC&&CD&O[52. [$�C-D..D�^^���* l�y1%=^�I86�i077S 3 $EWgO%33%O�O%35 ��EE�F�W�t;PP;p��t;PP;p�q��J�gT��F�Q%33&P�P%33%R� 7>%3���!+}��{�'+"&72'&76;2+"'66;2U �&� �� �(���P �*��'�e�J."�-d�Z��-n �-���'74'&+";27&+";276'56#!"&5463!2�~�}� �7��e � ���۩w�@w��w�w��"��� $Q#�'�!# ����@w��w�w�� �I-22#!&$/.'.'.'=&7>?>36����9II ! ' $ !�����01$$%A' $ ! ����g \7@�)(���7Y \7@�)(���7Y @���� '5557 ���,���VW�QV���.R���W��=���?��l��%l`��������~����0��!#!#%777 5! ������R!!�XC�C��fff�݀�#�� `��,��������{��{{�`��������Og4&"2 &6 $"&462$"&62>7>7>&46.'.'. '.'&7>76 �Ԗ�� ���HR6L66L�G�HyU2LL2UyH��HyU2LL2UyHn ��X�6X�� ��X�X�� Ԗ�Ԗ�����H�6L66L6�L2UyH��HyU2LL2UyH��HyU2L�n�6X�� ��X�X�� �����2#!"&54634&"2$4&"2�w��w�@w��w�|�||��|�||���w�@w��w�w����||�||�||�|��� !3 37! $$ �n6^�5�5^h ����^����a�a������M�1�^����a�a���P�� *Cg'.676.7>.'$7>&'.'&'? 7%&'.'.'>767$/u5'&$I7o�b?K�\[z�H,1���+.@\7<��?5\V ,$V��g.GR@ �7��U,+!����� # "8$}�{)�<�?L RR;kr,yE[��z# /1 "# #�eCI0/"5#`� ��"8���4~&p)4 2�{�H-.%W.L>���':Yi4&67&'&676'.'>7646&' '7>6'&'&7>7#!"&5463!2PR$++'TJX�j7-F��C',��,&C ."��!$28��h�/���"� +p��^&+3$ i��0(�w�@w��w�w��+.i6=Bn\C1XR:#"�'jj�8Q.cAj�57!?"0D��$4"P[ &2�@w��w�w��D��"%.5#5>7>;!!76�P�Yh�pN!�HrD0�M�� C0N��#>8\xx: �W]oW-�X���45���/%'#.5!5!#"37>#!"&5463!2p>,;$4 ��5eD�+W�cE���w�@w��w�w�K�()��F ,VhV��^9tjA0/�@w��w�w���@�#"'&76;46;23� �� �� ���&�� ��� ���++"&5#"&7632� ��� ^ c � �&� ��@�#!'&5476!2� &�� ���� ^ b ���'&=!"&=463!546� ��� �&� � �� ��� �� ��q&8#"'&#"#"5476323276326767q'T��1[VA=QQ3���qq�Hih"-bfGw^44O#A���?66%CKJ�A}}� !"�䒐""A$@C3^q|�z=KK?6�lk)���%!%!��V��V��u��u�u^-�m5�w��}�n�����~7M[264&"264&"2"&546+"&=##"&5'#"&5!467'&766276#"&54632� � ��*<;V<<O@-K<V<�<+*<J.@�k��c�lG H_�_H �<+*<<*+< �<*�R+<<+�*<�f.@�+<<+��+<<+�@.��7�uu�7� �**� ���R+<<+�+;; ��"%3I�#5472&6&67><&4'>&4.'.'.'.'.'&6&'.'.6767645.'#.'6&'&7676"&'&627>76'&7>'&'&'&'&766'.7>7676>76&6763>6&'&232.'.6'4."7674.'&#>7626'.'&#"'.'.'&676.67>7>5'&7>.'&'&'&7>7>767&'&67636'.'&67>7>.'.67� \ �� U7 J#!W!' "';% k )" ' /7* I ,6 *&"! O6* O $.(� *.' .x�, $CN�� � * � 6 7%&&_f& ",VL,G$3�@@$+ " V5 3" ""�#dA++ y0D-%&n4P'A5j$9E#"c7Y 6" & 8Z(;=I50' !!e �R �� "+0n?�t(-z.'<>R$A"24B@( ~ 9B9, *$ <> ?0D�9f?Ae � .(;1.D 4H&.Ct iY% * � 7�� �� J < W0%$ ""I! *D ,4A'�4J" .0f6D�4p�Z{+*�D_wqi;�W1G("%%T7F}AG!1#% JG3��� '.2>Vb%&#'32&'!>?>'&' &>"6&#">&'>26 $$ *b6�~�#��= ���XP2��{&%gx|�� .���W)o���O��LO�sEzG<�� CK}E $MFD<5+ z���^����a�a$�MW�M��1>]|�YY�^D �եA��<��K�m����E6<�"�@9I5*�^����a�a�����>^4./.543232654.#"#".#"32>#"'#"$&547&54632632�':XM1h*�+D($,/9p�`D�oC&JV<�Z PA3Q1*223�I�oBkែhMI����oPែhMI��oP�2S6,M!"@-7Y.?oI=[<%$('3 -- <-\�%Fu���Po��IMh���Po����IMh,���#?D76&#!"7>;267676&#!"&=463!267 #!"'&5463!26�%�8#!� ��&&Z"�M>2!�� �^I7LRx_@�>MN�""��`�=&&*%�I�}��, � L�7_jj��9����/%4&#!"3!264&#!"3!26#!"&5463!2�� ��� ��&��&&�&��������&&�&&��19#"'#++"&5#"&5475##"&54763!2"&4628(3�-� &�B.�.B�& �-�3(8Ig�gI�`������(8+U��e&��.BB.&����+8(�kk��`�������%-"&5#"&5#"&5#"&5463!2"&4628P8@B\B@B\B@8P8pP�Pp�����@�`(88(`�p.BB.�0.BB.���(88(�Pppͺ�������!%>&'&#"'.$ $$ ^/(V=$<;$=V).X���^����a�a��J`"(("`J��^����a�a��,���I4."2>%'%"/'&5%&'&?'&767%476762%6�[���՛[[���՛o�� �ܴ ��� �� �� $ $� " �$ $ �� �՛[[���՛[[�5`�� ^� �^ 2`�� `2 ^��^ ��` �����1%#"$54732$%#"$&546$763276�68��ʴh�f�킐&^�����zs��,!V[���vn)� �6���<��ׂ�f{���z����}))N�s���3(@����+4&#!"3!2#!"&5463!2#!"&5463!2@&�&&f&��&&�&@&�&&&�4&&4&�@&&�&&��&&&& ��`�BH+"/##"./#"'.?&5#"&46;'&462!76232!46 `&�C�6�@Bb0�3eI;��:�&&�&4�L�4&���F��� �Z4&�w�4�) ���'' �5�r�&4&&�4&��&4��������}G�#&/.#./.'&4?63%27>'./&'&7676>767>?>%6}�)(."�2*&�@P9A #sG�q] #lh�<*46+( < 5�R5"*>%</ '2�@� 53*9*,�Z&VE/#E+)AC (��� 2k<X1$:hI(B " !:4Y&>"/ +[>hy ���K !/Ui%6&'&676&'&6'.7>%.$76$% $.5476$6?62'.76&&'&676%.76&'..676�#"NDQt �-�okQ//�jo_ ������ ���%&J�������Ղ���YJA-��.-- 9\DtT+X?*<UW3' 26$>>�W0{�"F!"E � ^f`$"�_]\�<`�F�`�F�D��h>Cw�ls���J@�;=?s :i_^{8+?` ) O`�s2R�DE58/K��r #"'>7&4$&5m��ī��"#���̵�$5���$�"^^W����=���ac��E�*���c������zk./"&4636$7.'>67.'>65.67>&/>z X^hc^O<q����+f$H^XbVS!rȇr?5GD_RV@-FbV=3!G84&3Im<$/6X_�D'=NUTL;2KPwt��Pt= �&ռ ,J~S/#NL,��8JsF);??1zIEJpq�DIPZXSF6\?5:NR=��;.&1��+!"&=!!%!5463!2�sQ9����Qs�*�*�*sQNQsBUw�� wUBF��H���CCTww���%1#"&=!"&=463!54632. 6 $$ � �� �� `?��������(�r���^����a�a� �� � � � ���(��������_�^����a�a�����%1#!#"'&47632!2. 6 $$ � ���� @ ` ��������(�r���^����a�a� � ? @ ���(��������_�^����a�a�����/#"'&476324&#!"3!26#!"&5463!2&�@�& �@ � �w�@w��w�w����&@B@&��� �@ �@w��w�w�����"&462 >& $$ �Ԗ��*�����(���r���^����a�a�Ԗ�Ԗ �������(���^����a�a���]�6#"$54732>%#"'!"&'&7>32'!!!2�f:�л����Ѫz��~�u:� (�(%`V6B^hD%��i�(�]̳ޛ ��*>�6߅�����r�#�!3?^BEa�߀�#�9���#36'&632#"'&'&63232#!"&5463!2 ��Q,&U�#+' �;il4L92<D`����w�@w��w�w�����`9ܩ6ɽ]`C4�7�7�&�@w��w�w����D+"&5#"'&=4?5#"'&=4?546;2%6%66546;2������� �� ��w�ww�w�������cB �G]B �G��t�y]t�y� ���#3C#!+"&5!"&=463!46;2!24&#!"3!26#!"&5463!2���@��`@`�^B��B^^B@B^��w��w��w@w��@��`@`���2@B^^B��B^^���w��w@w�����'/?P+5#"&547.467&546;532!764'!"+32#323!&ln��@ :MM: @��nY*�Yz--zY�*55QDD�U���9p��Y-`]��]`.X /2I$� t�@@/!!/@@3,$,3�$p$0�0��&*0��&���&�� !P@���RV2#"&/#"&/#"&546?#"&546?'&54632%'&54632763276%�>S]�8T;/M7��7T</L7�=Q7,�i�<R7,�5T</L666U;/M5�<U<,�i���6i���Q=a!;�;V6-�j�;V6-�5 P=/L596Q</L5�<U6-�i�;V7,�7O;-I6��8��i;k���)I2#!"&5463#9"'.'.'3!264&#!"2>7%>�w��w�@w��w�!"�5bBBb/�/* 8(@(87)��(8=%/�'#?��w�@w��w�w����#~$EE y &�L(88e):8(%O r �O�?GQaq47&67>&&'&67>&"$32#"#"'654 $&6 $6&$ Co��L��.*�KPx���.*� iSƓi 7J?��~�pi{_Я�;��lL�������UZ=刈�����刈�����_t'<Z �:! ���@! ��j`Q7$k�y, R����f��k*4�������LlL��=Z=刈��������&$&546$7%7&'5>�����]���5��%��w�����������&��P�?�zrSF�!|��&0 ##!"&5#5!3!3!3!32!546;2!5463���)� )����;)��);;)��)���&&������&@@&�&��&�� � 6 $&727"'%+"'&7&54767%&4762������֬>4P���t+8?:: � ::AW��``���EvEEvE<�.���"�e$IE&�O�&EI&�{h.`��m���"&#"&'327>73271[ >+)@ (���]:2,C?��*%�Zx/658:@#N �C�=�E�(�o��E=��W'c:������#!#"$&6$3 &#"32>7!����ڝ���yy��,��{��ۀ�ہW�^F!�L�C=���y�:�y��w���߂0H\R%�"N^ '&76232762$"&5462"&46274&"&'264&#"'&&#"32$54'>$ $&6$ G>��>0yx1��4J55J�5J44J5�Fd$��?�4J55%6�E��#42F%��$f�������LlL�q>>11�J44%&4Z%44J54R1F$Z-%45J521��Z%F1#:��ʎ 9�������LlL�����#Qa"'&7622762%"&5462"&546274&#"&'73264&#"'&&#"32654'>#!"&5463!2� 5�5 *�*��.>.-@-R.>.-@-�<+*q�6�- -- 0�<�o,+< ��3�w�@w��w�w�� 55 **�.. -- .. --G*<N�' ,-@-+*��M <*2 z��z 1�@w��w�w�����0<754&""&=#326546325##"&='26 $$ bZt�t&�sRQs��Z<t�sQ���^����a�a�>OpoO��xzRrqP6�z~{{Prr��^����a�a�����]054&"#"&5!2654632!#"&57265&<T<����H<T<������H������<T<8v*<<*������ ��+;;+l���:�������=:��*;;*��� %!!"!!26#!"&5463!2��@� ]���]�@�w�@w��w�w�����]� �@��@w��w�w��� %)3!!#335!!5!5!%#!!5!5!%#H��H{����R��H��H{���G��G{�)���q���G����R�R�q���R�R�q����� #0@#"'632#"'632&#"7532&#"#7532#!"&5463!2L5+*5��L5+*5~�}7W|�3B}��}JC��7=}�w�@w��w�w�D�ZQ�[�1�N:_��)�i�$��)���@w��w�w�� )� �����������6.#&#"'&547>'&#".'&'#"&5467%&4>7>3263232654.547'654'63277.'.*#">7?67>?>32#"'7'>3'>3235?�K�cgA+![<E0y�$,<'.cI ,#� '!;7$�=ep��� ��/�/7/ D+R>,7* 2(-#= /~[(D?G �|,)"#+)O��8,+�'�6 y{=@��0mI�#938OA�E` -� )y_/FwaH8j7=7?%����a %%!?)L J 9=5]~�pj %(��1$",I $@((� +!.S -L__$'-9L 5V��+ 6�T+6.8-$�0��+ t�|S1��6]�&#"'&#"67>76'&'&#"67>32764.#"#.32>67>7 $&54>7>7>7�rJ�@"kb2)W+,5/1 # Z -!��$IOXp7s�LCF9�vz NAG#/ 5|����Հ';RKR/J#=$,�9,�+$UCS7'2"1 !�/ , /--ST(::(�ep4AM@=I>".)xΤ��ls��Y�|qK@ %(YQ�&N EHv~����<Zx'#"&5467&6?2?'&"/.7.546326#"&'&/7264/7'764&"'?>>32.��A�UpIUxYE.A�%%%h%����%hJ%�����D,FZxULsT�gxUJrV�D�%hJ%�����@/LefL.C�%Jh%�����C�VsNUxϠ�@.FZyUHpV�A�%h&%%���%Ji%�����C�WpIUybJ/��Uy^G,D�%Jh%�����@�UsMtU�C�%hJ%�����C-Kfy�EX[_gj��&/&'.''67>7>7&'&'&'>76763>7>#&'&'767672'%'7'+"&'&546323267>7%#"'4'6767672,32�,+DCCQL�Df' %:/d B 4@} �&!0$�?�����J�f�d�f-�.=���6(��:!TO�? !I�G_�U% ����. k*.=;� 5gN_X�� " ## 292Q41� ��*����6���nA;�|� �BSN. %1$���� 6 $��nk�^�'7GWgw�����2+"&5463#!"&5463!254&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26#"&=! B^^B�B^^B�:F�j��B^8(�(`�(� ������������������`�(8���^B��B^^B@B^�"vE�j�^B(8(�`(�����������������������8(����/?O_o��������/?2#!"&5463;26=4&+";26=4&+";26=4&+";26=4&+"54&+";2654&+";2654&+";2654&+";2654&+";2654&#!"3!2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26@&&�&&�@@@@@@@@�@@@@@@@@@@��@@@@@@@@@@@@@@@@@@@&��&&�&��@@��@@��@@��@@��@@@@@@@@@@���@@@@@@@@�@@@@@@@@@@@��`' "&5#"&5&4762!762$"&462���B\B@B\B��O�p�P����������.BB.���.BB.8$P��O広�������3CQ#".54>32#".546322#"&#"#"54>%".54>32%2#"&54>&X=L|<&X=M{<��TML�FTML�F�v�"?B+D�?B�J�p��H=X&<{M=X&<|dMTF�LMTF�(<kNs�I<kNs���Pvo�JPwo�/��s.=ZY�VӮv�Nk<J�sNk<I�shwPJ�ovPJ�o@��+"&7.54>2�r_-$�$-_rU���U��%��&&5%ő������'- "'.546762����@��F�F�$�@B�@$.&�,�&.]]|�q����#<���<#(B�B��B%'-%'-'%'-"'%&'"'%.5467%467%62����@��l�l����@��l�l,���@��G�G�&!�@@�@�@@�@!&+#�+#�6�#+�$*`�:�p������:�p���x� �p����=�`$>����>$�&@��&@� �@&�p�@�� &.A!!"!&2673!"5432!%!254#!5!2654#!%!2#!8���Zp��?v�d���Ί�e�ns�6(���N[�����RW�u?�rt1Sr�F���|��iZ��@7�����މoy2���IM��C~[�R �yK{T:���%,AGK2#!"&5463!!2654'654.#532#532"&5!654&#"327#2#>!!�w��w�@w��w��~u��k'JTM��wa��| DH��������>�I1q�Fj?����w�@w��w�w�����sq�*4p9O*�¸Z^���qh LE �������"(nz8B M���'?"&4624&#"'.'324&#"3267##"&/632632.�ʏ����hhMA�LR vGhг~��~������Ky���O^ ��ʏ�ʏ��В*�LM@!<I�~��~����������t\��0�������CM4&"2#"&'676&/632#!"&=3267%2654&#"&#"%463!2"&4632�r�qq��tR8^4.<x3=RR��w�@w���_h� Y��Ӗ��� K>�שw�w���ȍ�de�)�qrOPq�Ȧs:03=<x!m�@w��w�E\x�g�ӕ��є��%w�w����d��Ȏ��V�� -<K\%.'.>7'.?67'67%'>&%'7%7./6D�\$> "N,��?a0�#O���1G�����9�'/���P(1#00�� ($=!F"�9|��]�"RE<�6'o��9%8J$\:��\H�iTe<?}V��#�oj��?���d,6���%N#" Hl��S��VY�]C =�@�C4&"2!.#!"4&"2+"&=!"&=#"&546;>3!232�^�^^���Y � ^�^^��`p�p�p�p`�]i�bb�i]�~�^^�^�e��^^�^���PppP��PppP��]��^^�]��3;EM2+"&=!"&=#"&546;>;5463!232264&"!.#!"264&" ]�`p�p�p�p`�]i�b���b�i���^^�^d�Y � !�^^�^��]��@PppP@@PppP@�]��^��^�]� ^�^^��e��^�^^� ��3$#!#!"&5467!"&47#"&47#"&4762++�&�2 $��$ �2&��&��&�4�&��&��Z4&�&##&�&4�&4�&4���4&�m4&�m���+DP4'&#"32763232674'&!"32763 3264'&$#"32763232> $$ g����* �o�`#�ə�0#z��#l(~���̠)���-g+����^����a�aF s" +g�(�* 3#!| #/IK/%*%D=)[�^����a�a���� !!!'!!77!���,���/���,�-���a��/G�� t%/;<HTbcq������%7.#"32%74'&"32765"/7627#"5'7432#"/7632#"5'7432#"&5'74632 #"/6327#"/6327#"/46329"&/462"&/>21"&/567632#!.547632632 * ��X � ^ ` ��� ^b ��c� f�u�� U`�59u��� ��� 4�J��� l�~ ~� F�� �� �2����� � � �� �m����|O�,��� ���� ��� �������� ru| ��u� � "����� )9 $7 $&= $7 $&= $7 $&= $&=46��w���`���w���w���`���w���w���`���w��b����`����VT�EvEEvE�T��VT�EvEEvE�T*VT�EvEEvE�T*EvE�EvEEvE�Ev�#^ct�#!"&5463!2!&'&!"&5!632#"&'#"/&'&7>766767.76;267674767&5&5&'67.'&'ೊ�(8(��(88(�(`�x ��c�`(8��!3;:�A0�?ݫ�Y ^U 47D$ 7�4U3I� |��L38wtL0�`(��(88(@(8(D��9�8(��Q1&(!;�� (g- Up�~R�2(/{E���(Xz*Z%(�i6CmVo8�#T#!"&5463!2!&'&!"&5!3367653335!3#4.5.'##'&'35�(8(��(88(�(`�x ��c�`(8�iF������F��Zc�r�cZ�`(��(88(@(8(D��9�8(���k�k�" ��kk�J !�� �k�#S#!"&5463!2!&'&!"&5!%!5#7>;#!5#35!3#&'&/35!3�(8(��(88(�(`�x ��c�`(8�-Kg kL#D��C��JgjL��D���`(��(88(@(8(D��9�8(���jj� �jjkk��kk����#8C#!"&5463!2!&'&!"&5!%!5#5327>54&'&#!3#32�(8(��(88(�(`�x ��c�`(8� G]�L*COJ?0R��\wx48>�`(��(88(@(8(D��9�8(���jj��RQxk��!RY�#*2#!"&5463!2!&'&!"&5!!57"&462�(8(��(88(�(`�x ��c�`(8�������P�pp�p�`(��(88(@(8(D��9�8(����������p�pp� �#*7JR5#5#5#5##!"&5463!2!&'&!"&5##5!"&54765332264&"�����<(8(��(88(�(`�x ��c�`(8����k�ޑc�O"�jKKjK�������������`(��(88(@(8(D��9�8(������SmmS?M���&4&&4�#9L^#!"&5463!2!&'&!"&5!#"/#"&=46;76276'.'2764'.�(8(��(88(�(`�x ��c�`(8���������6dd�WW6&44�`(��(88(@(8(D��9�8(��.�� ����G���5{��{5�]�]$59�95�#3C#!"&5463!2!&'&!"&5!2#!"&5463#"'5632�(8(��(88(�(`�x ��c�`(8��4LL4��4LL4l �� �`(��(88(@(8(D��9�8(���L4��4LL4�4L�� Z �#7K[#!"&5463!2!&'&!"&5!>&'&7!/.?'&6?6.7>'�(8(��(88(�(`�x ��c�`(8�`3��3��3��3�v � ? � �`(��(88(@(8(D��9�8(���&��&-��&��&� ? �� '���6#'. '!67&54632".'654&#"32�eaAɢ/PRAids`WXyzO�v��д��:C;A:25@Ң>�����-05r��n������`��H(�����' gQWZc[��� -%7' %'-'% %"'&54762�[������3[��M���N����� ��3"��,��""3,3"o�ng�$������߆���]�g�n��$����+��)�� ")")" ��x#W#"&#!+.5467&546326$32327.'#"&5463232654&#"632#".#"o���G��n\�u_MK'����̨|�g?CM7MM5,QAAIQqAy��{�b]BL4PJ9+OABIRo?z��.�z�� �n�6'+s�:�������z�cIAC65D*DRRD*�wy�al@B39E*DRRD*��'/7 $&6$ 6277&47' 7'"' 6& 6'�lL������������R�R����ZB|��R�R��>����d�ZZ��������LlL�Z����R�R«����Z��&�>���«|��R� � ��! $&54$7 >54'5��������P���f���f����P�����牉�@��s��-����ff���`-����c6721>?>././76&/7>?>?>./&31#"$&��(@8!IH2hM>' )-* h'N'��!'Og,R"/!YQG<I *1) (-O1D+0�n�������z�3fw���G2'3�rd1!sF0o ��.q"!%GsH8��@-!5|w|pgS= "B2PJfh�G���d�R �(P]ly��&$'77&7567'676'"'7&'&'7&47'6767'627''6$'67'654'7&'7'&'&'7&'5&$ $6 $&6$ j��j:,A��A��S9bb9R#:j���8AܔA,z��C�9Z04\40Z9�C��!B�;X0,l,0X;�B�*A8ܔA	j`b9S$#R99#&A��8A�` ������䇇�<Z<䳎������LlL�fBϬ"129�,V<4!���!88dpm��"��BV,�92[P*V*P\M�C� �C�M\P*V*P]L�D� �D�L&BV*�8*8!����f�!4<gmpd88!&!8*8�*VB�Z<䇇�����䇇��������LlL�����9Eis�%#"5432#"543275#&#"3254&'.547>54'63&547#5#"=3235#47##6323#324&"26%#!"&5463!2F]kbf$JMM$&�N92<Vv;,&)q(DL+�`N11MZ %G���&54 # i�<$8&@��0H12F1d�w�@w��w�w��B?@�UTZ3%}rV2hD5%f-C#�C@,nO �a7�.0�x2 yR�uR/u�%6;&�$76%$56S�@w��w�w��D��<Hlw%4#"324&#"32!".5475&5475.546322#654'3%#".535"&#"5354'33"&+32#"&54632S����;<;||w $+�|('-GVVG-��EznA�C?H_��`Rb���]Gg>Z2&`��9UW=��N9:PO;:dhe\=R���� +)�&')-S9��9kJ�<)Um�Q��/��-Ya^"![��Y��'(<`X;_�L6#)|����tWW:;X��� #'#3#!"&5463!2) p�*�xeשw�@w��w�w���0,\8�����@w��w�w��9��I#"'#"&'&>767&5462#"'.7>32>4."&'&54>32JrO<3>5�-&FD(=Gq���@C$39a��LL��²�L4 &) @]��v� �q#CO���!~<ZK#*Pq.���% L��²�LL��arh({�w\���i&5467&6747632#".'&##".'&'.'#".5467>72765'./"#"&'&5 �}����1R<2"7MW'$ ;IS7@�5sQ@@)�R#DvTA; 0x I)�!:>�+<B76:NFcP:SC4r�l+r �E%.*a-(6%('�>)C 6.�>� !-I[4&#"324&#"3264&#"324&#"326&#"#".'7$4$32'#"$&6$32D2)+BB+)3(--(3�1)+BB+)�4'--'4��'���#!0>R �H���MŰ9�o�u7ǖD��䣣��� R23('3�_,--,�R23('3�_,--,�����NJ ������?u�W�m%������#"'%#"'.5 %&'&7632�!� �;� `��u%"��(����!]#�c�)(� ��� #"'%#"'.5%&'&76 �!� ��� �(%#�#���fP_�"�(���!�)'��+�ʼn�����4I#"$'&6?6332>4.#"#!"&54766$32#!"&=46;46;2z�䜬��m� I�wh��QQ��hb�F�*�@&('�k�������@����z�� � _hQ��н�QGB�'(&�*�eozΘ�@@`��� >. $$ ����ff���ff�����^����a�af���ff�����^����a�a��>�����"&#"#"&54>7654'&#!"#"&#"#"&54>765'46.'."&54632326323!27654'.5463232632�,�-,�,",:! %�]& %@2(/�.+�*)6! <.$.�.*�*"+8# � #Q3,�,+�+#-:#"</$�) w� ��� ,* x9-.2"' ,, ���@�&,, ��Qw ,����,#"+"&5#+"&5&'&'&547676)2�%2$l$�#l#�b~B@XXyo2�$CI@5��$$�>$$�/:yu��xv)%$ ��/?CG%!5%2#!"&5463!5#5!52#!"&54632#!"&5463#5!5`���&&�&&������ �&&�&&�&&�&&@������&�&&&���������&�&&&�&�&&&��������%2 &547%#"&632%&546 #"'6���������\~����~\h� ���~\��h\�������V� �V�������V��V���%5$4&#"'64'73264&"&#"3272#!"&5463!2}XT=��=TX}}�~�>SX}}XS>�~�}�w�@w��w�w���~:xx:~�}}Xx9}�}9xX}�@w��w�w���/>LXds.327>76 $&6$32762#"/&4762"/&47626+"&46;2'"&=462#"'&4?62E0l�, *"�T�.�D@Yo������oo����@5D� [ Z �Z [ ``��[ Z �2 ,�l0 (T�"�.�D5@������oo��oY@D, Z [ � [ Z ��``EZ [ �5%! $&66='&'%77'727'%am��lL�������m�f�?���5���5>�f�F�tu�ut�F������������LlL�H�Y�C�L|��|L����Y�˄(��E''E*(�/?IYiy����%+"&=46;2+"&=46;2+"&=46;2+"&=46;2%"&=!#+"&=46;2+"&=46;2+"&=46;2+"&=46;2!54!54>$ +"&=46;2#!"&=������@�������&&������@��������������3P�� >��P3��&��&��r���r��r���&��&���r���r��r��� he 4LKM:%%:MKL4�W��T�&&��%/9##!"&563!!#!"&5"&5!2!5463!2!5463!2�&&�&��&�&&���� ��� ��&��&&i�@����&&@&7�����'#5&?6262�%%�o����;����j|/����&jJ%�p��&j;&i&�p���/|���j�ţ���%Jk%�o��%�� :g"&5462#"&546324&#!"263662>7'&75.''&'&&'&6463!276i���~ZYYZ~�@O��S;+[G[3YUD#o?D&G3I=J�y�TkBuhNV!WOhuAiS�y*'^C�C^'*SwwSTvvTSwwSTvv���WID\�_"[�g��q# /3qF��r2/ $r�g�%4 �HffH�J4d���#!#7!!7!#5!������VF��N����rmN�N��N����������N���!Y���+?Ne%&'&'&7>727>'#&'&'&>2'&'&676'&76$7&'&767>76'6�# <�;1�1x��#*# �G,T9�3%�/#0v�N�Z;:8��)M:( &���C.J}2 %0���� ^* J�F &�7'X"2L�DM" +��6� M2+'BQfXV#+] #���' L/(e�B�9 �#,8!!!5!!5!5!5!5#26%!!26#!"&5!5���������������&4&���&�pP��Pp������������������@��@&&@��!&�@PppP@�* �� 9Q$"&54627"."#"&547>2"'.#"#"&5476$ "'&$ #"&5476$ (�}R}hL�K� N���N ����U�d:� �x�x� �����8��� �� � � ,, |2222� MXXM �ic,>>,� ���� � ���� � ��̺ � ��'/7?KSck{4&"2$4&"24&"24&"24&"24&"24&"24&"24&"264&"24&#!"3!264&"2#!"&5463!2�KjKKj�KjKKj��KjKKjKKjKKj��KjKKj��KjKKjKKjKKj��KjKKjKLhLLhL��KjKKj�&�&&&KjKKj�L4��4LL4�4L5jKKjKKjKKjK�jKKjK��jKKjK�jKKjK�jKKjK��jKKjK�jKKjK���4LL4��4LL�jKKjK�&&�&&��jKKjK�4LL44LL ��'E!#"+"&7>76;7676767>'#'"#!"&7>3!2�W�",&7'� #$ &��g�pf5O�.P�q�ZZdS���-V"0kqzTx�D!��!8�p�8%'i_�F?;�k��R(`�� !�&)�'� (2!&6367! &63!2�! `�B��1LO�(���+#�=)�heC��Qg#s`���f�4#����6�������q�'���X�|0-�g�� �>IY#6?>7&#!%'.'33#&#"#"/3674'.54636%#"3733#!"&5463!2��4��:@��7�vH��%�h��EP{��0&<'VFJo���1,1.F6��A��#���L4�4LL44L"%� 7x'6 O\�JYFw���~�v^fH$ !�"xdjD"!�6��`J�4LL44LL�� �+3@GXcgqz�����-<JX{�&#"327&76'32>54.#"35#3;5#'#3537+5;3'23764/"+353$4632#"$2#462#"6462""'"&5&5474761256321##%354&'"&#"5#35432354323=#&#"32?4/&54327&#"#"'326'#"=35#5##3327"327'#"'354&3"5#354327&327''"&46327&#"3=#&#"32?"5#354327&3=#&"32?"#3274?67654'&'4/"&#!"&5463!2_��g��QQ��h���^_�~\[[\]�_^���h��QQ��g�e��<F�$�$$��� !!�&&�/!/ !!� 00/e&'!"e$� '!!�''� 8''NgL4�4LL44L�UQ��gh��QUk=<Sc���cc,-{k���jUQ��hg��Q�� �9 ,&W &$U�K$$KK$$KDC(>(" ! =))=2�( '! '�L#(>( &�DC(>(z�L#�DzG)<)�4LL44LL�� � BWbjq}��+532%+5324&+32763#4&'.546327&#"#"'3265#"&546325&#"32!264&"2%#'#735#535#535#3'654&+353#!"&5463!29$<=$�@?�SdO__J-<AA@)7")9,<$.%0*,G3@%)1??.+&((JgfJ*�A�������!&��j�jj��GZYG�иwssw��PiL>8aA !M7�7MM7�7M�3!� 4erJ]��&3YM�(, ,%7(#) ,(@=)M%A20C&Me�e��(X���0&Ėjj�jV�� 8Z8J9���N/4���$�8NN8�8NN�� �#&:O[��� $?b3'7'#3#%54+32%4+324+323'%#5#'#'##337"&##'!!732%#3#3##!"&53733537!572!56373353#'#'#"5#&#!'#'#463!2#"5#"5!&+&+'!!7353273532!2732%#54&+#32#46.+#2#3#3##+53254&".546;#"67+53254&.546;#"#'#'##"54;"&;7335wY-AJF���=c�(TS)!*RQ+��*RQ+�Y,�B^9^��Ft`njUM�') ~PS�PR�m���٘���M7�7Mo7�q @)U 8�"����E(�1��++��NM7�7Mx3�7��8�D�62��W74�;�9�<�-A"EA�0:��AF@�1:�ؗ����B�f~~""12"4(�w$#11#�@}}!%+%5(�v$:O�\z��K��?*$\amcrVl��OO176Nn�<!E(=�<&l/������<<������ [ZZYY�89176���7OO7�==..//cV==::z,,,,aa,,��7OO7�Z::��;;Y fcW�( "6-!c�( !5 # b�t88176����tV: &$'*9 %e#: %'*9B����<<��; &(����� �#:Sn�����#"&54632%#76;2#"&54632%4&+";2?>23266&+"&#"3267;24&+"'&+";27%4&+";2?>23266&+"&#"3267;254+";27#76;2#!"&5463!2�3%#2%%,, _3$$2%%��M>�ALVb5)LDHeE:< E�Mj,K'-R M�~M>�ARVb5)LEHeE:< E� JAB�I*'!($rL4�4LL44Lv%1 %3!x*k�$2 %3!�;5�h n a� !(lI;F �� r�p p8;5�h t a� !(lI;F��` #k�4LL44LL �� � 2HW[lt��#"'5632#6324&'.54327&#"#"&'32767#533275#"=5&#"'#36323#4'&#"'#7532764&"24'&#"327'#"'&'36#!"&5463!2=!9�n23��BD$ &:BCRM.0AC'0RH`Q03'`�.>,&I / *� / ��8/��n-(G@5��$ S3=�,.B..B�02^`o?7je;9G+��L4�4LL44LyE%# �Vb�;A !p &'F:Aq)%)#o�rg�T$v2�� 8�)2����z948/�{�8A�B..B/��q?@�r�<7(g/��4LL44LL��?#!"&'24#"&54"&/&6?&5>547&54626=�L4�@�ԕ;U g3 �� T �2RX='�8P8|�5� ����4Lj��j� U;Ig@ �� ` � "*\���(88(�]k ��&N4#"&54"3 .#"#!"&'7!&7&/&6?&5>547&54626;U gI��m*��]�Z0�L4�@�ԕ���=o=CT �� T �2RX='�8P8|�5� � U;Ig��Xu?bl3���@4Lj��j��a���` �� ` � "*\���(88(�]k����/7[%4&+";26%4&+";26%4&+";26!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@���0 �� o`^B��B^`5FN(@(NF5���@��@��@�u �@�LSyuS�@�%44%����,<H#"5432+"=4&#"326=46;2 >. $$ ~Isy9���"SgR8v�H����D� w ����ff���ff�����^����a�a�m2N+�� )H-mF+1����0*F +f���ff�����^����a�a�����b4&#"32>"#"'&'#"&54632?>;23>5!"3276#"$&6$3 �k^?zb=ka`�U4J{�K_/4�^����W�& vx :XB0���܂�ff���) f������zz��X��lz=l�apz��o�b35!2BX��� �G@8��' '=vN$\f���f� 1 SZz�8�z�X�#("/+'547'&4?6276 'D�^�h � i��%5�@�%[i � h�]��@������]�h � i��%�@�5%[i � h�^�@@������)2#"&5476#".5327>OFi-���ay~�\~;��'�S���{�s:D8>)AJfh]F?X��{[��TC6��LlG��]��v2'"%B];$�-o��%!2>7>3232>7>322>7>32".'.#"#"&'.#"#"&'.#"#546;!!!!!32#"&54>52#"&54>52#"&54>52�-P&+#($P.-P$'#+&PZP&+#"+&P-($P-.P$(#+$P.-P$'#+&P-.P$+#pP@@Pp�H85K"&ZH85K"&ZH85K"&Z����@��Pp��@��@��@pMSK5, :&�LMSK5, :&�LMSK5, :&����!!3 ! �����@�����@@����� #"$$3!!2"j������aѻxl���a����lx�a�a����j������!!3/"/'62'&63!2��'y�� �`�I ��y�����My�� �`�I ��y'W`#".'.#"32767!"&54>3232654.'&546#&'5&#" 4$%Eӕ;iNL291 ;XxR`�f՝�Q8T������W��iW�gW:;*:`�Qs&?RWXJ8�oNU0�J1F@#) [�%6_PO�QiX(o�`��_?5�"$���iʗ\&>bd�s�6�aP*< -;iFn�*-c1B���Wg4'.'4.54632#7&'.#"#"'.#"32767'#"&54632326#!"&5463!2��#$( 1$6]' !E3P|ad(2S;aF9'EO�Se�j]�m�]<*rYs��hpt.#)$78L*k�h�w�@w��w�w��B % $/$G6 sP`X):F�/�fwH1p�dl�qnmPH�ui�kw_:[9D'��@w��w�w��34."2>$4.#!!2>#!".>3!2�Q��н�QQ��н�QQ��h�~w��w�h���f����ff����н�QQ��н�QQ��н�QZ����ZQ�����ff���ff�#>3!2#!".2>4."f����ff�����н�QQ��н�QQ���ff���ff��Q��н�QQ��н� ,\!"&?&#"326'3&'!&#"#"' 5467'+#"327#"&463!!'#"&463!2632���(#�AH����s���9q � ci��<=� #�]�<������OFA��!�������re��&&��U�&&![e��F �������U?���g�����4_���������a�?b�+��r7�&4&��&4&�p,�+K4&"2$4&"2.#!"3!264&#!"3!2#"&=!"&=#47>$ �KjKKjKKjKKjH#�j#H&&&������KjK�KjK�g �V� ijKKjKKjKKjK���..n((�[���5KK5��5KK5�[po�Nv<<vN�:f���.R#!"&463!24'!"&5463!&$#"!2#!32>+#"'#"&546;&546$3232�2$�B$22$�$�*$22$�X�ڭ��ӯ�$22$�tX'���hs2$���ϧ��kc�$22$���1���c�$2�F33F3VVT2#$2����ԱVT2#$2��g���#2UU���݃ �2$#2UU�1݃���2��,u�54#"67.632&#"32654'.#"32764.'&$#"7232&'##"&54732654&#"467&5463254632>32#"'&�ru�&9��%"*#�͟ <yK0Og�" &9B3�;��㛘8��s%+DWXRD= @Y%� !Q6R�!4M8�+6rU^z=)�RN��.)C>O%GR�=O&^���op������C8�pP*�b�Y _�#��$��N Pb@6��)?����+0L15"4$.�Es �5I�Q"!@h"�Y7e|J>z�iPe��n�eHbIl�F>^]@����n*9 ���6[_3#"&54632#.#"32%3#"&54632#.#"326%4&'.'&! ! 7>7>!��������� �=39? 6'_���������� �>29? 5'17m-V����U--,�bW.�������뮠@Fyu0HC$������뮠@Fyu0HC$L���=?? <����=! A <��`�;+"&54&#!+"&5463!2#!"&546;2!26546;2���p���Ї����0�p�����p���@��I�������pp���>Sc+"&=46;254&+"&+";2=46;2;2=46;2;2%54&#!";2=;26#!"&5463!2���A5�DD�5A7^6a7MB5��5B7?�5B~�`��`��`0`��rr��5A44A5�����v�5AA5�f�*A���`��`0`����� !!!! #!"&5463!2��ړ�7���H��7j�v�@v��v�v��'���:��@v��v�v���MUahmrx���������������#"'!"'!#"&547.547.54674&547&54632!62!632!#!627'!%!"67'#77!63!!7357/7'%# %'3/&=&' 5#?&5476��!�p4�q"���"�"�6�"� ��'������h*�[��� ��|�*��,�@���?wA�UM�pV���@�˝�����)��Ϳw����7(�{��*U%���K6������=0�(���M��� ��"!O dX$k !!��! ����b�� ���[�����TDOi ��@��6��b��xBA�ݽ�5 � �ɝ:����J���+���3����,��p x�1���������Fi (��R�� 463!#!"&5%'4&#!"3���`����а@.�.@A-X��f�B����$��.BB.�.C��} )&54$32&'%&&'67���"w�`�Rd]G�{��o]>p6��sc(��@wg����mJ�PAjy���YW�a͊AZq���{HZ�:�<dv\gx�>��2AT�Kn������+;"'&#"&#"+6!263 2&#"&#">3267&#">326e��~�└�Ȁ|��隚���Ν|����ū|iy�Zʬ��7Ӕ�ް�r|�uѥ��x�9[��[9�jj��9A�N��N�+,#ll"���B�S32fk��[/?\%4&+";26%4&+";26%4&+";26%4&+";26%#!"&5467&546326$32�]]��ee��ee��ee��$��~i �qfN-*���������#����Sj������t�2"'q�C���B8!�'�> !%)-159=AEIMQUY]agkosw{��������! %! 5!#5#5#5#5#57777????#5!#5!#5!#5!#5!#5!#5!#5#537#5!#5!#5!#5!#5!#55#535353535353%"&546326#"'#32>54.&54>3237.#"����������Q%%%%%%%%%?iiihOiixiiyiixii�Arssrrssr��%s�ssrrss�Ns%%%%%%%%%%�����������'<D<'paC_78#7PO7)("I$ 75!����RA��b��(���ss�ss�ss�ss�ss�"/!".""." !."".!/^.".^.".]/".�$$$$$$$$$$$$$$$$��Os$$$$$$$$$$$$$$sO$s�ss�ss�ss�ss�ss#��������}$) 13?* ,./: -�s�*4&"2$4&"2#!"&5463!2!5463!2_��������?-��-??-�,@�@,�-?����pq�8��,??,D,??,��,??(�Z2#".#"3267>32#".543232654&#"#"&54654&#"#"&547>326���ڞU�zrhgrx�S��Пd�U <e�����x՞����Zf��_gן:k=2;�^��9��Œ��7\x��x\7����K=5Xltֆ�W����W{e_�%N��%,%CI��%���#+W4&+54&"#";26=32"&462"&462!2#!"&54>7#"&463!2!2�&�&4&�&&�&4&���KjKKj�KjKKj� ���&&�&%��&&�&&4&�&&�&4&�&&��5jKKjKKjKKjK��%z 0&4&&3D7&4& %&���'S4&"4&"'&"27"&462"&462!2#!"&54>7#"&463!2!2&4�&4&�4&4��KjKKj�KjKKj� ���&&�&%��&&�&&4&�%&&�ے&4��"jKKjKKjKKjK��%z 0&4&&3D7&4& %&�� & !'! !%!!!!%"'.763!2�o���]�F������o�������oZ��Y��@:�@�!�!�g���������������f�/�/��I��62'"/"/"/"/"/"/"/7762762762762762762%"/77627&6?35!5!!3762762'"/"/"/"/"/"/%5#5!4�ZSS6SS4SS4SS4SS4SS4SS4�ZSS4SS4SS4SS4SS4SS4S�-4�ZSS4S@������4SS4�ZSS6SS4SS4SS4SS4SS4S@�����ZSSSSSSSSSSSSSS�ZSSSSSSSSSSSSSy�ZRRR@%:= :+������: =���RR�ZSSSSSSSSSSSSS���������Cv!/&'&#""'&#" 32>;232>7>76#!"&54>7'3&547&547>763226323@``����` VFaaFV $. .$ ��y��y� .Q5Z���E$ ,l<l, $E���R?Y*��@���@�2 !#""#! ��y��y=r�na�@@(89*>�*%>>%*�>*98(QO�!���L\p'.'&67'#!##"327&+"&46;2!3'#"&7>;276;2+6267!"'&7&#"(6&#"#"'�D��g��OOG`n%�E������LL{�@&&�N�c,sU�&&�!Fre&&�s�����s���#�/,�������<=� #�]�g��L�o�GkP�'��r-n&4&2�-ir&�&�?���o ��������4_�����5OW! .54>762>7.'.7>+#!"&5#"&5463!2"&462�{�����{BtxG,:`9(0b��Կ�b0(9`:,GxtB��&@&�&@&K5�5K`�����?e==e?1O6#, #$ ,#6OO��&��&&�&�5KK���������?!"'&'!2673267!'.."!&54632>321 ��4��q#F�""�8'g��o#-��#,"t�Yg��>�oP$$Po�>� ��Z�e�p#����)�R��0���+I@$$@I+����+332++"&=#"&=46;.7>76$ ������@����ᅪ*��r���������@��@�����������r���'/2+"&5".4>32!"&=463 �&@��~[���՛[[��u˜~���gr�������&�`����u՛[[���՛[~~@��r������=E32++"&=#"&=46;5&547&'&6;22676;2 >�����``@``�ٱ��?E,��,=?��r�������H�����@``@�GݧH`�j��j���r������BJ463!2+"&=32++"&=#"&=46;5.7676%#"&5 &@�~���``@``�� �v�X����r�������&���������@``@����+BF��`r������ks463!2+"&=32++"&=#"&=46;5&547'/.?'+"&5463!2+7>6 %#"&5 &@�~���``@``��~4e 0 io@& �jV 0 Z9�������r�������&���������@``@�G�ɞ5o , sp� &@k^ , c8~~��`r�������8>KR_32++"&=!+"&=#"&=46;.767666'27&547&#"&'2#"�����@�@���'�Ϋ���'������sg��gs�����ww�@����sg��g����@����@���-ss��ʃl������9���9��������OO���r9���9��FP^l463!2+"&=$'.7>76%#"&=463!2+"&=%#"&54'>%&547.#"254&' &@�L?����CuГP ��v�Y�� &@�;"����������ޥ�5݇�����ޥ���5�`&����_��ڿg��w��BF�@&����J_ s���&��&�����?%x���������%x��JP\h463!2+"&='32++"&=#"&=46;5.7676632%#"&56'327&7&#"2#"� &@�L? ���ߺu�``@``��} �ຒ�ɞ���������ue��eu�9����ue��e�&����_��"|N�@``@��"��"|a~���l����o����9���9��r9��@�9���;C2+"&5"/".4>327'&4?627!"&=463 �&@Ռ . �N~[���՛[[��u˜N� . ����gr�������&�` . �O��u՛[[���՛[~N� . ��@��r������9A'.'&675#"&=46;5"/&4?62"/32+ ��'��֪�����\ . �4� . \���r������|��ݧ���憛��@�\ . �� . \�@��r�����~9A"/&4?!+"&=##"$7>763546;2!'&4?62 m�� - ���@���ݧ���憛��@&� - �@r������m4�� - ����ٮ*������� - ��r������+"&5&54>2 ����@��[���՛[�r�����������dG�u՛[[���r������ ".4>2������r�[���՛[[���՛�r������5�՛[[���՛[[����$2#!37#546375&#"#3!"&5463�#22#�y��/Dz?s����!#22#�2#��#2S�88� ����2#V#2��L4>32#"&''&5467&5463232>54&#"#"'.K���g��&Rv�gD� $*2% +Z hP=DXZ@7^?1 ۰��3O+�l��h4���`���M@8'�+c+RI2 �\�ZAhS�Q>B�>?S2Vhui/�����,R0+ ZRkm�z�+>Q2#"'.'&756763232322>4."7 #"'&546��n/9�b�LHG2E"D8_ p�dd���dxO�"2�xx��ê�_�lx�2X !+'5>-�pkW[C �I I@50�Od���dd��˥�Mhfx�����x^���ә� �#'+/7!5!!5!4&"2!5!4&"24&"2!!!��� 8P88P�� 8P88P88P88P����������P88P8 ���P88P88P88P8� ������������+N &6 !2#!+"&5!"&=463!46;23!#!"&54>32267632#"_����>�@` �� � �� ` � � L4Dg��y� 6Fe=O���O�U�4L��>���� � �� ` � ` ��4L�2�y5eud_C(====`L4����3V &6 #"/#"/&54?'&54?6327632#!"&54>32 7632_����>��� � �� � �� � �� � ��%%S��y� 6Fe=�J�%��>���� � �� � �� � �� � ��%65%S�y5eud_C(zz.!6%$!2!!!46;24&"2!54&#!"�&���&�&@�Ԗ��V�@&&�@��&&�Ԗ�Ԗ@��&���3!!! !5!'!53!! #����7I�e�����eI7��CzC�l��@�����@������@�#2#!"&?.54$3264&"!@������մ���pp�p���������((��������p�pp����#+/2#!"&?.54$3264&"!264&"!@������մ���^^�^@����^^�^@���������((��������^�^^�����^�^^�����v(#"'%.54632 "'% 632U�/�@��k0�G��,�zD#[�k#� /t�g�� F�� ����Gz����� #'#3!) p�*�xe���0,\8�����T���#/DM�%2<GQ^lw����� &'&676676&'&7654&'&&546763"#"'3264&7.>&'%'.767&7667&766747665"'.'&767>3>7&'&'47.'.7676767&76767.'$73>?>67673>#6766666&'&6767.'"'276&67&54&&671&'6757>7&"2654&57>&>&'5#%67>76$7&74>=.''&'&'#'#''&'&'&'65.'&6767.'#%&''&'#2%676765&'&'&7&5&'6.7>�&5R4&5S9 W"-J�0(/�r V"-J�0(.�)#"6&4pOPpp�c�|o}vQ�[�60X�Q��W1V� #5X N"& . ) D>q J:102(z/=f��*4!>S5b<U$:I o<G* , &"O X5 #! �� R N# C 83J*��R !(D #%37 �;$-.� (,��覦�6ij � ���"���)9 E�%����!B83 j9�6/, :QD')yX#�63V ��b�a , Ue��LPA@���* ̳�`Xx*&E V36��% B3% B3XA #!.mU"A #!.mUB-#2+Jii�i�m-C<I(m��8qF/*)0�S I E5&+>!% (!$p8~5..:5I ~��T� 4~9p# ! )& ?()5F 1 � d%{v*�: @e s|D�1d {�:�*dAA|oYk'&��<��tu��ut�&vHC�XXTR�;w�� ��71 Z*&' 1 9? . $��Gv5k65P<�?8q=4�a SC"��1#<�/6B&!ML �^;�6k5wF1<P�C �;$"&462"&46232>.$.�`�aa��sa�``��Z9k����'9؋ӗa-*Gl|M�e_]`F&O������ܽ�sDD!/+�``�aa�``�a1<YK3( /8HQelA�Z3t_fQP<343J;T7Q�+?Kgw $6&$ $&62+"5432+"&=.54 $;26=462;26=4& 4&#!"3!26)����߄��4R4߄��mlL�������r {jK#@#Q�a����^�����@���@���`&��&&�&�������߄��4R4�Ď������LlL�N� �@K5#:rr:#5K���^����a�a��``]��]``����&&�&& /!3#4&#!"3!265##!"&5463!22�������@K5^B��B^^B@B^5K���� �@���5K�B^^B�B^^B�K /!2##!"&5463!2#4&#!"3!265�5KK5^B��B^^B@B^���@��K5��5K�B^^B�B^^B�`� �@ /!2##!"&5463!2#4&#!"3!265�5KK5^B��B^^B@B^���@��K5��5K�B^^B�B^^B�`� �@ /!2##!"&5463!2#4&#!"3!265�5KK5^B��B^^B@B^���@��K5��5K�B^^B�B^^B�`� �@ +2##!"&5463!2#4&#!"3!265�5KK5^B��B^^B@B^���@�K5��5K�B^^B�B^^B�`� �@ �{#!&'#"'&547632m*��� �0���((�'(�$0K ��*�*��% 3#!3# '!#53 5#534!#53 6!3@����@@@��pp��@@@����@@pp@��`������� ����� �+/7;A#3!5!!3#!!5!35!355#%53#5!#35#!!!!!!!!���������������������������������������������������������������������� � #'+/3?CGW#3!5!!35!!3#!!5!#!5!3535!355#%#3%!53#5!#35#!5##5!3!5!3!5 ����������������������������������������������������������������������������������������������������������������!"&5463!2!"!�`(88(@(8�`(8�}2�2R �`8(@(88(�`8HR2�2���##6?6%!!!46#!"&5463!2x���� ��8�(�`(�(88(@(8� ���� (8��(`�(8(@(88�� �'ATd+5326+5323##"' %5&465./&76%4&'5>54&'"&#!!26#!"&5463!2� �� ���i�LCly5�)*H�celzzlec0h�b,,b�eIVB9@RB�9�J_�L4�4LL44L44%��2"��4��:I;p!q4b�b3p(P`t`P(�6EC.7B�I6�4LL44LL�� �.>$4&'6#".54$ 4.#!"3!2>#!"&5463!2Zj��b�jj[���wٝ]�>o��Ӱ�ٯ�*�-���oXL4�4LL44L'�)�꽽�)�J)���]��w����L���`��ֺ��۪e���4LL44LL�;4&#!"3!26#!"&5463!2#54&#!";#"&5463!2� �� @ �^B��B^^B@B^��� �� ��B^^B@B^`@ �� M��B^^B@B^^>�� �� �^B@B^^��5=Um ! !!2#!"&=463!.'!"&=463!>2!2#264&"".54>762".54>762��������?(`��`(?��b|b��?B//B/�]�����]FrdhLhdrF�]�����]FrdhLhdrF@�@��@�(?��@@?(@9GG9@/B//B�aItB!!BtI�Ѷ�!!��ьItB!!BtI�Ѷ�!!��ь�-M32#!"&=46;7&#"&=463!2#>5!!4.'.46�ՠ��`�@`ՠ��`���M�sF�Fs�MM�sFFs�M����ojj�o��@@�jj�@@�<���!(!���!(!�-3?32#!"&=46;7&#"&=463!2+!!64.'#�ՠ��`�@`ՠ��`�� � Dq�L�L�qD����ojj�o��@@�jj�@@B>=�C�����-3;32#!"&=46;7&#"&=463!2+!!6.'#�ՠ��`�@`ՠ��`��UVU96�g�g�6����ojj�o��@@�jj�@@β����**ɍ�-G32#!"&=46;7&#"&=463!2#>5!!&'.46�ՠ��`�@`ՠ��`���M�sF�Fs�M�k�k�����ojj�o��@@�jj�@@�<���!(!3��3!(!�9I2#!"&=4637>7.'!2#!"&=463��@b":1P4Y,++,Y4P1:"�":1P4Y,++,Y4P1:"b�@@��@7hVX@K-AA-K@XVh77hVX@K-AA-K@XVh7����Aj"#54&#"'54&#"3!26=476=4&#"#54&'&#"#54&'&'2632632#!"&5&=4632>3265K @0.B @0.B#6'&�& l @0.B 2' .B A2TA9B;h" d� mpP��Tl��L�c�_4.H�K5�]0CB.�S�0CB.�/#��'?&&)$�$)�0CB. }(AB.�z3M�2"61�d�39�L/PpuT(If�c�_�E�`1X"#4&"'&#"3!267654&"#4&"#4&26326#!"&'&5463246326�\B B\B�&@5K�&@�"6LB\B B\B ��sc�i�L}Q�P<m$��3�jN2�c�B.�p.BB.���3K5+"�3,"� �.BB.��.BB.���.�G=�c�i�(+�lOh7/DVj�"�c�=���&5Jb�#"'&=.547!"&46;'.54632!2327%.54&#"327%>%&#"!"3!754?27%>54&#!26=31��?>I��j��jq,J[�j.-t�j�lV��\���$B.R1?@B.��+?2`$�v5K-%��5KK5�.olRIS+6K5�̈$B\B 94E.&�ʀ�15uE& �Ԗ�Pj��j�dX�U�GJ7!.B � P2�.B � %2@ �7�K5(B�@KjKj�?+f�UE,�5K~!1��.>F.��F,Q5*H��$b2#!"&=%!"&=463!7!"&'&=4634'&#!">3!!"3!32#!"3!23!26=n$<vpP��Pp���Pp�w�*�Rd�ApP�]��'@�A& 3@��&H-�[(8@ 2�EB^&1 =&�&81����PppP��pP w���cOg Pp��c� 4& #.& &,,:8(�%^B &� .�&&��2t"&'&54'&5467>32>32>32#"#.#"#.#"3!27654&#"547654&#"#654&�Mye t|]�WS�Sg�SY�\x{ 70"1i�92�DU1&= �� =&0@�c >&/Btd4!�*"�8K4+"��@H@/'= t�?�_K�93-�]� UlgQ���QgsW �]#�+�i>p&��3�0&�VZ&0B/ ���%3B.�"t�o ){+C4I��( /D0&�p0D��3[_cg"'&#"3!2676=4&"#54&#"#54&#"#4&'2632632632#!"&'&5463246#!#!#�5K�)B4J�&@�#\8P8 @0.B J65K J6k� cJ/4qG^�\hB�2<m$��3�iG;�� �K5����6L4+"�3p`b�)<8(=0CB.@Z7OK5`:7O��k�EW�^�tm��@Q7/DVi�##j�������������%4Ia�2#!"&5&546325462632"32654&"3267654&76;74&"#.#"2676=#"&'+53264&#!"3</�U�X�dj���jP��ԖEu�!7JG72P � B�% � B.!7� @�A�f+?�jKjK@�B(5K,EU�H*5Q,F��.F>.��1!~K5y?��^\��Vl�j�t-.j�[J,qj��j��I7$��?1R.B�+��.B$`2?g�vEo.�5KK5��%-K��6+SIR[��&.E49 B\B$���5K�G#!+"&5!"&=463!2+"&'+"'+"'&5>;2>76;2Y �� � �� M �.�x �-� N� � � � �u �� , u �? L�W��� ���# � *:J4'&+326+"'#+"&5463!2 $6& $&6$ <!T{�BH4� ��&�>UbUI-����uu�,�uu�ڎ������LlL�AX!��J��m����f\�$ 6u�����uu�,�K������LlL���-[k{276/&'&#"&5463276?6'.#"!276/&'&#"&5463276?6'.#" $6& $&6]�h-%Lb`J%E5 ,5R-����h -%Lb`J%E5 ,5R-���'����uu�,�uu��lL�������/hR dMLcN����hR dMLcN����1u�����uu�,��������LlL�@��� ' 7 '7 �����`��`H� �����`�`H� �!`��������`H� � ���`�`�`H���`��'% 7' 7'7 ' $&6$ ���X�`��(W�:,�:��X�`��(WL�������LlL�X�`(W��:�B����X�`���(X�������LlL�� �� $%/9ES[�#"&54632$"&4624&"26$4&#"2%#"&462$#"&4632#"32&! 24> !#"&'.'#"$547.'!6$32�7&'77'&7�7N77N�'q�qq�q�qPOrq��E�st�����ts��st���}�||�}�������uԙ[W��Q���~,> n������P/RU P酛���n >,m�����'77'&77N77N6^Orq�qq�qq�q�t��棣棣�(~|��|on[��usј^�~���33������pc8{y%cq����33dqpf�� L 54 "2654"'&'"/&477&'.67>326?><���� x �������, (-'s�IVC��VH�r'-( $0@!BHp9[�%&!@0$u �� ������]\��\]��-$)!IH��V D�� VHI!)$-#3���6>N"&462."&/.2?2?64/67>& #!"&5463!2�]�]]�3 $; &|�v;$ (CS�3�1 =�rM= �4�TC(G���z�w�@w��w�w���]]�]��($-;,54�0= �sL =�45,;�����@w��w�w������(2#"$&546327654&#" &#"AZ�������\@�/#�%E1/#����#.1E$�!�[A�����懇�@�@\��!�#21E!��6!E13"�|!�� gL&5&'.#4&5!67&'&'5676&'6452>3.'5����A5R��V[t,G'Q4}-��&�<C!l n?D_@Փ>r!� ��G;��>��!g�1�����2sV&2:#;��d=�*'�5E2/..F�D֕71$1>2�F!���&12,��@K� r��#"&5462>%.#"'&#"#"'>54#".'7654&&5473254&/>7326/632327?&$ $6 $&6$ �!&"2&^ u��_��x��^�h ;J݃HJǭ q�E Dm! M� G?̯'%o�8 9U�������(F(�ߎ������LlL��&!&!SEm|�[��n{�[<ɪ "p� C Di% (K�HCέp�C B m8 @Kނ H�F(���������������LlL���"*6%&6$ 7&$5%%6'$2"&4}���x����3��n��QH������:dΏ���Xe�8�����z��' ������l�i���=!��7�����S�o�?v�������M '&7>>7'7>''>76.'6'���El:F�gr *�t6�K3UZ8�3P)3^I%=9 )<�}J���k+C-Wd�� &U���-��TE+]��Qr-�<Q#0 �C+M8 3':$ _Q=+If5[ˮ&&SG�ZoM�k���ܬc�#7&#"327#"'&$&546$;#"'654'632ե��fKYYKf�¥y�ͩ���䆎�L��1���hv�v��ƚw�wk��n�]��*��]�nlx��D��L�w�����~?T8b��b9SA}����+5?F!3267!#"'#"4767%!2$324&#"6327.'!.#"��۔c�2�8�Ψ����-\���?���@hU0KeFjTl�y�E3��aVs�z�.b��؏��W80��]T��Sts�<�h�O��_u7bBt���SbF/�o��|V]SHކ�J�������34&#!"3!26#!!2#!"&=463!5!"&5463!2 �� @ �^B� `��`� B^^B@B^ � �@ �@B^�@@�^B�B^^����>3!"&546)2+6'.'.67>76%&��F8$.39_��0DD�40DD0���+*M7{L *="# U<-M93#�D�@U8v�k�_Y �[�hD00DD0��0D�ce-JF1BD����N&)@ /1 d��y%F��#"'&'&'&'&763276?6#"/#"/&54?'&763276"&'&'&5#&763567632#"'&7632654'&#"32>54'&#"'.5463!2#!3>7632#"'&'&#"'&767632yq������oq>*432fb������a $�B? >B BB AA�.-QP���PR+ 42 %<ci���ђ:6&h�HGhkG@n�`��I���Ȍ5 !m��(|.mzy�PQ-. je���� �����q>@@?pp�gVZE|fb6887a %RB? =B ABBAJvniQP\\PRh!cDS�`gΒ��23�geFGPHX�cCI��_ƍ��5" �n�*T.\PQip� [*81 / 9@:��>t�%6#".'.>%6%&7>'.#*.'&676./&'.54>754'&#"%4>327676= >���vwd" �l����"3 /!,+ j2.|��%& �(N&w���h>8X}x�c2"W<4<��,Z~�fd�aA�`FBIT;hmA<7QC1>[u]) u1�V(�k1S) -� 0�B2*�%M;W(0S�[T�]I) A 5%R7<vlR12I]O"��V/,b-8�/_��#3CGk2#!"&546;546;2!546;2%;2654&+";2654&+"!32++"&=#"&=46;546;24LL4��4LL4�^B@B^�^B@B^�@@�@@�����@��@L4�4LL44L`B^^B``B^^B``�� �� ��@@��@���#3W#!"&=463!2!!%4&+";26%4&+";26%#!"&546;546;2!546;232���@�����@@@@�L4��4LL4�^B@B^�^B@B^�4L�@@��� �� ��N�4LL44L`B^^B``B^^B`L��#'7Gk%"/"/&4?'&4?62762!!%4&+";26%4&+";26%#!"&546;546;2!546;232W. �� . �� . �� . �� � ����@@@@�L4��4LL4�^B@B^�^B@B^�4L�. �� . �� . �� . �� ��� �� ��N�4LL44L`B^^B``B^^B`L��(8\ "'&4?6262!!%4&+";26%4&+";26%#!"&546;546;2!546;232� �� . �� . �`����@@@@�L4��4LL4�^B@B^�^B@B^�4L<� . �� . �:� �� ��N�4LL44L`B^^B``B^^B`L�2632632#!"&5463�&&&&��&&&���&���&��&&�&�#27+"&5 %264&#"26546��>&�&T�,��X�������q&&�1��X��,�LΒw�%��%;#!"&5463!546;2!2!+"&52#!"/&4?63!5!� �(��&&@&�&(��&�&@&&��(� �(� �&&@&&@��&&�&�&� �����#''%#"'&54676%6%%������� �hh �@�` ���!�� ���!� �� �� �� � ������ �#52#"&5476!2#"&5476!2#"'&546 � �� � ��� � �@� � �@� �� �@ � � 84&"2$4&"2$4&"2#"'&'&7>7.54$ �KjKKj�KjKKj�KjKKj��d�ne���4"%!������KjKKjKKjKKjKKjKKjK.���٫�8 !%00C'Z���'���.W"&462"&462"&462 6?32$6&#"'#"&'5&6&>7>7&54>$ �KjKKj�KjKKj�KjKKj�h��я�W.�{+9E=�c��Q�d�FK��1A 0)����LlL��jKKjKKjKKjKKjKKjK���p�J2`[Q?l&�����٫�C58.H(Y���ee��� � ���Y'����w��(�����O��'��R���@$#"&#"'>7676327676#"� �����b,XHUmM�.�U_t,7A3ge z9@xS���a�Q�BLb�(� ����V���U����� !!!�=�����=���w)��������AU!!77'7'#'#274.#"#32!5'.>537#"76=4>5'.465!��KkkK_5 5�� �#BH1��`L I���&�v6��SF���!Sr99rS!``� /7K%s}H���XV ��P��V e�� V�d/9Q[ $547.546326%>>32"&5%632264&#"64'&""&'&"2>&2654&#";2���P���3>tSU<�)tqH+>XX|W��h,�:USt��W|XX>=X* )���) +�^X^�|WX=>X�:_.2������//a:Ru?� Q%-W|XW>J�( �=u��>XX|WX�` *((* +2 2�X>=XW|E��03>$32!>7'&'&7!6./EU����noh��i����I\�������0<{ >ORD��ƚ�~�˕V�ƻ��o�R C3��7J6I`��Tb<�^M~M8O���� � 5!#!"&!5!!52!5463 ^B�@B^���`B^�^B `��B^^"�����^B��B^��0;%'#".54>327&$#"32$ !"$&6$3 ##320�J�����U��n��L�n��ʡ���~~�&��q�@�t�K�����L��}�'`� - -�ox����nǑUyl}��~������~�F����ڎ�LlL��t�`(88( �� 7!' !���\W�������\���d;����tZ�`_��O��;���}54+";2%54+";2!4&"!4;234;2354;2354>3&546263232632#"&#"26354;2354;2354;2�````��p�p��`�`�`� !,! -&M<FI(2�`�`�`�����@PppP���pppppp�# # � �pppp��p �j#"'&=!;5463!2#!"&=#".'.#!#"&463232>7>;>32#"&'#"!546��� ��%. `@��` :,.',-���Xj��jX�h-,'.,: kb>PppP>bk .%Z �&� �:k%$> $`��`6&L')59I"Tl�ԖlT"I95)'L&69Gp�pG9$ >$%k:��!+32&#!332 $&6$ ~O8��8���O�����������LlL�>pN ����� i������LlL���� '':Ma4&'#"'.7654.#""'&#"3!267#!"&54676$32#"'.76'&>$#"'.7654'&676mD5) z�{��6lP,@Kij��jOo�Ɏ���ȕ>>��[t��a)GG4?a�) ll >�;_-/ 9GH{�z�yN@,K�ԕoN��繁������y��! ?hh>$ �D��" >��â?$�� n"&5462'#".54>22654.'&'.54>32#"#*.5./"�~��~�s�!��m�{b6# -SjR,l'(s�-6^]It�g))[��zxȁZ&+6,4$.X%%Dc* &D~WL}]I0" YYZ��vJ@N*CVTR3/A3$#/;'"/fR-,&2-" 7Zr�^N��a94Rji3.I+ &6W6>N%&60;96@7F6I3���+4&#!"3!26%4&#!"3!26 $$ ��������^����a�a`@��@����^����a�a�����'7 $ >. %"&546;2#!"&546;2#/�a����^�����(�����������������^����a�a����(������N@��@�����4&#!"3!26 $$ @��@����^����a�a`@����^����a�a�����' $ >. 7"&5463!2#/�a����^�����(��������n@����^����a�a����(������N@���%=%#!"'&7!>3!26=!26=!2%"&54&""&546 �#��#]V�TV$KjK�KjK$��&4&�Ԗ&4&�>��9G��!�5KK5��5KK5�!��&&j��j�&&����#/;Im2+#!"&'#"&463>'.3%4&"26%4&"26%6.326#>;463!232#.+#!"&5#"�5KK5sH.�.Hs5KK5e# )4# %�&4&&4&�&4&&4&` #4) #%�~]�e�Z�&�&�Z�e�]E-�&��&�-EKjK�j.<<.�KjK��)�#)�`"@�&&�`&&�&&�`&&�)#�`)"�d�Xo&&oX�G�,8&&8!����O##!!2#!+"'&7#+"'&7!"'&?63!!"'&?63!6;236;2!2�@�@�8��@7 8��Q� N�Q� N�� 8G@�� 8GQ� N�Q� N7 �������8��8��H��H��k��% ".>2I�������2�0�]@��]��@o�����o@@o�����o㔕����a�22���]����]�p�^���|11|�9�9�|11|�(��%7'7' ' 7T���� d���lt��l)q��n�������luul�������)1$4&"24&"2 &6 +"&5476;2 &6 LhLLh�LLhLLhL����>� �� �& �&�`����>�hLLhLLhLLhL�����>����&�&�����>��G�� .7)1!62 1!62h��e�������2�20e���2�2>� v +4� [��d����+ ���d� �135#5&'72!5!#"&'"'#"$547&54$ ���Eh���`X����(����cY���z�:L:�z���Yc��������\$_K`Pa}��f��iXXiޝf���a��� ���(+.>#5#5!5!5!54&+'#"3!267!7!#!"&5463!2����U�`��`' ����� �����j��j�V>�(>VV>�>Vq����������������(^����(>VV>�>VV�=&'&'&'&76'&'&.' #.�h8��"$Y ''>eX5, ,Pts�K�25M�RLqS;:.K'�5�R Ch���h�����R�t(+e�^TT���u B"$:2�~<�����2�Hp����wTT�� V�/7GWg. %&32?673327>/.'676$4&"2 $&6$ $6& $&6$ d-����-�m ,6*6, m���KjKKj�o������oo���K����zz�8�zz�Ȏ������LlL�U4>>4-.��YG0 )�xx�) 0GYޞ.�jKKjKq���oo��oo�lz�����zz�8�0������LlL��D��/7H#"'.7'654&#"'67'.6?>%"&46227#".547|D,=),9#�7��[͑�f�x���!X: �D�$+�s)�hh�i��jZ������t�<��F/��*8C,�q�e���\�r,W�BX���/C2��h�hh���=�t������Xm�����>NZ+"&=46;2+"&=4>7>54&#"#"/.7632 >. $$ p��=+& �35,W48'3 l z����ff���ff�����^����a�aP���2P: D#;$# $*;?R ��Cf���ff�����^����a�a��'�Y >O`"&5462&'.'.76.5632.'#&'.'&6?65��\\�[�<C��z�C 25�U# .�ZK ��m+[$/#>( |� r���[A@[[@A�#2#� ����7�* <Y���$ +}"(�� �q�87] F _��1) �� � #1Ke34&+326+"&=!#!"&763!2#!"&5463!2#>?4.'3#>?4.'3#>?4.'3��Xe`64[l�����7 �� , L;�����=+3&98&+)>�>+3&98&+)>�=+3&88&+)> �Wj�|r�>Q$��~���d$kaw+-wi[[\�;/xgY$kaw+-wi[[\�;/xgY$kaw+-wi[[\�;/xgY���J\m�4.'.'&#"#"'.'&47>7632327>7>54&'&#"327>"&47654'&462"'&476'&462"'&47>&'&462i$ $^" %% "^$ $W "@9O?1&&18?t@" W�&%%&4KK�6pp&4���6ZaaZ&4mttm�^x -���- x^=/U7Ck���kz'[$=�&5%54'4&K�K�4r<r4&��X��4[��[4&m����m��'/7?GOW_gow����"264$"264"264"264$"264"264$"264"264"&462"&462"&462"&462"&462"&462"&462"&462"&462"&462"&462"&462�^^�^��^^�^^�^^�^��^^�^��^^�^���^^�^��^^�^^�^^�^� p�pp�pp�pp��pp�pp�pp�pp��pp�pp�pp�pp��pp�pp�pp�pp��pp�pp�pp�pp��pp�pp�pp�pp�`^�^^�^^�^^�^^�^^��^^�^^�^^�^^�^^�^^�^^�^^�^^�^^���pp�pp�pp�p��pp�pp�pp�p��pp�p���pp�p��pp�p���pp�p��pp�pp�pp�p��pp�pp�pp�p ��LTi{�"&4626"&462$"&462#"&4632654>7>54 "&54>2"&462%"&54&#""&546 %#"&'&'.7>#"'&'.7>�&4&&4�&4&&4SZ��&4&&4�4$#&�&&j�3$"('$������&4&[���՛[��&4&&4F&4&�]\�&4&�$�� !D�4�% ,\�4�4&&4&�4&&4&-�Z�4&&4&;cX/)#&>B)��&4&�j9aU0'.4a7����&&u՛[[���4&&4&@&&]��]&&��Ώ0 �u4��0 )�4���#g�&'.#"32676%4/&#"326'&#"2632#2+&'%#"'&6?676676632%#"'&6767#"&'&6767#"'.7>327"#"&'&6763"'.7>;7632;>%5K$ "0%>s$ "0%>;;>%5K�VL#>H30 \�($$(�\���(�є�yO2F/{�(?0(TK.5sg$��є�y#-F/{�$70(TK.5sg$L#>H30 \�($$(�\#�(@5"'K58!'"5�8!'"55"'K#dS$K K$Sdx#@1 w�d>N;ET0((? - 2K|��1 w�����d#N;ET0$(? - 2K$#dS$K K$Sdx�DN\2654& 265462"2654 #"32654>7>54."/&47&'?62 &4&���&4&���h�՛[&4&r$'("$3�j&&��&#$4[����"�@��GB�[� "�&&��Β&&]���[��u&&����7a4.'0Ua9j�&4&�)B>&#)/Xc;u՛����"�" �G�i[����Xh#"&54676324&'&#"'>54#"32#"54>54'.#"32>7>767632326#!"&5463!2b ) :4FD�N [�1�,^�J��K-*E#9gWR�Yvm0O ��w�@w��w�w��C2�2c@X�&!�9{M�A���_��"S4b// DR"Xlj�PY< �@w��w�w��%���e4.#"32>7676#'.#"#"&54>3232>754&*#"&54>763 >32� ''il$E/ @�P@�� ^��`��'W6&�!.. ! -P5+ �E{�n46vLe�Vz�:���,SN/ M5M[�� ]$�[��^��5�iC'2H&!(?]v`* ��l� ��b��$9> ���=R�2 #"&5467%!"&7>3-.7>;%.7>322326/.76/.'&6766/&/&#"&676 &676&6766/&672? �=1�(H/ �� '96&�@)9<'���)29% �&06#���#��$� J� �07j)�5@�"*3%�"!M ��%#K�"%N�e8)'8_�(9�.<�c +8 8(%6 <)'4@@)#-<^ ?%$-`%. }Q!&�}%&N�-l���IJ�;6>/�=*�%8!Q ���#P"�\Q#N&�a��)<9�bR]mp%"'.'&54>76%&54763263 #"/7#"'#"&/%$%322654&#"%'OV�9 �nt |\d ϓ[��nt |@�D:)�� ;9�8'+|�j�," �41����CH^�nVz(�~R �9�\' �r� @����L��@� @�w4�6�HI(+�C ,��55,�� f[op@�\j�;(zV~����i/5O#"'&54>32&#" 654'67'"'>54''&'"'6767&546767>7���蒓��`V BM���R� B9)̟�!SH-77I�Xm�SM�H*�k#".o;^J q�ן���ד��>@�����YM $bK���d ��ү[E"����;���Kx%^�6;%T,U:i�m=Mk���).DT4'"&5463267&#" 6;64'.'4'>732676%#!"&5463!2),�蛜s5-<A���4ϲ 2W9 �&P:\�3)SEPJ��D4:3NI�w�@w��w�w��NE 2@u��us�+,�����/?x�sa�tmP�'�)fHVEA(%dA4w&4J5*�@w��w�w�����O[4'.'&54>54&#"#"'654'.#"#"&#"3263232>3232>76 $$ �Cf'/'%($�U�L ( #'/'@��3#@,G)+H+@#3 ����^����a�a�X@_O#NW�#O_�.* ##(��^����a�a����q�[632632#"&#"#".'&#"#".'&54767>7654.54632327&547>P��9 B6?K?%�O4�T% >6>Z64Y=6>%S�4N�$?L?4B @���{:y/�$ ,'R�!F!8% #)(()#%:!F �Q'+%�0z:�z���O_4'.'&54>54&#"#"'654'.#"#"&#"3263232>3232>76#!"&5463!2Cf'.'%($�V�M ) #'.'@�� 3 #A,G)+H+A# 4 ��w�@w��w�w��XA?4N$NW�&M&L�/* ## +�@w��w�w���� O$>?>762'&#"./454327327>7> EpB5 3FAP/h����\�/NG�S�L� � ���R�P*��m�95F84f&3Ga4B|wB.\FI*/�.?&,��5~K % &��Y."7n< "-I.�M`{�ARwJ!�FX^dj''''"'7&'7&'7&'7&547'67'67'67'63277774$#"32$ *��'ֱ,?�g=OO&L&NJBg�;1��'����'ֱ.=�gCIM $'&&NJBg�=.��%�����w؝\\��w� �I�o�o��<�<���-NIDg�=/��%����(ײ+A�hEHO*"#*OICh�=/��'����(ֲ/=�h>ON.��]��xwڝ]��������7��e��[���@�����)6!!"3#"&546%3567654'3!67!4&'7S��gn�y]K-�����#75LSl>�9���V��%�cPe}&H�n��_�HȌ����=UoLQ1!��4564���7U�C"� �!-9[nx��"&46254&"326754&"326754&"26754&"26#".547632632626326'4#"#"54732764&"264.#"327632>#"'"'#"'#"&5#"'67&'327&'&54>3267>7>7>32632632T"8""8�)<())�(<)))�)<))<)�)<))<)T�د{ՐRh�x=8 78 n 81 p��H_6�S��oc �F@b@?d?uK�bM�70[f5Y$35KUC<:��[;+8 n 87 8/8Zlv]64qE 'YK�0-AlB; W��#;WS9 &�(#-7Z�://:/�Tr++r,,r++r,,r++r,,r++r,,ʠ�g��xXV�ע��e9222222^�K�Vv���F0�2OO23OO��`�lF;�mhj84D�ro��B@�r+@222222C0DP`.�r8h9��~T4.&o�@9��1P���%14'!3#"&46327&#"326%35#5##33 $$ ����}Pc��c]<hl���ࠥ�Ymmnnnn���^����a�aw!�LY�Ə;ed����wnnnnnv�^����a�a��%�'#"$#"#.5462632327>321��I��U�Π?L���L?��cc�4MX�&��04;0��XpD[��[DpD,)&&�Q 9V\�26&".'&'&6?.#"#26327677>'32>&3#'&+"?626&"#!'.'!"&5463!>;26;2!2�P P 92#.}S�P9:�:%L\B�� )spN/9oJ5 !+D�`]�Bg�Y9�+�,�9% Pk4P P &�NnF!_7*}B<�{o0��&&�B;*<@$ucRRc�#@16#37c&�@@@ J"@*4�^`E�D�B�����o/8927 *@O�LC�!T!32�3X$�BJ@@@��&AS 0C59"'D/&�&D488$5A&�%O#!"&547>7>2$7>/.".'&'&2>^B�@B^>FFz�n_0P:P2\n�zFF>��R&�p^1P:P1^��&R P2NMJMQ0Rr�.B^^B� 7:5]yPH!%%"FPy]5:7 ���=4�QH!%%!H�t4=�<"-/ ?�1Pp+".'.'.?>;2>7$76&'&%.+"3!26#!"&54767>;2�' +�~'*OJ%%JN,&x�'%^�M,EE,M7�ZE[��P*FF*P��:5 � �^B�@B^){�$.MK%%KM.$+��X)o3"�a 22!]�4 I�>"">�,�&�S8J�B##B��12�` ��`B^^B�8&ra#11#$��R&��"&.2v%/%''%/%7%7'%7'/#&5'&&?&'&?&'&7%27674?6J�"�����0�<=���_gNU�?D��f���u�Y����G�b���7=^H^�` �=v~yT������3����G���D��P�O 4F��ѭ����q������i_w\ހ�!1u�S���%V_-d� ���1=U{J8n~�r����'U4.#".'"3!264&"26+#!"&5463!232+32+32�0P373/./373P0T=@=T��֙�֙|`^B�@B^^B�B^`````*9deG-! !-Ged9Iaa�l��lk���O��B^^B�B^^B������� +Yi"&54622#!"&54>;2>+32+32+#!"&5463!2324&#!"3!26�֙�֙0.I/ OB��BO -Q52-)&)-2� `` `` `^B�@B^^B�B^` � �@ � |k��kl����"=IYL)CggC0[jM4 � � � � �B^^B�B^^B� �@� �@ ���!1AQu4.#".'"3!24&"254&#!"3!2654&#!"3!2654&#!"3!26#!54&+"!54&+"!"&5463!2)P90,***,09P)J66S�����"��@��8��@^B��@�@��B^^B�B^U�kc9 9ck�U?�������@@88@@N�@B^````^B�B^^���!1AQu�#!"&4>32>72"&462#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!546;2!546;2!26#!"&5463!2J6�6J)P90,***,09P)������"��@��8��@� �@ `@@` �^B�@B^^B�B^ՀUU�kc9 9c�������`@@�88�@@�2� �@ ````�@B^^B�B^^�(%.'"&' $& #"$&6$ ��wC�ιCw�jJ~J�����>��������LlL�ś�JSSJ͛����>����6������LlL���$, $&6654&$ 3 72&& �lL������m�z�����z�B�l������>�������KlL�G���zz���G���>�����'7#!"&54>7&54>2 62654' '3�/U]B,ȍ����,B]U/OQ��н�Q������>�+X}��������}X�0b�Ӄ��ۚ�Ӆb0}�h��QQ��h�����>��f����f��#=#!"&4>3272"&462!3!26#!"&5463!;26=!2J6�6J)Q8P�P8Q)�������� � �^B�@B^^B`�`B^V�VV�ld9KK9d��������`�� �@B^^B�B^``^���+;K[eu4.#"'"3!264&"254&#!"3!2654&#!"3!26%54&+";2654&#!"3!26!54&#!"!#!"&5463!2�"D/@�@/D"?,�,?�p�pp�p�@�����@����@����@�^B�@B^^B�B^D6]W2@@2W]67MM��pp�p��@@@@@@@@n`�@B^^B�B^^���+;K[eu#!"&54>3272"&462#!"&=463!2%#!"&=463!2+"&=46;25#!"&=463!2!3!26#!"&5463!2�?,�V,?"D/@�@/D"�p�pp�p�@�����@����@��� � �^B�@B^^B�B^D7MM76]W2@@2W]֠pp�p��@@�@@@@�@@��`�� �@B^^B�B^^��A#"327.#"'63263#".'#"$&546$32326�������J9"65I).!1i���CC�u +I�\Gw\B!al���݇���y�ǙV��/]:=B�>9�����+<F+a[le���Pn[A&JR7t�)��+�tH�������kFIK�e � .��#"'&'>32%#!"&5463!2#"&54>54'&#"#"54654'.#"#"'.54>54'&'&543232654&432#"&54>764&'&'.54632� ?c��'p& ?b1w{2V ?#��	&�CY'&.&#+B : &65&*2w�1GF1)2<)<' ( BH=ӊ:NT :O �)4:i F~b`e!}�U3i?fR����UX|'&'&I�c&Q *2U.L6*/ L:90%>..>%b>++�z7ymlw45)0 33J@0!!TFL����� P]=GS�-��kwm !����*�(%6&692? $&6$ �� ' ����al�@l�������LlL���,&��EC ���h�$�������LlL��� /37;%"&546734&'4&" 67 54746 #5#5#5�p�pF:�:F�D<p�p<D� ���������� ���������PppP<d��ud<M�-PppP�-�M����������Dž����9��������� /37;%"&546734&'4&" 67 54746 #5#5#5�p�pF:�:F�D<p�p<D� ���������� ���������PppP<d��ud<M�-PppP�-�M����������Dž����9��������� /37;%"&546734&'4&" 67 54746 #5#5#5�p�pF:�:F�D<p�p<D� ���������� ���������PppP<d��ud<M�-PppP�-�M����������Dž����9��������� /37;%"&5467534&'4&" 67 54746 #5#5#5�p�pF:�:F�D<p�p<D� ���������� ���������PppP<d��d<M�-PppP�-�M����������Dž����9��������� +/37%"&54624&'4&" 67 54746 #5#5#5�p�pp�p�D<p�p<D� ���������� ���������PppPOqqOM�-PppP�-�M����������Dž����9����������&.6>FNV^fnv~����"/&4?.7&#"!4>3267622"&4"&46262"&42"&4462"$2"&42"&4"&46262"&4"&46262"&42"&4$2"&42"&42"&4� �� R ,H8Jfj��Q��hj�G^�R, !4&&4&Z4&&4&�4&&4&��4&&4&&4&&44&&4&��4&&4&Z4&&4&�4&&4&��4&&4&�4&&4&��4&&4&&4&&4&Z4&&4&Z4&&4& �� R ,[�cG�j�h��QRJ'A, ��&4&&4Z&4&&4Z&4&&4Z&4&&444&&4&�&4&&4Z&4&&4Z&4&&4Z&4&&4�&4&&4Z&4&&4Z&4&&4&&4&&4Z&4&&4Z&4&&4�%-5=EM}���������+"&=#!"'+"&=&="&4626"&462&"&462"&462&"&462&"&462#!"&=46;4632676/&?.7&#"!2"&462&"&462&"&462"&462&"&462&"&462"&462&"&462"&462��@?A�A? @ �@R.�..R�@`�jlL.h)*��*$ %35K���..�..�.����u�vn�u���....��@@�j�N *��*.t2#K5���..R..R.�� @Hq '&'&54 &7676767654$'.766$76"&462&'&'&7>54.'.7>76�����������ȵ|�_ğ��yv���/ۃ�����k] :Bu�q�� CA _k�ނ���XVo�bZZb�nW��|V 0 Q2��-� l��}���O / :�1���z q��%������z�G 4( 6�Ro�aą\�< )4 J�}�������%!!#!"&5463!2�^B�@B^^B�B^�`�@B^^B�B^^���%#!"&=463!2^B�@B^^B�B^�B^^B�B^^�&))!32#!#!"&5463!463!2��`B^^B��^B�@B^^B`^B�B^�^B�@B^��B^^B�B^`B^^���#3%764/764/&"'&"2?2#!"&5463!2�� �� � �� � �� � �� s^B�@B^^B�B^ג �� � �� � �� � �� �@B^^B�B^^���#'7"/"/&4?'&4?62762!!%#!"&5463!2� �� � �� � �� � �� � �^B�@B^^B�B^�� �� � �� � �� � �� ��`�@B^^B�B^^� ! $&6$ .2�r��`�������LlL�f4��������LlL���#.C��&>"'&4762"/&4?62'"'&4762%'.>6.'.>6'>/>76&'&.'&7&'">?4'.677>7.>37654'&'67>776 $&6$ (4�Z�## &## &y�"�6&.JM@&� "(XE*$+8 jT<l$3-V< 2'. -1 %#e"!Z� +*)H 8 (j #* -ƷVv/kh?'��������MlM�$($�R# & " #'#vZ@+&MbV$ � G7 --) R2T� 313dJ6@8lr2_�5m/."�G:= )%5f0gt*2)?;CB66&, � `48]USy������LlL���G6?>?3#'.'&!3!2>?3.'#!57>7'./5!27#'.#!"g�%%D-!gg<6W��WZe#1=/2*]Y3��-,����C1/Dx���] VF��I�q-H�����D2��NK'>*�%�R=f 07���=. fD�]\|yu���,0>Seu#2#"'&5<>323#3#&'#334'."#"+236'&54.#"5#37326#!"&5463!2� < ��zz�j��k-L+� )[$�8=".un/2 �^B�@B^^B�B^�5cy � ��(�ݔI�(8��?C�(3�>�� #"��($=�@B^^B�B^^0�K�S�&'.'&'./674&$#">&>?>'76'# "&#./.'7676767>76$w .~ku�BR�]� T%z+",�|�ޟ���j<���)(!( ~ˣzF8"{���%%#5����)��}''�x��JF��0"H[$%��EJ#% .Gk29(B13"?�@S)�5" �#9����dm�W"��;L�65R�A0@T.���$�}i`:f3A%% BM<$q�:)BD aa%`�]A&c| �M��s! Z 2}i[F&���** < ��ʣsc"J<&Ns�F%���0@Wm6&'.6$.7>7$76".4>2.,&>6'"'&7>=GV:�e#:$?+% q4����g &3h�T`Zt�Q��м�QQ��м�pA������P1L������K!:<��}҈`d��l��b�,�9' %%($! ���a3���)W)x ������� о�QQ��о�QQ���cQ����ǡ-�җe)U�s2����XD\���ϼ�Yd����/?O_o���#"=#"=4;543#"=#"=4;543#"=#"=4;543#"=#"=4;543#"=#"=4;543%#!"&5463!2++532325++532325++532325++532325++53232�p00pp00pp00pp00pp00�8(��(88(@(80pp00pp00pp00pp00pp0� � � � � ��@(88(�(88� �� �� �� �� �/�Q�/&'%&/"&=.6?&?&'&6?'.>-#".6?'.>'&6'.>54627>%>76#"'% %6�� 2�7 2G f���!)p&4&p)!��f G2 7�2 �� *6��� "�� 4�7 2G f�!)p&4&p)!�f G2 7�2 ��" ���6* �!k 3 j�&3 %,����*��&&ր*�9���% 3&�j 3 k!./!>��>$,*!k 3.j�&3 %�Ԝ9�*��&&ր*�ǜ,% 3&�j 3 k!*,$>��>!/.�&6.'&$ &76$76$�P��utۥiP��u��G��xy ��Զ�[xy �-���_v١eN��uv١e ��=��u�ʦ�����[t7��8�X� &6##'7-'%'&$ $6 $&6$ ��3��1�N��E0�����g��R�=|�����||�">"��������LlL����^��v!1f2i��Ђwg�fZQ�Q^>"�||�����||�w������LlL��&�Z�Xblw��������.'&>'&'&".'.'&&'&'&7>767>67>7626&'&>&'&>'.7>.676'&'&'&'.67.>7>6&'&676&'&676.676&'&>&'&676'.>6/4-LJg-$ 6)j2%+QF)�b3FSP21DK2�AW")")�$??8A&A�E5lZm��=g�G2Sw*&>$5jD ���GH�yX/4F �r 1 1�"�"!�l=6>�� 6 ,5./��'e .*�|�Ed! u&�&%&�� &��5d ���))66@�C&8B@q��L?P^7 G-hI[q��:<�rS U~97A_�IR`gp1 1 �;"("j?>"�T�6 ,6 &/`���LwQ'� ��A ^ � � "� $& _ �� y � *� <Copyright Dave Gandy 2016. All rights reserved.Copyright Dave Gandy 2016. All rights reserved.FontAwesomeFontAwesomeRegularRegularFONTLAB:OTFEXPORTFONTLAB:OTFEXPORTFontAwesomeFontAwesomeVersion 4.7.0 2016Version 4.7.0 2016FontAwesomeFontAwesomePlease refer to the Copyright section for the font trademark attribution notices.Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeFort AwesomeDave GandyDave Gandyhttp://fontawesome.iohttp://fontawesome.iohttp://fontawesome.io/license/http://fontawesome.io/license/���������� !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab� cdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������" !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRS�TUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~�������������������������������������������������������������������������������������������������������������������������������� !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������������������������glassmusicsearchenvelopeheartstar star_emptyuserfilmth_largethth_listokremovezoom_inzoom_outoffsignalcogtrashhomefile_alttimeroaddownload_altdownloaduploadinboxplay_circlerepeatrefreshlist_altlockflag headphones volume_offvolume_down volume_upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalictext_height text_width align_leftalign_centeralign_right align_justifylistindent_leftindent_rightfacetime_videopicturepencil map_markeradjusttinteditsharecheckmove step_backward fast_backwardbackwardplaypausestopforwardfast_forwardstep_forwardejectchevron_left chevron_right plus_sign minus_signremove_signok_sign question_sign info_sign screenshot remove_circle ok_circle ban_circle arrow_leftarrow_rightarrow_up arrow_down share_altresize_fullresize_smallexclamation_signgiftleaffireeye_open eye_closewarning_signplanecalendarrandomcommentmagnet chevron_upchevron_downretweet shopping_cartfolder_closefolder_openresize_verticalresize_horizontal bar_charttwitter_sign facebook_signcamera_retrokeycogscomments thumbs_up_altthumbs_down_alt star_halfheart_emptysignout linkedin_signpushpin external_linksignintrophygithub_sign upload_altlemonphonecheck_emptybookmark_empty phone_signtwitterfacebookgithubunlockcredit_cardrsshddbullhornbellcertificate hand_right hand_lefthand_up hand_downcircle_arrow_leftcircle_arrow_rightcircle_arrow_upcircle_arrow_downglobewrenchtasksfilter briefcase fullscreengrouplinkcloudbeakercutcopy paper_clipsave sign_blankreorderulol strikethrough underlinetablemagictruck pinterestpinterest_signgoogle_plus_signgoogle_plusmoney caret_downcaret_up caret_leftcaret_rightcolumnssort sort_downsort_upenvelope_altlinkedinundolegal dashboardcomment_altcomments_altboltsitemapumbrellapaste light_bulbexchangecloud_downloadcloud_uploaduser_mdstethoscopesuitcasebell_altcoffeefood file_text_altbuildinghospital ambulancemedkitfighter_jetbeerh_signf0fedouble_angle_leftdouble_angle_rightdouble_angle_updouble_angle_down angle_leftangle_rightangle_up angle_downdesktoplaptoptabletmobile_phonecircle_blank quote_leftquote_rightspinnercirclereply github_altfolder_close_altfolder_open_alt expand_altcollapse_altsmilefrownmehgamepadkeyboardflag_altflag_checkeredterminalcode reply_allstar_half_emptylocation_arrowcrop code_forkunlink_279exclamationsuperscript subscript_283puzzle_piece microphonemicrophone_offshieldcalendar_emptyfire_extinguisherrocketmaxcdnchevron_sign_leftchevron_sign_rightchevron_sign_upchevron_sign_downhtml5css3anchor unlock_altbullseyeellipsis_horizontalellipsis_vertical_303 play_signticketminus_sign_altcheck_minuslevel_up level_down check_sign edit_sign_312 share_signcompasscollapsecollapse_top_317eurgbpusdinrjpyrubkrwbtcfile file_textsort_by_alphabet_329sort_by_attributessort_by_attributes_alt sort_by_ordersort_by_order_alt_334_335youtube_signyoutubexing xing_signyoutube_playdropbox stackexchange instagramflickradnf171bitbucket_signtumblrtumblr_signlong_arrow_down long_arrow_uplong_arrow_leftlong_arrow_rightwindowsandroidlinuxdribbleskype foursquaretrellofemalemalegittipsun_366archivebugvkweiborenren_372stack_exchange_374arrow_circle_alt_left_376dot_circle_alt_378vimeo_square_380 plus_square_o_382_383_384_385_386_387_388_389uniF1A0f1a1_392_393f1a4_395_396_397_398_399_400f1ab_402_403_404uniF1B1_406_407_408_409_410_411_412_413_414_415_416_417_418_419uniF1C0uniF1C1_422_423_424_425_426_427_428_429_430_431_432_433_434uniF1D0uniF1D1uniF1D2_438_439uniF1D5uniF1D6uniF1D7_443_444_445_446_447_448_449uniF1E0_451_452_453_454_455_456_457_458_459_460_461_462_463_464uniF1F0_466_467f1f3_469_470_471_472_473_474_475_476f1fc_478_479_480_481_482_483_484_485_486_487_488_489_490_491_492_493_494f210_496f212_498_499_500_501_502_503_504_505_506_507_508_509venus_511_512_513_514_515_516_517_518_519_520_521_522_523_524_525_526_527_528_529_530_531_532_533_534_535_536_537_538_539_540_541_542_543_544_545_546_547_548_549_550_551_552_553_554_555_556_557_558_559_560_561_562_563_564_565_566_567_568_569f260f261_572f263_574_575_576_577_578_579_580_581_582_583_584_585_586_587_588_589_590_591_592_593_594_595_596_597_598f27euniF280uniF281_602_603_604uniF285uniF286_607_608_609_610_611_612_613_614_615_616_617_618_619_620_621_622_623_624_625_626_627_628_629uniF2A0uniF2A1uniF2A2uniF2A3uniF2A4uniF2A5uniF2A6uniF2A7uniF2A8uniF2A9uniF2AAuniF2ABuniF2ACuniF2ADuniF2AEuniF2B0uniF2B1uniF2B2uniF2B3uniF2B4uniF2B5uniF2B6uniF2B7uniF2B8uniF2B9uniF2BAuniF2BBuniF2BCuniF2BDuniF2BEuniF2C0uniF2C1uniF2C2uniF2C3uniF2C4uniF2C5uniF2C6uniF2C7uniF2C8uniF2C9uniF2CAuniF2CBuniF2CCuniF2CDuniF2CEuniF2D0uniF2D1uniF2D2uniF2D3uniF2D4uniF2D5uniF2D6uniF2D7uniF2D8uniF2D9uniF2DAuniF2DBuniF2DCuniF2DDuniF2DEuniF2E0uniF2E1uniF2E2uniF2E3uniF2E4uniF2E5uniF2E6uniF2E7_698uniF2E9uniF2EAuniF2EBuniF2ECuniF2EDuniF2EE����=���O<0�1h�PKAA#]3{��~�~3system/helix3/assets/fonts/fontawesome-webfont.woffnu�[���wOFF~� ��FFTM0k�G�GDEFL �OS/2l>`�2z@cmap�i� �:gasp��glyf _yL����Mheadb�36��-hheab�$ �hmtxb�� �Ey�locae���\maxpl� ,namemD�㗋�posto`�u�����=���O<0�1h�x�c`d``�b `b`d`d:$Y�<��x�c`f�d�������b��������ʢb��l��|6F�0#�F��nx�͒�J�q��gje�>�"�D���>�{�E�O >�����,"�u�^�[[[���j�os���_�M��%:0g80������B�.L�s�zðפ 1Y��lKWv�es�t��)Mk^�Zֵ֪�m���Θb�k̳�2����6���>'�Y�Җ����jukZۺ�g�m2� ����(�4�-iEk�Жv��}�X�B��Y`���`����c��9�Z�JV��5�e�Y߆6�G�`3�|6����[uI�p�n�-�����[pL��0�Lp�;���%���8�o��>F8� ��G8�`�W�ί�����"�E^�_�=(K,F�K�+�y�b�����x��� �TՕ0��o�}{�uuuwUWի�n�njmz-��nv�E�EAAJ!*�(��hD�2c�%F�ʦ�Ebb6���$&�����7�߹�UUW7 ��t�w���{�9���8�m�8b�I� ڃ�����7�S�E�G�!�3�����j�㔐=w;�P�^I�A;RR�n��k��LS�.��)�o8G�([��)�9O,,�At�S� ��h y�u�jZupPGx�N�o��n��{��ho2�A�D�-r��]��u��5��e��^��dM�X�8=���r5ͻ^Q\�~��2��V�0 �o�0kC� qA跍����G<� �9���v�`�|N�X�W�I�:"�'�a��WO=}��k�#�"�7�e ��%Vs�~-�y$ŵ������X��w&'q��.n.�E��K�#��JD�ڝn봽7����=�|�w�L:Ӎ2vmrRv:=0P�@D�ۓ��V�Z7eO��d��7�HM�SY�|�[o��f'B��L}��Ʒҗ�V����^�+�{W�=���uҤ֦='j��,�|;�v�A���o=��0�q8"�I³��8���yZ�6Ǵo9��q<i3���k������1%�&�� ���u���k�����{H}��@W�^q�Է��4;gg7���N�y��/�� q���P���OЌL�4��q�,���ԇ�"�Sv�=jL�/U�jC�-w�o���ȍn���j�̮�{�j\�� ��vE��k ���z�>p�n=�^=�ajID(�������qu��F;э�5֮�s7;QC7�U��[�������yZIۘ�ػ�*�!$ �dⵄ��Ŗ�-ˇ?��{��m������f6��po��~�mԽw��o���G6M��oz�a�--�m#]?]?V��k�z��ܥܵ�.�>�)�9NH%�&T/� ��_���I�Ax���O��B��]8(���.v��)�G=���H�P�S�U��P���>f�F�E�-G�G�s|���'?~z�I*���R�|��[`���-V�'ݙG�P3b�'\R��I̞#n�;W��ٟD�T��ѹb8�0�^s6,rȥ��i��������sm15kk��,}��q��Wȝ;�t�s��e�Yq�qC/���0�q��|>�� 3������W�/�ը��s�F�"���s��I�oAHI� 8��C����w���~�@ ����_�(�]h=������r�9���p!�;�H���-[If��w;%=�d��꯵���bmH)��k=o��\���h�E�i�7i:-!mn:`[�G�]���GE,�;��s�yH6�2�ƈs�:��I��@�^\�w���OV�õ������<�g?]�Y{?qK�g�H�[��X��&�td�n�[�,�Z�!H�6#�=nݳ����;O��W�U����G4]]�6�ٰp��7��[�aM�5P���B�]?����4�����P呂����7o\�!ߜ����ؤ������ ��2>8�/p�2�h@�k~ھ��B~�a�[�r��=Pr8�S�e�sc�F� ӗ�� �S�#P��|0z��'�z��S��)��8aFB�FE ��V�r�J��(E���fDp���U�\���'h4P�� �j��<t�$>d3}Cv�f���M�}Zlf���,.��p��j1��t�Y�j�2�lƗ,U������<:�z��t[�%�Y!1v��M�frc:_n�"��7z�w�v��m� z�ui��dt���O��.3K��<y��d0��3l�Ll؞�Y�ĭ~�bg�#8H7��J�C*gY��_��YKi�n��0�AQ���PiMg-c�����)<�9ܹ��JH�X-��o��w��aX�;�����<z�̳�@)��*��rw��|u�`���l�c����߸m1�:���H2yΡ�ؕ�d��Yנ�E�+�G�Z��Q k��P*��.�6�O����W�=���n���u��B��d�u��8�<�7�4~c�8�(bK]4�x�~�*x�=��¿���1T��2��Gߡ}S�}����J�X��ùP��@z${P���"h^���b�ؙJr����`R_3���@|8~� v:G�E8�c�i�]5&4�t��َS��צ�� #�������5���jQ ��0즰���N`��v�! �Ry�S(v ]wB}J]�>u��=�.#Cjn(,THu��_Z��� 6�q���hh�P�4#J�H�%jt�3�M�)�#��z���z���dt��1Dn~�9�/��ȋ������B��@NV?�p'r��f:�;�b�B�QHb�$h�3�CG|��#v2�y�d�m)�e��sv��w�~٬�fp�~��DG� �r�0��^Xzˣ����Շ��c���l& \�`\�8HHa��IC?������6���:5�H;�l��ވ�4C����&�\�F����jԬ,�|MC�ݔ��/f8��ܮ2��� �.��ҍl _/��A���kT�V�Νg�~T��<`2����Q�&;�X�A�W@��@g��j{��j,� �s�uuE ����֟���:�A�� 8,&���ռ }|��b0��lFQ$px=��4ddm7��nru"�N:O�u^��x@��C�G����*�%F�>Tm��?��2.�o��p������ˮ�1�r�\T��١K+L�c���n��:8����q�y�N��\Dv�j���[��ܦDy/�*=H �[0�l�8=���`�D��d&�<����qR�}~��|m?9[�Y {�H�I��FP��H�p;@���Y�����[D��]j��}�*ÞhJԆ�'v^��6XD��L���V�a@XF�k�<������N����.���pV�e�u���p����+O�;����FG�\E��нb�kfy z��s�� X����k��M֊P����Y�_g��#�f��}{���Lh.tMV((���/���4u�X�4u�<�k%�Ņ��s=x�f�Ȍ�ݐ��P��(�.(��q\��+����i}��J�/[��O��k<Ew{W%��҂p�RJ� ˙��$["�H�6#] �F���C�֫C�_c����|=�F�2[�#�\��eyÃ�.�a��nơz�K�9řeN��Ԟe����Uտx��Uw�Ϋ�m>����76�t�O�d�٧�,崅v���2+�� TU[�NHN8�W|���fG{�ܘlT�_��Z1 ���8j �`A����r��㼌��`h�*�b�� ���#����ռ��B����j���0s$n�^�7��w�$�Gɡ;�N .�A>3;M��y��?��zpͥ�Ι��4�aqp҃GF��w�|]��֯�!��ؾ�bv�q8�e�+�)��h.,U~�4]�h.�P4s��)��+k�q�D2�u����ϸu��E3V�⭯�ҟ�f�S��8��/D�]5���ޖ*xWG�j���}�l&k�lnçi��Pv'�6#�������(%��)>q��E��o6U+�6�ŋ�8ۢ��lޏ>���`����M���n'���'��zB-t�/ꬱ����3ik�3 ���55��Z 1ao�|+� őm�� ��0$Yə�Oa��1ag�9��up�9Gת+����b��=H߀��Q1h�T��]�Ғ�Q���^��?������s9��ػ��� ��l��B�|4�TN���YBL�,� g�#�5��A�㉐=!�7~=�/X]W��uw�ZW����避[��Ꞟ�W�d==B��m®�ҏv�?$��� E# �L�!7���ط��!����T��RR�I4��)���H#��l*�:#��H.���)����pӇ� źR�M�B���=�ƅ��(ǂ�͵���˥�>A��,�_��2�%�5�p�yn�6/���Mb�t,�L֮���l+�9�Q�Gb]*�D;� ����{PZ!�*��U1���|���s��{�"�3�\�g�������Gχy��G:�-nQg7��`ԏ3�x���Ax�%ÏU���XMZ�&HX9�>o��s�Ga�� ��'��!�lü��|�EW-��e�b��bxs��Y0��6E��>�)�V��H��߰}��V=��G~�Yk�h��/;��ۇ��0�{4.c��\h`�5��� F�A��5��Tg�[4��#���S�o3��yuy��=����<'j{� h�N�k�6� �@1c/��5-T:��`Y�X]��g~���i��l�p�!��e>�1x06�?�e�oA�s�b���̪fy�b3�@B�߂�Yq�?;�m)�h4s�k�P�����UfW��62��c�>8F�(�t*G�C ym s��r�p�?��I��C�Y:ϻ&͜9��9T�Y�-k���%�)�@�|FF�h�9*��(Rt���K��ǻ�T��XM-IP.%�C"���?�,+ˆ�=�� ��>�t�����U�gQ���W��w#�Υ7���[��P� ��ޮ���'j7��7̗�9Z���I �S����O4YkDE�͂�B~�`�Ig;�m�����u�֢z�Sg)����r��E܉�=m�K��9�ZD�]�4����~7߉R6Hۂ(��j��i!�BldpӜ^���zz拾�g�F:�qꢝk�Wl�/С��uX2�r��TsB�נ�����ͫڂ�t�}}ƶ��_5� ��k�4��� �A;oH�L�Ϲ�)�z�.�qu���A�z��yx�j�k5�F�-��@�lҙ��c�ڗ�җ\6�=� ���O]9�/�5ڔ�볝�\tO���C�T3�f(i ]�w�P��iQ���w�γ�=J�ߌv�Gޮy���[�[���,��Et&Q��o�c�Â��yb66k���MK|�$Y��z%���P��(���^�87D�rK��`��%�5�.�:�� �Ďx=m��n�ً���m]�Ю�&�2G�(-@�Q7xu3%@�p���~н��t���S�]���=�)AG�����A��Vg;��*=�$mz �-|_E�Z�ˢk�<�5U5�fF�I�j����`�=H}���)0��~�F�,"���N�6�k��"��}�Ṓk���T�"$��mZPc�',�ϛ�tz���Յ��];+�j��+�NG�>K#�h-zp�6\��;y��b�~�9�.m� �\�=�qrqü�=fS 6�u(����؍��3���#����0���� :�Nz{S�M�]"��`R������.C���r`-��U{낍�z�n�q�� t�x�� �ic+Ԛ:3Y��㳙N��*�a�V��P�� �`�1�Q�b���@fc^X�9�̼���ܶ����jtҜYӂ��hھ����3� i�js��+\�8Tv��i|�Q< v��߹c�8�1���-��t�������\1����6���G���I��n�J�:̇�h�X��G��r�+��<�O�|a��l�yxuco���7狿P�'�j{���G�w��s��ʥ���s����� ?��?kL5>4��Hj��v4���l���!���,��c�C�5�4{�ٱ�4d��R��~��p�*;9n����C%d��}�d�A4Q8�i��O�i ���T����gd��ul�U�S���A�q�$.j6U;�MǶ�ۏێ�ۏ���j�9J�D�vAF��b�m�LOI=`�j�f:��>Iǁ�J!� �6T�xư�qn���̓��S9�ĀM|�!ґ8X)��h�ͅ��ͳ�(����,�ӌ���2����+l�D���3Qɕp�$`�Pt�[��� ���DV��2�op��o%x�Z)�����n�:p4�N)�F Նt�T7M�u`8��P*r >�(��O^����tX�i(��M4! t(�>h��cU��<�@��ܦç��$�M'���(��J�׳��Q�܃�<8�Vj��j7P�?Ͼ;�������_��!Q����.h|:B��)Ӓ��xܘs��_���d9��aN=�.WO.�\|�_O&t�k.�".D�p53�͓ 6�`8���I�u�����Kj��k/�����wi�U��S��us��U�lr ̥;��ѠMe`�T���B�&��n¦\� g2pd���[0��O�v�z����I�'m%�4���1}�@�:įZ���/r @1m8_.���W�R���lv(F5A�ս���~]*@Qؿ V�����g��M܊�����:M��ʞQZ�㖵��. H��f��J�wK�IA��\������f7�z��l��}5�V��z����G����Ɛ� u̻vߋ�a��ɰ��Z(�S6W�z���7e��k���[j�����#6[���6i���Sڣn��@�d��`�[��}�i�]<{b�N&k��G�[�Q������`E�������k�$|'������GO���R��4: y��X��1d��hz3T�ʷL-�3��D�G%�Z ��b锥�3�I��陌R�^cy,�3��P!�@�ieNq좀FS'}@4�шÏ~�����*�T(�P���Y+�=�!?�}>�Ю�+�����w*�3�U�����sƽ ��i[�9�a���\��u�We�Y5��� ���+����,��iK�\��ʚe�<����z��K�C�&�Hd�bktݩ7<��Gh��� �f�O��fp�+d<�8�Y��X��(�ϴ�s�>!;B�TR@J vK��U�8�bU�H^Q;O�k�b%�[Q�H���O�9谉����0r�0��}����U��>�ʔV5^����ܵ�����}ecF���mۈr���qLEl�� "�I5��ڦ�fU���2c��W+�O, ���MJ6���y�?*�0&N�ݚ�xq?�)��>�e�(� @��qT�Vx��>sjA�i�2W@�W�<K������P + �i ���4�(ا���� � ����xA��̓�� 1Jz'O����?�<L0,;V|'[�9;j:[��B��خRk�nC�.и�iޱ�T���ݝ&[h��5V�,�R��I��N�{oF|Tn�_|Q�W��>��U����{L�Г�K^A'�96&�E[h8�����J*�X�>�w��yW��+��V���c�*��Y���P����!���3� ��^������%�"��`�ɒ�R������cD@�2�ܵG��5g��L6}*X�l틵�\�"������*����p9������B4M�z�A����65L��.���2�k,0���^�>�G@���@H�ty����Z4iepWt��A�h,8�<{9Ƚ��ǷƶwZ��OY�E�<���Z�)��t#�/�崐�\F7ʔ�B>(���&��6�ld�i��t��/���=�n�>?&s��]@Ν�0Z.3Ĥ�9M�G�6�XI�J�H�Xa�:��C�}��3����6��~>�D��3��U�O>[vZ_�}ס�qN!ʃ� ��-�W� ������� S���Ha)Y���'l�g8=�`z��(bwv�����i:2E�!��`�;x�,����Y ������ߩ���� =��Іj^ǻ��Q�^��_�Yy`���Q����[&aY��Q u�s0{&m胑*����j)���T�C��$YQ�>*�P����}H��������˥��_�7��!n?Vا(s����O�GRB�X���bG/*b����E��(��"�lrʔ$Ϋ����dJ�wGp6��� P�/�#j��mtC�R0�}B�j̣R��X�v��I�>(�j=���:E�C�t�V�:O[h[5�"u�E�3W�. f�[eܫ8�P)�e �0Rԁ��d.ُ:~}����t<)��/Q c��O�B��GGp�<��"-G�-b�y3�b�#����5�RPCk{d˚� ح6�d��]������L�d�Lu鋶 ��LCz�Ӯ��IYs�;�A��@*n�yڢ�����Kˏɩ���E���W���eM����â��x�[�*u����-z��җ�rizH>�������2$�����=�_�����j7�{�!�h7Ύ�|p�fs%9LA�Q,��2��WH�(EEug��&�/� $̃cm$0^(K_�C]D����i����+�/�TR�hOJ?��N���ޛ j�;�쁳�#��ISm0Q�4W�����Տ��5_��fd���"0�ԏ� ��~D}��R'��k ��GK1(���_/�T��F�Ȥ8��>��Q8����m�.m���s��t�Á��-��`wZ�a���x��x�";ͯ��2�o2�:�h*4X���-hW�3sn���P,ɞ ��"ޗ`7�Nw8ɐ�D\��� �(,f鄝� ��I�M�|؟��ն���k��ÿl�5�n�v�xL/L��M}��ݻ/�Е�um�.�u��m�d>�Nh���&k�Ե-h���#� +���q����s�}v.��L��8�c|�P=/2�,��T�,��\f��x���P!:*���}��uL�v�yj{C��[�� ���^�܋�����lV�͛C���Z��k������9�~�_��+�2_�ʗ����7��%�\~�N�V�w�|�:$^�fH����-l6��[D���n��i�D�>�=�}4b��=�U{��x�C��u���:����6ݨ�18�=�Z��%�ܓ��&��?i*�V�"��z��,K���=�,�5keb �PÒ��}aM)d��Ő".Aǝ�2�An�K% ���%7;��QΤx9:�J'���s�������9��:�(��w��̿s��lt�W�����N�~�+lA�ڏ��m[w�7���7n\����W<9��-N�߹t���i�?��"�;�i�w�[��;L�vP�2�z����r�g�k�cl;#��E�*��b��8�*�<~h!������:�Q�@�qӼek�/��#�@w��ꪫ'��� ���r���*2_�2mp�pm��"Oގ�:�wFgR��ۜ����������{z�h?U_3�������m3�ؾ)��[�_�.��/��d�� j�����G�̨�.��+{����7g�|�6w6؟>d��5��;{O"�-��<���+�jaW2�2�����p�����W�a��g��y6&�Bh��I2%��1���S������*�[Ϥ��F��۷�%nwT�� Q��Ķ!=����00!�dP��$O����j!%��l�6bd������[6�,6��`^H�fɖ3V߶[��8|\��M��Q ���lƜYxj�?KO�3��ٲ�%)���)JrGƼQ��̼)���2c�"����^��;��@Y5��u�!���'�h��VGTi M9��#�(ן<�4�s�{��������@�e�fQ`�Gy� �8�L��"KB3�+��fOx����_�c`=C@�d�-T�Oj�+�Jw�]��f1���J��� ��-�L��[,�Əv�u�&}��z�)Aԫyz�X߶"��M�Ww�P-蒺Mr�k���� 4�4L�ZvɎiZcK���U/N��j�a,�a����!"Y<��]�K�����-��������{S��&�,�-��l�5�V�(��DSJZ�������U����+�6��U�Ԥ)�j�ȀMXju5xk�O�x�kC��f���>���v;o�Ău)O[���H<t��_X���4�i�+*�d��Ԓx7)�l��O=��R�|O��h�\��ؼ��E�RD*c R?ʇ���"��bL�+n�wSB��IZ���^��ģ|��r#R�e���A�>����%��rJ���r�ZN���C�Q�n�?|��x�����_B��*k��gY�n��3:B��4Wͤu�Q�������.�R�M�F�2���>��8�G�3J<Z�r���Vŗ�Y�~P�9��w�;�< +�iչ+�5�D��D�hp,;ʹ�j���fƼ=䵫9�� �3�Ƒ,�@�('h:���Ƌ&m��TkP�q�8��!�ä.���#��Q�{�=����=4��V���#��m���x �_�)If�C�#y��F��N������� u����Q�R��PQ��y��Q �u�:�]�g�*O<�j,0?��g`O�N\Z��\�F�k�rIݝJ%QM $%G�/-�S_hz��t�>U����֧�c��'��P���fՅԭ���ں�o�>x�,u�����P^��"���������yXdc�i+�Y�_'�z�����6~(+q$��U�;{S<�^x�Gn}���ou�vXt%�&3`�.:gA����'�%��O�0j�@E�w���:���м�jd���q�g��e��<TCB=�nҗ��Cq�+���d������)Ӫ�L�Z��&��ίYْ�bv���sm��������k'm�xl�0�k"���ȓU��\��{ӲY�zY��.T���Yt|�"�������cK����:6�.4L�S��z�D&D��LJa|��+Q����h��_�}�e�Ξ��z�_��� b" P8^����Џ��>�����4c�&ū��Y3�]��*��tI�*� r6% ���&A�R�^3��$�p��,a2GÇ�}O>W4�7�6Ո�n7[�Y��Nq����O�e�cu/=�cm:&�4���C�o��<���}��i�A�O6�ă�N�Y�����m�:�̲f3�J�"M��K:�Ek���:e-O��7� �6��;k�h}x�?�1�/\���g^��y}7�|�4����q���'�7o^�� o.�Uξ&�d�5���v��� ���3�_P� Mp���Ĺ�V�jl�U� ��a^vqǹ�܈\��?虽쪰��:���Oo���b2AL2���9�zXv��Q� VUq��^�k%@���$Ǡ��#�o}��Ts�cFW}�$y��F����$y^2:�����l4�/�m�a���Խ�&�o�L�3Ѥ�N��Iq�!�#��ĺ~������N>�0=�ٞ��bD�A�w� ���O��h��C���Tѡ� �����֩F�I��.��M[�V�#�Œ�3�z�e�{��EvceR]� � �ecsER����n��`{ah��Z]���'3W�0v��Ix�V[mQ�8��f6�4�Sc%�Wr��F.aR�6�a��Lv0�n���=,L �Z�BU\���]�a�JX��L���7�e銛 ljQƀ�c��H�j\���}MG����ޛ �[X@"�W�dNS<���+�������#(���;<�"w�~o�myL�'�D���pEb�Y?�~�{{����,o,�RD��(J�bC�>�ܶ�_�dՇw��f�f�s�ܦk3�ގ&��~�L �=�$&���Cyd�"�le��� ��tQRʉ�@*��������7����JՄpC��#5-�V�g�o��!G�i 4�&��N�pO���oխ�9�k�'y=JS4���/�;�٬����v�Y��3M�iB<� ���(Yuv<�9_�m��@|zU�� _<'�;��^;��#�b})�K�yw���n����o�%���6��,i7�-+v�(�k6i�c"Ym���=t#WRT�����m���R[����na��<���j X�)G�VX�,��gB���&blц�*�ϸ"^(���^�Bk(tǒD�>f�ʭk��l�W�����(�I��d�r�U��U5=^�Df�j}-���:�$r�p(��<M����zM���Ư:|�%7L�>%\�x�+>w�W� O��u��� gq�/�,��W:˺/Ɏ��+�����y+�&��Lo)� ���@�[�@e�x���b�i�u;���:��Ykw�[50��x:��r���s�S&_Xx��f[b�T���:7ak�}���Yx���<5����r'���(>q�-��p�r���o��ɴ2��H��U&�I-K������m�h�ɠ\���YF���Y`��|fM0]63���B�w5�%#�'iH(�8�[*�k�.�Etc&a���Nm�V�JQ�K�T�M��b�X4�?��#4c�왓Q�,<��v�5���?J�� [��J�s'�ڛ�iӒ��Ӈ�C�>�䶵���h��Mz__�m2�7��b�2�HC'��� j ,J�N؋���� ��Luq�M�Z�W7��'./�^L^�DL���%S� ������n��4:O�W���^�o�f߷Rпl�q�{��\�PȖ叙y4*x�Ba�v���� k��x@͗qY.3�HQ�F����|�:r�Ɣ���9`P_�SRL��� 6b�|jAn~<D��N��"�u���0��Q����\�� W��u�ާ��fn6�oH�玤�N N'�S;���)̓vG�vejO��XJUP��s�p�����s<���4�����}��a��m}S�j�T���Y�Cheubm���20�~�t��'r3��:_H7��M�笜�Y���rN:1��!-��z��\�M�a��P}���l��&pq�6�*_U�Y�IG�~O����_KU8��FT{��t��(���av"CBf���_F��;Q��n�qӳ�B$MU*r��g,�^��GD�,I�H:7FD� �Jl���k6��c'�]�u��;��&��Fb���F��iB�"�&͙Myk�U�����P�\�M���]J��~q��Z JP�$5K���?��1/,# K:I�)�D�o�Y��:Mg�!'�S��$���M� }��Ê�N��~�$��Ū��3�w��m6�]rs���O^� ��ll 6�H�{R�vB����o���Lg(�i��Z�hVd��˂��]�w!��r�<3��H�/����7Cy�Y�N9���Y����@��Lc���eY�֖�Y���$�rz�2�d��k`����8v1�gI1�"0��k�~��,��c�$����ty��h2�^/�sv���骩m{��T���UM~{�W���Ï��ɿm���k�U�ٹ������?��΅s�4a��:���Z�D�g�;�@�V�ם�4����`�gلw]x�/���g�o��L���v�w�'v��ڟ��ڔ��y���K<+<f�>�Ǟ�����~NF�=ΐ7�.'�h��ٖ�}�t�)v�SK4�Yԉ����s]kW��N��-Я��K�`~k��R�-^���"9BF%`%5��S'$��^\o��;��NKM#_5y�<C$(V��*ޖ��Zj�����/��IV�Z��et�M��k,��x�C_m��{�ۏ\�ʶ�k@1�R�+ې�.����臬������t�и�����l���=C;�x�|^c&�a=w���9�9��p�t袋���7���1��R���1@e��a�����<�3�w6��Lj�( ~���n0K��M.�� �E�aR��I��W�1[S���,9p'��Y���P�M>�r��֖ �j����K�g�M�dn7Y n� Nl��ݮ��m�G��Y��N�̂0�9E&W�K��b�K�|�ĸ������JﱵWr{�ݷ���kQ�cZ\2�R�؛�O����ۡ��_��h]��Ը��y��&܈V��;~��M��/��n�߮>�_���[.��/m�2������A �q�J���{�>��L���M���8�A��f��]��'�v�HTUO��μ�Ń���̚u\�eA���b�~�u��:�y���nw��������ݥIٸ��$j[Q�����V*b�聇nE�C�*�ZɭE�o?҃�&k=�t��#��=�K��T�rf�W�Q�jJN^yٔ������Q�W/����O��o�^�rr��j��;�N�M4I���`0wϚ� _���ߜ����!Io���uz�#�3�tz�i ��k�j��m��f�L�'��k� ^9�u�Dћ������Vn�Ǽ^����߲r��n_����CSC ���"�6�Gi1#�W���0=p�'��]�@8z}�Q/ F�"�̒��&=�lF�w�d�F3v1��F�uDFY�V�'F���`.bN�u�䡁��V�l�|I׀��ɷ�*�~���)���Z�*�!+��u��Qv���C�M/��vԂ.q��c���Ys��,������wD������iN6� Y���r�L����U߲�[cr�c�q5)V��!�c0�31;�B0ތeG͝Ua�V��NU�e� �(��;�;��|d���;��_T��A"�?/}�M�i ���;]��w�t7W�Y㰛�n�����Ng��h7���E��B��7_R�E=S�x�V�5P�s���m�`�ržYa�������z�Ra�t�� �k�����_�F�=���dVٿgC��j��߇%��T�}�[��n.�Z$��Uq�:�ۛ*<gg�n�Gh�(U?.b�=Ђ� z��3ek� 4�� v^�QVJR�T����+N�1�E�y���D���;Y�C�+�dN�A݇n$9�M���Ay��hpJ����=^�蹭�%[ҫ{���\r8L^Rڠ����g8�ޥ~�a�d8U=�gP��'�1�.#l� ��=ΑѬzR6��np�~[�E��fn��G�+y��|:���f���E˻�~E�M�ʟ�]�����f�}jE�3�qMOϚ���{��d?]u���U?���#�/;��s�~���ؚǀK��-�6�B��'闘̵�L��gc��g&�=��G��'� ���}�S�唩���VC�I�s�y�����RCM�)�r�d��7&UC͝w�4�N�sc�a7�fl���]t��Tw�ݵFè4�o��u��֍�2�B�>#o7(���J~j�E(�EM���-P<��n}�en�pt^��� �^<���5�fͬ�>3���/rQQ@��Wヌ�����(�Q��Um��)!s���G��7����ꜜZ�4��� �� U��l���ڟ��p�d��:�Cc�e���'s2�E���;�u�*�'����$�]"���c4��}� v�zyDz�ɨ�n4��bTF�.b4R#�P*��~6��t�jt���ŋd�ۥ�y1W!�ןD}g��lْW_A�4R�/�u|��]���P �Ǯ~��:t���[�����94{-�.�ǀ���y�A��0�� �x��6-NMv�M$�c50g���hQ6����1���B��n����W_u�s��;B��E���g��}\���"\�a���Q=�#���ͧ���վv����1�ŊS�Y(R.i�[��9��Jd��QӜ<0@B�Nya�)�j0Vh�2쬄�s��O�eP5>I��~���1!���-�A8ag�j�Nq^7�6��e��/�쾇ݳRuԢ�Z&�U�EJ��l�p�Yo�<2�"_���:��97�9f���阎���.�! hI��4 Rk��Cj�G�Bu+b���tQ�P�u�/А1��TZ5�����V:+�zp��8��j����y\ST��!�zr��u8Y۸$��Յ�F�uFY���Tj +[k�j`�GŦ��+�yl�֦Y닍�4R����,�+��h"�)=��U�>���yV�˕!��V]�Z�8G_ jW��p��H�� ֬Q6P��8=w�Q9�]W���80��9���{��z$�5��p�+��҃D%ꔒ�-��R`5CbJi��h�EI@����x�Q@��-�J����h�n��א!7���#ם��Y ѣX�����2��M��n��Ɣ���i&�#i�x2n�B��~��#��}2n)Ͱ�.w��o��B��(��Y�k�"��5n��G PTF����;�N�Q@�(�奣$���%l7Q?��lR��P�fB!w�ҤJƝa�îG�ٍ�J� �vK�g�WOӬ��L_�$��t���a��[!i&�M�>J�LBf�R����%�ۣ6!�o����"$�,J�{�l2"Qo����#BQ'!"#����H�:�. o ��<�9*a$ <1ʔ/- ᪠(J&���$� f^o�ћ�<o���n�!����A���E fl��5 ��H�<�o!ͭ�(�p�N��tH¼բ��.�a.�&3�!"I�:L�fsZ�0A�:�A� RE�E�b"`��\�`qbѦӻEA��lr�Zg0��_ �X0JX� �Щ��9�1��"BN,�b�q�H/b�I����2&0�6�IM�U��%U�� l�I:D�Y%�Y�K�xí�AЛt�PG$Lx7��0lĤ'vluۏ�x���!"Io#�E�NF.�`�E�b�Uo���˘'�\�y� ����~ّ��$�(�d�Fnd3Haz���I��+F��#�&�z��h$�Yg�u.����X���l��b%��N���[/���*W8����BV���0f�^�@�`^y'/T�z��:h��M�#�$��<E�H,0���A��o�a�,0�(�i"!1_E�63�;�x���Mr��X�v�uaQ2���C_�yY��#"/輘�X�Hp#9x���1@1@� 6� Z ����m��݆�Q���D/��.T;O|�`1�e7J:�^G� :^��&#�a�A��$è :d�z+ a�(�~�d�D[��i��F�XVX��DX�F�'� :Cqs�����jӎp�q��2��E5!K(����K�Wk̙�g�ط(����h���P+���R���^Q���-O˻�h�@�&�l�o�%<x��j/ޅ��G6R-V|l��ht��iL�`���xlhY9��U~�S�㨆ӵ(�`*�J�|�u���(��xn\T�"K��L?� gKl/j����P�[�&�cr�n�l�*�oEŅ��u�̬�dU���F�W 5�\�1�v��C@��4P�b�|�M��e�^I�]%�S!W�}�`��*�_��U�<���(�cnu/�Xxh�w��� ���)��k�0T�$Z3 ^�^v����1e�F��g'P��JAR�#F��,+E��Y�@�'��C�K�_}B}�~:@ŏݏ.��g2��K�.�L�KZy��,��ߍ��6:&5Fs��n���-Ț\%��۹I�dn ��[ɸ��@�i��5�]�i��v�$��t��W3�L\� C^\L�>}��6�,����+�7��� �g��2�.��;����H\Ұf��,-Jǒ��Ew\��B�wjǎ>�fM�.��.kl�Dj�.Xv�}����mW\:5֔j����K�ضV�3�B������S��$l��&�ijD�YdIO�~q��!�rW��)\�3� H��.iT2�R ˔D��'�i���>-�(*�Q�����o�c��$`������g�#A��ꆘ���0�����ߨn������7.>�x��;w,yc�?�Ơ��3����6I6��1�q��� ���($�����,��Njwܴt�r(y��h�2�l{s\p�@5�H?��]�J�Hʽ���<l��n�h��'�1��P�mϣ�So���7i��$��½݇�����a͙�~}�Z}gP��$���6M��h������M_:�~z�{�dZK�e���:s�/�bR��+ʤm��.F_�����-m�AE�L��ǭ��s;�;��\�激��q9��:��L0��hֳoȰ�h�mS!��S�b���f�D"N��� (����(�YqG�"�Č��;Ck%�mD��D�͙mvKa�5:p�5��<p��Fi͢=Oӛw�4�->�g�Ihh�h�{�� ���e��f�� �zUs|�+�D�W��xst����-�}�"��<;�p>�#��?���X;$}�u�pȖ�ow/�&�ν'�dޒ���M-�3�g�֛떤������$y���I��E�uR� ;�5�It��Б��f<�n;u->b��{g���-:��6ާ���>�k�0ڹQ��s.A�,1��xB��U\�tBBA= ��)~�3�.{�ҍPa�~�OBP��:s��QS�=��:Uf�s1�K�ɗM �@����P����s�y���gQ'�)�_�@\l`�|N�1�6f�p�p3��,Y��,w�Z�1��~ט���On���oy�'�Ǘ�lfC��W�?�Ot=��Kz ����(U�QC��dP��n��.<����=y�]��S����d�2�K�Zu���{�d���^�&P�^ q��h��E�AakF�Q���7>�<�~̈^�=Qby��A�s�X� Gr9�A���ժ���`� ����Ε�Mʆ�돱��,����,)���4K���ݑ�Y���Z���?0J�d\;|���h��~��ki��?�e��v��宰�����K��v��2�)i�9J��cj��~�Uivo�� V�ʍX�~�eC�k�ˆ���Ɔ�K�ڰZ�n�߹ZX�ko�n�퀭���:�h7Τ�����G�+Ș��}I��]Sfn"u�!�`*��ئ(E3 ��M�N�4���j�nRX�M��Gs/Mtb������RS���{i��+�-��v ��a�J���u�3�Z/�WS9ZK��]>�Ɵյ�68N^~�i�>v$�$�&x���;�ό/n�Tu������� �_�p��d���R7���#ƌ��]��Kqk�^:J�1�)Ǥ5���$�2 ;�ʗ$X��[���Z(ޜ�h�J���7*�%2E叙#����z�g��{��hLK,����M�������#�ǤOkdւ�n�n��V����Z��Ħ��پ�[���ȷ����kV���%��ʂ�:�@S>Զ��}��S���~�.��vm[k������l&�ż��V�L��s��H��uvM[2���/z9ն���.�S<#y\�6 n�G����fmȬ@���xʃEӻe���iwX��D��v [#:b��L�_�hkm[-�Nٌ�E��Z~�emM����%Y��뛮��%���Zbt�h%:���9}6xn��.��^%,uXF>�.1^�x��o��U��Q��O7��������}����\�1�B�,53V̒ׄ���'Ō�z�w6�7Oi�6��o_���rU���qp��,�1���qOi#*�n�;6������F(�Ny�'�+ܣcT��q�<e����LA�"qe���Sq�x�LPQ�W��Q�W�y�h�Bf��M���(��[�vL#���ۛ�Q�}�;��Ε��˒-�$�glY�o+�s8q�N�er:��@B���p��&�*АB�y �����RZhMKy-Gۗ����̮!��>������3��3�3��~x�h�4[� �A�=,O�c⋢�rx{�+=�.z���f�G�A=��SM�ϒk߉�kѥ1|���u�g�<D�k~>�\==j��=$��rR3�,��xٰ�U`B�!��"LQ�� �Jc@(��{˯��F�/�����4��3�i��bM6A� >A� �0Z��������(� ��zc��d�I Q&������Z+8L�T�W���&�� ��a�Q<a���"�*F�S)1�^T�}uМ�5`��-q'6nh���־�ڻ�O��%��3<h��%r�ܿ�e�� :b�� VY���z�l�N�]6��p�/oyiOc������5x����r�M��{�>_�ؾ��v��5������>9�X�ru�ʓ�3�r0�rd���e��t�|��¶����L�d_���*�5�hct,g�}��W��i��\�<�c�s���p=�i�v6��l��۽�N��8��E�߹�����ٿ}aq̈́�s���+Wߚ D�ٶ�D^�؉>[DP�jq\j3t��h �d[�)��7r��h����UW]�jiK�97��� X|����/����>g],p�K�4�Y�W_�ځ��/&���-�.S���0����+���0:��A��H4bc���7o��|~۶�F�y�W��ub����^yV{1��� �o�8�����S8#(�緥~���w��jҢ����6��ĉ�"�h0P�T� u)�� �$�`]+�E:�E��q؎�W7jD����-7�(3�uŲ{�Q�l`Y��$����OC�oɊ���= ��;h�>���E3g^tP��e����N�B*���ʘ��!x�%� �֙�Y}IK %�ep��H� �ZR�́�H�+!)�ʵ * 1B�1ˬ�B`�>� &�)ç�� &�� ���)��,~�)|H}��ؚ"����od�A��[�aO:)�禓�G����wLr��(y����ļ��C��g�Q���#[U�N��84��~��c�!yz��ݰ��ҔZ�3�;z�ss��.�F������M�ؾ�1F�SI`A ��4Q�ByE軼a�"�Oi���P��S�b�nByḰ��XK���G�����`SVЍC/|WM�߫ʪkj��v�!�:�|uQ�(�U�Ϝe��]N�#h<;�����v�U{�}���f��j�H�%X&? V�u����~���V~j����6���A'��MY�v�M��!�GP۹re紳�� ����D��k�����/�s�)�k�q8vI8��#x� ���G,�c�?��;_�?��!��sy�ٯ3��ηw�>w`����||����t���u�P~I�����hh�nE/�&�j��y+���ٸ�uT��S6�o�o�O�oh-N�p8ޗU��2$�u�]������v$0$�� c���߂��S��T�6��h�Bڭw�.ci��[����ҙ-:g������<F�=�*ǫT���9� ���r��%@+�2�u!t�ޮՒ�2#��ލn�A7�A���YQ��Ⱥ�U���ax(�Ę�[6��b���8���{`.�92q��+vK��$ 2�+���p��*~M�r����Vs\IΤ_!���j)p��j�f�]_^ș�P�G>��*�K���h�q��{F�A�� �lW��?}�'�M��R~<3.(�[v<�QHPC����c }I�br`\~`8��{�;N\�w��Yu��I-��U'N��y]��9 ��Kp;�+��I^����^�V۳dv�9!Ns�߁��_倻l�1p�~�G��� p�F#�:��:ԅ�[��� H��˯�����쀿�":s�-@w��;1n��3�+���U�&���97��ϳJ�:���W���ja�3�,���)���a>�� ��'Tgx4J�A�]ԧ?21:��yA�c4�Qd�8�`��b���4�D�lu�*�l��.]�&'� ��N�Y �?�_EJ�OG�#�y�n� ^��TA��/UB {d��Ȏ��U�}xX�1r_i}~8b*��=�^]W*s->��K��d��fgQ�U�(��s,�Ze��M\�����]2�)�1 ��$l!?OnG'o~��P]h�꙾V�'���E���6Fo���/�q��+Z����jz�*�S`�O�Ɓ�| M�U�a�����{o���0�3g��}�(骪�5�J8��+�5O�OWU�$#��+�����Z �J,�2Y��i�n���>Ŗ��X���p�'E!��4�l��i�� S�(�߁T��R_ʠ�̈́�$^����ŊM����O�wޯ,�cӊф惞�\I�`�T)���&IX��3��W�� Sv$F�ݸ{�e�1�fH�ț�aw�(Q �\�9u�\����O�x���7N�Ѝ�%��hۑ\W���TT۪��˻�Um�ʂ�j���r����S�-���kU-����n�E�*+g]4u�,}���뮻mf��msM����X���9�U�uu�UNGQ>+���U���UG7O���(��Y�A!��9ې�#I�%�y���\��gf<�/ ��Z-H��L�HP&O���E�Z�:�3.&0B�}�H������`n�(�.�Y�2�,L�~�]��Da��x�Q�`2�:��6_u>�6��)+���{?�D�C�<���Uk��mb��~�c|T��`�ᾮ����&�� >E�7�"B����1�����;��/��� ʤ�A�$v�Bf�������Ytج�G_))P@ p�7�:�z3hfa2 ������:v(�^&��m胍���ɛ�7Mi(�&�+�;��v�v��&����1��S��� {��\ر���%���W��[�7m�nYm}������5q�oqQ��ˊc���^��nBq]�dZ������CG6�\i�9I/�����`��b��}��ޥ7���5!���pa�r�H�ٰ�) |��\����n���@s�؇Ӂf��s�j��Z�V��+m�#~xd��� ���Iq�|Y�;$���`k�G^i[ي�F�T�X� *�Ql�N��+����xD�Ց������-M��L���[J�� ��ϧ����},��i.F,2"B�G�щ�����0��~�Ie�O��Ö��[咛���o���}�T�a>��ľ��/���o���z>�E}ʋ�`v�z%5Q��l��ҥH��+�+��l6g���S�Ô|�B��h�8��ڱ�t}C_Ꮐ֣*�=��d�[��M{�W�J���fw.a4��4���D�o��*��V��VA�8�sP-��Ҟ�}��A���"� �@�"Ȥ�����t0���+|�|E�4N��Ł�ݓ1 �9��)*���Y��Ѷ����QoP��@� �J�2��::b��?2�H���ϴ����3�Y_�n�x[��b¼�Y1-��M�ҧ���i��.�#?<���e���n��g���_�+�w,��1���?�Q�`���tt@��܁� �w|3OQ�������ozi�/#����@ :�ۨDl���#����w��w k�h�i��Sy�I����M�@�$�I��g�QC�3I/���Iү�RО��c����}>�\!��Б��c�k3Fʷ�8'�חe�d($lٷYS �hC�:Sl��i�,�ɯ�䝂�<d)r�$�S����Ib��T�^K���p�+Vu i����A�>F�i��$��柌��t���n�_=���Pp��T �;�(�3V�{I�D{��iEZL�I ��sҢ�c����"3�[*8#��^NG#�c�`4�cCf4q���&������E�:��r�@B��$�=��D���M�RI��'���04 �'yP^�?R���xS^�3�Ԡ��j�"�����!���p��sm�h��g8�����G41$�G>Lx���Ny8���.'R�ԇG@"�L��C�8S1�I�.u�ߣB�G�?>�����sj��6�خ0FƆ�{�1�7qD����X�SJ�Rʳ�R%F�L!sM(�~l^0�������a�v$.��X�V]�Υ��t:�J��t����1�"GЏ�e��C7�aR.#*�f�E�|[r���X�\�p���M�[�\c�3�����`�Z�*�؇q�fPW3f��!�u������6�����1SJ���rm�o��XQ�N[�1�c�_.ʁ6�a<������K�#�QGRs�7�gc7�P߀s���ޝ�to��s02z�r�����{V�{n͕�{6>]y��T�Њ�X����(�|�'���h����%"� �����{�i���`./Md�!����]Ђ�[�x��C9w�<�X�c�pKC�a��bP�#lm�Пur�8�/�^�W`���Mfs��(=TA��{r���\�X݃f��?8��:4�g����d��<�Pm#�4Vo-Y@PV��p �׆9�1JȺ�C�F?��!i�&0���I��SH��H�o 7A?�U'S��C]� 7�4���O��z�C$���=*E�L��@1NfY�oȒ�:4�����#�}n,�uN���\}Za�gi���~��@S���d�&l�'�Y��p}�@�&:y�0�o�)�@���}H�U��q����Ss��G��|����@S� ��$q�Os�I�#KH�OsY�d�Y/�R�����&5�@�ѩ�Ff����k.�`����G뺦��Ÿ~%�0iB�7}�y����1_��w�lᆬ��q�_�M��R�uŐ���p�t�����{��JH��E�2#�f�,��t��D%Q}�:�0�Z`�1�� b������W6K�+���b�d� f��e�+7�r�JLZ+S�!�}w�P�3�wi-V�6�u���o�+6�]� �`W��d�d)���P��L �#,{yi��*�+��ӕђ����� g,cʺ9^V'��0Y�2����[��g�?��)M�������~0�9?8�21�����^:3y��+�|�W�#�ܻ�oط�� ���{^GǼ�?]�M��=p��K�W B��K�捋fljh9i\�� ���ȜE��Κ�Ι�v���ÿ+~긇���}�$���9�3&�E�4ɹDR�u$���c���<�a!�;���Ă��Ȃ!ŕ�1/嗋X�v��`�t�K��e�K@H���2�Ѐ�8�6T��jLeˍ4�T�,� .��7:́�b���x�*GASt�=����I��,�"���G^H�Pu�e��PCn��A� �G���W�fD#��OR~^�e����*��\�����NY���LW|i��=��<��ѵh�ώ~<�h��o��Btt��U��]Ns5x�O��|�2�lm�6h��ݎ]7;��S���.���i����ZU��\W9�?�[��ڜ���Uj��u��rl��!�.������D߄I����D1 �'�G�W�<�Qf���B��*1S8�)�Z:! )QH ��IZu#��v���Ro�o������ 5��\G��zx��dT�f17e�E�X����\9�ZAm�vP����{�Lj� ��t8/��Ҩ���9��ӥ��%���}����� �{��_�<`F��=�2!���1��������ʔ��ۢ�n�|�����o v&F��H�/�~�_�:$���n��Q��$�ǟ%�~��:���٩2j��2�A���l0�l�Z3�q�єɢGĉ�k&b ����i[���cu<~��x����sE��U@}�Mt��nZ4�01yS�Z��&�l�^}o�_l Ev�k�����`�oM���M��`�7-�����҈����lXd�m��)\Ԩ�HA�q�j+o �ƥM�,Zq�O��,�eT-5�ڂ�C���$���(*��9l�R�:��j���j:��+�=����ҟ��F���k�*WE���pIk�� Y�j.8��J� ���� :S�5��G^М��F���m���.䜼����CcT��@��%������kKH.!�% ��ud�)�kAA�T��1��x�7�*�\�y��p���g� *����5�U�ftL���1���ń��Zm�I���j42`���W�Y��c�D1��_��-����D�w���|㟥lS�2�4�B���a" �OR��z#2���(Klq�h\X�*I��_-�4V�.��7&kxp�����1��*{cG�I� 0��ݻ� �q���M�e�O>Y��c�� O���*Eu�DmO[,��� �f<�a�#$�K�0w �>�s� �6�W�X�����6�����b%���֢Bۇ�ߕ"l?Y�k�Z��&��|�l� ��!��\I�8����� �|��`�&��1���1�P�/��IK)����){@'ZY�hv�&��g� @6`� wE�&yI���IJ9D�I=A���b̚�|�/����H���u<��R 禓���̘*���Y.�F�E���vP�ߡ��<�ݓg�Z�E��=tL�T�"&ǣ2=��"��ǾG GL `Dg�9��X�F��Me������ 8�~ErnE�F�*�Mlu|BWY�Bv���i��J~{��^*/m��*X\�wt��˥e���R,k��T��$�ӈ�� �t�R��6j����<ڭ�'������E6���ZhP��q;��q>D���@&� ��찇��NQz�^�~y� ��@^,,�Q��`q�q__X(.l�{^��/�/T8 �c�#*b�i����&�O���a�S� �l"y�$�&̲D�s7P�u�� =j\.Qܑ?�҆���|r���z�4�ʻ�}��ǃ��u�fůs���fB�Q���B���Ev^M9�4�$?��8<�"<.��L��3�j��L(L5��FV��w߽wpf.p©��M�n�c^��8(Uν>�n�.K�e���y�@��{SF׆�{�`�|���73���7K��ݒ�pȕHd��Q"�p�(@dY��T c�T�YKKJ�+�V�O�wd�C$Zѧ�tH��ο����n� ���w��?�&i��G,��� 蛙�������|шD�>y��A�-@K��#��L����җ|sĩ�i@3@g�M��/<�X��6t��\��_���e���y�̺�q�*�������+j�/������2�����<y?�1!�Ak(���+����݅b������� ��K�Ev��_��X���V�!���{Q�:�_�����u�{Zf��u�>�+&�Z=�9s��{�] F�l�Ǝp7�@��Ŭ�7G��/Ð"�^9M��4%?�}e�%C�i*�fFi�i�&8{L�?�p���G[m�����Xګ`d�l�'k��&���cb5n����cd`A0g� -������X R��Y�<��z�ŽU-���̞w�'� v�8� j�BX���V�����>�ג�k5`Y�TT�j���,O�Ƨ. �f�ء�6;*;��Z�dNywM���"��0ԈKՒ4D=#���eL�p�E�H�6_�-�8��(�u��wʫ���%S���$��#0��z�ޓ���d%NQ��o�c�[:��@~ƹOq���S>P����䬕�}Ǐ�{�"�f+�wm�3;�a�8Z�x���� 9�a>�n ��� f�|��}�X���<C�;�>�ϓѸ?G�c�"[yg�����g�Y�Q�@z䛒��K=�"�aU5v�:t��o�p ��I+<I~��}���*���2�E�$�Ď�K��ڿmO�l(4��{��_ծ8��L^�6�i��4��K/���m��9]��e`T�%*��������~�?"bH�)Ԣhr9�>���'��� /N����AO٠#HzK/� �]^z� 1Q�8��0�)�]��h"� ��+�_Ta�U8�i�cm<����ǥe�}�d���@ų���Ac`h9�NQ�S&�ݫ�M���XK���X�~�����JЃ͠�X��)��=Pԯu<�u�LU���A���i>M�7�:u��&�e�V�b�{��u+9���de�n���W���jdS���X 6>�A8ozt�+�$�5�Fv��_��iN�&,�����>�V�2�� ���7>��#_f� 0Z�Ҭ�`>�&$+H кe���H�!oڇ����և�h���N�+?����]����¿�0Ck~��\�,���������?0evg�φ���� �cuH��`�s$%��C_�V���@D��b��Q���R���Uͫ�YA��$|E���{Z|u���a�ޡU���_C�Sn�n"�k� ���ǥ�ES��ʇ�8��A<��vQ �#��\�W)WI0���#F`�w�i~m�!F���Q�R^�ȥ��H#�|ap�m� �#���gaH���F�A�>� 2}桫��j����>��M_d���d2���/��?�(�J�t5X�O�wN���n� ���r>-�|<��+��> ��z?=y W~>����<����W䯀������\0�gj[�y��c~��CՀC��C��<�9O�E2VnK+�g�j�2*��j�~�y�\'oޱL+0+1{��iu�W7*�v���o�ܨ��U�j�Fc=��|LƦ�~�߮��e����˴P9i�̫���ˉ�~��d� 9y��r }�u���f�**�?��8��?'a"U�[/�͑zyU�@��ʙ�p��y=�K��.��۳�H+9�ې�3۽��R�NgQ l�]�}g+D�d���3E� d�٠�C|=����"�猖���D�$����1���K��/%���c�io&5�O���p�F��r���r��re�+��9�Sn*���Y�L�I�D�#�#�@ fq �패����a�#���'��b��}=�I�\̮��'� Z�h|,=��:=(��T"����)F`E�E��V��j��,���Q��|�FQ��_�/���a��|2�r�K�bIx�X��^��b����I�&��$J�t2(i��]�NE�Wؗ�,�ޥ���x�V��c�m�pF&+a�) �����z؇d�=�>���>1F_9�=�!��~S��`�����;{�L��|c���pn|U�^;�-�.�߄�m���"��;�aX�(��Ȑ�1|Y�Yz�_-�^U��{����3�u��!��C+Hn9��d>�)Ȯ�˵�U�I�ͧ@E�$*}���*�~�� V���9�_��X��AW6��Я5�D�T��@BlE��M��+��Ք��d0X�v������mRf�Fu%�T��c^�*-q�)tS9岠G�)A�o�jYJ����}A�8�I}J�J�e��<Y�s�����\�����X&Z��?�kUY�Q2�*�?���q�C#�M}�;�x�~Z�T2#�h�n���o ��Q���E�^y =@'��\�]��ce}�溞z�F|�`ė��з)���芛����/�����%�g��@Y@�k�K��ӟ* �E����{R"��p>�r(��Z`Y~Ir��Ximf�)~�U�(�0�$���(���@z)��p�_\zv�Ow�^�9;]�W��U����5�c(? z���?ܶ�g��'�h��N�rG]u����a���!z�"�!�`4y��p �A72E{�\G9 �T2 f��t�B��IQ� W���sxn�R��P>�#G����\(:�4Q�S�R ��7�~�F��9�����r����@ ��:b�Q&e�P�3��R�N�ZD�%&J ��~�2�{�@1H��r�X��/�SV�18c����Y�Ϸ����w�5��m��4�����y�� �/T�4"9� |�O��"u(�M�(�֍�nb.e1�"���r%�� �ӆ���ڠg��t� }*�ݶ7�DH��B�lg�]��rt9m72��Z�.��T�6ku��u�N������^�=���Œ�B��a�F�_�l���cY����@2n6J �Ea� �(z��6���i��d0[\����Ioھ�fЅ�<����j���W��}�q�G��9�aM�\WWr�!���(�^�k���=s��F��-멜�jH ��NQ���k��p�è�],/�?��nM��b=�Z��dy�p�Q�/{B5T�)�~�+�������0�c�ы�[�p��kM��[��J%����~uD.7Jwuw��:�l���{��ٻ<��X�rf��qU���bÆ�f��fkL��v�[����R�^U��O ���[>p=�[�amEeĉ�u�B=\��,�UX�簙ŀ�b\CӴq��<�a��23'Z����@�cA��"�H��Qj��H}g{�;k�����*Sp� g���Y&���3����֚������J��K�V~c}l�w�]�O���h���p�h�}Rm9������x�q��fQ4���j��sD��,/�yQ�e�H@ ���ʋ�u_@�WaJ��M9j1�2R_%�F�j$��l�g��P� 1���l#�L�щ��t�JA�8�g��,:�F�ջ����-� �& ��|Q�5Jp��l兡��Ep�d,��$c� Η��Q~�(�����QOtu��1WJ~ɲ�1��dSʨ�H{�pTWؘ~I~|K,y�x�D��[C�K�.��.y��?ґ ��}� ��i(�v �h{�R@�[u1)�s�"�>�� 倢#Ҥ��Za����͍�t��a[;Ogxl����Ll��{�]W&�#3�l�����w��G��O�z���a�5xs�bV�3�w�g�ug��=N~%8w��o���%q���1c>(G�3��J&�i�J��t�X2�E�4}�� {ѯ���D�VV��"���o�N��`4���~[�b���1BM%�CvL|"0�-��m�}Fq$Y"��;(:j�ш-��P=4]W� im+�w�ԀvZ9�Z���ی|d涋���]v�8Uz�xc����]�N�n�Sz묝�-'<S����hC5�j<Ҕ������ <��X�*��]����r��j;sjQ��Sp��{�~5�7���������A�ǀf f�� |�:�54=hGq���A�%�xIl�w�J�`ޔ�Pv�,��K�7�E��oA��������瑽o)�n��6u�,T~x���.��{�>{=��.t������(F������~>WZ�Y��fu3 �����i7�Q�K���T�� �h2 SF}R&�U���*�0����, 6�1*a��p������2Հ���:��:�A/��J\���`�����`�A�I��_/�q�ZΤ��oޒ�W��z������]����aГ�2KV�@o��/��,h�Z�[��8��F�CwЗ�<�����O~��p���z���7Q3�;��{��a��N� �j�i�Z�C��1�j��v���WqӰ^�@ub��w���+#!δƮ2��_Y��~�t�$ّI�)�s�";�g�Z�A���Ie���ߔ���Z��=F���a�V�;vk��u��v�f��e��[���ϳ��}�{���X�O��V���`^B5� �����5յvv�NN�y�J���>���)�M�`h�3�ͮ��sw������sR����7mKWl�Xu���8wN�Y�o����k?��<�;Y��(6.x&��U�8����ǹՓ��9�G��̯�/��!��?��C#��F�l�ndB]�]�y����u?��y;��x��m/1HB� D_���A//Q!�;t�B�!�Ll��� 1�q]e������e%]���/��+� �8{k:|�K��V�U�Y�3i�$���a�m�b�A���l�]�V��j�oin���ݮr�.xIA�-��>�9X�h�J����f�3�U��Va�����1s�8�ٗ7R��mD��C�1�/Th��&���Dc5��[O���`�L�o�F�E� �&_ug�K��y��%�:jz�%!W`��O�t�\�hԆMKMgZ"�� H{<ܲh���䂥3BNOsim�M�6W�˂͢oab��x�+@��]�&m 6����b��Z��ؑʩ�������;�G�_^��W�"Z-�F��E�/�.�[X�Ge��#^e�Y3,1h@$N�E `���u�:�i��4jA���y :� ~�%���|8@�0mLtJ<����,�a �Z��Z�Qx7Y�fK��'�_�6��=�i��V;h� ���vo�8?i�;ZWd��u�.�;9 _�H@���X~��w��+*&�V݄�0����Ƴ�G�3y�&��|�����fsGj�lO��8�vN����_��Z�?��dy1������BK��:��87����+��UZf{R[$��Ґ��&w(T��5!�����=��.M�dnEk2�M�=2�������M��t,u�������E��F�q7�-�_��� ���h����!���ZE�S�Q=��w�"���6�x���o�גyyQ�;�����aZ@dԋ�c�?ڭ%�<�%]C��^�%=Dhtw��2}O�g�����+a����9g�5ԸA~i�j�]���i�Xc�Ǵ�Xm��ŕ�c-�� kU�����¢�HQ���.aQ��i�Ӎ��.�nz ~L�C������}S������Paa��#Tf-��V5K-�=��?����QU�qx������l��#_X��,��U{/�~|<�k��J&-\7+�gC��ۭ��֤IoMN/�t[S7g�q�M�>�i�j�Q����?�iځu��o'?<]�~��d�l���p@����`��K�ys�MI8�p��j��� �2�2 �A8_��;�ͪKp�A�u|Q�_���_�n�Ng���)!(��N��iU~�[�^��T V�mCg��-V���祯�̌���$e�E�z� �h���v@�ba��p�(��[�Ӣ���~^��)��8oy�#�k��m�>-��<n�~�"5 >�� �����`,�g�0�}�`���O��1k(O1�F�N��/�2���+l�ESs����_��*3 ��- D��[�H� |$>�h��^���zN �R �%� x�N!�+ސ�_SR���C�Ap��4X�e��tf��+XO\7��뮋/F�ä�hZ�,����:o��EJ���R�b[���hX`l�� �@��6�)��?��l�lG���z��0=,�E��l�#;��B�cY�[�7�?�6��s��>��9=����1���,� ���?䟃"z��s��`<�h\������Ȥ��?,�/gyLI��h�k��������h��6�ҋ��;��^}|���GioH'a��n��C���ҧvѻ���KN�u�����u9/�m��Br��h��S�����ڱ��t���b9���y�97�e�4��O�1� �ĺb�.y�p����vY�&�k�[�j��_8��ӟ�籺��\$�����%i�2NC;q��*O��<$����~J>o�Iz�wm"8#�e"���L� �:R�4p�E�\t�#����)_�����/�9�^�\�-��}�\��_���r9*G��B��pH~}>���jƊO�f/a�A���l�}ع0�3��wW��r�KDoSB﹄E�;N#iQ"�H���������܅ :��3�3#^�b��Z�=.*�t�7 /�l�N3�/]��#�Ԋ�����Yo�������d�/���2'a-�r�a|�ƙ�p�g+�}C��2ٌ,��KK��K<���]`�m�f�k��Z�̱��&ˆ-�NZ��hn�;������]�-_T���Dך�N�jڢ��������n����NO]�eOȽ�P4�]��}i�CS]��I_%VuY[ ��4d�oD:9a�*�X����P} �3��FU�. ����!n��S`9^ik��3XWG ��sJ�Ayx�4͢}}4�WN��Ik{��+B�6c����[���z=k�K���L�w|���c�\k)��[�����#��^� '�?�'����xP:̚wky�ݺ^t�Z&�gX�^��Z<4�\k�r|�Ur�H�`��4͇��>�pk�lw�*iB�U���� ~�u��㪗K�:�_�m-\b��l@jG�C��1`�Y�����*IbQԟ ��X=��G��,�=�i�[:�[Y�3� fȏ���g��Y����\���.۸����EC铞���|;�� FS[�Z|Q�Ё> ��Y�`�-tSkESI]��S�q `�k:��/�mդ���7�);p��s�k~&�*�.(�O^ް�o���P�T�Q�1j�}l�~e6�w댂N�è�ZU�@����N�fIb��b0�SB�4��T�V���q5H������`9�;Xed$i�8p3!3@7��f�%�St��3�����w(�<�K0�Pp`�3V ��2���zO�.==��pF� ^���NA�_�@Y�ͨ=C$�QU簰��0�J�Xf'�� 2ܪ ѝ�jg7��]��Y�`B��ّ�o�~��S��+W���cy]ݬ���E��X,�NO����3a���^�����A���P�h�,�|ы�Ζ���b���� �h3�����\�(` Z����?J/�\rh;v�bz�rX �+}.��w}��H�7�1��u+���2�"Itҁ(�6F�'Fݲ�,�tnʒT�`u�,.���Zb�z��Z��p�8O��è������{�v�ch���iAs33+Q9�yA���f0�*�!9�*y��`䧮x{�T�h�a|�����)r�(��h.��77���5K�U�?�?+��*x+�1���/�/5�a_Y�>��7f�*ojB�(���%�&�4H��� x*L�T��B<��q����J7����;x��Ē��B1u9�hԏ���0��P7����@!O��v���)��c?���p��Y"��h��#^��ކV�!ю��@JI�+��h�� X�jȏ3n�A�V�p���Z�C�/��LU�:4�q�aE�aa. `�M���1�8�@��� �a�)�p#`�DIq�hފ�����ո>I��P���!`6���N$Or[�F�Y��-�a�Mz-�J�RƤsjh�6��4��2@ =?��4 y��i�o�O.6��&�@��ƪ��8 g/��"�*,v�h��_�.�@k�u��-X�+v�&��N����8,s{Y����k���UCӂ�����v#���tᬘ�Vf����(:fi �46/9�����-e�h�t�GS&T�#h����*zD��l�B��J@���]���BZG�z���ղ��2Q�\g�9��Fc��6i�, �2�F���V;䝎�+� �(�� ���S�@�VL)�ݛ�%�NV� �:a���E���(B�?M�����'8��iѪ�p|G��A����5A{�z�```]wxB���a��U��&$n�unw�/�E��!�l�t�g�6�tF���^���`r��� vM����s��²=j_��/ʷ�NS��\������ֶ���B�rgU��X4��9��m�_C{������3 �Sj�Қ=&�@� h(6UCZ�E���J�`p��j&=�`�Z��JBsŌ� �aLfɤe��e����2�[��4_�6���{�A\�qڊ� %� k^�q��TUJ��j����Z��l��pU�Hݖ�ym��ĠWO�Y\jY`��B����x�q�z�0`�4?������1F��Q���K���n�EF��6�Ȏz2zK�����g,z�B�y|�Dk`t���鳲��T�9 v��C�h� �h��nB��Ӻi~��l/�t�kc�k�6�x֮r(r��X�c�7�L)��D���ElP���{��W(@�*��M1G<n�I��Dz�@y�]E�R���U�l��ct(��,�P��X� /�� �|���;�a�P_EF�VP�a�ae+!4�n�sE���Zl^���a������BAF\w�ER^PE��֯��x��?Фg=�MK�N�9���}h���wO*��%3&w4G�=��#�|%g�������e�pч�߶�C0�7��7�7}�\����B��u�J?z�5)�l��} ���2։����4��~��r�T��s'Gj=��{���!��-�[���;J+T��8�4���a�(� E�=��n\4���SX&��w��T��6=�ӑ�������Yvo���욲ڢ��?���������y�<��Fs��X�ޫ��p�<o6�,3�>�3Q_\Uܶ��eIsP(���p�[Y�m�\zip�G>�6o|��v��ݫ�ȃx���Hwx�IJ�Q$�*c�|�ZBSʳr����_� ��t���B[��Q́����F��&��F��D�Ǧ���ݵ>�F�F^n�4Ļ���H��dZg03�����LE��-6tmYQ�y��[���n��[uZ�]�k�]������O-�\J�XwP4�Q��g�8�vi"3��b����N��~S��Q��K.���B.S(W�����b� ��d'~L��Y��R4@�lm$�����/����kmȕ�X�_51� i���sQ�����u ��Pf���������`�>y�It��/�&N��K4���G��K�� �a��t�=��K��2��A≫ ���l�6��Q����K'�?��� �ݛ�R:!+<y=C�HIޔ��-}P&��{�&�Z��{�aV� ꒡p(�j��쎒�,7[��K�8K��J�-�UY�̢̧�=���b�WJK��U�3�~�cD�/�fO�~ԉW�aj[A +8�-$1�,q��'�3�A�#�� �<��a�#��Φ��Χ�ܶDـ��Y~�h��yu���&����a��?�e3(A'A��Z��qP�N��$��n�6Q�#�n������,�t:3��aM�7���,�U��Y�ut�l���������Q��x\��GF�HmI�cԡN��IC|`�a"�3��_~��ק��l�A4_��˗ )f���[*,�o��C'o8��q�� �M���}�����ѵ�~�ʿv� o�8^��q�g������"b�P�`�q)զ]�z0s�o���ؖD�\���3'��`�P�������p8���T?�æ����"���n%�����W���bPI��%���b���zB���7%I��/���ĕ㓑5�M��)k�S�h�ˍ ��1)T'���Iu!�K��N>t�³�BGw���$Iz�5��08�;6 o��b��-��b!�B�6�� uٳϢ��) �)�e�g���K�Y@��\͍4�VB���}��f�$��9�z��x+C�#� { �i������<�A���ǜ�J=żT�g�յ4�k�B�(g�j�t7Lp�:�d<È��So^�,��齺��S v�5k�u&sQ����9Q�c��s�F�l��ǜ��-� �EЈ���`s5�Dr�Yu����o{���wi�g�����a��m��j `��I���hf܄v�SWzM?�6�YNB�&C�m� ����@S���Y:�h�k�]һ 0��b_c��_]����|Ik�:�dMZ��#�kv:�##^55�ZO]��ƬN�gc�D��#���5XJx��b<VDz/ql��v�:�Nk�(�>[�ZBPCcH�TT� 9F�Xe�*:��~g��b��m�Q(�-��D�6n�]]}�o� �#�˧�Q������A������?�����W&��M�d8��qW�������а�cۼIS�@�.js�1����/����1���������� Ņ��9�l\>�$��6��e��b��/_�S�fŲ��'�{n�,8>;�l�����O��0�0-q�`@�6��m5 zԡ���wգ��2���ӝ�X㬞�V�K�u�y�cRT��9��|�b��$�O�m���k��Ǥ�%�̣��bgD�ܣ/<�/��_ʷ�_}�~P�D�x5�(�߿|��o��m��C�٫��g��ߤ�俾� �F~VY�C��N$�m�k/4U9�'(h, 6�q�p��i�ĢU,�i8hx�k#��9�dwz-�]�|V�ٲY>��rI�@�ڒ���\0�˷�D]�}JNJ9���W.h���,cи��� �H��%,g5<R���آ�t�p���,G-�c�5�'��Z���)��>���Px� j��̭�fvU\�hH[��m�\h��5���;;9�i�6_�Q��}֢��c&���;ڢ���1��9-}>�W��Ab� �.c)�In%�UD���>��,�/h�021�:�AJ1{+��������[�{��q��`�)���~�jo��cG����j��1iL� �b�*�i�dS!2}���5c�����a2�Z��l��d��iˊ9KqsT��ɴ�;;��afT��U>���%�+k��b���GY���jQ��,VC�j)�[eP�����G<����\�x�՞[�]�jt=�~'}�����6*�#A�8����ϭT�2� �X���bK��p��D�Z�(��������e�!�?�����x�2�K-_ȥ� �5���Ap���~Uj�,{��?���?�Z/���g�o�~�ڒ�����[ "m�'N:����L�a:����h�x�>�,j�Q���� �8�;Ѡ;�_�+B��U�����۴�}���K�Pkj6u���O{�{�i�I= �?��s~����^�X����@����,h*�*#���Q��Q��3aXHp)Brk�$,1J=�$�����_ߥ9���$�t�0��us0�(L�L>��(�U�3'�)˲��X�|bk�{.�$�#��{��b�*��M 3R*���V��.+��r?Q~{���3F���O��]��j\��x� �_�b}�*JpPh���=�->"�WT������>��#��БZ: a�^�a"�/�9��$����3yɘH�y����❕�;�/)��������a��Pp-��YVt�E�z�����k;K�KC�m�?���9��i�N_u"��iS���"b��Pɦ��˿ ��w:�W(x�7��(c�غ��D��d��b Q�"!�2��4�:��n�H��%Ux;�R<�4�~�:w�C��������r\3��������2;^q���]��9�;�ʉ��4�q���6{��;���������-g����*����{���t�G�w�GUe��{�{�7�f��'3���N���zh�w ahb��(Qv,(�Y�ZP��ς����� s���L�t?��?0���}��s�9�eq�r��>��rt<�gn)�Ȼ=!^�?TG/�J�鹠b��{5ق&�:"@�vd_Ү�C���i�I��M��@%����})6��~Z�s��yi�� �&��zåU���C�C��-F���� ���uMΜ�|�:��AY���A)j!�ff���íYKl���dD��x��y8��% �,�̓��Tj1E�xB!�D?A���Ax'�?���ą�h≩}�7��5[���X ����� ^n�T�?��A��M�����JY��δ�� rx5Ͽ9l�R'�5�����Ӹ,�\0���b�<��0J���$�0�6tϥ�Ly���+��@��۷���!�A'���+>A/����;w��S��@ʇ*���]N���r J=�R��ҵ�Ԟg�u�H(-�]�R���R�$l^����}��{���n�"<̩'��T]���Gh=�:6�'cğ0J��1�HC1��T��O�k��0�q�)�}F?H}wÊہ� �4i؟�q�O�m�'���ێj��%#��=k3:��)%���ї�¾�袺�s�ql&�{��d��ܑ�xMJf�W8�O� �� %E��T ��O�'%�_�I�h�N��$t�Ϛ"������58>��s�dO2~�$��3џ�~�烌V�JLL��L�dR��Jj�ˡ\����䰼�N1=f21]8��GЋ���A���R�yã�[f�� ��j�S�G����Z3GZ ]����&�D��� �g`6Ko��$XL�� ����ZU�}xRy$��f��s�w�,��J���6�ؐ�R(���K |�F��K�dU����X�:4��r��i�8���Je�~Y�h���O!y���R>�z�Vt��UG��V���w�<�����0v��&���7TG����8����Vl����Ƣ!;�^�8O�W/�&H#LD90((ѓ���? �a��)A�m�!�L<|ئ���%\��ÌL4⏕`n�?`�������V�Wk���h��b�+i�Ś��b�%8t�i���5���@�/th��$�pK�套��s�����G�X����h%��bɻ�b�/u�5K:����`��Ěc�bֈ^�:Mžr�ݹ��gY5e�\pA:K#xs"��N�t;�f d����B�C 3�v���Dk��/���U��1��ղ9GsX-B�����C<��27ǽ�� �M�.E�guL�͋\y��Y6��{�Zbu��y���E�5%���.wA�P3}�S�nc�e����z�5�2�QYͫx`�բ*'/Η���C�i�~��E�'`ciE�*������&9��ҞKA��#�� �\���:+/�c)q!�r�^=�{�p�n7�\ݱdq;������z������kڗ,\�Ր9�N.�N�[�EZ4��w^/<4�z29愘�+GU�=��0R=��9��#}�^�)t�r�����grt:��".����^Q~;���3�ʪr�mNEE�@~��}P�f\t�z���Mբ�I�`/81iS���N��M�PV�v�<_aO�6)��h��N�v�9dy�X�O�JA�1�`S�N�F�0d ���7�����`z�$� 8g0:�a�ї ���Z\f0<\o�����qg�~1�?8`|�l�"�[��nb�1 �Mys���B�'F~���Zb�vGN���u_f�͉�k�E�/���˚�>����6��D٘����HN �T1P>G��O��6g��\��=������WNe��qo�t#u�z�:J�O���'�)�%��A]4Q�WC���MR�& �$%�j��¢ �7�Hl�%�Gm�P�P�F� ���@9sBM�\���+�,u�`4c�NZ#�,�U̥����.a�L��Q<4I&ũ1��@��aWN�]��P9�h�^^�=T0}�\��$y����'�Ѿ�Y!�aE�D��*��n�Ĉ\n�E���*���e����S���4Op����D��1���K��r�2B��}���qj���1�Ʀ/T��� 7�8K�YY&�駵��l�W�S�J9�=�4OG�:�ٝf+\����*Z8�N�ʢ�g^�@��$�|%�-ϦWH�M��VLR:/Q�J�h{8�s*dX�J�5`��j�[p��k��&UY��b���d`l�&��L�S�Tr��@���t�ڞ�)�{i�E���ڲ��Z�w�:��0Th��� &�!̀\��V`)��;^��L1�C�|]ߢ����r.-��8��e�u�J�|�W>R���N��r �8x�A���#��b�+�<���SfL�M�6�e-�� !��d#_��Ԛ�Q&��q����qPB�k����A��(#Zq�Ɨ!���Jp��l"�1ײ�kI�ZV��p@�?-�=6�S��s���,��e:3���eZ5���R9+7�N�9��In�ۇםX��gCSٮ嫳lmu� ��,�3��m�9z��O�PEǰ�B^��r�������F&B^m�c� �r�4�s�ͅj�\�g1H9T1rFBC�Z��0JPh��w����an��]b�յ�P5��ނ�G���n��W��g��k�uʥC��?■�ͮ��|��@�-^%;��x>�@5e�yA�U�9��54mƄ�Wbp�\!,�G��hD"�� 3!� 鄛HT\�6H8�`9L�E5t�V�\�)���{`��{���� ꔻ�@`N�����{��9�瞞ݷ�v5�ٛ:W�nY�u?={���%�1�4*ve\{z�?gm��e&��b+hP��9B��{� O�Q,m��ճ�U[`l�\5zH�ṽu�=���`��zr�������X ~�UӚ �gv�^5y�#�Q(2'}CW��Ks륊�O6��7�Րo6k��C��D��&PS���<�J�N��,\ՅDe�PZC1$ӡ� *r���1ѽ�c�ȅOQe�4}�TB��%"�9:���v̀��OHn! �"B]b��� ��PIH'h�$tl$gup;0y�\#��0�¸iI�q�Z����!����-z9$Ey�(�WȬi�����*/c�[4��\6����P��u��H53�g=>㯳�X�N�o�Q�5���\�8<��O�n�����}�թN��h f ft+x��2�����mS4���8�vו2� )ѻ����$:(��Z�1��F������bpB�2k��Yc�ÐQ+Ꮏ�n�#�4w��ݩ�/��+�kO�T=�#�ʶN��=;��3��3�Q� @&.֯ɗ/�oD�{����L��=a���M�M=I�����;�eχ,'���d<�FO�c�J��wy^��@��L�{��i���ɥa��r�q�SY��<�.��'\�J2���+��]>(E��5�^B�K�1��g��Հ�bAt������p��7o�C/�Ҳ�j8�Q��Q��ޢ>�Y�nPj.����$Qlw�����[�Dž@>����|���rF�R�=�v�?$k�sH �L�k꿿�� �N �\|D g������C ]<xF�L��_�=� �g�L/ۅGI��^�TGd�e!�ɐ�2e���Ӻu�}��9�qt�t�;�GT�{����Z�DIA���I�ɓ��'�n���L�S���h��|� _D_1 ���FO,*������4&0�4� �aDr �g�ส����غ��7��eS�pW-���5���_�ԧ���m0�j\�rM+9�3ZG5mj!&\9�m�ޡ�xK�X��E{��W,�����҂*��s��1�\~�m~e�-K�q�ޥsV�7�]�����E��,�/p���ț������g��K��C����S���u߮����{]��^�>�ݭ�~wS$cw��T<б�|�"QDRMc����jI�d*Y�N5����~w��Q�Hպ�A�k�3��`�$0 ��t1B�(_�%�Z��U�h*\��Tz�RPy��Rя�9�h����`A����s�d�Ӭb ��ဟRX|� N�j��hZ��; �'���h0{*�A��Z+�ehȦ��`�<����r�����^P����Hm˄V���}��T��WkO��' �#gm��k�O���W.���Q���ZQ����{�p������=4A6 ҘB�3?��#9���Db%>O�Cxu�'@<�����>W�8���-{�j��>���9أW�9�.Yz&�o����m�C}�s�1��e5�\Z<rI�)u+�Z�ǹ�/���M�7��/o���Թ���}蹡���Ѱn��YV [3�ܖ����L�����\�����[ �/�)UC���2�x���&�#fz�QJ�m`ݲ�k燚G�>|犩��]�C�-`���.��*���� �4�5��K��}_.]|[NIw��z�������d��6?rp����%�K끼5�kq��Ag�Z �3�g!B��E ��R�Ǖ�>C�l)I���]{�k�m;���sZ���=-�C��s�[����֯{l���|~�[�OV�ƀ�#@��I�k�<��I�{wKk�[�V�?Z�����E?��oxtϥ��A�� E?P��R�> Tk �l�R"7(�/��C��m�Ue�@$��8��} ��,� a�[ҳxq�^�Q:�ZRP��j�Vu�t��%n�2�f9��ر]7�~,�U�����n�6c�6:�g���ѫ����+-.?�M�&��fv߱����s#zV�wq:꙱m۫۷��c$_�g)��O&�&�\@�b�d�3�4�n�'B�X̡�<i �!�h%�D�ĩY.�St A��8��Mt���x�+8�����P3��M3�� '� �F�<�,�o���w���R����dž����Wd)����+L����Ӥ����>����1�R�;�q�"��LN�,`/m�O䔰m�8���F0�V���\6&�������yhM&��t�3J0��`���g�����@���5��zzX�#�Ն1�o�ԠRڮ�T�}�V*�y���p-����"D$ן2�pԓ1 �8��G����0��7O��y#��xh��(���������> ��M�s�wL��iw��:&m�H����)�yi�*F)�I�$q�����K��wN^�~2��I�����6JU`>�u���<����I{�2��Yp���)\֤M}��$/p��3�7��`r�$����k�㹗8AȬ�UP��L`��}�QLda��~��TW�l�i �f�Gџ0Q"�쉠 E��oE�V���-ȃ�Ǘ�1I`�|�����%Aݶ�����8���C���D�À��H�R��.L4I���f��N�H�Ry����K3�{>0P5m��h��9v��y����ռ��%��M��|Vεz0�cQ[}��У��cvg��-�����3���盲��^Y��)��Vؿ�娢V�ԳV��B��a�\��Α���.ї-�&<���_6��0�¡��0z�̈���B�@�} ��0�g�I=�FS]�+(��]`��\x�����\J�� K<�WRC�Q�4j:�s�ۨ�ۨ�T/�.�Ez����Gq3���h�9�< Fv��Ķ7a&�8�P����3���(���e�ӊ;8�sd���g$�"ٔ�0&FD��2@�l��D�i�az��s�B�x�_�o�:�@ B Z�IH�\�V��Jf9 �J����\!��2ٙ/��:T��٠Tf6ˤ�v�jUȡ���f3T��F������ �����(��KZN>��R�q�bN3�8��ʔ�ʗ5 f �j�A3]�֚�@�Z��Oj�M$%��RN �Y���[�w��z�t��e�r�Z������l�JYV�����9��q*� �N&[��5���L��[2<2?��K����l�*�}*�g?je�Id���?r ��`�^1�}/U�߃wyE�|k4~N�T��~��Wr�Z�@ �څ_(�Z���V���T�%��ZZ#�X�>u㲻�^Eo2˽�T����'��v����� <Ր�*`��c�N-FK�+���P��� ��W�A�v4?JScF�'�c�7���3 ���SR��Ӏ�\��Q>j2;�ⱳ�I�ܯ3s:�,([.�edW��=s ~��=; �!F�Kl*`D��ǯ���P 1�I�����I���� �Ș,a�8���p�c3X)W�W�`:�5KQy��7��j$uE��|p�M�5*`�l�h��$��J�6�R/#�������4*�8B��ݺ�ؖ���WX.m)R3�fa�-�v4�+�JP�<�g(b�v��#l.��+�a���攀��³�eGw_���HXc,�@�u���-���ѫs:�f��p{����(nX8fQ����:����h�o�6���֏E��:�~�D|%�5V'���8��jK�mڿ/�ѐ�K'��oB�vNg!d��K�uK��,`�靿�����|��Zh�����Q��f$�v�,�>��%F������v��ځ���'�C7�8-6��F� �@���6��a�Y9�_��,G�o���Чͳ%�{#Q�kA6>��oh���ͻ�㥌��d�����͟���_G����蓌���/t�k`�R�Ӎ) ��|:2r �⯿s<�ʖ����5E躉�]���]Z�m/x�Ɯ�����O� X�R����\�r��o�yt�X�Q]��$��^����Ӎi���ܠ���*�nR� gf�5�/C�7A5(�1���������G��u@����|,J�$�4 �DI������ID�m��x��8=9��="�zc�����q2���wНv�ȅGZ�5�5��!��_�u��*�Zm�ߴN3^#�7$��Q��LZu%!^AI1)��91�C|G�D�M��߰A7Y:֨�n;VB�������NRS�q%y��o|�&5ز��g��t1��cL���0�o�1Cٍe��^w�>����½!6�jf4��K�� Gzi��d�ߴ���L]���/y �r�E��F�~ӛU�Q@�߉��`��1q��Uwb���\L(�bY�����%�)� Z��Rlҿ��˪��0-Wi�UФ�I�S��+�_!���y���]����+���r�=`�'tv7{�������}��1���{\ǃ��$ ��c�ϜZ��; �;usg,�kv۸U��|�oz�r��PQ�w�Gb����� ���"]lɵ\��{h7���{�{8ֻo=`����#�vN���_�2}N��$�sSz̙Z 6t6��@f��n:6�i�!�T��$"�W8=�����(}�mZ�x}}5hK�ż�{�8P�7�yƾ7�^:�8,B����7l�{�8���O<�Ĥ��lt �j��C`�)7�a�9��J��l��6C/��?4g�Z�+q�+�Ia���Ʌ��������q&�g����w���.���yE�Z�EW~q7������K&*�/��:�;,w��oܳ����eCk��5�7��n��u��g͵�&շ��7����ڱ�f�}����?��u���P��;�o>r;��N�}�z�t�Pu]C<֘���јs�Uۧ.���� ��o bo���?�7�g�W�� ,I�$Z*�!N�|˲f<s&|헪��m�����:�?������^K���g<���CB]DSX�I*᪤�hs�9!?+K��_���_�%9����@�s Nz��O|��j������ĕ�D�������A���i���������$���ڇ��~�>��z��Qtc���+���k����x>�7n�鸧��H1���L"�b�N65�|#.h��d �`/�0�뉚�]R�>�[�K�����R;tHdNk�Vrh�*�<;?G��j3� d4��� ьi��1;����^C�g���&c�P��S��V�9y8xqcn���蒳�ѡϷ�]�j<B��Y+��<08Һu��%3\Nk��&�,�5��E���O>^��� �閪�8�����w<:ml튵ݳGV�t*�魏�7Ϛ�q0J����g�!�=B_Sb>7L�S���*�J�&�o#�'����q��&���]+F.O�� s��!����qLCDk�tK���||<Q����~J����%�� U�Z�+P�a�8�<5xz���y�μ���ե�6�d/�6���w�Xi�<t�ۥu��o��[��Z�/w����%E�e��R�?���W�� �h\��z�SWJ�}e�@��Vf7��:xW���$7)�{t�֓�Et�xr�֓�t�ʓ�]d�̪��u�[)�'o���%�C��C��Rnj��_ރoI�rL�=e8�=gLN���;�������h�($Mj��Q��\�������19���z����:�)�t�^�=�QZ� zpƽ9c����ɶ|Z��b��dY��T� j.��h7DJ���)��2j�F��O^��d8�P�� ����7lLč���1I#n��5�peZ�����.PaӤ��f��[[��me��1�+�ًÍ-�'����ŭ���+!���]x���ds�k�J?���{ӻK���բ!ő�b8c�H�d}M-�9zTg4p�ӹdLd���5�,t`V~�O{��Vͺ-yR�%�-�jO�MfsZ��2v|�u,��e4�����O��X|����CGl�����ZA�z��ĿMV$ #C�. ��F��+�&��K����#Z��(Q�T��.� ����D��U�ΐ��?8���X�vP�s�;ֆC��nj��vZ}I� 5C�<wMW�4�ć�!' �]�qJ!g��]��K�ה�G��J}�VV�>���4c�LzbU�[���)���3K�!w����Y���o������X�q��¾���é��� �[�?�b(\�5�La�乖�/{�s�a��t���q�/�Rˀ�Ɠ���/�=����V�!疕�� �r�R�|��B�DP�xt���|߳eg)����V��A"#�^A����qF��$ڻ"��d���b&B��%�+�ձ�����a�6��U���{�����n�m0�Y�o��M}4�Ғ|�y|*������I{���6�b=�} ��6d1y�ݰ��=���s�/�}q���U�|gF���OS��1� j~��;q/^��u� 5�eZ�XnK�Dk��c`LSU���xM��֔v)#(���&:�!��PU����Ԥ:��ˮ>�eKqGe��6(ABO3�cC~�QgTh&�*�F&��ak�[:�V#U�J���5.Ugp+*�¢�*���f����=�c(ך��W����1^��4���٠.Q�K�� w�ƐetC��<�(�a,��z�B��0�������V<[M��>CwUc:�y'܃i���9�}��^<� C��08C\�OPE��^1��sZ�R5��Hvn}}n6m����p�b1, ��P ��������؊����������A�1���e�Wv5�wǽ����# ��h�#/����_]�ps3:��������u�8��i�fٟ�>�0��[�v۶�D��Y�4���a�g �"DR�9K�v���H�R�]�S�Pŷz�Jƛ�3�в ����?X§)�V�F���1�I��o���0O����%�eh�yw���� x������A�;�2ބ���I�>��g�vz �_�a�p����^�i5��ҕp}��ϛwJ�9���ˉ�lԔV�4��W5q��H�>.{�C[�|_B�>�N�=�^[��r����9�^5b�U�Ιv��J��ڂ�k�|�߰8��Ng��NJh��J����,�J��A��9���*��r��D��x��0s��{P�6_WF����j��pm8Ϛl#�)k��u?���!K�́�Г�� V�{=��ӓi�3a��3� `�F�`v�i�n`�n7�<2n���7�un�h�C�"�$T/^B��dG�#�y�Ylr�U 5)� ����������嘭���C�/Y�Z��,�[,�r�ͱZ����h��XqE�~D�jŗ�=�k����q�W[Y�$9.��v1r�q�j�3�܈�m7�%���q\���b�r��2:�.�G�!�D�8��<��%r�ըר�i��^��`:�X����+�r:]�<c�r6� ��yi���䜂��?D��E;�x6��@K��Ih�u���϶��aں��q�V-���6u��U;����V�3���V��Z��������G�>E �;B4�����1zb�_h {b��#g�¼��p9�t�(��J��8!�RY'�%��saX{�D_�!"8�d����r50�.&ʷӾ�6��ې������9�p:��X� �q�w�3Ϡ��h��u8�e�D0�7D{ s&B�yf��th�sȤ��'�7VT���� l�L������.�/!���.7����5��^����FV�=.H*�^W�R�֮,_�0.�iW�]��ee+�ܸ���&��w��o]M�P��{�(a�W���80�=���p���\�����qZkք����w��3�V]��"�K��f��E����J���ne��*����k��T�7�*��>q{-��ȕ*��Ln�w��WX�r��.� �ҫ�.��z���=���b6���9b��X`-���Q� �@�w�����?qm��Ep_���|#�KW�W�%eB�3µ{ҷ��e(�K@ږ��˃K{�[@ Ǹys0df ��Q�9��)��8��{!�����p笯k.�U}�>�}�kk�׳v�@�.�q٥W�&���o����E�3C^?C�?�G[��۷��={b<}��a��A�� ���ui���������p�(u����iW����2JM�_+��X ���^]��"�~ǡ@�)��<��MN=�B�ó�M-�L!�mL!]�}�c@���ж���\��%��:����%K��o�`���*�*�|3�*]I˰��@��uXK {��(|I|�~�_� hq���%� A_&A%D̠ڍ��ޠ-hCxB>�Y����3�=��8�:Y�7bzS8?%,���S���/�ҋ^$(3H�ݝ��H� ��$��#�BL�*��f@��p��O ���UF����ٳ\��@ݟ����� ��e � E��H����q��uA�o=���S��g���DQ.����b�&.�{���f��w Z���%��0���.7�s�?��?���~���u�?s�Ȋ� �'D�;F�F�����El��188:����UgFͯ_6�m�0c��YV7w�U֜��'70�6L6�rh��+F�Z�|T��~����815��5ipM��V���OKZ�۲s6���ž���b����D ��K�읁;���!�f I5k�%��f�poZNK�$p�܉���7&�x8"~����}���3c@�qL4����GK2m� <J~))��g�y�8s_�����#���g{�`.��ڨ�d����"J�ϐD��1��x1"".@�P��9�~����O����QO�mUP���h��P��O���� *4�V�}]�}���JV����7�l�˸{����B5���寷I�N���].�g����[h���`����/����]�����,�lr�ƨT˛k�2y�dB��H�㍰թ��rё�� j�[�c���� ��eЍ�c|��I�O����!��E#�� )����Kx���2��_��$ϳ}�S>L��5�� T�N�y���#4��I���� <1�BD��,5X a���y���$y�R��c����T��P��YL�єP�����Z�Wfj��z�A�3��*S��Us(�go����.K�Z�!���Jڊ&A� 0���%Έ��-B:�)NゝKg��u\6��߸~��-o��_��wSg�+��g��g�C�.�f�$����]H�x�G�h�c �n���@d���V�`����2���]z��uܸV�J�h�s��UW���+�w��,W�D���}�n���O���Ӥ т�f�}́R�j5��Nͧ��y�O8�<lH�.�6�N;@{ ��È^x]8!�D�h"=�eN��2�3�x,> I����$�,>�扵��pB��]41����+�R���KH���)'!G��,�~%!�z��}���< A��� ��&�d!�t2�B� ��&Jd4�1Q���4y�A�I@6d=c��2��/c����~�{V̢4�������Wwv��Ñ@������|'�]_41�z�J������qKOtT����)��j$4�+���ӎ0�K��Q�1��sm|�~2���k����<L�*3�{ �̟��t<��$E�4�ou�ఇ�.T��k��@�/n�H�9��� ׇ���̙ـ�`x-�m�K�.�]g�àD�C���<��'�Ap-:���bxJ��qh-,� ��Z�̀f���h7��,��8�z� b��ҸorL@p�G�}�`)B����0g�������w�f��h"j2G/��ܓW�KhFI+Oo,WԢ�!H�:��![l�pϠ�5{�Q��i2��m�^S�W\�׀�d���}ﲚ��-%?�I����.�g�+A(�>5�oZ�DnH�����g 1���,��:/X9c^��k4y�UzK<u���L?F�+�MK�k�\*J�bN� fS����^�)���P+n�J�Ɓ5�j��q�� �'$Po��aȤ������@4�3F�0F|K�1s4AsA���H4/)�\�E�%�B}��cĹ����� y��4O�ő���Zl6�������IQ"��r��c|Ւh� ���%PL6��;I�9!� ��%�6y��d�y�H;c�E�B�N�sw�W1�3C�I�p�oz^�tf&��Ȗ� 0�� �'�p5"���ϔ�M���bĈ+�̹)�i�;�M��~����6N��)yӜ#$���7������+����a��� (���gL&^o2�ypW%���0}��O��f�+љ$�Ȟ;`�P ��G\Nk�F�h\.���qp:u6�hġy�Pm�� J���*TY�V���qz6JU*����pg:�!�Ǥ���L�&���rʥ2�>�q�j�No6�y����u�4vg(�t����N')&]�tjJC!�S�F4�!�H!C3�Ą'$O={�b���j6i���A�9C�N��@������<Rb�l\��8M�*�A�R�2H�Y@ZA��-V=o��V��������C�n�3���,�v�0��56h ���@F�QX���uj��r�*{v��*�=�� �&�G��[|�����-J���̥Vg��n\=ؐ]�m��#-�� �CA�0�� D���\ dz����RӨyx&�����Y�rHa��!�Cx]�9<��!�� )�Q��q-�*A��V�eЩ���s�B@�D�'��K�@Tм"���Bj��J����|]�jN��1|ʔ�JW]��N8�v����.˫����Td����@vqMMAn0n�=�9���nzI<�`��v͛���w����V,]��)��}nKu��:�&~�&Z[�ωV�S�c{��V��\�< =���� ��z��h�$¾l�J�4�y�ڪ��@]��!�j��cf�I� �۱ᚢ |��t��9q�'+�,m.C�]�m+,A�m��3�Ҷ�R�{|$举��AL��1��xs�é �Q�oxg��A �FQ|4d2��Z�3���7O@<��q��BF_��x��E� `P3� �C&�� \���E�����txa4s=&����L��g���TH�^!��B�y��s�'� Ẹ���B�IO��6H8pb�t �(AD'���h!�Lv�<&Ap;0A�+Q��D�o��@�(��IyD:�h]�9���� ��"!�Nl�|X��t��j���Q#��'�cD.������L���&o�n�6]�uɼѭp�B簄,ٲu�#�R�i�xk!���=7�Ⱦ+��Eք�=~�:�r`6�f��YK��>q�z�|jP���8uMn�˦{��n�2�z$aF/�K�17~��;��D�1c��A����2�=��|�ɪ��x��\T�>�m�:��V�����b̗����o�}Y��n��[�7��}_Yj/��c �������7N\��v�u؆-5\�ƭ�I�~�ĩ�/��,H]>|xq"�v��JϠ�� |�.(D��*+��੧R�\���N�?��h�p��;�$�O�UU��Ӂz�Y��������&�7uj^�c`+)��4�������U��3ұ�sX&�:��t�q�{,8�q�d>�I�M�L]��Z�� �E�M��1�V���C9eV�H꙾r�J XE�E �֣o_��r�Uxv��|0�'�5�#G�T�O�|x\��.��P������ި�D�K�8�ć���GK��g�d,�Xo�3.A �5 $@���k3�7_� ��c%ByN�;I�p�M����h��Z��UT�M6��;�$��=��=<�RI��R�5�c��X6IQ��!3�;*��j���� n^��JC��C���Y���z�A�H����El��E�z@.�Y!��ᩡl�I����%�����Y�@Գ2��+���^�����D*��ԿV"���h��2-0�e2.��tKUr�]�����U��т�@�@]��������b��ҿk�5���ԥ���-�:�TB����� �nz��҈܄� �n"������(E�.VX��䫋\I^X�+�PM2q��2$��E��)�2����(O\"�DO}Q��� ���:Z��B�"g�[?�kDQ3[]����Ь�,e�R��*��7�jw킗��Ƥ�w��FF�P^A}AA=�pQdrע�ļ�ڲ��3�3<�KZ5(�p���iE�UeR�<�Y�PSy�Emֺ���فl�[�ոD:�F�]��\�%��t��e��=���겒����nEix�ܹ}���v�de"<���j��y��Ԙ'�VB � +�ͤ��~p���c��2�D`J[����f����^��D�^b������zw'�V[1:k6������Q8�4�W��9ii{�t�s1p��WKZ���9�Z��ْZ�]v�>)�w��gys&�p߷W���7�z��0 ��D{�s�a�tD�����]3jA��%<A:�'���b��*CS?�s�2��"�7�;��U��Q����_|��fڂ(J�Z��7<�S�^枮���l�_Ε �C�w�0��D��_� �f� �ė���q����.�40�:z�89zA�ы��.с� p�&M[Ԇ�4M ��@A�����0��e2e;q��e�e#駄��() ܭ�e�'h:]9D��.��PNު��R��O:(̺�KW�����#gw�j�k7 ��'�7^#����~MG]i����ׁVf���P�m�-~r�r�8���5-��rx5��*���l�Y�l�g��֯^@��=q�Mx�$eq��R��d�$p���r�~c���Ӫ�O�� K��\3L�sS lɾɷ?��o[�^� c��R�d�Y��q�Eh?z?� ��M�-P>���������SVW-80�{��Wt�N�B�D���[�����|�D�`��-�� �BU��0�?1�D�ɠ�X�T�Fv�K�R�8�������|dO�2i�M�A�<�xaC<��2FI��ϑ�(���� �^?K�&p�\1m�G��^����^ u�4�98�r�l�P�DŽ�Bڜ�'�����Ȑ ��N����^;��L��h�]�D5#�47�2uպ�'�u}O�����/k�[Z�5�Vk��ֺ�Ys$Ԥ��q���L8�>9 6��ز�4�O�Iw��������I~�y��~4=�:"`h��0*� �6���4`��F��)b�r���#��!�f��"G#jS1�s2�_F8���t�r}������]Fs���u9��b�W�������&S���e!��n�%~����g�!��a�����?F�D��[�&����N��תM8�!� !P�+�:lb�mV������̯�ֶ�s�Y���[�cD%t��H�@`������u* za-�N2T_⾗���+��Z�R���>�Y-�{���=MA�<�ɭ���;�����S�;xށ��>\�23��[�'��4�'��͝y6�d��F�[Ha��,��rTH�*��OQW/J��UZ�<��p�uB�L!�LH����Q�X��P���u�%!�]��D��kա�m["��)���\0$��R.w��`б�s�Z"e�bEVŸ�]�ӭ��(���8�&t���{�+s�^7{lyEN����K�5c�5�*���.J���`s�����Z�ϙmW�'|�������/w��;.��Ѯ�����x�`�m����i3._�#�����,�9�bn�Vw�~�6�(���b#0֟��d�D�0T�پ�0)�H�-^�L��*K��l�D?t�0̹�Ep�|��e,��u��O �=���k�v�g8b#+�6��B��'G�|b�Lzp�ӓ�ʜ%���?����ϔ�O�����3�<?'����R@�F��; K�9m�8�T�ȶ��M�bHq�S3��'_b�,l�ಹ��_a�R>��1d�~r������Q�|ϻ~���!*L�G�Z<�C-�%< 2ɴ�x��X�n��W��<{�;dmKQ�U�&!h9W!s�Dߣ7��#�w_@�'��|�Ļ����_�������o����P����F����>�K��*��5D"ђ��b2x8��@������ Yx �">�!���~�S�&�����J��Z4O���>ˑ�!��ټ��;�֗�� eM�kd�#�+���M�O��#@ *�)���T���=/���9�N��W �� ����1ń��A�)����_���$7��"���>s�Z�̔����JS���rm��X�ē��`����;o�]5'�\��G] O�3`T�D����.ķҕ�'13��0#�n�CX��o���a�.&� ��aH% �& � )���!i�-{�`D6��P �f�ӌ���xI��;RRw%cÆŒ�N�^^n[^Y�� ��օ+p��[�����0-�XE=J0#�,��!�1@Q����8T���� <��OF��z$����ܗC��5��{<��=d��L�.Bl���9`iĿI��}���?��ӟ%��q���9��?���6Enj�#���z��Lx�C߀;���w��>���#~!�?~<!v���C���q�_&`��f}t~5��d&{ZpNM�Wd]��i�V\WB�Q��F��ID�$��#N�$���5L����]q�PXT�M�jV�DI�h��>�d�]�2t��x�9>��>]��rհ"�0|�f�ڜ� ��; �۬�n��-{�w*EXP*sǎ�pj9�V�8��j�h�J��G�;�H[K�·���%�';VW9���h��J ���w�TO��oϢ��1�����Ҿ�vi�r�e/g���}}?�\cS[ڲڧ��ѭ�5���^s�Z��1��8x��<�w�L��+����J(? 9ul��^O�r�N�p|b�Z[��z���>3��N�]�3�L�5i�'O�݅���$����#럍�8��\�|�Տ,t�����' z�������"`�Հ�4,�{K}��;?}͍��^g��e5r[<4�����L�Lu���B� �Н/�8�ԭ�kG�V�$��ʗ�͒<��p�X֢c\�?SP{��z����mZ��hH���Z�x��*�Rkj�JZ��;o�R%U�YOV�V�*_�_?M��̺�v�vqR��c =8���0���j�Y�3��}B�-�Ӎ��a{��- ���VTD�8h�{�}� e���9�$!��[N��;��#�g�V�[�eɲ$W�Ȓl�e٘bl��f�馛N���$@BO�@�R)��0�KB �A�8�4�\��Kli���J�l��}����������̛7o�<Pف��*aOiaZ6�$H4x��ڱ��U���Q\�֭���NEr/��ރ�IKIz'�bA�h��m��X��* ĺOH��FK�$���*��B���S���[�:�7m���4m��[�s���,.���_㸯;�K�*+}p���Lv%}���-��i45c-B{ ���� wÏv_� _���u|i$���L����u��q�(��?�����q5��D5Ss���r� �@�A�Q�QG�����ԓ����k�i�]�!�Ll�.�?��1���t�8J�mv?� �:�����b��k h�"�MN�'���@@g~V8&#c�x�F�2i��&�9�� ��n �{�I�O�^ø����:�W�NL~1e֟e���{R��h�5p��lJgO듙s���[ �}6�dւmj�ܥ�wo��/�#n������X@�W��BM?W�Fg�oչ� i���T��+�0Hi�H��E�dW�{���GX ~̺d}�{���Y������gft��u��a��K����(�ǖ��=�<�vG�5���>�D�NO�Ŧt�^��'��`���H�T.M�ҀF���-'� �=I$��ݨP�Wش�Y0V3V"�ར�����4h=sF�1\�U� ��l�?|�U��'EX^*��Փb�h�V� |�(��S1�6�mZ�y|�^�v��'�`K��,,,�/�_>�_G�_��?���)e�gΌ������1�(�;�� �xϯ��Mϯ��}���Bh�*����� ���!��(�0�zO�ެG��vJJ<{cyK1�qA|��^t��@K9�#����72����e����|�:�?\}c��`�G�0%S ��в��O?���\0�=C}%7�6� O�uL:{g���p�1`]��L��K��X��c���r��,��w�'c�AL�� �����/?d�$��{mX����3x���9O�C��&~���Ϝ�bϞ/N� �����W �{�C�{�m߾�7[5�Ƽs��O�?�ӧ�,\������x�]�!.�g��R�ښY�:*�d���oarrs�3[�{VE�y����>����v�[���ˡo��XM@Z!�� �+V�x���V�4Fx��an�wud<�����,�>8d��7�[���1���j�:pBZ�����<��p �"�}��C�}���7���~��?��*�LamI�FP$��~��S���jˣ )UJ�S�T_��塈2���#�<��MͧQ˨��BoDz;��{���1�"X��$G�݀��L=���.������ ��[��q���Xi�����ԧ"���o4y^��ȵ�������>�~f�3��B5S��~VrnV �����n��#��~0,���/�x��聞�?^ԙ�3�e�/�]����wuow�$3��gbj�����4�ר7�!�*�Fyj�gQ�;����9�?�2�~~�hў�������tO:�)��t�=�'݃���=�=��Cu�Y4$�[����:���, t�BoE�Ԙ����LoHMe@��-5��,B�o;�{���q^̍,f4&��v�p��h�Ȼv)��"<�� �'�*�|�0Nز�0[�JnEE.W���� :��LD�.��D��8�ߵ?O���DP�I1����We�s��烏�8�ba���v���zig��������k6~���[~�������q�D��>M���f��U��^OM8�R����u���6.x~���j��T�A��k����Mg�z�և�:j崉a�U�����3�iP�R��t��LU�xY���`�(��@|R��*���EDzgcg�@� ��'uA`�2+���,vЋ�ć/ D�t�U�wm���Kb��I"��et�'��&�d���{��b���D�r�RINf��$U`�>��[�2ThӌN�Յk��-��z�*�FO<����(��:s��X��v7b2u����Tt�\k�.��7�ǻt(���?���GC�߱7N9�5C�t����%��igC��̉g�S`/�@χ�U0>��`;lc�(��������|0��v0���:Җi#!5�a�� �*:���0,����O <R�|M���YJ���)llj*������S��nE�뇀`�O��Do�k��ͨC�b ��+��z%089�fx���1Æi��a�P��p�_�?�=/!U���z2,l�OZ��t�9���@`������~��m�nC�N�NPf.���l/�I���M���l��LX��\ܗKj)E�u�%u*bN �c� 7��kg1( �;�p{1��-�g1�@�\����2t�� 7D� P4-�oo�'�)%z�2���9�L�5)2<:�B&�)�:O�¤������T�]�E�ݶK����~�M�[�uN�9�\[F_���)6T��V��p�H��tK�u4�ӬV��<k��z^βɎ���tG2��y=���<�H"Go������1o��J($�g��fwd;�Ag��`viI��!����;�oE��q�-��EIc� �(!"PG����in�Mv/���^;��1�b�Mx� q���"���3��&�8*�^���|��ҿi�3�շS^W���Yb�iJn*M-��ű���]�o�.e��_����k=e�o:�Z��� �� ����2w�����/�����/ץ���y�ԥ��yV��2s����:Q�b���9?͖�VtX�JOq{̿���;τv���yhOÈ�l�,oe�'t�ALAV��qҩ��1��ʳ?��Ϯ�Z���9����eM��*�L^w�©u���,m*3�ql�����U0�2�'�z�>��6_W����ʧU�;�(+��4%ɤfei�^o�H���$S���;�C�!;��竭�>��N�5)D{ʎ!�K�}� �rљ��y�V��Ќ�w�1�H�d�����e�;����N \��D�FC�hW��vπw�;ty���9rӹ�p��\;�>#�~��`�)��a��h��Z�b��iz�Y�jq�;~���\l��ЛS����+�rjB���k���oPl��� �)^��NA]'ޮ�h�}��f�"�c����.�!��ok岭�o<���PB��{?L�'�Eԗ� �D�� �=���]*�.�g�����J�Ŷ��}Bo�t��&�&�� e��\��E^{��/�NK��DX9#^4x�C_ jK"���w���C��j�M{��.��(,����ր���+M�sQD�Q��c�T�P^/4�y5���@^+/��'w��4} ����Zsũ���"�`W%�� �y��GIpC���0��:E?kݺY��Ɏ+ U"���5U�@��Sx�W�����.�0p���Ka����X}����:���]z����I��nN�6����C�̦�߾uQ'�|䘔U��V�є���N���=�?��v7� 9l�&m�O�N�b��{#p���G^]<Mb�H�d�|r!��q��؍1�����a+�n�a�|)�S��Z6�>/�� �SJV������N\�*��T-�@vf���V��O��!h�4Rh�t��LaH\d�,�Ӏ"F�'aKDP��o�(�z� p�=��c��wd7b]Z�8p`�"2����X��:�"�ŋ��׃�'��H�����-2����s֯�{�/�Ǿh{�ThrĐ��!CT0b����/��b� ���� Ԝ[�9�>�(^��0a�tv�avńQ1�So4�V�x��E �Nl�n=��z�x�ϒ��Œ;�ؼ��Ѥ�$���. )����_$��1(�}�5$ӊE��P۔��&�~F̩��8���ޫ�`(1���E(ѻ��&�G"�T��¹|���b,i��(��(��1��8��W����0w#BS��GX��K�{_g�S�.�ф6��g?{i�֛��뷛��⥶�v=�vlTRa���dځӖ�Ȕ ��\v��힁���U�U7V͋ ����*5}�$2��uC0w�҇A�å�ήC�v��E���L�SY��>{�4&��<zq�D�ADh������B����>�~�MjF %ۇt�_��O\�'�,}�%�l)��h�z�%ۺZ���y�I�F��]݂�Շ_�'��7~�U�)�<2N(�;h-��P�q�]�aV%�?y�y�N���M�� ��َ��y[�{[�h�1r�#�}B+:>̮�ׅ���N �" �� ܖ���7A�q0������t�#I�$O*}~�����T��w���D�E� 7^� ���ٝ�#D�(�%�M�*�6X>$�@p^ ��� ��") zA��G���%b�>�>�T�^}��;� �O��ǘQ��;c-/ ^��#7w�Vt s&��G'*�-#�צ�����Q%��^M'p�c��"��-�W��+*m9z�LԎ�p�������힒�{ɑ]�}}��(�b��0}��;ax]����t�[)��Q��@��]�g�Д����vÉ7g�㮆�'fToJ�fȬ��"�R���ۚ�˫DŽ* S?u�=95�j�U�!9F�9��j.��4�p|�P�{wΔ���"Nz(m�W`���yخ����`Ű���Kf�?~F��m(ȑX�0���s�r���6��D#�P2 �='����H���BL"�-0j�0d�NG����̏r�F=/�t��u�?�"J�u*���/�^]2Q.U�����ԩ�\��|�O�Y�w�/^���p�9�ߡ�%�Ԟ��v��%���(�-��FʋkB��e�Nk�=vuP37g���,�� �}��Q�įKL����Z��>��:M���N�⏆���/�"[I}II}{R �w�u �R�_����Kn��x�RFmX`HS]��}G�ŝ�-g(�K�qA��M�"�����qpn��8o|�5R�g����1:?M �N��� <�/@����U=��x���oZ�N?䞧���m�Yq���o~Z�7�Z\�Cѝ���-�:�O����4��u����y�� ��=Q��W\A�F[%2|��� �BbE�6RM�|u������B)�~]�T� ��u:�L�*|<��YR-fgg}����L�b�u�}�aLW�W�ЈR<v�3A/VK� �"�������g�Ԥ���7�vDȉ��o�n��GC�#��&����}��?G�p�.�cF���x v�n�Kp_w�}^����Ь�� �8 D�������P�X�@j�%C���H+�O�5�����8}ރ���,�ψ�!��Bp�����=��z����x�Zm�h3����@|ُĉ���7F��^��Qef���^XDŽ7���J|6��ީo.��9�4����O�˲|!�, E�(�4 a+�[Kp� ^�Ŋ&^�j�Dth)�b!�72A��yc!��$��y��� D�#��4j�oH��Vp� ����ٖ�O'Go���Z�P��T��1;�!�*�7���� ��9�t��/��W���ȩ�� Ze���n�ꪞ��vMOL�v��:{\�~K�����n���jj"�)���|o����x\W���a�4�I3rXڍ=1�]� �f"! V@��7����cۙ�.��#❍B���8����xq;�[�/6��P���.���]�ĞC�>��1a�%O0�<�;�,�A[w��*� X�'����!(�=��i��}��&?��#�^$ ^�2)�m4��sD��E|g�P�b�2�Dq>�����n.*�?�W̸x��(Ļ8�s�D���SD<\��"�5�3PsA90�7�@�R���F�q1x�od�YХ&���]�b�nʁ�db��zy�a(r�j�~���}@��8�� �� >���>4��J�.]���R��RŨ�2��*F A�6�r���]��eH}KK۔��J��ҡ�ObƆ�������L� G�hN'%+Sx�̒jU�,�V/�}�2�D5�NwY8�G���,�Je���A�h*c�幔�����wޡ�.���0��{D�x��Sf�Ѣ��2�w�$�F�-�:W�Y\���D,o�Iy�ך��nN�I�� �,i��)�m�#Y�Ǫ��j�U�-3���Y$v�%%3�Z��p��V.#�cNf.�5��d�$��C}���,�KSצIX�$fX�͊D��M�^uV�J�0R���s0=t�@k�T�o��RZ$��b�X��*e�V�E�W��ϕ�5��T0��T��nk��ޑ ��7&�$2�iy�ThF7�����u�bqe�y�#l�R�*[)I����M��k\���a�#��u[�N^��3Vq�אnL��(v�\���f�T�GQ�I7p��=3?��קw�(sn�Y�IS��M�g''g��aFm�L*1��J�J�2U,��O����}}���]�&k9-��D�����i-%�}jS*0������XX���W��b%��c��R�LR)��$M�����NK�,N����c�إ�Udf��I��$�D�Ģ�*$R�� f�LM�Mu�LձK�7�)lJeh�Z%�V1՛ �ڒS��.u��4e��l�J=�RS�j>��r�l��ڮ��b���4����%ǎ-Y]�#�,E�J����؈�]?��S�gz-K���=��:�b�����+4�A|h��FCR�(��"���F'ch�)���= Ejj�����R��7���W*J�o��J����L2�lX����B��a��a��r��:���Z�cůM��?�'�-�V���<C �^%�y/�ϻ����v�YYL�� �A���iˤI[��&mij�S:{��=ܠ���?�3)���?gՠ��N���%r�|^���E�����$��$����Zo�I�IM���C�ͩ<4ƻx���ij�V[��{ ���r�T�Zj��Bu�T���4�+��v4�{Y�X�;� X����ڸͳ� �� �_�l��X�l|��ن ��b��q(:�f��j�M�+g�:R�?�1T�l��J@�����+�&�9��s�>��x��n����]m�P��Q�Y��5eS��0� ��Ư_?^�:w.rMP ToܞL"�ʛ_��b^��GS�7e�ZUd����<Z�i�<Ol�k}���VM�PŇ�&�jY ��V�����j��dI|���Q���2��=�`H7��E���R�("*E��z!�Խ���Q-m�*�8���Н�1�QK�OJ"��R0���,�cW"�a!(�赺��L����nb���ޖ�N&�N�3:�\��)��h��Vw&�@ѵ�6���i���l ��,��> l�X�������>�ͧAGM1 ������0�B�ǖ�c(B�0lEguKP��pl G��»v��h[!A�9�v qo9����b\����#�}v�@�0�4>��� B4ZQ)�?ݘ�:>�u��X� vn�(��z�HE�~���Jń�s�(�7Pz�Xx��@�?n;����E)҃�4�E�J��ACuJ�yc>,Fu�U��i���Z:^�����{��P?��cY�ոOB�k����3Xt�5�P��T�Er�ׁn�*~)pD�����M�0��;bMA�폨p�[인�ւ�� 4��]�Lv�ky��4a.�YB\��UE/5lbK2#M%P��J����vW�θ��n�p�����k����'`�@��ɴ�`iʌP�W��8Ġl�%�t� %ʌ�SQ~V����pj*���$�w��^#G���1i��6��}��"vw�"��b��<nc?��ͦN��i&�t�~�ؤ���֭��:f~Y�g�m�-Y�`�ΔisV��3mJA�Ų�ɹ���_3��YUj�B�$,8�;DQq�����ܓE�,X�6P�+��բR`_P̋'�4Y�{[�*�e�7-n���w��r���'PŠuw ��?�u��:0S*�{����?E<�y��N�!7�Pղ��A�&��1�6l�'o�5�=���C��oJ�2�����x ^~� ���[���Acb-��~6��?���������u������!X��燚�������G�cD�q��n��-���&�h��ˀ�Hp�����:EG+�n�!�.<����zMh���9�l��b�젮�@�ȑ��p,.��U�i7�e�Q��j.��`)Ƒ�t�;��h��yAP��IظLK�q!���"���zF�Z�c J�g��4�����F7eV(���`1L^5��B�+�������ڽa�]�-���j�l�ԅ�:�[Ų!�}!b�(����8z) ���_J�|�}dR��*��jq�l�Ͻ���KϽ�Mv��Dg5�Z5��q��.\jm�Ek6��md|v4�MVlq�dvԵ���_<r��&��M�ל`Oy���E�~�vҙL:|�Ư�0��g͂�aG:v��p (M�S�<�ӆ ?=�&��g���<2��j��z��N�n�߿�V[��0?H�l���nۂ��&U��>�zrMZښ�]�].����?+;�z�����#��#J���z�����~:��vv��ۻ������$���3�1�~e�����ݹ�+t��J�G;�I ���mW�y�ؤ�q�k�*�dƜ^VX_<:7''wtq}aY��a#����TH��3:��#C�y�V��Z�Wj��U֕�?��;A�Y|�.d�7�R]���&�ODh<*z@�� i݉Aw�N�A�%L @�v�I0�c���*�T����.3����9R[�VJЩ���,��՜�b��M1W�R �߫�>EƉ�N,�`õ��>U8�z����/{��2�3Y��h�확b��^�āpQ����{�/�RX��_߲d8Ȭ��6e;���зk�� }�B r�fq� � �Hˠf�ŬD �ζ��%�,�Ĭ��m ?sx\��j\�W�W�UqC�S�~����m�lY��3M�>�q����s3`ػo���SL�4.\剶�jl��u�[��I��77쵥������������S4�m3�23��ȧ�ꑳ�����lg��@��͢��؏1��W��%`T�;�����ω� �ExC�t�#�8*g��3�0Gx{�!w>滢x�i$�pl�ɣ�` ;f��7kA��fy���h�3>>��G�U�4V��O-����H�Mo�K����<'���)m��?����%�{[2p������;��>κ��K���>�e}��}����ڸ�0�D���2`�TIH�nP(�A!6�Ƣ��2�h��k}�U�3��Y��ެș�t#d}s�|����'��s�|�\�P_��ξGփ�$��į8;���Bh�Q�",Ƙ��{5�k'Z�Uָߚ8��~�)��A�^�R�-��-�.fG��W�ԋZ�G�E*�.F��zӘP��������.$-J�}�&��\�V��T�Tnv�������?a�/'�n��-{4�yʐ����`ʡ5���e�9<�4��e�U斕d�T��� U6��?��AX&�튨Řf�5?M��A����6�eb�$�d�`�t��%Q��p3�`��s�b3�N����n�MSp��U�5�G [�6C�n���q��Ҁ� �0y��"�U�(t�K\�SR�*1�S$AW~��g�S��v���t�QR[������ ��%������Z��ԛg��X�o���3c(|�:c�(����s�V�l��`�n����Hz���*_��~�uz�<J9L�,���,3X�ӧ����X � �,����t�RYP�����%$S)]��d��K���nB�d&�n&|���)�ò�{��� ����K*�/���~4Y���k�N�_��J�u�q��h�@����kߟm���84@ ����"�b-M�/g�.�,��@hL`H���. �}��k�o�py�\�#4T �3�qЎY��cvh�/a_�I��N��O+�U�i�� S�V1���O�!�D�t%C��ԯP4`��@|��&��8CP_�º�OV*��^��w�v������Y����7�~�E�U������zD���4: f�b��ʃ��HB��k�s*�DT�6tFY��e-�}e#t�5�}CŹ�Ο��z�B��Zs����� ���#��C��8�3k��0!�\M �z�`E!hЛ=U����~��VФ�U�Ƥ�Ҿ�=Wi���0�t�ն�ş��4���<}�K���ā�a)*��[k�9��'�n�JG'�������Pٔ� �0�u ��V�Y��T�J&Y�c���D��$�ϫb�r��<��oVH%��.��T�(�O$�� -ӶD��\ �jK�Z�4R��I5r����cѧ��Tɜ�kt�kI)�CB�u������P�T�`���8�M����.o� �0��$T� �0a����W>P5���X"�ݫ�~P��]���#jDy���%K�j��$��-v!��F�~3�2ܪQ�5`.|�ap���>nw���/y��#?X�##J�w�5��( �����Nx�4슩q�V��^�����=~�R�'Ҫe,�ҧX����M�}�j�J-�)T�:�א��w�3r�T�'�����x�}scF�y��7k� �V0�\���S�M�(�2@��u�:-YzǮS8���W���[4;0���q��Ʒr6�SBIX��qL���t&t�&��#M� �����G�#�&t ڠ�4�7�0݆���I���p�X2���M Lu��w��Do2�` �%\��7߳��g� ^mlm�W�)s�X��7a�o`B���f�b�nQ��1J�)�?F�T�7ѣ���;��C6���XV}EBq��:��ٗ�zh��W���*S/�'��W I��~F,��앀��Ud� �A:�ɫ�+�z:�b��4'�Ŵ���؉�szk��ܮ�.08q/8���k�Y��H���E��>��Qv��ŋ����g�O�~aժ��b��x.��쨽���'��T�Y�&7(�w^;�����[�Ս��$�\0w/��6p'�"�>@�'�w.XHZɋ��(���j����X�yc\X��{'Dy�>z-�z�x�y�>xm˔���ۜS��^��O]Ђ���{��E�&`��`�w)�+��ySL��>c���u�a=$+�h)V,��7�R�H�֯a=�U���<��35@f���F��9N��i@6�݅�L�D�Q�s��-�cr�졂z ��� ��W^�~���чS�2���5�$��Z}�݊#q~��d{VF^�ުԚY��l�&'��Jk~O�� �V���{��W��|G&�$��d�]���8��/�v�Dj��&���7��x��Ҥ�U떦���ʐ3���{W��(1�O-����T��}2�����k@N�H�:e �i|�}�,N���j��$}^�\�����X��,_+V�r{-���s�v�7d/�zk�ux�C4�9�9/���%���V���<��S���[ƅ����ٷ��_��:<�}3�^;[��l�z��A�)���d���}���-��U�������}�����sQ������H���:�z��3 \D��_�+B��3F� xh�&��>����ϕ����4�]����j3�=/�#���T�Q��c�ϱͫH��Bw��_��Ee�^f�[�џ�3���76N3�w���\�"�R���1��v�/}}�"�O{<��Z���@!�g�(��E��= 5�uW� ���n��&�iK�$j!�jw%P<��T�<�N=���Q��Z�UA�nŀ82�+�^Ra>?�1 �E>��9�|�.�mV� � 40 ����l�<kO6�ҋP�$K6m����� �&�w63�dV�k�'�Ո!���o=�t 4H���Je\�r.mOa�z��� *Z�ҩ�W���[.s�ߟV"����k>���K�҇k�|2A?���g��`�f.�}�W<wպ���+�����~�8�U)��-�l}P�ժ����*R3���7�9~�>�F�\���[XQ:�J1�D��~�NN�*(|C^�&�@���G���j��1:�;kN�\� 0�ƅf�Ө��p?���$��0����o�G�G�߽�0���Cは/�������z�����F�4X�~�d�IE���[��.����9љw�I���`� 샧�'�a��b��$~�+�/�m��`��.-�� Q�b��'͛�"+6�XJ̓n+�fA0�����H+�l�_��sʴ��!�-Td�ؿ�O����dɜiL�j�����N�q��J��ɘe���O�;;%G�'o����;"),=�K�� �][��� g<�F�h�.��~�[�?� u��}r�����f�2h^�3���s�j��ƾ���5��q0f� 8���u�Ĕ�,'���5�D�k��)@?\��a��^�=M��Z_1�&����c���M�Ͳ�k�����>��|���M�o<�< ���4/�c遷�<�l�ٛ��,�v�߾={{��5���Y�{~�'��= ,�\k����^&�'0�tX���Dl}�F��G*��QT?���.�ZۂK� �u-Z���Rhu���0��!$7@d~X��ɢŎ���xx��+x����4����V^�Vu��P��i�f ���w�z��9i�{V<��ї�Kw�#=��`������~ёޏ��_���ф3,1&W->�xj��~����ܱj�a>�t�x�k���la^�3�qn��i�i�З�1M��Ɏ�H�͌�و������ KQ�j�1$a�g2g#��K|�!�y�eD��Q�Lx�X��{i�4�{{V�����N��l� ��Ѩr��|�_I�G�$iu,�N�?TW�߂bt*x�����A��u���t�A�Տ�7���Ѐ�\84�d��ه&��I~�Xsu��l����0eZ�~�rsUJ�kG���� )�2S~�m��Vy��n#�~�c�hV��A+�c%�YY�� Z!���W1������t���A�1y51�+A�E��8��ICo.��V�3��['��1�;��S�v2Q��:p�ؽ{�/f��b/�����vܽ1<I$U� �PUa�hTRI����ԴV\U��j"��RkMoy���Ӈ� 9* ).�:{f��=�Ͽ���oQ��j�%k�1���y���T�}�[g���h��n4�4�\�5rd���]qۇ�C�<i�̬��l\��E�O����C&Z�*ZZv�i�-��w�����*1��t)����S�*%/��R�j��J�5e��y3�֏W��l�S4j˔j0���4�ܮ��ղ"��aDwϘ֯��F8�Oͦ�&��}�6_:-�HŜIE?�2̓���u�q�Cg���b�Za��f�J�j�4T��L� J�c���X����h:p�{�[`���:�N�6�84�����J&�n�F�ٗ�,-P2d��_ '1@�2�'��r�dD*�Q�����e?<slj��I\��x �+��ӽ�Đ��vs�.��b '���YE�UpC�ӥT�)s�N'S��mٱ�9X�x��mS��D��Ž���1�ON������hS����Ve�湕�E�T�:0�Oap��Y���§Ff~��]8,K)���7��BTpK��/��Ue�dm�Az���kT��`��c�o_�e��k*m>��l��^:����f���������y%����6?a2Gy������8�r�mng�ô��0.�ׂ~�X�nj����cpD1�N70%��p{����UWܥ�҄�oS�(آ� �v-6=�C=s"�n�"^�D�͐8'��ݿ�� �ڊE�BTPAE��U!�DwU�I�O�e��p$�F���Zo��|놪��'܈s!}��q�"T��P��d����(le��+����� V���W^�Dl�Y��s��:�a����h�I�`�X��k�����Uq&HI�R�&� ����5�R � �r#�F����<oj��25�O � �jv�IS��2_'z�"�e�l�+]f(�:�xt䊬��!^G��@��<~�$;%�"#?xmC��}��\x6�4�+��֢}����+��B�6��ԡ{�v�d�d�N�?&s����T����ca��x���i����R�vKf;�7�C�U*�i��U�व�fZ���4j[���o�`@H��2�,W����i�Pr���U���)����L {�<��\\c�@���sN�D�:�_Z��h8))zo�^�R�A�4����f[G�h�ml[���Yoo�m� J&��N��s��KŁ���/��e���(���i�lX�J��7x���$*��1�p<�p�iJ��@/F'�Ƴ�v��xD,�)�N!At!f�=��ΣCs�^p�gs��������߯��x�c��b{xT���N��S�@�`% ��I�S���O?©�7�q�^�.�3l�T�Uf�����>�-���M����>/?�}�D��Le��J�����{L��'����:�y��!��=l��g�w��K�sC�8��3�j�wV˩}.�����'v c���U����Q)I�{W�-Ly�}0W�_훰���S%�����YIV١g�D�7�;���;Z�X�4vh��H��;��n}5���>J1�3��U!�P�3�xd��}�?1mډ��w����E��R`*�A �36��?M~h����Ix�Y= 2��8L��q,�6�h=΅��P�t����{k0f���7?��rF��R�����8`�vG<����ؔkTzgL+V����aL�wp �#� ��&�ɼS,Y�~>�o~3b��!w�cE.�� k����,��)���O��>�������e �1z<���g�T%5"�<O0��;���J7�Քc� ���vZub�o���9�� |DIϧ���\,.�M^��<{vrZ�|���l�� GՀ���RE h�+�hN���,#O���y��ߛ����~��l�}��������MMGm��@�S��a1\���q���r`}X$b�SRRe�ߎDK!F.��ӌ�ޥ�В�Bݧ��{�b/�Xϐl��b�01�v�.LQ-�c��dX����B��G��������AWZ�S����Xw^�y������Z�$)�퀜`c�Q��f��qوa�����1X�� �^j�e9r$Kf��d9�Lh�p�qը��`#�t��dO�Axm�~ >���<��aIŽRZ�P3C�y(�Q��0SrO�� yI#l�YeRivff�T*M��I$E���F�"}�� Z�2j�,}2x k:ح����~�(����a�� �/P��{���7w3��߮��l�g������J�-8���h�|���W��yw��?���W�m���x��@�_�~�>��� �V*1���'�_�n��F�BQ���X �!�I'��P��!q`3�Q���ltS���tb����� ���/��<�;ɖ��?��&%�yD,eOp8jb�>�� �@T����ᄊc�η歿Z��y�w~?��z���E���g�Z��sq �s��n��ݴŖ'��2��;����������G�z�,>���#Q�Q��?_���bN��Ɇ���Ӎ��i���v��njj��~���w`�GS�^`�=�O3c��M#�!�ȧt�xۄ��~����.k:��D!�,茮�?�:�A���t�$6p9�*�> bi(�[�nϠ�A#�鰺I��h*~��[��Dqt珓�j`���my.� ��7���e5/����6u�_T BXa ��?��-t:������U��fr�4R�J��J��o��E-���-j��#髳,��*v����>�&�$Q?㰗.;Q��<a�U (�b���t%�ա��G1*l�%�:�ӣ֤��l�&ĩ���d��,�cqku&Kn^��xg#V�i����k1�n�'��6�09�+�l����|4j��cS��]�V��j�e��A[��)��V٤O���Y�Қ��s�]�7gxzM�/�]���K���ҿT�af8g���zYw��b;�I����6@^�ԲzHI4Z����!�D�ћo��l��}! 0��'��\F�ō��2j5�� v��MxK�UM�ܻ�-~���C�g&� <~L�vU��3 �� �[���|V�\�f��V|�r��9��ܐ�v&��q��o����G<�7���kZ��}�)+Ig�k���ʋ+���ɔeҙ�9s� �9���h��O�0�Rk�+�_��6�`S(�X������:��G�i|�K��o�_���v�����fs0Ca��&����������<�7(� ه���H2��*�2b6��4����OR֍��}q��rdK,��WS+c���+��Y���W��:������Ē7lVCn��d���\�O��0�ƢZ|�����Z����1.k�?WC�t���E�jt:��dK]իG��>�� ]'��=f͚S�'� ��3rx�W�˯�f8�{���)VLo0�床��|`��;&ޱ~Riqì�^OMN�T�u�G��:���I.A���R(��_�M����o�=p��Nt�M�j�7���#�~��s��&#�K(�=<kw�r��M�X�wZ�S� P{����D_i����5��ݦ��v��K�~�eh�*9p=��Į�Χw+zB���=�Ԓ�\��s���V7�ӣ}�i�m5�Uk���� z�G9�r�k�A3�W��'Z܂|�Ȉ�C�'<�FB�o3�>q0:]�p�N�8D�G^>��HY4����]�F�#�� ÷,F��h�L��u�O�'zܴ��%���*����cvv�d E��lg���:�1h�r3�5kg��Fa�t�u~�������m�>џ�z�9q�L�I)U��<�g�x� _�ifm����љ�`��.���l��8�s��dg����鶍yX�Wx�6ݴ �e}�ư_("�/�[0:�ӻ��އ��6:���l�6%��P�,4��� P8�u�,:��N/6�Ƿ�7���.A�ߎ��gd 6{�r0x���؋LF"\b�6(����%D��"`�F��v�p�g!b` �_��J*eK83|q(�Ԧ�J���>W����R��!&)A��|r�*�2�H�8���%ݠ�Je[|MojP?�C[�8����ra�9�3{c��bqo�5&��0� 4���%�e��ٳw��<<�`��� [�S7�߇�?�����C��Ӟ�̶�{"��yP�����n����)�hAc���W�z���Z*����y�b.u��rܚ�[�%Xq��Ꮳ605����n���'N�y'ND����~^���%s�%��藂]ML��c��B��uJ�D�O��_D~��_�8��;U�\W��#'��s�o���MgC=P���9���NWǐ�u0-�ת�Nn�k9tz9M�F̍��(�"���QIS�?�E�@!&O�"��>H@!�����}Z%? �����?� ��q�x�6r�D.�L0"��*r�8"���GO5E7�9���?Е)A�ֆ��u)�~Q}@l��� Lrz�\�'��I���,�\z�ӷy���M��ڞ�0�`�����V�+����έxFGO�_�C?ҭm��2h0���~����|l��C��l�q槇�L?���d�n��O�u���D��`�mp�t����GD������Vf�롷G3�H�� >F`��h㖋mp��M6�\.f/�ђ�E8�� :|12ؑ92�^ ����ԍ5k F?��p�A�� ��Иwd�<� ����w=6���J��@l�^�������}SCG�mr�������f��%[ϧg����i��\ �[�x����,�ރ u��*�Ժ�0: |W�l�rJ��i���6��}�w �,�i2�ִ�i&��y|�[��I�0�������C�^ym�r�i���&�"H����m$��ۖOv���y�x��t)�^��F�( �buroQ ���i7��c#���R�s��M��a�v���)����)f�DjL�(s�b�&[��s��d�Tb1��s_7�牀��:�U������_��UX�/ϭXqX@ ��Й[�F���AQJq��#?����)��ߺ|�V}+-H6���a�Gt��S�x�Yq~�ㅰ�Vjh��W#��r���#1�!���w�48Q{�n/��������i=( �U�-�z�FnU5�˖g���R�qw`�c���4�����g�e���j+�6C��9e�in�33�Ѭ1[w���c�⭽�ҿ�ˏ^�.L�\�x��K��1m��s��\�rG���U5�^4�Z��!�Oѷz�h3Φ���w��ye��ƹ;�R=}�&��z���(��6�It���} |����ZieݲNˇdK��ۊ�8�'�slj�� 9I�!��R �j�p�%�p�%�H�Z��(���h���ʎ�Ҿ�~ߗX;;�������<���<�4�kA`��6KTV2�^4���"��?K/�A��nyܵE!��JbG��*/����J�Z�X���?��3ҹO�;��OCBp�`����D8o�r[Lf����5��~���V;������>Qq�����J������D>�C\K7���]�A-�a�oy�@] " ;�v�sHH��'����&����!�zX��X5���g�ԞNpCM�N���14�^4���x��F���~Fe2��1����)�^p?�#fJZRԙ���1]�����顕j3�R�%��i5��!���̐�?�����B{��WJ-�sv���a����{>�Zi�9O?��W�������'+�Ӽ�Q�J0]z�L�BVQ=>�J�}FS*)ƉFZ5�˨Vj� �p4����]��!n s��Ds4���3�Q:�pӞ#� ���'��N%;g_��=� �.�2I_Y-,V��H���>{L�Bg6��ep�;k��J���W��"u.#| ��]H�������(Pڰ��������F����t�oQ���,�V�XST�fA�ápuN�\[;o�����l��BME��hZ���ة>g�6 %�ؑY�$h�0g��gyX$�^�T���D�V��Å� �b��$R�rIh���;�,J�>`���i9�� P�*N����J���}����.G��Be���i:㳙���CB0�1�Z[-O�L��|9���uG�̘1G�\~��;�]k�L�C�S�Y��bz� ɪ�:���Q��R�����n��NH_�X�>�����҇B�B�)�,l}�U�1ƙ[ jV�]Ҥ]/��?�ϝ8i ��~%���I7モ���l�4U��b��5��˨5��Q7Sߣ�;{��ȅ0N��|�v4�-�]�����$����e�q�����2\Ni�%b�d�.�3�]��@�8m@�n�|7��\9+�إ2�9�e�9���?�G-���n@�@��R�H���T�lI[���RV w=b�C�����A9MVꐗ#�bPƝ����&�b��f.A���@�c5I����ؚ�=����>,�/�eM|ဌ����b7dI~Ќ��Ӧ^���@�5p��|��n��`LZ�A�Ŧ���*�C���}d��.y��<5P��U=kR,��5D��«2+g�/ G�3�2� �S�}r��.q���nƬ�(^��*p���ٍ���9=\�<����,�Q?"�|��p�)�+F�kr�x���o>.�����|4߅�A��d )S:�ƦI|*���Έ� q�Gs�6;^O�~+r.�uD� �뻐�%WC���A�QTیu��ր�W�3��e�gչ+��H��D)����)0:&��p�L�N��t��~�N��m���yF�yOs�[ ���`\k���y;�h_���e��0�@�.ӿx�9�?f`�/�Z^���}�W�BHR��o7z�`��@�Q�4��Άб�����L��w�l_7�^=t�=�SU���Z7HGq���g�E�G�J}9�R��c�jB<�T��M��B�>=)Ĝl #=�v�~�����x�q�vwo������D��k(���k��.� �@���@ºk!��}��!��HZ;wg_8�}V��ܯ�pt��>���>x4G�;r�>�p<8"���d4\:~F�B���/�P�Gb�fU�ޓ��J�i8�ۆݹ��uM�5|35��.a��xn�o��X�0f�1K�����4?��szRG|���{G�gjC��B��*���:����m�6H�}�W�u{ˁ�6���֒B��-�yC=�Jۼ�;&[8��ի���4�|r�q^��9������pH�/U�`mP<=�c�x�O����A����X^�kC��]M�I��h'����P?�Lq�A�C�`�S6ħR�_�h fA ��tL2�jX�BZ����`�͘�p��iDl��JA�Lx�f�ˮ����Ѻ�������ԘUА1����3�CO�9�Ka��|�{۾��T���z�%��E"˫T*��7C�xvi2V�d�9'�a=�z�ˣ�VI���x��F���:��x-� �i !p����;�m/�Y���p|x(��~���B%��W��~�FA)�1S�~�����?E4���=K�R���0j*^F�R0*9GH�g�PR� �Ar��X㲁�xkҽ��쯎����[��q���-E%�C!P�L�4"�z��ڲ��\̛���_�L�#e"�ք���D�WT�SҁP)ǥ��� `�Uo~گ�9,O�`g ��^O��&����W��K5�0��<�0�Ħ��������]o�G���p� ���+��� *��H��EL��� �b�5�pd�L�_Rӥ�J`wD��c�C�l��<�lV�s'`a�bpH������������Y��"⺽�~p��.��|�T0�?�(�CҌ��Y��d�T�c���ؙ�kMC�ba�2x�GM�x��ؚ��6�HF"�"���v G�h��]~l�K���$n(L�bn$E�-��ѐ�po��aT��3�'�f��r�I�a�l���4�;�%�Ն���WE��Qj�+i�"\�6�u�2O�����,�G�>n�%-u�'�w8_iJ�qX�����l0kD��>��%����K�>��g���g^Қ�(a �����H����l#�*�~������)���e�,�3L]�,�.p��`v:�W62|���]�����ţ��^J+���q�XrJ�Ű�/�a��b� ��`�ݰZ�<��TVb�;o�ßv����� ^���Ї�@�IoCe�W���\�c7 /����-��dǶ�.���}���.GK�w����������e����O?}pr�60�����l�zo���v��>|�t�y�ֵ��B�Tup���m_��%�m�z�c���NE�(�O�D}�˹�8%ٛ� �/V���a�M�r��8NJ �,�3R,���w_V^�Xk���� ��a���'VZ,��CL{�TpU"2vh{^�scS�*1�b#�O�QCm�xf���.{@(*��Fz孷A6/V����f��p���'�wG��`�)gI� %[�?�hN�}��Do.�ۇ�̡c��ܴ�m}��J'cy� � ��*2u��=/6�u��X8h��kll��eT��ŏ���P�7h:�xX�hxQƯKh :����a�~RF���% 6�.����x��0����F�s�u.V��l��t���Oa.`Epv�:��V�v����q�dE&�;HpYs�`P�k��3��$7�L�X�ʎ&�x9ݾ��J�R�35�\���zMp�hg�>�0[��Ġ�[����JN�M�y��F�Y�������ԏ�O�� f�N�ȼ��믨Z��w��b!��;;��kԜ�9_]Բ�?R�pD�,�V��]�Z�n�6yA;S�k����Wi`���� ��@]�!t�e�Km&N��̈� tpT�ڄ�?D��!~mR��+�u���& �Z�9"�O� "��FB�M&�A�J&�PD��zP_�N"��ce��`��:P��K�'�`. c Y�D��D��g��:1�Jj��rQ�U ��yH�"6_zH���7c��aO��2�i�s+�����sz�Dm���^��uK~� ���I�\J��lذ����S�G�8ӧQW}���{��J����ޠ��9Q-r�y�!pF}F�KA P�}%#��2m�W�2�cMK~??X͈g�f�63F�{��/��C�xU��~hx���_�D���0 D/�(�g�[��~���=�jG�օF�t�Z��.;�NX8�)˞9�3Dk��k��pHα�6���A���#}�w�{{�N��ޚ�@�gDvYv��,[��a�%���ģ5� �;�nP��s�;sZ(x�pѐ���+�u�G4�߇s�����>=%�s8V�o~��Q:Ot?����5'��f=tg�t�%���_���4�-�9���\��G�p�Oϒ�E��7�s�0H��u�L�c�W��@B�T�]��n�����yK���fm-���1�����V�|���u+�f�Ï��'�����7��6g#�w����v��7�� /������F�)ˇ/��N����w�'�gH��\��Ǩ^_�9]>3�O�P�h4\J��n��x���I���A4�]:2�p97�i4T�z��YS��FMa,�qXK����AJ��9%��+dDF��������ر��DBF�t(LF_2��d���u"�ၝ���E9���*���D\���5����A�5�Ќ���o��a��Zwm�ۛF��^w��L��ꛆ��S��c�X6K+5gff�g��U�ߛ�vK��sn��1Qδ��ƚ*�L'S]�+ �~��)�WOK%W��'�-�3�Y�P- Vh�U�<�į����V�-"��aO��_����*��}3n���Ƚ�]\�g���=tr� ?|���[s*������Z9�� �7ݶ�wͥ�p|��xb�h�d�}����-��P�*�vsӋ+�I�4d��ʢ�|ciS;<�|��ʊ����}帤�F�9}4d^v ��dy֨��A�����2�� -�d8ߒ�S���80De�D���o�[�Ā=��9i�o4�g�pìi5�߾�����L^�d)�L�X�&�s���7�ts���X��5KI�Ճ�<7s�e���ajE�o��9'��F^1#��L9�����>�k��G��Y�ܝ�f�^L�MR_g����S��du��v�mySgOOg�r[S�FL���������8��J�FQ�x u6ʆe��z��>z�7Ʊ����1ɰ]5��Cքя�ҡLؤMf)7�&\ Cʓ'ky�D�=X!.�M�Xuutpsر��^o��S�*�qT�8�l{%�zT� �TOmػ��j:�D.[>*V���Rn�BU~Q����{ڞ�y�&W���(�Z�� ɮ�v�k�: (R,P���(����� 5�\��T:%�E���5��k2�U�::f�g�R����!Г�d8m�/S�����t=��Z `���I��;�B��������VUaft��e������� �0)/p�������!cU����JƧ7ŀ=d���!]�3iu�+*4ƀ��3��s$\�(��R�g��E��������m�p���X7��y���LC�ZQgin^�Rvzi{U{|*����͖:�:�+�w�iEHaW�q9�U���u�O�Q�Q����=>���mLi��\�@���W�icU��u���`��̶��V^eL���?�U��IT�ch|58��rTVRmS�TQ�+Ř�~��cՎ%p����������"�覫!V��S�`D/��\d������߄[�Vy!��UE��d �[�[F�ص�¨�A�C��V<4����m,�i���)C;�w��f��\�N����r������+�K\ �֊�lm��N�����}W͠���0Ӯr��a�#2u��SǼT���!z�؊�?����n���+�k�s��~�����W�V���_��W�w>ҁɅRS���I?�;�|Tɢqj5"#kU+�+A�14�r�F�t�y+IN�y�����0�MYcX����p���dW>��q++Zb�m�bilˊ]m`A�Z^�L���ޒ�|X�b"ku�~p�t8Bf�x>[�&�cf��0{ ����]�����3�̟y~&�H�3P���|m][`7T�GY�rfn��,������k��f�x�/oK�_��� ��*{���t����@�����2��#g��=��/���{��Lg�5S?�(�lK?òc��!_0��3� �γ%�� � �ɰRO��-S������m�r��;�<����ɪ)��1X��ɫ��l�̊%�"a ��� ΘG՞��v'b�X����Z���ȝ�܉�������l� fm�"&�}GPX9{ΰ&ߐ�R��asfW��1�^|���q�4���t��؍�Dӻ'w��'�wTRE�dj���i����}�GU7�c.�.}�!.zs�Em��j��1��ݐ=�0Z�,S��qK�+��J,q����&ʹ�V� �)A{���0�7�Ы.B�,=�1yd�q��΅mIƣ�*�?���� 2�|��*�0����V�B'G!�$�h�B��Va{�(�H���e��Rz�q�#.O��b��{�o�2E�+�RGqaaa����l��ZR�J���-[~����[�ٗ��V�-T��l"���C"�,zw0�gѬJƩ7+�f������g<�Džo�����*p��RG�oҟ&���%c^�~[�$��[⑩.wػ�<�G�wą�u ���a���D�Z.n��&E�uF���C~����L_��3��ϐ��v�5䙾��/�\�!���̫zB��kh�y�8!�� ��G��JR�^ό�*�_���4>��S�k6�A��\��6��n�Lz��#��UC�ر-�Ww���a �HI�I?�� ���2P���j�&����%v�sh1[M ћ��r����%݈$wH���d��~A���7�ś? Wa�º�G~�*|�M���^��nY�R���o^�zz�j=��#[ۀC^�W��b�H�Ro�0� sd�y46~ZC��7�{�Ɨ�����sݳǟ�n�8d]�I��U��֝{6N���Jgnys�]���7��,�m�9�F7�� ���|s�湟3�i/�峹7���fe6ʏ�z��&1>�+a��K;��i� c*��k�پ�m۞Ρѕ���s��0���HzBτ =�gW��V�OR>���#9��~��Vs#�y��nIUM�R��<��}H$���ո��6����K��.^�P�����}M�̓�X�O__,��!�0�r��I���]��^�H@���L�d���\LӤ����)5mb<��O��J����D�F:ya�������/,%����v�#�!�oS���� ؋��Kn�biBq}���c�丣���&�v龖�V�^p���%�Bڹ�L�YL��LH|��F��N� ��F� ;9d��3Y� o�#A����b玲I$^9J ^�o����Z*E_�|D$�_��k56�����2�Ʃ��Lmȟ�x����m��n_�ɱ;'�.6���~�ģJ�%�E�g�/�E5�E.Ì��sn��8ڗv �t���Dx�r������礟/j��;�QR�nʋ$�;��O�6�^G ��Ez��Y���g��&��UuB�����W����Y{o���3A����c5�Y�Y"q�.��SF�/��Meg�H����4��N�^��3��\�m:���������.��z��69lP�P�i}���Vi�D����Ty��7`�k�(�\fs9�H�&Rv�Pi�*��@�h^N�5�kpW�V>IV-��ZP+�B�3�5p�%��oN�����ਟ�q��o��D� 6q�+���uVh�Y�ᔅ��ё�BVӊ���*��b�K��h�.8���̲�6���_�^�d�dy�ԠԘ]B"ђ)��,��i��37�ܿM:�_�i��~�X�@����,�-�Ѭ��,}�pa���<2����8����<�|{����ޝʰ��~�Ő�;,j^-�@��d.��=���4�cj�� u V%]��8���})��Ϸ���$'*��K�� �X1��l8HH̛J����41��E!gy��,�U=U�=M5账��z�GV��!�=G�?l�^3�B_n�evM����IY�dkۖg����5�:�ñl�fp�l\Cl���;�>��m���J������_����$�\������?�7��wj=zŊ�q� }Lx� {�o�FQ�.j.��ZM]Im�n�vQ{e���W`�el�|cΑJJ�b�L�sI���R���0)���-���� �;U��M*��C�*.T��]��<��� �z��]ʗu��@V��ޗSޕ5����3J'�Grd�)��,���ꁪaWw�iְ]�"Fs�-aאb�J:D�r�1I���'.J ]��-[�|����:�j�6"y�F�vju/��c�Y��x��|�P�/���A�ޡ\(��.�]V��H���!��O6q���r�����q�Gv�X?$K ���q3̘�&����丣߹|d:dnI&�.���B�Zz�b@�&�[1�㹞��~�_��OG�>����բ��h��^��Q�|��w4]���`��]��w`増�s��^toǿL��ψu)VB�l�N��u�x$�V��6����}y�q�c�<$^�G�VM�)$��U�e_y�[��ń�$�`xK)J�_Sn@�6z�D霘�1���-��=F]` P�{����7�>0����!Mz�m��)��?�������7?�y����i ��XyUUê�Vl9�U5Q�y,4(�/��5\}�?o�&,{w�)3�]:�~@}.m�@k��&�^I��'%���ŏ�q���i�%O�(5L��A١���z�j�q� ~������q U�@�J��X����g[��_�RE�J�rb����r�ֿ�|��v���� �e4L�E�Cލ��f?��_^r9�-R��7~��'�rfna����@S4�S`�@4z��9���Me�`(x$������[vrQ��� �p������ AW�_v����.L��1@!��Cd/;)̡�X��?x��{;T��?V�v�a�vՠ8������m�rqF�ߦt����>��_�A��?���P5(~N{�'\:o_\z���ʬ�c<�%�}[��J�5��<<���_����yR6$��k�j�~F���Lt���ɦq�N���DrÄ{��� ����x!E��:��0���r ��D�8���ҡ��hWaY[�p���q.�p�Qr�Fv: �:&!=Q�Ί�PXǠ&e":�آ}0���hԺ�A���� oU�{��6���:��+D�3�2-m�y���,ͿH[�>�`�P�P���tQ�Z8�f����� :g�AQ�V�*)�Bȃ��&���1�^o)*���k�V�y,Z��/X��V˸E���J?m��N+���g�jGl����ч|}���kC_��s&`4��l�-�B!�W;�ZmH��5��ƿ�+qJ�(�l�9��@gQY�9O2�]:�jXڠUPRb��Ty�q[T|�,1�%�g2�WZ�B�����bh����u�aI,�{b�A�1٪D�P놜�z�|$X>�t��B�����wʞ�N���j�a��Nn��6~, ��Kڠ��uX�h�}y=HЂ�h$�����A�T��g��wLa엪�͏�1a�x�r� �J���t�<��&5Q���)`���6/4M��%���go��oj, Z cM��Z���p���Lh�֩gGdW��a����75Ł"�֨VFm���:jYh�ڴ�i��6�͛�q4e�Mݰn�1�Bt\�T1U�x�;$��1��H�kh�b�Ą�Џ��H�����1�S�[.�s���Kګ�d:�I����J����, �~�~=8�p�Ӭٻ�ddx�� &�%b�(�Ns� �ZF�sE=����X�x�-9��FTx ʡ�6��u���sJ�n����Ԭ�xO*��(��^��F��fа4JH�۷���}wI�@-m��R�硢��'��,����(1&^�D +1��/������������J_�i�^F"�����5<�M�ҍ��KѾ���0�5J�@��c�����"f �j�W.Z�1�mҴ�m^�d����� oJ��)�m�[_s��E ��}�/�of��+�~��`P��]�q)��H����x�Ego��륾ᝁ F�i���� <���]4d+�>�P0�c#ۜ�z�w/��]�=�s@+ܳ�<4���-���#�H�w�4�f�EEi�xk��!���+T�- m5�_Vq��&[�A)�f�����ӆ�5��,�(���>�,_mW�` Ђ���v��9t�͛�Eo�s84*O��{����l�ӧo� ��LjF�/x^ý����^��&�S�P8��>��A&���::�ف V�7C3�!D6d���!X�|y:E��_%7���gk]�&Tm�c��VO�#P_�3k�*�"��_�/�o>|�����������1�r�'���X>�ҧ�/��%�H���yӳ�>����Z�j4һ�T@h��n�u����/~�L�y�C�a��aU�4�Wi���@~�d���y��G������Z�qi�$ݥ9p�C�@����&�sr��<>K1�ѿK�;J����D���,~�t���&�<��g��OvL���;^��I�C��J=��^FmB}d�C�,~�P�xG�2�?���XVD~��h"^�?�]n(5����2?�(8w�L�3�1��[H����E��l�7�?���+�G(���6}�[0�)��ư4 �A�k߄b�؝��k�Ŋ��uX��U�#�)V����7Ń��D��e��t�[���ٙ�>�@����84�� �-9����Z�.n}:���Ε�z���#��dh�!�� ǥ����k�O[�:���!�]Y�)� �t��dO��r�����rv��P2�+�2�*T���EڄUj�PB�wK�Θ =�����|�Ǥ<��3��n魠*ڿ�fMh�s�X>W�gO����N'$�u7��tAұ�A�����q��h�͌̇��D0��'�*��&4�0<BXFF�V�}�o�q|����Gg�^��ä�kש�G������NrJ��w��s`Ϗ���U�L��:��J���^�� ��c�k@�� }ߓ��M�$�?��t�^"�Y���S�N[yļ�+��]p}�L���FY>�HCA���qp��y��M?�x�� MzA��� �>Dm�7�r)y��蒾V�͍������l�1ύ�"wm�_\s �ɬ�?�=OM�fR��5�U�C��ԫ�{�G�����eHa[�y���� �=sD� R�U�W%Rd1�'�=�uR�(/_� �9�ַܺI�� �"�%����;�0��ݎ����b�+M���G`�p�\�{��?sXR�K����V7��M3��y��>�� ��s���h�)wd���c���yt�\��̌m��7�x���5~ng��l4mp�Ѩ�!k ԣI�dBG�4CB�s�5C�OYb�jo��۰8=vMa�.��/l�n�����M�q�f���J��,�i��a��s2�`0:�{�Y�),fs~v�A�t��T��1��2?�+E1�V��h���cO=��B@����U� X��y$c9��h��� ����h�ׂU ��ׇL_�CAkHq�>�������yJ-��-?��I'��<��TJ#�2v��$d��1��h0�Y!}=��n�b�J0�d��N݊�T�l_9V9��Jk����m���{\n.ӡ�>A�B0��f�s�f�X |,c�:��k;�u>Cv����F�ގ�sZL��W�T�x�c`d```a<=�|Ed<��Wnv�b|�F������� ��``b�d#�x�c`d``c������8�"Ȁi+{ �x��VKkA�y�<��,�5VIL�,���E����"�E"�'sj�����J��U3U=ߴ��K>�����Փ��g�_��(�ET��u���=O�'{?<c|u�>�Law��]+t�w���^��nD.�}k�zՇ��쯍U}ɩ�o9�:����;��FШ����O��;��XS�B�[x���e#2U�o�ا�C��������??✼ 9�Xz{w�>� O3��E��*��De�[�=픖wE�:s�e�I5o�ÞR݇�G����=SB�P�s�|W�+�Ⱥ� ��}[0��l�]�1V����~�ٴ�F�o���M���r�����;�'�����O^gL���y�h�o����l7��/���ӌr�q3}=vC����C��HF=�ǡv���@�i�lr�.�r�4�C���үV����ldV¬�L�[�e��N���0WԿ�o�ϓ�iosW�wz:�z���Q��Y��Y��3���R�y��K �>?��+#�B����|�J���zj�����6�]@�UD-�P�v�>n໌u�;���W����O���MeFY�г���\�l@���*�!����u?�'�m������ �'�18��>�w��C�Ú\f�M��c}��~5���l���mo,.�}��Y��r�[�K����f\�y���B�G�y���o����C[����� ����|�E�E@ ����\}�d<�z��/� |�x���{T�g����N.��i�B�d�b!���3�i�M��e�$4��M�=�'4r���i�!�e������������}Nҿ�1��H6dH��A�T8T*� �H�GJ%��K�^� ������2 RY����HY��Ryr*УB�Tq"(�*ѯ��T���D�S�Tu�T-�I����z �jp�E/�N��:�R]ɕW����gKn�l7w��S�G�G�{�o�x���D��J�=é =���Ż7����,5�w�0@N386C�����&�9^5��;�J-�H~�i >��j�^+z���O��P�u/�/��w�R+�����=q� �v@G�S�LLgr���<��IR�B��]�<�1���ug���fO|�E���_�P;�ap�K\?��G�������ǁ�\���Ti5��s܇�}8�A�p �O�?������Ͽ���R� �Kr�Q'�s�?�YO�w���1��IN���0��EQ �S�9�?�'���0��i�O��do91�1��ٜ�X�Ų�X�b9�s�?��84�Q+����q>�_��:K�ຈ��L����zK�[�w˘Y<����r4/G� f��+��*�$p�V�{"��r �kr���Z��u�1 nI��x���c�7�l��Fzmd���f��L�-�ڂ[9�[�L�6�i{�[�G �w�o:wSo3܇��j?�R镊���:�g& >��u�:��s�GXK�˟���Qt�����8�;��<O��$�'�| ON������2�Ltg��k��uo����\�G���|�؋輄���]書竬_×�h�ιȆ� �o2�[�ݢw� ��q���L�g��<D�#r�=��'�|J~>��S�g�9�^г�o��/��/� ͯX{]\Fe�l�)�H�X�L��eJ�dJ9�8+eJ{Ȕ�*.-��o�x���2|@6�t�L%7@l�^�@���(��ce�E�T�q>%S��IN-��bυ����!�.�ꎔqeϕ��ʸ�ȸ�xP�!�Fލ��4�I2^ 2ެ7%���w�i$��<���_�L+8�;�гu�L�X�-��@��2A<;���@c'8��3�tAC�.3���=P&��p�(ۓ��1�����o���������O��)2� ye�e0ڇd�eN��d��gF�{u�B��p��o����q�D��>�*3�� �s3������=��6��(���T~G�7�����7��L4���Y�C�ٜ�9����z���]�����%�q ���ϖ1�T���e�W�e}�(�=��dr��w���s�oWs�e \����迎�$�H�}nEc2�pϘ��o�����K�S }w�o����Z{�/��o?9��w*z�� ��% އ�a�a/�G�|���<�lO0��!�������r���Q&�<�/P3\�w��D��p����ˆ� �n��܂�-��?�3u�>w�y��wᘋ��ɀ��u}�є��<��m�����O�~�p���)>���k�y�g���{ü�,��Ǜ��u���β�<d�-rJ�X�l �K���l�<ٲN��Xs̖��'[��J���lOY'٪��բe���&ٚ� ]�%R�6��$ʺ˾C|� �ĺ=�m0C֝5�,�w�d=x6�V�\YO�(J��?(�m�,�!��~Sr��������~n S�%�Z�@6m�e�ю��p@~����e��tx�c`d``:�$ɠ�L@��`>(Mx����jAƿݤMk�`�R��AD��ݴ��7�?�Mhb�W�6;I�&�av��k_@��+@���U�o'c�BMH�7g�����<�������d�E �,p?-QvZ^��S��J��r /�g��p�}oyw�/��x���G��Y��:w�LƜl�e��>[.�1�[.b�q-�� u�y��זK�輵��mwfy����x�~������b�b�Ї��1BL I���vQ����K^��I��k��&���LŽ���D��0�fb����`0�(JfRMdD��I/��DK1�Z��`*�t�M��Ƭ d.�do<U��ڨ�U�ڴ��Mr�;�g�zpXm�k'�F�}���FUF��]�=j;௲��K��i"���bD�.x�B$�d��y�&��_j����Q�>��º\ՒO���-�9"Z��mW���j��\DI�滎��Sid�IΩ+�Щ�})��dG�»�2']�Z����J�Z��rl�$��;2��V���z���n�M�"�L4�R�+�_� ���e�k=��~^^8����D�9�yW�y�1�E&���ϋ�x�}Wt�ȲuU�b'X��̔ؖ�,O`����ݶ5�-� 0����̏��1�}�̰�����L�s~N�$ݾ�}oW))L��?����nJ]��.uc�ԭ�R��n�4d 9����0���� X �ư l ���l [�ְ � ���`{�v��`g�v��`w����`o���1����P� ���`8���`8V�L��¡pG��p ��p'��p����p�g��p� �P��zj4�Fj�-hClX ]p�}p��5�C!D0���·�B�.�K�R�.�+�J� ��k�Z����F� n�[�V� n�;�N��{�^���Ax�G�Qx�'�Ix ��g�Yx���Ex ^�W�Ux3�� o���;��.x7������!�0�������� �$| > ���������"�_�/�W��5�:|� ߂o�w��=�>�~?��O��3�9�~ ��_�o���~�?����+� ���¿����/��0��b�pX�a�Q\��q�čpc�7��ps��ĭpk�߄��v�=�;�N�3�n�;�{�^�7���c �XAM��N�~�?��Ax0��p �qg�P<�#�H< ��c�X<���D<)�:����x��g�x����X����:6�� [��ڸ��`�袇k��C�p�qq-���x^���x^�W�x^���x^�7�xތ��xގw�xލ��xޏ�>���>�O�>���>�/�����f|�߆o�w�;�]�n|�߇����C�a| ?�ŏ����I�~?��������E|��_Ư�W�k�u�~������w�{�}���?Ɵ�O�g�s�������o� �����?��/�W��������?�_JQ�2���i� T�a�QZF�i���hcڄ6��hsڂ���hkچ�D��v�=�@;�N�3�B��n�;�A{�^�7�C���S��T!�L��M�~�?@�At0B�h��i�f�P:��#�H:���c�X:����D:�N�S�T:�N�3�L:�Φs�\��ydQ��$E-jS�lZM]r�G}rɣ5�S@!E4G�@���Χ�B��.�K�R��.�+�J����k�Z�����F��n�[�V��n�;�N���{�^����Az��G�Qz��'�Iz���g�Yz����Ez�^�W�����cA�v#(�ot�?��S���tZ~A���y�b: ��n�N/vj������� D���UϝS���۫�|\�QHn�� �v�r��3�o�t��<Ϧj��C��Ҿk5���|����l�I���uw��9�b�a� G1���0竖��N^�O踍n��X�o��uܾ s��T��S�M!���ˮ�nS��V\Sh������Kѳ�n���~�mX=�[������ڡ�؍b��ZG��NX���v3��Y�_sT+N� ��_L:��>��WGAh�Ӳ���o�{ N��wG[VCɩ���rs��#_e=�o�N�gy5Y��VS&��u��f���L����D�� T^�n5���iY|��^~�Hˡg<�M��p�\�e|8~}Љgҝ�Z��0��n��A'��DAM�Q��}�,&&��9��#k"�G�8� �������T?�ሆ%�b`�*ԭ��i��;���4�U�v���#�#�r{���"���g9�r��p���nY��b�)��w�Wy��Fc5���p�@ ���~;~=���W���~���o��\��X�l�j�UX�W�;GY�=�W*�{�L��;�b*?!+�,a�^���C�W�~��l_�b���$��C�er�b2�}�N_crߥ�ZL�m�z�H؉z���*�L�d���I�rZ�8�$1%'�r�q�~�͙e�ok�o��9l��qB�~�ɽ�b�m3C=�A�&��p�c�'D��˛t� ��p~��l2s6�K)����7��4�R����r�bC����B�e��\܊�dDdE���zG��`$�`�C��!H����Uv��;�ɄV� �Qy3Cu�V����87�'���F^Z�2���ٺ�8BP# YJ�O��b��^:��TAΧVg�v�q��~��A����]vx�vg(����PwT��k78�G�������;�����y7�b@q�@�5T�>s�;�'M��I#��I3>+�7�A:p}��=�[|y�-N*��y�.��orJ���qQ�Y�X;�(�C�k�8����>koqD�Wpd5�E=�q�un���k�6�t��$��z�"cÎ��|١(�S c���J)�0.Geɔq:�-�#�����$�Y=f�� ��f��-Y��V�t�y�����XK�h�Q]�ԗ����H� ���e_����`~�(�5�TA��Fֱ<�b���=�.��o�w�� ��I3љw���f�w3���ł|0˗��8- ��/�Ona�.�%�e�/$��է�����<���0�"/���h܈C����3��e9i�b�į9���;�8�$�"���G�!�H��J�aW�k��dqIf)�H���Ƕ��I�_�({�ڵrv�j(N�2���f-�����i�M����j�&�Pd>Q����ij�hr���&|���`D��C����� {��nA9���YH��61G&Ύ��m/��% iź�A�J��c��O��� �wt��C�����ŗ^l�4b�&��ψ8��W�V/��g��|�%�%Y����]%�Ԯ{M��>��ɏ���6�3Y �����8Tcx��7�V.M�\7r8�G� 6��C����p�WlЋcS�\�Ha/r6��z#��^`����ޑ��5�,�Q�!����������^��ߴ]��&����h�����#���*Z�L�>K�,�G�ҧ��K�����\w>��5�]���-�2�䖠��qRs#?X�b�9�Vq�-ˎJK! <�= "��4s�ύ=���q���Wv�����/TK���k���Xe�dI���$9G��M7\�@�&��S��J�5����H��⁚+C%)�R�V��U)&���E}���Uc|��8�L h�,]M hR@����d�V�ui��(KQIf���)EU� )4>&�<и��+RRb\��k�ӵ�J�+ �$���J�+ �$��0���,�� ʂ(���� g�u�!в��1tm�Z&��a�kEX+��V4tV� !6dZC@��2dȐ���0a ����zh�L@f�ϻ?PUTTPUT��*4US^nHKh���Ą ��EE|Q_T��EE|Q�Ĥ &!��L b��n�b�܊BLa�)���$EY����U)&����)��K2�!�0��X�Kb C,a�IIHJ�3bC�`�1�!f0����3bC�`� _FYeA�!0ʂ��"�� DzC�7DzC�7DzC�7*�0!���!���!���!���!���!���!�� LA��)S,z��.��sK"�!�UAT!�"�!�"�!�"�!�"�!�"�!�"�!�"�!�"�1)��DC"����JU۴41�kƙ"�)қ:�&]�2X�bB �3�K��o����o����o����o����o����o����o����o����o��f)���Uz���u]�uY�z���RW����zB׃�V�zJ�Ӻ��lROi�)�;�y�4��ҼS�wJ�Ni�)�;�y�4��ҼS�W�Ҵ�ּӚwZ�Nk�i�;�y�5��ּӚwZ�Nk�iͫckI��Ҍ�Ѽ3�WGؒ����;�yg4��Ѽ3�wF��h�Y�;�yg5��ռ��wV�ΊS&5�&�դ��tV��j���� �PKAA#]1���*system/helix3/assets/fonts/FontAwesome.otfnu�[���OTTO � CFF 9s�7���EPAR(�l0OS/2�2z^��`cmapǢT��head���6hhea ��P$hmtxJ+��t �maxp�P `name>$# h postx FontAwesomeC������������� �U�6����U�6���2�2��� �",04<>EGMT\_ehmqy}�����������������#)4>HT_lp{������������������ '4=GRYfoy�������������� &,39COVcoz������������"/5;FPUZes}���������������&+16<EOW_hmqv|����������������)04=DPX\aju����������������(,26GYhy���������������%16;>EMUckox�������������� $ 5 G V g l p v � � � � � � � � � � � � � & * - 0 3 6 9 < ? B F O _ c u � � � � � � � � � � � � �&5BQafmty�������������������!%)-159=AHLPTX\`dhlptx|������������������������������ % , 3 7 ; ? C G K O V Z ^ b f j n r v z ~ � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � !%)-159=AEJNRVZ^bfjnrvz~�������������������������������� "&*.26:>BFJNRVZ^bfjnrvz~����������������������������� "&*.29@GNU\cjqx������������������ '.5<CJQX_fmt{������������������ '.5<kvglassmusicsearchenvelopeheartstarstar_emptyuserfilmth_largethth_listokremovezoom_inzoom_outoffsignalcogtrashhomefile_alttimeroaddownload_altdownloaduploadinboxplay_circlerepeatrefreshlist_altlockflagheadphonesvolume_offvolume_downvolume_upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalictext_heighttext_widthalign_leftalign_centeralign_rightalign_justifylistindent_leftindent_rightfacetime_videopicturepencilmap_markeradjusttinteditsharecheckmovestep_backwardfast_backwardbackwardplaypausestopforwardfast_forwardstep_forwardejectchevron_leftchevron_rightplus_signminus_signremove_signok_signquestion_signinfo_signscreenshotremove_circleok_circleban_circlearrow_leftarrow_rightarrow_uparrow_downshare_altresize_fullresize_smallexclamation_signgiftleaffireeye_openeye_closewarning_signplanecalendarrandomcommentmagnetchevron_upchevron_downretweetshopping_cartfolder_closefolder_openresize_verticalresize_horizontalbar_charttwitter_signfacebook_signcamera_retrokeycogscommentsthumbs_up_altthumbs_down_altstar_halfheart_emptysignoutlinkedin_signpushpinexternal_linksignintrophygithub_signupload_altlemonphonecheck_emptybookmark_emptyphone_signtwitterfacebookgithubunlockcredit_cardrsshddbullhornbellcertificatehand_righthand_lefthand_uphand_downcircle_arrow_leftcircle_arrow_rightcircle_arrow_upcircle_arrow_downglobewrenchtasksfilterbriefcasefullscreennotequalinfinitylessequalgrouplinkcloudbeakercutcopypaper_clipsavesign_blankreorderulolstrikethroughunderlinetablemagictruckpinterestpinterest_signgoogle_plus_signgoogle_plusmoneycaret_downcaret_upcaret_leftcaret_rightcolumnssortsort_downsort_upenvelope_altlinkedinundolegaldashboardcomment_altcomments_altboltsitemapumbrellapastelight_bulbexchangecloud_downloadcloud_uploaduser_mdstethoscopesuitcasebell_altcoffeefoodfile_text_altbuildinghospitalambulancemedkitfighter_jetbeerh_signf0fedouble_angle_leftdouble_angle_rightdouble_angle_updouble_angle_downangle_leftangle_rightangle_upangle_downdesktoplaptoptabletmobile_phonecircle_blankquote_leftquote_rightspinnercirclereplygithub_altfolder_close_altfolder_open_altexpand_altcollapse_altsmilefrownmehgamepadkeyboardflag_altflag_checkeredterminalcodereply_allstar_half_emptylocation_arrowcropcode_forkunlink_279exclamationsuperscriptsubscript_283puzzle_piecemicrophonemicrophone_offshieldcalendar_emptyfire_extinguisherrocketmaxcdnchevron_sign_leftchevron_sign_rightchevron_sign_upchevron_sign_downhtml5css3anchorunlock_altbullseyeellipsis_horizontalellipsis_vertical_303play_signticketminus_sign_altcheck_minuslevel_uplevel_downcheck_signedit_sign_312share_signcompasscollapsecollapse_top_317eurgbpusdinrjpyrubkrwbtcfilefile_textsort_by_alphabet_329sort_by_attributessort_by_attributes_altsort_by_ordersort_by_order_alt_334_335youtube_signyoutubexingxing_signyoutube_playdropboxstackexchangeinstagramflickradnf171bitbucket_signtumblrtumblr_signlong_arrow_downlong_arrow_uplong_arrow_leftlong_arrow_rightapplewindowsandroidlinuxdribbleskypefoursquaretrellofemalemalegittipsun_366archivebugvkweiborenren_372stack_exchange_374arrow_circle_alt_left_376dot_circle_alt_378vimeo_square_380plus_square_o_382_383_384_385_386_387_388_389uniF1A0f1a1_392_393f1a4_395_396_397_398_399_400f1ab_402_403_404uniF1B1_406_407_408_409_410_411_412_413_414_415_416_417_418_419uniF1C0uniF1C1_422_423_424_425_426_427_428_429_430_431_432_433_434uniF1D0uniF1D1uniF1D2_438_439uniF1D5uniF1D6uniF1D7_443_444_445_446_447_448_449uniF1E0_451_452_453_454_455_456_457_458_459_460_461_462_463_464uniF1F0_466_467f1f3_469_470_471_472_473_474_475_476f1fc_478_479_480_481_482_483_484_485_486_487_488_489_490_491_492_493_494f210_496f212_498_499_500_501_502_503_504_505_506_507_508_509venus_511_512_513_514_515_516_517_518_519_520_521_522_523_524_525_526_527_528_529_530_531_532_533_534_535_536_537_538_539_540_541_542_543_544_545_546_547_548_549_550_551_552_553_554_555_556_557_558_559_560_561_562_563_564_565_566_567_568_569f260f261_572f263_574_575_576_577_578_579_580_581_582_583_584_585_586_587_588_589_590_591_592_593_594_595_596_597_598f27euniF280uniF281_602_603_604uniF285uniF286_607_608_609_610_611_612_613_614_615_616_617_618_619_620_621_622_623_624_625_626_627_628_629uniF2A0uniF2A1uniF2A2uniF2A3uniF2A4uniF2A5uniF2A6uniF2A7uniF2A8uniF2A9uniF2AAuniF2ABuniF2ACuniF2ADuniF2AEuniF2B0uniF2B1uniF2B2uniF2B3uniF2B4uniF2B5uniF2B6uniF2B7uniF2B8uniF2B9uniF2BAuniF2BBuniF2BCuniF2BDuniF2BEuniF2C0uniF2C1uniF2C2uniF2C3uniF2C4uniF2C5uniF2C6uniF2C7uniF2C8uniF2C9uniF2CAuniF2CBuniF2CCuniF2CDuniF2CEuniF2D0uniF2D1uniF2D2uniF2D3uniF2D4uniF2D5uniF2D6uniF2D7uniF2D8uniF2D9uniF2DAuniF2DBuniF2DCuniF2DDuniF2DEuniF2E0uniF2E1uniF2E2uniF2E3uniF2E4uniF2E5uniF2E6uniF2E7_698uniF2E9uniF2EAuniF2EBuniF2ECuniF2EDuniF2EECopyright Dave Gandy 2016. All rights reserved.FontAwesome�[_�������"+/37;TX_dhn���������������#'Prz�����������.26:@DHM����%*.48@ENUZ^}������/3�������������PW^cgl������8<FJ�������������CUajov{������� @ J Z � � � � � � � � � � � & * . : A T m r } � � � � � � � � �;BFLTX_cinsz���������� .38@FKPp|������������� & E d m z � � � � � � � � � � � � � %1=BGNU[e��������� #)-7=CJO]kr����������������):PUblqv|����������",5:BJOTgz���������������$6HZ]hs{������������� &,6@JTX`hnt|����������������� )8@OSX\bhp~�����������������"/4;?FLSW\hmt���������������� ',2=HS^elw�����* �A �T&������fA�V�� ��T���l�f��P��������������z�z���� �P ���4�! ��t������ ��� �����q ��q �bt�& y}}y�3���3%�3���3� `z���T~����~���������������4���] �Tg@Z �4�� ��� ������R ��,�T[@�� ��<���<4 , ^�2 ���%�%�����%�%�����%�%��3� �T< �n�h@;�TN ���TI���TN ���C KFKk�6 ?����������J �������� � : K,: ��y}���Tj 5 �/W K$'�T$����V L v �� � L 6 f y}}y�y}����������}y�lz||z% ��1 �� ��������K�T���T�Y�=��|�zKz||zKz�|����������N � !�5� �!�� � �f�f�( ������������G ��� Q 3|�T|�T|��T� �T� �T��|zs� R��������3��&' ' < @A ��������G ������������^ ���[�=������ �T� / 3 c�-�`�V�}�h�n"����B�v �����g �O����G��� �`�E��}n\>l�g ����,�������������������h����h�@�@�h��E�Q��P �|�z�@z||z�Tz�|���������|�z��z||z�Tz�|�����7 �F ���x� ����3�C�DRRDD��uy ; �; ���5�!Jb��� h ���� �����5 �/������ �T���T �+ -tzux��u�[��Br�lmy�z�~���5�������q�s�������U��hnnh�hn����������nh��� ��t��t��t�T y}}yKy}���? j3CC�� �� ������5�;��(�=��Z�XW�G/�9�;���/�_M�knm��n9��:Y�I�Ƒ���P�`�q���������������~���d�_�i�r�c�rr�i��i�i����������y�� @�H���-�R �' ����� ���T� �����1��<t0 ��l�n�l||��}_zob^��^�b�z�����������M�<�M�<v�������������� �o�_��}|�|r ��� /�0 ���]�} ���]� ��� �E�Q���y� v�(� ��W��� ��T/�T���� ��� �j��i�h��{�t���* �<���<�<��� ��<+���B����������� �����A�S� ����i�^wv�h�������v�i�^����S� �A��E�]�#���' K( ��D F�m���3�'!�����%�Ơ���#xM'�nq��w������d����������������o�^�]��� t x �1�!���!���������EQQE5������i��������'�Ty�}��������� �tV`����� �� K�� �T����� �� �� ����t�� kb K<����z� X �@3CC3�@���#P ����n�hQ �h����������/�:�n�h�� �� ���:� ��� ���;x��t������u�l�TK� 1��� �0 ���8�i8_dd_�~~�x�z�������������������ƅ����y���"�9��O��9�%������9�)��o�'�0�q�i�?�@�h�h�?�@�i�r�����C �TFKk�Tr P ��;���;�Y�S<��!��y�o�t�s�{tq�T/�T��g���5��[�� �F �� ��s ��* �41 ���������������������Z�Zr�w�h�)��S � - v�v����z�z�����: �t�t���t�t���t�t� 1 ����7 �Ԏ���8� ����J����n�������������������+����t����m�y�;� [�8����� ����������� ������hn�>�����~�w�~����~�w�~����������K� =+�tX �@] �@g�Z �t�V``V��; ��;��`���L����<��� �xra�������� Y�W� @3�&�� ~~�w�~@���������5!�����������}y�vKy�x}z��y����n ������T7rr�c�r����~�g ��hnnh���� ���YYG ����P �����~�����*���*�*���*�*���*�*���*= �4����� �4����������) .@�����(�����[ �h ������������������P ����v��T�~z��$�j� +�[ ��<���<�5�!I ��4���* �A C �7 �r C ��7 @r b �!�6��g������T����E �� ��ˋ�������h�3�/�����{�V=��������������n���������������\�n���]������������9� ��v���������x�{�zz{��X �����CZ�7)������D �T���}�y�T8�TC �T7 �Tr ���]�]��[ 1�� �� ���������� ����7��������U������f� �@��m��� ����� � ��< �Z�Z�������Z�Z�������{�B ����r�r�����z�{��� + �T <�Z��������:�������w��B��������D�$�$�D�����(�=`��h��Z����������TA � /��0 �����nh����&�&�����&�&�����&�&�����{��V��v�7�+�4��2�y�qpV``VV`��������J ���Y M�Y�� }� ���> ��|z��nhyy�rrr�r�ypttp&pt��1��5 t�v�������' K( ���� �����������;���;�����g ��� $�4��������y���������~�M���Q��������������s����Q�Dnt��y���������������������y���t�� ��F�t��e�11e�BB������T�������������2 ������ ����������r��������I �F y����������'�&��K� ��w�_�_�c����������4��4�����4��4�����������p�]��R���� ���G�T��TX ��������������x�����]�]�� 83�� ���w�rrh�������h�@���;�f�v�eK\xcik�v�ss]tRat�7�+�4���4��7�&&���� 7���� �V��(����- hn�����D�$�$�D� �, �}�t��P ��`=��d��b��9�7�B��x����������������������t���3 �������?�L���g�__gg__�g��������������a�� ������`�V������������������C3~�w��]������} ���y���6�%�6-�������������� �_�$��cX��~ �TR�V�2�2�V�V�2�2�V������P@��z�y�z����z� ������s�/A����v����������zz{���������������b �������z����- � �����f�t����& ���3� ������ ���]�]�EG�xZ�n�yt�P P �������������+�+P�,������������ʲ�������,������� ���� _h�m��x�����2 � ������������ ����ˋ�� � � �d�4����������4 �T[�`�M���`�My}}y�T,�V���;���;�0 ���&�&���T�� ��3 �� ����������t'. %���@p �)qt{t��s�o�y�����s�%�$����������33�3v�K����� �4��4\~�v���� }jii�C�@�@�����x�~�C ��Kw5 !4���wk�z|��|,$P��+�+� ����������- ������� � ��� �g�s��}���}y������������f���� ����#�E���T�@��)W��b�it��� ��S ���4X��wmx�yj�h�����o�fZedZdW f�r r�syy�'�&� �������������h�@�v� }�������������59������������2I�8��8��!����~ I � M � �?y��� * �BP�|88;�l�]5��m����+\��<���b-�G_y����'>U��>c� R �!0!�","^"�#0#�$$q$�$�%%~&5&�'A'�))�*J++�,,m,�,�-�..1.�.�.�/P/�00�192�2�45q5�5�6<6�717x7�8h9�:S;x<<T<�==�=�?�?�@!@�AjA�B�C�D�E�F�G�HJH�IITNN�N�O"OxPPPPP�R-RvR�T�UGVV�V�V�WX1YXZ�[+[�\C]]�]�^�_+_9_G_o_�_�_�_�_�`�aaGb6b�b�cPc�d'd�eNfGf�f�g>g�h�h�i-i�i�j j�kwl%l�m7m�m�m�n$n;nOncn�n�n�n�o"o�o�pp&p>pXqq q}rIr�s8s:s<s�s�s�t�u�v<wIwhw�xGx�y y�z&{6{u{�||�|�}�~~�~�~���C������M�����9��C�|�����2���8�V�����P��� �c����S�������O����I�������#�|����L���������`������m� ����P�o�������1�����*�x���������4�f�.��H����U�\���1����������'�C�w�����[���W��������(������b�������;������J�{���.�ŝ�Qƭ�fǮ�*����ʛ˗̉͌����|�`ϫ�Zҝ�(���Jտ�������p�9����D��9���������g�����t���g��,������q���?�����o�]��1�a�JC���0��g���� $ �N�� F.yq��4����+M�<�� �!>!�";"h"�##�$b%g&D&�''�'�'�'�'�((�)�*"*�+�+�,?,p,�-F-U4>4�5~5�66636>6�7 8"9�9�:-;F;�<9<�='=\=�=�>?Y@RA�B�DEAF�G�H(H�IImKGLL�M^NZO�PxQ@RS%SlS�V�W�X:XRX�X�YY]Y�Z�Z�[+[n[�\d\�]g^Y^�_2_�`5`�a�a�cBdd;dWdvd�e!ff�gog�hNh�ikj@j�k�l�m�n�o�p�qhr�t�ukvYwfx�zV{r|�}/~~�������U�����u�����[������� �t����J�����~������������������3�J���#���������c�������$���;������������������������������������T��t� �T��T���4P �4��� c� ��z���.���.Ȯ��h�K�h�<�Nh���-��� �� �����-N�<vhNK�hN�<�h���.���.Nhv<�N��N�vȮ���-��� �����-�hڠ�����v�N����v���4�4���T� �4�4V``V�T< �4�4��TA �4�4M ����0������T���y�u��uyyu��u�y�����������y���?�j�`�,4�G��y�u�~�8������������գ����������YSKkj>h3c�#� ^u�i�����������ƭ��R��������������@2�A ��4 �����F�M�f��fM�Zn�n�w������� �������������v�� �x P �`�V��������c~ofa�[�! �Y�������! ����� ���� �T@ ����������b����@� ���s�u�w�#��$���L��>�����������$��#�����������69�JX�"�!�!`V+/E��E+�V������1�R�F ����_r��� �Z���o� ���p�]����������t�� �k�s����u�[��z�tv�U������������Z �tq���9� �[��[�9����:�Q��Q��:M�q��k�s����u�[��z�tv�U������������Z �Z�����J����� ��J����&�� ��� ��&���a� �)���| �����s �Kw����� ����t������� ��w��4X ��] ��g@� �v�� ������ ����� �������Y�T3 ���Y���`�V��V``V�TV�`���������Գ ��� �T3 ������Y�T3 ����TV``V�T�; ��Y����TV``V�T�; �T\�TV``V�T�; ���� ��^���y���� �$�%����� ���I�������V��������h�h��������v���j���y�����������������y���� ��������� ���I���������I���V��������������V������������ ���V�� V�������� �t�tC KF�t�tFKk�t�t� �r �t�t> ��@ � ���V�� ������ ��FKk��r ��@ � ��������� pP �����t�W�&S�:�aR`S�:�a�)�)�6����z� �6�)��õ��`�a�;�R`�W�&��t�����P����Q�EEQQE�E�Q��������������Y ���8 ��&��8 ��&�T�8 �T�&��8 �@� e ���{ �����z��K���}�z�����������������a�E�V������������" n�m�l�o�L��{�y�ry}{�{O�J�Nl�l~n|�������i��&js�����������^�^�[{m~m�k�No|�y|�rz�{���Kp�i�j�ki\f_i]�����������Q�M�[�����������!��|�����Lz��~��r������Ǒ̒Ȫ���������������'������������f�g�i��������M��������m����������������������������([po����p���H��H�4��� �wO�V��VOcZwE�;����L��1�������H�u �v� ��t���������n��n�����t/�� ������s������~��o�J�,z�W���`a�G�ah�c��~��v�~�A�������������H���H�������������������� ��� ���w !�4��t�4����t��t����4�t��t�� ��to �T �4�# �)�v��TV���{�||��||���������N���������g���|��5����p�p����Ty�~}y�:y~�����T����ppur��5��|g�ccn�_��Tz}���������������y�}}z�T���� ��� ����T� �d��gf[wXX[��f���e�6 � ��t�q���T�K�T�����T�T� �T�T������x�4���4�t8���� ��z��T~����~���������������f���9x�4���4�t8��(���������������������������& ��T��� ��T�������9�v��T� ����,�T��,�T���������h���X�h���������Ym���}������}c�h��hcqj}����}i�Vg�v�� �����w�����x�r�w�wvt��L��������������# ������P ��� ����!�S�Y�� �y�l�D�&�������������������)�'C�3�$ ��Y4����K �Ti ������t�}�y�T|��}�zcesd�,.�9/�F����-��� 1�T5 �T�� ����"�Q>�W����������������� ����"�S�X�������5����z�|��[������������,�9�F��Z3���� �Ti �������9 �����"��! ��! � �T�����������@� ��� ��G����� ���v��T�i ���T����T� �T��+�3 k�T���^�^�����^�^���Tk��c�����v ]�b�t�k�r �������Kg _�=��1ln��o����1�"�-SK�q~n}s{x}zs�z.�������;�3�n� �L��������� �v��T��T��V��T���/���W�W���/��!�(�Z�Mj���:�kD ��L k+8V=_G�xɁ��������������H�KxMG�_8�+��������M������������r�������r����N�-������hnog?��� � ��?g�o���������� Gw���_ r����N�-������hnog?��� � ��?g�o�������������_��Q�P��o�x��}��y�C���Q�(Csyrp}t{xo^�������P��Q�_����K����� ��n�{�}�������|�z�x�8� �S�`�`*�S�8� qxozo||�{�}�s}|{n.�������� �K��������������� ������������� �� ��� �x �� ����������� ���� ��������� �� ���� ����0m�� 8���� ����������������v�v�ʪ�ʪ����ꪫ����������ʪ��骫������k��i�hvv�v�i��j�i����ʌ����������� �����1� ���� w������� ����ʓ ����ʓ ������1�Y�������1�����������������������Q� kl�l�������ʙ �����F?������i��j�ivv�v�i��i�j����z �)z ����_�^�X*�D�t��cX��_�^�s�jii}jtt�j�jh��s����������W m��� ����g��|�v�t��y�w�x���og�`vf�/TF��w�����������������.��������q��ra�\��zz��z������aM{tsw�x�y�z�z�Vc,sj|wu��t�{�t�v�\h2p]�yx}�x�z�u�x�Wi:mY{pvz�s��~�{�s�w�w}e�_�^#��:��/�����������r�����8����"������ ����� ����� �������������4< �4���K��4�"K���m�e��,�,�eB�V�4� ��K"44"�4k�t�4�:�4�t> �)����T���3���3�3���3�3���3�3���3�T�4�tX��r=�E��E=UIrX��t���� tK�� �T��/ ��,�Q�����i�ep�%�/��,�xx�x((��(���#�Ɏ��������� w�����������R��'������V��b���gfV�p��o�q�qq�������{����������\�/�j�}�}���Y�h�^��?�DF�G@�E�a�t������V@���h����a�%�-n�<����5���s��c���������sŔ�O��������5���*��V�JM���(0�x[[��_}�~��������%����������;�AH�W�{�'Q�bgf��g��� ��F�I��G���������f�=��R��!��G������v�^]�^����z����8����'��n�\��PuH�#hPMqJ�K{�-�!ߜv���`�������Њ�����xġ���������M�M�N�������[�����������Đơ�ϦԖУ�������!!�!�����x$ǁΓ�m`r�;�n�i~G�h�ftnOlF�Kw�z6���������-�������������;�������p��6p�_�ph��6hp�o���;_}oh���6�h������6���}�_����� �Ǐ��\����������|��}�Cy� �^��^�^L���uZ� ����������������������q�����m����ept�c��CD�C��m���������� ǐ��]����������|��z��b|�|}3��mrS� �6��6��7W��,�������� �"�����������������m����~yv}u�������������]� y�����]h��vp|�zww�z�v�����{����y{ ��������������|��p��hm ��R�<�0 ���R�<P 0 ��R��<� i m ��R�<�0 �������R�<�i m ��1�<�0 ��1�<P 0 ��1��<� i m ��H ��H ��H ��������t�#���#����@�������w ��t\ � �����������������������> t�Tdw ��T���i���������F��y �������������td��v�0��{�t������z{�~�'�&�9* �T��T�3���3�T&�:�'�'~���� �)��T�T�������Tn����4�4�����4�4����Tt����|z�@��� ���4kX ���S �@g@� m���� � �����D����������������~��������������������~U�T����4�4�����������~�sj�iij}st�:�9�4�4�:�:�W �� � �� ���{ ���� � N�L�T���_��p������������x���J ������ �����v�����P����P���������Ϡ������������H�G�w�w�srP�� �m�X�X�j��:���b�kkcv`~:���j��X;`Y;l-&P���y�y���Q �����4����������S�+����,�,������|�������|�������������������������~���KK�������X����������������������������fc�c��Q+�4�4�4�����4�4�0�0����f��,�,f�M�ff//������ ��� ��g���t�������}���{|y~w������j�X������������������|�z����h "��Q�����2��{�z�����t�{tq�T�4� 7����\�3�u������������������l�z��*���� ��p�4�Tq�t�������������� ��� �Jw��� ���t����������������KK�������3CC�� �� ���������������������G ���������������fc�c��Q�{������k���k�Y�kk������k�Y�kk��kk�Y�k�B�B�k�������������� ����C �� � ����� ����� ���- �4����=����� 1��� �� ����� �������gs���v���������Z�v��Z� ���S���Z�v�Z�Z��Z�Z�r����Z�����h������l���vl�r|h��h�|��e P @g ��� ��@��g ��� ��i e P @� ����� �Z�w�Z�Z�2�Z�Zr�w�h�Z� ���P ���� �Z�w� �Z� ���������� �@�w�}����rr�w�������r�Z�Z���� � ��� �%L�.�����2�:�:��z�z��z�z�r�����:�:�2���������%L���'�2�z�z��:�:�����������:�:� �z�z������������� ����p��������h ��H���� Z������� ��hn����� ���� e }�2z�z11z���I�I�I�I{�zzz��1�����������I�I�I�I����������������� ���I�I�I�I��������1��zzz�{�I�I�I�I��{z��v �P �����������z�z{z�����������������M �v�v�,�+�M �1��zz���6�� ����T��� ��4y}}y�Ty}���T�� �T���4�,#Q?`\pnZt�������ҫȧ����P�Kgjzx}wy\O������������~������#��7�@�T��K��T ��t��t��t�4� ���4: �T�� ��+y}���4j �����4��y}}y�Ty}���4�� �4��4 �� ����`�$���$`����$���`�$��� ���$���$�����$`����$�<���Tg �#Z�k�=�=�k��#��#�kZ�=�=Z�k�#<�#��k�=�=�kZ�#��#�k��=�=��k�#i ���]�������&�&� ����� �&�&�������&�&�������&�&�k�K# ���g�2%�������'�'�%%������ �:�:�!8# ��t�� ���������%��5�����6�&��{��S�j�����������jQ��h�[�=���<�<���=�>��� ��>Kw��P ��^�C�T����������}�s�@��sk�iij}ss��t�v j�t�� �� ��������}�s������TӸ��Kw������~�s����sj�iik}ss@@st��j�t�����TC^OG�G�O��T����s�v j�s�@t���E��������� @w�K�������sj�iij~st��s�v k�s�@s���������TC�^���Ǹ��T����s����������� @��K�T��@��sj�iij}tt�����T� �� �T�����tj�iij}tsA@s�v j�t�� t������ �W ��@��j{�����������t��,Q��a!���� �K��t�k�v��������������������q���C�t��� ����� e ���t����� �������ԛ ��������4��� ���* �<���<�<��� ��<+��!y}|z�� |���R�����T��|y��.}�|�y�Mx|��z������������p���������������� ��������4�Hhnzh�Thn����h�T��T�hS�\��V`��f��y~���5���V``V�V��5�������`V���R�L����'�HMoZd��9��9�dM�H�''��e �L( ��$�4���A �4�u ��v��߈��� ���/J�7�I[^_[Z_~}�yhn����������{�x�(���H���Z�f���7p\XT���H�aG��-���w��h�h�i�w�V�Q�Z:#v���z]��l���`���L{�l��{��,�+������\�^���˒�����1 ��t�4C ��FKk@r �������C��������N�.E���Ti����C�������k�h����T�������$�T�$������?���L������L���?�'���0�cGv=<��� v�c��0;���'�d�quuq�--��] ��������L��a������a��Lv�trr�t�v��L��a������`��L�������v���$�T�$���]�D�'�#�5�'���0�cGv=<�#��7���quuq�-.��] ���S������v-�y����U*�PN�O���_��Z~w�rsr�s�w��H�7�*�V3�ziU{������Q��������g� �e��g� �������S����������A��:�N�T����~�=�����L��=�&��0�����E��rA�������u�X��������������������5y}|y�� }���R����|y�R�� ~�|�y�Mx|��z�]�����������p����������k�o�u`�\\`qbu����ud�[�dd��s�P ���������u����z``K�4K++�4�4�-�3���������������������������V������� +*���������������Q�Q���������������듔����V�V�������������������������땓�����4�L�5�5���4K� � �������4�� �˫��4�4��˫���� ����� �4�������������4����T�t�� �T�t�� �T�t���4�������4��K� ��� �G���t��������4��� ������t�K� ��� �G�������q ��q �bt��������.���"&��F�t8�t�+� � ��������������+K� � Qc-b.T5���M�K����Tz�|������������sRrQnS�SL0��t8�t��������ĤŨ��������Ty�}���v�0����%�������%�����_��I�b� \�;COLD|yz|�r�����s�{���������A��0����������%����e P �T�%�K�i�``�i��K��%�,����Q�Q����,����g �� �/�����g �� �/������ �a����r��z�y��z�yrr�b�r�:�9�r������������� �:�9�k�� �l����r��:�9�����������:�9rr�b�r�z�y� �z�y�)�� �����������4�T��������T@��������y�xxy�}�����||�g �T�4�4r�d��Tr ��4g �T�4�4���f�TF������4�T��������TB |�|����}���������������� �� �� �����p��Q�EEQQEE�Q����Q�EEQQEE�Q������g �O����H��� �`�E��{l^@l�g ����,�������������h����� �v�� ��4� �4� ��&���Q�)�WW���X�g��3� UGQ�� {y|ss^������ ����� �������� ��� �������� ��/����� �����T����� � ����� ����1�4����=����� 1����i ������� ���� ���� ����� ��m����} ����������������������t����������������������������2o`gfbn��������h������.���������/�>�p�����������+�>�������|����R�i���������/8�C�����������rb�������{Zja_q���������V �O���m�|������ �P�C�������������4��4�T%V``V�� ����L �t�e�����P ���� ���������T������ ����� �h���P � ���T��T��T��T���� no��q�q�on�� �������������T�����f������t//tq�:�v++��������n�+�*�m�����m�*�+�n������3�3�V���ä��y��p�p��v��-�����)m�v�v���� ���� ��>��{ ����ERQDEQ��c ��ERQDEQ������QE��9���}��,����~�������������� �q������������ 2s�r�q�t�-��}�}�N}�}�~Z�T�Yp�r�r~�������n�� pw�����������e�f�c~r�r�q�/s~��|~�M}�~���,s�o�p�pndmfne�����n� �s����������� �������-}�����N����������������1��������������������k�m�o��������/����������� ` �� >�a����� B` ��� �aN����t������y���������6��$�7m��F�� �����d��I�.�3�W�W��- ��hn���� ��fo1\��s�\ko��{�y�xx�<^�� � �����U/�Sk��W���?Ÿ��������j�-����@� � +6� ����OG��o��� � ��D�ɝ��·�l��Z'�#ik}ts')��2OKebh`i_��mdG1dq��h�����W���m��]��a�"W����Y���������������� V��F�� �����e�� �G�.�3�O�����- 7�hn���� ��GNOH��� �6� � t@�K̬�-*�o�s�r��^��?<kO����篞������ �O���Y� O�x�x�y�t�R]s�sv�k�c\k}\vsO����1f��O��z�k������O��~�r�������v�d�����O����J��.�eY�$�n:mo��O�h������q�1�d�_�`�c�Jl�2�)t��}�����Ǐ���y�m��D�� � ���83�������v���b��@�K�M�>����������M�>�K���R�4�)�<�5M��n����ɿ�<�5�)�4�RP���� ���p�]����������o �u���d�r���� �T�������~ϧ\ �ԕ�T�3���3���~ϧ�4��� ����J�������{��{���{������J�{�J�� IYU:��=Y��Ͽ��ڼWG��� ��j�8Ke`bz�|�vw��{��� �̋�{&������,�(�i�"���z ��� �����4�t�4�� �T, L �T�4���8��0�����Q�E�EQQEE�Q������0�8.�(�y{���������������w�Ai ���� �� t��� ��X�Ti�TQ��g ��B �4�D�D� � G ��U� � �D�D�� �����t���� ���* ��^�Gof��������Tp ��^�Go� ��& ��� �������8�^�!�Y������1���/���)���Yb���1��+���3 ���X ��] +��V``V��R�z�f��|�X�m�}�[�YKKkK+++K+>��7��+�++k��˙����������̚�z�f�R����[� �/��`����������������������������������o��������������������������b���������������������������t��������������������������@��������������������������������������������������������������������������v�'�T�_Gq���������z�y������Y�w�j�����o�`�)I��b`�__`�b�)�`~oD�W�~jgw^S�X�_�~|~~t�jn~@t^�o�Y��Y�k��|�P��/�"���`�c}�{q��_�'�T�v�Q ���y�y�����t ��� ����� �?ApDU8��8D��p�?�6 �\����x��T�T�z�{{z�~�T�T�K ���T���T��������������� �1� ��!���8�� 2 �Z���Z���.n8��2����Y\uZQ m{���������r�������^�-Ʒ֫Ϧ����� ��[�����������@�{�wx^�^]U�p�[�c��\��ˀ�t�� ���������b�de�e� ����@�$fb%� <l6fGW���G4���� 9�<:]ua\Q ,�2�������n��������{���� t���������Z�w�R�Q�S��qk�lN2�IUph��s�J��&�J}�r����I���m�{�j�l�kā�u�v������gE{|jZvkSr^kPxOH.�7�6�N�P�T�>�a�a�>"�i�p�ul��e��Ǟ����ë�����ѯ����� �� �������X�����4* ���(�����3��&��� ����� ���&�;�*2�26�;�*���������qX�sIm�[FHN��M�o����;�ot�p��л�ͩ�������������&�o�x�tt_�Jdw�r�y��0�A���y������u���{�&A�y��������� �v�(T��QrLyJ�γ�ʣ�MfEpB}�P7�.�G�$�%�Fr�r�s�������3�Xo[{TO��(�QV�Y�`������1���(m�pn�nvw��w���.�"�4��X�+pr��q/�#�>V�K�����?�����ʹ�ķ�����������S��p.���v�/����n�������������������Q���11��'�A������<������* �<���<x��p����%�����������j]^��h�Y��E�֊�ׅ�B� �����������?��G��ߩϼ���qٵ�˟�'(���͔��͂z���'��w�!q=�w�U�G7���HJ�?x�s�]C$�8rw�s�����p�����+�q���������������������������i�������������������������^�������������������������a�������������������������r������������������������ʆ������������������ŕ������������������������ �v��T���T���T��T�$�T�4���\+�T� ��/�i �)����������* ��l @Z �����@�G�t���t�� ��� ������ ��������V�� ��Tn���z�i.�]�,�+�+�,�]�i�����{{���}�zy�j�p����n�������j��r����������������y��'�����������'������{{�~�{y�#j�o����i�c�c���i��q��#���������������4��� �����4�4��������������4��@� ��� ��G���2�t�1�v���������~z��1�v�F�4������Y���tH�A��AHZEt�Y���r�tp��g�� ��� �2 ���� �4�T��t��t] �Tg�E�u�F�F�6����!�1��=۴�����n���_�F�(��� �R�D������\�����������������\����D���� ��V���T����$�4�[ � �.���G�^������S������S�����G�^�J�(��@�t�w�T�3�f������V``V}�~���d�3�f�T�w�@�t�(�E�Q��T�!��� �T�e `�����������w�r��P���N����x�y�p�r��NV[�P��w�r�q�q�yx����y�p�r�r�ww�r[�P�N�r�p�yxxy�p�r��N�P[r�ww�r�r�p�y����xy�p�r�r�w���P[V�N�r�p�y�x�����N���P�r�w������������}�����������������P�NV������������V�N�P�����������x��,���4���.����o����U w�t��FPPF���s�\k�{o��y�xx�>\��V�?��Ck������������������������w���k+�+JL����OG���� � �� ������=��3��`�?.Qm\ibgbjnG5[��ho��������fu�e�l��Y�������=� �� � �,���.�G�c��4���n8`��X�C�>��[�B�� n������a�tĹ�����o8i�x���������FP��������v8�+��֫ঽ�t��t�t�u�V�]�]B��1����������� o8��[G�ng�i�m��Q`�?��3�4�=_�`�b� �� � �� �� � �=�a�c�fn��}�|}K�K�Y�X���S��#�L���n8������� � ���4���.����B �`�K����P�V��?�Ck���1�B�]�]�V�v�u�u�t����������+��������`��PF���`�������xi�������P��ta������� �?����M���Q��YK�K}|��}�Pf�c�a��=� � �� �� � �� �b`�_�=4��3��?`�Q�m�i�g�`�n�G[���� �� ��ʰ����� ���.�G�c��4���B ��t���ZB� ��xx��yatRt]ss��vikcx\j_��q����FPPFGO����LJ+�+k����������������������ϰ�k�p�C��>�[���������H�������k�f�u�f������ ���h��[5Gjnbgbi\m.Q�?`��3��<������ �� � �� � �� �p�=������ϰ������ˠ�������S���L���������H��� ���Q�Q���{zH�� 00�� ����0������, ��{zz�{�Q�Q����� � ��� ����X���00�����{�zXz{��0�����������Q�Q�������Q�Q���N�����0��{z��� �����������00{���Q�Q��p���Q�Q�� �������, ������{z����� ���������P�������00�� �������M �Q�Q��q���Q�Q�, ��{z����� �����%�������������Q�4�.���������&����E��݂���������v����'�����* �<���<�<��� ��<+�'����������������~��'���������������|iyz���r|���������x|��~t��}�uz��������������������������~�}����t���yzr����j����hv�������������~|�����'����{���|����������������~�oz|������������'���������r}s�pw�h����������������������jh�y�~�|��������������������}}��|x}�o���w������u����x�����������z�����p���}�o�~�v���q�y���v�}��}�{�o�����������y�~�t�����c�����u����������������y�u�u~�������x�����������r���}�������|�~���g���w������������ɛ����������|����������������c���������x|�����������������������|����������������������������������v���������������'݀���������������t���|�������$���|����~����������������d����������+������|������~��������v���r����y��������s~�݇�����uw�}�{�~|�G�����|��}}x�z���ut�����������������l��������݇�������|���������~���|�r�������������������������k��������|��������������������'�����|}�����y����������������������~���������z�{�������|������}�{����x����|�����sv��~�v�z�y�z�z����������y���������'���7�����������������������������������������������������������}�r~�����������w�������������������������w������������/*�G�s �k�i��n ��8��"�W��=�=s�v j�t���� �>�>��G��ww�|�&xj�U��t���=�����������N,�B[ ��Q�?��F������������������ �������������� �������������������t��{���t�q��������z�4��~���� �z������������v�� �x �� �����������4�4B ��� �4�4�t� ���t�������X ����S �{e �w�$�$���� �Tx �Tqt{s��t�o�y�$�$���������$�$��������t�q�T5 �T�p �$�$���������� y�o�t�s�{tq�T/�T��� ���������$�$�K �T0 �T� �$�$��������)� ����W�n�������|`_�]�#�v����:��[���������vV��i���\�\��i��V��v�6�*�4���4��6���e�T�a� ��u���v#6�]_��`�u�uu0n1W@��^�;������e ��U�U`�4�U�5�T���T��T�T`�4�S�2�SB�����zyr�rrr��y�b�cy���������j��d�M �d�j���������y��d�d�y�sq�S�Umtvw�jo�XV``VX�o�jvwt�nrr��yB�d�d�k������y��b�c�y�rr��U�n�T��d�d�UA�?<AkST3��«���n�U��b�c,��UB�>�?BnUU�'�&UVlA?>�C�T�d�dU��m��ի���3STk@<�?�B�U�b�cT��m�,��Ԩ���'�&������)�����J��,�>�������� KQtd_�O>�K��j� }�|�}�,D!�/�G���� ��� �������#����� �#�����@�*�!� �!��@���i����#��#f�l���A�\���4�v��4����4��4��3�T�3���o@�T�M��K���"��������~�x��������������F��͇�������������F���6)�-1?pWSRWn?�=�%�(�EU��m�þ����������B��B�������_X�S-(mU6�EF(�%�=�?�VX��p�O�������������������F������������˞���������y��\�&sqb]�NE��N��e����������wd��G�&NS6�}dNDwO�]b��qNñ����џ���s��Se&�G�F�������������������\}�w~vt���:�4+q����������������4�����C�K�t������ې������E����,�� ����� ��aV�����4dYztd���P\�4VAlff�,�,fflAV�4< �����:�\���i�������?��������fflAV������4M �4��4������4�0M �4������������������|�+�f�L�����dU�S�55�T�T�d�.�.�������Ġ��� �.�.|�����������|�����e�WT6LL6UV��e����[�o���!���"��m\�����������à��� ����B)�%�h�;�=�h&�)�C����M��e��0���0��������� �����������4\��� �4����4< ��A �4��{}������~�bx����4��T� ��� �T�G���k�m�e������eB�V�4V``V��Te P �� �� �& �P �T�������� �w�Vn���5�!Jt�4C �� 7 �F ����nt�4C �� 7 �F �T� �� 7 �F �����'��)�����������h�� �$�J��7�_�H����,�� �� �����`djXg]�S��ˈScfzheb��pR3� ^��v������" O���m��(�;�.?GdFj�P�������yi7�vo�My�y�y����4� �������(!���?�������:�:: @(��t��� �T� �@�� �Tz�|���> �������$����@1 �i���{p�k�g�G�R�[��"�.�_�_�u��š�����ȟ���mN��g�G�&��߅���������Ȃ�������A�P�_��AT�e�A�a6226^%�O�L�J�n�p�s�����o�s�x�Z�WS]{`lcmcbnXzyY\�a\^��cb�h�n�n�p�s���z�f�%�_w�h�Y�+�W�~������������ cv�͉��Β���������������������И���������������1�5��h���v�9��U�!݉�}�t�{�D���$�<�T�;�J�Y�Y�b�ll��|����ԡǩ������������������+�}������������������������������������y�L�J�G��a�7�5�����t�|�m�`�P���v���G#�?}Z�hzdqcwuvltlsj{h�xPK�GQP��Ob�k�t�l�{·�}����y����ُ���������������ˌ��|n�a`�Z�U���TS�R{S��-�de�h}~��~�3U��������: �@�4 u �R ���` ����� ���4������y}}y��y}���T��������}y�T���� ����� �5���X ��] ��g@� &e�e��O ������ �.�����Z�Z�{�zz{������{zz�{��Z�Z����� �����������R�% ���O�XO�X�XO�XO�X�X�X��r�6�% �v�2�% ������� ��> � ����������W�W������2����� ����g ��5 �T�4g[wrr��Z�ZTT�<D��Aٕ���!��� ��!��� �ف����1�;�������)�)�����P��P �+�<���<��Q��������̙������r��ԋ����ѭVLE^"t*9x�I��&�O�q�=���b�}�%�B�VH�\�f�z���w�}�i�~�w{�z� �Y� ��n�L������U�i�w��<�u��8=��q^�E�i�{PjPn]v�Ӏ�� ���)�9�� �(�(�����N����K���������s��Ӌ����ЬWMF_#t+:x�I��$�M�o�;���`�z�$�?�TH�]�f�{���x�}�i�~�x{�z�!�Y���l�J�������S�f�u���:�s��9>��p_�C�i�v9U:j\�i�C���eM�#&�nY�A� �������,�Ó�m�����x�wr��� ��.������f�f�������F�f���������H����4 z��e�����`�c�����`�c���#�NW��[�S���9�Z��)���)�)���)�;�����7����e�e�f�e�e�f�e�e�f�e�e�)���4������ ������ �������{r|�sv>��(���T�+����J��~�f�f��~�J�J��~�f�f��~�J�����������K� � �����g �5 ��/{i ����W�Ԃ �����W��~ ����������� �T�T�{z�4�T�T�� �������������T�T��� �T�T� m� ������F8�4� ���������� �����X ��l @� �@w�W�T� �~ �K��W�T� �@w�W��~ ��t�0��mjingr�;��<��7� M7#?����#��7�7��<��:�f�i�m���� ���B�4�@ V7)0��[�/��1��/�^�/�������/��1��0������6���;�$�����p��#��s�����E��AA*,�?���������m��6�"�mp�F=(G`���$����.�����������ƣ�����0�����������п����� ����D�&�l&�y�P�������������sj�iel{pp�������������m��o��������������y��,�,�yr�rUg[giyx�tq]�u�m���~~���������~~����mu�]qt�yxgi[gUr�r�y�,�,�V�����������o�m���������������pp{lei�j�t���t�������W �m� �b�� G�T�TG�@�u�^�9v:p%"M$�%�M�����ڑ�����������h�i���G��G�T�TG��T�����&�&���@��;�$y����z������%��:�@������b��� ���%��������%����� ��v������� �T������D�d�d���D��WX��YV�_lw}v~v��*���A���d���D����������y����o�6��$�7��������� �^���~������ )�?�c������w�r���vy~x��]�͈}�|�������������*�Y���v�v�������������������������T����� p{���3 +�T� ���T�A ��\��� ��< �T��� �T+� ��\+�T���T+� ��\+�T���T+� m �4��� ��X�vv�uuv��v��HNNHHN��) �� � ��� � �����������1��j�� ��j�/������ ������������������������������eU������> ���k�)���������$��1 �� ����������� ���� ��4< �4�����T� �� �T�GK���4�������i��m�e��,�,���~���\��-���4�:����4� �#��x�:�4����t�T���.F� ��pF� F �4KqHaZxuuvwtD6O'���x��O�D�w�u�x�a�q���\�_��I�I�_��\������D�������D��$�2�?��?� � nzykjs�t�z{z�tsj�m�y�}�z{�J�l�Q��e��űťž�̛������������{�������y�n������������� �0���|�z���T�|�����������������������T`> �t���7 `�Tz�|��)��t������������������������������������t��F �T�G��t����t� �)�������4z}|y�t����T� ��ty}�������������������������������� ������b ������t�T�4���T����N�[c�����G�=B�^�60�A�Q�EEQQE�AK����u��I7#e #��7up�jj�_�p�B:�� ܾ�ئ�_�������Wc��[�|��a� ��m�� ��w�����������������7�E�p��{ ��m��;�4�U��3������ua�[� �RҢ�����&�{ �&������ �R�D[apdu������- ���U�;�4�mp��h�]�@��@�h���֦������ ���t�� �t�����������K�}�������������� K��Q��$�4�[ � ����(��@�t�w�T�3�f�����V``V}�~���d�3�f�T�w�@�t�(�E�Q��T�!��� �T��)���T��T��T��� K����5!����� �K���h���h��5 �t�� �T�Q��� ��� ��_ ����4��n�hhnnh�4��n�hhnnh�:�B�p���� ��צ������g ���U ��k�t��E�Q������9�� ���w !�4���4>�Ti�T( �t�t�T1 �Ti���T1 �Ti�����9����9 �������t"��! ���N ���T�|�zKz||zKz�|����������I���T�|�zKz||zKz�|�����������|�zKz||zKz�|����������6F ����^P � ��@g �5 ��/�i ��������� ��� �����U��t"��! ���6D> �����^� ��k< �TA ���������K� �+�K� ��� �G+��� T�G���E���g ���p�\�T� �����/�i �)����������������������> G�����������W�W���������2�����G��4�� �t�t���T������1��5 ��4hZwrr���Z�ZrrwZh�4� ��!���"�"�� �� �"�� �Ti ��������� �4�� ��4�����4���� �t�t�����T����t�������k�}�����4��4����� k���Q�)���T��k��k����������������t�K����� +�4Kk�4�4�T�t+kk�T�k���Ts��Ts��kk�T�k���T�t�4�4Kk��4� F������t����ˋ�� �v��� �����|g�>DR������������T��T��˫k�T�Tk��tk��K���h�@�@�h������T�T�����Tp�����p�q�����q����4 ���� ���p��������h ����� �� ��z��Z��4� ����� ���k �� ����� ���k ��z��Z���� �� ���!�Z���tL�L���A�Z���4K �K ���z�����t���k � ����� ���z������� YY������������� �����������Y� ���������L���������K �)�d ��{����� ����|z�����X ��] ��g��4KGf�g ��0 �K����� �)��+�TK���x ���� �^�4����Z �T���] �Tgk��F ��G�T��Ԁ `�t���4+V�`�@�Ӷ����+�r ������S �� �> n ��4��Ԁ �T� ��q��] ��g��� ����4���������d�_gg_�� �d�4���� �T� ���G�T�T���[ �r ������� ��E�Q��������9 �v� � ����ԫ��� ����� �������T���T��Y��������w����N�������T��t���"�R�DEQRDE�Q��������bB�T�TB����Q�EhE�Q���X�x�C�3p 3�C�Bc ���B��T�� ��� ���b�&��'&��e p����e P � ��@*�j{�4���a����,���t��� �����{z�4����� ���t�C��8�qb�b�b�{�y{x�{��������������K� ����t�4�� �4�t����_��_�4���\���<�������-��7����������������ʗ��7��-�t�D�&c�+�������z�i��0&H.��0,�-##�s&�&�2iGz@@R�Q�T+�c��&����&����t������������ � ��������x P �tV``V�� V`���T�^ �T�� �T��T� �4� ��&���Q�)�����������F������|�~������aiEjV��ul�������������Ѭ������o���70 XDQ������^ ��� �4���7������mG�G�T�4�} ��� ��&��������������������� �T�n�a��x�j�i�gx�i j(C��(�j��g�j�i�xh�i�5��'��=�=�'��5����G8 m�T�i �n���5Y�'��=�=�'��5Y�i�h��������������C ��i�x������������8 ����� �Tg �� �0 ���T8 �)��TK���4�T��T������T: �T�Tx� �T�T4 ��[�T�T��T�T�����KG����xP� �� ���x�� ��� ���y�y���� ����p<� Z��Q �)���� ��������������������I ����t�+�����t� �������I ���4��!���+������� �������I ��������r@I ��������0��I ��������I ���p%I ���0�0 ����+�����t� ��$�������� ��h������ �������q��������^��jM�P�di��oo�� '��.��<WN�����2���XV�u������ ������^v ~\�b�u�D ��� �� ^�z�xvu�z~�L������^�? ޠ�����������0���������������$]�U�M��'����T�6���"W� N�Q��(���Y��cjM�P�im��p�P~�~�~�����+�����r������+�UQ��������t�b�3���L�?0X�3>���X������� �Q����v \�b�u�D �J� ��� �zxvu�z�L����J����? ����� ���s���� ��]R�T1 �T�*�)�\�&���������Y�� �f�f��f�f���������z�M�{�y��z� ���z�y���z������� �%�� ��@��tJ�j��Z�!�!�3�!�"�� � ��$y�f�+�/���Y������ ���kz�X�,���Hn���|�}���������������1��d�t���Z\�I����<P��W�3�֩Ó��W�W���}�O�����u�[�}z�y�yy}p~�u�[��BO�}a�`���5��_��q�������U���U������������5���������t��y�����w��{�z�������q~}m�nn��w����m�r�������������� �� ������������������4R�t�����������~�w�~������tT �t�t?�t����t��t�t6 ��������T���T���� � � ��V``V�V`����� `V��� D�M�j��e!_�NPZ|UzXr���Ĭ����D�M�j���RjdMD!�5� �d�R��쿣�3��>���ێ��Ĭ��� ��TPv�4�T��T��T���T��T{��K����=b����u�t���5����m�U����z�x�w�y�������y�sq�ggK�g�������y�w�x�z{����T��m��Ө���'�&�������h�~�z�����UB�>>CnUU�'�&TUmC>>�C�T���z�~�{���������k������y��������� 7�5��������u�+�=������ �T������Tg K���%.�Khnnh��<��K�T/��i ���v�P�����K�t/� �����o�h��honh����h��n��� ���������;�m�g�<��&S�3������r�<�� ����;�|��#����&�%6Nkj�k �����hW� x�}�p�������;�F�&���<U�3������r�<�� �Y�;�|��$����&�%6Nli�k �����hW� y�|�p���)������ �������9�I�v]�Y��fh{os���je�V�]]��n���������������w� �v�v���K�u�Kp��J�Q��T*Fhl��tn����ݖݘ����Ǝ������q�DA�������5�%!*Q���TFhulstnl_�a99��:��P���p���������������~�݀������������*�������P���k�9�o������������k��թ������������m�� p� ����[ �S����D � �����D�� �D�U ���D�$�$�D����m����8������������?�C�I������9�� �.�.��9�~���������`�n�� ���[ AE��N����������������^� ��U �������T��T����%�� 7;L9\Xpq�T��T��g ��5 ���9�������������$�����9 � ��� � #��� �������4�����@n ������������������T+}��~|��������C�3p k�n�r�]J'�V��{k�e�{��������������o�h���c-��#���<���/���&��|�~���T+���������������� �t`�`���� �t���{�y��S;����RQPIOD�w�������t���{���K���������������6��������K��������t�������������������q����v�M�����������n�;��<����-��������=��v��v�k�h�F�����8���������� �!�!�f �Z�Z�3�Z�Z�g�%�E ������E ���! �������� �a�!�f %��3������3��g�Z�Z�E �� Z��������!�f ������f %�3�Z�Z�g�Z�Z�E ���! Z�����������f �Z�Z�3���g������g�%�E ��X �����F�I�C�������?�6��I�Y����(�����u���C�� �XV�Y���x��\���������b��6��6�������S�������* P���e�S�GQ���G��z�5�:�5��'��D���N��������5���T�T��(���TK��K�T���(�Tn ��4R��~����~���'1� �A3�Zp��T4�� �T�7��� b ,�9�_�7�T5 ��2 �T��Z��A�1� �����������~���'��~�������������Q�1��� ������ �Q�1�.����� ꗐ������v@�T�i ���T�����t���2 �@�$��k���\�����9 �� ���e� ��� � ���y�y���Q �a �U�) ����������_ ���T_ ���T_ �������_ �T_ �T_ ��s������s���� G��-������� ���|�a�9�9�a�z�~���������z���������������� ���|�3���3�z�}���������z�9�9������S e ���* �<���<�<��� ��<+�����������������w���������������������vttvw���_������������������������������+������3���������s�����E �������Z���@@��@�@������Y�9�ZYh��YY�9�Z������@�@��@@���Z���� Z��������� ������ �� ���t ��� �� �tR��1 ��� �~���������* ��Q������ ���9����{���s�Y�sn��{x�p�ut��}��T���������4�T���~�������T7��T������������ ���������}���4�T��������Tru|u��t�p�x���n��������������u�r�T���}�yZ�n��n�A���f �����3���g�g�g�g�g�g�%�E ���� �������������(�@WWS�+���������}����������}���������������������F�������������������簰ɋ�f�,�,�f�Mff���� ����z������z�����q{tt������z{���� �����f %�3������ x�����������t� �t���� ��4��4�����4���G{�z�����s�{���4�O!mFNB9x�*����}�}~��������������5�W�]������4����������x����E �G�� x���������t��T�������c�������� ���## �y����u�s�su~u��v�q�x��Tz�����������T��������QO�y�7����}���T�x�vvx�z��T}x�q�vu��~����������O������z��T��x�q�v�u�~us�s�u���������T��������T�t: �T,�T[�T��}ys���x���E�F���v��d�y�������������Ds4�>�$�0K��������������������_�������|�������������������h�)�!�<��z���������3��������������5�#�����N��2)( �$��h�e�kI�� �z�|�������P���諌����������j�j�n��W��{����2�v|���#R�6�'�I�2|���6 �S��k�����G�������������������������\���L�9�x�s,'�$�*�� �*$�P�*�� ���[��f�����d�L��"�������*� ���������������&�����������_��DS�z|}y�H�ec�$�,�L���t1�HD�U� \+�!W)�E� ���������������$���z����� �~j�Cy�}��7�C�h��&�5�`���v�8�:�$�:�����R�?��v�k��}7�S��( �z�|��%� �e@��1( %$�?�n�P�D��� �������Q�]�(�E�5�U������W������������+�M�3�T�)�3�w��'���T�<�*�|�v���;�<�#����������6 �S���7��}�y�k��א�����������S���S�8x_uaz`{�{�s��k�=�����V��������������j�� #$��6� $$������@��v�t�T� �i�T�i���{�������_�,1�!��T����!�1������N�H�����'� ���)$�t� �t( �$�t�T���;7�T��6 �S��� �����N�H����v�����������������@���3���uk����1��������@����������:���6���zi���� �4R�G���%i��쎔����������|~�}�.���)�����|�}~�}�*����1����~�|���������������1 �"���C1 �d�4��}�����3������;���e�:��}�����3������8���i�*���O�J�K��.��J�?�7�����1�.��.K��z�J�1�Z����.S��cb��b���.K���jj�l��h�M�8�����ʟgk�������������&w�l`�����l�KK�\��������.���������K�.������H̢����W/�&�����~��k���S�ڡ#���ڨ�ZD�p�A���4�����I��� �����l�������,�,���}��������V``V��T����V`�������������,�,���}��l�l�������p�8V`������V``V��T����t� �T� �T� ����������$�����+�����)���f������}�����]�|� ��z �@�\ ����$�����������+��)���f�1���z �\ 2����}�����]�@�|� �+ �t�)�f���R��8����8����T8�T����8���*�+ �kR��8��7�t��)�f�4�R�T8�T7�T�TR�8�7�T�TR��8��*��� ����iw�q �s�j �)�f��Оm�a� ����"� �q �j ��)�f�d��� ��� ���4�gnohgo�������H�4�R��5 �/��0 ���3�#�������������؋�G�t� `aM�PQ�Oddlli`g]_Q+�f�j�ooj�h�o�����v�uf��\�#�������ͥ�����ȅ֤�������������������������� ������T�n�hgoogh�n���4��- ��� ��� ��� ����)�������|�m���������x�r���z�e�`�I�3��}�y?z�#�\f�LuOvh�i�moh�j�o������Q�]�`�l�d�O�Q�P�M�a��t��G��m�q��������������v�i���� ���Ǿ������n�4���^��ːΆ̀Ə����n��+�}j�{x������t�������zj�1�"��L��������zii����|E�;�;��]SH��v|~�}������������I��q�z��x���������c������������y�pst}qv�5H��ίp��}��������������Gq�|�z���{t��������}��yp�jip~rx}x�od�d�n�yr��~������������������W�����vu�yi�0i�z���������x�`6�0w7~Q[`R�|���������R�[�~�wߋ�������ƻ�ő��������|�ą�`�P�8�05�����]A�]��|�s�|�z�|����W��W��[� d�m}yrxq~jiq��y}�����������������~r��x�nd��I��mpr|rv|������������{������������������H�� ���X�?�����A���܅w��l�D���z�ك��{�ц����Ԩ�_���~�q||�||��|����������f�|�mm|t^]��Z����'��X��"��-�I���bgiwknv����������v����}�������������(]�j�vg�rxhkl��m[2�+�*�m�������xf��w�j]�Y��n�w���w�y�{hsfy\\h��qx�����A������������zi��r�eV$�G4]�t������������~��%]~smn}���f������t]�f�c�����q�y�J�>���L�N��M�M�N�w�K=�KQx<r�����������<�Qv�L�N��M�M�N���Lؓ�Ş�������z�G��D��!�M�L�M�.�E�Z���� �#�������x��rh�]^hzirxr�dV�CV�d�qi��z��������������0�nwx}y����������0�g�s�|r��������T�����v��������7���y�g��}������}�~�5����������T�~�~�����������������K����������}��g|ut~���$zm������v��s�����������������������:�������/ �s��s�A����~�T��z�}xp�M������������X��������l������������L��y{���q�������������-�g�������p������������Ln}������t�������"�V������O������w�( ����[�,���x���x���M���� ��y�h�>�GC�TU{�x�%��%�����%��%���T��D即���#}�f��� ������؋�������%��%�����%x�%{�T��G�>�h������ �� ˳�&�����~��������'+�����������'���}���������~������~�����������������}���}����������3���3 +�t�4��b��4�t�D�����8��0���9�m�i���%�i����f��������������+�q����U�����3���������@������� �� ��n�D�D�n�n�D�D�n�n�D�D�n�n�D�D�n��.�b�XXbbXX�b��������p����c��}�z�p�p�q�h�&��������c&}hzqppppqzh}c&���������&h�q�p�p�z�}�c�������������������������� �����o�1�1����!�"�!!"�!$���o1111o����!�"�!�!�"!%�����1�1�o������$��������������Z���<� �<��ps �����7 ���7 e ���&�]���&�8�t#�4��#�4-�_�G�_�G��� ���C���3��u����X���r� ���9�*�Hb=g���h�`�̀�����,�����������ް��5-��"����MM/�8��(x�,��(�9�0�KDz�іɕ�O��T��Om̀ց�Q������\����Y�5����Yy��{�)�)�+�)�j�x�Yh�m��G���{����I�U����s�V�7�=��o�{��vu!� z'f@o&d1��c��a��a�P�E�b�4�"f�|�au�n��O鿦ɯ�˱�n��n��o��I����7�J�!�I������5����.�OB\W�Q���Ħ���dRۛ~��-aOpbK�I�2�C������@�l�U�[������s^�Y�oc�`̄ƃ�~����ƒΑ����~vD�,@a�D�1��"�@�3�b�yЀ�ѐ����l�"����k�"��rbs��Ir�3p�1o�1�]_qew�G�1��(�'�$�:�e�����r�)n�'y�*��ԧ��ӥؘؒ�6��;��2]�z�t�[�u�n�s��� ����P�D�cl|P~_���q��������<����������}�N�x��0�k�<���N�������������/ p�ti"d-����"�`�#�6��9�VѺ�D�����������M����V���"T�A�������K�$�� ��T��h��������~�t�T � �t~������~�����������h ������������������h�������������������h ����������~������t� ��t���������{�tR� �t������~����������������������������t�6 ���������������~�����~�t� ?�t~���������������������� qq��P�V�]�]�t��סж�������i�h�h��MD�;ZQuItI[�nt]��F�EQ�Z�-[+@@*e��-�8��;�@�@��4��������������u�vǹ��������ߤ��������������p7ZYCYCq5�(����������������������� �v�� �>����>���>-r�>-��>�j7��)������1���� �;��a�u�a��b�t�a����vz��������yvvzyu�:uz��������yvvzyv���LR]]S�BR�]�ĸ���B�]�S��x�*�.N�Z����wR�]�Ĺ���w��wR�]�Ĺ���w�Ǽ���|���������������C��NG�CCG|pNC���������������!C,��3�1�3,�� ��q�|�]�RS]^R�BR�]�Ĺ�����_���w���η�����}�����|���w����$��䔻k���i��ᦿ���ů��I�7�����J��+��k��t���������}����n~����x����?�����z�}}���}�������������b����;u{�{~(0YP�� �K��S{T�Sm���������������������{qiTAsF�G�K�i���wz�������w0�o�_ew��k�j�� "�˒��l�s���h�z�t���u�|Ц������y(0u"�5��������@B���'��\��ϊ؊����s�q��ٱ������0@��.&7�e�}�|�_��g͗��������������������������|qD|u�n�l�a�K���]�~���������������������d� i��q�qq��u���zw��|�wʎ����ó����^�=~Ş�v�}M�,������7���Qu�p�z�������T�S��(�����p���zKY�N��G����J������ ��b/ѓ��������c�c�t�u���p�4�K�6�gp1���zy�������@���������������������y�r�7�Y�}�{�w�\�������w������x�F�i���������������������s��}��t���x��y������������������������������o�G���qt�� �s�p�^�)X)iz�=J<I� ����ԑ�yʂ����������X�j�eˈP𫐠���{�y�M�9<��I�b�q�u�ҏБ�Z�=�Z�>�F�df�|o�L{1�$�+���#~[G0`SQRn�e*wXjs�I�x�[��Ͽ���^��d�7�,vX�9�<�D�B�c�r�������������~�������������������������}�\{zeugwT�qtmq�F�X�ec_�d���d��y�q�]ʼn���������������m]�n�r╠�����Ĩ�@�=�������{������ ����j<5x0�3�%��������������������\�Q�M�������������G���#�K�.�<(����������f�f�f �h�8����z��_��=�K�� �8��^�@��m�K#�2�'(��h�U5���h��KQ�����y�����������%��.�"��/��b��7�������$�:�,M%��s�y���s��vnX������}�|�|�����,����#��/�� K���=�{���@��������m�_�X-�P�u�P�ª�����.�M�IJ��T�2��&��&���<�_�]�A�Q�S@�QdXJ*���13SsVQ�~�y�s�"k�=O�B���m�m�Y����������XX��[�J:�3�3�:�J�[�XX���������Y��m��� ��)�M���C���K��K�|��|��v�pus�r���dopdad�o��������mn��no�&�{{�xoj�p��h_�hm�nf����������������A�����rk��R���h�������g/Q��Q��I�s���������7�z����������6����ݺ�����Ͱ�H�f�H��́b������������48�T�T: �t,��[�tR ���4�: �t,�[�tR ��4������������t���������cM�A�AM[Pc����|�xxW ������w�������/�����g �T��M�Y��4�� ���T@��������/���w��p��{�M �4��| �������T�t�t�T����� �� �4� ���$�D�d�d�D�$�� ����| e ���~��mp�k������`�Yy��u��������ݶ�S�Hk�pf�1H ��������x� ����������������������������������������H���H��������������������������������-�H���o�{�H����遏�������������+�������������H���H����������������+�����������������H�������������H����-����������������p������m�t������}�%��I3�U�����[���R�����H!f��������������_�����x�x�o�r�iB?z<���������.�"����������t�o��2|���3�������C�������T˳��T- ��hn��4��� ��Tg ��5 �T/t0 ��g �� P i �v������@`��g �t�����A�A�2��A�A���A�A���A�AI�'��t� �t��2�F�^�wtp�c�s�����������K�c����I�� ��>����Z�Y� �2�d�e�Ҧ��t0 �t���E� �E�E�#���)�v�����o��}���}�4����u�{���z��u\� O#���nWv�Z�����h��,�l�t�:�$�4�Zsj{rg�������l��b�1���Xl�dvG�'�b�Q�^���{���y�q�����a|x��|{�j�j���������s�}�����������������.Ӣ�ѡ�?�I��Y�����K����k�.�#�4�)�s�V��� �1��|��5���G�c�%�1��A���� �X��R�f� ����7��n]Mw]�^�}�����ǟ�x�w�Vo]� �yt�y�y��������������w�y�B �A��'��!��3EM�M��!�#]��([�B����4��W�t�I��m�@��n���x�Wx�W�t�I�����������W�ȇ���$�r�z����ӎ�l�Q�3��J>�Rq�����_�(�%�v�v��=�=)�G�/����H��{����uA�R�6�=z@k�wl�k�k�w��������l�l�ae��l�j����������{�R��I�7� ��A��5i�f�sg�f�f�s�����h�.�/��g���g�e���������0l�F� ���� mi�E��#�=[�Z\�Z�#�=�E�O��i����������N�����Q�@������Q���������������y��Q��������@�Q�������p������z�E�������������&��}���9�ً���܉���{�H�[�1�����������N����[�G�C��J��ۋz"q*g2E��K�a�"�8�1�&����*����a�/��rwxrr�w�������T�(����v��]����������������*I��0��������������� �� ��3����30�H��5 ����7 ��Tz�|��4# �5 �� ��T�|������������������6 �T��> �4�# ����T3~~����T��z�wwv�x��T�������4���4O����e����9 �1 �����������d�p���S�F�4�7�z��w8�,�l�����������r�7����R��Z(�x�[��t�s�[{��+��;f�������C�3DK^Fx���u���k��r��l���qv��}�������������T����K�����?�(�&�P�X�+�)#JU�^m�m�m��jg�e�nyiYW�»������ë���P�����7�i���S����պ�ԤÎ�˒r�Spp�o��G��.����B��%���r ����u�`v���t�T�tp�� �TR�4%���Z�d��z�{� � �IS�4( ��� �k�.� p�k����T�������t �t �� �tR���M���o ���� ���6 ��~���������* ��Q�)��ۛ��S�%������4��Ζ���T��˫�K�T�]�H�A����F-�"�K� g_�y�z�}>�Q~{{�~؉؇}�zy_�g��K��飳���ܩ�n�_ZZp_bn:�������v�k����bA*t%n�d�ʋ��̫�����4�4���������m�����4��tb�����m�����+�+�4�4k��kL�J�J�l.�d �� ��|{��|�8S"��1�Þ����H�=|}��}�6TV�5�wS�L<JI<{�{�|��4��"U�4�wT�L;KI<{�{�|��3�1VPwcSM;�Nۛ�����0���0VPwcSM:�Oܜ�����-��7O��d����ٛ����T�8���9O��d����ڛ����S�;�@�Ǡ����L�9����"������t��������s ���V``V��V`���H�z�u�|�K�R�Kj��g��� �ů�������ɣ������YPOdq2P2R2QreL]]]L��e3�0�3�a�S�f��ó^U�����hv������n�2�o�����E��������`+s!���j�m�d�f������������J�\������e������܌��� ����<������b�d�a��ʵ���֊��ی��� �������������!�z�2v�Ԁ�����������<���r�qo=w5d���:�y��.�����h�O��6���?���)�k��k�k�� �k�k���k�k���k����������� �������ɲ�~�=�`�U�f�6����@�IV������������`b�����1�N� <��:�M��@�x�i�]�'8��������T��� ��} �T�� �T�mh�n��������������PelnhK���l�eP�����������������������;�T� elnh����l�e��Z �P��I�{{�{{{��{��Iy���!����������� �������~�������������$���~��}}�����#M4m��� eupb[^�d�tQ�E������������T�����������Q�E������r�e�����ĸ� �b���������$�����������0�Y���� �`� �_��_� �����fd�egg��h����1���(���'���,��� ���ge�ffg��h�a��C��N��~�W�����������������������������H�y��n�����j�m�����j�m���)�KT��e�]���B�c�=���=�=���=�O����J������i�����!�G�)�e���G�l�G����}���ff>TT=��g��}������}��R����������������I�c�ZYccYZ�c�������c�YZccYZ�c��������\pcdw�y�wx�R�j�.�����j�.�R�����c�o����ͭ�}t���������������qZ�������bZZcbYZc���\�L��� ��g�S������VI��m� 0�ܰ� �.��G�.�����k�.�L�.�k���?�+�����llH�\\H��l����������Z�釧�鏼����������0�� ���� �k�cthjz�{�{z�7�L��v�v�K��7�����i�s��ù�Ĩ�w�л�����������Qa�������haahhaai����?�U����l�[�����Ĺ]S��Z Z��+�)�*�*�����MO���v�rqvvq�� 25 �3����� �+�q�v������������6!M���r�34��2���o��q�v�������*� ����� �).����`��`��`�������N�W���{�W�M�}�|�X�L�y�R]^SS]��������������T�T����V�Q�~��ù��ù]S������S]^SS]�����WQ������U�R�����T�T���������t���t���4�''��t�T�T�t����t�T�T�t�T ����7�8��8����a��`��a��a�`��a�^�������M���kl�`��� ���8�a�M�a�k�aW�`�a��9�M��9��7���B�a���� ���8�M��9��7���B�a���� ������H����g��g�[�o�������\���@�\���C�G��%�:`d��h�b�gb�ۏ֯�Ȱ�����������:��%�G��?�G��%�;ad��h�b�gb��N������;��%�G���H ���v���/��}��������7���������� Q��Yr�3F���ZXa��X�x�wx_blk�x�����B�)� K��%Lo�3�B�����J�������w�u~�k�u��x�u�����*�k�?��O�z!x�yxv�z���A��������Y����� �Ϲ�������[�D�j�m�hl|�{�{������̡���ԡԈ֊���j�8ч�������������5�T������&�9�E�� �Z�$�j����������b������������<���r��������(�B{]�<��6�T�Y�u���Z�|�i�JC^E,g_zsyub��Ֆ�Ӫ������u�^�q�-��1������ݛ���zJ�1jI�1jgT����iԻ���E�Y��}M�F{M��`���@��������]�����~tv��t�z����,�������������������������J�����~����Y�������=U/�0���A����������������q��t��ת��ԛ�����d��z��}��������PPxvtnos�������������������������~���}�m�z����Vz-cObPru[�N�� �S=��)�i�d�<&l��i�X�sՍ����0��Z���Z���6�:���3W��4�U��_U�2�6�6�W�B�N���� h[aj6GUv@cLj��^�H�I���,�+�����T��j���k�(�j���j��c�+�,�5�4�+�,mmZZ;�Z�Z��۽����+�,33m���0vH9*��/������o���⩩�+�,�4�4��>4� ��q�{7�$�//�)�9�wh� ���0�m��+�,�5�4�+�,�4�4�,�,n�Z��ܼ���ۋ�Z��,�,�����>�'���l�4�n��,�,�4�4�,�,�4�4�,�,�m�Z�;ZZZZ;�Z���+�,��/�o���-��D��������/�#5>'}���n00nm�,�,�5�4��,�,�4�4�,�,����ۋ�Z�Z�;ZZ�+�,����j���������+�� ����J��Ѳ�"�^����������z�}�i�{��ѧ������錐��������z�s�s�^my�z�Svn�n�U{u�u�w���z������~��������������������������ڦ���L�vewe��:rnwt]R{���������ϝ��ȹ̯�����\�����j�����t���a�z�������m�|�}�l�~�~�n������h�~�u����������������������N�?�M�a�m�����J�}�����f��g�^�%��l���l�I�%��u��X������Blznxj|Z�6{�&���1�~\�����������N�UL���������ܿ�I��4�����'��6�������k����Z�6nNw���������������������������a���������������t�T�T�T�t�� �� ���T��������] ��g�Z ��`�7�7�l�f��,�,�fA�V�4� �g��K���W�?��t�qE���E���E������4��4� �������� � �� ��@�� �5 ��/�0 �x ���AA�K� �TV 1�CK� �TAK� �TA_�K� ���y}}yKy}����������}y�T9 ����;��9 >0����y}}yKy}����������}y�T9 ���P��t�t��p����f�e�O�ef�x�x��x�xe�O�effe�O�e������D���D��������8| Z������ *�`�7�Q��� �`�6�����w�%� �Y�4�W%*�%� �X�4������������j��%����1�������������g�6�`� �Q���7*�`� ����D��4� �Y�%*�&��4� �X�%�W��� ��T�����#���E�E�#�����\��[^��h��n��T�����^������\������z��.����}��T���N���N���N�����i�Y��T���}|�|||��}�T��Yyi[U��\�`�u�T������������T���������v���� �� �+� �@�� ������8���T�j�M�Q�M�Q�M�Q��W�m�[��F�N�$�l�\��T�T�{z�zzz��{�T�T\vl]X�$�F�N\vl]X�4[�^�v�T�t�� �������������T�t�� ���������P�8�j�J�2��R��Q��k����V���o�����8��������>��A� ��,��������'>�&�&��������2�u�����Q�e�����G�W���n�!�e��q=s)b?�ɽV����W��X��/c���������@���o� E`(�������y�k����2@� �/������@���O�l��m�C����L�����A������A���l�s ����� e�1<fXEi�o�B(�4�G�#������ɷ���R�M�7�L�M���ģ��[�?�Q�m��k�ȥ����a3N���H�� �F�?���A�G�!�<������/0�U����@Y\@���քd�= @�6��>�������U�*���*j�*�.�N�������������������z����+8��a��{�z�{�a�����Y�%�#������������y�=���<�=���=�<���=�<���<�*����`�`�����`�^������+���LPzlX��1�A�z/�-����6�D�&��@��I�����`�_����4��|�����4���B������ 4���4!�����3�}|��~�j�k�/k;j:/d;�j�k�j�L��`�������* �`�h��������������u���Y��5�4�Y�\�5�5�\�Z�5�6�\���~� � ��� q�@��-�3���3�T&���k������������������v�vXw��p���D�>��m2W��.�_�Z���8n��������E�� 5<�hL��hL�Q�R�����S�u���'/�����>0����A�g���z���8�(�Ғ��ӑ���P�����0K�C�'�Z�L{o_�u�����O�n� �ɋ�#��x���W�{��D����ߥ���p������B�dȋ�e�E��)�p��3�����+5�7w�p� ����n�t�T�y ���@ ����y �4��'��� ��� �� �� � ��u ����n ��� ��t' �T�� �� K� ��K� �V ��'�� �t��X�t�@ �X�t��v������&�'�y���&�'�Y���� � ��� �Y�&�'� �y�&�'� �b�K�HJj�p�������̃Έ��bi ����������a����ouwr~�������'89�{=�{��mx������������<�*e>����o�kjqpi{������A��R*7}xE�|��}jp�����������]�VY0�-�|�xp���aime{���}��l��d""�p*��}�|bl�������������v��\&�A�}�xf�a�) ����W������po��"��_m���3���m������������"�������3��s������ٝϞ���¿���������8~���~����}������������~�������h�s����������������������������������������������$���������������������z����������������c������������t�c��^�����������_�������P����������v����������������������������v������������������~���������w�~������������������������������������y������������������f������������{�h�������������������������{������������������� ����� ��Z�~���}}��}}�����}�����������������||{������|������������Z}��������������������������� ��z��}���������{���1���0df�}i��t�j�\��KMuTu���z�y�~��������0���0�����& ���� ��� �� � �<���!��!���� � ��!���<� ��jv�����t� ��Ǒ�m����l�����!��4���CP�W�h�Ќnj��������������������������|�vw||r�yI����s7h3^1c:gJlX������������JU>�]�w�������������������D����&���_��n�����������������������r6�Hgd��al�o�r�@���/������K&``m}�"�,���� �����y������������@��}�z�~�|�{@��Ë�����)�������ҧ̞ȭB�O�`������)y)o3h������������m^��Z��x��� ��� �:���w !�4�i��� 1�J�{�z�~�v����������$����$���{�z�~���������������J1��� E�8�)�3��y���������������{�|�|��y�3�8�)E� ��� ���1��V�!�4�g����V���Q��G��� ?��3�������������������3A��� H�W���T���!����� �5���������������|x$�5�!��� �~�;������ ����~�V��!�4�t���/�����|��h�7��S.1l~gd�`��;�!������������������w�g��vp�h���� �i �?v�� �x V�!�4�������m�T�T�T��������� � ���x �������- ��V���P ����P ����P �������P������fA�V�� ��T���l�f��P��������������z�z�! ��� �P �����4��4�����r�n<��B@(��vM��z�zy��:�(�(�������! �u�6��B@�!�eDR���Ĩ���nhhRnD� ����� �x K����!�4B���f�~����:�;�8��:�;����� ������������5�E}}��o������ۮ���h�J�t����������o�%����]�8%{~y�x�g�(|{��~r�����������x�j�r����������q�O�>99l>SO~~z�z� ��� �x K����!�4���� �E�Q��y�� ���������� ����1��������� ������������ �%v�� ���w !�4�4��v�����{���v���}�������������J���J������}�X�}�w��}�����v����w�}�Xe}��w�}�J���J���}�w���e�������v����������aʁ��������ӎ���y�L�z�z��y��ӈz�z���|�c���y���u���Y�aa�f�f�6�&������̶Q�HyA~`��D���ޟ������(�����#�P������g�Q+<�3%�!!!�S�|�B��D�����������M�h����ߺ����� ���ђ���O �.�-�.�-�.p�l����H��s���-�����U���7����s���H�<����J���J���J�?����H��&������U�����r��s����&�l�~�v�����~|�|||��~���v}~rr��r�r�}�������������������������|�"�����������������d� �^)�[O�K�0���-n�p�q� D:��)�r�J�?�t~���������r�I�F�o�9$�"�%�����9��/����i�ü��I�IR^rdcl�m�k���ԧ��2�*�:�8�)�0��\��pFN[BA�\�Ÿ����g�h�gGDDl)�3��=� ��� 0� ���jR��V�V�VT�PQS�yV�V�V�����:��R�j�������V�VyV�TPQ�S�V�x�������V�Vy�Á�����V�VR��j���h���h� ��@��x�m�����Ł�y��V�V�����j�R���t�t��t��t��F����4��x��P�p�����������������[��p������x�4M����F�q���q�q���q�Iw�w��v���|���yx���*��|��8�����������G�}�A�I��r��w��-�u�����\�?� �5'���p�����x$�� PY8������4�I�5�K��� �G�3�#���T�1��!����I��%�>�H�G����U����������B�&�����������v\w�ͷ�����- �-������%b�b�d����&���-�JRp�r�v��Qi��u���,������t�~��Ӣ�9�������R�M�g������Ĭx�{�}�ާ�EvhrjplJ�- �?�&n �5d�b�b�I������,��u�e��u�i�`��M�6�f�X�P�����lj�iij��l���PXlf`�M�6`ZiRuL�};�p�omm�o�p�|;�L�R�Z�M�6�`�m�[������� ���[��Ɨ�����M�6���Ġ��|������������}�����������+��v�j�������S��&�z���������z�g�M�Rj�h�e�d9o�I�CAA~CtI�o}d{fxg�j������;��v���+���I������z5�&o�?� ���m�j�hĬ�7�;�j���j�j���j�j���j��j���j�� �0��K����B��H��� ��\�O�+�:�������x�O�a_U�TS˄�B����g�f�t�XRweWW�k�!�����:�{�z�{��z�zy"J<%wl�y}jh�w���|�m'�!+\�!� ��ո�ϡ�n���������M�b��������x��������7�������������t�tt�p�o�p��yje�f�{��m������~��� Ǻ������ �i�ii� yz�yW�uf�^������� ���V]g`[[f��������_\��� ����A���^���N�?�I�`�U�j��f�#�b�'�^��j�T�m���4=yBF$�������3P��:kS43g��߫��ޯG@����pFAw@�UM�M�M�%��O&��i�Wt�LXU�_�o��gBF��b�WR�?�d�/�y����(#�-������:���=�������������;�������������r�a�``��^�_�^�r��ruke�dA~����������R�?����w�n�mm"�?+��R���������������U`�B��=�j�ȕ����w�S�<;QE>?�F�` ����� � ���R���X�����X�4�! 55 p�q�sa_^U^H��K��ʲ�Jp��w�����������m�����7���ų���u��~�������������������/�/�:�q��������~�i�y�����k�k�����k�k�����k�k��gf��ho�py�p�o�o��������������� �����n�0� +�(�\f�m�j������ő�¡���������C�B�{������������g�tzl�dg{S������)���������i��k��-���������z�/�R��ɮ٫ސ������q��,�Þ���2=�5�����������q�n���Y�V�L���9+�3��zZ$�;;�#�}�Mwz�V�qzvy^oy�z�z���v�!������UggTUT���¯�¯gT�{��fggTgg������¯gg����UggUTU������gT���ffgUgg��������gg���!��M��m���#�����[��8�I�C�n���y��y������|����������죢����������������������������Ԟ���[�T�I�&���%�7�O �����~�~��������Tvt�s�r�v����6���1����p�s�����������������Y�M� �O ���w�p�v~���Tv~t�s�r�v���l�U�Xq�s������������������k� ���%���]�r���������������Kw�x ���ܿ���� ���D�&�l&�y�P����� ����>�T �/ ��������Ua ������� � ���������3�����������^�������bX�k���>��C������_��}�g55�533�3g}cm6ﳽm�v�%f���������~~��O�~~��~�����^���������a��}�g76�7/.�/h~bn1���l�p��.[���Rh�5kuZi/�4o�e������������ ^W�f����������������7������������h�7jvWi'�2n�f�������������z�#�z�C�p�i�s�L�2r@;pEVP<Q<m+�,�4�>�;�O�d�l�w����� �#�>�� ��������������������ƭ�� ��t��t���������4��������t��t ��t��t�T��������t��t�����e ���7>jVR���H�����������%���HV��j��E�#�#�E�E� �E�E�#��������H�R>�7�E�#��E�#�#�E�ج�����H�����E�#�#�E�E�#�#�E�E� �E��?�>�?� �������� ++� � +� ��������heXuS� +� � �� þuh���������� �� � �+� � ++� SX��e��������������%��������� �+� ���� ��o�9�˫�4��9��/�ː�/��4��G�j{fj}�^11^�r�t|q�����j�|����$���$�J���|�j�B������G�r�b�rrKK�&� ���������������j� S��ˤ���r�eG����e�����~�1�~�w�~~�w�~�1��������G �z�z�����0��v�~���0B��������KR+%+ �~ �T��+u�+������~�w�~10����������G ���4 �v���2 ���d���������d��0� ����m���c����Fr@:}77:��@�����ڳm�-�T�0�>�����2���tM�����2�V����3���3V��2Y�&���L����t�������>T�0-����������V�-��� K��K��K��K��K��K��K��K�����T�tY �T��Y ��TY �"�6 ������������g�n�~��Y ��T��Y ��TY �"�@6 ���� ��������H~���������Hf����T �T��������g�n��p(���������������p�T��<}~�}��������<���4������T�����T������~�}�<��2 ���<����p�4�t�p� ��Y�:�YY�%�$�~�~�$�%����Y�Y�:�YZ�$�%�*�*�4�4�o�ol��8�������I�I�������8��o�o�4�4�*�*�%�$����Z������u������*��� ������+��� ����u�H����d���8�lh�Tw�w�v�������y�m�\����_u����5��������^��/�7���h�Vf�������J�C�2�2C=+�J������V�hX�[�<�*�N?�Y�3�: ������]�#�������"��S����:��Y�3�N���������%��%�I�%���%���%����%�F�%�"�F�%�F�%���"�m�m�m�������%�@�5����z�"�m�m�m�m���F�F� �V���m��y�j�j�g�wrPE����]�����}��������~���S�u8ӗ������������������)����x�m�6����� ���|u�w�}un]~�'�)�k�p�{�u�~������������������������y��������� ����n�k�upto�g�o�>�4���y���}����Ϧ�)�Q���4��� g������y�r�=���7TRyy�t�v��z����3�����������*��������WJ�t�t�x~����8�tA&���ys�j�m�m�}������������������������������� ��: V�x ������� ����������������������������������������d�T���T�- �5�������P ����������x`������� ����������� � ����ee�pZp� � �������%�$���� � �B�(�(�BP! ������(�'�'�������$�$���� �G�G�������(�G�G�����s�$�$���z�h���l�?��9�����������%�$���� �������������������������_�{����������_�{������� V��| ��m % �G���G�G�G���G�G����EQQE�EQ��������QE����G���- �� ���� �� ����% ������ �E�Q�t������ � ���l�T�������^_|_j-Z7BG:?)_�s:y8�C��Xc�cs{~s�y�y�y�y�z�y�o��t��������������������o�����֎�~���@���,=��"��H(�`��dine��|�An��q��������������˗����NJ����ܨ�,����+P�מ��� ���M��� q{mv��=�m� �����RJ������C���w�w���7�c��l�!�w��/|�)q�%� �Q�X��e�������Y�G���D��������W[���r�����0�I����d��?����q�o��v|wv���N��X��^�U��������������Z���������l�-s|e��W�"}f��ڋ��\�G�Q�+�L�������~b����G���D����C����d�5�.�2�6�J����:#��:���t�|�m�c�U�Jmopm�v�n�]�TB���4�B�@D��d��$��r���������v�J�L�8�������8˿}~��=����.|Ն��s�=�x��zo<�B��������������d ��������l�8�l��� �\�������ʨʩ��ܧ��x�x��Ӫѩ��̉�Ш�ܧ��̩ۨ�~��������+U������n��/���nT8)m'����x�x�����x�x����+U��mT��s���_�����^���^�����_���������x�x������x�x��((��8���m��0���n�y�fz�������z��~���|����~���w�L����������������������������@���������������%������"���s�x�@�����{�s�@q|xs@�m��w~x� ���~�x ��_s�x������{�rr|xs@��s�x��@�����z�s (r{xs �2C���������������������������%���������������������$����������������������%����������������������w� x}s@n����ww~s@m� (�{��������|���������vk�6��~�}�xen�������������H�G�)�qtyduw��{���������������z�~�l�{������������s��{�y{��������������s�i�����|�h���o����b�p[N�@~���� ������r�@���na����&s���� ������u}{x�w� cn�������3�������o������w�~u?m���{�������D����@�����}s����~�szzqq�z��������s�}}�w��_o����G��~�}�xem��������������HG����������o�����x�~u?n��{������� ��~�}�wfm��������������G�������������(�����������������%���������������������$����������������������%������������������d �����;�z�u�1�t&�A����"Ω̵�i�����&��L�̔��+��@�����~�t��vq�az�p�������@��������u�bw&�����8@�SJZu\ek pkf�Y8@,�����F)��:�������J\^GZg��m��n��|���������~���~�r�N�v�����Ư�r�i_��z{�wow{vy���}�p�sV��1}ns�o(>�������}�>�pt�lN[XKH�[ͨ����>��- ���"�?���4�����'::'�':��������:'�,�Ah�"����t�t������LR�A�S�1�S�c1���J����ֶgLXpjZ�@� ��=�P�B�BPOA�A�O�����������gŬ�\�]�W»�[�Z��3�)��S�����f�f�@�_±�R���D�=��̹���|��ͻ�M�V˹�$���Q�G̟�^ͫ�w�_�B��G�.����O�`�I�Τwϓ�RϺ�T�EDjX������������3��"����"��7�<�"�ߊ��m�Q�1@@ry�t��8�����s���pv�u:@�����r���fqv�u:���d@���r�_F�������/D@�>�L6�L!�� @���+���������O��h�h��h�h������[�N@�c@92;�����@�����1 ���y������,����(�(��,�m���m<��}ni�k�<�ytg�n��������(�B�nl�mva2�gW�TP �����Q���~a���w���e���z�����!uP�������!�Eu�������:�P�B�BPNB��G�=�_!!@1�@��Z�*������y����@u@��������_@��M��_��H�EQ�Ji�Q�wr�SrNG2��Jt��A��������(���@w\�EQx�]�nr�TrN��:B�N���������c�T�X�.���E��!���]^����g���������g�T�W�-�������|cQ�� ����f� P����������+���(�(��+�l���l�>�vI����I���<5�������YaqT��;�Qvy�{�Q�ŷ�����`b��Z������ �Y`qT��;�Rwz�{�Q�������9�RI�P��P(�����*/�inW�����|ϊ�L/b\04�]������O��_��_@�P������(�� ���e�,�l�,���|�}� ��v��������)��e�iy�����z ��������)��v��������?��������?����4�� F���������or^{g=Z�������i��� �*��������������>������薚��=�v�������������*��0��������������������9H����3�� �F���������os^{f=Z��P�����i��� �E�(J�-�����I�������4��������������i�^x�����z �������x��d ����6��2��3�������~�����*�*��)��(��!���=� �x�e�t�pqR�t����������������J�͉y�iiylH����Xzdipsl_~UGJ��h��s��x������y�W�9�Y������������ӿw�y��k]�]s}�zw�~�{��m�h7���k>�Yi�{������� �zt�dYg��rn�|���oM��������������gp�tx��*�k��S���������������k�*�k�l��1wGb_]aT�fvs��t�+�*r����\�������zh��e�N;�h��_hg_@_h��������h_�����i�����l�u�~��~����������$rfP|KEU��f�a�v���,��ɼua��a�P@��d �����Xv�v����T��@���A�!����!�K�Ty� ����� ��~@7뀙v�~��6���� ������������D���� ���� ���T���4�[ *<�씒�������<�Jڔ������o�C��j�����S���R�'"��p�G� �*��J�,�����)��!����!K�Ty�p��v�~��6��� ����������������9������4:�T[��R �T��:��T? �T��:�T? �T���t� wO�V��VOcZwE�;��( �K�& �L��1��������H�u m�4�"�9�!�4� �D�7���*��*�����~�b���������EL�pC�Q��'�]�V���O� nLE������� � ��3���(���`�`�����b�e���!�u��!��3�U��a ������� ��� m�O����%��*� �&�-�~�&��ހ���`���b� �z�]�A�)߀���F�9�:��5�$���� �_���_�� �E�A��������������b���w�}.��$X�'�����[�����[ހ���������poG�b{���������������������� ������S�x�Y-�� ���q����|���k������j�o�uh��yə����R��r� �����T�i �����_����s�u#� �f�f��"���ss~ki�_����K����_���������"��f�f�#�u�s����_���^���T�T���T�T�O �O�� Z]ukh���PUj=;�<��$�=�ӭ�������}�(������7�0�!���u��c6�rt�v}ra��f��'�����Z�X������,�W������a p{��Y�� �XXuxmihaX_)(X��b�hu�X�� �{�T�K�T���T���T���T���T���TK� �T���������������������������_h�m��x������������ ��������T���Գ��� �������� �i�V�!����������!��V�iK������� �`R�Go|iv�� � �d�d�}�}� ���T�T�4�4�}�}�� � � � �v������8���7��8�W�9��7����̩��u���x�t�o��v�w�p��E�V�3��'����(�������I�6���/H#�@��_��6s�2�r�����������v����)��� ���������7�,u`melh�@K(w,�k�/�T�c�W�B�R�Z�s��Z��������V�:� �[�X�2�;�@�L�p������Z�" ���x�#�&��|C���@H�#SQ�4� ����+�� �2�й����y�z{�6C'r �v�'�Q�j���a��N�S�c������I��=��λۊ���6�O���F�u����������ɷ�a���y�r�v.D����x���yl�u\eh[��x���O�~�|�i�K�!� ���u���F� ���$ ���z�z�������0� �N�e�e%�N�0� ����z�z������������������������������� �������������������� ������������������t���$ ���z�z���� �������- ����F׀���� �D�� �D�����w��P��ak�O����N���(瀰b�X�S���9}�^�H���t��T�U �D�� �D׀�������7׀����]�]��FJ{oQ���$�w�v��� �r��G��� �t��K�KB�=׀[ ��v�N�;�m��Y��������i�)09Q��瀷���]�� ��T��� �4���������������G��% ]� c�mgc���cm����������*��um���v��pvvp��qu���������vp�$�i݆�y�"�Z�4x������+�4x$�Zy;�N9�������������@��?�@�?��@�]�?�?��T�e�[�R[ed\\�d��R�����j����������b��O�� �����e�[�j|�����������~�b��O�� [ee[\�e��j�T�SP����e�[�P������Z���[���ZQ�R�T�[ee\[�e��Q������Z���Z���ZŅĀ���������������4� P����:����� l�����9�4��t�M����J���lrH��m9� ��M��������qxttur��������������Je�� ���sp�szy��}e� ���<��������cH��u�Rtyzuw@B�X�����2�����ʳ�8�g^zp}UY̲nx�v�w�ww~zm��#����Ԓ����������,���������f�����������������������~��t���x*��}�-�������������oA��c�2S�3_�(���%�Q�,�d�F��W<~����4���g�E�W�RC�tp��|��1����$�+s��<���� �� @�T�)�0��a�_�i�3��� 4��X;&�� ���us�s9&%9l�_�n�hY5�����]��\�a�\�<�R��V��k���_�k���`�1�T����<�kOF�w���2���ϵZ6��_�" � ��g���<�jOF�x���2���ζZ6��`�" ���g��-���~� L9wu�z~\L��y����Ǟ�My�v�}�N�}������� ����������ǜ����z]�����z�7�����T������t�T�t��t�4�t�4�t�4�t�t�$���r�r���d( ���� ���*���*�����TR�4( ��*���*����' �4( �T$�d���r�r�����n���Z�\������J�x�k�^kwwk�k�w��^�����~�|��}T|����z�x�k*kw��U|����z�w�k-jx��T}�����һ�����xj�������Һ\D�����E[[D�S^m��x�H|��|T}����.һ����һ\D�.����#����##�����#��������� �'�V�'���'�����8�����������L����t�t�2���2�T�2���2�T�2���2�T�2���2�����������������O��� )�$������x�r��O��������r�m��c��������q�ly|�~��"��|�yy|�~��@� ��|�ylqrk������e��w�}xt�����[��p�wtop�t���b�������p�t���U�������k�r�������#����� ����$�����������������U�������������a��ᰥ�����m����}�||}��������#������V�䕌�����O�V���@�P�[�������d�������������������������������\�R�\���D?���G������!�cL���������m����������?J���9_���������� ��l��q�1�:���KI���������<�E�Q�8���8����?�E���������d�V��w�s������-�1���a��������S�]�aA�����<�U�i�u��t�,����������e���#���z���_6�������������������I�c�������l�����������T��7P�7���o���7������w�>��������>�����?������������� �D�����B��(�D���D��(�B����z�D��)�A����NZ����ȼ���xȼXN�=�v� �:j�TR�R�;���;P�P�Q�2�<���;�5������,�$�(�)���M�U�]�(���)�+���+\�T�M��q���q�z�3�����4��y�p�m�1�� �.�o��Qk�e�^� �����'�u�v�&������^�e�k����7|��e��pex�#�B��9��o=������9�B]:�#��/���ݠ��p�����"�\&�����"��iR��e��x�p����� hB��� ���R�XD�@���������� �_*����� ��pX�����@���Rp��c����h�E�����:�dM�+��A�����*�[ �����$���0�b�w�q�f�]�]�]�U���9pttp.pt���q�������to���q�J���N �����J�A�N ���A�J���N ��l�L��6�H���������������p�A��O�YK�I�+���+s�r�s� I0�"�/�r�I�H�q��q�I�H�r�v���;�(h�q�j�u�q�i�F����� ����ﷰg�����(����7�]F���$������g�����)XP ��������p'���7���)���28���]8�����j*�%��j��j��j���A�o�]��"�� -�]��"��-�]��"�� .�\��#��<]�i�|����i�|����i�|����j�|�������6���6����6���F��ٯ��������6��UaZ�g����<��xg��w��������������������;�A� � �A�@� �!�A�@�!�!�@�A�!� �@�9����ŵwv�mQ��uL�flD�^A����94�wHMZ��X���a�ǂ��ݏ����,���!���|�����)� � �*�)� � �)�*� � �)�*� � �*���*� � �)�*� � �*�)� � �*�)� � �)����[�O�CPZ[P�5���5�Z�P�CO[[P��P�[�(ǻ��������.�S��"�0���@��:��M���������`ed��e��������S�O����[/:~~|yw�{��� �>�g�7�.�iczdfp�t��ð���+��&4��R���������l�^�����v�Q���B�R��������{�xxgd~y<��/R��c�4��j�c�'��^������d�<�/�g�Z�8�%�V�������d� � X������'nh��`����z�{����{�������@����X�'�&������'�&����H�`�������h�������-�Q ���N����������k�g���-�����`����`��%�`�������a�z�x�w��wx�z���xs�h�t�T��~����������T������x��������'e�'������'���� ���� ���������x"�888ށ888ށ888ށ888ށ888ށ888ށ��888�11� �r�����J��8� �����8��m��D�ڱ��8� ���8��m�898݁xy���f��{�c��E����H����� ������$��D����EQc}{[�h�f����KK8݁��898�11� �D�r�����'m�$�������H��D� ����m���������> K��4�T+�T����������������DqT1���aa���1��q��������������������ӌ��������������$�����ӊ���������4��Fl���G��u�j���������/���>�c�v�Y�X��wr�lO[MOO[�Olr}twXPY�v@c��>kPS�/k�������_�`�b�j�p�N1k���I�|������� ��� ��F��k����u�U�)�4�S�'�-{:d��@�G�� &zz�����E��w�v��lmul�c��h��r�������]��t�� ���bF�s^�[X�V[ ��v�N�;�m�Ћ�������D�1��� g�%/O���,k���j�F�?�j}����y�y��k�����D�� �D��������'���w�s�xx������ t�D�� �D�������7�U �1 ��t��_�>�h�jt�h�h�j���bg�S��g��T.� � �T譁����b���������j�h��>n�_K��D�;����D���� �h�/�����4+��| �Z���su���S��&�yp�rxo�h nr����R�/E��o�qwn��������������������썍�����c�@� ��"�;�;��d�������xp��X�B��B���������}�t��q��۽���������w � �T������d��m�l�su��r��|����j���to �t�t� �t�tD�t�����E [ �S����)�����\�<�����D �4x ���/ �m� ��� 8���������{�uNv����Q�*�3�3��Q����~Fu{uv����+�N�R-��X�v�D ^ ���v��X�R����X/ m� �� ���� ������*��6x��l�l�sv��r��}����jX�m� �9 ��������)�����[=)R����~�[�~�w�~5-!��i��5 ��D ���"�~�v���_��������V=)[���D X����w����a����u���q�u���� ��f!D!��� }��q�q�uu��r��|����j���to �t�t� �t���tD �t�tD�t���ì�|��r������6�Z�<:���S� �vg����$gJAv<��������ֽ�Y�i��<A��J�������Z�)���� ���������� �����P ���0����u�l�c������ � ����*��5x��l�m�xy��v�������{����?�������Z�S����!�� ���4���t�9�M�kj������t�9�M�k��x�xw����� �J�1��1���Z�`���w�w�x�n��=�O�v�T���J�1��1E����`���������nm�=�O�v[ ��m�������� V������ �������)���� �gN/��#��-t��e�Z�\i��\�������h^ ����ֽ��?�#f�,�����W�S�����CZ�7)������ ����6�Z�<:������ �vg����$gK@v<�S���T<@��K������Z��i�i���# �@�@==�)�����\�<��� �!�������� � �i�j��D �4x ���/ �� � ����w ����4D�4�9�/��������^�]��^�]�����9�4o �4���j�|����ѡ���l�s��m��d���������t�����K��/ ������� m������v�~^^���M�M���t�M�t�j����|��r��u�s�lm����d�����������t�����t� �t���M�M���^�~���������2���/ ����� p� �T�� �D ��D �����T/ ��������[ ���]�]��E ������������O���m�|����* ��\ee\��\�e��s� �����V�e�\���9���7��M��|�?���S�#`���������<����`�R���w�<����ED��z8D������^�7�E�&S�M�X]�Z-���`L�M�L�����<�z����=��a����3������l����x�-��v����x�m��qY*m�����S�Z�]�e�a�u�������ж��X�������p~�v{�}|[^s\�I��F�F�S���#Jw��a���â�������������7�z��_���� ��%��>�}=�a������������������f�4���4���� ��)x�5��M��k��4���4�4���4���+����� ������ ������ ���T� ��T�� ���T� ��� ������{���{���{��������t���T�� a�T��� �TF���7 ���� �Tr ����J ��t�T���s�R@�6{���@),\��,��)�@�ə������EQ����Z��T�� a��������������������������������������������������������������������������������������������������������������������������I�Is�~��������xx�x{���?+)]��)��+�@�����8�s�~����������v��� ����������T��@����P ��Tx ����{ ��������T��� ��T�i � P �� ������������T�T�T�T�����T�/��������/�T������T�T�������l�v��T�� ��T� �T�����!5��� �������� ��s�^v���t�� ��4�����~�������4���������������4��������� ��������������}}�{ptr��m�g�}�e�}������������������������M�p�������������������������vw�y����������ۏ� � ��P �������X�t�j\���b��'�d�j�����гg�[���L����״�(� ����¯����#��w��m��ݿ��������b���t��G�(�r���|�k�j�>S�l�s�t�������� =���������S�l�s_ti�q�n�����v���Ņ�3I`QnN�^�D�y��a��g�T�Q��3I`�nȜ������n����;((5;!!6����r��y��������q�h��������n}�����.�d�9�=k��%���)���}���|�|���������|�{�z�v�v��������u�yyv�v�x�}�������������̖ҹ��������a�c���r�p�p�xs�w����z�n�}{������w�v�v�����������������Ӎ⟳�����͂�p�T�l�Zx�e�y�R{��0o|W�b�e�V�H���q��u��O� �z�|�n*�)j4_SnNe]_\]��gwkrmn�n�n�y�{��ʼn���Z�lvTdp@�J�I�4�X�^�xԉ�@����������j������w�v�w�������@~�n�y� ������y�o�r�pm�ue{`nY��n�p�r�@�^������r�ss�~�~�x�v�v�y�v�����}y�@u�wzD8{�{������|�z|{}{x}�~������y�z�~�~�}�� �;���$ˉˬ��7y�8��8��S�iˎ���;��� D8������h���������L����p�`� �d|�j�K������='��������t�<�<������vug|c��`��|�[���hf�@�_�&u1�||�~��y�o��������9����������ut�w��KrjR|Y�% �������ڬ�Ӣ� 2�H��������[Q|+�<c�g�v��EU||��zzЕ֦����������dBr;�9�Wd�������Ir�Pmu������͆�~������/���/�0���/�/���0�/���/�x��y��w�`~"�b�|������ьҋъ���[[~!�[�s���'��ҍҋӌ��l��3z���Q��������R�#�k�r�w�:�v�����������������t�v�v ��L�F���T����Ő�����{ό���������x�s�x�<�ծ��������������������� �|����D�B�F�+��D�~�I�#�6�B������7�}IH_I�D�&�\Ӂ��@��r�{�)�5�� �������?���}�����������������������z��������� ������ T����&�#?�a�O�C�����:������������)��x�{�}�������������.`�A�<�~���������$��!�� ������������z�~�|�}�}��������X�X�X��}s�r�uj~^�a�t\C&OD�I�H�}���������ߤ�@������J�6� �r�B�00AA00�B��������A�00BA00�B����������N������p��i���4�r��������������������t�����������T�������_� � �_�_� � �_�_� � �_�_� � �_�0� �$��k��t������ �t� �$Kh\�b�u�D �������� ���<���<�<��� ��<+��t��+� ��'��''�+� ��- �� ���� �� �����i ��T�� ���������������i �R ��,��T[@R ��������� �4���] �T�3�C�@Z �4� �����������K*�����������K*�������������K*����T*�� �� m�������{�z�����s�{tq� �p ���S�X�k�{���E֫���}��]�p���� ���FV��* �K�H�W-C�C���HK���h�@�)�4�� ���)�@�hK���H����-�W�H�K�h��)���� �4�)��h��� �������������� ������������- ���@P�����@��h���!����(��@@���P��� ! ���@@�� �!������@�@���! m�iP�t�� �����m������P ����������������������������� ����� �����m��a������� ����������������a����R@ �������@�P(���" ��Z���D�� ��$�����@��@D������ %����D�B���" � @ �@��� �$"���� �@D�� @�$��� (��� ��> ���jm������P ���P �Z-m���m���� ��� me ����f�4�4�����-�4����������L�L������m�������x���z�z���M�M��z�z��������V``V��������4�3 ���-���ժ���L�L�������\�U�I� �����(�f�c���}����s�m�������-� �-����������y�i�s�n��������������������K�8�A*����,����g��t������x���^�L p&����{'��%�%���{��p�V�J�9��$�5E���E�$�ݑͥ��}��r��:CW*����[������_?P`X=��}��[A�����bo���/ ���k�������k�������(��2�2����I�����2(��U�J�U��2�k����������������������������������������������������������d � �+��Ԁ ��� ��G�����X ��] ��g��Z ��X ��] ��g�4��4� ��� ��G�4���� �t���� �����������������T����T��T�����i��pE�77EV@p�1 ��U�_�x����o �H 6 �f ���������I{�� _gg_����n ���7���b��n ���7���b$ ���Xr�zspp�s���^?�`�������`���^�� $ �_�`�b���������������Z���[��z�[;�Z����$ ��&j�W���W�j��&�[�@�"�U�����z�U���U$ ���Xr�zspp�s���k�G�+�P������ ���T�v@�T� �K� ����x���I�L��L����I��������I�L��L����Ix��^� m����K�+��� �t�������t�����t�t���������΄�PH����t�� ��������ZV����t�� ˻WL��q�q�r��H�r�qqr- �hn�����n����u�~���t�� �t˻WL�@�m�A�� ˻WL.���t� �JMs^\�t�lj�i�!)���������tI�K�^�����0���������t��H��������!��ww��x�t�^B�<``uf�t�`W�U�4 �x ��������t��t��t��t������* ɽYM�$����� ɽYM������� ɽYM��w�w�x?�)^�cj]�Dce��s�� ���ҳ�xk��.�a������ ɽYM����$�� �18X:b��}}�}��F�hX�a�"���!�� �D�����(�������� � ��������}}��}���b8�1�m��o�9�����t�������t�����������ʓ��������� �0� �%����nl�lb !�+�f�z���x�!�����p��|/�7�c�h�h�k+��^���[TH�P�}��.�}{�{MY�ɷ�����7��o��_qccy��4��{�H]���ȣǦ��������ɽYM�|����%npzdc�Z�}!��DR��� �����\Z�j�����ћ�����|���0��!������X�E���������dk�dNYTMNX�������������� �0PcXR}��6~YV�W��������t��� ��� �� �S� kI�J�X���%��Ba��8�k�������#�E����� ���b�>�����[=�:����- �� �Y�v�k���2�������� ������O������T�����\0�OU�ƀ�������ԫ��afob~h������S��wk�����9�&&�����F�D�[� �����_���J�������ͽ���� ���"QQO;���������2���x)��+?�q$�@8���q+��*;�u�~-%�x�x�x��q�u�utg�f�h�%�'��E���̹VL������*����v�����˺VM������`�����w��z�������TE`ubiq���zup�p�J_e���'�%|ŕ�}���r�����ɾ�ɿ�dZ��,����������ɻ�˾�gY��%����8�>������4 �x ��[�;������k�t��t�T��t��T���l��* ��MC�Ϋ�� ��MC1���� ˻WLN͜�f´[V�mJ�J{K/�o�qwn�bce��s՜�� ����ѵ�vj��+�^���� ������d^�]� ��� �� �b������l�Ք���m�)�xy��x�^H�Cii�}l�\N�J������p�"���#���k�����k՜��͜���k�眫� ������t�������t���: ���o�V�t�t� ���c7�/{{��{���b �z��f+�!b l�l�n����%� �0� ������Ǔ���E�t�^�+��jf�f�l�l�ɽYM{�{�}�.���}P�HT�/�7������q�ͻ]H�{���4��cycq_MY�ɛ�������Ǧ����s�������jZ��\���� � ��!�}�Z��cdznp%������������� �0DR�������������ɹXNMTYN�dk��d�����E��X�ÿ����!��0W�V~Y6����R}XcP�^�v��H��Z��t�|�z��( � z]�����������������������}�z�!~�����q���{�y�z�������p������~�"{}~{�=�U�������������������P�?�����������Q�=���{��~�����G ����������4��I���H�t����Z���]��4����1YW3�6���Ч����u�bQ�������������E����d]�"��( �T$�7��/�V�������,������������'����t� �0����4�����4���� �'�%�Y�T�8�l �������9���|����2'�8� � �(�%�X�U�7�l �������9���|����3'�9����40� ��k@���t�t++�����U�U�t�t�t�t�C��<�<�4�4�4�4�� �T�T��������U�U�t�t�t�tC�++�<�<�4�4� �a�J�Z�Z�Z�Z��44c�����������T�S������������c��������++�T�S�33����������Z�Z���� 0��g�Qv����O���y#������D��O��R����K��P��K�������a�XWaaXW�a��������a�WWabWW�a�������� 45! 5����4!�� 5���4!����-���.�.���-�.���.�.���.���.���.�-���.�.���-�.���.���X����c�c��@����c�c�����c�c�����c�c���0���ɂ���������ь�8�`��a�@�a�NdC�9�s�����b�c�����c�c����@���c�c�����b�c���������X�������9��X��E�-�JF,b���������H�5����@�Y�&�n��Ë��49�H�������b�F�8s��̷�������p�z�S�z�N�{�R�{<�� ���`�_�����`�_�����`�_�����`�_���9��'��''��'�������pq�D�-A��&�a�a��-�D`qX_1�`�A�M�t�CC%&*)GGbb�I�c�~�c͋�������%�)�G�c͋��������c�����B������ս�_�m����� �3�P�D�33DD33�D������j���Kgl:VF_-zM��W�S�R�n�\nn��nn\�n�Z�E�C�S�Snn\�n���n����������Ӿ�N�+�F�:�g��˝����V��C�&�&�Ӌ��l�gZ���G�%�%�G�G�%�%�G�G�%�%�G�G�%�%�G�P�8 X�P �����������* �6DD6���s���r�p���s���G�4�T��mm��v�)�t�~����̩�v������������VJk}ltu�(�vumm��4�[�� `��$�����O�?���$�d����`���`�z�w~���y�8�M��v��a�\t�i�N��߶�`�����4���s�~���nkA�[�"�gwdL�a�G�$l�Υэ����`v�~{ҊꅮK�-�5��%L� �.��U <�B���B<�Gi� �Џ����|�r�`��0�+�=� �E��=��������w���� �y���K����w��"w����o����I��l�khslji�s������Q�x�K�)]`������J�'�����������R~����������×b�B!�-�(��pW}��������������^^��_�I����������|�Dc�/ %�)���p}�����[���D�e��\�]�]Ϛ����������F|��E��/�+'���Ǚ�����eT��G��f������{������������H�B��-��*�\��������m��������N�����N�N�����N�N�����N�N�����N�� 0� ��� ������ �@�j���<�Z�\� �f�zd?�*���1�"�0��-���)/�!U�=�I�T���AI�z�W�dd�]�,�O��+2�=��q��4��{��E�)��<��A��1���t�1�j�1�(��w�;���;�;���;�;���;�;���;������ � ��u��p�������R�@���@�g�����L�)�w�te�C�#��B��3�B3�C��V���j�>|���肙�����i�5�4�_:�v�x���H|�Q���̋����y�P���B����CĻ�*��O8Q�z� �}y����������2����!��v����� �w� ���2�!�d�x��������%�%���u���ou������y�f�"�2E"�c��i�P��8�+�H�>��V������V�>��8��P��i��cE����0����}�D�8�F?�:/5mV?�_@�)������*���_AU��m��֡���F�8��~������4�p�w����:�{���h�I������K��6��AOR��||�|�����7���:�:�-�R�=�6�j��snVK� {Qr2w..�4�$�<��1��U��n����k���;�H�K��T�C�$�[�����E�Eq;rI/�(���6�������F����+������G��-�7+`=(c2�F����]�U��=��P�O�>��U��l�������x �x {����� �T����@�q��] �Tg�t���1 ��i���t� �c�����* KWWK��K�W����#�1b�nZ�yO��L���/���õ������B�+�� �h'X�=�-k7yS[rWmK|C����O�]�e�w�,������i����@�R���F˿���W�K����Jv�f��|��������)���}������xy�����k��~�������������JJ?X7gf3.x,+.��46�?�J�G�X�j�kځLJ��������v�l�~�d��o��J�L�N�*�4�A�@�P�ba�u�����������������l����~��x�y���JJJ���������ww�}���IIJ������������������������Ð��N������������~���L����kR�{�m�m�a�U�U�L�E��C>�<;;{mDRs*MSP��w���������m�s}wy�<u�|�������������ƌ��� ����Y1��0����Y� 11��22�X�48��C�1£dz���ʧ���r]��^�NJ����qZ��o�e�~|Z����~�����W�4�3�X�V�3�2�X+1fIHJLh6�7�����:�g�f�s˂�u�n��c�o���r�~�E�M�U�U�a�ml��|��ؚ��ѩʵ�����ɩ��ӛ��l��G�@�/��' ��"�vg9���������~�{�~�i��������ye��n�a�M�����������x����x�����,���w����M��������������w��^�����Fy�l}�l� ����6�6���x����t�m|�c�w�&�L�L�+d�t������������j�iJ�4qq����ߠ�������˚�|���O���)�x���O�p�Y��p�Z�,���,��p��W��wT�,�J��y�I���������E�7�w�t����4v�Q�^����6���_�4 �T��T�4�� �������P ����q ��q �bty�� ����%� ��������%� ��� �@����t��T�t�L �t�to �t�t� �t�tD�4 �T��T� � �4� ���t#�4 ��� ��+������P�P�P�P�����]��w�~�P�P�P�P�# �Q�P�Q�P���P�Q�P�Q���k��#�4 ��� �������]��w�~�P�P�p�p�# ��������������i�P#� �T�� �� ��/�0 ��� ��� �x �`���t�����T_`��b�#��#�b`�_��� ���y�y���Q �� �t�3���3�� �V�2�2�VL '� �������!�!�yr�r���1�1K��- ��/�H ������!�!��e�+�������T��T���T��rr�yy�!�!��!�!�V@�;���v�����������y�u�w���������{�{�{����s�{sq��v�w�������������������������������t���z������z� ��z�����m� ���m{�`���m����m� ���� � �� ��F���������������> �����������������v��� ���m �m �m ���%�������%�����W��B�S� q�g@\LP���{��|�����������@��)���҅����%����������V�����` ���B�B�B����� ���%��������%����� ������������������������������������������������������������������@w�\�����h<��;��v��-�;�������ݯ].��Sg9G��FXVi_d�:f�t�l�\m�M>�U�:\!-<F<C;D�)�Ե���4�C���5��5��4�C��3��.�N�$���r�j����m��2�� �O� ���W�������q��q����q����t��*�Q���t������ ��4�������������+��j@8ߪ�rr � Rr���@����L�iO;����{e��S�w�����)}5�T��Ԓ����������?����>��B� �o�-�Bvˌ{�b������є���������~�8�������w��������0�R�8�#�0�F�2�SXteg��J�]��l��A9�H������H�8QXi[s��y�x�y����\��HN�-�fX�R�22�<�G�j�m�kk������K�L�����Ь����̬������[������H98HH89H������,,�K�UU�K��,|����������}N�v����������}�|�u||��a8H��������H98HH9��������v�[�����y�-�r���n� ��� �f�����������=�q�����F����)�����?�� ��`�9{��d���P�3o�&?����(���$��������W�2���� ����3�C��Z ���������������`���@] �t �t�����T������0�����!���,���J�����J�J�����J������v�'�k��$&�8�C�����������������P�B�4��n����!�4���8���V�����%�%�����%�%�����k��,�H�����T�����4�Tw���������/�+�,��{�{�a�{��������������L��{�{���������� ���=��=������ � k� �����F �o�~��������|����f� yh|lid�boo��p�������r�mmrrmv�w���~o�v�F �����I �����������v��� �o��T��~�������������ƣ�������@��V���5�!7EV@p �-F�1�M \Z�G#�n'���x�!������ϼ� ����1�-�+���T ��S��( ++EZ��[s�p�k�������������������T���������������~���O�@�������������G�A� � �B������H��E��B� � �B�c�� 0���-���/���-��-�-�-�-m�J#66"���!���!�!���!��p[��m��������m�V�J�E��4�6��H���`�`��Z�[|]~c�`�}�����������������p�G;�-�7���-���m���������{�<��8�Yn�,�=�a�u�K�K�v���Q�.�-�Q���j�K�s�[�hshs�\�h�F�:87s;\Fsh�[�t�����������������3]�-3�s�\�hsht�[�h�"����e�E!sh�\�s��������������-�3����������~�+��**���*�����}���Mz�]�c�.���p�����%��$��f���M������5�5�2��7�7�<�������&�������U���A�+��+�K�������q�5�P�Pm�;XY����;����v����2� ��,�c�T��T��: ��,��[��R ���T: ��,��[��R ����� x�t������t��t� �� e ���: ��,��[��R ���T�� ��t��t��t�ԙ���t��~S��( ��$�t����� ��Fh�͉y�y�}~����������������������p�j���P���P���jprk�5����j�T�h������c��� ���c�����t���������t�������� �R����*N��^����Ȗ��*�� �R�D�e������jo���k�4���������p�h��4�hplh��/�X ��4�X ��9j�oqj����h�p�����4���������l�h�\��ƙ����;2 ���;ǾbP��0�&�M� q$��;1�� �;�$9� q&�M���t���������s���������T��������������� ��� ��|~�}�S�t�������������K����|�}�S�t�������=�������u���������=�������t���������������t�����������������������t�����*��w�����)�)�)�������(�(����������.��������������d�d����������Z���N�����N�Z�Z���N������N�Z�� �Q�+������A�@�A������A�@�!�����������[�������� ��� �������[�������P ��������������P ��������B���� ����� ����a� ��+��1�4wx�{���������~}�g �4�������t������4��a� ��Mr�����&�Ȃo�l�y��� ���������������_��l�Z����b����������� ������&���Z����_��l�Z���b��>�������T�t�4�t�9��lF9y4�d��;����1�?;�U��Ғ�/����t��t����<�%�����%��<����"SKj<5�e�Z�>���:�$�����������$��$=�:���Z�>�e�j�S����m��������$�������5���������������������������4��4��4��4��q�����(��������������f�?�f�?����������(����q�*�*���*�M�*�*��w�I�9�(9II9�(9�I����������*�' �w�����d�A�4���6�7�M�������R����*�M8�=�I���F��[-��2� �~����������� �0����������X��P����d�ow�����4 �4�����b^��hvii�!r(u)����-���v�jzfj~�����qs�����o�q�z�az�qHoC�wq�s|q�����j�z����������)�(�!�i�v���������i�#�o������#���v�i��%G�������������������T���;���;�;���;�;���;�P���� �0���V�v���i�W�P�V��gu�m�l��w�a�|��������|�q�����{��c�Y�il���i`d�H�_�_·���I�5�)4�����y)Y>B����ݮ��U�1�1�V1h8SM������$�w�h��#�h�A�Q�WƇ�����¹�Ð�������v��Z�]�����;�();;)(�<���&�U�1�1�Uԡϱ���B.`������������ �����eSGtCm�$�t��]�$������t��t������R��4'�4����$�B�L��8��,�L�9�}�x���9�����������������������`Q^fxOoDk3d�G�������Դ��"��T�Ua ������� � ���v����s�X����Q����������F�55EE65�E��������������������<����xi�UNg�s{�����f������<ϖ�Җ~�h�r�8��4�W��{��m�X�x�|������������c���������������q��J�_�s��'�*0����������i�ZӵԵY�n��5�U+������"�C��������������~��?��i�h����y�v����x�n��n���n�6������������������>��������#A0�W����9��� �|�x�����������uz�l������������Mx�|��l���������T�(����x||x���x�|�������T�*���0������(�=��`��h��Z�������6��,�� �L�8��6��-�� �I�8��6��,�� ��������_ ���-i1Yn��||�|jj��k�8�d�J�!E�+z�$�9�9��$�+�!��8��������������YisV�>�c�r�bxy~v�z\\�\}v��{~�^�ws8~644�6�8�w�^�~��������������y�b�r�c��>s�3�%�����������p�[��rr�c�r�r�kii~kssqr�b�r��I�I���������V�*����B�+$$c+CB�~�����I�I������%�%�U�a�a;�U�%�%���� �5�?�?H�5�� �~�����)���ԫ��� ��� ��� �T����t ������������t ���`� �����5�!J����� �J����n����� �J����� ��������������w���N��k����+���m��T��T�T���11��������W��� �E � VNMDH>>3�5b d�- �E.� ���������:��������V�2�2�V�V�2�2�Vd�������'��c���U�/���o�c�uovo�c�v�?�%�� q��|����������~��f�F�F� �0�.�*o�c�vnvo�c�v�&��0q��|��������������K�T�i K�T��T��d����h�jw{i^u_oYln��u��s���� ��o^��i�w����hY_��u{�j�h���������������w����u�ji�>�q��w�[��GA�?�ij��k����Œ��������[�V�(1g=V����������i�j�N�bi�6�%�Qt�b�(���e�nz�f�l�4��u��~������d������p��������������"������v�[��~�}�����d����t��V��l���������d���v��tş���W�4��t�t�����������}�}�}���������"��C�Vt[�R�t�����}~��[tvR�[���C������lj�h\^��a\�Qwt\s[�R�sj��z������\oUwQ�V�f[�VT[��g������d���k\c`^ebi�O�bt���������6��Q��b�(��T�e�����|�������T����T�&��&'������d�q���������:=2G<LCYR��hn��@K�5������� �$������������c���{{�q�{�<�<�{����������{�q�z{�c�c00�E�3�'�ҥ��}�}����{���P��RH�L�������byz��{*Tb�#E�.ᕖ�������������������z�<����������_d�_:@sgD�������_�^�_�*d��J�A� B�ɴ��to��������'W4p�w�ο�������������v���W���X�M��u�Y�������1�A�3�g,{ ����հ��������� y�L�� �����Z�=�x��s���a��v�^�������|�Z�Z�[k�.k�/k�.h�e�m�f�$��6�k�+������ː]V���$���Iq��o�~��QN�ڈ���7�.�;�������gh��h��V�N����D�<��������{B���3^w����/ۍ�ֵ��5�b� L�Q*��G���J���W���}��ϗѝ�ڏ�����������y�������� k�T��U���nn~ryj_�M�l�N�y�|bm�����m��T������]bj[��X�]�~��-�u�����[_k[��T�Z����K�N�W]dW�T��]��T��kY�acYU�a�������ö������1����r��&�>k�f�b��r�(�yw�vE�^n�w����������������"�'h�R�cl`j�O�b�����������e���nf�Q����a�WT�`]�T��t�i\~{�&�X�U�3t�O�Zq]s~Q�[������8q�Q�]sZq{N�\���[����k�P�`m]l�M�_�����������|��r�(�n�h�d�&�>�l�e�c����������o��������v�D�d��$��H������6��}���z�~��������t�1��Y���b��������Su��������\�������������������q�����������P�����y��������������,�:|��`�B�/��O��������~���T��a��KJ�~L��y�����y1V�w����y�:�p�I>�/���2ndgaWr�s�w�� �� =������������!�Y� 2��R?�2�"��?��=�.� �O?��U�����<���<quuqqu���u�d��dV�Tqu���������"����w���+�������B�~�o�ftaz_��V�SR�t�9�K�x�x�:�K�t�p�;�V�w���x��������QM�M���t�����#���"��Y�(�)�������#�`�Q�x�g��i�hi��V�K�����������l��f��T����'F�b����(��-���]�������ݸ�u�W�h@JM;uT|NwbdghsK[b�e�i���(���{q�}P#�4%Sa��j�����_≖�����������`�/�7�b�b�/�6�a�a�.�;�c���}�}p�m�m�lj�i�0���+�.���1�0���.���{��������\�YY�F���C�?>�AD�$�(-�}}��}�[ׯ���M������g�Y�S��T�*�*���l�SmMrWJB`e��n�ū�)���c1&E,u|�����Ѱڡ�����X�MN��9* �T�(�T�3���3�T&����V��� ��]!zl�t��ahqr�p!s,��o�"pr�rg����l�!�������������������|���������������������N#��l�[he�e�e�����������zpK��^������7�L�w����}���� c�b��* �[��)F3�RtZ�>UK�L�L�����dl�lh]rd.�^�7|�}�}\".% _q�q�o�y��~yG�Ao��k�zAï��������w����P�W�����������~��|Ԫ����A�����y�o�q�q���0�[�������]y��Z�igmpg������ː�����t�@�6�)�H�����W�����������\!zk�t��aiqq�q s,��o�!qr�qh����k�!�������������������{����������������� ����N#��k�[ie�d�e�����������zpK��^������7�K�x����}���p ���� �� #`� R�N�{��M�{ ��xi�wi9�#G�s���������E�����}T������������l�+������{��X�|���������V������}������2��h��8p�ihE[��&�Yr!h�g���R��o��q���������-ε�ߝ�A������ ���U���Ǿ�����Ծ�*��������}�t�~�x�q��i#�E�3l�g�c��2�F�j`�\�Y�=�u���r�r�qrq�s$���>�tY~\w`r�k�2�Fclgglb�E�3�j�r`w\~Y�u<����r�q�q�q�rr%����t<�Y�\�_�j�F�2�b�f�m�1�F$�k�q�w�~�v}�����������$}���x������$�k�1�F�������E�2�j$��������t��}���������������������������������%��%����%��%��%�L�X�0���X�/�X�/�������T���T����T���T ���������&�O�,�-�O���O�,�-�O��jj��k��1�����'�� �'�-���4�n����O���x���q�i�ggg�h~ie$DN�y�W��������v�w���#1���rH�e�%����:qzt{s����������[����s�,�w���������!���w����"��"��0������t�dcubhg�c������8��cliccm�������������id��@dmh�o �id�0�B�cli�o �id���Bdlhccl���������id����@��Y3�W�,��zh�ehjwmy�xj�hhj� gk� ditiy�7�4�k�g���� }R�QP��t�����d�,�c��*�p�q�q`NAp@�`��J�Q���zH~GF�+�/�2������������rY�N�'K_IFF_��ʷ��зIL� ���P�&0������h�Fyz��y�\\�[� V��������_� �J�P����m�z� B��pg�fsvy|s�#L���������c�|������������gV�XTVtbe�wv�v�N�A(�$�h^~mo_��~���|z}y~x�|n�f�{D��BY�L�\�'� ��>mZR{Qss��t�N�]�wig�g�X��n��Ϥ��O�Tͮ����m��w������m��w������m��w�ŷ������ ��v�����|����iI�#&�bS�S�!�����������m����v�vu�� � �D�4P ��3i-k�b�US�T34��5�II�I��yq��߬���� )� � ))� 1�9�j���4��������:�P�*�������������C�3���������+�������K��}�������T��� ��-�M��u����jmatvhj_|[�t>4a@�kk[|^4<��N�����hc�_���/���2�2��ģ��֖k��E�b=0���/���Y������� �-�"�$�3Q��t�l�Z�[�Y�f�b�e���7�]X�U�nPI"�R�g��ɰ��e��������;��o[��1�Hw���T�� �T��g ����<��R���;JLwgV�VL�J� �B;����95 �4w�2 �������� �N:�9�����՛ͻ����ů��F��4�O �cb�c{������"犖����M��88�']L�����"/������f� ��UA�������=�0���;�}��������������Q�<�0�^�'�����0����ř����}�W�}�w}�;O�<�0��4 ���� �b���w�}�GU)@�'�eY(.E�������"E(�Y�"�+�G�}�v��|fW�}�x���?�r�?��Q��<����������ŕ��z�E�٘������+�0��@� �4��|��c��������������"��-d��c��|��.�4��4�|�q��\�N���E���E*�#�������"#*;QE�"� ���9�a�Rqs|ig�4���v��������ߟ� ��ތ[��l�i����f�����k�����8I����`�����Z���\�����u���ρ�6�ٿ�������<�������0�J���A�e���c�i�>����z�8���qF�l�;�7��M�t��H����������$��v�"�?-�=���x�G��n��������S�-���������u�������������������b��������7È������ A��������� ������w�c�������-������E��������f��7��-^���������D���Nf�������r������x����������������~�������5�8�������~�O������� �������K������������(JD;��;J��E��Y�Fk��T���«��F��Y�E�A���#� ��#�#� ��#�$� ��#�#� ��$���R+��7�TS+��V �T�}�y����� � ���` ���������$� ��#�#� ��$�#� ��#�#� ��#[�pdIH[<<H��I��Nm�}�!7�5������'m�w�S�@���T�|�z��J +���J +��r ������@� �� ��G���������������� �x ����)4RMD��DR��/��@�2o��[��ͻ���2��@�/�1��$�%&��%������%��1��: �ԩ ��R K��w{{w��w{�����������{wS��:: ��,�u ��R K����X �@l ���A+���? +��c ����������V���w ���)�/e�@�2oZI[BBI��Z�2e�@�/4�M��������1���%��%%���&�����1�Q� ���{�w��w{{wSw�{���������' ��1 ��� �����M+���L +��� �� ��G�@��X �@l �� �4 �������Y�X��y������y��X���O�:�>�+�N� � �����>t�:��O���O ����� ���%�%�����%�&�����$�'�����b��� ���%�%�����$�'�����#�(��� �����Gg4�(�K�� �K4�(�Gg.�S�1�>�P�;���;�>S�1.��� ���F��� �� ����ڨ�����z�z���'�.�<�!b�V��[�b�-�;�P���P�-�;�b�[�V��!��E�$��@��h���h� �?���� +�����Y�Z�<� [��� ����Z���Y���+�� �� �d ��������0d�A�1]ZInBBI��Z�1d�A�05�K��������.���$��$%���&���������T� `������X ��+����S �@g�T� �����T����������� ���B[PP�>P[����,�c��s��£�����,���P�� ����t� K���: ��y}���j K�y}}y�Ty}���� K��� K�����[�R +��X �@l �� ����9������t��������k�,�ccTsNNT��c�k�,�B�P��>ƻ����Pn���4R�T1 �T7����}�y��1 �T ��8 K� ��' �T1 �T�� ����@� ��{����X �@l �� �����o�0�v��@��0��<��;u�^'\� =*�S<�,cXP�*�������"����c`�[����h�3\�5��j�����j�5<��U�gF19P��R��E���i���j���+�#���h�d���$�є�������Z�ۯ��ӄ��h��w���*�K��� �(���Y&�Z�v�V�^�e�1�.j�4�E�9��"�"�о���������q�rQ)�`j�#�KE�[�|���z�0�Y�`�7�~����������?�g ��drlf.�������k���g�*��{W�r����r�Z^mwvl[�s� n���jb�gn�z��������h�y�l�qf�S���B�[�<� ��.S���������������h�t�v�i�����K���k��������Tp��x��vn�mn`�j������|��������k���f�Z_��Fn������������ʬ��Ҟ���gn�����|�rR�M��H�h,�Irqprg�^�s�A�M�/�)���8�[P�D��0nf� �iv�q���Xѵ�+��D�D� ��y�Znb��t�9�#��t��x�� �3���u�s{����q�[���Ƣ��᳚�s~N�\��� 0H���" H���" H���" H���" ��1 �� ��V��K�T����T�6� 64"� ��E�#��E� �E����������P�/"�@���Z�<��[�@�E� �E�E�#��[<:Z������� ���T���T��T��@�T��T�x �T�)������� ������9� __��&��X�.��$�� ����K��p_�A���;�__��9�~�������2��M���@�n�h� ���M*�� �TK�����MT�� ���@�n�h� ���M(���@�n�h� ���M P�� ��M@ �� �@�� ����i ����������@ ��T��T��&�D�Nu�y�e��� �}������������ ��� �V�ҽ� �T��}�� �l�j�l�l���R� �� ��~u�fH�7�Nuu�������a���������������a�������uuT�A�Mr�\J�C���+1 �7����}�yy}}yy�}�����K��}�yy}}y���+ , @�j� ����������v��������j�I�I�J�#� �%B��z��Ϝԝ����̒�����<�L����Ro�s���x�z��c������������������������������e�%�k�������������������$�l�d!�������|�{�{�t�u�v���������\�������| ��k�����~��}���l�r�����>�+�+������������������6�Y�����F�$�&�E��{��Y�I�v�['?E�������l�j�o�~����� ��(�9��� ��������������������0�tX �@] �T�������������� �� ����� ����������������+����������X �T] ����S �Tg�TZ ���c ��������k~~w�~��}�}�}�}~~w�~��&�&~������}�}�}�}~������&�&�����~�}�}�}�}�����~�&�&�~�w~~�}�}�}�}�~�w~~�k������������=��=�=�=�=��&�&� �=�=�=�=� �&�&��=�=�=�=��&�&��=�=�=�=��&�&�}������������ ����"����"�4��� 0����_�}�2�/���b�����w�������_�1*���S����@���H2sp�o��ȫg� �����������z������z���������9A����{�e�z�p�{{hh{z�q�z��@�e�z���������������@���z������z���������'���L�`�F�F�=1<1�#�W�X� ����]�vv����L;�3lK@+�@L�V��� +�<������q�U�]�%��F���������O�^��e�PV���n�`�r�'s���y�sfX\Rq8dsض��������������s�F�%����Kٮ������J�}�3����������х�b�s�lt�[�`T��������v�uai4�.�:�e��?�2��%��ٰۂ�~�%~��GbRSl��g}^�`�s�t�`�an좾]�4�jމ�Q@���.���&�%�����&�%�����&�%�����&�%����� �Y��J� ������I�������8�/����������-�p����R��%�s�z�w�8�����&����%����Bpq2z�r%�����!�����!��2.�l�?A�����R������Ί�t�,�����ә��$j�"u/}s-����|�Z�H����8����� �� �� �H�.�w���_�������������pu�j}���$�x�������������l��l����`��?^���� �l�2�B�A�A��q�3�l����۴����l���8��o�km��YQ�SBjt��v�m��l� �.�����ڎ\K��H�qX �@l �� �)����u��A��p�6������w�Y������l4����~�y������U������������������ѯ������W�?Q���Y�m}�ptjh���������F��E������Px3|�����(���/�ŏ�4��5��&ϻ��ą���f�am����J�?�j�ԋ�<�#�>��n����,�����i�I�Ι������J�\�D��Hհ���4����.���4��g��"]vzuyia=sA|M5#M�o�`Ba,����l���#��:��P�hC�t���"���]у��������H���������������ą�����������3��B��̖ڒ���������/���q��u�=��hU��U�v��@i�����/�� :�:��hU��������yr�w�>�g���g��j�k>��p���D���L���U���x�z�����x�z�����x�z�����x�z��������[�a�����������7���������M��z���R��?�ݙo����b�����4�~�{z����+�4�+�4�+�4�+�4�+��� ����T���@ � � � � ( � � � � �� `� @��{���������3 ��� �@< ��A ��������P������� �������� �������� �P������� ��P���� � �x �7ޜr�8{��M���1���1��M�����ז��@�;��N�����y�y�d�my�N!�4���p<%�����0���d����*�TK���j��j��T�*6�L�d�������0%��p�b�;�4�N�m�d�ylym�c�z�N �;j|@�������������1���1���8�r��z�;j�N mz�c�m�m�����N�T�4o;�b�����0���d��SL�6�����j�c�j���K��S��d�������0�<��o�T�4�N!�y��������m��N�� ��]��]���z������Ϟ�Ҟ������ԝ�������x��x����y����5��_��_��_�Y����t� ~�r�l�3�/����������������r5�l�3�/������� ��� ��H���r�����vZ�j�G� ��?��C������-��������T%����%��\:�R�R:�R��_�D���D�D���D�D���D�D���D����?�)���|�8��oC��A�� �/��-���$��"�,�B�5��|6���-�G�c�K�dԛӘ�� �p����y��|���|u~w�'��~rb<!��ێ��j������w�w�s{��z���}qr^r}d�0�Gة蘵�и۩��r�~�v���~�������������w�v�y�������������y�7�-�8�����<�ÖC�K�l��w�x�x�w�x�w�������������|�l�t{u{�l�t�t��������{���������h�h�[�sgsh�Z�s�r�����| �9�q�Y�fqgq�X�f�|�f��������r�!����|��b�R�$�������I��=�X�,���3�|�Mq&�h�8 �?�4��ye�R�R�Y��Ni�ꏏ�������]ȵ�9ЉОȶ�%�[/�+���(y�f�qypx�f�p�p��������y��|�3����u�u�u�}u�u�t�}����������H��q�q�q�zq�p�q�z���������,�N\u�\�gugu[�f�g�������v��~�$��x�x�w�w�w�x�~���������S��w�b�nvmv�b�m�m��������w���������������p�@�� ����� ��� ��#'+/2<@EJOcgkoz�����������BFJNRY^ly����������������.9��������&.9=AFMQZbfmsw{����9BJNRY^u������-z������������<MU[agos�������"29@EN^px~�� V Z _ � � � � � � � / > F o � � � � � � � � �&,@es{������������� -:KUcglu|������ / O V Z ` j o u { � � � � � &Dbs~����������������-18>EKOTm�������������� ).7<DQYns��������������%:@Ui{���������������"',1CUZl~�������������$(-2BHP`gku{������������������$,2APWZ_drw}���������������+8EOU[binty~�������������� $).38CNY_doz��������� �<���<C KFKk�r =oYB;� ��E�#��E� �E����������P�/"� �@�Z�<��[� �E� �E�E�#��[<:Z���@��� ���T���T��T�� �T��T�x��T���������B�t) � P �����t�* �i�@���E���X��X��E���+y}}yK�� �. +��E���X��X��E���P� � + . ' �3���3y]����hnnh�}�y���]�]�����]�]���s4� .\��2��A y}�B , F�TkB��B��a �U�) y}}yKy}����������}y�TN%� ��=hnnh�hn���q�F A[ ���]�]��E �����}�t����� �� �"�������������"� �� ���M - \ � �� ���������������1��<�0 �0 +������ ������������ ����������f�f� ��}yf_��"- .hnnh�Cp �}�y�T( ���-�V�`��C�3�}�y�Ty}}y�T� c ���|�zS �+o �+� ��D+\�T2�TA ���������� ʆ��iimdod���������$��@�~� K������z�&�w{�y�yw��}|� |�}���x�z�{�wa&z��������K������������$|��'��������������[�����[�!���!������oZ�S1��� 0 [��R ��Y�W�f�fG �f�fU��� ] �@gw �TH U � 3CC3X K] +> ��T�Y �����[�R�Dh���1� ��T��T�T��G�������_�^�X*�D�4� �4D�*�Y�_�`t��������W ����!� �'��''��e ������ � �T�T� � �T�T� �i ��h���h� ��� � O g �B �4�T�T��=�T�T� y�}��7�!�x�!hD�: �,����� �J�����J�4�� ����������F��/�B�������� NPuc]�T<�O��d� }�}�|�1B&�2�B���� :����5 ��/���%�%��� YY������������� �( �f�f�����������9�>�!���� � �>��9��U��G� ��@���V``V}�~���d�3�f�T�w�@�t�(�s�u�w�N�5~��w�}�+�}����PV� ������{z�g �����: �T� �TR �]�Ky}��Hg �TB �4�$�$���G ��U���$�$� V``VV`����� `V����!�_��I�b� \�;COLD|yz|�r����u��{������������A��0����������%�����{[�k������@�hhn��z|������r������4��~������~�4`_��`R�`e9C/R&a���Ҧ�4��A�'�"�)����~�4���U�f�f� ,u !55!= �= ����������T- �/�T��� ����� �{�z���G�C���C�8�=<�<�8��C���G�C��������� �VV�����z�|�Y���Y�.�:�t��:���} ���&&��T�O �'��Lf��eN�z�y�z����#� u��"������������=�1�?�u����f�f� YY���� ��Y��f�f���� ������&��������/����]�]������1����a}�. �M�M���Y����;���/����������������������a�3����:��������t�������@y ������t���������� g�Z !�5� ��\�|�\�?�Z���E�ԅ���c��*y^H�(�ym�|�[��n ��U ��t�3 �������Z�Z�r���EQQEEQ��c '>� �0 �4Z V``V� ���������~���� �����������������������z�z����3�'�)������������ �����{z�4��� �+�<���<�<���<�{�������.�=�= C �9�"��T�M�5�Ř��������{��~~�D�;��i� �f�fW4��x �!�x�!�Q�E� ���8� ���8� ���8� ����x � ���i���� �������� ���������������� �tkR��E�;V``V��< ��A 5 ��/� R��T�& � �� + , 3� ��� ���O�> ��������z�r��^�`�������`���^?*<�씒������<�Jڔ���>��������@( ��� �St ���}�� ����� ��� X �@] ���- ��� ���� ������}y�yr�rrr�yy� ��( ���y�y��~�w�~~���������� ��������������������[ � ���t����������t���|�z�@( �Tz�|���}D}��}������������������RD��,�l"�7o�''��$�{��������������������������1���D � ������� ����!K�� ��z{�����8���T���(�A�(�A�(�A��m����t��������K��x�x�t�w�����~��̍�����������t|~�}�:����@�w�{�t�s�o�yx~����������R��1 ��7�OI�I��gX�!�!�gX���g��!�fz���\�J�$�9������:�l�A~�w�]]�w�~���z�� � m�m))m�m�)������{G �YU3- t������a �h����N�0����������K�m�� +�� �)vP �\�� ��t�4���4� � � ��< �A ��� ,,� � ,� � �� � �,� T ��� �b �< �TA ����F ���}t����.�+ݭ�����������������{����`�T�3���3�����V��@� ���t����k�r�crr������@� > ��xy�o�ts��{�SK( ���� ���������tp� �����y�y����: �������7�D�$�$�D��������������nh&�T* �����5������������������@��$����$@!��quuqqu���;���;��uqf��� K< �����p������� � ������QEt�����'�rrc�r�2 ������TSTdJ,]��շ����49��arwwvyr�/��������(DB%$�A���Ό������% ����`���u�ttu~w�c��cl��������q�t��������=�h�F��� B�4������4����� �� ����V s���V�������E�z�*�6�z�*E!�!�$��D�D�$� ����7�T���- R ���� �5 ���y�y��C �. ���@�h����������<���<�<���<����o7��������T�T�_���L��d��h�aahi`a�h��������� �/ti �V���H������ ��ԫ���ԫ�� �� ��]�������������T�t���.�;���;��<:�Z�����:����3}|������A���P 3C��ɽ������Nb�a�]���� 0�$�7o"�7�l����� ������������ �� @��� �����������������<�<��y}|z��i �z�{�R�D3���$�$D�R����i�p���������w�������� ���� E�Q��y�� ��� ���1� 0 �� fM�@� jm��q�����������,�4[� ���@XtxmihbW_)�RK( t����:���z�{���������z}R��%���7��tC ( �t� ���z�x ����x � !5������x ����&�%y}��������_g��������g_�� ���� ��*1���0���˒�����������h����� ��`V������m�����������[ ˋˋˋˋˋ�7���ߋ�7������� K��������[���L����z����������- �-��������������������Ty�������!�5�����z��+���&m���/�%��t��~���-���������\�$�"�W�T�*��������n�h�t��t��t���v��������������#�#�� �� ��h��3��3s�pyrs@ �� "" ���x@8 �����!"""`���>�N�^�f�i�n�~��������������'�(�.�>�N�^�n�~��������������>�N�^�n�~������������ �����!"""`���!�@�P�`�g�j�p�������������� �(�)�0�@�P�`�p��������������!�@�P�`�p��������������\�Q�A�0��ޕ�R ��������������������������������������v^��%|�_<��O<0�1h����� � ���� ��p��v�_�]�����y�n�����2��@����������������z�����Z@�5�5 ���ZZ����@���������,_���@��������f���@ ��@��(������@�����@��@- �M�M�-� �M�M�����@�����@@� �-������b���� ��� ����5�-�8�����@�D@���,*@� ��������� m��)@�@ ' D9��>dU*# � �� ����R �@ e� %RE $�� k(��D�' �� �%�� �% �� ��0$�.�$P�//:/K/Q]� ��� ^� U k "y U $� U �� a y *� <�Copyright Dave Gandy 2016. All rights reserved.FontAwesomeFONTLAB:OTFEXPORTVersion 4.7.0 2016Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeDave Gandyhttp://fontawesome.iohttp://fontawesome.io/license/Copyright Dave Gandy 2016. All rights reserved.FontAwesomeRegularFONTLAB:OTFEXPORTVersion 4.7.0 2016Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeDave Gandyhttp://fontawesome.iohttp://fontawesome.io/license/PKAA#]��Uh-h-4system/helix3/assets/fonts/fontawesome-webfont.woff2nu�[���wOF2-h ��-�?FFTM `�r ��(��X6$�p� ��u[R rGa���*� �'�=�:�&��=r�* ��]t�E�n�������1F��@���|��f�m�`�$ؑ�@d[BQ$([U<+(��@P�5�`���>�P;�(��1��l�hԨ��)��Yy��Ji�����|%ہ�^�G��3�n���ڕ� �͐D��p\Yr �L�P���t�)����6R�^"SL~�YR�CXR �4���F�y\[��7n��|s໌q�M��%K�.ۺ,����L�t�'���M,c��+b��ׇ�O�s�^�$���z.�mŠ�h&gb���v���'�6�:����s�m�b�1بm0"ǂ��*V����c�$,0ATPT�1��<�;���`�'�H?�sΩ:�ND����I�$�T�[��b4�����,�μ�」bl6��IL�i}ی&�4�m,'���#�ץ�Rw�bu��,K����v��m_-���\H����HH������?���m�9P���)9�J��$ƽ����8������~�;�r�n�=$��Nddn!'����;��8��'�N��!-Jʶ�.����X�=,��"`:�� {�����K!'��-FH�� �#$~�Z_����N5VU8Fȯ��%P�ݫ���Cp$Q�����r��ʽ��k�k��3ٷ�:R%��2{�ީ��h%�)8���� ILK�6v�#��,;Ц6��N�2�hv�����OO��t#��xT��Bf���q^#����?{�5b�I��%-WZ��b�A�^�1��n5���צNQ�Y'�������S��!t" `b3�%���35��fv;����lά�9�:jgf?gr��p�x� �|� $ e��Z(�$w(ZrS��v+�Z���q�M������ݙm?&s[��t�S�Sj��9���?�|�� ���>G�,bDշ^��^���:l�3��NA�`�5�26�L�pS� Aߧ/U� �֘����'9\��Նt���!������l� PMR���9n� �`(�@� Hy)M�dM� �5�ԤH'ґ��mS<���q&k�)\�{;�1��m��8�{��X�1�-3ǚ��)�B(��,�%���������w�o~��t��HW8l��Z r��=e���1+�/Ɏ1W?ְr�89PL��>uo9 �1 tØ��uc�����@��]KR�bN���v������(�"��y뽻{c�����scz�&�p5���,j�n �kN�!�.�n^��Uu@|�?v�>�����rUa�HR ����Ց��I D��ˋQ��~p� �܍;;�n���L$�t� : hFCY���TO�FNN~}�1"`�����a��(�?H ����\���u�0LԵ��'���͔PbnmO������Jl�?��s���0,8�x�B�B��F��_�RiZ����~e#j��w�hOc*&F6�Yq��{�}?��>�u��.�4�h%g�`�&�� ��)��R5�H�}���ˤ�kܩ��'J��O�I����_��qOb'�HǟBYEM�6�v��5�NJ �O�NFNx(1�:\�߫C�k�c�b8Q� d�[L(el+2u-��a֘d��5;�N$�"�H���SF�o�2i�"��\�h7I���<SCO���ȐH��Ew!.��!BSC�gĝ�c���s*էs�(5m�=q�ʊe���Y�$�\>fN8�q��x�#v �6um� ���`�NM-J\�F��r�D��Z�0�#'ꥈn��GjL�چXʌ�A���gYs�*�Y���^ٵ�;"�$hb=�ϛ�0�vH<�Vv�c�_\Y���w;dB��N��3!$������I|P� ~&�d�.��-a�a ++��9�.mR��4�cy���#�U��FW�u� � i/f~�4��l��XS�9Ä�1E��3@���k��@'#���c���n� ���S_;�%��I��+��.�L�Cx�����ꆱw ��Vۂ������Exf~H`��0�!d��@Q{Oh1��H��Fë�zs�7�݉��Ɯtrv���k���heS3�ۇv�9�q|�O��K)�U\�A�%����o{l<��K����͎���i���H�G�I�z�=6�WWo0��|�%A�jdD)! ��pw���_���;���c�D#�ˁM���Nz���p�^�CDx��xj)�5O�9� �`��EDX�x� ݒGU��˯ę����ډ�.% ���Έ�~��=�Co�) F�7���$Z��(�g��oB�� �Ɯ�@��&���e�{��厣�l��f�_�Rx�N[�]��8`-3�s����{Pj��Wuc9���[>�-�.D�Y����d������+^{���C��m����,��@N<������.��V��M��S�+�\D�+��R�|�6��'q\T�����9�D�X<$�p���"�酦��$�ҷ�,�p�s��T����b���NkI�_�`�� F��W��V��%��w�~���DԐ����*�xi��y[rZ���[S%�G��s`F<ㅣ��� ��V�+��!+������؍�9y�k�fb�82�s�}l;[)e$��T���k����)�v���9����{�u�u�t��@E��>|C��<\4%�Rv���������@C�8\��~)#k|��.a�o����00G�q0%����hp��� L���"�+>���%�^Mˊ�N�s��q��=�����䦆�K4r�-*��%��h#�%;pP馔h�C=���� ��&)�ba��KL�@����t�!�~2�S]rYl�Z6�3ўJ�o��O�V�;�h&gO5�RT�/}����{���AZ�&�S���t����ͯ�P��C���0��D,�pbpз�z)� ]�I�>Q\Bl�"��^3R>r�*��C>����xPU�z�}Y=�̕�}�ж�� � 6-`/"H o�&�D�I0�E2Xa��-�{5���< ,}��``6����ji���im<UujY�Z�jB\@�g�3Ejfp����:����W�Ǯ���߳����p�ij3ao���1�da�� ��ݫ����J�ײ? j�q7��M���ff�Y�f��s�$�� ��H���l��������(%.�r��w?�m=~�y�cY�bg)<�W� /Vx�k���$��B�r~����9�6�0�&��_vMY�%��ҝ{�E�6<������%�%�4���ߠO�@��N����"Z��OD{u3S��W�M��R��3s<���س ����\I0��.��-2ݭ��ㄭ;� �0��}N�/b���N{�I��|b_r�e��_pSi���>'�w�5��RF,ч�%SY����Wh�6L_i샣=���i1�3�YI7N�Cp�I��Ĕ��(�r���0��{j����r�K����Тo)l���3na�T1\��IE(�m����߃���D�l��e����$Å�wX���U��(@����M�a"n�,�*vG���̨x���>�G�S����g�̉"�Q�v�b0*z��PE�y�ɉ�?7�$����%��G����p�dY�&f�!��a6��|�)�;u7#�3�4�mJij� o���O�p�ȁ�v8j��x(K�/Z�d���x�Ń�m7V�_\�f�L�7p�X�z�H7�-���,(1KHb�e��,r-��p�L����3=�T��2�t�2ټX�k:����Z�5��s�p��SsT����:.]��D"�@��-�E�̑!�A��2�ɶ-�F}�˒�2Bǃ��Q���)t�ç|�#4�|�\�㨀��`�fc,��#�g��1:�-����ty �]�����2�Z~��.)�����nj�����%R�K����(y�`�8��C��֍���z���K-N����`^+����n���3��ϴ����T��3�tQ�أ�4<>:J0È%�ݑZab`��vͬ��a�T/Z��aޝ�ГIi �W1���_��>)���H"�����p���|7mF�^Z��~f�0J��^�I��3V�!���{�<e�/=�p`���q��8^����K8��O�9�w0��Z��|��v?�n� �3��f�!��߷�~��T� ������ Jӛ����5��p���V ��3�˫����.=����-}��[�g�R�5���n�B8���3.��8 Yg�#0�&���S�/.fg\ E�f�}��,k����g��$�?XY�*������1��p��E(����RS��Q��t��6,�Q�j\��</]N�s���;�'HX]�E�29��d�kY� �j���R6���Q!���� V��� %"^�`�N3O�����[�v:�ʄ:��^ڜr�@��� �F�_���Nc�B���8p�\i����7��g�*���,�C����[�6�T�?����%�z��@jApBN5�"4T����"�}0uJ�Ȝ~3���{}uW����M�j�9�-�]����'lS� /�R><�+�O����eB#�Bc���jL\��-�Zh�[�I<����q�v�~�k]�G���TD�?S����/�-��%ݒ����7��w�i|C�I��q�wc��W�x�� �/7�x��HO/���o]���G]�y�߃��#��7��b��$�t��R�$ ���]�a7�F�Ѯ���,n!r��I|2���8�x�6�gS�h� ��R^^�D.�x�M�MS?漞'G�#�~�+�����v4�d!FyT�9�-�fVa7h�B��4�����,�2�Ɖ�&vTHMqp�4?R\�����Xa<��4�@Mi�H�D_�� �Eg��R�y�M���lT�ؠJݮ ��yc��"�HJ�, 6�u�/ڴ��������y��V���nJn۟H\P�R�Bd|�4�_�$k����.��w��I�pS��$��|}j���9������m�|�1�ߘ����n�93�9���5qS�|���xW�9�����B��VZ!����m�K/�Ln;i��u��$�*�t3�Ͷ��@}���B{�Y���ԑ�z�2J�u@�a�\M���R7o��dz����e��7�/$4]^���2k�h$�=%��1�I�B� ��H|�N.[�M\L���b����1Mg��:�NV._0�,�+�,��h�t7�l8�s~IV^ N�˼M���ؑj��ك-� oܮůQ�o[m��j�=r��m>�~z4$M��}z �s�h""���u7�V{Rûݦ�O-��D9V�٥g�IʎK�Lg۶B�T��P�'�K��̦� qW�֒�3e����p�&���ے��L�hp����N�aS��w�� &���;e(�,-7v�x�-��w$W��nX�U��������t8�����Y���?KM�ct�Y�p*Շ�����-���БfL�|�[nL�� }4�{5�頠�3�n���$$,+�DNԄ-H�V>��H����Os\���-�;�W6N��M��8��Fi���;���7k�2�6%֒�a],:!�ʲڽE,��{U��naw����Ng��.��I9r:j������<IE�1�`$`Lbrǒ��ם��]�x�9=Rv&*Q5�0z��y<���`M|�ԙ�dO�٥iZ���$���+#KH�F �������� ������)- �:M$�yc��E�%Ai��2]���l嶨����8�I�y��ZGJ����\�2֙Xb�L���I�A-�GrR!�0���L+�Qh�S�Y����S�5�_�(�poF��T���#kN۾�l|r�n�d�H���yۊ����&ۆx�p�����[�8G���dt�����z찃٦ 8��B��KP"@2e�e��y�x��j����JKh�XŬB�}��6�â��`?�i�*�[9e+b�VL�aL͙����dBYp.�ψ �n\4�糅Ƥ���d�<w��W"��? �'�O%�a2N�9��,�ߟ���!���.�y�Z��%�4�U�^��u�φ�g�)M%��C��V����M!z�&�����|D�,�i�~R,%��|O"�����h\3+��a����������i8��\$!1�L��a6s� z+M�R�b��_ k�v�j���U��裒-��jX�Gt������b�~�˚��ꖺwt���͝�SkP�2���(=cvt�"�[3��&��h�DN�=�Pɛ�A�G���'_�R#��M:.���3� ���tJ~��3zwx ���;�7��O�8��Y) �DSE����/����7�i��!wy�6��$��8E0�Taތ�|@� g����.;m���9�9�s�HrL7&�����3Bs�|[o&ou�Sg�խ�+{�AE���kZ� �"N�d�5��:��IV��ڊ�>�F�b�K��Ψf)*c��G5<��C����.g�]��k�� ��� A0�-��٣��v�T �d4K(��Yq`���(u��{,�:0*$|2����/I��,�`E�����xP��#q�����`��/�:�����';�ىV�D)˴�r��89�w�}[��F����ޜη���+��h�KH�\�ǚU���䬂J�V$pUj�|c0���{���L��A��?�V�=�4���S�Ŵt`���d���o��d�bUP���J�x�g��JR�r�O���s �����4Mw��� �""�42����`M��D�/N!��v�3չ���.�f+�@xO�V�q�j^�Cߪ�Km���,�8H9�Z��<&�o��(�@��k����M5����]�M��U2=vpB6DXj`�r��<�w��1�Y�:� �o�<�9�;����F���$;2֜�j����x,�ʁ�C�Rĉt��$�VJf�f��9�)�a�9P��&���6Oo��l�<������ds=#3�s��P-�bD��"��[:�wɺ^j��Ӂ��Qej`���Tq�=����H&�o��kĉLD�W�O������*J3s[�6�j1�@��nr<�ξۇ�#���@ �0��c ���?ﵝ<2�D�Ӧ ��}��Ts��S��"�R� ���.}�oZ���Fo*���ݗ������:�������7��H��䍚�x��]���a6v5�R��̾e1��$XL���� J�aa�݆,��섐�"3-�G�!˥8���8 |�T:S�P������pMR�Y�b��{�+�O�eۛ2���g���u��V=�U>-�kb6U���ЩpZ�M��O�`���$W�D�y���A�[�4��a��J?�fD?=�d��(KD䴱:�D�/[�#��$A�#KH.:��x?%��V�r�@[B$�}�c�o��S6`LPfM&ɔ��A<:��v��Ú Q�~P�w���[��+�������`+j� V��+��R*���u�l!���|�+'�KY�6�6��_�ud�}_���[�yuۘ�j����o$��Y=�yjR�i)��b�ԋLaD(�X�U�wI�ڻZ�$�7ڻ�9��&��4Z���'��DF���[N]�~�dD?V�Q�W��Ͳ�}vS>�Nm���+S�q�H��a���U!�Β����Wb_+�����U�O]�^���l59 @��1�'���A�^��m����o�:��9�ף�s�-�N:���tD-�zkS��j�a4�rc�zF�ۻ �x��v��7[�äC8�#7�p5�+��� �~*�bJJY�zֳw+�����-��p�/L�L[cg���n�lc��a�P����H�F����$}�9`������\ ��83�Ym�1b>�~ƽJ���Ϗ�yBs="�����f�(zK��M�"�H`��w�c�Ed��:b8�6(9��<��c�l�ݘ/���k��g�G���������^ESE)5�G�_^��k߇�v���̚�}T3�;6� WvTCP_���k���._e��єNJ�L{T�!��6�j>h��0��#���[��㗚����K��z�,�!�3���2����:6d>�himE�\�=�H��Z+{6��@W�ʯ&lC'�,��rX !8�(\�̭2�-�P8h��@�C4��<~����Z7j%)e����eF�pZ�'15��^6B���3�nc�o#~���²q��R�@!ա�� z�^�Ks]T�@�TN�T �,S*@7��C���ī�Ʌ����L��iQ�N�,�� #:��RѪ���j��9��1�-�Y��P�N¿�\&�yL8�ӹ��&0�c��v�Ɖ\�����J�A��;��Q;�]���I�M8 �s���Mf�?�I��r�r!�K�9я8p�}Q�콍��g�-�*sm�~�X�P0d�M^��?D�dI�m<��p;�y�,"ۦ�6��v�pT\^�n���3m�>8�eC���N}����cà�٭$s7ۼ��#յ<SF-A����z��≱� �B� *{�6cg���Tz�GX2+�����a��0����;� �EEaG�d�Θ�[�M��� �i���g��:B�[� U���3�J9� 0��I�2' o����\e�%4^5}����5��� �0=� ��J�}m�y�&����"��.cւ V��}e�J���:42q`G�O�-���-B���J�F��Y�۾�3|��|)��������IG��a����+�*��ttPb��A�Do?C��g�t��;��I�]G��2RE<^�mK3����+��;� �[���3���[1����y�v��� #��p�<j�iC�af�~\�G�C�4���dubt B�K��бQm�=�a���Tq<��^z�ء�(��G~QۼZoO��c��r>R�{b��4���vM�q���l)<�V�{ě晐�2P��T�'D� Vt�������oP�aU���6`���"�Qe�]ka-�^<xj�<�G.���~��������5۹�ۯ]�V��`8Ϧ����%���r�y�v����;��pc���������`�٘�uҙ��9q��q�E���ҹ���B�����6�Ǒa�e��E�ثO�Y���Ǒ#:y�p���/!/��5s���U'! ��"|���B㡪� �t\�T#���ҝM�$+2n_��� ���b���^�&��������e��i��c�I�=��u%E���ȭ�֓ ���fj�aظ����E�ӝ��_�e���(r}�mo9��UP6zH$g�4�ٺ6�P�@@�X (1�Θ��x_ Jy�{�3���',����M�1n���>v�O��ճ����j���ְr�1�f4cs�_%v%l��K�ZNi�+V��3�'�����~��N�M�G@H��B�b+���v�VFq@�ݱuKZ�h�p@��E0�����ua����SXd��U���K}ԯ�8G�X�KiI���%���uR)�E��I-�ږ8��|1��G�Ξ��f6�Ȁ�=!K�F6�Qf[X���~��_��j�\^�͋^k����`����D��s�G]~�㤛yo�}��;+i%�N}�Q��0��ԥ�U��u)M��[�Z`"�7 ��?/[C�{�l�)�$Mr����|^�� a�����:���"�֊��a �l�>�h��y��a��{�2>��CP����L� �j?�ntg���]��S����{�UӇ�('��b�'f��g0Ӄ����LPA�Mtd�)�2ú�Y!�v�&`o���2P[�aޔ��5��S�|#+��7J�� #ȸ�_��dU��6#VD����B"K���|�����)o���tk�l���,��l���U�)ݹe�5�<A��\0��_�7���^~{�$ qR�ΰf���P a!f���XU���hX�l۽^��:(�m�?��@=bhg��O͖{-�i�:�'�A�8?g��zHFz0�[D#�A�.��%'��w�=23�ɸ��Z'�Hx�����&I��4�1I�Ji����e�z����͏��o�ٴ��{�����i�ß8 0[�K�/�n*�a5���ᰉ�,c������+��A��BDrlDo���"$Th�T����9�$�岣�'���0V�'|�"������ ���S�AJ!�Տߑ�6�F6R\�6\��9�-�_=��Q�"9IW.\.zmkz�F͵U�x<9��ɑ�$�7i�FS����ʧb߂@�ۨ�}��u��o���Ͼ��Ѫj�4=���oeUK�xd�W�뻸1nD�X���y�"���5倘�ʂ����K�����-�o7B"��ě)��uW��E�h9��b)P�%.�$�G��(@(��u��R��fLT ϪJ6 ���)H*y����=���Q/����uI.��<���,��r#�y|�l�<`��Q��=���F$��A�t阍2��d6c��Wǥ䇣4~�%�vb�a�Е_Cծ�Y�l�̨�vq��s$m:�G���\�W[����C �l��}�R�^�2J�I6�X�l9��=��`t�ӑ�/���P��jes"��_� L��w�m��~��X���N�M�1x���ٛ#��NmzS�%b��,���Ž�~�B�� `�9�Vu6U�}ֺG��u�n�wO�����fsC�\������g�������V��Φ��@����:�_`c+}�L�<�[��#U��*|�歺[��[姙�ԧo��ɼ��\=GR�K,![<��H�?��;�9���:��Iͣ+��a���!���*��?#�'G��=���Q6�,�g�m&;���������X故0�� �������;qW�q�'�4��I�C�g���Y�`�~`6ix0OG�g`���[~��?NC�Q@�Ȅ6�N���A}j��Ba�3�ť)���˴:q�I���gZ�2�vlf,�У��Y��Ѯ��bԩ����Xo�Iė˜�X���_'���5��]J���2P�92��C͉���@�C�����6E�e�B@���A�9�߇���Ǵ�y]�H� �-� �b��9 ��O�0uw��I���7J�x�ū2��\�Vf=nV�V����"#9���v8x ��mpAh���y�3��pQ %��t^��� |�]�YB8jCn�#&�ɇ��ʴv�˒P�>�O�������y�UAt2�_�������n53e*��1���v����(K_H�vV�ʉ3},��A�C�Uƍ�Cu���t��i�-]�`�����7�]R� !zs�N��t���&��̉̄k)��SL����̹�y7��$��ϥDJ�N�d��"��9� �31 I��Z(^( lw6 /�@�Y�B�^���}�OT~9c�c��]���{�)��}�D8�${����yc�,ʤ�{�tA�W3zHI��m��D�4ܤU��T3d�I���D�) ��I۬�.d�~�[-�K�^2�Zc�� �8��u�,Y�^\�_��ԁ�_�+�cJ��$�\2:ZW��b�B��w=��[1'N�YVz4�;��(�fzN���U��f(p֙�!x�#����L�=#ŋT�hn�b��a˳"��,�T�\o�!��@@sN%��| ���t��Xj� j�� �Qo5��������o�eF)o�� �9˷�:�h*'cJ�孏��[��{ȄNf�nz�]8F�/�|��1�v��g@�J:�Y��նNu�:�d��hH���o ����t�M��`��R̍�R�i�:|N�_P"����B@���� m`a����:M��� c2�Ũ<���ؓ��U�O�S�\��%a\A�p���ꄯ�e�\��A�����.̰{���w�ǿ~<dXIh��RN�gkv��o�{n�Ԝ�}���H|e�iV�W����?��#�(K:��m`�&�L�x^F��+'�����Z慉��ŏ1?^�E�(�ݝ�D��u��6��T��LS��6O�am��d�ʙy�2���|�^�S�K�}*�2L/Ř)�h~����\1�� D�̅���$��1�G/Εo��0^����_|q,��|��`�ܷ*z�|���'�usv�j(q�R��zL>��6������ �;s2�ŋ`���W�`�TyP�g�ee0����00�}/ǔ��;h[tG�D�5�^E��#�h�ȍ:f? �u3z0�ڎ�$�T���^T�Ahz� �x �I{��5�������'�r��K ��z�o l֢<���Nl���f��M*�~�Uʏ�W��_�?�v;(A���ͺ�R�^� 3�=6�6=2�n�~}c���O7�X���d��J�|��LP�ޝ~ͅ���8�+QD���\���ҭíS�\�=�U�v� M䅚c"a��K;�A�=ԨĚ����k�J�N�p��M%AR`�و;�(���5�W���=���Y �g-�^v4��X�ى��J�@��=�c�3���}�*)u���b�T�F�'�|�N3����E����9��ڪ)1��!G���k8��6�D� ~H���Gp�%�Fz3�2��M�J�aZ��?�c��n0�)?�h�N��u�����m3H�~����1rD�'����1������Kr�t�sJ�Js������ָU�����2��r^�+hNzg��l0'\/e��tXԐ�v�l �j�cm}!Q�ϼ��t#��z��#]����ϕ��O��ׇjE�:�# �6�n:<�N���u�i�����{�z���1ʞ����UV��l�+�a�N��W���h��)O�2ymEl٤�A��7���YQp���fB��<8����;����'gKR5n�����T@ �n�*��!=a5��������Z~CW��P^DX-Xf�j�N�ű�q4�O�I@��S����}�Xh/�>�,b����89����-:G|W��)��b��A��5G��<*ٕ��:ğ�!]gj~�O�&��U�N뢹8�� ����g�]-WW(W�NI�3��N��gr�3|��m �m��'=[n�M,?�$��HD��D�-��O?5uX�]˓��3�7�>�*�w�g?���*!��JyT�@U�g��z��I��_��7�&�\t��H.Y�Z�(4Y'�d��T� �F��s�-�qy�a�7� [��67K&�J�/$�c/��x���[���ᶏ;�Ī�z1Fv��]G�'ڏ�Q�BSO�������І$�y�(��TS��-;�hűz��T��%D��ts��"��=�gwU�uD?b�$Zr�9�G���<��&�Ña<�v5��0�]f%S��an*���؊���oмb���8pJ9����⠚�'�-s�@�r��넅��T���AX��I�\8m]{�Of�`#��X�T^f�5��''������W�2Ϸ v�sE�\��Qs��(�ː@A�jR*Z���a��̳�Slі�R�[�ܜd�*)�ɩ���P�¢ĽHt�o��5��8��.��]�h�\s�І؋����?�Vs���h-U�'�#E�g�m]��2NjWl�rm�Z������#2�BE75^^��a4��wU��K�'g?ge���213����Ǹ�o`��lKzP6^� �$�$9N���Wvg2�HϏ���CR�ߜa7F�/��3�\8���F�\�/zP��/?������{x��Ӽ�]�������/�^9�@7c�ޥG<Ho~�F��!�6�:�j�*��Nb�lNy����C�cG��d2[d7�W4]� �5�4i�2���*��h��p�*�9���mYmط��kh"ɋŊ�W�!��A�an��J�|�V�N�c|�u���j+�'���7������('tcnV��d�Uc���)�I╵��8()�K�Ζ9�U'���պ�j��?Vפ@B�O�E�G ,�cC�"Q[b�$�9td҆�=��X� �dL���M���͋��h��~���l�c�.��ж�t�q�?Y'{'ވ�A�cS�V�M�%�kD� �{Ʀ�X�=�:��*|�ͼe"������~��Ov ;�G_RϞ��\���G�$4<��ie�f3���Ph�H��b0��6ĎU����s����LӨ���Q�|_P�����3�0����D���C��H���,A1^'�M4������]%�EJ53�蕂 +ͪBP�^$R��R DB+�M-� �s��b�R�VFeP�;7����I��o��m��^��M����k��++_�����[9K����W��R�vۧ�?f�q2�s��}�X�@y�f��������H�/=�����֯�A~ ��0�̜�xra� GD�v�l�Q���Z\\�D,h�i�J�]&(A/�"Fb��a�ƚ� ��m2�l]��x$��E5x�Ð1x��{�����A�1>^2���_���Be�;b��~�փ)�Ό2�j��� �r�8]'�7�� ���� b�C�h�T��d���)�+���mD)���.5�1�-���|Yy���*��o�ڤ�L ���4A她= ��T���@|�X$�in.K�I|�R���@�P����@���P��*���a����k@�۟�������=I�� �=�l����[���ג"�h�X0�QҜf��˒��펖�c�<#9`|cO}$o>e�X<�`,�o���_��K�3�����p�{Y����An[�9�M� �T(!"��?Z�]�iE�m�Ğ�>�'����{G�t�� ��*~���y���`�'�A�?٘#��)�o�($��ȉەL���vYO1o���_<�/ǐ�M�(���W�藑Q�'^�#0�M|�3}x7t��<��a��@�̻�H�l�1�>���& .�m�v��!*��)$�z��mr��t���(�:���G�G�beV�w�i$C�O1� ���c�Z�Z�<Gc<z��@�:�J-����_`�8���~�چ��M� ���) uE����sY1�B��7�4w�0�G��5��z��A0�|Р��[��@��V��ܟ�Q�q^@W�r-���U��O���$9'��IBjf`5 �"ѦYx�Z�� �U�O/&83��,�8�k�2�&�� '�?�eEv�$��L`�B�%�=�T��ftF5対8�.���<1=>�0�G� 7z@Jy��~��p)g�,g��YL.$�,�� ��-�<�k��{�y�c*0�2�/q1��������g������K���M&�R<���7xC�y[M�ʛ #ͺ����Dya���3\��wf�wr�F<G�W>�ĸ��M�]\��N���s�Wݍd�<ӡ���W����064�t�ȴ��v�Ȼ0>ԯ����; ��)f�#�* �2<�h�� �~'B�w���m�H/��������wqM����o�gC)̵67�#�B�S��>_-[��L|R�R����lQ�}�\T�H) �9Fa��"^�b�A:�ݳQ4��' �=�sO ���'�@.���Y&8z �,i7����3y�;���U}p/�I��xV�x��il�F�Z��f���hX�c����.b��B*�|&��|g��e/�k�u��v\_H����b���d�p�G��/�A�}�㬬'�xȜ�Ջ�;�E���� �!W�����j��{���ZI$�z�{O�p�;�x��=�q�{�����5�l2�3O��=�@�j�j#�GY�T�n�>�&ެ��#��CBϩ�zLuy���lS�a�a���0�LTv��3��,�2 �sdTr�U}E����l1�z�`Xa*h{�qiuU�\��"L��д@�T��X�RU��Fg�]s���E���5�V0��X��/��u��k�z��B��'ك�J�x���� �Iz����7�������Y��Ε�1t���y���Κ_}��|�xm�[�xJ}z�l��D��V���r��csdsq�v�[��&��`�oU���l�?<j�C�! OeqB��=�J�\�`��Lr�孈�d1Mh�o�w�ѹKi�ģ�d��*;^ҋ��$��xH���U��U`]G�kC�ꆂ�����O��QS�C��w�o�g~�yG8P�{{H��.$���6�!}d4,q>�`�ll�UMBR��Pe�2�A�1R���H�q��lB�Q���$�W�%��b�hB���ÚV@(?��F��A�Q}<GD�2�:�e@�f�$"�8�ȍF����f��5`��{���K�uv�\��X�+���vj��^4=��03O��(���0-I��fK�R���o���O���i�2�)؆�G�Ǟ X<�ǘe�l��m��S�\��P��!!�ox�$�+��>dl���+��b���NIM�dT"+�ƌ��o0��`�89����\|5 ޣ�ئ(������y�j�q�m(����<\G� �2���dT��P��0���$���n��@� Ē!�X�㺕�����N��kճ�xiki����ݝͨћ"0?�^2�XF�,{s��r_e@V�����y�g����N�_�i����wq�;X��ED��\��b1G��(����Rs���T����<\ډQ���2tT �;��`���[�,��Ak��K��bDl#�b8�,]�i\����|kC����xLq~r� �Ά>|�ž�B����a��b�?a��ag3�0����( j��"F�A*�{ߣ�d�]ř+XH�z�s����Z�S��L�u:��˅�)�Ҳ��n�J�EBnS����>Ħ����� m�h,�R����T�~}�9, �/������.��H�~�!���`��E���x��O�ۖ �mwI�l꧴ёUz�z�k*�*|m��*.?���~� ��c��hp��?e�Y�]�*H|̛1���e?�V; ا 2�PQV���lW6m5O�3'�^���x�,�ҹ�a)T��eU��s10����ft9�����T��{�!��L���@�OL���tǽ!���^�L!t��i ���^��:C��R�� ����K�� ?2T��Yx�۩Fq#0��� <��hѭ����)���kes�a�T�l�� x����9���d��%+��b8X�Z� ��;g�v8n7�ϻ��a��&�^���o�b{w OO��7�jϯ�زΞ��,�~��WY��ػqÎz����Voλ�g�'5�(��"ե� �A�Ӄ[�:��P��|�Ӓ+>��#�2?$Mnd�u�e�S�J%����e؞~��U�q���� ��҈z�Rn�п,7��˱������>`� �/�uFg��Og)P�J�\)X�k VF"��\t����r�#��wE]�s�:Y�#n��8��Lm"6D�� �Vġ�H`Q ��ү�QkG�]�<2�N�?����U ��&��|�a���_G�}�di�!�:`Ⱦ�����[�\,Y��]J����Ϲߐ���ì~���O���A%>���]��2P�l5p��O��ѐ��[ʀ4O@�¡,�Ҭ���-�,�4��X7�-#?�3��{���M·�C��1�8�a��Y)�M�"k��a�_=4�JqM��?��nh6�k�ɜ��P� �2�;�3�g�4ՍZЦө�GZ�k(m�p�v��riZF�}���i:�/��czP��uV�Q9E��&'�/���v��<�2���ۊ����YQ)�j.�HN����11�s��ʗ���؋�{� ��'|�k��lT�%�1�ꪋC���g�QUJ[�'��U�ؔ�̝�ֶ{�81� ��r�n���ҹ��}�� :,�й�6X7����f��e�' NM�2p|�4��p6��Vn듁p&S=�[- ߞ��~�Nj�I���Y�/c`YAq6�-��Y�30#V~hs��EPT;�u��b6��WD#�N1o>��)Θ��Cx4�$�/jl1� y�.�/���,���Rr���[YE*GЕ�Km/�|7�����SI��SƗ�q�F��㍹���6��:c�Vs�@��w��+�k�1��c��aí�����w0:Y5�Q�" ���+g"%*�2�t��`�G��ݴ� �f:hN3�3�^�~<PM��Z�*w�����Ґ�I0�p!"`�PS�L�6 6�O��{&���`(�ۅ���Mq�aP����=P��Z_]��pv�W�{m�h: �Uu, A�j9�^��*��7#�C�f��]��gr�{NY��� 5���$�O�e� Gn��s��$��\�i�`�D�����?�߾;���w���5U�xj~�̦�ܵ����֝�>�yө��)�o)l*��H�-�;���+�|��+[��-��ZG�X�f~<F���_��̝����r�f^R�� ߂�4/)+��1La1PEv~�:+L>�M�e�b75���[ �Ho}pi8�;`�$�7��~�Yw�4��RypJ�s�������}�!*Yf�~����W��]�TKV�0Fy��l��$"��\��A��E?���W ,�[b�0q���.�|��x�Z�/�ˁ���]���P*4�$*(����R7��L�&����`goTܑ.�$�V̇�h�U�L�Hn�e��i_�"���o߁��e*mb��D2���u{��ݹш ߶\����ؿ����Z�D�ܚ�� v�z�1Ul��Rl-wk2V�x�Ց;�4�00�=ԑx�~ګ��o2R�mԔ��=��_��r���Z&�ן/߸�����(��[��C{�%b[f�.��<Nc0G2�ڼj��~H��iDP��ce�|:P�7i�/q���-ڏ���\�b�7R�>�\l$}�V����چU���*B3�l�RPf� �d�'���<j�E����x���}�6f�s�(İS���e~4�U���)�C1�i�s%C��r�H"�3���) ��L[��ө)�mj��U��ٜ"����I��R��6�W3��nP���H����ߛ5Q7s\�@��Sw���RhƄ�eq�܍G0?~�ؑZ>���GL������c[�d�N �%C9�X�<�Q��^i����p,U ȑTÉ�~��U�2('w|�/��B3�����J,�t ���WgLN$� [�V�|�v�h0X�X�����<�j�h���j0��{rLNm���[[L�3S�$Y����ʈ~ ߇���K������!�QE(؋�����P:&��{�ƼӬ4sœ��WL3A�6�R iv-7S:�L�3��e���=^�����Ŧ4˳�4�OC��R~ܐ��NK0+c$&3�M����u<:�"Z���,���n2N����EG���%Wթ!`�4ى��_��`��}�.�Kq���~�J�k��t��k�S�y*� ��)�I��k$Q��r�q3�T��)A Rs��=[D� j9q���v�C�no�KR2�v�)���1d�c}D�2k<9?�];�8����BR)x�ˣ;H�i�}{�74���4Ϗ[��:g�V-}@� ݡ_׀JPz�������X;�)aDJ�?���\#X���r��w�m���A�Ў2\� �=�69j�R�Lm���.I�eG��R�'��v�$� P�>5h_ ��c�ҠW�?��+��������`ރχ�#C�����B��W'B��~����c�b ���5~}`��A�E((r�{2me5� t>`v���d,p*=�ϕƼ'�� o�$ݥ�;f�`�̢�t��ɟJ�$��H��Z�K��Ԋ���k�+Lm����R2��1�,�q������F���p�̹-��J%b�����=g�V���^�y���~���0~-P��ת{�ƛB���2X�Z�?�oG!x�n.��}%�}Oo _�?b�J���N��v�$bl;z��`�&K��x^]"���d�+�geI2����� �B#�(ijNN>SwF�W��|�b� ���W�oW^\q�?��1>BL�/=�iR��,����cykW�Z)�BU����kjy�4X���K��, 3� �F��9�pK�u���շ����q�@���OAv�yG4����.,m��#D"^�ѣ�8l�QZ��1���C����\�4oJܨ��힊������dD6�h[��|��L�]�V�~�.��:������0z*��HX�,�Ͽ�7��z��U�QN�e.7$:���.��0֣M��j��9�g�{2ڬC���O��墸���N٘�@.��W�1D�z[���[�M%V�5�r!4&U�r� s�7%y�N�J(?�nYm�"T�C�Mmr�.�ݴ{bSNT��]*}�v`������1�^H����v�No�UۆAS6W�Oىe[(��B�͝�to1bϫZH��{���~�N�}Vˋٹo��<�>#��o���TFD"�%7�3���.�(?�f������]��`!��������1%U��qL:蜧�ϸ|��@8'�+��V��Wu۠��0��} +T/��Qn���l�~�c��{�p��a�=��V:#vm��~���1���t 0�SPH�]�/�j�g/!���{/�c �j���h���[�=�U�@ʍq�Ig6�M������mq�%Y8�dc�`"��X�t�������>�"��{��ri���P�O?��0=�/�9��F�nV}�OY[՜���"I�� �{GEz `)Ӈr���OoK�Y꺧�S����4;�������L'�>�c���N@����8 �ʋ�{삕zb�8_xV������(X"]Δ�ěM6w�,�f�gf��+͜)T��JUt> -�]z}�o�*�mGŶ�1�S��<����۵��&��:��Q�z�H��j��l�j��L� �F,����a�Y�"'Lˬ�ɴ��bJp{���6�ի�h���]��m� �E�=��~��f���Fv���E�`EWinux�8!GVY�??7K^�+�[2���%_�mw�s�Z���MZ?�v�l���9��f��O��{���,�'9�/} T}�����6��V�zô�vU�[��dT,_u�V���E�+B:�x��a�Y.L4�r�P�1�"��n��j[)Xs�54��� �4s�S�6����{�(,�kW��� �:Dm�3����/ �T�*���z'�1�o�'3��o�w|Ћ��=�Y�< a�D�m�?F_�Y3�f^�L�f�f'@�&M7�F0{���G���T�B����/�f��zqc�].L.I�n^����W�k��(�h��c�!Ȝ��|�%�?%��\��6�Q��n*��0��'�'����W�hĩ�=��ŝL��CgR��9V��玫؛A�ӚT�Q��y�č&i�٣h���QJ,#�|d驺z���|yYH�����{�FI%��O���RD�&�k�'� ��(����k�ͷ_�u�XT��4�J�o���tǠ��`X����l�/��-�ԩ���� TBIj�ԛ/� ��J�n0,�ħXB��U��H�h�Fe�%�6�%�/���:&zLl�dKT�� �^�Gv͊��SA4�:�D�I����ʯ���<��!.�1?nT���zhԓ尵�Z�B�����Cn���I������~+��sm�8�T��=f!c�(�KH���S���H7!L�S�.D�4�$��~]��ٴa�G��s�iK7���"dϸ}�����|�{���ܰQ�7�r-�y����̂z�RaV�]v4t��������2�����-��讨YD�ی�S�@�%_�B(F���Hke%&5��='�jF,�����G��oW�9�;�(�ڤ���X�3z`�f�M��<�~�1��bR�6t��0l�u�F���Ij˯���Jo��I�q���Ĵ(��cǘ�U��@���Ѣ#e�&��V������y(� �{̧Ku���WKe��Z ^>(wDI���߹}x�� ��ƺ�5�gY�G2�2��&���sσ!q��\ �������C�P%U� fb���S����'�H�Lbi�,�s��F���6���7D� �g̣oGa)j�S-&�>7��y���CCΖi�]MR���A��0�� Kf��F=z��gg��tf�7Kx �[��L^.[��ԭ>�Z�c�7���36�c͗��q��w��*CC�V<��])E��9��)�ϛ�0l�SM�.$�bAS��Hib%z�qݓV��ʀ7�+8�{ \�H�A�Z#[�8��0�*��r[-�swn�xP+HEl���Y./�k6wKb�?�8�8G�I.�u���r�l9�Eiޜ����`�"�ƃ���ȇ�˺�&v��I��բu*J\[�^en�Q%j ?{�nW+��1��Z���C�� �$��3��!��6���/�SG� @�4ΌE�!�Rd�8hg?��J~���u?Zi��D��4��K{j%)�'�x��Ma��YvkEt�,l���c:��w�Xk||2��$�.Ey�=x��*-LM��_���xC���{�t��4.��<�P�r�͙��s�1��/��N8�uu��.ӿS�_r�j�]�\���av^�����s��Q��ZŜ�-��D�u�S��g�6����{${�r�2����5�>���, ��hc�b�J֊�?${ou�o>ͨ��vCl��(��<�/0�x�(D'aԧ�R�0��"�o@����>N�9ߖQ�]��}��3�(� z^)(Үe�}E1\�p�B�(y��f̷�H����Y��/HI��;,���q«=���d��<zl�hi f|A��f�g]y\��:e���}���կ�F��M�.M�-L�C��E�f麬��u��\Q(K�ۄ�Rj���R�Ǐ��/��[��uTOb��D;Cطc�E���E�TSq��h3d��-{�fXp���6��h]���V�Ha3<���v��J@X�����M�zdR�Lb�3��/�����dz�"���?Ԁg�:D_���P��7���_٠�Sc}����ߨ�ʕ�0�$��0��s���MG%^��X��5��Tn;���>&T�<��)3SfV1��ړ'���vh���D���n�$4n���'�r}b0��D�xo�V���U�JgIN����}��4��/��|ߥ\��$M��y��"�j�}j����ib�!�NӽSB�v�C9�wp�7}��5�����q2�Ѫ��Ҵ�UÍ�,��鼁I��}�;��Y͜ȝ�DJm[���O��sޥ$Fl�X��~�=/_��S�L��J���&��^( qwv#�� ���.�P���:bB��fV�2q�gn�ٙ��l8VӅ��b��0�aG-OTlO=A�f��W�OOJ��{��̑Ͳ�g�� k:���I��3��*z�A$���̊k�P �`��n�FGx)�G�RPE%�5�\�}������3۵Ruu��W�-�������2�����G��������%v�oM���k x��B�uF��N7ׂkV)12�dB!4 ��. ��N�8O,f����2TiV u����d�L��zy���u�g���;�Ks�'^���y+�7UUO���B��ж�+�$�%O�9elե*��c@��F��c6gg�MU_�~1f��v�V�5 ��-V ��0�� )_D�{��Գb1�#Q|�k�9=�?���Po���c�s��$&��}�BoWT��"M���=�Dy$,I��N,چ� w�I�x�E���6��x�n�C�C-���,�ϕ��̲Y :�y�~��ʝ�،��=Y���c�,Txe�qU�k���*O��Tq�\�E���*��/ؒ/��NS�Uf:��b��?�ī�H�t$ٶUfu��dH"��$�2kQ�/���WiX���N��x �r6���_y{?2�ڽ��C~{���u�8�|�܁�Sf��+��{��3�0`�wbcC���Q��+zƪ\T�-�{�]��ξ6�Ѯ�c�?�8�Z~|�&�e��D��9qW�2R,Y+���y<`Ow�A�bz6|�]�:q��Z�O�V�gM��̥ic�kJ�0�=,������4�,am"����RC#��,c�f���Z6RcG�Ţ:�)e� ���eI��r6.��Z;��P�+O�)��$\�wI�V��(h�`z�{%�fp��xl }�o��nr ��7�%ӧ��{�� ��x�m���1oВ��i��q�� J���O��'V!��"��=�$ ї4��KS�+���&Z�ۙ��'�憥Y���^��e���~���}�,��x'"s�o߮d����߽}{.�k���TJY;ff��j�KV���B�+�j��qM�WL�"�e�/��Yf����xw�I��:k�I��q.��Dz�dLWim��]ɗ���] f��)�B��{l�ֻ��`�j�~�ކ��;ā;~�7��-zA����X�'��tb����WO�.��$�GS0R��a�#�Q���P�O�|�P[����%`C)c���"�ͽdD1�xp_s*5�ac<�v��P��c�q`{D8�Shv��i ���W� ��w�pk���R|��O�2/n�@�6M��R�իB|��\Un��^�l�s���=[{���A�?��zJ_R6��SA��� �������o���wn���~��GK+�(uhK�7���,���H��⺔���Q��/��,���Z��y�(NZ��y ����ɧ���e+u�h�C�<�/�,s wy��#�j��I��诵�{�Ҏ����,ٿ�%�`S"[;��_~`!>�]�*��t]8J�u�uO� ��աH>��h�Lkq7g��R2�,ʪ��Z]�|��$�CZ���m ������q�X�� �LrS���Kb��홞���%H���/���w�>G�9�(|�v�v�NnNvX N Ѐ`p�����+�{(��u\� s��Q��p�ݨ3��q�\��͟��$�ﵧ�;Q�Sřz��[jl �6n� 8�DT�}��㔨�P�E %��BW�ح�Y�w��.�����!����/^�mdSZ~j=�*Qgd�⨎�0t���]�����q�-�.P�JBp��1 �ث��at�l�/���y�p�q�{~��TOH���6��� u�N���wY�|� A�Vr��wDh4Kk���+ �/�@ @��O�����J��ZB1[�?l{�JՊ���q�9Pv�oY6�CJ������������$���H`7Ei���)*eK��Y8��{V���)b��pNv/A�%�;�uh�(w̃�l}�*�4�y|uV:&�*P;L�Q���g*}O��W;xT�!���F�[���o� l���*�����K��K��Uv�ܼƌ٫NY4�$Gd+�3�$K�VZ���F&FuR��j.GN��ۖ�5ƴ�revv�v���Ȭ2M��C[�)�|��eGyb�{�)ڻ���.I{l�1����C��e�sZ�t��h��ɻ�RæGp��7?��(�d��W�^=� ���&�f�V��͞�iϟ\���G��6$��$��uP=o�u87����[�%>`<�.��$�Mtӗ�B)G�jS�Q���Ud�`��S�"��3��ɽ�}Mױ�Tth?�7���]�����i�EH���zş��|�-���td���ۑ,�:�D�����j7l��D6٧-�����+�}ZU4�^��xO�ݼ��f��QH����U;"I{�)��1��Z���.����@�2b+q�z�V��s^�>��V[ŵ���-5�v�����]蚮���c��"��"f���\�߬��<�ۋcy��#��Qj�6dr#�ȑ���J��4l�O���(y��N��}$m�[�-�|�Ԉ*��S�\�ќ��臉@��@ ���ie'�m��'q$��s'B���A��d�)��.�* �_y��#z_Ы_����{��_a�_=+䊒ӌϞ'P�ܺw G�J��l.���r�q�Z�vD(�DCG�&�C�ر�!��=�ǣz4���v(�$;�{�2 @�iǘ�u��pc�E�� hh s��> ��L�^�f�ڻw� TWޟ��R� �/_�I�Ħ�M'B.���,P�-�H�j)��%P����Dp2��^�^w�`K֫�K�Pa>ξjϨg�)�KS��ټ�dGFYG�$����X`�7%�Ҁc�K��QO����"BաB�'��^.�`"�;�G����leԒ�O^l��:�Q�>�45e�=[7$z�����i��F�\*B�'ǝ�A�ko����MFc�������3|�Ӭ%v�>!���]�����'! ��}:xi�/�xcR�^W��I������C��z��_`~c���V��Fvf�]5On��C��?��ҷ�7�9��']�/g}��փi��UIȃ��O�t��̒�?��k���:����[��>TSi������E<7�E-�N ؐw;�mD��u���[�����z�+9��g_PO$��UYN��[�#j���I&���3�\e4n����)Rvcx�/�V�C�?�K�����g{G��X����"b��(�6��ʛ�|���� R�r�I���&�-Nձ��*�?��2BpEYP�[��.���r?�gO�h��/%l�RO�E� �f N=d&�u_qb�?X°��f:��J/��}?(u�6����P�"��L~�iV-�g1��YBg� �����}H�K2�4鵖r)�ۡ�#|ti�@@��J�R[��k x����cE^����I2߸�dVo�qP���kZa2��H�/�=(�c[lW%i����cX�c���hP�q���6�c�M�?�}iSh�Rm��]��6;���?'����B}g��M�m��Ǟ���Cj,v���Ա��>����G��+zYl?G�ܦ*{��.�m7�A�T�^1D�"�;R�Ur��"bh��lqw$���/gy�R�mZp�%�0B�ϝ#4�b���\q0n� �N]M�<�q��N��{Ԉ��h�@��1?��~�t����6͜��T��k���̆ҙ҇�\M�|�t �5O<4> J�}��,�QrQ*ͯ��A\'�)yz�'�KdخD��Wdi�@gzu'1\}�^q���I<>e^�h)�Q*��lz�B�l?g�������G��Z���0`��~���9�<!:���+��xۣ""p�[�W�}��"�Y|ʒ��>�/ie+U�r�W���Ws6 �g�*�D}�z�yn+ህwUӋ։��f�G�%!���L[#��"�h2�fmh��|Fqb}*�H��#z���nV˴��]�xA �1����m��k� ׂV|=�@�=��OB�z�P�d��5Vrl$���ZՄ8����8^Ϗ�qp(:A6J5PY2 èV��'G����pe�\��hj���p�1a���w�ʓS�A$�|�H��E#7ч����|��p��*��� �`�D]Z�B-��\6�iWẍG������GG��~�Y�J��T7Mq^��#�0����õq������b�0�KVot�[ �Ֆm^�k k��-d�p�ݟ��^J��d�3��ݕF�F�T�Ϻۗ�9o�\S�8��qk�"�σxL_:��P��Lh��0!��iˌ�{��8�:���zE �Oy���/И�l ,)�G�����q��Q��R�`��\J�>[����ip&Հ@����� ��$��:�Q8���Bt:@`{>���'�a�ޝu9��9�'��L�cи�đHh��d͞���YG�f�������/� N�=�Sf�0T�;WJ&� �I�2����31��kÉr`��}��A̶���������d���@\q-�9(�B�,vѣ�ALX�q�H[�!�f�-t|����n�PΤR^�b����GO�f�=+����h���W�D;Kf�x1��^U�]�3�@j�K8{V�. "k5���h�G¾�pC鹒�*�6i��S+п�u4495�dj�+��Kk��Nq�B��M�++?{�2M��NJV�u�90�$#dV�/�,)�� Ak0�Ƃ^����F�ߛ����n������<%��J�����vq$������d @�ww��?��R��s� D1�F-�_�E1}�zc�ƝZ�h��[����$��&DWx&fe�%�� ~) ~��XL�t˛�҅��JK�//(�F[�KY=;��ؕb����~$Vd�]��8��|��bJ�):v ���3R�R�Q��}˺�O�� k�UP��}��SV����xsQ�ro���3��z�2�F���'֯���nN?��{"]�1B+�յ� �;*� ���eO]���-��N~���2�̜�u%l�(Z�����b�9M�h]Z3')�9�#�>�*�<c�;�Ԛ}l>�%�)�V`leY�.5*���D~�-��d5J��Z�!Q��Ӧ�^fP��/fj��T�X��X&(f!�Ý^�g/j< �/��륃S'J֓5�V^ ���ߟ��^�m�{��2��;�� 0i7$�&⩵�ӵ�����XEOS��x�5DZ�يt"�h��v�_C���S���~A$�<�@���f�\;S�a�)��6C��_���Ίg0(4i-k�< #5t�\CC��h�>;�!`���� 3��-�6�ht�D]�S�eN���� �}�}�����"����#Qn����`F:��>�79$lV��e~���̈Ja�%��q~�ܣ�˴��^l�C�� f+/����eBa��<�'� \*F�C�;��|�c ��ڀ�N��f�!�L2i~�<[ ����p�&�ѕA�kn�n��r�틧���n&�fvnjn�-��2�5(!�������rC~��D���"`\T�'j ��P`�0i�O͚�F�krf�uə��کj\'�3�!B�IEl�Q?��m12<T���R礥|�X}���v��f�*�?_�K|IY������{�%m`*5�D���`��N��9$#�c�����z�K����t�d��k�7��[�3�z�ܐ,����b<�|S<�~غ-VE�l̤��iA@O[��.5>�pQ����e�>��R�w�تD�.ۋ��� XN#�'N���jj��о4�!��tK_���f�R��!@棼C�J-�ja�H*�����N��p�@w�V�[;�� ��➄s�q���H��l��ڜA�?�y� "�j�!���<�U�?�h����k�1��oa���e�8S��1�Н䋄��!���9�h��I ��B�� 9K�o_([f0���o!����31�C���;X�Ih$�ɀ禹@��@0Wl �]�&)s6��4w�Y�3c.��Mg^��1���O�qs#Ms�3ZNLMi�}��� �9�U�~��x~{�$6���F�ɬQ�Ei�2Wv�YF�A��Vl�����VDXer�(���Z�e���Ͱ�3)��\t��5\^�"r�Ш�s� �w�P�5��f7�N�K$f��^q{�"L���]��z`@��DQh���6f���~h�G�5�uU7G�����~� ���.�#3�P��TV�!�n���ژPf6�Չ>l�6 9@�Җ������5Ϛ62�t@7 ��L��2 �� t���'ԯ�bH���Լ�w��Wf��Ɋ7=��.=bx %d? ���a��� �9�e�p����H�ҩK��\��ۏ������$����C%�0���� ������ntv��:��M�`᳑B���asp�&)"-qc��� ��@�I����bk������3eP�F8��ZmUL(�(qP05�n'���C���V���i��������j���ɿX?q�g^:ӛ�[[P�V8�����6��=Iɉ(�c�G���@���Lb!l�l��8߬Mv���vVb�q�~��/���%�Ii����҂ϡ֣T�=�!B��PS:�m�u�v��P��s�ϥ�;����Z|s,G��:��pH���g��Vu��ZR>f��@��e⋮@F�<6�Ͳ�.��L� �/�)�X�3"LN>�^�m��w'����>��\�C<��C�Kb`�(.��u�ְ����T�'� �o���MG�{x�$ v��9� �|�F���x�ʀa@QI�֧�'�=�z|Q�o�^B�f��,�Zf�W�4�#�4��y�I���9#��5ZڭE���2�p�'��B��~���U�j}ۣWwE�`� m�'?�!�@ ��C 2C���pc��lݻOš�{(�C2��kC����k��'�U�"��C?�T�Q^��ڝ��kK��m�3��m��$���ͮ��]�<i(Q&wldmY�1� s��3�hOJ����:�N�I��7N��$�zڸ��##ot4zϊ�p��驚�0��k�x�ȬU����ÜF~:(|�B�����n��m� `N-���d�l��9�/\T�&1����9�V<vn�:};B+ׇd�S�\H���l5� j���fe_�����Ńa�8��||g���x��WF�i��%C�F#�Mk��1����wJ%"�\Ӿ7����R ��6�;�{<�UK�9`�;$�Ѿ�<�{b�a*MwfԱ���O_�g�2��Ej�]V��4�X�*��g�S0�K���c��A��T�P�ݏ�`~�e?�F�[��n�jX�nر�U��5Z �"��p�ss���41�@�����Gi�<J��<{��z���ޢM�}�a��!Be:�܍o�`-�C\�.yk��$��exdz�N�H���(���_����!�KF���otvW��w-��s�L�>��]9b� �Jn�)sn�t_���_xEK��D� ��B �$gY�A�V>g$�%L�0L#��{&Ν��Ftd�\��P�=��a4�� �8"�<ܝ��s�L^^N���Ec��v���H-_>�����;|+�c��!�������8�O/�.规��Jn�8�&�,���%�s�t�]6(k�H6��Fq#(ۉ[�y����{��0(�^��ֿ�b��ף�Ŭ�����������&f��zCqI���<Μ$��((h\�ED�C�������c_�x�/��E�.:���i^��+�Ο�1צ��҂Ji4@`l�xN�L$搘6��T���.��?���4]�X�1h|}g8<1Ȥ<�@K��/��/��5�p�ל�o��t��p�a j�t�bE��E�y��&Ц4`د���$�L���"����Jvi��l�j�Z%=')��8�e���`8�T����*�M�8���.������w�~��\(H�t�vr�"jDo�GG �i���lHe��%ia&9�d���d>�-i �lM�ܰ��TA�$��VHG|�� �$��:�1Rs\�Z $�Pj�ۇ��]ً�g�8`簆 �zߒ��V�X��ݕx�rtX/�A�p�2�^[1~R{�뚬���ɇ�:kCU'5n��%�'�CXP06G�ۮ��l[�<�N�scOFeQ��-�gi$�RN���o7�Wz� _t��"?�z<Q��l&��B,5�"�}\��i^�|}��R�����l;$��ѻ�'dxw��A*�ͺ1_w�f$or�w�V�$ ��T�Hi�����L����lVc\����7O슚��ŹR�D)�]��B����=3���qF�MM��ȓ�B�g���� �OM[�`�W[pBΉt��i�\��`�{X���/)�ƩcD�R��Pvz�x��49H�_��ه�#�1��&��P�/��֡��&�U��u���)��l9�Э�:!�}ɑ�=[�*��;����u{����.��p��"�!��,��|v�nN�K�63ud>��6����y/H�}���ё�{qL���$�� ��-���a��[���st�nS�n2�ğ�@���ѷ�����xHNp�������2���&��3 �����f��x�)�WP'h�7f�>�� �s!�;�p��&Q����cN>OgdH�E�1u {��^�گ�V�}���2�@�J�H�S��>!~��L�^d ��r��5/��GyNW�-�`����ɚLJ��=��(R�V2�ȏ�M;�:�-��A0<Ȥ L�1L<F(�J��L��Cl�Y���N��_7�:*�\8͏�w�� d5'L�����H�s5M �2ID�%��WP\pyr�~��ҍ�)qN0�E�|)�(�@��(";�JGZ�!���U��,WL�#E�E�����O5.K��������Slso��z�d�7��ӳ;%n<�5�*���iu���?o��mI��"m��.�XL���F������r��s������ 8�!���{N�c�yٗ����Nf��2�!�n"5hU�F��J'�d�B�2��sv5� �����C�r>~.���ܤ�kg��LinN�d����u'����f]��B�sL��A�5S�h�K�v�vn-�_e�9e�V"m���B:�GΫ�x�c�ZX ���o��y����HKgT�~cN¸���OZK:�b�A�%9C ]��o�ʗ����w�1��)(�t��^�?��u�Ʀ�-A���9�����9N�لL����#�A2Yu����5��/_=fql��j���އ���ˡ?u��Ar�Z����]�A�X _�v�M��1V��&P\���6X��2��m7䥱[lҏ'�A��Q6R�S�Q}�딭S��e���S\D-wLrTC]�ӎorly�݂X���J^fo�-���˰��(�X3�R>\�#� 9��VP饘QՐۑ,a�e���X�#�*���gV�Tnq���GL�(��Z)�o�M�i��!#Z��H.��$�ɀW�����\�p���*ȶ��/��.g��y 9��L2��p�(�#Z-)i�����j��jԭ=�0b���`n�0�a]�k2�I)�X�E�8f�nD�η�%8�CS.�o��ě�Ng�'d�p�-��J�=a���Y<l��Ǡ�OYdb�Hl_LC ^]����o����>�ɹب��Nk�Y ��Ե=�����f��N���H�^�����f�<���(|�E��(SL��\���>�u�4vdN��~�HN��[�nD���eh/ڈ(2�1�he_ʔQnV=�C��H�E��gi~�%�B��15���czŕv �>a�Y��%�e�&c!��pIB �8г]~A-l�64�1���/�[\\ZI� T4�W���aa8'l��xRY��N�e��j3:��-:G��6�v��ad$$`�M,ܔC�z�3�!q�1�����]Ӌ��n#x��B����l]��K�^�t����_@Y�u�gS��k��]�OƤ�&v:��N��a�L�ewɋ��-hY}:��xi O� ��x|+^�ñ�Cq%��]{[[�q"� �x@L�upՔ��j����-��[=�����ئ�\�e��jq[�%��^W���'�Hj�y�c��%J8�Imx���=�C/�].&�w4�D��,Ƙ��3���"�z���`�U��� |M:3Qc!�_ǣ��W(Wj���q��S�#f(G4GޗI>�����n�ڄE��٩����^�����˗��<D$>n�HG[�M�'�C�&�Ǹ'o�rUm�����N��ݾwJ?��6�\A<��N���ZK5�D�)����Hi=�i�qlS��:�B2�&yY��^�bخu}�Y+lc��Z�mL��%9��s��̪Y�O�1�ߺYD2L� ���ʢ%���c+7�V�_.rsIq pש�� >�bG�Nz�Ž2�q�X��D�I��a����'H�V�T��으���E�t�|��G�3�( oOtrJl�s<�;���3)YQ��`gw�8"o�&��7>�cѭ��^��@&��t�T�}g��$�}��0h�h�)�GT���s��y4r�� o� M�H;Φw�~|� !(���������ad�" ���-sQg#�,1M��|��/�u�h�R���-�.k$G�K,݅1a=a���YP�A�,q�%!� ONzvN6�^��>��ƬA�v�J�F�ӽ�)�� /���ުl̒�B3GM��'[�,n\��\k�ѣ m1�hm�o�>!����jM0C <����埵��ߎ\������`K|_xN�`ǀ���pWJ�jHL�M�<��_���=����C��M@Wޅ�%ꉷ��dž���f���%�Mn�p�Z�3�@>'�M��d �Y�,BT��u��J�:����o>��b^չ�ȑ�ދGx��_W�`�H��"=�ϟ��z&=�@�%ӌH���qi�x�DH�Xx�jꄯK |@QT��P��+�:u�c�}О�T�����B5�ڨ�81��hȩ����a��Fu�XLc[�nNרxtN�D�X��*N8������s7�|����2 �R{>}78��.��G���yՂ��Og�#�Q���q�'�g �f����K�Y��`�9�h�2��6�$}�� ��(�T?��}A�`�7�8��LHFR�G� E�FJXw!S�K�r���@EKa��2�'��ʌ�%v[؟[7��S�F�j��j��[5�h�Mt,���^���i#��Co���q§�Z�e���t��e�Wi�����p_�t��^*>����Vlh�Z�Q�jX��B�㨪�9�q7�@������'������[=e��H+^ї����a/�G�6�z�<�6)yж��DH�wF����v�2nF�)%�d�����.�)��ەP6^÷r ��{�h��<�L�?�Ih.�����dht[$���] ��fŘ�9&4.�;�s;�B����� �k�����~�>�j)ϰy"T�㝼j�MU��dM�ݱ��[��D�g4{+�ݝ���:�<�9q���A��w L}��A=£6�۠ev��Au�+U�_��Q�3f�?���R�\�0R� �R^ �,���V�w��W����2�`A �v�G�<9��4nX;�?��?�*uV0�����{[4"��,���qӼ��<��RK�+���k5�WxcF��PO�=*��;E����D�~��:� �m\A��p�����\XX�d����+�Hk6��Zb���WsX�/��$_��Q��Z_���hh�L�u|��8� ���Z����}�IH�:ƋoK}�� �a/-�k��xVq0��r��LC�_�D6h&軓S�q}pߨ�=��~38���^x�Sߡc���8Um��e~7����VUZ�:�vƯ�[m�>���?� ��p}�_�gKB���_ %�_�g=�Ih|.ݥą�V^1䓺0 "{��7��m�s�9�ꛦ���B��N��I�p��i{ ]J� ��:M����y�%��u�����G��Vց����kk<o)�{<O�GJץ�xCNj3-˪���W-739�Bƒ(T `�P���X�i��wQ�:����6�)"S #�-��,�"v ��\��d~n��2rr2Ob�6�[�T��� R�Kc�Y�犋��4c]�>����py��jp:G]�Z����$0 ��_�N+M7�Y2l @x��6q�� ��4���59O�Т�}T��r�f5��2�k t�߲�}�p�U\�ur����sVl�ת�a���� }Vm���~3�gm���,\7m}�-���*�,EH�q�$Yx�=E���_V'��C��R�i�ND��9���/Cb����x��@8`�2I̪,!���f݄�nE��8�b�+Q��2쪘�CZ^?G��Vf��砱��(B��Ie�+�9��: A��� ��v����4�RB�H �z�ѳy�|�x���֣�W?�E�t��FO�ܔ�c��=��1E�$V(T��}�rY�!HhQ!.F/ d���իG���0����;j86t�������� 8��y��QG��/Z��a3= ���O����_�ؤJ��Pג�I�Rs�Z=��|ڼA#������#�su��曻;.�����.t�ש:�KIT'�6���m7��"�:���s�b�q�yL�@Z,Y� bg����,���n����{O�;]�ɪ!_�"=c�Ӻ���dij�2�G�B�X�$���|��i�!���*nT�%��;�*���^3�/c�E��s�4��CwLj})���<(��YpHw���W�^��HL�-v��p��đ@w��Пp�̹�U�K����>1뷀��L˾�f�0p��Ύ�=�_��! 9�q�[���ƭ��t�-c\ � @�q�]���CAJ��p�Pao|y�lN��{F��*3�F��xLTv���0ԛV,�������jH�A(\���x�����xtP� ���R�^����S��h"�H��Jn#_p�.�$���s2�i��B����{T�uZKt\�LI�%���*���P�={�b�"U�Q�"V�R} >Z������ŊN��Vݮ�-�J��hσ�� �^����;��FQ��,*+�"�"�00)�:;:V��P8*e(7�Jl�����0oHe^Ɗ��y%�`��4��Y�[eX}�6K�J˩���^#<ɝ��I�_/�23-@�l�4��`��P�=�K&=.)��՜XvL���f�o���BG]ޮ��+��Py��I�n�V`�k-~S��d��d��cU��.�gƗ'� 1N����0P!��ί��H��]Hf��[�Z�x���\.� ��+�\_4b��Ov�����#������v!�l�,�x<�DxIN-F��e,/�\m���d�Py��Ir��ǐ&$�G�K�K��և1�q�zG�!����A��38�̍�97U;ȴVe�g ���L��ΐo�tp�R<s��k0U�-������=C���C����WjA����Oi�ퟌ��il0Gtc=T� �u5�<ل�'M�>#�� �A�D���䶅�)�m�"Ǜ�X!-�Μa�R�����_��});�;6��П�(��o:֔�qC^��Ǖ��۵�A=�z�O�b� �d�~���������hz�n/J~�ǪŤzS�,J��J#2ŭ��i�Z~_�{c��]o�bR:�v:��?e? tZ]ָ�ՠ�gժMk�&�zz�q��%�UCW\Y�ڻes���7iv����Z�d��T�V�Q�C�$mČk�i�w�ƿ#��;�̋� %y�G�8@5:yq)���|⌬N��=������Bց�^\��S�8]�]�?{��rW����[-�+W�q�)^2���-��KK�0g4�LҼ�&O��SP�d���Ş-m���>����n�x�QyY崎b��y�CQ����A��)��B��D`<`���������7����%f"�Y����>���ШG]�T}�_�����T�,a���^&xԠ���,v�4�EpW�¶��S�A�N�Ⅽgj�)����&��d��5�4��(���$���sD�Bݦx��O�h�XQ��L�w��`�q�nP�sT�s��'@�Tz��,�2��J�*njވ�4_�}3�����י�j�ҫ-�%i���� ����P�O�F?��kjS�#�G�'��p�1��J�m�b���a[�2��?kKq��!��@-^Y97�*��o0�i�M�l�=�ߺ��������(�7g���_��Ǚ�W�أ��..�� �p���k�����#��c]@��q�o�s]�vK��i]�C+�K6�-�/'S���{V��F#pƦuO&��g�z��u��t��xeL�.��v�s�Mf�џ@/��)�u����A�)0!۽�)/Y���_$mU?S^� Gq����Vċj.v���UH��0��mǕ��*3����bt3����(��$F#��P�hzZ���o��\��d�沠pmL�~�Ljb�mmK��� �qsN�"Q_Qh9� -��㳟CU�џ��O�=ކ�y�5��Yk�����N.eu�i�#u��ڒࠠ���p�*��!��C_3��Q�p�azm�g�-��� �-���k 8��Z��莧�YP�d�M����`TG���hѤ]:�d���VN�vc�W:w��|kҁ.:ӫ�O�ڑs�w pT����%zه�*�0)��A&3��PPQ_i.�-Z�!���%�Tt���f3�k״�+��f���6������6mP�яH4�ׇ��2�� �umMCͥ�pm*Y˭���9�_����J[���.9��&��,r�H�i߃8Ʌ��a������[�N�n��<�CrxL��r�J2�vc��>x� �����J�#u��:nY���}l�z�Ӯ��^Y;���z��Ӊ�1�`7z�v/��_眓��{��='T� `Jټ]�ȇU�)K{v�[���՝y�`�-0-�?���^����[�mSƐ�=�O#_D���q�q�mR0���)� i�bJ��}���<�w�o�a�6�[����^D���Zz`����̶.D�K���=b� ����b��l�w헂M���7dֆ������#wQ]!���˘��g1}BJ�9�����Ԏ�I��=CVR��%�L�MU�]C(�+#O�1Q�dj�2��~&�B'٩p��c�Q�4�1#���qʸL��̮�L�➒��GZt*j�I�`��Q���/�HJe�l���豎���x[0�D�1�STK�af�;���3`L��}�{اJ&5������J�^����G������&���x��%n�q##�G��7���p(/8����ʶJGy���8�?�����+>I�����克W�T�m Aj��/b����YFNG�uc����\�����:�i%���fU,p�I�p ��^y���B�cx�2����� Vb�6N�d�ٍәT���l�W�{tĈT{��S/�Q�Y��K���7��#��pQcGo���g�Q��G?e<���t���J���8�3�Y��ި�F^:�̊�|�ʚ8`r}�Q�hF�4�뢺j"�:k�2;k��.,�&��z�TIF�Ty�=�K��;�pr$�Ѳ�8f_��TIV[��[�ź`���.N0�U���8IY�� �D5�7�o- !�mv9��\/�KR����!���6���b��\�+'I�e/��a��Fzͷ��{���P|�w��4ej-��t�۠^�\�SK�+'�J�R��S�f����4��Ԗ+�e���"Ӄ�j\��ʌ�E�.�>p���!�\�B���}vچN!"f���R�0r�G��*�� ����/J����6�M���n���~��}}<��o���lϸ�p�f%��n~��W�X�U�lA!�ˍ!ӫ��8�iD*�z3��@��EYo�J�N�C8f���,�R �Ə�m�w�E��(�i�wL��e��7�xЬ���2��Lz� B��,�'\n@Oޤl�o<i���YU��ʣ�:�8��p�u��Z�8�&>�s4PcX�Y��������}t�p�-� ��yC&��z��� Z`7�)�<i���6Oggtx� hTI�w1a�r���3;e����0t����Ysmv�YE����{)�K���Yh�&�ۑǶ��X����>T)�0�jJ���ׯ�$7 �����۷o�Uck��w��Y;8��>���+g�6w&$�>ނu���>� �VZ�J�����g�˿�=���>O��i�]@����QY������O�����ƽAI�N%F(��Y�9�9��J�C4�Q@J���9��u�3p=�0A��1 ��,^�>�(��HR��Bx��Lԇ�j-���a�p3���7ub�NV4|u��砋ale��z���J@��5���y�C�Q@RRq�O���</�&�IG&-p@_S/�mn�����c��Z5;�<y ��/骞P��e ��������P.Wk�Y�D4�<�A������NǬ��i�D��N$�7 �.� �+�gI�g��:�#?ḤPuG�q+5<(��ڮ-H�JD����U1&g�ξ#Y�#}ă��-�s�<I�ʹ�`�{6p�S���uA�mm�G�p<��s�Oic0ʶ�u�����f�5o#������.�o]�l�<(I�Ֆ+� [D-���d���qꝻ�)�<UPqyoQ^49K�# *���%^��"Vv�*-���s�y1"N�!�4��\U$џʋ[��M}�ߑO�r=��K-� ��82I��+��(�Ydmh��Ő��La��$U�T�� ��C�(����' H(x�� ��=��<XU��Q�����L)FM��^�>�¼�p����1�B��j�*�O��|O�,������0�߰�ʹн�,u���� �Hs�5��IJ��R���(���+��F�L�?Fh#~J��1�������p)O"�-J��q �Ƀ7�u6��(ۄ������!P@��>Á1� �&'�s3�ه�X,�9Y�|�s��A�CEvp�|̺%��3�7�_*xC��8� <�"�'"G�����!�£���V�볩�s�&<6D-m�������t�t�z�q5��"m����J���}_�(^�m�'V����s�۴F�>}*s�V�Ӈ"����m��������9oq�����{��o��!<�]w�@a�#a���Y�Y}i����|#�r��\��I�_ߙ�W+��"푎��Nܞ�0�|��9�8�ֽ .�yf����n�sˡ�b���~p*5E#�s �vN�9>�c���QG�!�Ú��8��Њ�y�6&���-2�~Q����[�aṖ��о)5�����_[��z�_i�t���b(߭O��=�C/�����P4?9�T�,�1��լ��9��"�f���P]S���Ԝ(0v4�s�Jsb��nQ�{��}�#�@����ɏ���U����^��R+�/6�' ������Kh��-��F�s�5�X��ޖX�yXQ�3���� ����WK���b"��&�â�{�[�m�p��Z���ֶ/ʲ��Z[��Z-l$�N�e�WHW�M�_� Vӧ�x�s�䀱X )���o�C&�6�l�ktIp��].@?wS���h�s-�$�9��n�P[������p�Y�ӲG�:������E�t����b&�< �E�_���p�0Jtz�X��B����.R�� .E��Ď��u-0OSBþm ���Ǣ�����]v��d�`��ÝX�P���[ ��V�C�4O�������0&z��u��4�&��E�ʙ't�A��B��%�+�DˎG~A�x��CPKZ��n���Rg��x�+��i|�o�ʜ��8��o�qJ�`��G��~��ɕo P �8�yuq�뢵����𐠵�������Ռ=ƶ��T�·n2p���aA/�F[ ]+p^��F���(���?ɬ3gg���Q)���Ċ�DLm4��G;�?81�[ѫ�T�> =�Q8��)ʒ�5��ck+gdR�����A|�v��a�kBcz���[���C8�^'�դ���O�S0��* )�5r��|��Ȥ��^�?�z}�[�SWU�����T}��?L���U�^����}L �6h�8� �b�ǎEڰn�/�M��A��6����6Mk<��u9�o5)?q� #�019u�A.�mX�iȪ�fg�Q���Wo�g�@��u�;� �o#���&�o4�O�:on��M^���;>��r�0�.'�}�)X��"�9��O����~�.7@3����_~I*���`���֣��q���^Q(T����ߠ1�``��w2����u���Փ��أ���0�F�(zc<��mL�hc�-p�:�|m��.Ǣ�VfhJ��M�~� �[е�}��r��2��~��wzJ�:Ս{�s �3��xԺ�,G� �MKd���v%b�o���|��l6�z ^aCG;zVl� |_����m௷E�ZQl��Z��>g��sSo���l���P��8�C�4>@���e1bς��� ��z���F]�5�Qƃ�/Y �vAfG�WJ;��=�yw@�R���q�\kK0{2tv�0="w 0�N����r �D�n��J`3�7�%/-�*�R��.U+�[l�Q��7H����0x�/{džq���8>6F��'0*G\�Q�a�$;�h�fEB���C����-`0��)�y�[hʑ����V� H2�pC��xQ�P¥��9�>&zgိ�*�+kɼ�'���W_�~I����Pg_�CO{b���̖���aշ�N�� ��� ��~A'�/I��팟o����"��ܬ*0w�����K�OLx���i1�M*ˀzܗ�{� �m�eJ�!,O'��Z2N�m��:���ܢ*G�`��x]sҶ#fD\�����FI��Hw��]���I���?�7#ȂU�.�5w5ɮ�R?7�����0�:�3��np&9&�Vup���AFs���Uc;I}�!\��Uv���}��b���z:���9y�! R����ξ����� N@)�0ߗDd;(A�Xr�[B�N�a+��{��?X����/��Jڽ՜v�ݶ�6�lҤg���O%���P (�/V�� �j��>MT��c74bɤ^�~^�()y�I����Єe7a'x�U$u8���/����N�Ψ'n���h贑�51��;�^n4�8�ߖS�q�F;� Jx�����]�]��Y ��MG-WM���_� K���V�gGg����>���W&��i�& �əۣκ5�X�n��F>gla�⧲�0���x){���8��}>;|��9 i� 7?��kN���W����� ��A��P�Ej��p�Y�rҊ���J�p7�~V����8��o�?������� ����3#JF ;Sl6QA�i����C��fT0Y�w�I���+~��[��kB��4�1L��[�*��;/j�LAM0X�}>������.�tغu��tj���iZ���6��)���u�d���n�������?������ �|n4oZ��8H�/��h�!��}�I>����d�� �_�Y�3�rD�wc6�Z���K�ج���A�;��T�� GXKb4�p:I9��m��{#?{��X%��C��KM;���E�({vT6La�Y}�j�O��ѭT�в�`u ������J��ۃ�2f�1��D���/�M��R�1�Cb� @#�^$yH"�c�%߀��.Mt��B��l7 ��^���]]]�*��e�g^1:�� v"t���2��=M@f]�M�̟D_��w`tј������m�����uJw�"Bh����O;��ֽ.��w�3,�eJ�VKm�C2LCyӝO�L��U�{�/\"����K� h���� �bxZ���LR���i�O�(=�|���V}��)���[[��P�[����n���2�6Y�K�� �UL�}�W0$ڃR:���O�3Ij�(ΒRօJ���)��������H�I���n�S�(�g�K�p���2�\���oN��ya軚����8�'��p��%�K�EE�gO�[:*��p��ⳇW�����F��t��!W�o�ڧ�"�˲"Cրo��o��B�J�d��;'K͒�__���h�v�+���d�����ލ�� '������V���m���I.^�˅ ��8��B��s�f�G0�8�ռ�*ʮ ��꩐�Tҕ��c��6�s~���Jim���xY~��V�)�I��ƛ��+��h���Μ�;]��E���BAАQ��l"�U����,�C�)��'f�C{�KD�]�p#(^�����y�s=��=U��jon��lVe�u�iJ+$��d�U�#�;��O�� ?9�2��<�;�q>o T�r�x&� [��'-�x�p�0j�[�;3�Iw����6N?;��<m'*�xD�?$A�ʂ�8�f""0���ZI�;�� _ߢUcGk�"�#�+QE ��p�Xd|ĭ̧�!x3�f2��[��F����K��oa���K~�۷R�6 �Y�cj��<��L]��%���TS˶R�O��Wöbc�£�e�P�}�S���\�� ��T���u� h���Ыk��.x�{���zZ JTo�;�8��H�����P^EsT 'K�@����� �t��B�%Fj�dC���ת o����@XV+���z.�T��"!"�����BÞ����F�.~�_��ac�a;�� �;%# O6�L��=B dX���o� �ߡ�s���L�!.�A2�R� �4 ����:g�_�*[t���S*]��6�,�O9�3����5��ؖ#^��l��m��[�e��П��W� =�68u�P�ݤ�_�� ��M��p�"K�}q��fn�V}[�[�!q�e���*`g if��|T��/\w�G3� ��zC�Ulr������QH�$q�}r`���og�՚g�O3�=���+����ƻ��{�N�b��-p�g[r�:�����~Df,�!�>��K���9YR2��v�r�D3��'� ��K�gՂ?h?�r_��K&`t͡���y7��&.�>�t��u�4�ߛ�G� ���:�^M�pv��wڴ�Yz~ڇձ�M٪�!�RW�d�;�#�� ^�z�ʈ����Q��t\�Wy�\OJ14��:5�\���SXT��� ݓ��g�v�V9�UkX,m�iM�\����(n��>E�I� a���I�i�_��,������(� ;.s�)�=5�A�I��(��wX�g�}4Y����Dp�4��{�jq(Q ̷ZJ�U�Zf�K��*�xC~p"�2��r�#�$!�J��zZY�.�^|h�}���z���Xa�I���E�Xg�t^4�R{��f�L�y�p�ᚚ�1ި|�O �2��5�"�t�U�A�ޗ�@��u�R�PN�X�1�ZN���/�ܨ�x�����IQ�×��_�y6�EK���� /������ cuD�o���7դ� ���|2��V�C��f+H�� �:`�w��i��y�~wk���t@�4OE],�<����ͦ?s��b1-�� �J����A�������A2��-=��t�칙C�õ̍�:� �Ba�;�W�CE�Ξr��{�`�&��,'��t�����[8�q�u� -(�J�]��4 ����ʹ5���ay�� hh�Y����.��4�j&���4��a����q�'(��5���s�X�G�jWB���~����cm۶�/��.6�a�_A5���+=d���>Ĺ_.�h����8tB�s��0�HJ��l��l[UH4�v. ��>]�( k�9.� U�A:,A-���w�yʰ�҉��V�jVU�^���}�|wTH�Ә,Aq�0;,�ZD*��#{���l�H7��bRX�0C��d�uBѢ�5�d�=�V�\T=�Q3�7o�qA̐A���O��l�ܿ���!��{_uDG_���rk��ߘT�^���}W�o).8����|gWP�Ce�J����x�6N����(�~v�_�;�Ξ���S?���W#M�˿��^��S����mG� θJ��Q50 �i�<�&+��;��V=�K�rU�� �e������#��,�t��F�jë��Γ�U��|N'uL�����x��&�) �6wrroG�4 ���L�R�� gn��Za�����#t+2�>if!ϥ�)Ǿ�>0$&��q�����qJY\���I�S(�ˤ7�^+�'����w�ٚ�ze�!�e��-���ݙ{��a��wτ� ��K"�Jd ��Ly"F��ջ�P�n�)�ж��w�-YU��6L�8"�!ѡ��|�F�j=c��Ƞ���E����R���z!�<�nU<�Qc������o+�-`(|ɍ ���O,�tcR҇�ӆ���/j�n�@<�Q�g�����4�6���W=Z�ڒ�9���4cK���&{���}�8#Z�X��WUU+�QG��Q�����3,��/�%�Eo�����އռ���d�7z} #O�t{yD"3����K��d��� {Cu7��'� C)n�0{�4�k���(| u(5��u)"�|�V ��Wr���e��n�n���XW�O�{���Bu�WU���,2L!�(�K}���=�� �[�MP)�s2��l�6%�j #\Jg1a^9Q�.���F�/ � y|x��&�>z�|%%N��{�9��cS'I�#�ܳ&�QF��n�๕��!JƄe�e�o},��X�M0c�s9]��e08u�x����B䦂��@h~T$�% ?��-&�=���Es��nϨ��f'$��Є`9��w����vȒ�ߖ���$sNy�7zԯ�3.ɉA�>��c���,v��A���?p-?�#�G�v˧�hm,�Qv��G�=KԾ ��n�k@p*�;r��Q���w�Z�*ړ�Ǥ��� �3ν�եwR�-�`Qz\�ӧ�v��c�<�s���*)���%m�gNܦIy�~#��+U`~�U����獫l'�-q�'��֣����h&ɚ,�B�L��<�g�MIM ٧����@nf��\��}��do����[6[�B$��9-��R]Ղ��T�}�uA$�+�eҢ4�k���v'����^K����6 a;8d-x+���J_�u_2G��re=�?���(�����w��//�(�_`�5�w�/�/+:X}�Z�X��.ruȐQ����W&��eUs?�z�N��|jj_�Mw31���#qJ[u�WF�x�Ԏ�}�y}M�r�.)r�1+��) �Qn�"|D�U)^8s6���c��#���A�;}�/� �� ���?��K��θĻ�G���Mg�i��9^#0��;؎�Jb��ꘙ��#�<���M�z}tum��k��p��aS����� 2�p.A^S1�_.wGao%7�,SUW��Օ 7�md�%E�=,�P���[Ұ�劚���l����K�=3�>h:pZ7ן�g~��#��;xD�t��O���|��tҺ}��&Y9����ƮpbuU[]���T���ι#��U�Fo~�y�ե��j��`a����~�.;&\UB�D����<��j���5y�уo�)]���,���+�]�*�D��89�ż���mS��T�I�9⺹���"����_KKgh��&�\^a=�X���(�u`��mgO,�Ӊ�h}����y�$�ے�$�E�[��b����\ڊ�xl~[����l:�鈼�,����g�\j��gY� ��'��&f)�GL|�ƭ*�Q��pr���~�;�Z��I]�� !<�aPB�I��b�CUxЏ��Eg��C�(�<g�d���РrM{LWҮGh7�9�W�Fɜ,sR��ߕzH7�zϙ�FrcHK����oS���Fa0��z���h�C���:+/����ҭ�[-W�� p���3v��\uq�GG+ԛDX)��'��&M�uƗ�Û~E��ވ�Wp���5J�pGՠ���0��_�ԍ���qW�Ę�� ]5�x�����1�yu�&��8Hȏ'��;��@�<Q�v�8�����uV�<�ɦEY)+��tn��|�߲�K������3*����"���ޫ##��� �ЎN�i"MC�F�Z�uT ���7���y\=�ц�ёc�XY$*�^�IN�h�q��h�<��쇢��[�筆��%���UY��A�G�8�m^��s��u�¶��$6 y�7YVP�߾���tF�(j�:���ڸ�$j����{w%ph�B�L���\=@�"0���4)U�w�' �O�w4��#��N>q��٘���>��0S|�_Ae�g�<2�8�@�+�5� 3�gKp:���E�L�Bv�K����j�:��*&z����0�V >��G�X�CJ��I�O��Er����W����b�$�W+�^j�ɒ�����ϖ����6�H�X#18�ˌ5����ԋ���`�֩�wG�U�,�03 �������̵1��Q�&���g;!��]v�X��~0�a������ ��\�M�����F4C&h� �V�Ӿӗ|���怙w9�}��9�/��H�Y����1��˚�W�(�u2igo�}9�~!V7�;�:H� �xǗ�~㲿��vW�ز�j�� �w�$��kʪe���1Z^�W$S�+ļњ,�-�3��!�cm�h��9����% Q*;%�_���8�FV(����s�߷f�8d�����شgm5@@7V։��!)���^`��#m�܊����G�k�!��y�u訦���(+�q��:��D݉5/��b��w������b+�b��ᎁ���6�}�H�Л�m$��te�1-ě ���G]i�ܘ��$��Q:npy�s�ǩ��B��q8��H�r-;�-c�N�*�r�J]c����G�Y���ucyUk�u���DQ�)��:4^���K<|�XE�ޚ.Hx�r亞�j�Κơ���-�]��eU6���x�bk���_lo��Ⱟuv��oL�zA+�$^ҕ\w�%>�[�P��G<����2���<�U����w�����+=ܧT�2bwݠwx���� �ay�#G���t�s+�s������[�U�Y1��n,�,(�4��c$�U�S��9���B�%�Z�H�\R���m�YZ�,]�KH�[�E�ÿ��/l;�f�� �$�6��![aB�r���d�Z���V�zoْ��n�H��K�VU�%����)G��B�$�E7\f�YֵT��� �Kg��ɷ;�7� w��Bh�)�k���4�����\�r<�zu��t�S�o�?(#�"�*G����<K?�'<i��T?����Zm l��ױ�k�ưC��d� @�P�J�����uU� 7"C*����l�e����A�I����̮BZ|G�~ۙ���Q����ec)XH��#�����k�����3��KV� =[����X�_��ߐ���W�Co����F�x�#)ȁt8�6�]��H��w3,ky��ѡx���,A� e��#��/��t�su��#���8������;g̗��]�[�d`�o��A�l��g#� o�@�^��vI�C������k��r��k�Mp�Ԁ��K���mnJ�6���!� {�zQIVN�r�rE�Z��p��W�w([y���� * N�C�S��!!�أc�����-q���UwJ�=j,�������l�[^sM��u�;כΧ�:}�Ҝ� � qg������cNh����T�v�)W��d���]�]�*I����n����M�:�2�ұ�ux�v�>����F��n�D!�$S�x8��;����;�(���~ �Wou�\�Ht�*GĞv�:��[�L�r��-���y�G�m k�-6K�=�9�D>�Gk����aD�l9�<j�U�r��7����j��*�Nl�����)8�j�2��b��S�-a��s���4d ,�`�8j0_FC*�6���*�[$_\ q';C2lD�I�=#��:�Vp-(_��Ha̹$�$=w�#mC*A�1J��P�%�s�d*�:��% }���4�AR8������zø���=�?Eu,q-��أ����÷���,!�p��N��:��Ő5��V�I4����?>�*K2����J8Os������P"偙�bN�%� �p�xc��N�&ay�{M�lƪ3#L�mN̕&�>��4w��ՙި���|3����}+�e�}����_���,�,A�L��u�[����ϲQJ5�'z���@Nԝ�Z̉�ED�@�(PVdl��\8N�&,��)I]�d��N���Y8+�ʞ�_�w���u⥊�8�#��+�1d�8s6����Ǭ}壯����Uy��fc����+��!)�Ȧ��1���[�N����}3ǮIG��u]��x~�^�ʔ�4 ���qd���[>�,{�1#�^3��ID��=�q$�%�ɥ��:A*��Cg R��@�B��H���@�!Tn���w�l��˭��a�]���ɬ���z5����{z���1�R&��l�\Wџ��g���EIّt)���8�R�Tp*YM�ڋ�FfR�8V�Y�bJir5Fč N4e�gH%�<�ټ� ��n�j�c*v��<᧼ /���U��jao.lG��vA�vP���ؠ�Z�j����9�IdA��v�Ɖ<��jO��3��j�5�Kh�iMt|��en�*=-AB��Q����.|�"?��Ïs���\Z��%�g��t2^L�#;K�0>;���!���SSI��!!��H�>�S��|�B�ϵŵQN�,$�,J��,��y�a�>A���"T�S�M���K�����"�I쫈�+�;;�Ӽ�[���5��*^�1!��;m�--?wb^e��Ci�O{�*���N�C/���.M�s'������f+v�S�'�̘�� T�kO�H�L��T�pR��s�#2�Y��@�2��N�6^T��)u[�>4(n#�*w�²Jb����$Ȥ��F�TxM3,"& �ܴy��Wm�����k!o� �� ��,˒�e����6�G�G\r]U2%��8�WH�� C����Qo娣�)���*�[zb�2�n����ʹ�.CL?��g��l�2�\��#�.W���Y`�WG��>r8��e1����j��B���� ��U���q8�`{l_d<C�hj�h��|�v�o��L9����g���䇄�b�%�&��h� �x��L��){(fo���P�H���~l����8� -s�3�(!���Ckb���er� A�E�H��Њm�q�ؠ̮�x���+9&V��HLa������jK##0c�e��[abh�@�/9�����Jy1�MK��:�5b�oN�K�T��hw���Q�� ��)坁�( �i�Ƕ&p9������F�d�I���S�z��Ԣ���uq�g�ݴ�VD�Z�&`�W�::�*�^�!�V��p}�����a���,?���8��晛�K��_���7�g�?�r�W.U�[���c�>��9)\�<����r�.-�^� �BtR@�͓�f�8�w��<_I���a���Ɵ̢��(��C�U��/)�\R�~���?~ۨ ÿ�dZ��ZەGƐ�����rg���Jp_�"}�Ie�g�����̒6-G�;����K�>�$n�����+��L�[��o�"�N�>��e��Y�f��C-��\Qz��%��se�g����@��%��� I���^������*�Ӭ����D��<�����!��0�O! �w!����ޞ{����D�S����r.��~���B�z��+�B�mA�*�+y����(k����w�_�3d���V��y��4/ܺ��Y���hs�v�zJ�0�a�p67��X��6���� ��y�n�o���}l��k�n�r7 yyh�D�bK��S�OR5p�8�.T�a[��Y�hKHCJ]c@�/�s-`ϼ���E��a�Gk�Yr�ʇ�K<�E�e��W�V�RP���t�G+$�д� ����R��b��͇P��TE[j҅� ���*���NU��Z��{�V<�����Q�����w�*�?�Ӄ7N�s�O�� j�$�0`۱���/�N�K�]ϫ�] iZ?;:w���<����7҆�҇��ߦ�٨nV�wl�}D��A�%�yv���+�w$,��Xl>�/j�1�'$Y�F���\��(���AЃ�]x�i�Zk���$5��U܈�?Z��N�:5�Z��C�'Z�ܤ�}w���~HE���VN'�O:�R��|J%�ء��C.^��ڎ�`��g͐(3!��a �[0ɘ»#��c]j��)��`��rsJ!�*j�c�f`��o�+� ���;mx���x�� �2<s�5��@�HT�}��^��P��:u{��P'����/���>= }JKo��� a ��XN�-��K�;xL@@����a��,�����u]Ϻ��U,Y�;I�a�˯�%y��\ ��#�2"�d���aE>P�~�?nŠv]wZ���Y���a)���3�3t2������T��۷MN�6=�?Cݹ�ސ�d�}1�y"9�gV��˚!Z1�qz&�W��w��-f�R��C|K�>���'�cwA?`6$,�|C�kٝ��0�->\�#�˽�����5K�Li�Tom��\[کNJXu�}ꕵۡ�x���[@4�u� �g�����@���+�"��R.AS�T�+�8S���3r P,qݕV^�f���b��ڝ]d|k� xtQ�ä=�:�qC/Ѿ�K�6�9@�̦��8ۃ�)��6m�k�ϋ�z{�v����C��G���v�̠d��� lC�ȇ�`�h��r�����.�S�F�m�إ>2푈��n��\�y ���3�k��43b�?��s�Nj����T����%�a�)���2��}7 ��� I��� }A6m�"o'�iLI��I5��y��?����|��Ue-�Ң�hb��=Ϫ۱_�*'�{��h�3r����y":�U@>�q��|J�!�������72ZΝ�� ]�p%}��,r �T���āe�u�1't�̖X�m�٩X$:Dl>�O������KX[�;���4E�h!�BA���j�Z�<|:f����^�O��h5��a� ����K�����u����/bz�t��w~�8i$��oo��t�^3Q?r��Lˊ�f��o��In�H���i�qUgg��)Ӈ�i�-a��ui��4,a{� n�Y$����H�kJc��J8@�t1A�y��8�RQ�)(� �qr�<���'T��2QUE��T�����ԫ ���*D<!�⥘`��]�0^ߢ+=ǫ��I| ^�O�ax��'��D�TSR<=�O+_.��㨊����d��'�� tl�9���e5��,ƙOv'zz�{�S�]���x����j D]�âKqo" ���M~���7��*5ׯ��S�p�E���B>WV-J(��YWZ~]�^��oP�6{ �[���=<ozQ%��g�fx��>���ʤ�Ɣڗ��>�����!���C�/�9���ky�y�r�L+>;��ʒ����[�/� �f�n��>�O<�1�#r��y�w�70"���a�YM��0Ib�8H^-r�i� a�B��7�N9�!��gI 2�iOB���*{Ȫ!�&�F�s��S�����mt�*V��ch|��ʢ�&E=��E�+��BJ�&Q"/q�d��"�8Yn�����$�:����W�|�8���a�% �F������~�\����\� ���=��w��帙�"��i�4��}B��W3�߬���[o4Yf��"����31Doڔ��r�]C���pϼAyl��k�7S L��j�� �@�>��s�%���0�)u�A� �9��-^{#x�/�ަL[`�0/��(��?¨Y�)�؛a �wI{�d�dC1������ڐ�G�d�j��<����R��0�*eYC�NsI(~.�D<��ouwϪ/۟EP�q�{��cۉX$6����i��E���<�-����o�mp�V�tX�b�K�ͻ���/�mjh��o��2,;W�́�x�I�gƭ،90s��Q�NO�� �HP�1�'�gK�,-���"�z2��ט�m���q Z�(Ez�QNe�sD���=Ն;�,c�P�_"bpy�Ik<Ɖt�,_��B����-�q��� ��ܐ.�_����h�"{��g�G�j����y����;!X�;����C H��*g�r-��;2I;���d�T��X��%\�fT����ǚRs��m��-�/,���;U��U�����v-{���=�nO 9���k�U�땐������(�ndz�Ii���P_� �k��a��6d>*;�� ڻ�{�V���q��S���[�B�O�l]yW��MRZ�$.��%������qj"�̙��.��9*����H*�:�H��fc�Ep��R��o���Q#"h��tL��\�V� ���Of������}=Q]��L���H��|�<l�%��C�6h�%`t4�5{�)�D�$�C���W2M���F���D���p����VI4e@� ���G"�����S�]}��ۅ��M�b�F�)�Ktݸ�����Mq9%qc+���9����sf� Ѷ����b�!�t�Oe� �^7u|�P����^g-jъ(B� q 7�~���?V\x]�oF�og&�w5O��o�,3�۪lLT���õ��Nn�U`z�\T����d��S���\��k��+](PX����x%2��_�垘�2g@�E����g��Hj��t�M��M�6�FN� �c^���ٲ���c���-J�D�_�.+�LQl�O��d�`u����;��֦U�b�h�+�}O�]�����ډõ!�bh� �����y2/�$}-4���-�����}��|�~\��/m�ڈϱ� ^�$2�͔�5#��\�P\�kX����txM�)ƕOl�)^�V9f+�ts�j���˗##��x���?g�B�P|�Cv �q�?/�&�����yt�g"�g']�OIi�W�vd��/����n����)�0���P#X2?�Bdž��)�5�sb�b{t�c�zc�7�U�A�Ԓ1)!��(����S���,�4���H�C�$np?$�=��i[��~������YX���A#�_0�����j�%#J��8_���f.�����-Ί^�.��' �du�����x,=r�#�e������*AZ��݅�[S*k����촀��HN�T��%�E����v�A���c�R�Y�6��d�̻�Yܲ��������G&�c�<��o���&�l�wu��?LHZ���n���M)D/�U�qֲ;���;� �쏌���g������)��ݢ�������yw|^~d�l�&ɾ@��S �lև�r�S�Z�.b~�� �~��ey�ye���f�i���S��ԑDT�����M���O%�,%d,�L�=�B��-��1�;,��{�}�,Ҝ�=��s��n��=ǺOI;�$���p���'i&k��7���G.�����t�0�r�� '��b\9��r��� lgjO��-r��l�c���7icm+�!�D�]���a1=Ѥ5q��l��l��գ�%���ґ�j� G�dT �v/�� ��#����N�^�x���B�:��W�ڼɏ��E�vR4q�U=zjUdARK�]����hl!�W���uB�� m(c��' He��t��o{R�}$oEb��?����ˬ�A�y�f���C/Ο�{�ֳu7z䒏���XG�v�����-W>���_~�kϣ���v�rți�&!�*)��rI���b@�쪖%M5Нs�!N���=�3h�%`�U3����yV|���p��k,6��խ�]+{���EΗ\��^����yn۔.*Qz�MO��տ��D���'�T��S\�0�WU'5���:�#�h΅A%�EZ�ʜ5b�Ҝ�6M.�^q���Ӷ�X��(��1���]l���(4��A���Ң�ۋ���VXkv)^ۚ�n6�e�Q�~�q`�a4E������l�Z{!����e�ٹ�R��fm��wš|���N�wda{%Q� c�y��g��R�����A9z�X�BN�|5�ّ��O��49_w��9������.���f�o��(�D��\EPl��~�P��ˢA�'��Ǐm���� |��)�]ˍ��1��<|`){��y?�J;|Ɠ�=���J7��M��MA���~we����H��b^;+��4���T��1纲ѳ�'ZNWR�f�Z�x�� R���}�����E�ڢu^���}� ����=ּ3�CA�lC\�'EΩ)�.�b.-��GB�����HA|ZE�y�˭�y�H��:��$��'�X��v�3&�y�VQJ/����I^���� �'4Z�Y[}>�ēn�����ѭ�ţv�To�w(�kxǂ� ��Կ�^gWzۼ�r�1k }Pc�.f�ŝ��L@�^�-��7�pj�o����rͤ�DⶴppKt��r��U}�$gmJt�AP���v���h*ٲ�͛-���Z�v&�dH�j|4�P�9���?]]zw�� �w���L�����z� z�����Щ!�.+',z�b8����*߮$����jΆ,��7�bC���o�/�]�E�h+��#PN��: ��<�D�S_S4;��LG������V_�!G��8��ʜ%���gq]�wX���\z]�B�W���λ�z��TS�v��l�������V�+#��ᡜ��������L ��W����ϛ=�u5�f�]�Y:�5tgq8hĢ)����+��<5d��P�:9�?tun$�{`�Y���?!�&]ܳ��p�a���R�<�ұ�nk}�DpzawY��$�z�:�ߓ�Hz�����dY�Gj�a�r�>��qE@��G�4�����+������5|��"�E@������8�x�y>�XqI��3%�4&���Ueѣx�ޜ+�V[ W�?�$�U����7���H���2�ܘ�m �&�{}�3�}�������`RU��=}ii*��"Q:��, !8��6�ܤP�'�T�s���rvw���MDKOx���inM�'\W�� mF���f�P��O�V� ��\����`���%~�J�JvCm�8�kv9�E��g�fv�G١�w2�0�$�-�\��I�MD7�Oۺ��rU��:Qڃ�1<;� -���:�z�^%�q��B�ZK�QD���{җ�x�oe%�*p�7|�-t<^�xأ�bT��*n��}�ۙo��˞�(��ﴲ����\���^(�Zn��3�f��Z�,2��:����"��n�@{��8,�-�^��wQ���R����E~����'>�@^U�>���W5��%3#X�5�"߶縵�mw���#,�,�C�8閅�W��O=Ļ��H�7��=ζ��:+� ᓞ(N�<��n"];٬�D +�M}�Y`��*L��vl �q����Zf���u&��-��A8�M���������6u t2i{�5���k��� �v@����Jgv;1ph�Pu�2[�p��C��Um�� �^H��n�|:�}���Jt�8��2E����l=�U-�ӭ}����0��s� .>Q����x��T��a7$�m�}�;aÿ�mk.�4���7���Kt�B�{����Z=���+�I�����w��oN�.��R�"k�O5h��a��C�K�0O���P�$�/�{q�u[��_f�_".�w�y$�8)"oX�;3�4Z'��G&���o��5��gȬ [�푂p�x�$~VlYy�?A:�O0O.?Iv�{��~l�z]%��x��դ�1�G2�� ͯ�4`1w����^��"B�~��<k�h�:���&�9D�ɗ��@ �I���4<�l�C"�`��6���7Ћ�콀{�=V�+�� `��T�U0딎��s*Oʏ�tj���y�2�Ϡ��|*(Tw�l�d��b�nQ/��7Z[�i}�hím^��W�L�m�?�,/okkX�Ft�����+�-��{V���X7�NFd���39�ȑ�V��{\��o��o���7*:�^�.f��=g��� ;:uP[�u�+�Z��P��ϸ�u~({��������R���ʑг%�?�L��'m�O#��8�x ��$N>�|�ߖ^��y~r���ۙ|�,y-�n��Q�ߖB�N�"n���%;Ts��B֭f� =3�EXX�7�W ��s ��i*(*+"AC.��ڥ�+�:����WR^m�SQM��z+�.� �sS��!�F]��bZxL�}N��N� �$��pgv��E��mA~D���Ph#�.�0k���㲧�o�n��?��֭l���/Ox��$]��L�`.\(�P�+:rj{�x}cO���#V ��̥)�:��f���(ý�Q�� �ǀ�*��[�յ����~�-`h��1):����ҙ���n@-��݁�'>c(�����>,����U0�.Q����/��sU*�k�ޑR1&&;{�=<� Q���dÅR%����R� �����F@"��z��EG1�M�}<*:Q�5 ��zW���՟���D��Kj~�_������[#������Z���/��9XMF��ۇ{��7�ș���ک�����+�h����sDf!!/���y��{ܸ��=��g0<���)�8�4�T�Mʦzj�^K"��$L�+��!^��\*��d%\��%��N��s���$���Z��:˼��&�,�t'U�}�~�#��� �\���ɝ��/!-�mY�V�B-Ei8ɷ9���2<��S~N K۩�p�'�Â���*�֜�wcWF�c���K?�ZAJ�ƺ�p7Է��b �i����KL�`]��gɎp$l)�q�����ҍV�B�C�*c�K�irz!�3�ڇ���|0��F�� `�Z�B�Q^��z}"!թM���r"�[�R���M?����� �7��� �dLdH+X��Tp�����;��W����3��k>j��W]�[��т�QT~�79�E�<�r���jO>�3�Sѧ�B0�n+�\q�\Xh�;ed���I�x��6�>� ��XC���Vr�pN�F��K�|99QP�ba-�~ $�GnX��?:a.pf.!®C�f��߄Z$���� ���ݞ\؉j����rv�b�1��F4 %B �B k"�r�,$��$��\�7K��5�s��n_���+����v��� ��P$�ϩ3�/��x�>J��aw/��T�i�X�F�N��)@��ԅA����K$r>�G�nc Q�R] ��]e\C w^�ʺ�W6ު}LB|��ұ���61�R ��pn=��b�>@k��D�R��ƌB�<d�D�OK���gzJ�2�mo��zMnE�}EKG�W�䷔H�C� i���3��<I>�MQ����n�h��5�0�qb9jC_�~P�o��a��ʀ�1�>bש����i�v���63u_��;fj�/1'y�9�D8�a� ��n+.Z��fq��>�Z���T��Οά�s6���� ���w�V�@)������w1����`�h� �|Zw������U��i�a�{�]�"��5�X� �M��DXfl|6�b��3��Z=c�d�dž/��bWO�����g�L �Á^�~Їo�;Lx��0e�_�Z��,���Cõݷ%�"����({���>��9�6?���������C��`/���}�G�(?���Zi� �6�m�� v{L��3�Z�[a��x���'�96!��1�2�'�p���ͥ�[�˔�)�)�L@ƙV~+r���2��ʑkk��9�Z�� 0NG����2�5r�aQJ�#�+�Z�,�O���h�O �:��X=`�O��0���ߋ��W<�N�;��{[�����e0�^�G���ݬ�-{:�&ܖ�V�O=t]����4ƏKF}1Q�WP�y�@O�~k��[�+��c��D�����@��k,�UB�#ű&�rC��e�,�/at[XOd�Ԛ{-�@�a�i` Q�/� ��B�X�I�HU�,}�Ȥ]�Oy�,�����tGd���.@�뾄���}�ۀ���9S�U�W�!O��ҕ��`h��?�/�=��� �o�"���:8��A6VK�#��X�����Iq�q�K����y,Ѹ�:^PAu~���[��5���<�`d��l2u���v 6�5b��ǭ���K�v����o����� �o�� Iѐ�8��0���M���� S��N����&Q�%�����x["��:�v�EbJړ�0��K"�`�G^���!�ܾ�3#G����WT�b�Aý'���4I��Io��5�K@�d)ƻ�H9eW�`��p�[��':��q�\}���4=�@D7�Z���w�Y5����06���Ә��В� �*)����z�G�S<.F9"��Ca�!z����[�~�P>��ݴc��ZB��b�4lٟ��s���ԳܻY���j(J��՜�:�qZo%9" ����]c,:�Zr�PA<�@p�/�"���� ��g�]�[u�o�W�(�AǸ3aI�L/��)^j��_��s��;�_"����K�Y� mĄ�"�oj��=1H��f�Τ;F �� U\V>��{��9Yc6J�?x�̀W�0M-��7�ؙ���HrV�2 ��I��<�����(����� 5uywjBt����A���֏o��\e3Y��L\�ʺkl#s�s���˯�G�b�/k���BZ0��r�D�h�D�q9�W���z�C�8 @���C�4������.7��U�{_�\���_}#!|z�(12�O������d�@�C?�x7�N.?y�jvGC��Ҍ��"�ʚY�lC�`���2�'%��b[iܫ6���hLF� �HO]������ �M���"��U��1�P�� [���9���������X�� �|U��B���� S~z|.�4���TP��{.��b9�p�y�-�~^z�� �\��@J��X`n�bDWpk9_c,:�2�Ya��FμҦb�1���DLc�a�u"ҝT�T�7+ov�z�Ӏƣ<�n�siDw١/�ţ�����3mW.�{2+ا���t�b��J���c�"��9����ʓ�����8�lɭ@��Ѥ̤%�>i�����O��������~��}$��f}e���]�Է��9��9y2�6WL���u�SMv����q��9t�)iG��0���6��G -0I�#�u��1��}ŭ[c���z���6WŁ!-pi?K����8�'`�PCrr������p\���B;�k�i��~8�߯I��{'�D����ʪ�J�"am@!�B��S҂��� �?{���łk}�Mq�W���W�,/���R+O��C�[��Yw3|c����k=}Q����c;Y�4���������ed6n���گlc`��,�ɩߤ@7iM��=���Gs��4g��%�rG���p�H�C5p�#��S/ڝ*��� ϓ]6��}�N�x����������Er�P?Sr��b���O�{Q��p���h*L���b���YS�n� /�BZ�;}�m~9a�4����-�h�[�����͎ϭ�J$�1��N�&�|'�c�䬥/ʺ��&᧥�,��/�94� �g��)^D��/�P"�܈Edӽ&S#��pK���D��D�� �Ț���M�9B��4G��e@�f�~;a~�WOk �CL�� T��|�;��v�)aH������z�=lyN��S^���xG��0�f��x!e�Ƹ.�9����\( �(noAiO�@ut:)�S�P�U6�&*��B�v���pF~�[����@���]���J��a0��dT�x͊Z�С���q0.�W2v���1hd�-CZ�V�A@�G�ñ|g;��=E�4�'K<�@��|��4^�q |�\���V���1p�%[�#S���#�F����#��-�C�I����̥�+\),�Wyy�:#��s�Q�����P^<���E�/�P����Ny����ߞ�?)��e��S��b: jw�na����\�T�]n>,��Jz���F "穼�ƹ0-���h�����q�(B?���Z{)���6{�o���ݔ��2WC��tˋ��g�5�T8�����,+O�e0HU�ܺ�vRrA�D� ��6���ř��!��D)n:��nc �a��=2�ݫ��ws9�O�Y�V@^��XI�{+���#��b�����W��y+@% ��0.�{�'~{d�z�r��/�ێl����L��*b��d�_����Ec�f����a�"�sص�- ��v�$�95�]�&,�̋�P��L�Y��$8�>���=��[��w�<* C~�$\���Y�Y7��W$Y���^��q�F%E����A�W�Q�7�{����EH2�C�)C��u͔��.w9A�Yȓ�K������c������d �Ị�<����w��TPN�wb���ԡ���"~H��6�6�_�0wnDKAAN���e9������iFVg�?����#���|�����ּ^2�|�Ś{�A&�X�|��[QhY�^���oG|���#W*��fe`-�ޣ�\�6�i��˺�.tu/^��y���kA�������/�˙��5��n�nמz�]1���Z[ϝomV95˅_�6� e^�^��!M���M���H�чVx]m$��Տ�KJM�4F-��oQ�C����2����3q/�T�]�)�<6.jxo�/|CA^�[cB�2��|A �{o�1��K{�2A`O��F8��;��' ��9ƀ@bR�]ʷ�q,V�o�<*�l�^�ܫ�QcT��_�5?$�U�0_9 f��)��C��ץ��)���י�P�["q,6�� ���<sZ�mNv. ���.'�� Ԝ����}9��P̂�$ ���h?���˃2=��+.�#G=wO��G>�#�a���cd$�\�ـ����ݻ���g�y�Z�g��v�b���Էaz8�{ț}Bh�A�{mD�����.��'*K��Oik;��D �#�����/h����;�@��± !��+�ګ�-�c�kn.���v�$?:���ܗ���b�{��az�K���ޣd�GkyVֶ����Z��ͥ:��'Z�sg�.�O\/+�i�.��5j�>(��=��>��v ��w=7\�4���߈y�~)��qNKs�s~�9<��k ��{d����o�Þ;���Z荄��A�R�4�vríḾ�Ѳ�ʀ���&�_>�p<a\&�R�_q���o @X"P]TU�0y��v�v�w��t�]�U�i��<C���i�x=c1v79�(f� �M�k�ڄ:�'ڪ �I���`|y�9D��5�n��U:�C+/>9U�F(#eI�|�K!���В�l0��36��n�LG�e*6Ne /ˌ�Ԏ�Ūjj՚�w����e��7r|т���֔������讞�� �A�Z�S�Cr ֔B�I��nt���~�-�#Z�V����v��L��Br��"9ŗ5���9��8V��x�h�_d^�:�|xmW(��~�� �M�y�+�)#%ʂ��u�����~ޯ���щ�*���K��X����<���g��7|`����z��H0���ikY�=2�����n _��u�X��GWVҹ����Y]/K<J�Tdn���Y���JM6@��rݍ��N�bj���D8�| ��'�+^�j��t}����bFAGĊ���̃��/��c�D�;'f�{s�)y��'� �K17���E��m�蘷Ҕ�k�<#���ꨏS�I��V�:� �e�8Z�(t i��@>�8[���4XL��{��J.��. 5|E��^]sҝc�C~���L@�!=�I�uz�m�ʐ^��IU:���d���a?a2h/���i�y�;��nQ����o �(�����&�=X;-�?�vkC�)���fm9��ҟE��f^��-MזJ��=�4o,q�˒�i^�X\lX�ۓ����{-:�������V{��??�&��*_i��]�Ţ@����T~�9{��U�p��M��Xא�j���S雩W::��@V�Vپ��=-��}_e���y{�Ď�^�g�if�h�j�r�Ԯ���0(��w90���{�T�,OT�<~ ����>ϷXVX���8��^tΪ���/�����y �F&��$ZL����ȏ!D����Hn˃8�m�����L����:�d�J'�!c\?�<ƶ}���@}���������݁ "'�||�2�_}��W 3:����}6)X�.�邈�I���e�mś�[�:ޝ��r�m��L#hd ��c^o����;�6��a�!m����L�S��� >�n��N-���j'�9BP�B��"7�%"���J�<��Z���)� }�B �[S�����gԓd%���7 �O�M�mf�Z�dQ?��8k���� ��8V��jW��{z� �5�zՄ���ff2!�]�J�7�����3��Cƅ2P����,�Mw��ǹ���*)��5H�����% s�9ҏt�I�TH��'�~�ic��K�"�~X��=~KH�^�!O�q&� �"�^���S9c*l`t��12�2�Q�d�@���Z1�N���[ :����H\��t܆���Ce�S�S�R|D��XECyd�hp�9@<(�+�����$̙4���;.9댋)5��d�e�sz$���U��f����{��<&�v�$���b�)K��W��T�����R�8Y�j���'��?K^GW��{�o%8���dw������J�g�M�z 3.��7S�[�^�n�?�ԣ��l���C9�Xd��C?��5{/�����{/���{� �2D{D u�wo����̧��� �Cj�c���T�#Ț����y+L��@w1�����c�@�]��?�|���K��9��d�X�����e,r���755���뼼�ِ���\\5A��� �7� �[��B�~����b��s�^w�E)`sOrя)eަlCZ�@Kg���ߝ��z��/mi�M)�|D�R�ѿ��=���/��|��pzW�PC<��x�u=(9�m8m؊�-LW��.n:�Z}w杠6� w�$"��O5��t�5����Nց�;&̢� '|^0���R�.�T(|$p��Ȳ���!��M:� toTĦK���MH'������O��|2�6N�5�k 1J-�1�YYs��ViU�8o��fYp�s�*�l �/�Evs2J��/�?|��Ÿ�F�b-�VAcF��:���l�l��{类�.K�M(6MYW��,3��w���Ec©Q���< ���CT?�l�7UZ�����*��{E��ipCT�4�c)f�(1/�Z,�O��,��T�eE��C���kؖ��K�,�KH:�&��#H���D5mrH���?3�Q�F"���D�Љ���6��ŷP�>��� !�Uq�u�.��f�c�^�t��X�\ZZ�J��9V]�бو+|�f��q�,��ҏ��A�_/儘�(#� :�Γ��k�Q�n��~C� ����<�ϳM�f��ɥ�$<;���e����ڤ1%��i���EUg�q*;�R��1=X��hW`�VU�r7���.Y"�q��y�W�(�M��&��q��ψ��b�)�c�����Anj�I�W4y��tҝ�1���Q�܃��j� 6���W!h�d77�"N���˴��:�C�M\t��i1r��[?Ѓo�{�TEz�r� �6��k?Z���Q[���7�/�����V�{.�=ծ�"�+����9=� K�Le,`S��w�9oW͡ɓ�l�� �_��G�׆aR�0��e����_ǁu���5��X2��k�>���[�:��k�ї/7:�YÒ���+W.1Ad�e;�f��4�����Y.����H:��^����θ`"<�H�W��G!�u�M�,�Z@LT7�cC����ގ��� ��>�7%1��$E5��:D�kP����2r�@����5�����ݕ+�Z����f}��G� 7���R=�4GOb��T˷� ��ώ�#_�w�Taҳ�j���t��[����H� �-ys���G�d�h�Au.Z�54N^�����R�ӲG�2Qё��\I����>�]zP����=�>';��r���?�8D�x[k5j�4I�T�U �W�0�*����hڬ�Fg��LRg�X,���cA�!����*��}%��s�Y|�{�F����+���u]�$�_oI�r+sź�v8��s����R���?,%_��'N,�8+ ���kħ�F�gd/$[�5�'��Z�ǡ)���A�{P��� {�2d��fܥ�C(���QU�g1�r�\;�H��b��b�τ�����e+lI�"�"�Ӝ�� �.�?��>ik����V2Y�r.��6�ы�<�OF}K��lc�+$�#˧{ɘ 6S�9Ґu����d���`���*�ٕX���5�=��e���ou7~�4�-�x��f��&�|ۼc���;¼�,�Z�_ݥ�&k㯩���\&��cwF��c렮7��ؔ���WK��]�}Q�Y�:��HA=r/KuWT�7���Voi�������;�Ս��+�ݖO?e������m�+�9W���*�3���M��u=��-�ZR)����Q�v!E�Qa�(9�P+Bv�{@�E5�*q�]?�����vS���!W㐸�7g!�N���£Ir��WO���ԇdmb���W�B���M�!��*I��>t�3<Z��o��30X������ܧ�?�y��I=�5`ռ�4�j�M,��Cy�=�o݉�TpGX��Fo���~U�o���+ZmG��z-�V-���;z�i���ʁ@�5~c8{���n�PL�T�{���+�<�T4��B��-ܾ[�@A��d/y@e��A�*m�hɛ��03�N>�9� �3��D��˓���ʬ�������y�*{+�I�fD$5w����[E�G�e��L�e�ur�H����1�����T�~ΧtWyw�$vsj�f2(�d���F�g]kSz!~�']:4`�lyi1�Yʸ��7y��T��)IJ��u�� ����^��ճ�ķ�'^D��v������IwN{+$>�|��ؿ�z�Fd����a�����O��bDL�{̬��o���<5|�ʐ��-DI��ߚk���y�BoW�+�o���^��'^N?�� =8\|7rp0�~Iq��X��������3� X���dyz��l���0�E�p)��K�d��BĔ,�D�K��Ξk���m���?^$�fRd9M"Q��%��ƨѣf�H��ç�]�9_R�U��Aq�}<����=�^��F-ڋ�V���욽Vq�*ĝ�/s�r��������u!`D����[I�w�=) Ek�v���kȿgou�S�,`����*糣:�g<�N����Ͼ${֩ڗm��ߕ�˻:7m�L̝VP� ���Zo�x��\�b'C��L}zq!=Ew� h8���t��[�F3Xc���Xru�.�$K|�3�b��8���r�ҋ���?Mzbި�A�ԧ?�k+Q��=�JZ;T�gr��]M{C�}BK��&0��F~~�Y��:�P]�\�� B���T�*&��,F�u�U�y���`H��n� n�� F��|�K�ln��x��\.���H|���Im�,�i]�&�+C��9�DZ���7�+�g����Ds��>���������mb�|{�{q�Ouye�ڬ(+7��oʈz0'�#2�VQ���ǗM�E��}� ��LK�4��~�I�:�ֲnj5'J�e9wse>{hP��g���,��f!�k���土^��Ɔ��l|�w�u|Ñ߬�<e��͛�ԝ|wZ@O�iP�� �l�ns��S�֔���L��|���Br��%I�Р�u֡;E��R,���Mj7���l}�-[���`�p���ɮ�0ف.u��I"uCC6�L���N��-�J�b�;B�!� ��~)����4dn�dNj7s�'�E o�9J� n0���p�3�;����̝�07*]�R݇�Ɖ�C�� ܙ<?��4���?�{t�q����������b�X��ݰ���e��m�7�� � w�v�C��l�W�j�m'�|[d��>���D�Q�x3Ck�p)���e���C>��Ԟ$�2f=����:H�h5ڢ��hF��L�,@��:�����E��~7��BV?Q#���3QA�.јڬ��xW�uj�T�a7`N�"�*�kKbY��JD�: ��,T����3sq�%̓!L�ooP�M�Z~8_BU�h�2|��H@�����m�Ej]<��m�� wFɇ�|�![��$��Q��#�z����T�֞N��6� �讎�HNb!b'r�V���!R�n�&>w���w�������)�rR`�><\��|�a� ��+��Q۹o���=b$Jh��ܒ"A丄�uu?�\��hG!�7�˽&K>��p50�E��*���~#>ĤR�>p8%�q��{��}�#��p����q�Ϳ�fOG[pVa��rN�v� @`H�r�r��UHk�έ|z��g,t��Q����ͭ�Nb��)��Y�0G�}ws=�?1�]�Ο.:����X��ӻ$��V�ލځsw�/��@�@���{W,}v✥"Ըz����EIIK�U��ŏIe�P�`��fq�4ꒀ<Et�\|4:C(zm�;n �ih07��1(�XX�b>�y]%]� �-"Փ9�s��zRi� ٪Ӎ럤1�!�Sj�3 ��^��-S`Y9����%̥ʒ�>�2�.�-}�pѷ��7��^�-R��2�U�[��KV�^����j��]�N牅�a��"}���-��|����� k�2a�^����!b)-D��*5�7ho�Ѡ��J���?\ζn<�o��Q���0^�06�%g�>)�f��U�*7���U��'��M$+���6_7 Ԥ��Y�|j���ip��UzǵA�������[���.`�{f�"[ꨃ����H17�0��u eeɲH�k.���a0<�bGQ�Ji�%��_�+!���}W�jۑu(Gkf��EsF�/�r�yy�#�X5�F��H�Ʈ5��Y�e��8<�1g휨�}fP�}�,-�^_�J��Ϸ&}$��6�vƸ����e���o�0��?� {�d�"�+�=����*��c�y��xy�Z%�=vS#C��9 p"8*�^Zx��7S�͊;���s���_"�̯i��#'�+*�q2I��yl%��E����^[Ɖ��7�8A�-�4�㋲�.��A�uF�EOZ�a�;R3G�F����~#��T�]\{jg�W�X�~�<�pDm�E�ݭ���Q��G�C���=p�$sC�T"���Y�uG?��1zˠx��i�v�5:�h�`��亟#�*�����,����f�#>3e�Tu��u+(�l�:��*o�w����Q���ʑ��GwE��8���w����U��՛�n�K�-� �͎K�M��r�9�]�ay��+��2���p+ҹ����x��?�_Q{��(Ƕ; �-!��1FR9n�f��!�К�����?n�� cD$=K��n,P�Yg��xq�ͩ�'C�� �}�G�%3Cg�Q�Ӝc$�n�%lcf�Uˌ�N�^�ޤ��M�-�'KV�Ϛ�9�y��e�z�bQ��ȵ��ƏxT�R�Q���5~ ^��u9g��3�f �{��&#T��u�H�8%���2t�):�N#�s�??%��?05����љ�T*�R��g�)Sאy"҇SAܻ�錪�)q���R�K=W�H���=��.(<���>L}�,�7�汫�Ǝ��P��� s�+�fI��X\h���;s�b)�.V��Ħ,��|pU����YY� ��}�0ӐT�z��q�M�eRp���-NS\ �.�]���H�d�v�i�dK9}�dqz���K�5�nX e���5bF���6�ʍm�C��@;�?�{R,l�=���p�e��(��FM-��c�<�:G�Нn��喊����&R�aRV��z*/�ҴT�#�H6����v���#�I�(����V!QҠ��G���߄�+x�m2k3����zU�35հ����2o�~Gq��r�v �����*� ��[Ւ�C�[~:�m&��$�4ij��B8�4|���؍pH��r���+ƺQ)���I� �<Dmh�� l��H�7Iy�C��j�����AG�@���^�rUe5��ôc�G#[!C�"J�Tܻr7+LUʻ��|%�#N�M�6�t?&���B��D�o��;�<>��g�H�S��ba-ui-��l����/о�0�\M�}K�?�FdD��{=�{<ԍ���^Ѡ��;��|x� ��]94j���Fa��f�|�l\�Q�!�r5��3L�c6�?a�a���5�c��G|�-����ls^���8�%�6u�O��9�Q��ǟ��nXIx����4paܽf�ζ�K~�?+2yIb)��;�(��J���Ε�FH�����+�*1&"ɰ��ɍ���P�a�%'o�f?���cO�O�K����8�Vz��M��é�cg��֧�6Y_}� �o��m��+zgT|�VQ?'����"�x��R�;gO^�L��8;��q���a��ߘl�Lb�L\�Ww�>k���~[gwk��:��>2}Z�B�{��W ,�w�&�S� k��a@�Ը�?�6>3����n=)?{�2���������H2,)q��H`��ޕ�3jkTĞB���?��Qm$%�)�����}bU�q_�c�qY -����_�1Ӂ�)j�?���E=7>��-9�6�l���.�� s�x"�h��c���[��y��7�?�N -������ T��K�����7�9�|�Ѱxz�j�gmh�I�n�H�o�g)�v���~���� C�;L�Jq�u��p��mW�<���˗=l+(�lCP���m-�[I�H�HK(��|LQk�g�ª?C�EBx��}QN�"��;��FNU��cE�\k5E�G н�^Jv�<�+��Dk���r�K�C�N �w¹*�{�����Ϛ�>��j��h��É�W~{�|�k�ÿ��$a�=�����g�1�iz���f҆M��m�� ���z`��0X�*��+G��n�� ?J�>�[St�d�>)�`zdM���+�9���,Z', į>cu}n��mĐ�N�=�z8$Rգ�3�c��1ME��K�Y�$���������� 5� �]Y<z�(�����:�Ob�N��A�E�5إ,��/��-���D�ʰ���sU�2 b�C=���(�F�sU�;ˏ(.��&��@÷?K�*ؕ�1���E<� �|g�<�%u" ���kC�D%ʫ��p�zE�]�h?�*d�Pg�\�R D�ć�U�$F��&�i�橇�Z>^=xܠ�KHUNy����xU���q��Y��d*�gg�mnL�%��r䰼!�@��Z"��["(�͘pf��k��"v���$�ρ9&L�I�Q����V�:���WIZ�k�7��TT�!�X�52Q���I��e(�Z���P�� b��}LL�ϰ�:�.'���T/�k�S-�>���l��T��5�}T�r��#�e�(��S�G��:�'Wm�P 8��oV�V����7S*��6⋫��-���7k�I�5P|-�w����S�X�����-g���`(�T��zI(j�aZ�c^�w.��8��g-�fV���]hl�3.yO�u�2&������8EAD|L|Z�3�ɡ���2�]�ۑ�5�KqO�[�شܵ,Մ>�k*���j��sέ� *��Ѯ|\�A[ ��T����O��=5�@'����z��=]Z(CGE��fM��8�G�W��P+q�NE��m�F06�8Z:b7���-�Ь��%�{��Ch����1��^t��m,R��\��H�T�Z#x�㮽���`��Y�'���}?����}��iou8�K��P1�����㥙夆C����������Z�"�8������@x� µ-�``�Pj�}6Ll�R����U\�6[��CZ�����N�"��*Y���=3C�Ⱦ3���ڣ��x~���,ce�G��;�,5�R>U�w�6Լ�SAR7|aq��u��^�ځ;V�`ۼ<��V�����V�HɪE-�3��t9Ʌh��G�;��~V�n<r-˥������V��?�%�asR�1��>:����{�~۔x�9:�7N�+m1����f75dGr��z��ZFݬ(:��%�P� 9�G��a�xLI�rl2}���>M�n?��K�wE/��:T�@��Y_���a���^O�ME^3� ����O��\��������s _�^��9$-�Q���5��y�'��m��s���с �c�v�V �I����߇�!?�I���$7�ܡ�\ód[�#���mH��܁���F��&8�$*����p��w,意�hiḩt�-,6�i0��I�^�,`�Ś7��{~�5Q�R<?OȊc%S���(��D<�Cɓά����*��r���W/�<5�IT���,�y�P� ��4�M^�V˿���e?1�M��BO�P��<qBT}��6Z |.<��3p�G�2q�Zoݹ�p|UNbUqk��w~m��9`�L�E�E@Ka}��!,��/��p���7���b�� ]��G�{�����O1�R1�� ;č��A��&���u³F��?�m ��]��1���ϛ�Gg����돾��IY���ƃ�#J��j�aZ��z"L(�Bz~Fq���i�eU7m��4/��u?��@��H��� D�B��L�����0}*�X"��J�Z��� F��b��N�����@FP'H�fX�DIVTM7L�v\��(N�,/ʪnڮ�i^�m?��~����(N�,/ʪnڮaBRic�0N�n�q^��~?��yd��=#?��j��ߴl�|�`�p���B�XB�+��J�Z��� F��b��N���q ���$ ����")�Pit���py|�P$�Her�R��huz��d�Xmv����z@��H��� D�B�Y��`��.�/���L�P���No0�����p����?_ �%R�\�T�5Z�!A1� )�a9��d�Xmv���x}~� e\H��u�Ӳ]n��)�&�q!=?�8Q��4ˋ�����q��uۏ�s���I���(Ɋ��iَ�A�I��EY�M��8�˺��yݟ� #(�$E3,��$+���e;��a'i�eU7m��/!��m)hrYzb��3�3�S�H`]A�Mx1A���>]���5�j��^F�i�T\?8E|ӕ��_�e��oH{U��Ġ��T�&L�-3�QW�n��Ԥu����M������* ۥ����D��+�%�j;�b�ͮ�' Y�> (؟�4��w�]|���/���JW#Ȥ�Zca7�����B'8:{�} ��N�$�8�o��Q|W���� �mOnL�)��Q^!W��CM8�}:N�hۑc&4ٝq�o���_��@�xމ�ɐ��5���� Q�+�t�*\��]�w �C!�W��^"�yw��n������e�/��R�=�`���*��5b�J����z�MwZ���N h��PQ�7���-�␜�E��g�����C�29��*X����YK�Uk�&D���\�4����]�aw�-�5�&_kD�@�;���I1f�ͫ�{�C�[ŏY}E��xd�S�9ɇ��@�~��$�`�K��P����K}���=�wv��ZR ?P��h{�%���Zdϙ�'�bi��ys-KhO�ü���.�� [4/%0y�]�|�(��珫D���Bˀ(�D��뺹�"�c��fw��8��Ng�P�m���zd�o*Ģj6h�n�i[�}�iY L�ٱ�E�f�9��eF�8�d�ǣ��O�k�@�p����#B\���'Mo�=�)� uĐE�B>:��6Qlo�����6��]�Z* �)� ˸k�ֿ����� �/�d?6� Q���7D��x����'ey:��K��CaM�۽�T&�uf��T����x_�����W�D�){5�PJ7�A�����2��wW�q��o-C��g*�����te� ���j^"�~�4�{;fo-�W�?��*w�W�1�{���|���k�.Q�Z"� X�-��J��/~������۵�dp��;�<W����4�M�S��/��+�En���ش�0�;��=��N���{�3����!�Q)9]=$}������2����K��Pg(۫PY�)k�揚�f�,�}�eK��fh��#�*�3W��A+�����xv��fe��+�+�,��fTr�~j��) �[Tn����*��4p��]���W1dz�%�f��5*y�����W �� @Y�9~����Ë���Ʉ�T5�X�ٳi_�q# �;�����K(�56�9L�FQ�/�R���L��EE&Rz��O�EK��-�Q}Y�kv��� ������qsOLc�G�2�h����n⪻� :`�֥��$����ǘ7UѬr���_J�Q!wJ������:6���m�纏h�%��b��4���� �T�M��_�3\j�z��Fs1g�.�c�b��G�d?2RY`o��;�����2u��%�{��^r�)`+�v��۳������7�Fs=���CuC�{�C.�=Z8kV�Ye���`�Ԯ_Y�ꓣUu@�i��R|:��^�y��%�����}.ӀT4O���.]qq�Z-v.w�e��i��������o���:��f/1I|F�b���D�X����CE��?{���U�-Nx���0�w���6�~U�~}.x�����c��f�!�6�x�>�}�WAD<i��3��״)�>�|Qķ��~������X���C�����}���<A�>�������6cT���;k���#7.{7c��8�T����_���4��X��;B*bm���#"""*��RJ)EDDDD����̛?9��7���t3Zk�g�с�hz�������t&ޯw.���Y�N�ˋվ�gH@E���!�6����~b�rݴ���z��]DDDDDDDfffffffVUUUUUUU�i��{z�����6�Nd�PKAA#]Op�n�n�2system/helix3/assets/fonts/fontawesome-webfont.eotnu�[���n����LPYxϐFontAwesomeRegular$Version 4.7.0 2016FontAwesome �PFFTMk�G���GDEF��p OS/2�2z@X`cmap �:��gasp���hglyf���M�L�head��-�6hhea �$hmtxEy�� �loca��\�maxp,8 name㗋�gh�post����k�uː�xY_<��3�2�3�2��� � ���� ��'@i��3��3s�pyrs@ �� �pU�]�����y�n�����2��@������ ��������z���Z@�5�5 ���z���ZZ����@���������,_���@������s���@ ��@��(������@�����@��@- �M�M�-� �M�M�����@�����@@� �-����`��b���� ���$����6�4�8�"�"""""���@�D@���,,@� ��������� m��)@�@ ' D9>dY* ' � �� ��T �@ f� %RE $!k(D�' �� �%�� �% �� ��0%�/�&��p@0 �����!"""`���>�N�^�n�~��������������.�>�N�^�n�~��������������>�N�^�n�~������������ �����!"""`���!�@�P�`�p�������������� �0�@�P�`�p��������������!�@�P�`�p�������������\�X�S�B�1����ݬ ���������������������������������� � ,,,,,,,,,,,,,��t�L�T$�l x � T(�� d����l,����4d�pH�$d,t( � �!�"0# $,$�&D'�(�)T**�,,�-�.@.�/`/�00�1�2�3d444�5 5�5�6 6\6�7H7�88`8�9L9�:h:�;�<p=p><>�?h?�@H@�A0A�BXB�CdC�DLD�E�F�G0G�H�I�J8K�L�MdN,N�N�O�P`P�Q4Q�RRlS,S�T`U0W�X�Z[@[�\<\�]�^(^�_�`pb,b�dd�ePe�f�g`g�iLi�jDkk�l�m@n,oLp�q�r�sxtt�uD{`||�}}�~��������H��������l�@����������l�H� ���T��H�������`����@�����$�\�X��D�������T�X�����D�P�,���8���d�\����������������H���x��� �t���X���p��d��������x�t�������������@�������\� ļ�ŸƔ�0���d��ʨˀ����͔�x��ϰЌ�,ш�҈�ӌ���8�,՜�`���l�Hش�`���Tڸ�۔�@���l��ބ�߬��l�p� ������������������������������4�����X���$�l���(����`���������� d �� ,�,��8��(�X���x|T�@��| �!�"x##l$$�'h(�*L,T.L1t1�2�303�4�5t6T7$89H::�;�<�<�?X@A�B�C�D�EHFHGpHHIxJ J�K�L�MN@P@Q�R�SDT ULV`V�WXX4X�ZZ�[d[�\|]�^�`�aHa�b�cXd�etfhg�h�i\jxn�p@s�vw�x�y�z�{h|�}}�\���l�t���4���������t���8�8���L���T�������������|�������|�������4�x�����L����������X�(� ������� ������@�����l���t����$����x�L�L��� �H������Ġ�T�(����ʈˠ��ϔ�l�d���P�Մ�x�p���ڬ�T�T���ވ�L�����<�H��$���l������4����������� �P�l����,���x���p�,�x�t��d����4���4,h�P 4 �� �4�<,,408$�8�T� |!h"�$L%0&H'�(�)�*0*�+�,�.$.�0�1�2@2�3�4t5$6�9 :�:�;;�<(<�=4?�@�A�C�D�F�H`H�I�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�p7!!!���@p�p �p�]���!2#!"&463!&54>3!2�+��@&&��&&@��+$(�($F#+���&4&&4&x+#��+".4>32".4>32467632DhgZghDDhg-iW�DhgZghDDhg-iW&@(8 ��2N++NdN+'�;2N++NdN+'�3 8���! #"'#"$&6$ �������rL46$������oo��o|W%r��������4L&V|o��oo����ܳ��%��=M%+".'&%&'3!26<.#!";2>767>7#!"&5463!2� %��3@m00m@3���% � �@ ���:"7..7":�6]�^B�@B^^B�B^ $΄+0110+��$� ( �t��1%%1��+�`��B^^B@B^^���"'.54632>32�4�� #L</��>�oP$$Po�>���Z$_d�C�+I@$$@I+��������"#"'%#"&547&547%62���V�?�?V��8��<��8y��� ���b% I�))�9I ���� + %%#"'%#"&547&547%62q2�Z���Z2Izy���V)�?�?V��8��<��8)>~��>��[�� ��� 2���b% I�))�9I ���%#!"&54>3 72 &6 }X��X}.GuL�l�LuG.�����>�m��mU��mE��Em�������>����/?O_o���54&+";2654&+";2654&+";264&#!"3!2654&+";2654&+";264&#!"3!2654&+";2654&+";2654&+";267#!"&5463!2�&�&&�&&�&&�&&�&&�&&�&&&�&�&&�&�&�&&�&��&�&&&�&�&&�&&�&&�&&�&&�&�^B��B^^B@B^@�&&�&&��&&�&&��&&�&&�&&�&&��&&�&&���&&�&&&&�&&���&&�&&��&&�&&��&&�&&���B^^B@B^^��/?#!"&5463!2#!"&5463!2#!"&5463!2#!"&5463!2L4�4LL44LL4�4LL44L�L4�4LL44LL4�4LL44L��4LL4�4LL��4LL4�4LL���4LL4�4LL��4LL4�4LL �/?O_o�#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28(��(88(@(88(��(88(@(8�8(��(88(@(8��8(��(88(@(8�8(��(88(@(8�8(��(88(@(8��8(��(88(@(8�8(��(88(@(88(��(88(@(8 �(88(�(88�(88(�(88��(88(�(88�(88(�(88��(88(�(88��(88(�(88�(88(�(88��(88(�(88�(88(�(88�/?O_#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28(��(88(@(88(��(88(@(88(�@(88(�(8�8(��(88(@(88(�@(88(�(88(�@(88(�(8 �(88(�(88�(88(�(88��(88(�(88�(88(�(88��(88(�(88�(88(�(88y��"/&4?62 62��,�P����P&�P��P�,��jP�����n���#$"' "/&47 &4?62 62 �P���P�&���P&&P���&�P�&���P&&P���&�P������#+D++"&=#"&=46;546;232 #"'#"$&6$ � @ � � @ � �������rK56$������oo��o|W�@ � � @ � ��r��������jK&V|o��oo����ܳ�����0#!"&=463!2 #"'#"$&6$ �� @ �������rK56$������oo��o|W�@ @ �r��������jK&V|o��oo����ܳ����)5 $&54762>54&'.7>"&5462z�����z��+i *bkQ��н�Qkb* j*����LhLLhL�����zz���Bm +*i J�yh��QQ��hy�J i*+ m��J��4LL4�4LL���/?O%+"&=46;2%+"&546;2%+"&546;2+"&546;2+"&546;2��������������`��r��@�@r�@��@����n4&"2#"/+"&/&'#"'&'&547>7&/.=46?67&'&547>3267676;27632�Ԗ����#H ��,/ �1)� ~'H� �(C � �,/ �1)� �$H� Ԗ�Ԗm�6%2X %� l�2 �k r6 [21 �..9Q $� k�2 �k w3[20����/;Cg+"&546;2+"&546;2+"&546;2!3!2>!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@���@�`�0 �� o`^B��B^`5FN(@(NF5 ��@��@��@���L%%Ju �@�LSyuS�@�%44%�f5#!!!"&5465 7#"' '&/&6762546;2�&�����&??�> �L�L > � X ��� � &���&��&AJ A�� J W���h��##!"&5463!2!&'&!"&5!�(8(��(88(�(`�x ��c�`(8��`(��(88(@(8(D��9�8(����� ,#!"&=46;46;2. 6 $$ ����@��������(�r���^����a�a�@@`��(��������_�^����a�a��2NC5.+";26#!26'.#!"3!"547>3!";26/.#!2W � ��.�@ �� �@.�$S � S$�@ ���9I � I6> �� ��>�%=$4&"2$4&"2#!"&5463!2?!2"'&763!463!2!2&4&&4&&4&&4�8(�@(88(ч:�:��(8���@6�@*&&*�4&&4&&4&&4& ��(88(@(8�88�8)�@�)'�&&�@���$0"'&76;46;232 >& $$ ` ������������(���r���^����a�a`�� @`��2�������(���^����a�a�����$0++"&5#"&54762 >& $$ ^��� ?@�����(���r���^����a�a���`? ����������(���^����a�a�� #!.'!!!%#!"&547>3!2�<�<�<_@`&��&� 5@5 �@����&&�>=(""��=���'#"'&5476. 6 $$ � �� ! ��������(�r���^����a�a�J�� %�%���(��������_�^����a�a�����3#!"'&?&#"3267672#"$&6$3276&�@*���h��QQ��hw�I � m�ʬ����zz���k�)'�@&('��Q��н�Qh_ � ��z�8�zoe����$G!"$'"&5463!23267676;2#!"&4?&#"+"&=!2762�@�h���k�4&&�&�G�a��F*� &�@&��Ɇ�F*� A��k�4&���nf�&�&&4�BH�rd�@&&4���rd Moe�&�/?O_o+"&=46;25+"&=46;25+"&=46;2#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!26#!"&5463!2� @ @ @ @ @ @ � �@ � �@ � �@ � � �@ � �^B�@B^^B�B^`@ @ �@ @ �@ @ ��@ @ �@ @ �@ @ �3@ �� M��B^^B@B^^��!54&"#!"&546;54 32@�Ԗ@8(�@(88( p (8�j��j��(88(@(8������8@���7+"&5&5462#".#"#"&5476763232>32@@ @ @KjK�ך=}\�I���&:�k�~&26]S &H&� �&H5KKu�t,4,� &� x:;*4*&��K#+"&546;227654$ >3546;2+"&="&/&546$ �<��X@@Gv"D�����װD"vG@@X��<��4L4����1!Sk @ G<_b������b_<G �� kS!1����zz�� �"'!"&5463!62&4����&&M4&���&M&�&M& ��-"'!"&5463!62#"&54>4.54632&4����&&M4&�UF &""""& F���&M&�&M&���%/B/%���G-Ik"'!"&5463!62#"&54>4.54632#"&54767>4&'&'&54632#"&547>7676'&'.'&54632&4����&&M4&�UF &""""& FU�� &'8JSSJ8'& ���� &'.${��{$.'& ����&M&�&M&���%/B/%7���;&'6���6'&;��4�[&$ [2[ $&[��#/37#5#5!#5!!!!!!!#5!#5!5##!35!!!����������������������������������������������������������������������������#'+/37;?3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3???? ^��>>~??�??�??~??~??^??�^^? ^??������������������������������������4&"2#"'.5463!2�KjKKjv%�'45%�5&5L4�5�&�%jKKjK�@5%�%%�%�5�4L5&�6'��k�54&"2#"'.5463!2#"&'654'.#32�KjKKjv%�'45%�5&5L4�5�&�%�%�'4$.�%%�5&�5�5�&�%jKKjK�@5%�%%�%�5�4L5&�6'45%�%�%54'�&55&�6' ��y�Tdt#!"&'&74676&7>7>76&7>7>76&7>7>76&7>7>63!2#!"3!2676'3!26?6&#!"3!26?6&#!"g(��sA�eM�,*$/ !'& �JP��$G]�� x�6,&��` �� h` �� "9H�v@WkNC<. &k& ("$p" . #u&# %!' pJ�vwEF�# @ �� @ ���2#"' #"'.546763�!''!0#�G�G$/!''!� 8"��"8 ��X! 8" "8 ����<)!!#"&=!4&"27+#!"&=#"&546;463!232������(8���&4&&4� �8(�@(8� qO@8(�(`�(@Oq��8(��&4&&4&@�` �(88(� �Oq (8(�`(�q���!)2"&42#!"&546;7>3!2 I��j��j��j��j�3e55e3�gr������`��I�j��j��j�j��1GG1���r��������P2327&7>7;"&#"4?2>54.'%3"&#"#ժ!�9&W��B03&�K5�!�)V�?�@L��'� >R�>e;&L:�:%P�>��vO 'h�� N��_"�:-&+# ��:�� ' ����+a%3 4'.#"32>54.#"7>7><5'./6$3232#"&#"+JBx)EB_I:I*CRzb3:dtB2P���$$5.3b�ZF�|\8!-T>5��Fu��\,�,j�n OrB,<! 5�4wJ]�?tTFi; 2�3j.�p^%/2�+ S:T}K4W9: #ƕd�fE���:7>7676'5.'732>7"#"&#&#"OA zj=N!�}:0e��% y� +t�D3�~U#B4# g '2 %/!: ���T bRU,7����}%2"/&6;#"&?62+326323!2>?23&'.'.#"&"$#"#&=>764=464.'&#"&'�!~:~!PP!~:~!P��6�,�,$�$%*' c2N (�$"L��A2�3Yl�!x!*�%��%%��%�� p�P,T NE Q7^���oH!+( 3 *Ue�eu wg��a�32632$?23&'.5&'&#"&"5$#"#&=>7>4&54&54>.'&#"&'2#".465!#".'&47>32!4&4>Q6�,�,Faw!*' =~Pl* (�$"L��A2�3Yl �)�!*<7@@7< � <7@@7< p�P,T MF Q7�47ƢHoH!+( 3 t���JHQ6wh��',686,'$##$',686,'$##$�/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&��&&�&��&�&&&&�&&&��&��&&�&��&&�&&f�&&�&&f�&&�&&f�&&�&&�/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&��&&�&��&��&&�&&��&&�&��&��&&�&��&&�&&f�&&�&&f�&&�&&f�&&�&&�/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&��&&�&&�&&&&�&&&&��&&�&��&&�&&f�&&�&&f�&&�&&f�&&�&&�/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&��&&�&&��&&�&&��&&�&&��&&�&��&&�&&f�&&�&&f�&&�&&f�&&�&&�/?O_o%+"&=46;2+"&=46;2+"&=46;2#!"&=463!2+"&=46;2#!"&=463!2#!"&=463!2#!"&=463!2 � � � � � � �� @ � � � �� @ �� @ �� @ � � s� � s� � �� � s� � �� � s� � s� � �/?O#"'&47632#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2� �� � �@ � �� @ �� @ �@ � � �� � s� � s� � s� � �/?O#"&54632 #!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2` �� � �@ � �� @ �� @ �@ � � �� @ �� � � s� � s� � s� � #"'#!"&5463!2632' �m�w�@w��w�w�� '���*��w��w�w��w������."&462!5 !"3!2654&#!"&5463!2�p�pp�p��@��� @ �^B��B^^B@B^�pp�p���@�@� �@ � �@B^^B�B^^���k%!7'34#"3276' !7632k[�[�v �� 6����`�%��`�$65&�%[�[k���� �`����5%���&&�'���4&"2"&'&54 �Ԗ���!��?H?��!,�,Ԗ�ԖmF��!&&!Fm�,�����%" $$ ���������^����a�a`@������^����a�a���-4'.'&"26% 547>7>2"KjK��X��QqYn 243nYqQ�$!+!77!+!$5KK���,ԑ� ���]""]ً� ��9>H7'3&7#!"&5463!2'&#!"3!26=4?6 !762xt�t` �� ^Q�w��w��w@?61��B^^B@B^ @(` �`��\\��\P�`t�t8`� �� ^�Ͼw��w@w�1^B��B^^B~ @��` \ \�P�+Z#!"&5463!12+"3!26=47676#"'&=# #"'.54>;547632��w��w��w� M8 pB^^B@B^� '���sw- 9*##;No��j�' �#��w��w@w� "^B��B^^B� ��*����� "g`�81T`PSA:'�*��4�/D#!"&5463!2#"'&#!"3!26=4?632"'&4?62 62��w��w��w@?61 ��B^^B@B^ @ ��B�RnB�Bn^��w��w@w�1 ^B��B^^B� @ ���Bn���nB�C"&=!32"'&46;!"'&4762!#"&4762+!5462�4&���&�4�&���&4�4&��&4&��&4�4�&���&4�4&��&4&��&4�4&���&����6'&'+"&546;267��: &�&&�& s�@� �Z&&�&&�Z ���+6'&''&'+"&546;267667��: �: &�&&�& � s�@� �:� �Z&&�&&�Z ��: z����6'&''&47667S�: �:� s�@� �:�4��: �|� &546h��!!0a� � � $���#!"&5463!2#!"&5463!2&�&&&��&�&&&@��&&�&&��&&�&&���#!"&5463!2&��&&�&@��&&�&&���&54646&5-� ��: s��: ��:4�:� ���+&5464646;2+"&5&5-� � &�&&�& �: s��: ��: �&&��&&� �:� ���&54646;2+"&5-� &�&&�& s��: �&&��&&� 62#!"&!"&5463!2�4��@��&&�&&-��:��&&&�&����� "'&4762����4��4����4��4��4Z��f� "/&47 &4?62S�4����4����44��4���#/54&#!4&+"!"3!;265!26 $$ �&�&�&�&&&�&&@���^����a�a@�&&&�&�&�&&&+�^����a�a�����54&#!"3!26 $$ �&�&&&@���^����a�a@�&&�&&+�^����a�a�����+74/7654/&#"'&#"32?32?6 $$ }��Z��Z��Z��Z����^����a�a���Z��Z��Z��Z�^����a�a�����#4/&"'&"327> $$ [4�h�4[j����^����a�a"Z�i�Z��J�^����a�a�����:F%54&+";264.#"32767632;265467>$ $$ ���o�W�� 5!"40K(0?i�+! ":����^����a�a����X�R�dD4!&.uC$=1/J=�^����a�a�����.:%54&+4&#!";#"3!2654&+";26 $$ `��``��������^����a�a�����������^����a�a�����/_#"&=46;.'+"&=32+546;2>++"&=.'#"&=46;>7546;232�m&&m �l&�&l� m&&m �l&�&l�s&�%�&�&��%�&&�%�&�&��%�&&�&l� m&&m �l&�&l� m&&m �,�&��%�&&�%�&�&��%�&&�%�&���#/;"/"/&4?'&4?627626. 6 $$ I� �� � �� � �� � �� ͒������(�r���^����a�aɒ �� � �� � �� � �� (��������_�^����a�a����� , "'&4?6262. 6 $$ ��Z4��f4�4fz�������(�r���^����a�a�Z&4f�f4�(��������_�^����a�a����� "4'32>&#" $&6$ W���oɒV��� z�����zz�8�����YW�˼�[����?����zz�:�zz�@�5K #!#"'&547632!2A4�@%&&K%54'�u%%�&54&K&&���4A��5K��$l$L%%�%54'�&&J&j&��K�5�K #"/&47!"&=463!&4?632�%�u'43'K&&%�@4AA4���&&K&45&�%@6%�u%%K&j&%K5�5K&$l$K&&�u#5��K@!#"'+"&5"/&547632K%K&56$��K5�5K��$l$K&&�#76%�%53'K&&%�@4AA4���&&K&45&�%%�u'5��K�"#"'&54?63246;2632K%�u'45%�u&&J'45%&L4�4L&%54'K%�5%�t%%�$65&K%%���4LL4�@&%%K'���,"&5#"#"'.'547!3462�4&�b��qb>#5���&4�4�&6Uu�e7D# "�dž�&����/#!"&546262"/"/&47'&463!2� ���&�@&&4�L r&4��� r L�&�&� ���4&&�&�L rI�@&��� r L�4&& ���s/"/"/&47'&463!2#!"&546262&4��� r L�&�&� ���&�@&&4�L r@�@&��� r L�4&&� ���4&&�&�L r��##!+"&5!"&=463!46;2!2�8(�`8(�(8�`(88(�8(�(8�(8 �(8�`(88(�8(�(8�(88(�`8��#!"&=463!2�8(�@(88(�(8 �(88(�(88z���5'%+"&5&/&67-.?>46;2%6�.@g.��L4�4L��.g@. ��.@g. L4�4L .g@.���g.n.���4LL43�.n.g��g.n.�34LL4�͙.n.g����- $54&+";264'&+";26/�a����^����� � � � �����^����a�a�� � fm�� @ J%55!;263'&#"$4&#"32+#!"&5#"&5463!"&46327632#!2���$�$�8�~+(88�8(+}�(�`8(��(8`�]��]k=��=k]��]��8���,8e�8P88P8�����`(88(�@���M��M����N4&#"327>76$32#"'.#"#"&'.54>54&'&54>7>7>32&����z&^��&.������/+>+)>J> W��m7����' '"''? &4&c��&^|h_b��ml/J@L@#* #M6:D 35sҟw$ '% ' \�t��3#!"&=463!2'.54>54''� �� @ �1O``O1CZ��Z71O``O1BZ��Z7�@ @ N�]SHH[3`�)Tt��bN�]SHH[3^�)Tt���!1&' 547 $4&#"2654632 '&476 ���=������=嘅�����}�(zVl��'��'���ٌ@�uhy����yhu����9(�}Vz��D#���#D#������� =CU%7.5474&#"2654632%#"'&547.'&476!27632#76$7&'7+NWb=嘧�}�(zV�j�\i1 z,��X�� Y[6 $!%���'F��u�J�iys�?_�9ɍ?�kyhu�n(�}Vz����YF KA؉L�a �0��2�-�F"@Q���sp@�_���!3%54&+";264'&+";26#!"&'&7>2 � � � � #%;"�";%#<F<������7 ���??""??�$$ll2#"'&' +&/&'&?632 &'&?67>`,@L�����5 ` �� ` �����L�`4�L��H` ����` �� a 5� ��L@��#37;?Os!!!!%!!!!%!!!!!!!!%!!4&+";26!!%!!!!74&+";26%#!"&546;546;2!546;232� ��`@���� ��`@���� ���@����@�� ��@���� @ @ � ��@��� �� @ @ �L4��4LL4�^B@B^�^B@B^�4L� �� @@��@@ � � � @@ �� ��@@ �� � �� M�4LL44L`B^^B``B^^B`L���7q.+"&=46;2#"&=".'673!54632#"&=!"+"&=46;2>767>3!54632�<M33K,�� �� j8Z4L2B4:;M33K,? �� �0N<* .)C=W]xD��0N<* .)C=W]xD?\�-7H)�� �� �".=']�-7H)� ��w �� �<?.>mBZxPV3!�<?.>mBZxPV3!� ���&#"'&'5&6&>7>7&54>$32�d�FK��1A 0)����L���.���٫�C58.H(Y���e����#3C $=463!22>=463!2#!"&5463!2#!"&5463!2���H���&�&/<R.*.R</&�&�&��&&�&&��&&�&������Bɀ&&�4L&&L4�&&f��&&�&&��&&�&&Z� %"' "/&4762��4���4��4�ͥ���5��5Z���� "'&4?62 62��4��44���5����5��%K%#!".<=#"&54762+!2"'&546;!"/&5463!232 �@�&@<@&�@ ����:��&��� � ��& ��&���&��� ����&�� ��`&���:$"&462"&462!2#!"&54>7#"&463!2!2�LhLLh�LhLLh�!�� �&&�&��&&�&4hLLhLLhLLhL��%z< 0&4&&)17&4& &&��#!"&5463!2!2��\�@\��\@\��\���@\��\�\��\ �W�*#!"&547>3!2!"4&5463!2!2W��+�B��"5P+�B@"5����^�=���\@\� \�H#�t3G#�3G:�_H�t�\��\ �@��+32"'&46;#"&4762�&��&�4�&��&4�4&�&4�4&&4�@�"&=!"'&4762!5462�4&�&4�4&&4�4�&��&4&��&���� !!!3!!��������������������������0@67&#".'&'#"'#"'32>54'6#!"&5463!28ADAE=\W{��O[/5dI kDt���pČe1?*�w�@w��w�w�� (M& B{Wta28r=Ku?RZ^Gw��T -�@w��w�w�����$2+37#546375&#"#3!"&5463�w��w���/Dz?s�����w��w��w�@w�S�88� �����w�w����#'.>4&#"26546326"&462!5!& !5!!=!!%#!"&5463!2�B^8(�Ԗ���������>��������@�|�K5�5KK55K�^B(8Ԗ�Ԗ�>�������v����5KK55KK�H��G4&"&#"2654'32#".'#"'#"&54$327.54632@p�p)*Ppp�p)*P�b '"+`�N*(�a���;2��̓c`." b PTY9��ppP*)p�ppP*)�b ".`�(*N��ͣ�2�ͣ����`+"' b MRZB�����4&"24&"264&"26#"/+"&/&'#"'&547>7&/.=46?67&'&547>3267676;27632#"&'"'#"'&547&'&=4767&547>32626?2#"&'"'#"'&547&'&=4767&547>32626?2��Ԗ���LhLKjKLhLKjK�� �"8w s%(�")v � >� �"8x s"+�")v �<� ��3zLLz3�� 3>8L3)x3 ��3zLLz3�� 3>8L3)x3 �Ԗ�Ԗ�4LL45KK54LL45KK��� #)0C wZl/ � Y� N,&� #)0C vZl. � Y�L0"��qG^^Gq�q$ ]G)Fq�qG^^Gq�q$ ]G)Fq��%O#"'#"&'&4>7>7.546$ '&'&'# '32$7>54'�����VZ|�$2$ |��E~E<�| $2$�|ZV���:�(t}�������X( &%(H�w�쉉��x�H(%& (X�ZT\�MKG���<m$4&"24&#!4654&#+32;254'>4'654&'>7+"&'&#!"&5463!6767>763232&4&&4�N2��`@`%)7&,$)' %/0Ӄy�#5 +�1 &<��$]`�{t��5KK5$e:1&+'3T�F0�h��4&&4&�3M:�;b^v�+D2 5#$��I�IJ 2E=\$YJ!$MCeM��-+(K5�5K�K5y�*%A�u]c���>q4&"24&'>54'654&'654&+"+322654&5!267+#"'.'&'&'!"&5463!27>;2&4&&4�+ 5#bW���0/% ')$,&7)%`@``2N��h�0##�T3'"(0;e$��5KK5 t��ip��<& 1&4&&4&�#\=E2&%IURI��$#5 2D+�v^b;�:M2g�c]vDEA%!bSV2M�K5�5K(,,��MeCM$!I��@�#"&547&547%6@�?V��8������b% I�)���94.""'." 67"'.54632>32�+C`\hxeH>Hexh\`C+�ED���4�� #L</��>�oP$$Po�>��Q|I.3MCCM3.I|Q����/����Z$_d�C�+I@$$@I+� (@%#!"&5463!2#!"3!:"&5!"&5463!462� ��w��w@ ��B^^B ���4&�@&&�&4 ` �w�w� ^B�@B^24��& &�& &�����%573#7.";2634&#"35#347>32#!"&5463!2���FtIG9;HI�x�I��<,tԩw�@w��w�w�z��4DD43EE�����ueB����s�@w��w�w�����.4&"26#!+"'!"&5463"&463!2#2��&�S3L�l&�c4LL4�4LL4c����@��&��&{�LhLLhL��'?#!"&5463!2#!"3!26546;2"/"/&47'&463!2��w��w��w��@B^^B@B^@�&4��t r ��&&`��w��w@w�@^B��B^^B@R�&��t r ��4&&@"&5!"&5463!462 #!"&54&>3!2654&#!*.54&>3!2���4&�@&&�&4 s�w�� @B^^B�� @w��4��& &�& &��3�@w� ^B�B^ ����� I&5!%5!>732#!"&=4632654&'&'.=463!5463!2!2�J���J���S��q*5&=CKu��uKC=&5*q͍S8( ^B@B^ (8���`N��`Ѣ�G�tO6)"M36J[E@@E[J63M")6Ot�G�(8`B^^B`8 ���',2��6'&'&76'6'&6&'&6'&4#"7&64 654'.'&'.63226767.547&7662>76#!"&5463!2 /[ . =���X��Ě4,+"*+, 1JH'5G:�:#L5+@=&#���w�@w��w�w�P.1GE�,��ԧ��44+ ;/5cFO:>JJ>:O9W5$@(b4��@w��w�w������'?$4&"2$4&"2#!"&5463!3!267!2#!#!"&5!"'&762&4&&4&&4&&4�8(�@(88(�c==c�(8��*�&�&�*�6�&4&&4&&4&&4& ��(88(@(88HH88`(�@&&�('��@����1c4&'.54654'&#"#"&#"32632327>7#"&#"#"&54654&54>76763232632 N<�;+gC8�A`1a9�9�g��w����|�9�8aIe$I�VN��z<�:LQJ �,�-[% 061I��(�)W,$-������7,oIX(�)o�ζA;=N0 eTZ (���O#".'&'&'&'.54767>3232>32�e^\4?P bM��O0#382W#& 9C9 Lĉ" 82<*9FF(W283#0OMb P?4\^eFF9*<28 "��L 9C9 &#��!"3!2654&#!"&5463!2`��B^^B@B^^ީw��w��w@w�^B��B^^B@B^���w��w@w�����#!72#"' #"'.546763���YY�!''!0#�G�G$/!''!�&�UU�jZ 8"��"8 ��X! 8" "8 ���GW4.'.#"#".'.'.54>54.'.#"32676#!"&5463!2 1.- +$) c�8 )1) 05.D <9�0)$9��w�@w��w�w�W )1) 7�c )$+ -.1 �9$)0���< D.59�@w��w�w��,T1# '327.'327.=.547&54632676TC_L��Ҭ���#+�i�!+*p�DNBN,y[����`m`%i]hbE����m��}a�u&,�SXK�� &$��f9s? _���#"!#!#!54632��V<%'����Э��HH��� �(ں����T\dksz�� &54654'>54'6'&&"."&'./"?'&546'&6'&6'&6'&6'&74"727&6/�a���49[aA)O%-j'&]�]5r-%O)@a[9' 0BA;+ >HC���U # $ 2 AC: �����oM�=a-6O�UwW[q ( - q[WwU�P6$C +) ( 8&/ &eM���a� & $ ��%+"&54&"32#!"&5463!54 �&@&�Ԗ`(88(�@(88(�r��&&j��j�8(��(88(@(8��������#'+2#!"&5463"!54ĉ!375!35!�B^^B��B^^B � �� `���^B�@B^^B�B^� �� � `�� �������!="&462+"&'&'.=476;+"&'&$'.=476;�p�pp�p�$���!�$qr� �%���}�#ߺ���pp�p��!�E$� �rq�ܢ#��� %� ֻ��!)?"&462"&4624&#!"3!26!.#!"#!"&547>3!2/B//B//B//B� �@ � �2�����^B�@B^�\77\�aB//B//B//B/�@ �� �� �~��B^^B@2^5BB5��2���.42##%&'.67#"&=463! 2�5KK5L4�_�u:B&1/&��.- zB^^B���4L��v��y�KjK��4L[!^k'!A3;):2*�<vTq6^B�B^�L4�$���)��*@��A4#"&54"3!4."#!"&5!"&5>547&5462�;U gI�v��0Z���Z0�L4�@�Ԗ�@4L2RX='�8P8��'=XR� U;Ig0,3lb??bl3���4Lj��jL4*\���(88(�����\���}I/#"/'&/'&?'&'&?'&76?'&7676767676`� (�5)�0 )��*) 0�)5�( �� (�5)�0 ))��)) 0�)5�( ��*) 0�)5�(�� )�5)�0 )*��*) 0�)5�) �� )�5)�0 )*���5h$4&"24&#!4>54&#"+323254'>4'654&'!267+#"'&#!"&5463!2>767>32!2&4&&4�N2��$YGB (HGEG H��Q�#5K4L��i�!<�����;��5KK5 A# ("/?&}�vh��4&&4&�3M95S+C=�,@QQ9��@@�IJ 2E=L5i�>9eM��E;K5�5K J7R>@#�zD<����5=q%3#".'&'&'&'.#"!"3!32>$4&"2#!"#"&?&547&'#"&5463!&546323!2` #A<(H(GY$��2NL4K5#aWTƾh&4&&4�K5��;����=!�i��hv�}&?/"( #A 5K��2*! Q@.'!&=C+S59M34L=E2 JI UR@@&4&&4&���5K;E��Lf9>�ig�<Dz�#@>R7J K�5h4&"24#"."&#"4&#"".#"!54>7#!"&54.'&'.5463246326326&4&&4��IJ 2E=L43M95S+C=�,@QQ9�@@�E;K5��5K J7R>@#�zD<�gi�>9eM��Z4&&4&<�#5K4LN2��$YGB (HGEG H��V���;��5KK5 A# ("/?&}�vh��i�!<��4<p4.=!32>332653272673264&"2/#"'#"&5#"&54>767>5463!2�@@��2*! Q@.'!&=C+S59M34L.9E2 JI UR�&4&&4&��Lf6A�ig�6Jy�#@>R7J K5�5K;E@TƾH #A<(H(GY$��2NL4K#5#a=4&&4&�D��=�i��hv�}&?/"( #A 5KK5��;�����+54&#!764/&"2?64/!26 $$ &� �[6��[[j6[��&���^����a�a@�&�4[��[6[��[6�&+�^����a�a�����+4/&"!"3!277$ $$ [��6[�� &&��[6j[ ���^����a�ae6[j[6�&�&�4[j[��^����a�a�����+4''&"2?;2652?$ $$ ��[6[��[6�&�&�4[���^����a�af6j[[��6[�� &&��[��^����a�a�����+4/&"4&+"'&"2? $$ [6�&�&�4[j[6[j���^����a�ad6[��&&� �[6��[[j��^����a�a������ $2>767676&67>?&'4&'.'.'."#&6'&6&'3.'.&'&'&&'&6'&>567>#7>7636''&'&&'.'"6&'6'..'/"&'&76.'7>767&.'"76.7"7"#76'&'.'2#22676767765'4.6326&'.'&'"'>7>&&'.54>'>7>67&'ʢ&7767>&/45'.67>76'27".#6'>776'>7647>?6#76'6&'676'&67.'&'6.'.#&'.&6'&.5/�a����^����D&" 4 $! # .0"�Y + ! $ " + �Α ����^����a�a�� P� '-( # * $ " ! * ! ( ��$� 2 �~�/$4&"2 #"/&547#"32>32�&4&&4��V%54'j&&�'��/덹���:,���{ &4&&4&�V%%l$65&�b��'C��r!"��k[G�+;%!5!!5!!5!#!"&5463!2#!"&5463!2#!"&5463!2����������&��&&�&&��&&�&&��&&�&�������@�&&&&�&&&&�&&&&��{#"'&5&763!2{�' ��**�)��*��)'/!5!#!"&5!3!26=#!5!463!5463!2!2���^B�@B^�&@&`��^B`8(@(8`B^��� B^^B�&&�����B^�(88(�^���G 76#!"'&? #!"&5476 #"'&5463!2 '&763!2#"'��c�)'&�@*������*�@&('�c���(&�*�cc�*�&' ����*�@&('�c���'(&�*�cc�*�&('���c�'(&�@*��19AS[#"&532327#!"&54>322>32"&462 &6 +&'654'32>32"&462Q�g�Rp|Kx;CB��y��y� 6Fe= BP���PB =eF6 ��Ԗ��V����>!pR�g�QBC;xK|��Ԗ���{QNa*+%��x��x5eud_C(+5++5+(C_due2Ԗ�Ԗ�����>�NQ{u�%+*jԖ�Ԗ��p�!Ci4/&#"#".'32?64/&#"327.546326#"/&547'#"/&4?632632��(* 8(!�)(��A�('��)* 8(!U�SxyS�SXXVzxT�TU�SxyS�SXXVzxT�@(� (8 *(���(��'(�(8 ���S�SU�Sx{VXXT�T�S�SU�Sx{VXXT���#!"5467&5432632�������t,Ԟ;F`j�)��������6�,��>�jK?�s�� �!%#!"&7#"&463!2+!'5#�8Ej��jE8�@&&&&@������XYY�&4&&4&�qD�S�%��q%��N\jx��2"&4#"'#"'&7>76326?'&'#"'.'&676326326&'&#"32>'&#"3254?''7�4&&4&l�� �NnbS���VZbR��SD zz DS��Rb)+U���Sbn� ��\.2Q\dJ'.2Q\dJ.Q2.'Jd\Q2.'Jd`!O�`�� `�����&4&&4�r$#@�B10M�5TNT{L�5T II T5�L;l'OT4�M01B�@#$�*�3;$*�3;�;3�*$;3�*$�:$/� @@�Qq`��@���"%3<2#!"&5!"&5467>3!263! !!#!!46!#!�(88(�@(8��(8(�`(�(8D<���+����+�<��8(�`(��8(�`�8(�@(88( 8(�(`�(8(��(������<��`(8��(`����`(8����||?%#"'&54632#"'&#"32654'&#"#"'&54632|�u�d��qܟ�s] = ��Ofj�L?R@T?��"&� > �f?rRX=Ed�u�ds���q�� = _M�jiL��?T@R?E& �f > �=XRr?��b���!1E)!34&'.##!"&5#3463!24&+";26#!"&5463!2���� �� 08(��(8��8(@(8�� � � �8(��(88(�(`(����1 �`(88(���(88(@ �� �`(88(@(8(��`���#!"&5463!2�w�@w��w�w�`�@w��w�w��/%#!"&=463!2#!"&=463!2#!"&=463!2&��&&�&&��&&�&&��&&�&��&&�&&�&&�&&�&&�&&��@'7G$"&462"&462#!"&=463!2"&462#!"&=463!2#!"&=463!2�p�pp�pp�pp�� �@ � ��p�pp�� �@ � �@ � Рpp�p��pp�p��� � �pp�p��� � � � ��<L\l|#"'732654'>75"##5!!&54>54&#"'>3235#!"&=463!2!5346=#'73#!"&=463!2#!"&=463!2}mQjB919+i1$AjM_3<��/BB/.#U_:IdDRE� �@ � ����k*G�j� �@ � �@ � TP\BX-@8 C)5�XsJ@�$3T4+,:;39SG2S.7<��� �vcc)�)%L�l�}� �� � ���5e2#!"&=463%&'&5476!2/&'&#"!#"/&'&=4'&?5732767654'&��@�0��2uBo T25XzrDCBB�Eh:%��)0%HPIP{rQ�9f#-+>;I@KM-/Q"�@@@#-bZ��$&P{<�8[;:XICC>.�'5oe80#.0( l0&%,"J&9%$<=DTI���cs&/6323276727#"327676767654./&'&'737#"'&'&'&54'&54&#!"3!260% <4�"VRt8<@< -#=XYhW8+0$"+dT�Lx-'I&JKkm��uw<=V�@�!X@ v '��|N;!/!$8:I�Ob�V;C#V & (���mL.A:9 !./KLwP�M�$��@@ ��/?O_o��%54&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!26#!"&5463!2��@��@��@���@��@��@���@��@��@�^B��B^^B@B^�����������������������������N��B^^B@B^^���#+3 '$"/&4762%/?/?/?/?�%k��*��6�6��bbbb|��<<��<�bbbb��bbbb�%k���6���6Ƒbbb��<<��<<�^bbbbbb@��M$4&"2!#"4&"2&#"&5!"&5#".54634&>?>;5463!2�LhLLh���� � LhLLhL!'�Ԗ���Ԗ@'!& �?�&&LhLLhL� � ��hLLhL�� j��jj��j &@6/" ��&&���J#"'676732>54.#"7>76'&54632#"&7>54&#"&54$ ���ok; -j=y�hw�i�[+PM3ѩ���k=J%62>Vc��a�aQ�^��� ]G"�'9��r�~:`}�Ch� 0=Z�٤���W=#uY2BrUI1�^Fk[|��a�����L2#!67673254.#"67676'&54632#"&7>54&#"#"&5463�w��w�+U ,i<��F{�jh�}Z+OM 2ϧ���j<J%51=Ub�w��w��w�@w�zX"�'8'�T�yI9`{�Bf� ,>X�բ���W<"uW1AqSH1�bd��w�w����'74'!3#"&46327&#"326%35#5##33#!"&5463!2����0U6c��c\=hl���ࠥ�Ymmnnnn�w�@w��w�w�w&�46#�Ȏ;ed����wnnnnn��@w��w�w���� ]#/#"$&6$3 &#"32>7!5!%##5#5353����Е���tt����u�{�zz�{S�ZC�`�c�����o���t�*�t��q|��|.EXN#�??�������,<!5##673#$".4>2"&5!#2!46#!"&5463!2��r�M* �*M~�~M**M~�~M*j����jj����&�&&&�`��P%��挐|NN|���|NN|�*�jj���jj�@��&&�&&@� "'&463!2�@4�@&�Z4�@�4&@ #!"&4762&��&�4�Z4&&4��@@��� "'&4762�&4�@�4&@��&�4�&�@� "&5462@�@4&&4��4�@&�&�@���� 3!!%!!26#!"&5463!2�`��m��` �^B��B^^B@B^��� `���@B^^B�B^^��@ "'&463!2#!"&4762�@4�@&�&&��&�4��4�@�4&Z4&&4��@�� "'&463!2�@4�@&��4�@�4&@ #!"&4762&��&�4�Z4&&4��@��:#!"&5;2>76%6+".'&$'.5463!2^B�@B^,9j�9Gv33vG9�H9+bI��\ A+=66=+A [��">nSM�A_:��B^^B1&�c*/11/*{�'VO�3��@/$$/@�*�?Nh^��l+!+"&5462!4&#"!/!#>32]��_gTRdg�d���QV?U��I*Gg?����!�2IbbIJaa���iwE33����00� 08����4#"$'&6?6332>4.#"#!"&54766$32z�䜬��m� I�wh��QQ��hb�F�*�@&('�k�������z�� � _hQ��н�QGB�'(&�*�eoz�(���q!#"'&547"'#"'&54>7632&4762.547>32#".'632�%k'45%��&+�~( (�h & \( (� & ~+54'k%5%l%%l$65+~ & �( (\ & �h( (~�+%��'��!)19K4&"24&"26.676&$4&"24&"24&"2#!"'&46$ �KjKKjKjKKj�e2.e<^P��,bKjKKj��KjKKjKjKKj��#��#���LlL�KjKKjKjKKjK��~-��M<M�(PM<rjKKjK�jKKjKujKKjK�������L���< 6?32$6&#"'#"&'5&6&>7>7&54$ L�h��я�W.�{+9E=�c��Q�d�FK��1A 0)���������p�J2`[Q?l&������٫�C58.H(Y��'����:d 6?32$64&$ #"'#"&'&4>7>7.546'&'&'# '32$7>54'Y����j`a#",5NK� ����~E�����VZ|�$2$ |��: $2$�|ZV���:�(t}�����h�fR�88T h�̲����X( &%(H�w��(%& (X�ZT\�MKG�{x��|�!#"'.7#"'&7>3!2%632u�� �j �H����{(e9 �1b���U#!"&546;5!32#!"&546;5!32#!"&546;5463!5#"&5463!2+!2328(��(88(`�`(88(��(88(`�`(88(��(88(`L4`(88(@(88(`4L`(8 ��(88(@(8��8(��(88(@(8��8(��(88(@(8�4L�8(@(88(��(8�L4�8����OY"&546226562#"'.#"#"'.'."#"'.'.#"#"&5476$32&"5462��И&4&NdN!>! 1X:Dx++w�w++xD:X1 -�U�� �!�*,*&4&��h��h&&2NN2D& ..J< $$ <JJ< $$ <J.. ��P���bb&&�7!!"&5!54&#!"3!26! #!"&=!"&5463!2��`(8�� �@ � +��8(�@(8��(88(@(8�(��8(� @ @ �m+�U�`(88(�8(@(88(�� �h`���(\"&54&#"&46324."367>767#"&'"&547&547&547.'&54>2�l4 2cK�Eo���oED ) � � � ) D�g-;</- ?.P^P.? -/<;-gY�����Y� .2 L4H|O--O|HeO,����,Oe�q1Ls26%%4.2,44,2.4%%62sL1q�c�qAAq����4#!#"'&547632!2#"&=!"&=463!54632 �� �� @ ` �� �� `?`� � @ @ �! �� � � � ����54&+4&+"#"276#!"5467&5432632� � � ` _ �������v,Ԝ;G_j�)��`` �� �� _ԟ����7 �,��>�jL>���54'&";;265326#!"5467&5432632 �� �� � � � �������v,Ԝ;G_j�)��� ` ���� `������7 �,��>�jL>�����X`$"&462#!"&54>72654&'547 7"2654'54622654'54&'46.' &6 �&4&&4&�y��y�%:hD:Fp�pG9�F�j� 8P8 LhL 8P8 E; Dh:%������>�4&&4&}y��yD~�s[4D�d=PppP=d�>hh>@�jY*(88(*Y4LL4Y*(88(*YDw" A4*[s�~����>�����M4&"27 $=.54632>32#"' 65#"&4632632 65.5462&4&&4�G9��������& <#5KK5!��!5KK5#< &ܤ��9Gp�p&4&&4&@>b�u��ោؐ&$KjK�nj��j�KjK$&����j��j�b>Ppp��� %!5!#"&5463!!35463!2+32����@\��\���8(@(8�\@@\������\@\���(88(��\��@��34#"&54"3#!"&5!"&5>547&5462�;U gI@L4�@�Ԗ�@4L2RX='�8P8��'=XR� U;Ig04Lj��jL4*\���(88(�����\��@"4&+32!#!"&+#!"&5463!2�pP@@P���j�j�@�@�\�@\�&��0�p����j�� ��� \��\�&��-B+"&5.5462265462265462+"&5#"&5463!2�G9L4�4L9G&4&&4&&4&&4&&4&L4�4L� ��&���=d��4LL4d=�&&�`&&�&&�`&&�&&��4LL4 ��&�#3CS#!"&5463!2!&'&!"&5!463!2#!"&52#!"&=4632#!"&=463�(8(��(88(�(`�x ��c�`(8���@��@��@�`(��(88(@(8(D��9�8(��`@�@@�@@��/?O_o��������-=%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!!5463!2#!"&5463!2� @ @ @ @ @ @ � @ @ @ @ � @ @ � @ @ � @ @ @ @ � @ @ � @ @ � @ @ @ @ � @ @ � @ @ @ @ � @ @ @ @ ����� @ &�&&&�@ @ �@ @ @ @ �@ @ ��@ @ �@ @ �@ @ �@ @ ��@ @ �@ @ �@ @ �@ @ ��@ @ �@ @ �@ @ ��@ @ �@ @ @ @ ���� `��&&�&& ��/?O_o�����%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!#!"&=!!5463!24&+"#54&+";26=3;26%#!"&5463!463!2!2� @ @ @ @ @ @ � @ @ @ @ � @ @ � @ @ @ @ � @ @ @ @ ���8(�@(8�� @ @ � @ @ � @ &�&&@8(�(8@&�@ @ �@ @ @ @ �@ @ ��@ @ �@ @ �@ @ ��@ @ �@ @ @ @ ��� (88( ��� �@ `` �� `` -�&&& (88(��&@����<c$4&"2!#4&"254&+54&+"#";;26=326+"&5!"&5#"&46346?>;463!2�KjKKj�����KjKKj�������&��Ԗ���Ԗ�&&�@�&�&KjKKjK�� ��jKKjK ������.��&j��jj��j&4&�@�@&&���#'1?I54&+54&+"#";;26=326!5!#"&5463!!35463!2+32����������� \��\����8(@(8�\ \����������\@\���(88(��\����: #32+53##'53535'575#5#5733#5;2+3����@��E&&`�@@��` ���� `��@@�`&&E%@�`��@ @ @�� �� � � � �� ��@ 0 @��!3!57#"&5'7!7!��K5�������@ � � @���5K�@����@@��� �����#3%4&+"!4&+";265!;26#!"&5463!2&�&�&�&&�&&�&�w�@w��w�w���&&��@&&��&&@��&&��@w��w�w�����#354&#!4&+"!"3!;265!26#!"&5463!2&��&�&��&&@&�&@&�w�@w��w�w�@�&@&&��&�&��&&@&:�@w��w�w��-M�3)$"'&4762 "'&4762 s 2 �. � 2 �w�� 2 �. � 2 �w�� 2 � � 2 �w�w 2 � � 2 �w�w M�3)"/&47 &4?62"/&47 &4?62S �. 2 ��w 2 �� �. 2 ��w 2 �M �. 2 �� 2 �. �. 2 �� 2 �.M�3S)$"' "/&4762"' "/&47623 2 �w�w 2 � � 2 �w�w 2 � �� 2 ��w 2 � �.v 2 ��w 2 � �.M�3s)"'&4?62 62"'&4?62 623 �. �. 2 �� 2 �. �. 2 �� 2� �. � 2 �w� 2v �. � 2 �w� 2-Ms3 "'&4762s �w� 2 �. � 2� �w�w 2 � � 2 MS3"/&47 &4?62S �. 2 ��w 2 �M �. 2 �� 2 �.M 3S"' "/&47623 2 �w�w 2 � �m 2 ��w 2 � �.M-3s"'&4?62 623 �. �. 2 �� 2- �. � 2 �w� 2���/4&#!"3!26#!#!"&54>5!"&5463!2 �� @ �^B�� &�& ��B^^B@B^ @ �� M��B^%Q= &&<P&^B@B^^�+3"&5463!2#3!2654&#!"3#!"&=324+"3�B^^B@B^^B�� @ �� `�^B��B^�p�^B�B^^B�@B^`�@ � �S`(88(`` ��'$4&"2%4&#!"3!26#!"&5463!2�&4&&4� �� @ �^B��B^^B@B^f4&&4&�� �@ ��B^^B@B^^/$4&"2%4&#!"3!264+";%#!"&5463!2�/B//B� � ���0L4�4LL44L_B//B/�� �@ M �4LL44LL��� >& $$ ������(���r���^����a�a��������(���^����a�a����!C#!"&54>;2+";2#!"&54>;2+";2pP��PpQ��h@&&@j�8(�Pp�pP��PpQ��h@&&@j�8(�Pp@��PppP�h��Q&�&�j (8pP��PppP�h��Q&�&�j (8p��!C+"&=46;26=4&+"&5463!2+"&=46;26=4&+"&5463!2Q��h@&&@j�8(�PppP�Pp�Q��h@&&@j�8(�PppP�Pp��@h��Q&�&�j (8pP�PppP�@h��Q&�&�j (8pP�Ppp@�@� #+3;G$#"&5462"&462"&462#"&462"&462"&462"&462#"&54632K54LKj=KjKKj��KjKKj�L45KKjK�<^�^^��KjKKj��p�pp���\]��]\��jKL45K��jKKjKujKKjK��4LKjKK�^^�^��jKKjK��pp�p�r]��]\����� $$ ���^����a�aQ�^����a�a�����,#"&5465654.+"'&47623 #>bq��b�&4�4&�ɢ5����" #D7e�uU6�&4&��m����1X".4>2".4>24&#""'&#";2>#".'&547&5472632>3�=T==T=�=T==T=��v)�G�G�+v�@b��R�R��b@�=&����\N����j!>�3l�k����i�k3�hPTDDTPTDDTPTDDTPTDD|x��xX�K--K��|Mp<# )>dA{��RXtfOT# RNftWQ���,%4&#!"&=4&#!"3!26#!"&5463!2!28(�@(88(��(88(�(8��\�@\��\@\��\���(88(@(88(�@(88�@\��\�\��\ �u�'E4#!"3!2676%!54&#!"&=4&#!">#!"&5463!2!232�5��([��5@(\&��8(��(88(��(8,�9.��+�C��\��\@\� \��6Z]#+��#,k��(88(@(88(��;5E�>:��5E�\�\��\ �\�1. ���$4@"&'&676267>"&462"&462. > $$ n%��%/���02� KjKKjKKjKKjKf���ff�������^����a�a�y��y/PccP/�jKKjKKjKKjK���ff���ff�@�^����a�a�����$4@&'."'.7>2"&462"&462. > $$ n20���/%��7KjKKjKKjKKjKf���ff�������^����a�a3/PccP/y�� jKKjKKjKKjK���ff���ff�@�^����a�a�����+7#!"&463!2"&462"&462. > $$ �&��&&��&KjKKjKKjKKjKf���ff�������^����a�a�4&&4&�jKKjKKjKKjK���ff���ff�@�^����a�a���#+3C54&+54&+"#";;26=3264&"24&"2$#"'##"3!2@������@KjKKjKKjKKjK����ܒ���,����������gjKKjKKjKKjK�X�Ԁ�,�,��#/;GS_kw�����+"=4;27+"=4;2'+"=4;2#!"=43!2%+"=4;2'+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;54;2!#!"&5463!2�``����``��`��``�``�``�``�``�``�````�p`���K5��5KK5�5Kp``�``�``��``�``�``��``�``��``��``�````��`��������5KK5�5KK@���*V#"'.#"63232+"&5.5462#"/.#"#"'&547>32327676���R?d�^��7ac77,9x�m#@#KjK�# ڗXF@Fp:f��_ #W��Ip�p&3z� �h[ 17��q%q#:��:#5KKu�'t#!X: %�#+=&>7p@���*2Fr56565'5&'. #"32325#"'+"&5.5462#"/.#"#"'&547>32327676@��ͳ�����8 2.,#,f�k*1x���-!���#@#KjK�# ڗXF@Fp:f��_ #W��Ip�p&3z� �e�`��v�o�8�t-� �:5 ��[�*�#:��:#5KKu�'t#!X: %�#+=&>7p �3$ "/&47 &4?62#!"&=463!2I�. 2 ��w 2 � -�@�)�. 2 �� 2 �. �-@@-��S�$9%"'&4762 /.7> "/&47 &4?62i2 �. � 2 �w� E��> u> ��. 2 ��w 2 � �2 � � 2 �w�w !�� �h�. 2 �� 2 �. ���;#"'&476#"'&7'.'#"'&476�' �)'�s "+5+�@ա' �)'����F*4*E�r4�M:�}}8��GO �*4*������~� (-/' #"'%#"&7&67%632���B�;><���V�?�?V�� -����-C�4 <B�=�cB5���!%��%!�b 7I�))�9I7��� #"'.5!".67632y��( ��# ��##@,( �)���8! !++"&=!"&5#"&=46;546;2!76232-S��S����������S� ��S��S�`���`��� ������K$4&"24&"24&"27"&5467.546267>5.5462 8P88P88P88P�8P88P�4,�C��S,4p�p4,,4p�p4,6d7AL*',4p�pP88P8�P88P8HP88P8`4Y��&+(>EY4PppP4Y4Y4PppP4Y�%*<O4Y4Ppp��� %@\ht� "'&4762"&5462&#!"&463!2#"'&'7?654'7&#"&'&54?632#!"&463!2"&5462"'&4762�� ����@U�SxyS���R���#PT����('�#��TU�SxySN���@���� � 3��@��xS�SUO#���'(���V^�'(���PVvxS�SU��i��@�� `�<+"&=46;2+"&=467>54&#"#"/.7!2���<'G,')7��N;2]=A+#H � �0P��R��H6^;<T%-S�#:/*@Z} >h���.%#!"&=46;#"&=463!232#!"&=463!2�&�&&@@&&�&@&�&�&&&��&&�&�&�&&��&f�&&�&&b�#!"&=463!2#!"&'&63!2&�&&&'�'%@% �&&�&&�&&&&�k%J%#/&'#!53#5!36?!#!'&54>54&#"'6763235��� ����Ź���}���4NZN4;)3.i%Sin�1KXL7觧�* ��#��& *������@jC?.>!&1'\%Awc8^;:+<!P��%I%#/&'#!53#5!36?!#!'&54>54&#"'6763235��� ����Ź���}���4NZN4;)3.i%Pln�EcdJ觧�* ��#��& *������-@jC?.>!&1'\%AwcBiC:D'P%! #!"&'&6763!2�P������&:�&?�&:&?����5"K�,)""K,)���h#".#""#"&54>54&#"#"'./"'"5327654.54632326732>32�YO)I-D%n "h.=T#)#lQTv%.%P_� % %�_P%.%vUPl#)#T=@�/#,-91P+R[�Ql#)#|'�' 59%D-I)OY[R+P19-,##,-91P+R[YO)I-D%95%�_P%.%v���'3!2#!"&463!5&=462 =462 &546 ����&&��&&��&4&r&4&�������@����&4&&4&�G݀&&������&&f�������� ��sCK&=462 #"'32=462!2#!"&463!5&'"/&4762%4632e*&4&i����76`al�&4&���&&��&&}n� R � R �z����f�Oego�&&�5�����`3��&&����&4&&4&� D� R � R z����v���"!676"'.5463!2@�@w^�Cc�t~55~t�cC&�&@���?J���V��|RIIR|��V&&��#G!!%4&+";26%4&+";26%#!"&546;546;2!546;232�����@@@@�L4��4LL4�^B@B^�^B@B^�4L�� �� ��N�4LL44L`B^^B``B^^B`L����L4&"2%#"'%.5!#!"&54675#"#"'.7>7&5462!467%632&4&&4��@�o�&�&}c ;pG=( 8Ai8^�^.�&4&&4&`�� `f�s��&& j�o/;J!#2 KAE*,B^^B!` $� ��-4&"2#"/&7#"/&767%676$!2�8P88P��Qr�� @ U��� @� {`P�TP88P8�����P`�� � @U @�rQ���!6'&+!!!!2Ѥ��� 8�������̙�e�;<*��@8 !�G��G�GQII���� %764' 64/&"2 $$ �f��3f4�:�4����^����a�a�f4334f�:4�:�^����a�a����� %64'&" 2 $$ ���:4f3��f4F���^����a�a��4�f4���4f�^����a�a����� 764'&"27 2 $$ �f�:4�:f4334����^����a�a�f4��:4f3���^����a�a����� %64/&" &"2 $$ -�f4���4f�4����^����a�a��4f��3f4�:w�^����a�a���@��7!!/#35%!'!%j��/d�� �jg2�|�8�����������55���dc ��b���@��! !%!!7!���FG)��D�H:�&�H����d���S)��U4&"2#"/ $'#"'&5463!2#"&=46;5.546232+>7'&763!2�&4&&4f]w�q�4�qw] `dC���&&�:F�ԖF:�&&���Cd`�4&&4&���� ]����] `d[}�&�&�"uFj��jFu"�&�&�y}[d�#2#!"&546;4 +"&54&" (88(�@(88( r&@&�Ԗ8(��(88(@(8@����&&j��j�����'3"&462& . > $$ �Ԗ������>a��X��,��f���ff�������^����a�a�Ԗ�Ԗ�a>����T�X��,�,�~�ff���ff�@�^����a�a����/+"&=46;2+"&=46;2+"&=46;2�8(�(88(�(88(�(88(�(88(�(88(�(8 �(88(�(88(�(88(�(88(�(88(�(88��/+"&=46;2+"&=46;2+"&=46;2�8(�(88(�(88(�(88(�(88(�(88(�(8 �(88(�(88�(88(�(88�(88(�(88���5E$4&"2%&'&;26%&.$'&;276#!"&5463!2KjKKj� ��� �� � f��� �\� � �w�@w��w�w��jKKjK"�G � ܚ ��f � ��� �@w��w�w����� $64'&327/�a����^����� ��! ����^����a�a��J@%��% 6�5��/ 64'&"2 "/64&"'&476227<���ij��6��j6��u%k%~8p�8}%%�%k%}8p�8~%<���<�ij4j��4����t%%~8�p8~%k%�%%}8�p8}%k���54&#!"3!26#!"&5463!2&��&&�&�w�@w��w�w�@�&&�&&:�@w��w�w����/#!"&=463!24&#!"3!26#!"&5463!2���@�^B��B^^B@B^��w��w��w@w��@@�2@B^^B��B^^���w��w@w���+#!"'&?63!#"'&762�(��@� @�(@>@�%����%%��� ���!232"'&76;!"/&76 � �($��>��(���� ��J ���&%�����$%64/&"'&"2#!"&5463!2�ff4�-�4ff4f�w�@w��w�w��f4f�-�f4����@w��w�w�����/#5#5'&76 764/&"%#!"&5463!2��48`��� #�� ����\�P\��w�@w��w�w���4`8� �� #�@ ���`\P�\`�@w��w�w�����)4&#!"273276#!"&5463!2&� *���f4� '�w�@w��w�w�`�&')���4f�*�@w��w�w�����%5 64'&"3276'7>332#!"&5463!2�`��'(wa8! �,j.��(&�w�@w��w�w��`4`*�'?_`ze<�� bw4/�*��@w��w�w�����-. 6 $$ ���� �������(�r���^����a�a���O����(��������_�^����a�a����� -"'&763!24&#!"3!26#!"&5463!2y��B��(�(� �@ � �w�@w��w�w�]#�@�##� � �@ �@w��w�w����� -#!"'&7624&#!"3!26#!"&5463!2y(��(@B@u �@ � �w�@w��w�w��###��@��� �@ �@w��w�w����� -'&54764&#!"3!26#!"&5463!2@�@####���@��w�@w��w�w��B��(�(������@�@w��w�w����`%#"'#"&=46;&7#"&=46;632/.#"!2#!!2#!32>?6�# !"'�?_ BCbCa�f\ + ~�2� �� �}0�$ �� q 90r� � �pr%Dpu���?#!"&=46;#"&=46;54632'.#"!2#!!546;2��D a__���� g *`-Uh1 �������� �߫�} $^L�� ��� 4��b+"&=.'&?676032654.'.5467546;2'.#"�ǟ� B{PDg q�%%Q{%P46'-N/B).ĝ �9kC<Q 7>W*_x*%K./58`7E%_��� � ,-3� cVO2")#,)9;J)��� �"!*� #VD,'#/&>AX��>++"''&=46;267!"&=463!&+"&=463!2+32��Ԫ�$ � �� p���U�9ӑ @�/�*f�����o� VRfq �f=S��E!#"&5!"&=463!5!"&=46;&76;2>76;232#!!2#![� �� �� �� � �% )�� ��� ��" ��Jg Uh B�W&WX��� hU g�� �84&#!!2#!!2#!+"&=#"&=46;5#"&=46;463!2�j��@jo����� ������g�|�@��~�v����v� u�n#467!!3'##467!++"'#+"&'#"&=46;'#"&=46;&76;2!6;2!6;232+32Q�Kt#�� ��#F�N�Qo!��"�դ��ѧ����!�mY �Zga~bm]� [o�"�U+��������,����� @��h�� h@�@X ��h��h ��@�8���3H\#5"'#"&+73273&#&+5275363534."#22>4.#2>��ut 3NtR�P*�H�o2 Lo�@!�R(�Ozh=�,G<X2O:&D1A.1G$<2I+A;"B,;&$��L��GlF/�����3�D�����;a��$8$��".�!3! ��.�3!#!"&5463!���8( 8(��(88( ��h (8��(88(@(8�(8H!!#!"&5463!54&#!"3!2654&#!"3!2654&#!"3!26��(D 8(��(88( 8��@��@��@�$����(88(@(8��(8� @@@@@@"�} $BR3/&5##"'&76;46;232!56?5"#+#5!76;5!53'#3!533��H�� �� �����D��q �x7�� ���K/�/K��F��h�/"��� @`����Z s�Y��w�jj��jj��j"�} $4R%3/&5##"'&76;46;232!53'#3!533!56?5"#+#5!76;5��H�� �� ��������K/�/K��F����q �x7�� �h�/"��� @`����jj��jj��j�Z s�Y�� w"�)9IY%#"'&76;46;232#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2� �� ����� ��@������@���`�� @`�����������"�)9IY#!"&=463!2%#"'&76;46;232#!"&=463!2#!"&=463!2#!"&=463!2��� �� �������@��������@ ��r�� @`��r������"�� $CV%4&#"326#"'&76;46;232%#"'&'73267##"&54632!5346=#'73BX;4>ID2F�� �� ������8PuE>.'%&TeQ,j��m{��+�>R�{�?jJrL6V�� @`��7>wmR1q uW�ei��/rr� :V��r"�� $7V4&#"326#"'&76;46;232!5346=#'73#"'&'73267##"&54632BX;4>ID2F�� �� ������+�>R�{�8PuE>.'%&TeQ,j��m{��?jJrL6���� @`���rr� :V��r3>wmR1q uW�ei����@�\%4&#"326#!"&5463!2+".'&'.5467>767>7>7632!2&%%&�&��&& &�7.' :@�$LB�WM{#&$h1D! .I/! Nr�&&%%��&&�&&V?, L=8=9%pEL+%�%r@W!<%*',<2(<&L,"r�@\#"&546324&#!"3!26%#!#"'.'.'&'.'.546767>;&%%&�&��&& &i7qN�� !/I. !D1h$&#{MW�BL$�@: '.�&&%%���&&��&&�=XNr%(M&<(2<,'*%<!W@r%�%+LEp%9=8=L ��� +=\d����%54#"327354"%###5#5#"'&53327#"'#3632#"'&=4762#3274645"=424'.'&! 7>76#'#3%54'&#"32763##"'&5#327#!"&5463!2��BB��PJN�C'%! B?)#!CC $)�54f�"��@@ B+����,A A+�&�+A � ZK35N #J!1331�CCC $)��w�@w��w�w��2��"33�F�Y�F~��(-%"��o�4*)$�(*� (&;�;&&9LA38�33�4��S,;;,W��T+<<+T;(��\g7�x�:&&:�:&&<r����%-�@w��w�w���� +=[c}���#"'632#542%35!33!3##"'&5#327%54'&#"5#353276%5##"=354'&#"32767654"2 '.'&547>76 3#&'&'3#"'&=47632%#5#"'&53327�''RZZ�:k��id YYY.06� 62+YY-06 R[!.�'CD''EH$��VV�X:���:Y X;��:Y �fyd/%jG�&DC&&CD&O[52. [$�C-D..D�^^���* l�y1%=^�I86�i077S 3 $EWgO%33%O�O%35 ��EE�F�W�t;PP;p��t;PP;p�q��J�gT��F�Q%33&P�P%33%R� 7>%3���!+}��{�'+"&72'&76;2+"'66;2U �&� �� �(���P �*��'�e�J."�-d�Z��-n �-���'74'&+";27&+";276'56#!"&5463!2�~�}� �7��e � ���۩w�@w��w�w��"��� $Q#�'�!# ����@w��w�w�� �I-22#!&$/.'.'.'=&7>?>36����9II ! ' $ !�����01$$%A' $ ! ����g \7@�)(���7Y \7@�)(���7Y @���� '5557 ���,���VW�QV���.R���W��=���?��l��%l`��������~����0��!#!#%777 5! ������R!!�XC�C��fff�݀�#�� `��,��������{��{{�`��������Og4&"2 &6 $"&462$"&62>7>7>&46.'.'. '.'&7>76 �Ԗ�� ���HR6L66L�G�HyU2LL2UyH��HyU2LL2UyHn ��X�6X�� ��X�X�� Ԗ�Ԗ�����H�6L66L6�L2UyH��HyU2LL2UyH��HyU2L�n�6X�� ��X�X�� �����2#!"&54634&"2$4&"2�w��w�@w��w�|�||��|�||���w�@w��w�w����||�||�||�|��� !3 37! $$ �n6^�5�5^h ����^����a�a������M�1�^����a�a���P�� *Cg'.676.7>.'$7>&'.'&'? 7%&'.'.'>767$/u5'&$I7o�b?K�\[z�H,1���+.@\7<��?5\V ,$V��g.GR@ �7��U,+!����� # "8$}�{)�<�?L RR;kr,yE[��z# /1 "# #�eCI0/"5#`� ��"8���4~&p)4 2�{�H-.%W.L>���':Yi4&67&'&676'.'>7646&' '7>6'&'&7>7#!"&5463!2PR$++'TJX�j7-F��C',��,&C ."��!$28��h�/���"� +p��^&+3$ i��0(�w�@w��w�w��+.i6=Bn\C1XR:#"�'jj�8Q.cAj�57!?"0D��$4"P[ &2�@w��w�w��D��"%.5#5>7>;!!76�P�Yh�pN!�HrD0�M�� C0N��#>8\xx: �W]oW-�X���45���/%'#.5!5!#"37>#!"&5463!2p>,;$4 ��5eD�+W�cE���w�@w��w�w�K�()��F ,VhV��^9tjA0/�@w��w�w���@�#"'&76;46;23� �� �� ���&�� ��� ���++"&5#"&7632� ��� ^ c � �&� ��@�#!'&5476!2� &�� ���� ^ b ���'&=!"&=463!546� ��� �&� � �� ��� �� ��q&8#"'&#"#"5476323276326767q'T��1[VA=QQ3���qq�Hih"-bfGw^44O#A���?66%CKJ�A}}� !"�䒐""A$@C3^q|�z=KK?6�lk)���%!%!��V��V��u��u�u^-�m5�w��}�n�����~7M[264&"264&"2"&546+"&=##"&5'#"&5!467'&766276#"&54632� � ��*<;V<<O@-K<V<�<+*<J.@�k��c�lG H_�_H �<+*<<*+< �<*�R+<<+�*<�f.@�+<<+��+<<+�@.��7�uu�7� �**� ���R+<<+�+;; ��"%3I�#5472&6&67><&4'>&4.'.'.'.'.'&6&'.'.6767645.'#.'6&'&7676"&'&627>76'&7>'&'&'&'&766'.7>7676>76&6763>6&'&232.'.6'4."7674.'&#>7626'.'&#"'.'.'&676.67>7>5'&7>.'&'&'&7>7>767&'&67636'.'&67>7>.'.67� \ �� U7 J#!W!' "';% k )" ' /7* I ,6 *&"! O6* O $.(� *.' .x�, $CN�� � * � 6 7%&&_f& ",VL,G$3�@@$+ " V5 3" ""�#dA++ y0D-%&n4P'A5j$9E#"c7Y 6" & 8Z(;=I50' !!e �R �� "+0n?�t(-z.'<>R$A"24B@( ~ 9B9, *$ <> ?0D�9f?Ae � .(;1.D 4H&.Ct iY% * � 7�� �� J < W0%$ ""I! *D ,4A'�4J" .0f6D�4p�Z{+*�D_wqi;�W1G("%%T7F}AG!1#% JG3��� '.2>Vb%&#'32&'!>?>'&' &>"6&#">&'>26 $$ *b6�~�#��= ���XP2��{&%gx|�� .���W)o���O��LO�sEzG<�� CK}E $MFD<5+ z���^����a�a$�MW�M��1>]|�YY�^D �եA��<��K�m����E6<�"�@9I5*�^����a�a�����>^4./.543232654.#"#".#"32>#"'#"$&547&54632632�':XM1h*�+D($,/9p�`D�oC&JV<�Z PA3Q1*223�I�oBkែhMI����oPែhMI��oP�2S6,M!"@-7Y.?oI=[<%$('3 -- <-\�%Fu���Po��IMh���Po����IMh,���#?D76&#!"7>;267676&#!"&=463!267 #!"'&5463!26�%�8#!� ��&&Z"�M>2!�� �^I7LRx_@�>MN�""��`�=&&*%�I�}��, � L�7_jj��9����/%4&#!"3!264&#!"3!26#!"&5463!2�� ��� ��&��&&�&��������&&�&&��19#"'#++"&5#"&5475##"&54763!2"&4628(3�-� &�B.�.B�& �-�3(8Ig�gI�`������(8+U��e&��.BB.&����+8(�kk��`�������%-"&5#"&5#"&5#"&5463!2"&4628P8@B\B@B\B@8P8pP�Pp�����@�`(88(`�p.BB.�0.BB.���(88(�Pppͺ�������!%>&'&#"'.$ $$ ^/(V=$<;$=V).X���^����a�a��J`"(("`J��^����a�a��,���I4."2>%'%"/'&5%&'&?'&767%476762%6�[���՛[[���՛o�� �ܴ ��� �� �� $ $� " �$ $ �� �՛[[���՛[[�5`�� ^� �^ 2`�� `2 ^��^ ��` �����1%#"$54732$%#"$&546$763276�68��ʴh�f�킐&^�����zs��,!V[���vn)� �6���<��ׂ�f{���z����}))N�s���3(@����+4&#!"3!2#!"&5463!2#!"&5463!2@&�&&f&��&&�&@&�&&&�4&&4&�@&&�&&��&&&& ��`�BH+"/##"./#"'.?&5#"&46;'&462!76232!46 `&�C�6�@Bb0�3eI;��:�&&�&4�L�4&���F��� �Z4&�w�4�) ���'' �5�r�&4&&�4&��&4��������}G�#&/.#./.'&4?63%27>'./&'&7676>767>?>%6}�)(."�2*&�@P9A #sG�q] #lh�<*46+( < 5�R5"*>%</ '2�@� 53*9*,�Z&VE/#E+)AC (��� 2k<X1$:hI(B " !:4Y&>"/ +[>hy ���K !/Ui%6&'&676&'&6'.7>%.$76$% $.5476$6?62'.76&&'&676%.76&'..676�#"NDQt �-�okQ//�jo_ ������ ���%&J�������Ղ���YJA-��.-- 9\DtT+X?*<UW3' 26$>>�W0{�"F!"E � ^f`$"�_]\�<`�F�`�F�D��h>Cw�ls���J@�;=?s :i_^{8+?` ) O`�s2R�DE58/K��r #"'>7&4$&5m��ī��"#���̵�$5���$�"^^W����=���ac��E�*���c������zk./"&4636$7.'>67.'>65.67>&/>z X^hc^O<q����+f$H^XbVS!rȇr?5GD_RV@-FbV=3!G84&3Im<$/6X_�D'=NUTL;2KPwt��Pt= �&ռ ,J~S/#NL,��8JsF);??1zIEJpq�DIPZXSF6\?5:NR=��;.&1��+!"&=!!%!5463!2�sQ9����Qs�*�*�*sQNQsBUw�� wUBF��H���CCTww���%1#"&=!"&=463!54632. 6 $$ � �� �� `?��������(�r���^����a�a� �� � � � ���(��������_�^����a�a�����%1#!#"'&47632!2. 6 $$ � ���� @ ` ��������(�r���^����a�a� � ? @ ���(��������_�^����a�a�����/#"'&476324&#!"3!26#!"&5463!2&�@�& �@ � �w�@w��w�w����&@B@&��� �@ �@w��w�w�����"&462 >& $$ �Ԗ��*�����(���r���^����a�a�Ԗ�Ԗ �������(���^����a�a���]�6#"$54732>%#"'!"&'&7>32'!!!2�f:�л����Ѫz��~�u:� (�(%`V6B^hD%��i�(�]̳ޛ ��*>�6߅�����r�#�!3?^BEa�߀�#�9���#36'&632#"'&'&63232#!"&5463!2 ��Q,&U�#+' �;il4L92<D`����w�@w��w�w�����`9ܩ6ɽ]`C4�7�7�&�@w��w�w����D+"&5#"'&=4?5#"'&=4?546;2%6%66546;2������� �� ��w�ww�w�������cB �G]B �G��t�y]t�y� ���#3C#!+"&5!"&=463!46;2!24&#!"3!26#!"&5463!2���@��`@`�^B��B^^B@B^��w��w��w@w��@��`@`���2@B^^B��B^^���w��w@w�����'/?P+5#"&547.467&546;532!764'!"+32#323!&ln��@ :MM: @��nY*�Yz--zY�*55QDD�U���9p��Y-`]��]`.X /2I$� t�@@/!!/@@3,$,3�$p$0�0��&*0��&���&�� !P@���RV2#"&/#"&/#"&546?#"&546?'&54632%'&54632763276%�>S]�8T;/M7��7T</L7�=Q7,�i�<R7,�5T</L666U;/M5�<U<,�i���6i���Q=a!;�;V6-�j�;V6-�5 P=/L596Q</L5�<U6-�i�;V7,�7O;-I6��8��i;k���)I2#!"&5463#9"'.'.'3!264&#!"2>7%>�w��w�@w��w�!"�5bBBb/�/* 8(@(87)��(8=%/�'#?��w�@w��w�w����#~$EE y &�L(88e):8(%O r �O�?GQaq47&67>&&'&67>&"$32#"#"'654 $&6 $6&$ Co��L��.*�KPx���.*� iSƓi 7J?��~�pi{_Я�;��lL�������UZ=刈�����刈�����_t'<Z �:! ���@! ��j`Q7$k�y, R����f��k*4�������LlL��=Z=刈��������&$&546$7%7&'5>�����]���5��%��w�����������&��P�?�zrSF�!|��&0 ##!"&5#5!3!3!3!32!546;2!5463���)� )����;)��);;)��)���&&������&@@&�&��&�� � 6 $&727"'%+"'&7&54767%&4762������֬>4P���t+8?:: � ::AW��``���EvEEvE<�.���"�e$IE&�O�&EI&�{h.`��m���"&#"&'327>73271[ >+)@ (���]:2,C?��*%�Zx/658:@#N �C�=�E�(�o��E=��W'c:������#!#"$&6$3 &#"32>7!����ڝ���yy��,��{��ۀ�ہW�^F!�L�C=���y�:�y��w���߂0H\R%�"N^ '&76232762$"&5462"&46274&"&'264&#"'&&#"32$54'>$ $&6$ G>��>0yx1��4J55J�5J44J5�Fd$��?�4J55%6�E��#42F%��$f�������LlL�q>>11�J44%&4Z%44J54R1F$Z-%45J521��Z%F1#:��ʎ 9�������LlL�����#Qa"'&7622762%"&5462"&546274&#"&'73264&#"'&&#"32654'>#!"&5463!2� 5�5 *�*��.>.-@-R.>.-@-�<+*q�6�- -- 0�<�o,+< ��3�w�@w��w�w�� 55 **�.. -- .. --G*<N�' ,-@-+*��M <*2 z��z 1�@w��w�w�����0<754&""&=#326546325##"&='26 $$ bZt�t&�sRQs��Z<t�sQ���^����a�a�>OpoO��xzRrqP6�z~{{Prr��^����a�a�����]054&"#"&5!2654632!#"&57265&<T<����H<T<������H������<T<8v*<<*������ ��+;;+l���:�������=:��*;;*��� %!!"!!26#!"&5463!2��@� ]���]�@�w�@w��w�w�����]� �@��@w��w�w��� %)3!!#335!!5!5!%#!!5!5!%#H��H{����R��H��H{���G��G{�)���q���G����R�R�q���R�R�q����� #0@#"'632#"'632&#"7532&#"#7532#!"&5463!2L5+*5��L5+*5~�}7W|�3B}��}JC��7=}�w�@w��w�w�D�ZQ�[�1�N:_��)�i�$��)���@w��w�w�� )� �����������6.#&#"'&547>'&#".'&'#"&5467%&4>7>3263232654.547'654'63277.'.*#">7?67>?>32#"'7'>3'>3235?�K�cgA+![<E0y�$,<'.cI ,#� '!;7$�=ep��� ��/�/7/ D+R>,7* 2(-#= /~[(D?G �|,)"#+)O��8,+�'�6 y{=@��0mI�#938OA�E` -� )y_/FwaH8j7=7?%����a %%!?)L J 9=5]~�pj %(��1$",I $@((� +!.S -L__$'-9L 5V��+ 6�T+6.8-$�0��+ t�|S1��6]�&#"'&#"67>76'&'&#"67>32764.#"#.32>67>7 $&54>7>7>7�rJ�@"kb2)W+,5/1 # Z -!��$IOXp7s�LCF9�vz NAG#/ 5|����Հ';RKR/J#=$,�9,�+$UCS7'2"1 !�/ , /--ST(::(�ep4AM@=I>".)xΤ��ls��Y�|qK@ %(YQ�&N EHv~����<Zx'#"&5467&6?2?'&"/.7.546326#"&'&/7264/7'764&"'?>>32.��A�UpIUxYE.A�%%%h%����%hJ%�����D,FZxULsT�gxUJrV�D�%hJ%�����@/LefL.C�%Jh%�����C�VsNUxϠ�@.FZyUHpV�A�%h&%%���%Ji%�����C�WpIUybJ/��Uy^G,D�%Jh%�����@�UsMtU�C�%hJ%�����C-Kfy�EX[_gj��&/&'.''67>7>7&'&'&'>76763>7>#&'&'767672'%'7'+"&'&546323267>7%#"'4'6767672,32�,+DCCQL�Df' %:/d B 4@} �&!0$�?�����J�f�d�f-�.=���6(��:!TO�? !I�G_�U% ����. k*.=;� 5gN_X�� " ## 292Q41� ��*����6���nA;�|� �BSN. %1$���� 6 $��nk�^�'7GWgw�����2+"&5463#!"&5463!254&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26#"&=! B^^B�B^^B�:F�j��B^8(�(`�(� ������������������`�(8���^B��B^^B@B^�"vE�j�^B(8(�`(�����������������������8(����/?O_o��������/?2#!"&5463;26=4&+";26=4&+";26=4&+";26=4&+"54&+";2654&+";2654&+";2654&+";2654&+";2654&#!"3!2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26@&&�&&�@@@@@@@@�@@@@@@@@@@��@@@@@@@@@@@@@@@@@@@&��&&�&��@@��@@��@@��@@��@@@@@@@@@@���@@@@@@@@�@@@@@@@@@@@��`' "&5#"&5&4762!762$"&462���B\B@B\B��O�p�P����������.BB.���.BB.8$P��O広�������3CQ#".54>32#".546322#"&#"#"54>%".54>32%2#"&54>&X=L|<&X=M{<��TML�FTML�F�v�"?B+D�?B�J�p��H=X&<{M=X&<|dMTF�LMTF�(<kNs�I<kNs���Pvo�JPwo�/��s.=ZY�VӮv�Nk<J�sNk<I�shwPJ�ovPJ�o@��+"&7.54>2�r_-$�$-_rU���U��%��&&5%ő������'- "'.546762����@��F�F�$�@B�@$.&�,�&.]]|�q����#<���<#(B�B��B%'-%'-'%'-"'%&'"'%.5467%467%62����@��l�l����@��l�l,���@��G�G�&!�@@�@�@@�@!&+#�+#�6�#+�$*`�:�p������:�p���x� �p����=�`$>����>$�&@��&@� �@&�p�@�� &.A!!"!&2673!"5432!%!254#!5!2654#!%!2#!8���Zp��?v�d���Ί�e�ns�6(���N[�����RW�u?�rt1Sr�F���|��iZ��@7�����މoy2���IM��C~[�R �yK{T:���%,AGK2#!"&5463!!2654'654.#532#532"&5!654&#"327#2#>!!�w��w�@w��w��~u��k'JTM��wa��| DH��������>�I1q�Fj?����w�@w��w�w�����sq�*4p9O*�¸Z^���qh LE �������"(nz8B M���'?"&4624&#"'.'324&#"3267##"&/632632.�ʏ����hhMA�LR vGhг~��~������Ky���O^ ��ʏ�ʏ��В*�LM@!<I�~��~����������t\��0�������CM4&"2#"&'676&/632#!"&=3267%2654&#"&#"%463!2"&4632�r�qq��tR8^4.<x3=RR��w�@w���_h� Y��Ӗ��� K>�שw�w���ȍ�de�)�qrOPq�Ȧs:03=<x!m�@w��w�E\x�g�ӕ��є��%w�w����d��Ȏ��V�� -<K\%.'.>7'.?67'67%'>&%'7%7./6D�\$> "N,��?a0�#O���1G�����9�'/���P(1#00�� ($=!F"�9|��]�"RE<�6'o��9%8J$\:��\H�iTe<?}V��#�oj��?���d,6���%N#" Hl��S��VY�]C =�@�C4&"2!.#!"4&"2+"&=!"&=#"&546;>3!232�^�^^���Y � ^�^^��`p�p�p�p`�]i�bb�i]�~�^^�^�e��^^�^���PppP��PppP��]��^^�]��3;EM2+"&=!"&=#"&546;>;5463!232264&"!.#!"264&" ]�`p�p�p�p`�]i�b���b�i���^^�^d�Y � !�^^�^��]��@PppP@@PppP@�]��^��^�]� ^�^^��e��^�^^� ��3$#!#!"&5467!"&47#"&47#"&4762++�&�2 $��$ �2&��&��&�4�&��&��Z4&�&##&�&4�&4�&4���4&�m4&�m���+DP4'&#"32763232674'&!"32763 3264'&$#"32763232> $$ g����* �o�`#�ə�0#z��#l(~���̠)���-g+����^����a�aF s" +g�(�* 3#!| #/IK/%*%D=)[�^����a�a���� !!!'!!77!���,���/���,�-���a��/G�� t%/;<HTbcq������%7.#"32%74'&"32765"/7627#"5'7432#"/7632#"5'7432#"&5'74632 #"/6327#"/6327#"/46329"&/462"&/>21"&/567632#!.547632632 * ��X � ^ ` ��� ^b ��c� f�u�� U`�59u��� ��� 4�J��� l�~ ~� F�� �� �2����� � � �� �m����|O�,��� ���� ��� �������� ru| ��u� � "����� )9 $7 $&= $7 $&= $7 $&= $&=46��w���`���w���w���`���w���w���`���w��b����`����VT�EvEEvE�T��VT�EvEEvE�T*VT�EvEEvE�T*EvE�EvEEvE�Ev�#^ct�#!"&5463!2!&'&!"&5!632#"&'#"/&'&7>766767.76;267674767&5&5&'67.'&'ೊ�(8(��(88(�(`�x ��c�`(8��!3;:�A0�?ݫ�Y ^U 47D$ 7�4U3I� |��L38wtL0�`(��(88(@(8(D��9�8(��Q1&(!;�� (g- Up�~R�2(/{E���(Xz*Z%(�i6CmVo8�#T#!"&5463!2!&'&!"&5!3367653335!3#4.5.'##'&'35�(8(��(88(�(`�x ��c�`(8�iF������F��Zc�r�cZ�`(��(88(@(8(D��9�8(���k�k�" ��kk�J !�� �k�#S#!"&5463!2!&'&!"&5!%!5#7>;#!5#35!3#&'&/35!3�(8(��(88(�(`�x ��c�`(8�-Kg kL#D��C��JgjL��D���`(��(88(@(8(D��9�8(���jj� �jjkk��kk����#8C#!"&5463!2!&'&!"&5!%!5#5327>54&'&#!3#32�(8(��(88(�(`�x ��c�`(8� G]�L*COJ?0R��\wx48>�`(��(88(@(8(D��9�8(���jj��RQxk��!RY�#*2#!"&5463!2!&'&!"&5!!57"&462�(8(��(88(�(`�x ��c�`(8�������P�pp�p�`(��(88(@(8(D��9�8(����������p�pp� �#*7JR5#5#5#5##!"&5463!2!&'&!"&5##5!"&54765332264&"�����<(8(��(88(�(`�x ��c�`(8����k�ޑc�O"�jKKjK�������������`(��(88(@(8(D��9�8(������SmmS?M���&4&&4�#9L^#!"&5463!2!&'&!"&5!#"/#"&=46;76276'.'2764'.�(8(��(88(�(`�x ��c�`(8���������6dd�WW6&44�`(��(88(@(8(D��9�8(��.�� ����G���5{��{5�]�]$59�95�#3C#!"&5463!2!&'&!"&5!2#!"&5463#"'5632�(8(��(88(�(`�x ��c�`(8��4LL4��4LL4l �� �`(��(88(@(8(D��9�8(���L4��4LL4�4L�� Z �#7K[#!"&5463!2!&'&!"&5!>&'&7!/.?'&6?6.7>'�(8(��(88(�(`�x ��c�`(8�`3��3��3��3�v � ? � �`(��(88(@(8(D��9�8(���&��&-��&��&� ? �� '���6#'. '!67&54632".'654&#"32�eaAɢ/PRAids`WXyzO�v��д��:C;A:25@Ң>�����-05r��n������`��H(�����' gQWZc[��� -%7' %'-'% %"'&54762�[������3[��M���N����� ��3"��,��""3,3"o�ng�$������߆���]�g�n��$����+��)�� ")")" ��x#W#"&#!+.5467&546326$32327.'#"&5463232654&#"632#".#"o���G��n\�u_MK'����̨|�g?CM7MM5,QAAIQqAy��{�b]BL4PJ9+OABIRo?z��.�z�� �n�6'+s�:�������z�cIAC65D*DRRD*�wy�al@B39E*DRRD*��'/7 $&6$ 6277&47' 7'"' 6& 6'�lL������������R�R����ZB|��R�R��>����d�ZZ��������LlL�Z����R�R«����Z��&�>���«|��R� � ��! $&54$7 >54'5��������P���f���f����P�����牉�@��s��-����ff���`-����c6721>?>././76&/7>?>?>./&31#"$&��(@8!IH2hM>' )-* h'N'��!'Og,R"/!YQG<I *1) (-O1D+0�n�������z�3fw���G2'3�rd1!sF0o ��.q"!%GsH8��@-!5|w|pgS= "B2PJfh�G���d�R �(P]ly��&$'77&7567'676'"'7&'&'7&47'6767'627''6$'67'654'7&'7'&'&'7&'5&$ $6 $&6$ j��j:,A��A��S9bb9R#:j���8AܔA,z��C�9Z04\40Z9�C��!B�;X0,l,0X;�B�*A8ܔA	j`b9S$#R99#&A��8A�` ������䇇�<Z<䳎������LlL�fBϬ"129�,V<4!���!88dpm��"��BV,�92[P*V*P\M�C� �C�M\P*V*P]L�D� �D�L&BV*�8*8!����f�!4<gmpd88!&!8*8�*VB�Z<䇇�����䇇��������LlL�����9Eis�%#"5432#"543275#&#"3254&'.547>54'63&547#5#"=3235#47##6323#324&"26%#!"&5463!2F]kbf$JMM$&�N92<Vv;,&)q(DL+�`N11MZ %G���&54 # i�<$8&@��0H12F1d�w�@w��w�w��B?@�UTZ3%}rV2hD5%f-C#�C@,nO �a7�.0�x2 yR�uR/u�%6;&�$76%$56S�@w��w�w��D��<Hlw%4#"324&#"32!".5475&5475.546322#654'3%#".535"&#"5354'33"&+32#"&54632S����;<;||w $+�|('-GVVG-��EznA�C?H_��`Rb���]Gg>Z2&`��9UW=��N9:PO;:dhe\=R���� +)�&')-S9��9kJ�<)Um�Q��/��-Ya^"![��Y��'(<`X;_�L6#)|����tWW:;X��� #'#3#!"&5463!2) p�*�xeשw�@w��w�w���0,\8�����@w��w�w��9��I#"'#"&'&>767&5462#"'.7>32>4."&'&54>32JrO<3>5�-&FD(=Gq���@C$39a��LL��²�L4 &) @]��v� �q#CO���!~<ZK#*Pq.���% L��²�LL��arh({�w\���i&5467&6747632#".'&##".'&'.'#".5467>72765'./"#"&'&5 �}����1R<2"7MW'$ ;IS7@�5sQ@@)�R#DvTA; 0x I)�!:>�+<B76:NFcP:SC4r�l+r �E%.*a-(6%('�>)C 6.�>� !-I[4&#"324&#"3264&#"324&#"326&#"#".'7$4$32'#"$&6$32D2)+BB+)3(--(3�1)+BB+)�4'--'4��'���#!0>R �H���MŰ9�o�u7ǖD��䣣��� R23('3�_,--,�R23('3�_,--,�����NJ ������?u�W�m%������#"'%#"'.5 %&'&7632�!� �;� `��u%"��(����!]#�c�)(� ��� #"'%#"'.5%&'&76 �!� ��� �(%#�#���fP_�"�(���!�)'��+�ʼn�����4I#"$'&6?6332>4.#"#!"&54766$32#!"&=46;46;2z�䜬��m� I�wh��QQ��hb�F�*�@&('�k�������@����z�� � _hQ��н�QGB�'(&�*�eozΘ�@@`��� >. $$ ����ff���ff�����^����a�af���ff�����^����a�a��>�����"&#"#"&54>7654'&#!"#"&#"#"&54>765'46.'."&54632326323!27654'.5463232632�,�-,�,",:! %�]& %@2(/�.+�*)6! <.$.�.*�*"+8# � #Q3,�,+�+#-:#"</$�) w� ��� ,* x9-.2"' ,, ���@�&,, ��Qw ,����,#"+"&5#+"&5&'&'&547676)2�%2$l$�#l#�b~B@XXyo2�$CI@5��$$�>$$�/:yu��xv)%$ ��/?CG%!5%2#!"&5463!5#5!52#!"&54632#!"&5463#5!5`���&&�&&������ �&&�&&�&&�&&@������&�&&&���������&�&&&�&�&&&��������%2 &547%#"&632%&546 #"'6���������\~����~\h� ���~\��h\�������V� �V�������V��V���%5$4&#"'64'73264&"&#"3272#!"&5463!2}XT=��=TX}}�~�>SX}}XS>�~�}�w�@w��w�w���~:xx:~�}}Xx9}�}9xX}�@w��w�w���/>LXds.327>76 $&6$32762#"/&4762"/&47626+"&46;2'"&=462#"'&4?62E0l�, *"�T�.�D@Yo������oo����@5D� [ Z �Z [ ``��[ Z �2 ,�l0 (T�"�.�D5@������oo��oY@D, Z [ � [ Z ��``EZ [ �5%! $&66='&'%77'727'%am��lL�������m�f�?���5���5>�f�F�tu�ut�F������������LlL�H�Y�C�L|��|L����Y�˄(��E''E*(�/?IYiy����%+"&=46;2+"&=46;2+"&=46;2+"&=46;2%"&=!#+"&=46;2+"&=46;2+"&=46;2+"&=46;2!54!54>$ +"&=46;2#!"&=������@�������&&������@��������������3P�� >��P3��&��&��r���r��r���&��&���r���r��r��� he 4LKM:%%:MKL4�W��T�&&��%/9##!"&563!!#!"&5"&5!2!5463!2!5463!2�&&�&��&�&&���� ��� ��&��&&i�@����&&@&7�����'#5&?6262�%%�o����;����j|/����&jJ%�p��&j;&i&�p���/|���j�ţ���%Jk%�o��%�� :g"&5462#"&546324&#!"263662>7'&75.''&'&&'&6463!276i���~ZYYZ~�@O��S;+[G[3YUD#o?D&G3I=J�y�TkBuhNV!WOhuAiS�y*'^C�C^'*SwwSTvvTSwwSTvv���WID\�_"[�g��q# /3qF��r2/ $r�g�%4 �HffH�J4d���#!#7!!7!#5!������VF��N����rmN�N��N����������N���!Y���+?Ne%&'&'&7>727>'#&'&'&>2'&'&676'&76$7&'&767>76'6�# <�;1�1x��#*# �G,T9�3%�/#0v�N�Z;:8��)M:( &���C.J}2 %0���� ^* J�F &�7'X"2L�DM" +��6� M2+'BQfXV#+] #���' L/(e�B�9 �#,8!!!5!!5!5!5!5#26%!!26#!"&5!5���������������&4&���&�pP��Pp������������������@��@&&@��!&�@PppP@�* �� 9Q$"&54627"."#"&547>2"'.#"#"&5476$ "'&$ #"&5476$ (�}R}hL�K� N���N ����U�d:� �x�x� �����8��� �� � � ,, |2222� MXXM �ic,>>,� ���� � ���� � ��̺ � ��'/7?KSck{4&"2$4&"24&"24&"24&"24&"24&"24&"24&"264&"24&#!"3!264&"2#!"&5463!2�KjKKj�KjKKj��KjKKjKKjKKj��KjKKj��KjKKjKKjKKj��KjKKjKLhLLhL��KjKKj�&�&&&KjKKj�L4��4LL4�4L5jKKjKKjKKjK�jKKjK��jKKjK�jKKjK�jKKjK��jKKjK�jKKjK���4LL4��4LL�jKKjK�&&�&&��jKKjK�4LL44LL ��'E!#"+"&7>76;7676767>'#'"#!"&7>3!2�W�",&7'� #$ &��g�pf5O�.P�q�ZZdS���-V"0kqzTx�D!��!8�p�8%'i_�F?;�k��R(`�� !�&)�'� (2!&6367! &63!2�! `�B��1LO�(���+#�=)�heC��Qg#s`���f�4#����6�������q�'���X�|0-�g�� �>IY#6?>7&#!%'.'33#&#"#"/3674'.54636%#"3733#!"&5463!2��4��:@��7�vH��%�h��EP{��0&<'VFJo���1,1.F6��A��#���L4�4LL44L"%� 7x'6 O\�JYFw���~�v^fH$ !�"xdjD"!�6��`J�4LL44LL�� �+3@GXcgqz�����-<JX{�&#"327&76'32>54.#"35#3;5#'#3537+5;3'23764/"+353$4632#"$2#462#"6462""'"&5&5474761256321##%354&'"&#"5#35432354323=#&#"32?4/&54327&#"#"'326'#"=35#5##3327"327'#"'354&3"5#354327&327''"&46327&#"3=#&#"32?"5#354327&3=#&"32?"#3274?67654'&'4/"&#!"&5463!2_��g��QQ��h���^_�~\[[\]�_^���h��QQ��g�e��<F�$�$$��� !!�&&�/!/ !!� 00/e&'!"e$� '!!�''� 8''NgL4�4LL44L�UQ��gh��QUk=<Sc���cc,-{k���jUQ��hg��Q�� �9 ,&W &$U�K$$KK$$KDC(>(" ! =))=2�( '! '�L#(>( &�DC(>(z�L#�DzG)<)�4LL44LL�� � BWbjq}��+532%+5324&+32763#4&'.546327&#"#"'3265#"&546325&#"32!264&"2%#'#735#535#535#3'654&+353#!"&5463!29$<=$�@?�SdO__J-<AA@)7")9,<$.%0*,G3@%)1??.+&((JgfJ*�A�������!&��j�jj��GZYG�иwssw��PiL>8aA !M7�7MM7�7M�3!� 4erJ]��&3YM�(, ,%7(#) ,(@=)M%A20C&Me�e��(X���0&Ėjj�jV�� 8Z8J9���N/4���$�8NN8�8NN�� �#&:O[��� $?b3'7'#3#%54+32%4+324+323'%#5#'#'##337"&##'!!732%#3#3##!"&53733537!572!56373353#'#'#"5#&#!'#'#463!2#"5#"5!&+&+'!!7353273532!2732%#54&+#32#46.+#2#3#3##+53254&".546;#"67+53254&.546;#"#'#'##"54;"&;7335wY-AJF���=c�(TS)!*RQ+��*RQ+�Y,�B^9^��Ft`njUM�') ~PS�PR�m���٘���M7�7Mo7�q @)U 8�"����E(�1��++��NM7�7Mx3�7��8�D�62��W74�;�9�<�-A"EA�0:��AF@�1:�ؗ����B�f~~""12"4(�w$#11#�@}}!%+%5(�v$:O�\z��K��?*$\amcrVl��OO176Nn�<!E(=�<&l/������<<������ [ZZYY�89176���7OO7�==..//cV==::z,,,,aa,,��7OO7�Z::��;;Y fcW�( "6-!c�( !5 # b�t88176����tV: &$'*9 %e#: %'*9B����<<��; &(����� �#:Sn�����#"&54632%#76;2#"&54632%4&+";2?>23266&+"&#"3267;24&+"'&+";27%4&+";2?>23266&+"&#"3267;254+";27#76;2#!"&5463!2�3%#2%%,, _3$$2%%��M>�ALVb5)LDHeE:< E�Mj,K'-R M�~M>�ARVb5)LEHeE:< E� JAB�I*'!($rL4�4LL44Lv%1 %3!x*k�$2 %3!�;5�h n a� !(lI;F �� r�p p8;5�h t a� !(lI;F��` #k�4LL44LL �� � 2HW[lt��#"'5632#6324&'.54327&#"#"&'32767#533275#"=5&#"'#36323#4'&#"'#7532764&"24'&#"327'#"'&'36#!"&5463!2=!9�n23��BD$ &:BCRM.0AC'0RH`Q03'`�.>,&I / *� / ��8/��n-(G@5��$ S3=�,.B..B�02^`o?7je;9G+��L4�4LL44LyE%# �Vb�;A !p &'F:Aq)%)#o�rg�T$v2�� 8�)2����z948/�{�8A�B..B/��q?@�r�<7(g/��4LL44LL��?#!"&'24#"&54"&/&6?&5>547&54626=�L4�@�ԕ;U g3 �� T �2RX='�8P8|�5� ����4Lj��j� U;Ig@ �� ` � "*\���(88(�]k ��&N4#"&54"3 .#"#!"&'7!&7&/&6?&5>547&54626;U gI��m*��]�Z0�L4�@�ԕ���=o=CT �� T �2RX='�8P8|�5� � U;Ig��Xu?bl3���@4Lj��j��a���` �� ` � "*\���(88(�]k����/7[%4&+";26%4&+";26%4&+";26!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@���0 �� o`^B��B^`5FN(@(NF5���@��@��@�u �@�LSyuS�@�%44%����,<H#"5432+"=4&#"326=46;2 >. $$ ~Isy9���"SgR8v�H����D� w ����ff���ff�����^����a�a�m2N+�� )H-mF+1����0*F +f���ff�����^����a�a�����b4&#"32>"#"'&'#"&54632?>;23>5!"3276#"$&6$3 �k^?zb=ka`�U4J{�K_/4�^����W�& vx :XB0���܂�ff���) f������zz��X��lz=l�apz��o�b35!2BX��� �G@8��' '=vN$\f���f� 1 SZz�8�z�X�#("/+'547'&4?6276 'D�^�h � i��%5�@�%[i � h�]��@������]�h � i��%�@�5%[i � h�^�@@������)2#"&5476#".5327>OFi-���ay~�\~;��'�S���{�s:D8>)AJfh]F?X��{[��TC6��LlG��]��v2'"%B];$�-o��%!2>7>3232>7>322>7>32".'.#"#"&'.#"#"&'.#"#546;!!!!!32#"&54>52#"&54>52#"&54>52�-P&+#($P.-P$'#+&PZP&+#"+&P-($P-.P$(#+$P.-P$'#+&P-.P$+#pP@@Pp�H85K"&ZH85K"&ZH85K"&Z����@��Pp��@��@��@pMSK5, :&�LMSK5, :&�LMSK5, :&����!!3 ! �����@�����@@����� #"$$3!!2"j������aѻxl���a����lx�a�a����j������!!3/"/'62'&63!2��'y�� �`�I ��y�����My�� �`�I ��y'W`#".'.#"32767!"&54>3232654.'&546#&'5&#" 4$%Eӕ;iNL291 ;XxR`�f՝�Q8T������W��iW�gW:;*:`�Qs&?RWXJ8�oNU0�J1F@#) [�%6_PO�QiX(o�`��_?5�"$���iʗ\&>bd�s�6�aP*< -;iFn�*-c1B���Wg4'.'4.54632#7&'.#"#"'.#"32767'#"&54632326#!"&5463!2��#$( 1$6]' !E3P|ad(2S;aF9'EO�Se�j]�m�]<*rYs��hpt.#)$78L*k�h�w�@w��w�w��B % $/$G6 sP`X):F�/�fwH1p�dl�qnmPH�ui�kw_:[9D'��@w��w�w��34."2>$4.#!!2>#!".>3!2�Q��н�QQ��н�QQ��h�~w��w�h���f����ff����н�QQ��н�QQ��н�QZ����ZQ�����ff���ff�#>3!2#!".2>4."f����ff�����н�QQ��н�QQ���ff���ff��Q��н�QQ��н� ,\!"&?&#"326'3&'!&#"#"' 5467'+#"327#"&463!!'#"&463!2632���(#�AH����s���9q � ci��<=� #�]�<������OFA��!�������re��&&��U�&&![e��F �������U?���g�����4_���������a�?b�+��r7�&4&��&4&�p,�+K4&"2$4&"2.#!"3!264&#!"3!2#"&=!"&=#47>$ �KjKKjKKjKKjH#�j#H&&&������KjK�KjK�g �V� ijKKjKKjKKjK���..n((�[���5KK5��5KK5�[po�Nv<<vN�:f���.R#!"&463!24'!"&5463!&$#"!2#!32>+#"'#"&546;&546$3232�2$�B$22$�$�*$22$�X�ڭ��ӯ�$22$�tX'���hs2$���ϧ��kc�$22$���1���c�$2�F33F3VVT2#$2����ԱVT2#$2��g���#2UU���݃ �2$#2UU�1݃���2��,u�54#"67.632&#"32654'.#"32764.'&$#"7232&'##"&54732654&#"467&5463254632>32#"'&�ru�&9��%"*#�͟ <yK0Og�" &9B3�;��㛘8��s%+DWXRD= @Y%� !Q6R�!4M8�+6rU^z=)�RN��.)C>O%GR�=O&^���op������C8�pP*�b�Y _�#��$��N Pb@6��)?����+0L15"4$.�Es �5I�Q"!@h"�Y7e|J>z�iPe��n�eHbIl�F>^]@����n*9 ���6[_3#"&54632#.#"32%3#"&54632#.#"326%4&'.'&! ! 7>7>!��������� �=39? 6'_���������� �>29? 5'17m-V����U--,�bW.�������뮠@Fyu0HC$������뮠@Fyu0HC$L���=?? <����=! A <��`�;+"&54&#!+"&5463!2#!"&546;2!26546;2���p���Ї����0�p�����p���@��I�������pp���>Sc+"&=46;254&+"&+";2=46;2;2=46;2;2%54&#!";2=;26#!"&5463!2���A5�DD�5A7^6a7MB5��5B7?�5B~�`��`��`0`��rr��5A44A5�����v�5AA5�f�*A���`��`0`����� !!!! #!"&5463!2��ړ�7���H��7j�v�@v��v�v��'���:��@v��v�v���MUahmrx���������������#"'!"'!#"&547.547.54674&547&54632!62!632!#!627'!%!"67'#77!63!!7357/7'%# %'3/&=&' 5#?&5476��!�p4�q"���"�"�6�"� ��'������h*�[��� ��|�*��,�@���?wA�UM�pV���@�˝�����)��Ϳw����7(�{��*U%���K6������=0�(���M��� ��"!O dX$k !!��! ����b�� ���[�����TDOi ��@��6��b��xBA�ݽ�5 � �ɝ:����J���+���3����,��p x�1���������Fi (��R�� 463!#!"&5%'4&#!"3���`����а@.�.@A-X��f�B����$��.BB.�.C��} )&54$32&'%&&'67���"w�`�Rd]G�{��o]>p6��sc(��@wg����mJ�PAjy���YW�a͊AZq���{HZ�:�<dv\gx�>��2AT�Kn������+;"'&#"&#"+6!263 2&#"&#">3267&#">326e��~�└�Ȁ|��隚���Ν|����ū|iy�Zʬ��7Ӕ�ް�r|�uѥ��x�9[��[9�jj��9A�N��N�+,#ll"���B�S32fk��[/?\%4&+";26%4&+";26%4&+";26%4&+";26%#!"&5467&546326$32�]]��ee��ee��ee��$��~i �qfN-*���������#����Sj������t�2"'q�C���B8!�'�> !%)-159=AEIMQUY]agkosw{��������! %! 5!#5#5#5#5#57777????#5!#5!#5!#5!#5!#5!#5!#5#537#5!#5!#5!#5!#5!#55#535353535353%"&546326#"'#32>54.&54>3237.#"����������Q%%%%%%%%%?iiihOiixiiyiixii�Arssrrssr��%s�ssrrss�Ns%%%%%%%%%%�����������'<D<'paC_78#7PO7)("I$ 75!����RA��b��(���ss�ss�ss�ss�ss�"/!".""." !."".!/^.".^.".]/".�$$$$$$$$$$$$$$$$��Os$$$$$$$$$$$$$$sO$s�ss�ss�ss�ss�ss#��������}$) 13?* ,./: -�s�*4&"2$4&"2#!"&5463!2!5463!2_��������?-��-??-�,@�@,�-?����pq�8��,??,D,??,��,??(�Z2#".#"3267>32#".543232654&#"#"&54654&#"#"&547>326���ڞU�zrhgrx�S��Пd�U <e�����x՞����Zf��_gן:k=2;�^��9��Œ��7\x��x\7����K=5Xltֆ�W����W{e_�%N��%,%CI��%���#+W4&+54&"#";26=32"&462"&462!2#!"&54>7#"&463!2!2�&�&4&�&&�&4&���KjKKj�KjKKj� ���&&�&%��&&�&&4&�&&�&4&�&&��5jKKjKKjKKjK��%z 0&4&&3D7&4& %&���'S4&"4&"'&"27"&462"&462!2#!"&54>7#"&463!2!2&4�&4&�4&4��KjKKj�KjKKj� ���&&�&%��&&�&&4&�%&&�ے&4��"jKKjKKjKKjK��%z 0&4&&3D7&4& %&�� & !'! !%!!!!%"'.763!2�o���]�F������o�������oZ��Y��@:�@�!�!�g���������������f�/�/��I��62'"/"/"/"/"/"/"/7762762762762762762%"/77627&6?35!5!!3762762'"/"/"/"/"/"/%5#5!4�ZSS6SS4SS4SS4SS4SS4SS4�ZSS4SS4SS4SS4SS4SS4S�-4�ZSS4S@������4SS4�ZSS6SS4SS4SS4SS4SS4S@�����ZSSSSSSSSSSSSSS�ZSSSSSSSSSSSSSy�ZRRR@%:= :+������: =���RR�ZSSSSSSSSSSSSS���������Cv!/&'&#""'&#" 32>;232>7>76#!"&54>7'3&547&547>763226323@``����` VFaaFV $. .$ ��y��y� .Q5Z���E$ ,l<l, $E���R?Y*��@���@�2 !#""#! ��y��y=r�na�@@(89*>�*%>>%*�>*98(QO�!���L\p'.'&67'#!##"327&+"&46;2!3'#"&7>;276;2+6267!"'&7&#"(6&#"#"'�D��g��OOG`n%�E������LL{�@&&�N�c,sU�&&�!Fre&&�s�����s���#�/,�������<=� #�]�g��L�o�GkP�'��r-n&4&2�-ir&�&�?���o ��������4_�����5OW! .54>762>7.'.7>+#!"&5#"&5463!2"&462�{�����{BtxG,:`9(0b��Կ�b0(9`:,GxtB��&@&�&@&K5�5K`�����?e==e?1O6#, #$ ,#6OO��&��&&�&�5KK���������?!"'&'!2673267!'.."!&54632>321 ��4��q#F�""�8'g��o#-��#,"t�Yg��>�oP$$Po�>� ��Z�e�p#����)�R��0���+I@$$@I+����+332++"&=#"&=46;.7>76$ ������@����ᅪ*��r���������@��@�����������r���'/2+"&5".4>32!"&=463 �&@��~[���՛[[��u˜~���gr�������&�`����u՛[[���՛[~~@��r������=E32++"&=#"&=46;5&547&'&6;22676;2 >�����``@``�ٱ��?E,��,=?��r�������H�����@``@�GݧH`�j��j���r������BJ463!2+"&=32++"&=#"&=46;5.7676%#"&5 &@�~���``@``�� �v�X����r�������&���������@``@����+BF��`r������ks463!2+"&=32++"&=#"&=46;5&547'/.?'+"&5463!2+7>6 %#"&5 &@�~���``@``��~4e 0 io@& �jV 0 Z9�������r�������&���������@``@�G�ɞ5o , sp� &@k^ , c8~~��`r�������8>KR_32++"&=!+"&=#"&=46;.767666'27&547&#"&'2#"�����@�@���'�Ϋ���'������sg��gs�����ww�@����sg��g����@����@���-ss��ʃl������9���9��������OO���r9���9��FP^l463!2+"&=$'.7>76%#"&=463!2+"&=%#"&54'>%&547.#"254&' &@�L?����CuГP ��v�Y�� &@�;"����������ޥ�5݇�����ޥ���5�`&����_��ڿg��w��BF�@&����J_ s���&��&�����?%x���������%x��JP\h463!2+"&='32++"&=#"&=46;5.7676632%#"&56'327&7&#"2#"� &@�L? ���ߺu�``@``��} �ຒ�ɞ���������ue��eu�9����ue��e�&����_��"|N�@``@��"��"|a~���l����o����9���9��r9��@�9���;C2+"&5"/".4>327'&4?627!"&=463 �&@Ռ . �N~[���՛[[��u˜N� . ����gr�������&�` . �O��u՛[[���՛[~N� . ��@��r������9A'.'&675#"&=46;5"/&4?62"/32+ ��'��֪�����\ . �4� . \���r������|��ݧ���憛��@�\ . �� . \�@��r�����~9A"/&4?!+"&=##"$7>763546;2!'&4?62 m�� - ���@���ݧ���憛��@&� - �@r������m4�� - ����ٮ*������� - ��r������+"&5&54>2 ����@��[���՛[�r�����������dG�u՛[[���r������ ".4>2������r�[���՛[[���՛�r������5�՛[[���՛[[����$2#!37#546375&#"#3!"&5463�#22#�y��/Dz?s����!#22#�2#��#2S�88� ����2#V#2��L4>32#"&''&5467&5463232>54&#"#"'.K���g��&Rv�gD� $*2% +Z hP=DXZ@7^?1 ۰��3O+�l��h4���`���M@8'�+c+RI2 �\�ZAhS�Q>B�>?S2Vhui/�����,R0+ ZRkm�z�+>Q2#"'.'&756763232322>4."7 #"'&546��n/9�b�LHG2E"D8_ p�dd���dxO�"2�xx��ê�_�lx�2X !+'5>-�pkW[C �I I@50�Od���dd��˥�Mhfx�����x^���ә� �#'+/7!5!!5!4&"2!5!4&"24&"2!!!��� 8P88P�� 8P88P88P88P����������P88P8 ���P88P88P88P8� ������������+N &6 !2#!+"&5!"&=463!46;23!#!"&54>32267632#"_����>�@` �� � �� ` � � L4Dg��y� 6Fe=O���O�U�4L��>���� � �� ` � ` ��4L�2�y5eud_C(====`L4����3V &6 #"/#"/&54?'&54?6327632#!"&54>32 7632_����>��� � �� � �� � �� � ��%%S��y� 6Fe=�J�%��>���� � �� � �� � �� � ��%65%S�y5eud_C(zz.!6%$!2!!!46;24&"2!54&#!"�&���&�&@�Ԗ��V�@&&�@��&&�Ԗ�Ԗ@��&���3!!! !5!'!53!! #����7I�e�����eI7��CzC�l��@�����@������@�#2#!"&?.54$3264&"!@������մ���pp�p���������((��������p�pp����#+/2#!"&?.54$3264&"!264&"!@������մ���^^�^@����^^�^@���������((��������^�^^�����^�^^�����v(#"'%.54632 "'% 632U�/�@��k0�G��,�zD#[�k#� /t�g�� F�� ����Gz����� #'#3!) p�*�xe���0,\8�����T���#/DM�%2<GQ^lw����� &'&676676&'&7654&'&&546763"#"'3264&7.>&'%'.767&7667&766747665"'.'&767>3>7&'&'47.'.7676767&76767.'$73>?>67673>#6766666&'&6767.'"'276&67&54&&671&'6757>7&"2654&57>&>&'5#%67>76$7&74>=.''&'&'#'#''&'&'&'65.'&6767.'#%&''&'#2%676765&'&'&7&5&'6.7>�&5R4&5S9 W"-J�0(/�r V"-J�0(.�)#"6&4pOPpp�c�|o}vQ�[�60X�Q��W1V� #5X N"& . ) D>q J:102(z/=f��*4!>S5b<U$:I o<G* , &"O X5 #! �� R N# C 83J*��R !(D #%37 �;$-.� (,��覦�6ij � ���"���)9 E�%����!B83 j9�6/, :QD')yX#�63V ��b�a , Ue��LPA@���* ̳�`Xx*&E V36��% B3% B3XA #!.mU"A #!.mUB-#2+Jii�i�m-C<I(m��8qF/*)0�S I E5&+>!% (!$p8~5..:5I ~��T� 4~9p# ! )& ?()5F 1 � d%{v*�: @e s|D�1d {�:�*dAA|oYk'&��<��tu��ut�&vHC�XXTR�;w�� ��71 Z*&' 1 9? . $��Gv5k65P<�?8q=4�a SC"��1#<�/6B&!ML �^;�6k5wF1<P�C �;$"&462"&46232>.$.�`�aa��sa�``��Z9k����'9؋ӗa-*Gl|M�e_]`F&O������ܽ�sDD!/+�``�aa�``�a1<YK3( /8HQelA�Z3t_fQP<343J;T7Q�+?Kgw $6&$ $&62+"5432+"&=.54 $;26=462;26=4& 4&#!"3!26)����߄��4R4߄��mlL�������r {jK#@#Q�a����^�����@���@���`&��&&�&�������߄��4R4�Ď������LlL�N� �@K5#:rr:#5K���^����a�a��``]��]``����&&�&& /!3#4&#!"3!265##!"&5463!22�������@K5^B��B^^B@B^5K���� �@���5K�B^^B�B^^B�K /!2##!"&5463!2#4&#!"3!265�5KK5^B��B^^B@B^���@��K5��5K�B^^B�B^^B�`� �@ /!2##!"&5463!2#4&#!"3!265�5KK5^B��B^^B@B^���@��K5��5K�B^^B�B^^B�`� �@ /!2##!"&5463!2#4&#!"3!265�5KK5^B��B^^B@B^���@��K5��5K�B^^B�B^^B�`� �@ +2##!"&5463!2#4&#!"3!265�5KK5^B��B^^B@B^���@�K5��5K�B^^B�B^^B�`� �@ �{#!&'#"'&547632m*��� �0���((�'(�$0K ��*�*��% 3#!3# '!#53 5#534!#53 6!3@����@@@��pp��@@@����@@pp@��`������� ����� �+/7;A#3!5!!3#!!5!35!355#%53#5!#35#!!!!!!!!���������������������������������������������������������������������� � #'+/3?CGW#3!5!!35!!3#!!5!#!5!3535!355#%#3%!53#5!#35#!5##5!3!5!3!5 ����������������������������������������������������������������������������������������������������������������!"&5463!2!"!�`(88(@(8�`(8�}2�2R �`8(@(88(�`8HR2�2���##6?6%!!!46#!"&5463!2x���� ��8�(�`(�(88(@(8� ���� (8��(`�(8(@(88�� �'ATd+5326+5323##"' %5&465./&76%4&'5>54&'"&#!!26#!"&5463!2� �� ���i�LCly5�)*H�celzzlec0h�b,,b�eIVB9@RB�9�J_�L4�4LL44L44%��2"��4��:I;p!q4b�b3p(P`t`P(�6EC.7B�I6�4LL44LL�� �.>$4&'6#".54$ 4.#!"3!2>#!"&5463!2Zj��b�jj[���wٝ]�>o��Ӱ�ٯ�*�-���oXL4�4LL44L'�)�꽽�)�J)���]��w����L���`��ֺ��۪e���4LL44LL�;4&#!"3!26#!"&5463!2#54&#!";#"&5463!2� �� @ �^B��B^^B@B^��� �� ��B^^B@B^`@ �� M��B^^B@B^^>�� �� �^B@B^^��5=Um ! !!2#!"&=463!.'!"&=463!>2!2#264&"".54>762".54>762��������?(`��`(?��b|b��?B//B/�]�����]FrdhLhdrF�]�����]FrdhLhdrF@�@��@�(?��@@?(@9GG9@/B//B�aItB!!BtI�Ѷ�!!��ьItB!!BtI�Ѷ�!!��ь�-M32#!"&=46;7&#"&=463!2#>5!!4.'.46�ՠ��`�@`ՠ��`���M�sF�Fs�MM�sFFs�M����ojj�o��@@�jj�@@�<���!(!���!(!�-3?32#!"&=46;7&#"&=463!2+!!64.'#�ՠ��`�@`ՠ��`�� � Dq�L�L�qD����ojj�o��@@�jj�@@B>=�C�����-3;32#!"&=46;7&#"&=463!2+!!6.'#�ՠ��`�@`ՠ��`��UVU96�g�g�6����ojj�o��@@�jj�@@β����**ɍ�-G32#!"&=46;7&#"&=463!2#>5!!&'.46�ՠ��`�@`ՠ��`���M�sF�Fs�M�k�k�����ojj�o��@@�jj�@@�<���!(!3��3!(!�9I2#!"&=4637>7.'!2#!"&=463��@b":1P4Y,++,Y4P1:"�":1P4Y,++,Y4P1:"b�@@��@7hVX@K-AA-K@XVh77hVX@K-AA-K@XVh7����Aj"#54&#"'54&#"3!26=476=4&#"#54&'&#"#54&'&'2632632#!"&5&=4632>3265K @0.B @0.B#6'&�& l @0.B 2' .B A2TA9B;h" d� mpP��Tl��L�c�_4.H�K5�]0CB.�S�0CB.�/#��'?&&)$�$)�0CB. }(AB.�z3M�2"61�d�39�L/PpuT(If�c�_�E�`1X"#4&"'&#"3!267654&"#4&"#4&26326#!"&'&5463246326�\B B\B�&@5K�&@�"6LB\B B\B ��sc�i�L}Q�P<m$��3�jN2�c�B.�p.BB.���3K5+"�3,"� �.BB.��.BB.���.�G=�c�i�(+�lOh7/DVj�"�c�=���&5Jb�#"'&=.547!"&46;'.54632!2327%.54&#"327%>%&#"!"3!754?27%>54&#!26=31��?>I��j��jq,J[�j.-t�j�lV��\���$B.R1?@B.��+?2`$�v5K-%��5KK5�.olRIS+6K5�̈$B\B 94E.&�ʀ�15uE& �Ԗ�Pj��j�dX�U�GJ7!.B � P2�.B � %2@ �7�K5(B�@KjKj�?+f�UE,�5K~!1��.>F.��F,Q5*H��$b2#!"&=%!"&=463!7!"&'&=4634'&#!">3!!"3!32#!"3!23!26=n$<vpP��Pp���Pp�w�*�Rd�ApP�]��'@�A& 3@��&H-�[(8@ 2�EB^&1 =&�&81����PppP��pP w���cOg Pp��c� 4& #.& &,,:8(�%^B &� .�&&��2t"&'&54'&5467>32>32>32#"#.#"#.#"3!27654&#"547654&#"#654&�Mye t|]�WS�Sg�SY�\x{ 70"1i�92�DU1&= �� =&0@�c >&/Btd4!�*"�8K4+"��@H@/'= t�?�_K�93-�]� UlgQ���QgsW �]#�+�i>p&��3�0&�VZ&0B/ ���%3B.�"t�o ){+C4I��( /D0&�p0D��3[_cg"'&#"3!2676=4&"#54&#"#54&#"#4&'2632632632#!"&'&5463246#!#!#�5K�)B4J�&@�#\8P8 @0.B J65K J6k� cJ/4qG^�\hB�2<m$��3�iG;�� �K5����6L4+"�3p`b�)<8(=0CB.@Z7OK5`:7O��k�EW�^�tm��@Q7/DVi�##j�������������%4Ia�2#!"&5&546325462632"32654&"3267654&76;74&"#.#"2676=#"&'+53264&#!"3</�U�X�dj���jP��ԖEu�!7JG72P � B�% � B.!7� @�A�f+?�jKjK@�B(5K,EU�H*5Q,F��.F>.��1!~K5y?��^\��Vl�j�t-.j�[J,qj��j��I7$��?1R.B�+��.B$`2?g�vEo.�5KK5��%-K��6+SIR[��&.E49 B\B$���5K�G#!+"&5!"&=463!2+"&'+"'+"'&5>;2>76;2Y �� � �� M �.�x �-� N� � � � �u �� , u �? L�W��� ���# � *:J4'&+326+"'#+"&5463!2 $6& $&6$ <!T{�BH4� ��&�>UbUI-����uu�,�uu�ڎ������LlL�AX!��J��m����f\�$ 6u�����uu�,�K������LlL���-[k{276/&'&#"&5463276?6'.#"!276/&'&#"&5463276?6'.#" $6& $&6]�h-%Lb`J%E5 ,5R-����h -%Lb`J%E5 ,5R-���'����uu�,�uu��lL�������/hR dMLcN����hR dMLcN����1u�����uu�,��������LlL�@��� ' 7 '7 �����`��`H� �����`�`H� �!`��������`H� � ���`�`�`H���`��'% 7' 7'7 ' $&6$ ���X�`��(W�:,�:��X�`��(WL�������LlL�X�`(W��:�B����X�`���(X�������LlL�� �� $%/9ES[�#"&54632$"&4624&"26$4&#"2%#"&462$#"&4632#"32&! 24> !#"&'.'#"$547.'!6$32�7&'77'&7�7N77N�'q�qq�q�qPOrq��E�st�����ts��st���}�||�}�������uԙ[W��Q���~,> n������P/RU P酛���n >,m�����'77'&77N77N6^Orq�qq�qq�q�t��棣棣�(~|��|on[��usј^�~���33������pc8{y%cq����33dqpf�� L 54 "2654"'&'"/&477&'.67>326?><���� x �������, (-'s�IVC��VH�r'-( $0@!BHp9[�%&!@0$u �� ������]\��\]��-$)!IH��V D�� VHI!)$-#3���6>N"&462."&/.2?2?64/67>& #!"&5463!2�]�]]�3 $; &|�v;$ (CS�3�1 =�rM= �4�TC(G���z�w�@w��w�w���]]�]��($-;,54�0= �sL =�45,;�����@w��w�w������(2#"$&546327654&#" &#"AZ�������\@�/#�%E1/#����#.1E$�!�[A�����懇�@�@\��!�#21E!��6!E13"�|!�� gL&5&'.#4&5!67&'&'5676&'6452>3.'5����A5R��V[t,G'Q4}-��&�<C!l n?D_@Փ>r!� ��G;��>��!g�1�����2sV&2:#;��d=�*'�5E2/..F�D֕71$1>2�F!���&12,��@K� r��#"&5462>%.#"'&#"#"'>54#".'7654&&5473254&/>7326/632327?&$ $6 $&6$ �!&"2&^ u��_��x��^�h ;J݃HJǭ q�E Dm! M� G?̯'%o�8 9U�������(F(�ߎ������LlL��&!&!SEm|�[��n{�[<ɪ "p� C Di% (K�HCέp�C B m8 @Kނ H�F(���������������LlL���"*6%&6$ 7&$5%%6'$2"&4}���x����3��n��QH������:dΏ���Xe�8�����z��' ������l�i���=!��7�����S�o�?v�������M '&7>>7'7>''>76.'6'���El:F�gr *�t6�K3UZ8�3P)3^I%=9 )<�}J���k+C-Wd�� &U���-��TE+]��Qr-�<Q#0 �C+M8 3':$ _Q=+If5[ˮ&&SG�ZoM�k���ܬc�#7&#"327#"'&$&546$;#"'654'632ե��fKYYKf�¥y�ͩ���䆎�L��1���hv�v��ƚw�wk��n�]��*��]�nlx��D��L�w�����~?T8b��b9SA}����+5?F!3267!#"'#"4767%!2$324&#"6327.'!.#"��۔c�2�8�Ψ����-\���?���@hU0KeFjTl�y�E3��aVs�z�.b��؏��W80��]T��Sts�<�h�O��_u7bBt���SbF/�o��|V]SHކ�J�������34&#!"3!26#!!2#!"&=463!5!"&5463!2 �� @ �^B� `��`� B^^B@B^ � �@ �@B^�@@�^B�B^^����>3!"&546)2+6'.'.67>76%&��F8$.39_��0DD�40DD0���+*M7{L *="# U<-M93#�D�@U8v�k�_Y �[�hD00DD0��0D�ce-JF1BD����N&)@ /1 d��y%F��#"'&'&'&'&763276?6#"/#"/&54?'&763276"&'&'&5#&763567632#"'&7632654'&#"32>54'&#"'.5463!2#!3>7632#"'&'&#"'&767632yq������oq>*432fb������a $�B? >B BB AA�.-QP���PR+ 42 %<ci���ђ:6&h�HGhkG@n�`��I���Ȍ5 !m��(|.mzy�PQ-. je���� �����q>@@?pp�gVZE|fb6887a %RB? =B ABBAJvniQP\\PRh!cDS�`gΒ��23�geFGPHX�cCI��_ƍ��5" �n�*T.\PQip� [*81 / 9@:��>t�%6#".'.>%6%&7>'.#*.'&676./&'.54>754'&#"%4>327676= >���vwd" �l����"3 /!,+ j2.|��%& �(N&w���h>8X}x�c2"W<4<��,Z~�fd�aA�`FBIT;hmA<7QC1>[u]) u1�V(�k1S) -� 0�B2*�%M;W(0S�[T�]I) A 5%R7<vlR12I]O"��V/,b-8�/_��#3CGk2#!"&546;546;2!546;2%;2654&+";2654&+"!32++"&=#"&=46;546;24LL4��4LL4�^B@B^�^B@B^�@@�@@�����@��@L4�4LL44L`B^^B``B^^B``�� �� ��@@��@���#3W#!"&=463!2!!%4&+";26%4&+";26%#!"&546;546;2!546;232���@�����@@@@�L4��4LL4�^B@B^�^B@B^�4L�@@��� �� ��N�4LL44L`B^^B``B^^B`L��#'7Gk%"/"/&4?'&4?62762!!%4&+";26%4&+";26%#!"&546;546;2!546;232W. �� . �� . �� . �� � ����@@@@�L4��4LL4�^B@B^�^B@B^�4L�. �� . �� . �� . �� ��� �� ��N�4LL44L`B^^B``B^^B`L��(8\ "'&4?6262!!%4&+";26%4&+";26%#!"&546;546;2!546;232� �� . �� . �`����@@@@�L4��4LL4�^B@B^�^B@B^�4L<� . �� . �:� �� ��N�4LL44L`B^^B``B^^B`L�2632632#!"&5463�&&&&��&&&���&���&��&&�&�#27+"&5 %264&#"26546��>&�&T�,��X�������q&&�1��X��,�LΒw�%��%;#!"&5463!546;2!2!+"&52#!"/&4?63!5!� �(��&&@&�&(��&�&@&&��(� �(� �&&@&&@��&&�&�&� �����#''%#"'&54676%6%%������� �hh �@�` ���!�� ���!� �� �� �� � ������ �#52#"&5476!2#"&5476!2#"'&546 � �� � ��� � �@� � �@� �� �@ � � 84&"2$4&"2$4&"2#"'&'&7>7.54$ �KjKKj�KjKKj�KjKKj��d�ne���4"%!������KjKKjKKjKKjKKjKKjK.���٫�8 !%00C'Z���'���.W"&462"&462"&462 6?32$6&#"'#"&'5&6&>7>7&54>$ �KjKKj�KjKKj�KjKKj�h��я�W.�{+9E=�c��Q�d�FK��1A 0)����LlL��jKKjKKjKKjKKjKKjK���p�J2`[Q?l&�����٫�C58.H(Y���ee��� � ���Y'����w��(�����O��'��R���@$#"&#"'>7676327676#"� �����b,XHUmM�.�U_t,7A3ge z9@xS���a�Q�BLb�(� ����V���U����� !!!�=�����=���w)��������AU!!77'7'#'#274.#"#32!5'.>537#"76=4>5'.465!��KkkK_5 5�� �#BH1��`L I���&�v6��SF���!Sr99rS!``� /7K%s}H���XV ��P��V e�� V�d/9Q[ $547.546326%>>32"&5%632264&#"64'&""&'&"2>&2654&#";2���P���3>tSU<�)tqH+>XX|W��h,�:USt��W|XX>=X* )���) +�^X^�|WX=>X�:_.2������//a:Ru?� Q%-W|XW>J�( �=u��>XX|WX�` *((* +2 2�X>=XW|E��03>$32!>7'&'&7!6./EU����noh��i����I\�������0<{ >ORD��ƚ�~�˕V�ƻ��o�R C3��7J6I`��Tb<�^M~M8O���� � 5!#!"&!5!!52!5463 ^B�@B^���`B^�^B `��B^^"�����^B��B^��0;%'#".54>327&$#"32$ !"$&6$3 ##320�J�����U��n��L�n��ʡ���~~�&��q�@�t�K�����L��}�'`� - -�ox����nǑUyl}��~������~�F����ڎ�LlL��t�`(88( �� 7!' !���\W�������\���d;����tZ�`_��O��;���}54+";2%54+";2!4&"!4;234;2354;2354>3&546263232632#"&#"26354;2354;2354;2�````��p�p��`�`�`� !,! -&M<FI(2�`�`�`�����@PppP���pppppp�# # � �pppp��p �j#"'&=!;5463!2#!"&=#".'.#!#"&463232>7>;>32#"&'#"!546��� ��%. `@��` :,.',-���Xj��jX�h-,'.,: kb>PppP>bk .%Z �&� �:k%$> $`��`6&L')59I"Tl�ԖlT"I95)'L&69Gp�pG9$ >$%k:��!+32&#!332 $&6$ ~O8��8���O�����������LlL�>pN ����� i������LlL���� '':Ma4&'#"'.7654.#""'&#"3!267#!"&54676$32#"'.76'&>$#"'.7654'&676mD5) z�{��6lP,@Kij��jOo�Ɏ���ȕ>>��[t��a)GG4?a�) ll >�;_-/ 9GH{�z�yN@,K�ԕoN��繁������y��! ?hh>$ �D��" >��â?$�� n"&5462'#".54>22654.'&'.54>32#"#*.5./"�~��~�s�!��m�{b6# -SjR,l'(s�-6^]It�g))[��zxȁZ&+6,4$.X%%Dc* &D~WL}]I0" YYZ��vJ@N*CVTR3/A3$#/;'"/fR-,&2-" 7Zr�^N��a94Rji3.I+ &6W6>N%&60;96@7F6I3���+4&#!"3!26%4&#!"3!26 $$ ��������^����a�a`@��@����^����a�a�����'7 $ >. %"&546;2#!"&546;2#/�a����^�����(�����������������^����a�a����(������N@��@�����4&#!"3!26 $$ @��@����^����a�a`@����^����a�a�����' $ >. 7"&5463!2#/�a����^�����(��������n@����^����a�a����(������N@���%=%#!"'&7!>3!26=!26=!2%"&54&""&546 �#��#]V�TV$KjK�KjK$��&4&�Ԗ&4&�>��9G��!�5KK5��5KK5�!��&&j��j�&&����#/;Im2+#!"&'#"&463>'.3%4&"26%4&"26%6.326#>;463!232#.+#!"&5#"�5KK5sH.�.Hs5KK5e# )4# %�&4&&4&�&4&&4&` #4) #%�~]�e�Z�&�&�Z�e�]E-�&��&�-EKjK�j.<<.�KjK��)�#)�`"@�&&�`&&�&&�`&&�)#�`)"�d�Xo&&oX�G�,8&&8!����O##!!2#!+"'&7#+"'&7!"'&?63!!"'&?63!6;236;2!2�@�@�8��@7 8��Q� N�Q� N�� 8G@�� 8GQ� N�Q� N7 �������8��8��H��H��k��% ".>2I�������2�0�]@��]��@o�����o@@o�����o㔕����a�22���]����]�p�^���|11|�9�9�|11|�(��%7'7' ' 7T���� d���lt��l)q��n�������luul�������)1$4&"24&"2 &6 +"&5476;2 &6 LhLLh�LLhLLhL����>� �� �& �&�`����>�hLLhLLhLLhL�����>����&�&�����>��G�� .7)1!62 1!62h��e�������2�20e���2�2>� v +4� [��d����+ ���d� �135#5&'72!5!#"&'"'#"$547&54$ ���Eh���`X����(����cY���z�:L:�z���Yc��������\$_K`Pa}��f��iXXiޝf���a��� ���(+.>#5#5!5!5!54&+'#"3!267!7!#!"&5463!2����U�`��`' ����� �����j��j�V>�(>VV>�>Vq����������������(^����(>VV>�>VV�=&'&'&'&76'&'&.' #.�h8��"$Y ''>eX5, ,Pts�K�25M�RLqS;:.K'�5�R Ch���h�����R�t(+e�^TT���u B"$:2�~<�����2�Hp����wTT�� V�/7GWg. %&32?673327>/.'676$4&"2 $&6$ $6& $&6$ d-����-�m ,6*6, m���KjKKj�o������oo���K����zz�8�zz�Ȏ������LlL�U4>>4-.��YG0 )�xx�) 0GYޞ.�jKKjKq���oo��oo�lz�����zz�8�0������LlL��D��/7H#"'.7'654&#"'67'.6?>%"&46227#".547|D,=),9#�7��[͑�f�x���!X: �D�$+�s)�hh�i��jZ������t�<��F/��*8C,�q�e���\�r,W�BX���/C2��h�hh���=�t������Xm�����>NZ+"&=46;2+"&=4>7>54&#"#"/.7632 >. $$ p��=+& �35,W48'3 l z����ff���ff�����^����a�aP���2P: D#;$# $*;?R ��Cf���ff�����^����a�a��'�Y >O`"&5462&'.'.76.5632.'#&'.'&6?65��\\�[�<C��z�C 25�U# .�ZK ��m+[$/#>( |� r���[A@[[@A�#2#� ����7�* <Y���$ +}"(�� �q�87] F _��1) �� � #1Ke34&+326+"&=!#!"&763!2#!"&5463!2#>?4.'3#>?4.'3#>?4.'3��Xe`64[l�����7 �� , L;�����=+3&98&+)>�>+3&98&+)>�=+3&88&+)> �Wj�|r�>Q$��~���d$kaw+-wi[[\�;/xgY$kaw+-wi[[\�;/xgY$kaw+-wi[[\�;/xgY���J\m�4.'.'&#"#"'.'&47>7632327>7>54&'&#"327>"&47654'&462"'&476'&462"'&47>&'&462i$ $^" %% "^$ $W "@9O?1&&18?t@" W�&%%&4KK�6pp&4���6ZaaZ&4mttm�^x -���- x^=/U7Ck���kz'[$=�&5%54'4&K�K�4r<r4&��X��4[��[4&m����m��'/7?GOW_gow����"264$"264"264"264$"264"264$"264"264"&462"&462"&462"&462"&462"&462"&462"&462"&462"&462"&462"&462�^^�^��^^�^^�^^�^��^^�^��^^�^���^^�^��^^�^^�^^�^� p�pp�pp�pp��pp�pp�pp�pp��pp�pp�pp�pp��pp�pp�pp�pp��pp�pp�pp�pp��pp�pp�pp�pp�`^�^^�^^�^^�^^�^^��^^�^^�^^�^^�^^�^^�^^�^^�^^�^^���pp�pp�pp�p��pp�pp�pp�p��pp�p���pp�p��pp�p���pp�p��pp�pp�pp�p��pp�pp�pp�p ��LTi{�"&4626"&462$"&462#"&4632654>7>54 "&54>2"&462%"&54&#""&546 %#"&'&'.7>#"'&'.7>�&4&&4�&4&&4SZ��&4&&4�4$#&�&&j�3$"('$������&4&[���՛[��&4&&4F&4&�]\�&4&�$�� !D�4�% ,\�4�4&&4&�4&&4&-�Z�4&&4&;cX/)#&>B)��&4&�j9aU0'.4a7����&&u՛[[���4&&4&@&&]��]&&��Ώ0 �u4��0 )�4���#g�&'.#"32676%4/&#"326'&#"2632#2+&'%#"'&6?676676632%#"'&6767#"&'&6767#"'.7>327"#"&'&6763"'.7>;7632;>%5K$ "0%>s$ "0%>;;>%5K�VL#>H30 \�($$(�\���(�є�yO2F/{�(?0(TK.5sg$��є�y#-F/{�$70(TK.5sg$L#>H30 \�($$(�\#�(@5"'K58!'"5�8!'"55"'K#dS$K K$Sdx#@1 w�d>N;ET0((? - 2K|��1 w�����d#N;ET0$(? - 2K$#dS$K K$Sdx�DN\2654& 265462"2654 #"32654>7>54."/&47&'?62 &4&���&4&���h�՛[&4&r$'("$3�j&&��&#$4[����"�@��GB�[� "�&&��Β&&]���[��u&&����7a4.'0Ua9j�&4&�)B>&#)/Xc;u՛����"�" �G�i[����Xh#"&54676324&'&#"'>54#"32#"54>54'.#"32>7>767632326#!"&5463!2b ) :4FD�N [�1�,^�J��K-*E#9gWR�Yvm0O ��w�@w��w�w��C2�2c@X�&!�9{M�A���_��"S4b// DR"Xlj�PY< �@w��w�w��%���e4.#"32>7676#'.#"#"&54>3232>754&*#"&54>763 >32� ''il$E/ @�P@�� ^��`��'W6&�!.. ! -P5+ �E{�n46vLe�Vz�:���,SN/ M5M[�� ]$�[��^��5�iC'2H&!(?]v`* ��l� ��b��$9> ���=R�2 #"&5467%!"&7>3-.7>;%.7>322326/.76/.'&6766/&/&#"&676 &676&6766/&672? �=1�(H/ �� '96&�@)9<'���)29% �&06#���#��$� J� �07j)�5@�"*3%�"!M ��%#K�"%N�e8)'8_�(9�.<�c +8 8(%6 <)'4@@)#-<^ ?%$-`%. }Q!&�}%&N�-l���IJ�;6>/�=*�%8!Q ���#P"�\Q#N&�a��)<9�bR]mp%"'.'&54>76%&54763263 #"/7#"'#"&/%$%322654&#"%'OV�9 �nt |\d ϓ[��nt |@�D:)�� ;9�8'+|�j�," �41����CH^�nVz(�~R �9�\' �r� @����L��@� @�w4�6�HI(+�C ,��55,�� f[op@�\j�;(zV~����i/5O#"'&54>32&#" 654'67'"'>54''&'"'6767&546767>7���蒓��`V BM���R� B9)̟�!SH-77I�Xm�SM�H*�k#".o;^J q�ן���ד��>@�����YM $bK���d ��ү[E"����;���Kx%^�6;%T,U:i�m=Mk���).DT4'"&5463267&#" 6;64'.'4'>732676%#!"&5463!2),�蛜s5-<A���4ϲ 2W9 �&P:\�3)SEPJ��D4:3NI�w�@w��w�w��NE 2@u��us�+,�����/?x�sa�tmP�'�)fHVEA(%dA4w&4J5*�@w��w�w�����O[4'.'&54>54&#"#"'654'.#"#"&#"3263232>3232>76 $$ �Cf'/'%($�U�L ( #'/'@��3#@,G)+H+@#3 ����^����a�a�X@_O#NW�#O_�.* ##(��^����a�a����q�[632632#"&#"#".'&#"#".'&54767>7654.54632327&547>P��9 B6?K?%�O4�T% >6>Z64Y=6>%S�4N�$?L?4B @���{:y/�$ ,'R�!F!8% #)(()#%:!F �Q'+%�0z:�z���O_4'.'&54>54&#"#"'654'.#"#"&#"3263232>3232>76#!"&5463!2Cf'.'%($�V�M ) #'.'@�� 3 #A,G)+H+A# 4 ��w�@w��w�w��XA?4N$NW�&M&L�/* ## +�@w��w�w���� O$>?>762'&#"./454327327>7> EpB5 3FAP/h����\�/NG�S�L� � ���R�P*��m�95F84f&3Ga4B|wB.\FI*/�.?&,��5~K % &��Y."7n< "-I.�M`{�ARwJ!�FX^dj''''"'7&'7&'7&'7&547'67'67'67'63277774$#"32$ *��'ֱ,?�g=OO&L&NJBg�;1��'����'ֱ.=�gCIM $'&&NJBg�=.��%�����w؝\\��w� �I�o�o��<�<���-NIDg�=/��%����(ײ+A�hEHO*"#*OICh�=/��'����(ֲ/=�h>ON.��]��xwڝ]��������7��e��[���@�����)6!!"3#"&546%3567654'3!67!4&'7S��gn�y]K-�����#75LSl>�9���V��%�cPe}&H�n��_�HȌ����=UoLQ1!��4564���7U�C"� �!-9[nx��"&46254&"326754&"326754&"26754&"26#".547632632626326'4#"#"54732764&"264.#"327632>#"'"'#"'#"&5#"'67&'327&'&54>3267>7>7>32632632T"8""8�)<())�(<)))�)<))<)�)<))<)T�د{ՐRh�x=8 78 n 81 p��H_6�S��oc �F@b@?d?uK�bM�70[f5Y$35KUC<:��[;+8 n 87 8/8Zlv]64qE 'YK�0-AlB; W��#;WS9 &�(#-7Z�://:/�Tr++r,,r++r,,r++r,,r++r,,ʠ�g��xXV�ע��e9222222^�K�Vv���F0�2OO23OO��`�lF;�mhj84D�ro��B@�r+@222222C0DP`.�r8h9��~T4.&o�@9��1P���%14'!3#"&46327&#"326%35#5##33 $$ ����}Pc��c]<hl���ࠥ�Ymmnnnn���^����a�aw!�LY�Ə;ed����wnnnnnv�^����a�a��%�'#"$#"#.5462632327>321��I��U�Π?L���L?��cc�4MX�&��04;0��XpD[��[DpD,)&&�Q 9V\�26&".'&'&6?.#"#26327677>'32>&3#'&+"?626&"#!'.'!"&5463!>;26;2!2�P P 92#.}S�P9:�:%L\B�� )spN/9oJ5 !+D�`]�Bg�Y9�+�,�9% Pk4P P &�NnF!_7*}B<�{o0��&&�B;*<@$ucRRc�#@16#37c&�@@@ J"@*4�^`E�D�B�����o/8927 *@O�LC�!T!32�3X$�BJ@@@��&AS 0C59"'D/&�&D488$5A&�%O#!"&547>7>2$7>/.".'&'&2>^B�@B^>FFz�n_0P:P2\n�zFF>��R&�p^1P:P1^��&R P2NMJMQ0Rr�.B^^B� 7:5]yPH!%%"FPy]5:7 ���=4�QH!%%!H�t4=�<"-/ ?�1Pp+".'.'.?>;2>7$76&'&%.+"3!26#!"&54767>;2�' +�~'*OJ%%JN,&x�'%^�M,EE,M7�ZE[��P*FF*P��:5 � �^B�@B^){�$.MK%%KM.$+��X)o3"�a 22!]�4 I�>"">�,�&�S8J�B##B��12�` ��`B^^B�8&ra#11#$��R&��"&.2v%/%''%/%7%7'%7'/#&5'&&?&'&?&'&7%27674?6J�"�����0�<=���_gNU�?D��f���u�Y����G�b���7=^H^�` �=v~yT������3����G���D��P�O 4F��ѭ����q������i_w\ހ�!1u�S���%V_-d� ���1=U{J8n~�r����'U4.#".'"3!264&"26+#!"&5463!232+32+32�0P373/./373P0T=@=T��֙�֙|`^B�@B^^B�B^`````*9deG-! !-Ged9Iaa�l��lk���O��B^^B�B^^B������� +Yi"&54622#!"&54>;2>+32+32+#!"&5463!2324&#!"3!26�֙�֙0.I/ OB��BO -Q52-)&)-2� `` `` `^B�@B^^B�B^` � �@ � |k��kl����"=IYL)CggC0[jM4 � � � � �B^^B�B^^B� �@� �@ ���!1AQu4.#".'"3!24&"254&#!"3!2654&#!"3!2654&#!"3!26#!54&+"!54&+"!"&5463!2)P90,***,09P)J66S�����"��@��8��@^B��@�@��B^^B�B^U�kc9 9ck�U?�������@@88@@N�@B^````^B�B^^���!1AQu�#!"&4>32>72"&462#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!546;2!546;2!26#!"&5463!2J6�6J)P90,***,09P)������"��@��8��@� �@ `@@` �^B�@B^^B�B^ՀUU�kc9 9c�������`@@�88�@@�2� �@ ````�@B^^B�B^^�(%.'"&' $& #"$&6$ ��wC�ιCw�jJ~J�����>��������LlL�ś�JSSJ͛����>����6������LlL���$, $&6654&$ 3 72&& �lL������m�z�����z�B�l������>�������KlL�G���zz���G���>�����'7#!"&54>7&54>2 62654' '3�/U]B,ȍ����,B]U/OQ��н�Q������>�+X}��������}X�0b�Ӄ��ۚ�Ӆb0}�h��QQ��h�����>��f����f��#=#!"&4>3272"&462!3!26#!"&5463!;26=!2J6�6J)Q8P�P8Q)�������� � �^B�@B^^B`�`B^V�VV�ld9KK9d��������`�� �@B^^B�B^``^���+;K[eu4.#"'"3!264&"254&#!"3!2654&#!"3!26%54&+";2654&#!"3!26!54&#!"!#!"&5463!2�"D/@�@/D"?,�,?�p�pp�p�@�����@����@����@�^B�@B^^B�B^D6]W2@@2W]67MM��pp�p��@@@@@@@@n`�@B^^B�B^^���+;K[eu#!"&54>3272"&462#!"&=463!2%#!"&=463!2+"&=46;25#!"&=463!2!3!26#!"&5463!2�?,�V,?"D/@�@/D"�p�pp�p�@�����@����@��� � �^B�@B^^B�B^D7MM76]W2@@2W]֠pp�p��@@�@@@@�@@��`�� �@B^^B�B^^��A#"327.#"'63263#".'#"$&546$32326�������J9"65I).!1i���CC�u +I�\Gw\B!al���݇���y�ǙV��/]:=B�>9�����+<F+a[le���Pn[A&JR7t�)��+�tH�������kFIK�e � .��#"'&'>32%#!"&5463!2#"&54>54'&#"#"54654'.#"#"'.54>54'&'&543232654&432#"&54>764&'&'.54632� ?c��'p& ?b1w{2V ?#��	&�CY'&.&#+B : &65&*2w�1GF1)2<)<' ( BH=ӊ:NT :O �)4:i F~b`e!}�U3i?fR����UX|'&'&I�c&Q *2U.L6*/ L:90%>..>%b>++�z7ymlw45)0 33J@0!!TFL����� P]=GS�-��kwm !����*�(%6&692? $&6$ �� ' ����al�@l�������LlL���,&��EC ���h�$�������LlL��� /37;%"&546734&'4&" 67 54746 #5#5#5�p�pF:�:F�D<p�p<D� ���������� ���������PppP<d��ud<M�-PppP�-�M����������Dž����9��������� /37;%"&546734&'4&" 67 54746 #5#5#5�p�pF:�:F�D<p�p<D� ���������� ���������PppP<d��ud<M�-PppP�-�M����������Dž����9��������� /37;%"&546734&'4&" 67 54746 #5#5#5�p�pF:�:F�D<p�p<D� ���������� ���������PppP<d��ud<M�-PppP�-�M����������Dž����9��������� /37;%"&5467534&'4&" 67 54746 #5#5#5�p�pF:�:F�D<p�p<D� ���������� ���������PppP<d��d<M�-PppP�-�M����������Dž����9��������� +/37%"&54624&'4&" 67 54746 #5#5#5�p�pp�p�D<p�p<D� ���������� ���������PppPOqqOM�-PppP�-�M����������Dž����9����������&.6>FNV^fnv~����"/&4?.7&#"!4>3267622"&4"&46262"&42"&4462"$2"&42"&4"&46262"&4"&46262"&42"&4$2"&42"&42"&4� �� R ,H8Jfj��Q��hj�G^�R, !4&&4&Z4&&4&�4&&4&��4&&4&&4&&44&&4&��4&&4&Z4&&4&�4&&4&��4&&4&�4&&4&��4&&4&&4&&4&Z4&&4&Z4&&4& �� R ,[�cG�j�h��QRJ'A, ��&4&&4Z&4&&4Z&4&&4Z&4&&444&&4&�&4&&4Z&4&&4Z&4&&4Z&4&&4�&4&&4Z&4&&4Z&4&&4&&4&&4Z&4&&4Z&4&&4�%-5=EM}���������+"&=#!"'+"&=&="&4626"&462&"&462"&462&"&462&"&462#!"&=46;4632676/&?.7&#"!2"&462&"&462&"&462"&462&"&462&"&462"&462&"&462"&462��@?A�A? @ �@R.�..R�@`�jlL.h)*��*$ %35K���..�..�.����u�vn�u���....��@@�j�N *��*.t2#K5���..R..R.�� @Hq '&'&54 &7676767654$'.766$76"&462&'&'&7>54.'.7>76�����������ȵ|�_ğ��yv���/ۃ�����k] :Bu�q�� CA _k�ނ���XVo�bZZb�nW��|V 0 Q2��-� l��}���O / :�1���z q��%������z�G 4( 6�Ro�aą\�< )4 J�}�������%!!#!"&5463!2�^B�@B^^B�B^�`�@B^^B�B^^���%#!"&=463!2^B�@B^^B�B^�B^^B�B^^�&))!32#!#!"&5463!463!2��`B^^B��^B�@B^^B`^B�B^�^B�@B^��B^^B�B^`B^^���#3%764/764/&"'&"2?2#!"&5463!2�� �� � �� � �� � �� s^B�@B^^B�B^ג �� � �� � �� � �� �@B^^B�B^^���#'7"/"/&4?'&4?62762!!%#!"&5463!2� �� � �� � �� � �� � �^B�@B^^B�B^�� �� � �� � �� � �� ��`�@B^^B�B^^� ! $&6$ .2�r��`�������LlL�f4��������LlL���#.C��&>"'&4762"/&4?62'"'&4762%'.>6.'.>6'>/>76&'&.'&7&'">?4'.677>7.>37654'&'67>776 $&6$ (4�Z�## &## &y�"�6&.JM@&� "(XE*$+8 jT<l$3-V< 2'. -1 %#e"!Z� +*)H 8 (j #* -ƷVv/kh?'��������MlM�$($�R# & " #'#vZ@+&MbV$ � G7 --) R2T� 313dJ6@8lr2_�5m/."�G:= )%5f0gt*2)?;CB66&, � `48]USy������LlL���G6?>?3#'.'&!3!2>?3.'#!57>7'./5!27#'.#!"g�%%D-!gg<6W��WZe#1=/2*]Y3��-,����C1/Dx���] VF��I�q-H�����D2��NK'>*�%�R=f 07���=. fD�]\|yu���,0>Seu#2#"'&5<>323#3#&'#334'."#"+236'&54.#"5#37326#!"&5463!2� < ��zz�j��k-L+� )[$�8=".un/2 �^B�@B^^B�B^�5cy � ��(�ݔI�(8��?C�(3�>�� #"��($=�@B^^B�B^^0�K�S�&'.'&'./674&$#">&>?>'76'# "&#./.'7676767>76$w .~ku�BR�]� T%z+",�|�ޟ���j<���)(!( ~ˣzF8"{���%%#5����)��}''�x��JF��0"H[$%��EJ#% .Gk29(B13"?�@S)�5" �#9����dm�W"��;L�65R�A0@T.���$�}i`:f3A%% BM<$q�:)BD aa%`�]A&c| �M��s! Z 2}i[F&���** < ��ʣsc"J<&Ns�F%���0@Wm6&'.6$.7>7$76".4>2.,&>6'"'&7>=GV:�e#:$?+% q4����g &3h�T`Zt�Q��м�QQ��м�pA������P1L������K!:<��}҈`d��l��b�,�9' %%($! ���a3���)W)x ������� о�QQ��о�QQ���cQ����ǡ-�җe)U�s2����XD\���ϼ�Yd����/?O_o���#"=#"=4;543#"=#"=4;543#"=#"=4;543#"=#"=4;543#"=#"=4;543%#!"&5463!2++532325++532325++532325++532325++53232�p00pp00pp00pp00pp00�8(��(88(@(80pp00pp00pp00pp00pp0� � � � � ��@(88(�(88� �� �� �� �� �/�Q�/&'%&/"&=.6?&?&'&6?'.>-#".6?'.>'&6'.>54627>%>76#"'% %6�� 2�7 2G f���!)p&4&p)!��f G2 7�2 �� *6��� "�� 4�7 2G f�!)p&4&p)!�f G2 7�2 ��" ���6* �!k 3 j�&3 %,����*��&&ր*�9���% 3&�j 3 k!./!>��>$,*!k 3.j�&3 %�Ԝ9�*��&&ր*�ǜ,% 3&�j 3 k!*,$>��>!/.�&6.'&$ &76$76$�P��utۥiP��u��G��xy ��Զ�[xy �-���_v١eN��uv١e ��=��u�ʦ�����[t7��8�X� &6##'7-'%'&$ $6 $&6$ ��3��1�N��E0�����g��R�=|�����||�">"��������LlL����^��v!1f2i��Ђwg�fZQ�Q^>"�||�����||�w������LlL��&�Z�Xblw��������.'&>'&'&".'.'&&'&'&7>767>67>7626&'&>&'&>'.7>.676'&'&'&'.67.>7>6&'&676&'&676.676&'&>&'&676'.>6/4-LJg-$ 6)j2%+QF)�b3FSP21DK2�AW")")�$??8A&A�E5lZm��=g�G2Sw*&>$5jD ���GH�yX/4F �r 1 1�"�"!�l=6>�� 6 ,5./��'e .*�|�Ed! u&�&%&�� &��5d ���))66@�C&8B@q��L?P^7 G-hI[q��:<�rS U~97A_�IR`gp1 1 �;"("j?>"�T�6 ,6 &/`���LwQ'� ��A ^ � � "� $& _ �� y � *� <Copyright Dave Gandy 2016. All rights reserved.Copyright Dave Gandy 2016. All rights reserved.FontAwesomeFontAwesomeRegularRegularFONTLAB:OTFEXPORTFONTLAB:OTFEXPORTFontAwesomeFontAwesomeVersion 4.7.0 2016Version 4.7.0 2016FontAwesomeFontAwesomePlease refer to the Copyright section for the font trademark attribution notices.Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeFort AwesomeDave GandyDave Gandyhttp://fontawesome.iohttp://fontawesome.iohttp://fontawesome.io/license/http://fontawesome.io/license/���������� !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab� cdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������" !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRS�TUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~�������������������������������������������������������������������������������������������������������������������������������� !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������������������������glassmusicsearchenvelopeheartstar star_emptyuserfilmth_largethth_listokremovezoom_inzoom_outoffsignalcogtrashhomefile_alttimeroaddownload_altdownloaduploadinboxplay_circlerepeatrefreshlist_altlockflag headphones volume_offvolume_down volume_upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalictext_height text_width align_leftalign_centeralign_right align_justifylistindent_leftindent_rightfacetime_videopicturepencil map_markeradjusttinteditsharecheckmove step_backward fast_backwardbackwardplaypausestopforwardfast_forwardstep_forwardejectchevron_left chevron_right plus_sign minus_signremove_signok_sign question_sign info_sign screenshot remove_circle ok_circle ban_circle arrow_leftarrow_rightarrow_up arrow_down share_altresize_fullresize_smallexclamation_signgiftleaffireeye_open eye_closewarning_signplanecalendarrandomcommentmagnet chevron_upchevron_downretweet shopping_cartfolder_closefolder_openresize_verticalresize_horizontal bar_charttwitter_sign facebook_signcamera_retrokeycogscomments thumbs_up_altthumbs_down_alt star_halfheart_emptysignout linkedin_signpushpin external_linksignintrophygithub_sign upload_altlemonphonecheck_emptybookmark_empty phone_signtwitterfacebookgithubunlockcredit_cardrsshddbullhornbellcertificate hand_right hand_lefthand_up hand_downcircle_arrow_leftcircle_arrow_rightcircle_arrow_upcircle_arrow_downglobewrenchtasksfilter briefcase fullscreengrouplinkcloudbeakercutcopy paper_clipsave sign_blankreorderulol strikethrough underlinetablemagictruck pinterestpinterest_signgoogle_plus_signgoogle_plusmoney caret_downcaret_up caret_leftcaret_rightcolumnssort sort_downsort_upenvelope_altlinkedinundolegal dashboardcomment_altcomments_altboltsitemapumbrellapaste light_bulbexchangecloud_downloadcloud_uploaduser_mdstethoscopesuitcasebell_altcoffeefood file_text_altbuildinghospital ambulancemedkitfighter_jetbeerh_signf0fedouble_angle_leftdouble_angle_rightdouble_angle_updouble_angle_down angle_leftangle_rightangle_up angle_downdesktoplaptoptabletmobile_phonecircle_blank quote_leftquote_rightspinnercirclereply github_altfolder_close_altfolder_open_alt expand_altcollapse_altsmilefrownmehgamepadkeyboardflag_altflag_checkeredterminalcode reply_allstar_half_emptylocation_arrowcrop code_forkunlink_279exclamationsuperscript subscript_283puzzle_piece microphonemicrophone_offshieldcalendar_emptyfire_extinguisherrocketmaxcdnchevron_sign_leftchevron_sign_rightchevron_sign_upchevron_sign_downhtml5css3anchor unlock_altbullseyeellipsis_horizontalellipsis_vertical_303 play_signticketminus_sign_altcheck_minuslevel_up level_down check_sign edit_sign_312 share_signcompasscollapsecollapse_top_317eurgbpusdinrjpyrubkrwbtcfile file_textsort_by_alphabet_329sort_by_attributessort_by_attributes_alt sort_by_ordersort_by_order_alt_334_335youtube_signyoutubexing xing_signyoutube_playdropbox stackexchange instagramflickradnf171bitbucket_signtumblrtumblr_signlong_arrow_down long_arrow_uplong_arrow_leftlong_arrow_rightwindowsandroidlinuxdribbleskype foursquaretrellofemalemalegittipsun_366archivebugvkweiborenren_372stack_exchange_374arrow_circle_alt_left_376dot_circle_alt_378vimeo_square_380 plus_square_o_382_383_384_385_386_387_388_389uniF1A0f1a1_392_393f1a4_395_396_397_398_399_400f1ab_402_403_404uniF1B1_406_407_408_409_410_411_412_413_414_415_416_417_418_419uniF1C0uniF1C1_422_423_424_425_426_427_428_429_430_431_432_433_434uniF1D0uniF1D1uniF1D2_438_439uniF1D5uniF1D6uniF1D7_443_444_445_446_447_448_449uniF1E0_451_452_453_454_455_456_457_458_459_460_461_462_463_464uniF1F0_466_467f1f3_469_470_471_472_473_474_475_476f1fc_478_479_480_481_482_483_484_485_486_487_488_489_490_491_492_493_494f210_496f212_498_499_500_501_502_503_504_505_506_507_508_509venus_511_512_513_514_515_516_517_518_519_520_521_522_523_524_525_526_527_528_529_530_531_532_533_534_535_536_537_538_539_540_541_542_543_544_545_546_547_548_549_550_551_552_553_554_555_556_557_558_559_560_561_562_563_564_565_566_567_568_569f260f261_572f263_574_575_576_577_578_579_580_581_582_583_584_585_586_587_588_589_590_591_592_593_594_595_596_597_598f27euniF280uniF281_602_603_604uniF285uniF286_607_608_609_610_611_612_613_614_615_616_617_618_619_620_621_622_623_624_625_626_627_628_629uniF2A0uniF2A1uniF2A2uniF2A3uniF2A4uniF2A5uniF2A6uniF2A7uniF2A8uniF2A9uniF2AAuniF2ABuniF2ACuniF2ADuniF2AEuniF2B0uniF2B1uniF2B2uniF2B3uniF2B4uniF2B5uniF2B6uniF2B7uniF2B8uniF2B9uniF2BAuniF2BBuniF2BCuniF2BDuniF2BEuniF2C0uniF2C1uniF2C2uniF2C3uniF2C4uniF2C5uniF2C6uniF2C7uniF2C8uniF2C9uniF2CAuniF2CBuniF2CCuniF2CDuniF2CEuniF2D0uniF2D1uniF2D2uniF2D3uniF2D4uniF2D5uniF2D6uniF2D7uniF2D8uniF2D9uniF2DAuniF2DBuniF2DCuniF2DDuniF2DEuniF2E0uniF2E1uniF2E2uniF2E3uniF2E4uniF2E5uniF2E6uniF2E7_698uniF2E9uniF2EAuniF2EBuniF2ECuniF2EDuniF2EE����=���O<0�1h�PKAA#]��;_����2system/helix3/assets/fonts/fontawesome-webfont.svgnu�[���<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > <svg> <metadata> Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 By ,,, Copyright Dave Gandy 2016. All rights reserved. </metadata> <defs> <font id="FontAwesome" horiz-adv-x="1536" > <font-face font-family="FontAwesome" font-weight="400" font-stretch="normal" units-per-em="1792" panose-1="0 0 0 0 0 0 0 0 0 0" ascent="1536" descent="-256" bbox="-1.02083 -256.962 2304.6 1537.02" underline-thickness="0" underline-position="0" unicode-range="U+0020-F500" /> <missing-glyph horiz-adv-x="896" d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" /> <glyph glyph-name=".notdef" horiz-adv-x="896" d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" /> <glyph glyph-name=".null" horiz-adv-x="0" /> <glyph glyph-name="nonmarkingreturn" horiz-adv-x="597" /> <glyph glyph-name="space" unicode=" " horiz-adv-x="448" /> <glyph glyph-name="dieresis" unicode="¨" horiz-adv-x="1792" /> <glyph glyph-name="copyright" unicode="©" horiz-adv-x="1792" /> <glyph glyph-name="registered" unicode="®" horiz-adv-x="1792" /> <glyph glyph-name="acute" unicode="´" horiz-adv-x="1792" /> <glyph glyph-name="AE" unicode="Æ" horiz-adv-x="1792" /> <glyph glyph-name="Oslash" unicode="Ø" horiz-adv-x="1792" /> <glyph glyph-name="trademark" unicode="™" horiz-adv-x="1792" /> <glyph glyph-name="infinity" unicode="∞" horiz-adv-x="1792" /> <glyph glyph-name="notequal" unicode="≠" horiz-adv-x="1792" /> <glyph glyph-name="glass" unicode="" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" /> <glyph glyph-name="music" unicode="" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" /> <glyph glyph-name="search" unicode="" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> <glyph glyph-name="envelope" unicode="" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> <glyph glyph-name="heart" unicode="" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" /> <glyph glyph-name="star" unicode="" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" /> <glyph glyph-name="star_empty" unicode="" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" /> <glyph glyph-name="user" unicode="" horiz-adv-x="1280" d="M1280 137q0 -109 -62.5 -187t-150.5 -78h-854q-88 0 -150.5 78t-62.5 187q0 85 8.5 160.5t31.5 152t58.5 131t94 89t134.5 34.5q131 -128 313 -128t313 128q76 0 134.5 -34.5t94 -89t58.5 -131t31.5 -152t8.5 -160.5zM1024 1024q0 -159 -112.5 -271.5t-271.5 -112.5 t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> <glyph glyph-name="film" unicode="" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> <glyph glyph-name="th_large" unicode="" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> <glyph glyph-name="th" unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" /> <glyph glyph-name="th_list" unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" /> <glyph glyph-name="ok" unicode="" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" /> <glyph glyph-name="remove" unicode="" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" /> <glyph glyph-name="zoom_in" unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> <glyph glyph-name="zoom_out" unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " /> <glyph glyph-name="off" unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" /> <glyph glyph-name="signal" unicode="" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" /> <glyph glyph-name="cog" unicode="" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" /> <glyph glyph-name="trash" unicode="" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> <glyph glyph-name="home" unicode="" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" /> <glyph glyph-name="file_alt" unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " /> <glyph glyph-name="time" unicode="" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="road" unicode="" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" /> <glyph glyph-name="download_alt" unicode="" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" /> <glyph glyph-name="download" unicode="" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="upload" unicode="" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="inbox" unicode="" d="M1023 576h316q-1 3 -2.5 8.5t-2.5 7.5l-212 496h-708l-212 -496q-1 -3 -2.5 -8.5t-2.5 -7.5h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" /> <glyph glyph-name="play_circle" unicode="" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="repeat" unicode="" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q15 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" /> <glyph glyph-name="refresh" unicode="" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" /> <glyph glyph-name="list_alt" unicode="" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" /> <glyph glyph-name="lock" unicode="" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" /> <glyph glyph-name="flag" unicode="" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" /> <glyph glyph-name="headphones" unicode="" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" /> <glyph glyph-name="volume_off" unicode="" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" /> <glyph glyph-name="volume_down" unicode="" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36 t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" /> <glyph glyph-name="volume_up" unicode="" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36 t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" /> <glyph glyph-name="qrcode" unicode="" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" /> <glyph glyph-name="barcode" unicode="" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" /> <glyph glyph-name="tag" unicode="" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" /> <glyph glyph-name="tags" unicode="" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" /> <glyph glyph-name="book" unicode="" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" /> <glyph glyph-name="bookmark" unicode="" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> <glyph glyph-name="print" unicode="" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" /> <glyph glyph-name="camera" unicode="" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> <glyph glyph-name="font" unicode="" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -5 -0.5 -13.5t-0.5 -12.5q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" /> <glyph glyph-name="bold" unicode="" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68 -0.5t68 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" /> <glyph glyph-name="italic" unicode="" horiz-adv-x="1024" d="M0 -126l17 85q22 7 61.5 16.5t72 19t59.5 23.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" /> <glyph glyph-name="text_height" unicode="" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" /> <glyph glyph-name="text_width" unicode="" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" /> <glyph glyph-name="align_left" unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> <glyph glyph-name="align_center" unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" /> <glyph glyph-name="align_right" unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> <glyph glyph-name="align_justify" unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> <glyph glyph-name="list" unicode="" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" /> <glyph glyph-name="indent_left" unicode="" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> <glyph glyph-name="indent_right" unicode="" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> <glyph glyph-name="facetime_video" unicode="" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" /> <glyph glyph-name="picture" unicode="" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> <glyph glyph-name="pencil" unicode="" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" /> <glyph glyph-name="map_marker" unicode="" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" /> <glyph glyph-name="adjust" unicode="" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="tint" unicode="" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" /> <glyph glyph-name="edit" unicode="" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" /> <glyph glyph-name="share" unicode="" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" /> <glyph glyph-name="check" unicode="" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" /> <glyph glyph-name="move" unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> <glyph glyph-name="step_backward" unicode="" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19z" /> <glyph glyph-name="fast_backward" unicode="" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19l710 710 q19 19 32 13t13 -32v-710q4 10 13 19z" /> <glyph glyph-name="backward" unicode="" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q4 10 13 19z" /> <glyph glyph-name="play" unicode="" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" /> <glyph glyph-name="pause" unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" /> <glyph glyph-name="stop" unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> <glyph glyph-name="forward" unicode="" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" /> <glyph glyph-name="fast_forward" unicode="" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" /> <glyph glyph-name="step_forward" unicode="" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19z" /> <glyph glyph-name="eject" unicode="" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" /> <glyph glyph-name="chevron_left" unicode="" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" /> <glyph glyph-name="chevron_right" unicode="" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" /> <glyph glyph-name="plus_sign" unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="minus_sign" unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" /> <glyph glyph-name="remove_sign" unicode="" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="ok_sign" unicode="" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="question_sign" unicode="" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="info_sign" unicode="" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="screenshot" unicode="" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" /> <glyph glyph-name="remove_circle" unicode="" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="ok_circle" unicode="" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="ban_circle" unicode="" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" /> <glyph glyph-name="arrow_left" unicode="" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" /> <glyph glyph-name="arrow_right" unicode="" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" /> <glyph glyph-name="arrow_up" unicode="" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" /> <glyph glyph-name="arrow_down" unicode="" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" /> <glyph glyph-name="share_alt" unicode="" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" /> <glyph glyph-name="resize_full" unicode="" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" /> <glyph glyph-name="resize_small" unicode="" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" /> <glyph glyph-name="plus" unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" /> <glyph glyph-name="minus" unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" /> <glyph glyph-name="asterisk" unicode="" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" /> <glyph glyph-name="exclamation_sign" unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" /> <glyph glyph-name="gift" unicode="" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" /> <glyph glyph-name="leaf" unicode="" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-43 0 -63.5 17.5t-45.5 59.5q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" /> <glyph glyph-name="fire" unicode="" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" /> <glyph glyph-name="eye_open" unicode="" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" /> <glyph glyph-name="eye_close" unicode="" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-106 -189 -316 -567t-315 -566l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " /> <glyph glyph-name="warning_sign" unicode="" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" /> <glyph glyph-name="plane" unicode="" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" /> <glyph glyph-name="calendar" unicode="" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> <glyph glyph-name="random" unicode="" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> <glyph glyph-name="comment" unicode="" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" /> <glyph glyph-name="magnet" unicode="" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" /> <glyph glyph-name="chevron_up" unicode="" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" /> <glyph glyph-name="chevron_down" unicode="" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" /> <glyph glyph-name="retweet" unicode="" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -10 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " /> <glyph glyph-name="shopping_cart" unicode="" horiz-adv-x="1664" d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45 t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" /> <glyph glyph-name="folder_close" unicode="" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> <glyph glyph-name="folder_open" unicode="" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" /> <glyph glyph-name="resize_vertical" unicode="" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" /> <glyph glyph-name="resize_horizontal" unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> <glyph glyph-name="bar_chart" unicode="" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" /> <glyph glyph-name="twitter_sign" unicode="" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="facebook_sign" unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960z" /> <glyph glyph-name="camera_retro" unicode="" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" /> <glyph glyph-name="key" unicode="" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" /> <glyph glyph-name="cogs" unicode="" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -11 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -8 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" /> <glyph glyph-name="comments" unicode="" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" /> <glyph glyph-name="thumbs_up_alt" unicode="" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" /> <glyph glyph-name="thumbs_down_alt" unicode="" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 31 18 69q0 37 -17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -73 49 -163z" /> <glyph glyph-name="star_half" unicode="" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" /> <glyph glyph-name="heart_empty" unicode="" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" /> <glyph glyph-name="signout" unicode="" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" /> <glyph glyph-name="linkedin_sign" unicode="" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="pushpin" unicode="" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" /> <glyph glyph-name="external_link" unicode="" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" /> <glyph glyph-name="signin" unicode="" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="trophy" unicode="" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" /> <glyph glyph-name="github_sign" unicode="" d="M519 336q4 6 -3 13q-9 7 -14 2q-4 -6 3 -13q9 -7 14 -2zM491 377q-5 7 -12 4q-6 -4 0 -12q7 -8 12 -5q6 4 0 13zM450 417q2 4 -5 8q-7 2 -8 -2q-3 -5 4 -8q8 -2 9 2zM471 394q2 1 1.5 4.5t-3.5 5.5q-6 7 -10 3t1 -11q6 -6 11 -2zM557 319q2 7 -9 11q-9 3 -13 -4 q-2 -7 9 -11q9 -3 13 4zM599 316q0 8 -12 8q-10 0 -10 -8t11 -8t11 8zM638 323q-2 7 -13 5t-9 -9q2 -8 12 -6t10 10zM1280 640q0 212 -150 362t-362 150t-362 -150t-150 -362q0 -167 98 -300.5t252 -185.5q18 -3 26.5 5t8.5 20q0 52 -1 95q-6 -1 -15.5 -2.5t-35.5 -2t-48 4 t-43.5 20t-29.5 41.5q-23 59 -57 74q-2 1 -4.5 3.5l-8 8t-7 9.5t4 7.5t19.5 3.5q6 0 15 -2t30 -15.5t33 -35.5q16 -28 37.5 -42t43.5 -14t38 3.5t30 9.5q7 47 33 69q-49 6 -86 18.5t-73 39t-55.5 76t-19.5 119.5q0 79 53 137q-24 62 5 136q19 6 54.5 -7.5t60.5 -29.5l26 -16 q58 17 128 17t128 -17q11 7 28.5 18t55.5 26t57 9q29 -74 5 -136q53 -58 53 -137q0 -57 -14 -100.5t-35.5 -70t-53.5 -44.5t-62.5 -26t-68.5 -12q35 -31 35 -95q0 -40 -0.5 -89t-0.5 -51q0 -12 8.5 -20t26.5 -5q154 52 252 185.5t98 300.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="upload_alt" unicode="" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" /> <glyph glyph-name="lemon" unicode="" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -13 2 -25t3.5 -16.5t7.5 -20.5t8 -20q16 -40 25 -118.5t9 -136.5z" /> <glyph glyph-name="phone" unicode="" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -53 3.5t-57.5 12.5t-47 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-127 79 -264 216t-216 264q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47t-12.5 57.5t-3.5 53q0 92 51 186 q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174q2 -1 19 -11.5t24 -14 t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" /> <glyph glyph-name="check_empty" unicode="" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="bookmark_empty" unicode="" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> <glyph glyph-name="phone_sign" unicode="" d="M1280 343q0 11 -2 16t-18 16.5t-40.5 25t-47.5 26.5t-45.5 25t-28.5 15q-5 3 -19 13t-25 15t-21 5q-15 0 -36.5 -20.5t-39.5 -45t-38.5 -45t-33.5 -20.5q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170 126.5t-127 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5 t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5 t320.5 -216.5q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z " /> <glyph glyph-name="twitter" unicode="" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" /> <glyph glyph-name="facebook" unicode="" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" /> <glyph glyph-name="github" unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -40 7t-13 30q0 3 0.5 76.5t0.5 134.5q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 119 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24 q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-85 13.5q-45 -113 -8 -204q-79 -87 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-39 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5 t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -88.5t0.5 -54.5q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103zM291 305q3 7 -7 12 q-10 3 -13 -2q-3 -7 7 -12q9 -6 13 2zM322 271q7 5 -2 16q-10 9 -16 3q-7 -5 2 -16q10 -10 16 -3zM352 226q9 7 0 19q-8 13 -17 6q-9 -5 0 -18t17 -7zM394 184q8 8 -4 19q-12 12 -20 3q-9 -8 4 -19q12 -12 20 -3zM451 159q3 11 -13 16q-15 4 -19 -7t13 -15q15 -6 19 6z M514 154q0 13 -17 11q-16 0 -16 -11q0 -13 17 -11q16 0 16 11zM572 164q-2 11 -18 9q-16 -3 -14 -15t18 -8t14 14z" /> <glyph glyph-name="unlock" unicode="" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" /> <glyph glyph-name="credit_card" unicode="" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" /> <glyph glyph-name="rss" unicode="" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" /> <glyph glyph-name="hdd" unicode="" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" /> <glyph glyph-name="bullhorn" unicode="" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" /> <glyph glyph-name="bell" unicode="" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> <glyph glyph-name="certificate" unicode="" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" /> <glyph glyph-name="hand_right" unicode="" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" /> <glyph glyph-name="hand_left" unicode="" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-8 9 -12 14q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5 t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45z M1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67 q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" /> <glyph glyph-name="hand_up" unicode="" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" /> <glyph glyph-name="hand_down" unicode="" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" /> <glyph glyph-name="circle_arrow_left" unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="circle_arrow_right" unicode="" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="circle_arrow_up" unicode="" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="circle_arrow_down" unicode="" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="globe" unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 11t-9.5 10q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-4 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10.5t17 -19.5q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q8 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" /> <glyph glyph-name="wrench" unicode="" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" /> <glyph glyph-name="tasks" unicode="" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> <glyph glyph-name="filter" unicode="" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" /> <glyph glyph-name="briefcase" unicode="" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" /> <glyph glyph-name="fullscreen" unicode="" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " /> <glyph glyph-name="group" unicode="" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" /> <glyph glyph-name="link" unicode="" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" /> <glyph glyph-name="cloud" unicode="" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " /> <glyph glyph-name="beaker" unicode="" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" /> <glyph glyph-name="cut" unicode="" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" /> <glyph glyph-name="copy" unicode="" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" /> <glyph glyph-name="paper_clip" unicode="" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" /> <glyph glyph-name="save" unicode="" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" /> <glyph glyph-name="sign_blank" unicode="" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="reorder" unicode="" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> <glyph glyph-name="ul" unicode="" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> <glyph glyph-name="ol" unicode="" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 121.5t0.5 121.5v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216 q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> <glyph glyph-name="strikethrough" unicode="" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 98 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -56 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" /> <glyph glyph-name="underline" unicode="" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" /> <glyph glyph-name="table" unicode="" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" /> <glyph glyph-name="magic" unicode="" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" /> <glyph glyph-name="truck" unicode="" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" /> <glyph glyph-name="pinterest" unicode="" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="pinterest_sign" unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" /> <glyph glyph-name="google_plus_sign" unicode="" d="M917 631q0 26 -6 64h-362v-132h217q-3 -24 -16.5 -50t-37.5 -53t-66.5 -44.5t-96.5 -17.5q-99 0 -169 71t-70 171t70 171t169 71q92 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585 h109v110h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="google_plus" unicode="" horiz-adv-x="2304" d="M1437 623q0 -208 -87 -370.5t-248 -254t-369 -91.5q-149 0 -285 58t-234 156t-156 234t-58 285t58 285t156 234t234 156t285 58q286 0 491 -192l-199 -191q-117 113 -292 113q-123 0 -227.5 -62t-165.5 -168.5t-61 -232.5t61 -232.5t165.5 -168.5t227.5 -62 q83 0 152.5 23t114.5 57.5t78.5 78.5t49 83t21.5 74h-416v252h692q12 -63 12 -122zM2304 745v-210h-209v-209h-210v209h-209v210h209v209h210v-209h209z" /> <glyph glyph-name="money" unicode="" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" /> <glyph glyph-name="caret_down" unicode="" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> <glyph glyph-name="caret_up" unicode="" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> <glyph glyph-name="caret_left" unicode="" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" /> <glyph glyph-name="caret_right" unicode="" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" /> <glyph glyph-name="columns" unicode="" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" /> <glyph glyph-name="sort" unicode="" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> <glyph glyph-name="sort_down" unicode="" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> <glyph glyph-name="sort_up" unicode="" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> <glyph glyph-name="envelope_alt" unicode="" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" /> <glyph glyph-name="linkedin" unicode="" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" /> <glyph glyph-name="undo" unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" /> <glyph glyph-name="legal" unicode="" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" /> <glyph glyph-name="dashboard" unicode="" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> <glyph glyph-name="comment_alt" unicode="" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> <glyph glyph-name="comments_alt" unicode="" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" /> <glyph glyph-name="bolt" unicode="" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" /> <glyph glyph-name="sitemap" unicode="" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" /> <glyph glyph-name="umbrella" unicode="" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" /> <glyph glyph-name="paste" unicode="" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" /> <glyph glyph-name="light_bulb" unicode="" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" /> <glyph glyph-name="exchange" unicode="" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> <glyph glyph-name="cloud_download" unicode="" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> <glyph glyph-name="cloud_upload" unicode="" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> <glyph glyph-name="user_md" unicode="" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" /> <glyph glyph-name="stethoscope" unicode="" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" /> <glyph glyph-name="suitcase" unicode="" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" /> <glyph glyph-name="bell_alt" unicode="" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> <glyph glyph-name="coffee" unicode="" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" /> <glyph glyph-name="food" unicode="" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" /> <glyph glyph-name="file_text_alt" unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" /> <glyph glyph-name="building" unicode="" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" /> <glyph glyph-name="hospital" unicode="" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" /> <glyph glyph-name="ambulance" unicode="" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> <glyph glyph-name="medkit" unicode="" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" /> <glyph glyph-name="fighter_jet" unicode="" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q128 -28 200 -52t80 -34z" /> <glyph glyph-name="beer" unicode="" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" /> <glyph glyph-name="h_sign" unicode="" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="f0fe" unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="double_angle_left" unicode="" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" /> <glyph glyph-name="double_angle_right" unicode="" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> <glyph glyph-name="double_angle_up" unicode="" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> <glyph glyph-name="double_angle_down" unicode="" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> <glyph glyph-name="angle_left" unicode="" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> <glyph glyph-name="angle_right" unicode="" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> <glyph glyph-name="angle_up" unicode="" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> <glyph glyph-name="angle_down" unicode="" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> <glyph glyph-name="desktop" unicode="" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> <glyph glyph-name="laptop" unicode="" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" /> <glyph glyph-name="tablet" unicode="" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" /> <glyph glyph-name="mobile_phone" unicode="" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> <glyph glyph-name="circle_blank" unicode="" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="quote_left" unicode="" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" /> <glyph glyph-name="quote_right" unicode="" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" /> <glyph glyph-name="spinner" unicode="" horiz-adv-x="1792" d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5 q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" /> <glyph glyph-name="circle" unicode="" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="reply" unicode="" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" /> <glyph glyph-name="github_alt" unicode="" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" /> <glyph glyph-name="folder_close_alt" unicode="" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> <glyph glyph-name="folder_open_alt" unicode="" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " /> <glyph glyph-name="expand_alt" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="collapse_alt" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="smile" unicode="" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="frown" unicode="" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="meh" unicode="" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="gamepad" unicode="" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" /> <glyph glyph-name="keyboard" unicode="" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" /> <glyph glyph-name="flag_alt" unicode="" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> <glyph glyph-name="flag_checkered" unicode="" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> <glyph glyph-name="terminal" unicode="" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" /> <glyph glyph-name="code" unicode="" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" /> <glyph glyph-name="reply_all" unicode="" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" /> <glyph glyph-name="star_half_empty" unicode="" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" /> <glyph glyph-name="location_arrow" unicode="" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" /> <glyph glyph-name="crop" unicode="" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" /> <glyph glyph-name="code_fork" unicode="" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-67 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" /> <glyph glyph-name="unlink" unicode="" horiz-adv-x="1664" d="M439 265l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> <glyph glyph-name="question" unicode="" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" /> <glyph glyph-name="_279" unicode="" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" /> <glyph glyph-name="exclamation" unicode="" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" /> <glyph glyph-name="superscript" unicode="" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z M1534 846v-206h-514l-3 27q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5 t-65.5 -51.5t-30.5 -63h232v80h126z" /> <glyph glyph-name="subscript" unicode="" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z M1536 -50v-206h-514l-4 27q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73 h232v80h126z" /> <glyph glyph-name="_283" unicode="" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" /> <glyph glyph-name="puzzle_piece" unicode="" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" /> <glyph glyph-name="microphone" unicode="" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" /> <glyph glyph-name="microphone_off" unicode="" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" /> <glyph glyph-name="shield" unicode="" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> <glyph glyph-name="calendar_empty" unicode="" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> <glyph glyph-name="fire_extinguisher" unicode="" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" /> <glyph glyph-name="rocket" unicode="" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" /> <glyph glyph-name="maxcdn" unicode="" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" /> <glyph glyph-name="chevron_sign_left" unicode="" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="chevron_sign_right" unicode="" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="chevron_sign_up" unicode="" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="chevron_sign_down" unicode="" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="html5" unicode="" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" /> <glyph glyph-name="css3" unicode="" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" /> <glyph glyph-name="anchor" unicode="" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" /> <glyph glyph-name="unlock_alt" unicode="" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" /> <glyph glyph-name="bullseye" unicode="" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="ellipsis_horizontal" unicode="" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> <glyph glyph-name="ellipsis_vertical" unicode="" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> <glyph glyph-name="_303" unicode="" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 233 -176.5 396.5t-396.5 176.5q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128 q13 0 23 10t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="play_sign" unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" /> <glyph glyph-name="ticket" unicode="" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" /> <glyph glyph-name="minus_sign_alt" unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" /> <glyph glyph-name="check_minus" unicode="" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="level_up" unicode="" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" /> <glyph glyph-name="level_down" unicode="" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" /> <glyph glyph-name="check_sign" unicode="" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="edit_sign" unicode="" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="_312" unicode="" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="share_sign" unicode="" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q11 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="compass" unicode="" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="collapse" unicode="" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="collapse_top" unicode="" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="_317" unicode="" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="eur" unicode="" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" /> <glyph glyph-name="gbp" unicode="" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" /> <glyph glyph-name="usd" unicode="" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" /> <glyph glyph-name="inr" unicode="" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" /> <glyph glyph-name="jpy" unicode="" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" /> <glyph glyph-name="rub" unicode="" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" /> <glyph glyph-name="krw" unicode="" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" /> <glyph glyph-name="btc" unicode="" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" /> <glyph glyph-name="file" unicode="" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" /> <glyph glyph-name="file_text" unicode="" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" /> <glyph glyph-name="sort_by_alphabet" unicode="" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" /> <glyph glyph-name="_329" unicode="" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" /> <glyph glyph-name="sort_by_attributes" unicode="" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" /> <glyph glyph-name="sort_by_attributes_alt" unicode="" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" /> <glyph glyph-name="sort_by_order" unicode="" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" /> <glyph glyph-name="sort_by_order_alt" unicode="" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" /> <glyph glyph-name="_334" unicode="" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" /> <glyph glyph-name="_335" unicode="" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" /> <glyph glyph-name="youtube_sign" unicode="" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 17 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -29 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78q7 -23 23 -69l24 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38 q-51 0 -78 -38q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5 h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="youtube" unicode="" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-38 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q68 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" /> <glyph glyph-name="xing" unicode="" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" /> <glyph glyph-name="xing_sign" unicode="" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="youtube_play" unicode="" horiz-adv-x="1792" d="M711 408l484 250l-484 253v-503zM896 1270q168 0 324.5 -4.5t229.5 -9.5l73 -4q1 0 17 -1.5t23 -3t23.5 -4.5t28.5 -8t28 -13t31 -19.5t29 -26.5q6 -6 15.5 -18.5t29 -58.5t26.5 -101q8 -64 12.5 -136.5t5.5 -113.5v-40v-136q1 -145 -18 -290q-7 -55 -25 -99.5t-32 -61.5 l-14 -17q-14 -15 -29 -26.5t-31 -19t-28 -12.5t-28.5 -8t-24 -4.5t-23 -3t-16.5 -1.5q-251 -19 -627 -19q-207 2 -359.5 6.5t-200.5 7.5l-49 4l-36 4q-36 5 -54.5 10t-51 21t-56.5 41q-6 6 -15.5 18.5t-29 58.5t-26.5 101q-8 64 -12.5 136.5t-5.5 113.5v40v136 q-1 145 18 290q7 55 25 99.5t32 61.5l14 17q14 15 29 26.5t31 19.5t28 13t28.5 8t23.5 4.5t23 3t17 1.5q251 18 627 18z" /> <glyph glyph-name="dropbox" unicode="" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" /> <glyph glyph-name="stackexchange" unicode="" d="M1289 -96h-1118v480h-160v-640h1438v640h-160v-480zM347 428l33 157l783 -165l-33 -156zM450 802l67 146l725 -339l-67 -145zM651 1158l102 123l614 -513l-102 -123zM1048 1536l477 -641l-128 -96l-477 641zM330 65v159h800v-159h-800z" /> <glyph glyph-name="instagram" unicode="" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1162 640q0 -164 -115 -279t-279 -115t-279 115t-115 279t115 279t279 115t279 -115t115 -279zM1270 1050q0 -38 -27 -65t-65 -27t-65 27t-27 65t27 65t65 27t65 -27t27 -65zM768 1270 q-7 0 -76.5 0.5t-105.5 0t-96.5 -3t-103 -10t-71.5 -18.5q-50 -20 -88 -58t-58 -88q-11 -29 -18.5 -71.5t-10 -103t-3 -96.5t0 -105.5t0.5 -76.5t-0.5 -76.5t0 -105.5t3 -96.5t10 -103t18.5 -71.5q20 -50 58 -88t88 -58q29 -11 71.5 -18.5t103 -10t96.5 -3t105.5 0t76.5 0.5 t76.5 -0.5t105.5 0t96.5 3t103 10t71.5 18.5q50 20 88 58t58 88q11 29 18.5 71.5t10 103t3 96.5t0 105.5t-0.5 76.5t0.5 76.5t0 105.5t-3 96.5t-10 103t-18.5 71.5q-20 50 -58 88t-88 58q-29 11 -71.5 18.5t-103 10t-96.5 3t-105.5 0t-76.5 -0.5zM1536 640q0 -229 -5 -317 q-10 -208 -124 -322t-322 -124q-88 -5 -317 -5t-317 5q-208 10 -322 124t-124 322q-5 88 -5 317t5 317q10 208 124 322t322 124q88 5 317 5t317 -5q208 -10 322 -124t124 -322q5 -88 5 -317z" /> <glyph glyph-name="flickr" unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" /> <glyph glyph-name="adn" unicode="" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="f171" unicode="" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" /> <glyph glyph-name="bitbucket_sign" unicode="" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="tumblr" unicode="" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" /> <glyph glyph-name="tumblr_sign" unicode="" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="long_arrow_down" unicode="" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" /> <glyph glyph-name="long_arrow_up" unicode="" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" /> <glyph glyph-name="long_arrow_left" unicode="" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" /> <glyph glyph-name="long_arrow_right" unicode="" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" /> <glyph glyph-name="apple" unicode="" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q113 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" /> <glyph glyph-name="windows" unicode="" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" /> <glyph glyph-name="android" unicode="" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" /> <glyph glyph-name="linux" unicode="" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-10 -11 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18q-2 -1 -4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-6 0 -8 -2t0 -4 t5 -3q14 -4 18 -31q0 -3 8 2q2 2 2 3zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5 t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43 q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49 t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54 q110 143 124 195q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5 t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5 t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" /> <glyph glyph-name="dribble" unicode="" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -5 6.5 -17t7.5 -17q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="skype" unicode="" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" /> <glyph glyph-name="foursquare" unicode="" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" /> <glyph glyph-name="trello" unicode="" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> <glyph glyph-name="female" unicode="" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> <glyph glyph-name="male" unicode="" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> <glyph glyph-name="gittip" unicode="" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="sun" unicode="" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" /> <glyph glyph-name="_366" unicode="" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" /> <glyph glyph-name="archive" unicode="" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" /> <glyph glyph-name="bug" unicode="" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" /> <glyph glyph-name="vk" unicode="" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-40 -51 -55 -72t-30.5 -49.5t-12 -42t13 -34.5t32.5 -43t57 -53q4 -2 5 -4q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q16 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" /> <glyph glyph-name="weibo" unicode="" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" /> <glyph glyph-name="renren" unicode="" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" /> <glyph glyph-name="_372" unicode="" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -4 1 -50t-1 -72q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" /> <glyph glyph-name="stack_exchange" unicode="" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " /> <glyph glyph-name="_374" unicode="" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="arrow_circle_alt_left" unicode="" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="_376" unicode="" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="dot_circle_alt" unicode="" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="_378" unicode="" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 17 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" /> <glyph glyph-name="vimeo_square" unicode="" d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179 q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="_380" unicode="" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> <glyph glyph-name="plus_square_o" unicode="" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="_382" unicode="" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" /> <glyph glyph-name="_383" unicode="" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" /> <glyph glyph-name="_384" unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-47 32 -142 92.5t-142 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" /> <glyph glyph-name="_385" unicode="" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 t273 -182.5t331.5 -68z" /> <glyph glyph-name="_386" unicode="" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" /> <glyph glyph-name="_387" unicode="" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" /> <glyph glyph-name="_388" unicode="" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" /> <glyph glyph-name="_389" unicode="" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q44 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" /> <glyph glyph-name="uniF1A0" unicode="" d="M768 750h725q12 -67 12 -128q0 -217 -91 -387.5t-259.5 -266.5t-386.5 -96q-157 0 -299 60.5t-245 163.5t-163.5 245t-60.5 299t60.5 299t163.5 245t245 163.5t299 60.5q300 0 515 -201l-209 -201q-123 119 -306 119q-129 0 -238.5 -65t-173.5 -176.5t-64 -243.5 t64 -243.5t173.5 -176.5t238.5 -65q87 0 160 24t120 60t82 82t51.5 87t22.5 78h-436v264z" /> <glyph glyph-name="f1a1" unicode="" horiz-adv-x="1792" d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26 t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37 q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191 t348 71t348 -71t286 -191t191 -286t71 -348z" /> <glyph glyph-name="_392" unicode="" d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54 q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83 q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="_393" unicode="" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="f1a4" unicode="" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" /> <glyph glyph-name="_395" unicode="" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" /> <glyph glyph-name="_396" unicode="" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" /> <glyph glyph-name="_397" unicode="" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="_398" unicode="" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" /> <glyph glyph-name="_399" unicode="" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" /> <glyph glyph-name="_400" unicode="" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 t135.5 51q85 0 145 -60.5t60 -145.5z" /> <glyph glyph-name="f1ab" unicode="" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q107 36 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 q20 0 20 -21v-418z" /> <glyph glyph-name="_402" unicode="" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" /> <glyph glyph-name="_403" unicode="" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" /> <glyph glyph-name="_404" unicode="" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68q29 28 68.5 28t67.5 -28l228 -228h368l228 228q28 28 68 28t68 -28q28 -29 28 -68.5t-28 -67.5zM864 1152 q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> <glyph glyph-name="uniF1B1" unicode="" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 t100.5 134t141.5 55.5z" /> <glyph glyph-name="_406" unicode="" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" /> <glyph glyph-name="_407" unicode="" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " /> <glyph glyph-name="_408" unicode="" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-4 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 v-400l434 -186q36 -16 57 -48t21 -70z" /> <glyph glyph-name="_409" unicode="" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" /> <glyph glyph-name="_410" unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" /> <glyph glyph-name="_411" unicode="" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" /> <glyph glyph-name="_412" unicode="" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z " /> <glyph glyph-name="_413" unicode="" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" /> <glyph glyph-name="_414" unicode="" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" /> <glyph glyph-name="_415" unicode="" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" /> <glyph glyph-name="_416" unicode="" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" /> <glyph glyph-name="_417" unicode="" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="_418" unicode="" horiz-adv-x="1024" d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" /> <glyph glyph-name="_419" unicode="" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236 q0 -11 -8 -19t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786 q-13 2 -22 11t-9 22v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" /> <glyph glyph-name="uniF1C0" unicode="" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128v128q0 69 103 128t280 93.5t385 34.5z" /> <glyph glyph-name="uniF1C1" unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 q-1 1 -1 2q-1 2 -1 3q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" /> <glyph glyph-name="_422" unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4q0 3 -0.5 6.5t-1.5 8t-1 6.5q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5 t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300z" /> <glyph glyph-name="_423" unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 h-290v-107h68l189 -272l-194 -283h-68z" /> <glyph glyph-name="_424" unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" /> <glyph glyph-name="_425" unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" /> <glyph glyph-name="_426" unicode="" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" /> <glyph glyph-name="_427" unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" /> <glyph glyph-name="_428" unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" /> <glyph glyph-name="_429" unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" /> <glyph glyph-name="_430" unicode="" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" /> <glyph glyph-name="_431" unicode="" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" /> <glyph glyph-name="_432" unicode="" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97l93 -108q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z" /> <glyph glyph-name="_433" unicode="" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" /> <glyph glyph-name="_434" unicode="" horiz-adv-x="1792" d="M1760 640q0 -176 -68.5 -336t-184 -275.5t-275.5 -184t-336 -68.5t-336 68.5t-275.5 184t-184 275.5t-68.5 336q0 213 97 398.5t265 305.5t374 151v-228q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5 t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v228q206 -31 374 -151t265 -305.5t97 -398.5z" /> <glyph glyph-name="uniF1D0" unicode="" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" /> <glyph glyph-name="uniF1D1" unicode="" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> <glyph glyph-name="uniF1D2" unicode="" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="_438" unicode="" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" /> <glyph glyph-name="_439" unicode="" d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="uniF1D5" unicode="" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" /> <glyph glyph-name="uniF1D6" unicode="" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" /> <glyph glyph-name="uniF1D7" unicode="" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" /> <glyph glyph-name="_443" unicode="" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" /> <glyph glyph-name="_444" unicode="" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" /> <glyph glyph-name="_445" unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" /> <glyph glyph-name="_446" unicode="" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="_447" unicode="" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22z" /> <glyph glyph-name="_448" unicode="" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" /> <glyph glyph-name="_449" unicode="" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" /> <glyph glyph-name="uniF1E0" unicode="" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" /> <glyph glyph-name="_451" unicode="" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="_452" unicode="" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> <glyph glyph-name="_453" unicode="" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" /> <glyph glyph-name="_454" unicode="" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" /> <glyph glyph-name="_455" unicode="" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" /> <glyph glyph-name="_456" unicode="" horiz-adv-x="1792" d="M1755 1083q37 -38 37 -90.5t-37 -90.5l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234 l401 400q38 37 91 37t90 -37z" /> <glyph glyph-name="_457" unicode="" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q4 -2 11.5 -7 t10.5 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" /> <glyph glyph-name="_458" unicode="" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" /> <glyph glyph-name="_459" unicode="" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q71 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" /> <glyph glyph-name="_460" unicode="" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" /> <glyph glyph-name="_461" unicode="" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" /> <glyph glyph-name="_462" unicode="" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" /> <glyph glyph-name="_463" unicode="" d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246 q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598 q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" /> <glyph glyph-name="_464" unicode="" horiz-adv-x="1792" d="M441 864q33 0 52 -26q266 -364 362 -774h-446q-127 441 -367 749q-12 16 -3 33.5t29 17.5h373zM1000 507q-49 -199 -125 -393q-79 310 -256 594q40 221 44 449q211 -340 337 -650zM1099 1216q235 -324 384.5 -698.5t184.5 -773.5h-451q-41 665 -553 1472h435zM1792 640 q0 -424 -101 -812q-67 560 -359 1083q-25 301 -106 584q-4 16 5.5 28.5t25.5 12.5h359q21 0 38.5 -13t22.5 -33q115 -409 115 -850z" /> <glyph glyph-name="uniF1F0" unicode="" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> <glyph glyph-name="_466" unicode="" horiz-adv-x="2304" d="M1119 1195q-128 85 -281 85q-103 0 -197.5 -40.5t-162.5 -108.5t-108.5 -162t-40.5 -197q0 -104 40.5 -198t108.5 -162t162 -108.5t198 -40.5q153 0 281 85q-131 107 -178 265.5t0.5 316.5t177.5 265zM1152 1171q-126 -99 -172 -249.5t-0.5 -300.5t172.5 -249 q127 99 172.5 249t-0.5 300.5t-172 249.5zM1185 1195q130 -107 177.5 -265.5t0.5 -317t-178 -264.5q128 -85 281 -85q104 0 198 40.5t162 108.5t108.5 162t40.5 198q0 103 -40.5 197t-108.5 162t-162.5 108.5t-197.5 40.5q-153 0 -281 -85zM1926 473h7v3h-17v-3h7v-17h3v17z M1955 456h4v20h-5l-6 -13l-6 13h-5v-20h3v15l6 -13h4l5 13v-15zM1947 16v-2h-2h-3v3h3h2v-1zM1947 7h3l-4 5h2l1 1q1 1 1 3t-1 3l-1 1h-3h-6v-13h3v5h1zM685 75q0 19 11 31t30 12q18 0 29 -12.5t11 -30.5q0 -19 -11 -31t-29 -12q-19 0 -30 12t-11 31zM1158 119q30 0 35 -32 h-70q5 32 35 32zM1514 75q0 19 11 31t29 12t29.5 -12.5t11.5 -30.5q0 -19 -11 -31t-30 -12q-18 0 -29 12t-11 31zM1786 75q0 18 11.5 30.5t29.5 12.5t29.5 -12.5t11.5 -30.5q0 -19 -11.5 -31t-29.5 -12t-29.5 12.5t-11.5 30.5zM1944 3q-2 0 -4 1q-1 0 -3 2t-2 3q-1 2 -1 4 q0 3 1 4q0 2 2 4l1 1q2 0 2 1q2 1 4 1q3 0 4 -1l4 -2l2 -4v-1q1 -2 1 -3l-1 -1v-3t-1 -1l-1 -2q-2 -2 -4 -2q-1 -1 -4 -1zM599 7h30v85q0 24 -14.5 38.5t-39.5 15.5q-32 0 -47 -24q-14 24 -45 24q-24 0 -39 -20v16h-30v-135h30v75q0 36 33 36q30 0 30 -36v-75h29v75 q0 36 33 36q30 0 30 -36v-75zM765 7h29v68v67h-29v-16q-17 20 -43 20q-29 0 -48 -20t-19 -51t19 -51t48 -20q28 0 43 20v-17zM943 48q0 34 -47 40l-14 2q-23 4 -23 14q0 15 25 15q23 0 43 -11l12 24q-22 14 -55 14q-26 0 -41 -12t-15 -32q0 -33 47 -39l13 -2q24 -4 24 -14 q0 -17 -31 -17q-25 0 -45 14l-13 -23q25 -17 58 -17q29 0 45.5 12t16.5 32zM1073 14l-8 25q-13 -7 -26 -7q-19 0 -19 22v61h48v27h-48v41h-30v-41h-28v-27h28v-61q0 -50 47 -50q21 0 36 10zM1159 146q-29 0 -48 -20t-19 -51q0 -32 19.5 -51.5t49.5 -19.5q33 0 55 19l-14 22 q-18 -15 -39 -15q-34 0 -41 33h101v12q0 32 -18 51.5t-46 19.5zM1318 146q-23 0 -35 -20v16h-30v-135h30v76q0 35 29 35q10 0 18 -4l9 28q-9 4 -21 4zM1348 75q0 -31 19.5 -51t52.5 -20q29 0 48 16l-14 24q-18 -13 -35 -12q-18 0 -29.5 12t-11.5 31t11.5 31t29.5 12 q19 0 35 -12l14 24q-20 16 -48 16q-33 0 -52.5 -20t-19.5 -51zM1593 7h30v68v67h-30v-16q-15 20 -42 20q-29 0 -48.5 -20t-19.5 -51t19.5 -51t48.5 -20q28 0 42 20v-17zM1726 146q-23 0 -35 -20v16h-29v-135h29v76q0 35 29 35q10 0 18 -4l9 28q-8 4 -21 4zM1866 7h29v68v122 h-29v-71q-15 20 -43 20t-47.5 -20.5t-19.5 -50.5t19.5 -50.5t47.5 -20.5q29 0 43 20v-17zM1944 27l-2 -1h-3q-2 -1 -4 -3q-3 -1 -3 -4q-1 -2 -1 -6q0 -3 1 -5q0 -2 3 -4q2 -2 4 -3t5 -1q4 0 6 1q0 1 2 2l2 1q1 1 3 4q1 2 1 5q0 4 -1 6q-1 1 -3 4q0 1 -2 2l-2 1q-1 0 -3 0.5 t-3 0.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> <glyph glyph-name="_467" unicode="" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" /> <glyph glyph-name="f1f3" unicode="" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" /> <glyph glyph-name="_469" unicode="" horiz-adv-x="2304" d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16 t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76 q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59 t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489 l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66 q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> <glyph glyph-name="_470" unicode="" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> <glyph glyph-name="_471" unicode="" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 l418 363q10 8 23.5 7t21.5 -11z" /> <glyph glyph-name="_472" unicode="" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" /> <glyph glyph-name="_473" unicode="" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> <glyph glyph-name="_474" unicode="" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="_475" unicode="" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" /> <glyph glyph-name="_476" unicode="" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" /> <glyph glyph-name="f1fc" unicode="" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" /> <glyph glyph-name="_478" unicode="" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11q24 0 44 -7t31 -15t33 -27q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5 t47 37.5q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-24 0 -44 7t-31 15t-33 27q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38 t-58 27t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448 h256v448h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5 q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" /> <glyph glyph-name="_479" unicode="" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" /> <glyph glyph-name="_480" unicode="" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="_481" unicode="" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" /> <glyph glyph-name="_482" unicode="" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" /> <glyph glyph-name="_483" unicode="" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="_484" unicode="" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" /> <glyph glyph-name="_485" unicode="" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" /> <glyph glyph-name="_486" unicode="" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" /> <glyph glyph-name="_487" unicode="" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" /> <glyph glyph-name="_488" unicode="" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" /> <glyph glyph-name="_489" unicode="" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q17 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" /> <glyph glyph-name="_490" unicode="" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" /> <glyph glyph-name="_491" unicode="" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> <glyph glyph-name="_492" unicode="" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" /> <glyph glyph-name="_493" unicode="" d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" /> <glyph glyph-name="_494" unicode="" horiz-adv-x="2048" d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335 q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5 q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360l15 -6l188 199v347l-187 194q-13 -8 -29 -10zM986 1438 h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13zM552 226h402l64 66 l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224l213 -225zM1023 946 l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196l-48 -227l130 227h-82 zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" /> <glyph glyph-name="f210" unicode="" d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" /> <glyph glyph-name="_496" unicode="" d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384 q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" /> <glyph glyph-name="f212" unicode="" horiz-adv-x="2048" d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021 q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25 q209 0 374 -102q172 107 374 102z" /> <glyph glyph-name="_498" unicode="" horiz-adv-x="2048" d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101 q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284 q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" /> <glyph glyph-name="_499" unicode="" d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34 l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114 v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378 v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51 h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5 t-43 -34t-16.5 -53.5z" /> <glyph glyph-name="_500" unicode="" horiz-adv-x="2048" d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832 q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" /> <glyph glyph-name="_501" unicode="" horiz-adv-x="2048" d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126t-103.5 132.5t-108.5 126.5t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5 t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113 t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5 q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" /> <glyph glyph-name="_502" unicode="" horiz-adv-x="1664" d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> <glyph glyph-name="_503" unicode="" horiz-adv-x="1664" d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> <glyph glyph-name="_504" unicode="" horiz-adv-x="2048" d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20 l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" /> <glyph glyph-name="_505" unicode="" horiz-adv-x="2048" d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83 q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314 v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" /> <glyph glyph-name="_506" unicode="" d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14 t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5 q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31 t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" /> <glyph glyph-name="_507" unicode="" horiz-adv-x="2304" d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5 t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105 l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226 t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" /> <glyph glyph-name="_508" unicode="" d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12 q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384 q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5 t158.5 -65.5t65.5 -158.5z" /> <glyph glyph-name="_509" unicode="" horiz-adv-x="1792" d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221 q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124 t127 -344z" /> <glyph glyph-name="venus" unicode="" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292 q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" /> <glyph glyph-name="_511" unicode="" d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5 q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> <glyph glyph-name="_512" unicode="" horiz-adv-x="1280" d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5 t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> <glyph glyph-name="_513" unicode="" d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> <glyph glyph-name="_514" unicode="" horiz-adv-x="1792" d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9 t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> <glyph glyph-name="_515" unicode="" horiz-adv-x="1792" d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23 t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391 q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391 q0 -226 -154 -391q103 -57 218 -57z" /> <glyph glyph-name="_516" unicode="" horiz-adv-x="1920" d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230 q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9 t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128 q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -28 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" /> <glyph glyph-name="_517" unicode="" horiz-adv-x="2048" d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23 t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9 t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5 t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" /> <glyph glyph-name="_518" unicode="" d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5 t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> <glyph glyph-name="_519" unicode="" horiz-adv-x="1280" d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22 t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5 t131.5 -316.5t316.5 -131.5z" /> <glyph glyph-name="_520" unicode="" horiz-adv-x="2048" d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5 t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5 t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> <glyph glyph-name="_521" unicode="" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> <glyph glyph-name="_522" unicode="" horiz-adv-x="1280" d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123 t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" /> <glyph glyph-name="_523" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="_524" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="_525" unicode="" d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" /> <glyph glyph-name="_526" unicode="" horiz-adv-x="1280" d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5 l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5 q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" /> <glyph glyph-name="_527" unicode="" d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5 t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233 l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" /> <glyph glyph-name="_528" unicode="" horiz-adv-x="1792" d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216 q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" /> <glyph glyph-name="_529" unicode="" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" /> <glyph glyph-name="_530" unicode="" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136 q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69 t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" /> <glyph glyph-name="_531" unicode="" horiz-adv-x="2048" d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704 q-26 0 -45 -19t-19 -45v-384h1152z" /> <glyph glyph-name="_532" unicode="" d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" /> <glyph glyph-name="_533" unicode="" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56 t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" /> <glyph glyph-name="_534" unicode="" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47 t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" /> <glyph glyph-name="_535" unicode="" horiz-adv-x="1792" d="M597 1115v-1173q0 -25 -12.5 -42.5t-36.5 -17.5q-17 0 -33 8l-465 233q-21 10 -35.5 33.5t-14.5 46.5v1140q0 20 10 34t29 14q14 0 44 -15l511 -256q3 -3 3 -5zM661 1014l534 -866l-534 266v600zM1792 996v-1054q0 -25 -14 -40.5t-38 -15.5t-47 13l-441 220zM1789 1116 q0 -3 -256.5 -419.5t-300.5 -487.5l-390 634l324 527q17 28 52 28q14 0 26 -6l541 -270q4 -2 4 -6z" /> <glyph glyph-name="_536" unicode="" d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" /> <glyph glyph-name="_537" unicode="" horiz-adv-x="2296" d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5 q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5 q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42 q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37 q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5 q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139 q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 5 5 8q16 18 60 23h13q5 18 19 30t33 8 t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132 q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132 q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-105 2 -211 0v1q-1 -27 2.5 -86 t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103 q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34q0 2 0.5 3.5t1.5 3t1 2.5v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4 l-10 -2.5t-12 -2l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-6 -1 -9 -1q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130 t-73 70q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -1 -1 -4t-1 -5q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150 q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12 q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" /> <glyph glyph-name="_538" unicode="" horiz-adv-x="2304" d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5 t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5 t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" /> <glyph glyph-name="_539" unicode="" horiz-adv-x="1792" d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348 t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23 t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512 q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" /> <glyph glyph-name="_540" unicode="" horiz-adv-x="2304" d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113 v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" /> <glyph glyph-name="_541" unicode="" horiz-adv-x="2304" d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> <glyph glyph-name="_542" unicode="" horiz-adv-x="2304" d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> <glyph glyph-name="_543" unicode="" horiz-adv-x="2304" d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> <glyph glyph-name="_544" unicode="" horiz-adv-x="2304" d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23 v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> <glyph glyph-name="_545" unicode="" horiz-adv-x="1280" d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" /> <glyph glyph-name="_546" unicode="" horiz-adv-x="1024" d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" /> <glyph glyph-name="_547" unicode="" horiz-adv-x="2048" d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128 h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" /> <glyph glyph-name="_548" unicode="" horiz-adv-x="2304" d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256 v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" /> <glyph glyph-name="_549" unicode="" d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" /> <glyph glyph-name="_550" unicode="" d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68 z" /> <glyph glyph-name="_551" unicode="" horiz-adv-x="2304" d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5 t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88 t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90 t90 38h2048q52 0 90 -38t38 -90z" /> <glyph glyph-name="_552" unicode="" horiz-adv-x="2304" d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294 t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> <glyph glyph-name="_553" unicode="" horiz-adv-x="1792" d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113 zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" /> <glyph glyph-name="_554" unicode="" horiz-adv-x="2304" d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64 q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91 t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5 t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" /> <glyph glyph-name="_555" unicode="" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5 t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" /> <glyph glyph-name="_556" unicode="" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" /> <glyph glyph-name="_557" unicode="" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" /> <glyph glyph-name="_558" unicode="" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196 h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" /> <glyph glyph-name="_559" unicode="" d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87 t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9 h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" /> <glyph glyph-name="_560" unicode="" d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25 q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27 t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21 q72 69 174 69z" /> <glyph glyph-name="_561" unicode="" horiz-adv-x="1792" d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33 t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52 h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" /> <glyph glyph-name="_562" unicode="" horiz-adv-x="1792" d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668 q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17 t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5 t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5 q0 -42 -23 -78t-61 -53l-310 -141h91z" /> <glyph glyph-name="_563" unicode="" horiz-adv-x="2048" d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32 q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68 q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" /> <glyph glyph-name="_564" unicode="" horiz-adv-x="2048" d="M459 -256q-77 0 -137.5 47.5t-79.5 122.5l-101 401q-13 57 -13 108q0 45 -5 67l-116 477q-7 27 -7 57q0 93 62 161t155 78q17 85 82.5 139t152.5 54q83 0 148 -51.5t85 -132.5l83 -348l103 428q20 81 85 132.5t148 51.5q89 0 155.5 -57.5t80.5 -144.5q92 -10 152 -79 t60 -162q0 -24 -7 -59l-123 -512q10 7 37.5 28.5t38.5 29.5t35 23t41 20.5t41.5 11t49.5 5.5q105 0 180 -74t75 -179q0 -62 -28.5 -118t-78.5 -94l-507 -380q-68 -51 -153 -51h-694zM1104 1408q-38 0 -68.5 -24t-39.5 -62l-164 -682h-127l-145 602q-9 38 -39.5 62t-68.5 24 q-48 0 -80 -33t-32 -80q0 -15 3 -28l132 -547h-26l-99 408q-9 37 -40 62.5t-69 25.5q-47 0 -80 -33t-33 -79q0 -14 3 -26l116 -478q7 -28 9 -86t10 -88l100 -401q8 -32 34 -52.5t59 -20.5h694q42 0 76 26l507 379q56 43 56 110q0 52 -37.5 88.5t-89.5 36.5q-43 0 -77 -26 l-307 -230v227q0 4 32 138t68 282t39 161q4 18 4 29q0 47 -32 81t-79 34q-39 0 -69.5 -24t-39.5 -62l-116 -482h-26l150 624q3 14 3 28q0 48 -31.5 82t-79.5 34z" /> <glyph glyph-name="_565" unicode="" horiz-adv-x="1792" d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5 q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5 v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32 v-384h32z" /> <glyph glyph-name="_566" unicode="" d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181 v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46 q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5 q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308 q0 -53 37.5 -90.5t90.5 -37.5h668z" /> <glyph glyph-name="_567" unicode="" horiz-adv-x="1973" d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5 t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141 q13 0 22 -8.5t10 -20.5z" /> <glyph glyph-name="_568" unicode="" horiz-adv-x="1792" d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109 t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640 q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> <glyph glyph-name="_569" unicode="" horiz-adv-x="1792" d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78 q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5 t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376 q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191 t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" /> <glyph glyph-name="f260" unicode="" horiz-adv-x="2048" d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" /> <glyph glyph-name="f261" unicode="" horiz-adv-x="1792" d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191 t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> <glyph glyph-name="_572" unicode="" horiz-adv-x="2304" d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57 t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197 t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5 t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5 t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5 q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" /> <glyph glyph-name="f263" unicode="" horiz-adv-x="1280" d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5 t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94 q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" /> <glyph glyph-name="_574" unicode="" d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32 q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5 zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="_575" unicode="" horiz-adv-x="1720" d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33 l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" /> <glyph glyph-name="_576" unicode="" horiz-adv-x="2304" d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540 q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81 l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" /> <glyph glyph-name="_577" unicode="" horiz-adv-x="1792" d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640 q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5 t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5 t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5 t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191 t191 -286t71 -348z" /> <glyph glyph-name="_578" unicode="" horiz-adv-x="1792" d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962 q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" /> <glyph glyph-name="_579" unicode="" horiz-adv-x="1792" d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5 q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5 q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" /> <glyph glyph-name="_580" unicode="" horiz-adv-x="1792" d="M1493 1308q-165 110 -359 110q-155 0 -293 -73t-240 -200q-75 -93 -119.5 -218t-48.5 -266v-42q4 -141 48.5 -266t119.5 -218q102 -127 240 -200t293 -73q194 0 359 110q-121 -108 -274.5 -168t-322.5 -60q-29 0 -43 1q-175 8 -333 82t-272 193t-181 281t-67 339 q0 182 71 348t191 286t286 191t348 71h3q168 -1 320.5 -60.5t273.5 -167.5zM1792 640q0 -192 -77 -362.5t-213 -296.5q-104 -63 -222 -63q-137 0 -255 84q154 56 253.5 233t99.5 405q0 227 -99 404t-253 234q119 83 254 83q119 0 226 -65q135 -125 210.5 -295t75.5 -361z " /> <glyph glyph-name="_581" unicode="" horiz-adv-x="1792" d="M1792 599q0 -56 -7 -104h-1151q0 -146 109.5 -244.5t257.5 -98.5q99 0 185.5 46.5t136.5 130.5h423q-56 -159 -170.5 -281t-267.5 -188.5t-321 -66.5q-187 0 -356 83q-228 -116 -394 -116q-237 0 -237 263q0 115 45 275q17 60 109 229q199 360 475 606 q-184 -79 -427 -354q63 274 283.5 449.5t501.5 175.5q30 0 45 -1q255 117 433 117q64 0 116 -13t94.5 -40.5t66.5 -76.5t24 -115q0 -116 -75 -286q101 -182 101 -390zM1722 1239q0 83 -53 132t-137 49q-108 0 -254 -70q121 -47 222.5 -131.5t170.5 -195.5q51 135 51 216z M128 2q0 -86 48.5 -132.5t134.5 -46.5q115 0 266 83q-122 72 -213.5 183t-137.5 245q-98 -205 -98 -332zM632 715h728q-5 142 -113 237t-251 95q-144 0 -251.5 -95t-112.5 -237z" /> <glyph glyph-name="_582" unicode="" horiz-adv-x="2048" d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23 v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> <glyph glyph-name="_583" unicode="" horiz-adv-x="1792" d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34 h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100 q-68 175 -180 287z" /> <glyph glyph-name="_584" unicode="" d="M1401 -11l-6 -6q-113 -113 -259 -175q-154 -64 -317 -64q-165 0 -317 64q-148 63 -259 175q-113 112 -175 258q-42 103 -54 189q-4 28 48 36q51 8 56 -20q1 -1 1 -4q18 -90 46 -159q50 -124 152 -226q98 -98 226 -152q132 -56 276 -56q143 0 276 56q128 55 225 152l6 6 q10 10 25 6q12 -3 33 -22q36 -37 17 -58zM929 604l-66 -66l63 -63q21 -21 -7 -49q-17 -17 -32 -17q-10 0 -19 10l-62 61l-66 -66q-5 -5 -15 -5q-15 0 -31 16l-2 2q-18 15 -18 29q0 7 8 17l66 65l-66 66q-16 16 14 45q18 18 31 18q6 0 13 -5l65 -66l65 65q18 17 48 -13 q27 -27 11 -44zM1400 547q0 -118 -46 -228q-45 -105 -126 -186q-80 -80 -187 -126t-228 -46t-228 46t-187 126q-82 82 -125 186q-15 33 -15 40h-1q-9 27 43 44q50 16 60 -12q37 -99 97 -167h1v339v2q3 136 102 232q105 103 253 103q147 0 251 -103t104 -249 q0 -147 -104.5 -251t-250.5 -104q-58 0 -112 16q-28 11 -13 61q16 51 44 43l14 -3q14 -3 33 -6t30 -3q104 0 176 71.5t72 174.5q0 101 -72 171q-71 71 -175 71q-107 0 -178 -80q-64 -72 -64 -160v-413q110 -67 242 -67q96 0 185 36.5t156 103.5t103.5 155t36.5 183 q0 198 -141 339q-140 140 -339 140q-200 0 -340 -140q-53 -53 -77 -87l-2 -2q-8 -11 -13 -15.5t-21.5 -9.5t-38.5 3q-21 5 -36.5 16.5t-15.5 26.5v680q0 15 10.5 26.5t27.5 11.5h877q30 0 30 -55t-30 -55h-811v-483h1q40 42 102 84t108 61q109 46 231 46q121 0 228 -46 t187 -126q81 -81 126 -186q46 -112 46 -229zM1369 1128q9 -8 9 -18t-5.5 -18t-16.5 -21q-26 -26 -39 -26q-9 0 -16 7q-106 91 -207 133q-128 56 -276 56q-133 0 -262 -49q-27 -10 -45 37q-9 25 -8 38q3 16 16 20q130 57 299 57q164 0 316 -64q137 -58 235 -152z" /> <glyph glyph-name="_585" unicode="" horiz-adv-x="1792" d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30 q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57 t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133 q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" /> <glyph glyph-name="_586" unicode="" horiz-adv-x="1792" d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9 h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224 v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" /> <glyph glyph-name="_587" unicode="" horiz-adv-x="1792" d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23 t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47 t47 -113v-96h128q52 0 90 -38t38 -90z" /> <glyph glyph-name="_588" unicode="" horiz-adv-x="1792" d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> <glyph glyph-name="_589" unicode="" horiz-adv-x="1792" d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47 t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> <glyph glyph-name="_590" unicode="" horiz-adv-x="1792" d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" /> <glyph glyph-name="_591" unicode="" horiz-adv-x="1024" d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q62 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249 q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" /> <glyph glyph-name="_592" unicode="" horiz-adv-x="1792" d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768 q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" /> <glyph glyph-name="_593" unicode="" horiz-adv-x="2048" d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173 v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" /> <glyph glyph-name="_594" unicode="" horiz-adv-x="1792" d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472 q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" /> <glyph glyph-name="_595" unicode="" horiz-adv-x="1792" d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37 t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> <glyph glyph-name="_596" unicode="" horiz-adv-x="1792" d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5 t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51 t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" /> <glyph glyph-name="_597" unicode="" horiz-adv-x="1024" d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" /> <glyph glyph-name="_598" unicode="" horiz-adv-x="1792" d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246 q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" /> <glyph glyph-name="f27e" unicode="" d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" /> <glyph glyph-name="uniF280" unicode="" d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72 h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275 l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" /> <glyph glyph-name="uniF281" unicode="" horiz-adv-x="1792" d="M1792 690q0 -58 -29.5 -105.5t-79.5 -72.5q12 -46 12 -96q0 -155 -106.5 -287t-290.5 -208.5t-400 -76.5t-399.5 76.5t-290 208.5t-106.5 287q0 47 11 94q-51 25 -82 73.5t-31 106.5q0 82 58 140.5t141 58.5q85 0 145 -63q218 152 515 162l116 521q3 13 15 21t26 5 l369 -81q18 37 54 59.5t79 22.5q62 0 106 -43.5t44 -105.5t-44 -106t-106 -44t-105.5 43.5t-43.5 105.5l-334 74l-104 -472q300 -9 519 -160q58 61 143 61q83 0 141 -58.5t58 -140.5zM418 491q0 -62 43.5 -106t105.5 -44t106 44t44 106t-44 105.5t-106 43.5q-61 0 -105 -44 t-44 -105zM1228 136q11 11 11 26t-11 26q-10 10 -25 10t-26 -10q-41 -42 -121 -62t-160 -20t-160 20t-121 62q-11 10 -26 10t-25 -10q-11 -10 -11 -25.5t11 -26.5q43 -43 118.5 -68t122.5 -29.5t91 -4.5t91 4.5t122.5 29.5t118.5 68zM1225 341q62 0 105.5 44t43.5 106 q0 61 -44 105t-105 44q-62 0 -106 -43.5t-44 -105.5t44 -106t106 -44z" /> <glyph glyph-name="_602" unicode="" horiz-adv-x="1792" d="M69 741h1q16 126 58.5 241.5t115 217t167.5 176t223.5 117.5t276.5 43q231 0 414 -105.5t294 -303.5q104 -187 104 -442v-188h-1125q1 -111 53.5 -192.5t136.5 -122.5t189.5 -57t213 -3t208 46.5t173.5 84.5v-377q-92 -55 -229.5 -92t-312.5 -38t-316 53 q-189 73 -311.5 249t-124.5 372q-3 242 111 412t325 268q-48 -60 -78 -125.5t-46 -159.5h635q8 77 -8 140t-47 101.5t-70.5 66.5t-80.5 41t-75 20.5t-56 8.5l-22 1q-135 -5 -259.5 -44.5t-223.5 -104.5t-176 -140.5t-138 -163.5z" /> <glyph glyph-name="_603" unicode="" horiz-adv-x="2304" d="M0 32v608h2304v-608q0 -66 -47 -113t-113 -47h-1984q-66 0 -113 47t-47 113zM640 256v-128h384v128h-384zM256 256v-128h256v128h-256zM2144 1408q66 0 113 -47t47 -113v-224h-2304v224q0 66 47 113t113 47h1984z" /> <glyph glyph-name="_604" unicode="" horiz-adv-x="1792" d="M1584 246l-218 111q-74 -120 -196.5 -189t-263.5 -69q-147 0 -271 72t-196 196t-72 270q0 110 42.5 209.5t115 172t172 115t209.5 42.5q131 0 247.5 -60.5t192.5 -168.5l215 125q-110 169 -286.5 265t-378.5 96q-161 0 -308 -63t-253 -169t-169 -253t-63 -308t63 -308 t169 -253t253 -169t308 -63q213 0 397.5 107t290.5 292zM1030 643l693 -352q-116 -253 -334.5 -400t-492.5 -147q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71q260 0 470.5 -133.5t335.5 -366.5zM1543 640h-39v-160h-96v352h136q32 0 54.5 -20 t28.5 -48t1 -56t-27.5 -48t-57.5 -20z" /> <glyph glyph-name="uniF285" unicode="" horiz-adv-x="1792" d="M1427 827l-614 386l92 151h855zM405 562l-184 116v858l1183 -743zM1424 697l147 -95v-858l-532 335zM1387 718l-500 -802h-855l356 571z" /> <glyph glyph-name="uniF286" unicode="" horiz-adv-x="1792" d="M640 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1152 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1664 496v-752h-640v320q0 80 -56 136t-136 56t-136 -56t-56 -136v-320h-640v752q0 16 16 16h96 q16 0 16 -16v-112h128v624q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 6 2.5 9.5t8.5 5t9.5 2t11.5 0t9 -0.5v391q-32 15 -32 50q0 23 16.5 39t38.5 16t38.5 -16t16.5 -39q0 -35 -32 -50v-17q45 10 83 10q21 0 59.5 -7.5t54.5 -7.5 q17 0 47 7.5t37 7.5q16 0 16 -16v-210q0 -15 -35 -21.5t-62 -6.5q-18 0 -54.5 7.5t-55.5 7.5q-40 0 -90 -12v-133q1 0 9 0.5t11.5 0t9.5 -2t8.5 -5t2.5 -9.5v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-624h128v112q0 16 16 16h96 q16 0 16 -16z" /> <glyph glyph-name="_607" unicode="" horiz-adv-x="2304" d="M2288 731q16 -8 16 -27t-16 -27l-320 -192q-8 -5 -16 -5q-9 0 -16 4q-16 10 -16 28v128h-858q37 -58 83 -165q16 -37 24.5 -55t24 -49t27 -47t27 -34t31.5 -26t33 -8h96v96q0 14 9 23t23 9h320q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v96h-96 q-32 0 -61 10t-51 23.5t-45 40.5t-37 46t-33.5 57t-28.5 57.5t-28 60.5q-23 53 -37 81.5t-36 65t-44.5 53.5t-46.5 17h-360q-22 -84 -91 -138t-157 -54q-106 0 -181 75t-75 181t75 181t181 75q88 0 157 -54t91 -138h104q24 0 46.5 17t44.5 53.5t36 65t37 81.5q19 41 28 60.5 t28.5 57.5t33.5 57t37 46t45 40.5t51 23.5t61 10h107q21 57 70 92.5t111 35.5q80 0 136 -56t56 -136t-56 -136t-136 -56q-62 0 -111 35.5t-70 92.5h-107q-17 0 -33 -8t-31.5 -26t-27 -34t-27 -47t-24 -49t-24.5 -55q-46 -107 -83 -165h1114v128q0 18 16 28t32 -1z" /> <glyph glyph-name="_608" unicode="" horiz-adv-x="1792" d="M1150 774q0 -56 -39.5 -95t-95.5 -39h-253v269h253q56 0 95.5 -39.5t39.5 -95.5zM1329 774q0 130 -91.5 222t-222.5 92h-433v-896h180v269h253q130 0 222 91.5t92 221.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348 t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> <glyph glyph-name="_609" unicode="" horiz-adv-x="2304" d="M1645 438q0 59 -34 106.5t-87 68.5q-7 -45 -23 -92q-7 -24 -27.5 -38t-44.5 -14q-12 0 -24 3q-31 10 -45 38.5t-4 58.5q23 71 23 143q0 123 -61 227.5t-166 165.5t-228 61q-134 0 -247 -73t-167 -194q108 -28 188 -106q22 -23 22 -55t-22 -54t-54 -22t-55 22 q-75 75 -180 75q-106 0 -181 -74.5t-75 -180.5t75 -180.5t181 -74.5h1046q79 0 134.5 55.5t55.5 133.5zM1798 438q0 -142 -100.5 -242t-242.5 -100h-1046q-169 0 -289 119.5t-120 288.5q0 153 100 267t249 136q62 184 221 298t354 114q235 0 408.5 -158.5t196.5 -389.5 q116 -25 192.5 -118.5t76.5 -214.5zM2048 438q0 -175 -97 -319q-23 -33 -64 -33q-24 0 -43 13q-26 17 -32 48.5t12 57.5q71 104 71 233t-71 233q-18 26 -12 57t32 49t57.5 11.5t49.5 -32.5q97 -142 97 -318zM2304 438q0 -244 -134 -443q-23 -34 -64 -34q-23 0 -42 13 q-26 18 -32.5 49t11.5 57q108 164 108 358q0 195 -108 357q-18 26 -11.5 57.5t32.5 48.5q26 18 57 12t49 -33q134 -198 134 -442z" /> <glyph glyph-name="_610" unicode="" d="M1500 -13q0 -89 -63 -152.5t-153 -63.5t-153.5 63.5t-63.5 152.5q0 90 63.5 153.5t153.5 63.5t153 -63.5t63 -153.5zM1267 268q-115 -15 -192.5 -102.5t-77.5 -205.5q0 -74 33 -138q-146 -78 -379 -78q-109 0 -201 21t-153.5 54.5t-110.5 76.5t-76 85t-44.5 83 t-23.5 66.5t-6 39.5q0 19 4.5 42.5t18.5 56t36.5 58t64 43.5t94.5 18t94 -17.5t63 -41t35.5 -53t17.5 -49t4 -33.5q0 -34 -23 -81q28 -27 82 -42t93 -17l40 -1q115 0 190 51t75 133q0 26 -9 48.5t-31.5 44.5t-49.5 41t-74 44t-93.5 47.5t-119.5 56.5q-28 13 -43 20 q-116 55 -187 100t-122.5 102t-72 125.5t-20.5 162.5q0 78 20.5 150t66 137.5t112.5 114t166.5 77t221.5 28.5q120 0 220 -26t164.5 -67t109.5 -94t64 -105.5t19 -103.5q0 -46 -15 -82.5t-36.5 -58t-48.5 -36t-49 -19.5t-39 -5h-8h-32t-39 5t-44 14t-41 28t-37 46t-24 70.5 t-10 97.5q-15 16 -59 25.5t-81 10.5l-37 1q-68 0 -117.5 -31t-70.5 -70t-21 -76q0 -24 5 -43t24 -46t53 -51t97 -53.5t150 -58.5q76 -25 138.5 -53.5t109 -55.5t83 -59t60.5 -59.5t41 -62.5t26.5 -62t14.5 -63.5t6 -62t1 -62.5z" /> <glyph glyph-name="_611" unicode="" d="M704 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1152 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103 t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="_612" unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273 t73 -273t198 -198t273 -73zM864 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192z" /> <glyph glyph-name="_613" unicode="" d="M1088 352v576q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" /> <glyph glyph-name="_614" unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273 t73 -273t198 -198t273 -73zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h576q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-576z" /> <glyph glyph-name="_615" unicode="" horiz-adv-x="1792" d="M1757 128l35 -313q3 -28 -16 -50q-19 -21 -48 -21h-1664q-29 0 -48 21q-19 22 -16 50l35 313h1722zM1664 967l86 -775h-1708l86 775q3 24 21 40.5t43 16.5h256v-128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128h384v-128q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5v128h256q25 0 43 -16.5t21 -40.5zM1280 1152v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> <glyph glyph-name="_616" unicode="" horiz-adv-x="2048" d="M1920 768q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-15l-115 -662q-8 -46 -44 -76t-82 -30h-1280q-46 0 -82 30t-44 76l-115 662h-15q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5h1792zM485 -32q26 2 43.5 22.5t15.5 46.5l-32 416q-2 26 -22.5 43.5 t-46.5 15.5t-43.5 -22.5t-15.5 -46.5l32 -416q2 -25 20.5 -42t43.5 -17h5zM896 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1280 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1632 27l32 416 q2 26 -15.5 46.5t-43.5 22.5t-46.5 -15.5t-22.5 -43.5l-32 -416q-2 -26 15.5 -46.5t43.5 -22.5h5q25 0 43.5 17t20.5 42zM476 1244l-93 -412h-132l101 441q19 88 89 143.5t160 55.5h167q0 26 19 45t45 19h384q26 0 45 -19t19 -45h167q90 0 160 -55.5t89 -143.5l101 -441 h-132l-93 412q-11 44 -45.5 72t-79.5 28h-167q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45h-167q-45 0 -79.5 -28t-45.5 -72z" /> <glyph glyph-name="_617" unicode="" horiz-adv-x="1792" d="M991 512l64 256h-254l-64 -256h254zM1759 1016l-56 -224q-7 -24 -31 -24h-327l-64 -256h311q15 0 25 -12q10 -14 6 -28l-56 -224q-5 -24 -31 -24h-327l-81 -328q-7 -24 -31 -24h-224q-16 0 -26 12q-9 12 -6 28l78 312h-254l-81 -328q-7 -24 -31 -24h-225q-15 0 -25 12 q-9 12 -6 28l78 312h-311q-15 0 -25 12q-9 12 -6 28l56 224q7 24 31 24h327l64 256h-311q-15 0 -25 12q-10 14 -6 28l56 224q5 24 31 24h327l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h254l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h311 q15 0 25 -12q9 -12 6 -28z" /> <glyph glyph-name="_618" unicode="" d="M841 483l148 -148l-149 -149zM840 1094l149 -149l-148 -148zM710 -130l464 464l-306 306l306 306l-464 464v-611l-255 255l-93 -93l320 -321l-320 -321l93 -93l255 255v-611zM1429 640q0 -209 -32 -365.5t-87.5 -257t-140.5 -162.5t-181.5 -86.5t-219.5 -24.5 t-219.5 24.5t-181.5 86.5t-140.5 162.5t-87.5 257t-32 365.5t32 365.5t87.5 257t140.5 162.5t181.5 86.5t219.5 24.5t219.5 -24.5t181.5 -86.5t140.5 -162.5t87.5 -257t32 -365.5z" /> <glyph glyph-name="_619" unicode="" horiz-adv-x="1024" d="M596 113l173 172l-173 172v-344zM596 823l173 172l-173 172v-344zM628 640l356 -356l-539 -540v711l-297 -296l-108 108l372 373l-372 373l108 108l297 -296v711l539 -540z" /> <glyph glyph-name="_620" unicode="" d="M1280 256q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM512 1024q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5 t112.5 -271.5zM1440 1344q0 -20 -13 -38l-1056 -1408q-19 -26 -51 -26h-160q-26 0 -45 19t-19 45q0 20 13 38l1056 1408q19 26 51 26h160q26 0 45 -19t19 -45zM768 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" /> <glyph glyph-name="_621" unicode="" horiz-adv-x="1792" d="M104 830l792 -1015l-868 630q-18 13 -25 34.5t0 42.5l101 308v0zM566 830h660l-330 -1015v0zM368 1442l198 -612h-462l198 612q8 23 33 23t33 -23zM1688 830l101 -308q7 -21 0 -42.5t-25 -34.5l-868 -630l792 1015v0zM1688 830h-462l198 612q8 23 33 23t33 -23z" /> <glyph glyph-name="_622" unicode="" horiz-adv-x="1792" d="M384 704h160v224h-160v-224zM1221 372v92q-104 -36 -243 -38q-135 -1 -259.5 46.5t-220.5 122.5l1 -96q88 -80 212 -128.5t272 -47.5q129 0 238 49zM640 704h640v224h-640v-224zM1792 736q0 -187 -99 -352q89 -102 89 -229q0 -157 -129.5 -268t-313.5 -111 q-122 0 -225 52.5t-161 140.5q-19 -1 -57 -1t-57 1q-58 -88 -161 -140.5t-225 -52.5q-184 0 -313.5 111t-129.5 268q0 127 89 229q-99 165 -99 352q0 209 120 385.5t326.5 279.5t449.5 103t449.5 -103t326.5 -279.5t120 -385.5z" /> <glyph glyph-name="_623" unicode="" d="M515 625v-128h-252v128h252zM515 880v-127h-252v127h252zM1273 369v-128h-341v128h341zM1273 625v-128h-672v128h672zM1273 880v-127h-672v127h672zM1408 20v1240q0 8 -6 14t-14 6h-32l-378 -256l-210 171l-210 -171l-378 256h-32q-8 0 -14 -6t-6 -14v-1240q0 -8 6 -14 t14 -6h1240q8 0 14 6t6 14zM553 1130l185 150h-406zM983 1130l221 150h-406zM1536 1260v-1240q0 -62 -43 -105t-105 -43h-1240q-62 0 -105 43t-43 105v1240q0 62 43 105t105 43h1240q62 0 105 -43t43 -105z" /> <glyph glyph-name="_624" unicode="" horiz-adv-x="1792" d="M896 720q-104 196 -160 278q-139 202 -347 318q-34 19 -70 36q-89 40 -94 32t34 -38l39 -31q62 -43 112.5 -93.5t94.5 -116.5t70.5 -113t70.5 -131q9 -17 13 -25q44 -84 84 -153t98 -154t115.5 -150t131 -123.5t148.5 -90.5q153 -66 154 -60q1 3 -49 37q-53 36 -81 57 q-77 58 -179 211t-185 310zM549 177q-76 60 -132.5 125t-98 143.5t-71 154.5t-58.5 186t-52 209t-60.5 252t-76.5 289q273 0 497.5 -36t379 -92t271 -144.5t185.5 -172.5t110 -198.5t56 -199.5t12.5 -198.5t-9.5 -173t-20 -143.5t-13 -107l323 -327h-104l-281 285 q-22 -2 -91.5 -14t-121.5 -19t-138 -6t-160.5 17t-167.5 59t-179 111z" /> <glyph glyph-name="_625" unicode="" horiz-adv-x="1792" d="M1374 879q-6 26 -28.5 39.5t-48.5 7.5q-261 -62 -401 -62t-401 62q-26 6 -48.5 -7.5t-28.5 -39.5t7.5 -48.5t39.5 -28.5q194 -46 303 -58q-2 -158 -15.5 -269t-26.5 -155.5t-41 -115.5l-9 -21q-10 -25 1 -49t36 -34q9 -4 23 -4q44 0 60 41l8 20q54 139 71 259h42 q17 -120 71 -259l8 -20q16 -41 60 -41q14 0 23 4q25 10 36 34t1 49l-9 21q-28 71 -41 115.5t-26.5 155.5t-15.5 269q109 12 303 58q26 6 39.5 28.5t7.5 48.5zM1024 1024q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1600 640q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5zM896 1408q-156 0 -298 -61t-245 -164t-164 -245t-61 -298t61 -298 t164 -245t245 -164t298 -61t298 61t245 164t164 245t61 298t-61 298t-164 245t-245 164t-298 61zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> <glyph glyph-name="_626" unicode="" d="M1438 723q34 -35 29 -82l-44 -551q-4 -42 -34.5 -70t-71.5 -28q-6 0 -9 1q-44 3 -72.5 36.5t-25.5 77.5l35 429l-143 -8q55 -113 55 -240q0 -216 -148 -372l-137 137q91 101 91 235q0 145 -102.5 248t-247.5 103q-134 0 -236 -92l-137 138q120 114 284 141l264 300 l-149 87l-181 -161q-33 -30 -77 -27.5t-73 35.5t-26.5 77t34.5 73l239 213q26 23 60 26.5t64 -14.5l488 -283q36 -21 48 -68q17 -67 -26 -117l-205 -232l371 20q49 3 83 -32zM1240 1180q-74 0 -126 52t-52 126t52 126t126 52t126.5 -52t52.5 -126t-52.5 -126t-126.5 -52z M613 -62q106 0 196 61l139 -139q-146 -116 -335 -116q-148 0 -273.5 73t-198.5 198t-73 273q0 188 116 336l139 -139q-60 -88 -60 -197q0 -145 102.5 -247.5t247.5 -102.5z" /> <glyph glyph-name="_627" unicode="" d="M880 336v-160q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h160q14 0 23 -9t9 -23zM1136 832q0 -50 -15 -90t-45.5 -69t-52 -44t-59.5 -36q-32 -18 -46.5 -28t-26 -24t-11.5 -29v-32q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v68q0 35 10.5 64.5 t24 47.5t39 35.5t41 25.5t44.5 21q53 25 75 43t22 49q0 42 -43.5 71.5t-95.5 29.5q-56 0 -95 -27q-29 -20 -80 -83q-9 -12 -25 -12q-11 0 -19 6l-108 82q-10 7 -12 20t5 23q122 192 349 192q129 0 238.5 -89.5t109.5 -214.5zM768 1280q-130 0 -248.5 -51t-204 -136.5 t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5 t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="_628" unicode="" horiz-adv-x="1408" d="M366 1225q-64 0 -110 45.5t-46 110.5q0 64 46 109.5t110 45.5t109.5 -45.5t45.5 -109.5q0 -65 -45.5 -110.5t-109.5 -45.5zM917 583q0 -50 -30 -67.5t-63.5 -6.5t-47.5 34l-367 438q-7 12 -14 15.5t-11 1.5l-3 -3q-7 -8 4 -21l122 -139l1 -354l-161 -457 q-67 -192 -92 -234q-15 -26 -28 -32q-50 -26 -103 -1q-29 13 -41.5 43t-9.5 57q2 17 197 618l5 416l-85 -164l35 -222q4 -24 -1 -42t-14 -27.5t-19 -16t-17 -7.5l-7 -2q-19 -3 -34.5 3t-24 16t-14 22t-7.5 19.5t-2 9.5l-46 299l211 381q23 34 113 34q75 0 107 -40l424 -521 q7 -5 14 -17l3 -3l-1 -1q7 -13 7 -29zM514 433q43 -113 88.5 -225t69.5 -168l24 -55q36 -93 42 -125q11 -70 -36 -97q-35 -22 -66 -16t-51 22t-29 35h-1q-6 16 -8 25l-124 351zM1338 -159q31 -49 31 -57q0 -5 -3 -7q-9 -5 -14.5 0.5t-15.5 26t-16 30.5q-114 172 -423 661 q3 -1 7 1t7 4l3 2q11 9 11 17z" /> <glyph glyph-name="_629" unicode="" horiz-adv-x="2304" d="M504 542h171l-1 265zM1530 641q0 87 -50.5 140t-146.5 53h-54v-388h52q91 0 145 57t54 138zM956 1018l1 -756q0 -14 -9.5 -24t-23.5 -10h-216q-14 0 -23.5 10t-9.5 24v62h-291l-55 -81q-10 -15 -28 -15h-267q-21 0 -30.5 18t3.5 35l556 757q9 14 27 14h332q14 0 24 -10 t10 -24zM1783 641q0 -193 -125.5 -303t-324.5 -110h-270q-14 0 -24 10t-10 24v756q0 14 10 24t24 10h268q200 0 326 -109t126 -302zM1939 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5 t-7.5 60t-20 91.5t-41 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2123 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-45 -108t-74 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5 h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2304 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66 104.5t41 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96 t9.5 -70.5z" /> <glyph glyph-name="uniF2A0" unicode="" horiz-adv-x="1408" d="M617 -153q0 11 -13 58t-31 107t-20 69q-1 4 -5 26.5t-8.5 36t-13.5 21.5q-15 14 -51 14q-23 0 -70 -5.5t-71 -5.5q-34 0 -47 11q-6 5 -11 15.5t-7.5 20t-6.5 24t-5 18.5q-37 128 -37 255t37 255q1 4 5 18.5t6.5 24t7.5 20t11 15.5q13 11 47 11q24 0 71 -5.5t70 -5.5 q36 0 51 14q9 8 13.5 21.5t8.5 36t5 26.5q2 9 20 69t31 107t13 58q0 22 -43.5 52.5t-75.5 42.5q-20 8 -45 8q-34 0 -98 -18q-57 -17 -96.5 -40.5t-71 -66t-46 -70t-45.5 -94.5q-6 -12 -9 -19q-49 -107 -68 -216t-19 -244t19 -244t68 -216q56 -122 83 -161q63 -91 179 -127 l6 -2q64 -18 98 -18q25 0 45 8q32 12 75.5 42.5t43.5 52.5zM776 760q-26 0 -45 19t-19 45.5t19 45.5q37 37 37 90q0 52 -37 91q-19 19 -19 45t19 45t45 19t45 -19q75 -75 75 -181t-75 -181q-21 -19 -45 -19zM957 579q-27 0 -45 19q-19 19 -19 45t19 45q112 114 112 272 t-112 272q-19 19 -19 45t19 45t45 19t45 -19q150 -150 150 -362t-150 -362q-18 -19 -45 -19zM1138 398q-27 0 -45 19q-19 19 -19 45t19 45q90 91 138.5 208t48.5 245t-48.5 245t-138.5 208q-19 19 -19 45t19 45t45 19t45 -19q109 -109 167 -249t58 -294t-58 -294t-167 -249 q-18 -19 -45 -19z" /> <glyph glyph-name="uniF2A1" unicode="" horiz-adv-x="2176" d="M192 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 352 q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 864 q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 1376q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 192q0 -80 -56 -136 t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 1216q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 192q0 -80 -56 -136t-136 -56t-136 56 t-56 136t56 136t136 56t136 -56t56 -136zM1664 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136 t56 136t136 56t136 -56t56 -136zM2176 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z" /> <glyph glyph-name="uniF2A2" unicode="" horiz-adv-x="1792" d="M128 -192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM320 0q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM365 365l256 -256l-90 -90l-256 256zM704 384q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45z M1411 704q0 -59 -11.5 -108.5t-37.5 -93.5t-44 -67.5t-53 -64.5q-31 -35 -45.5 -54t-33.5 -50t-26.5 -64t-7.5 -74q0 -159 -112.5 -271.5t-271.5 -112.5q-26 0 -45 19t-19 45t19 45t45 19q106 0 181 75t75 181q0 57 11.5 105.5t37 91t43.5 66.5t52 63q40 46 59.5 72 t37.5 74.5t18 103.5q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM896 576q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45 t45 19t45 -19t19 -45zM1184 704q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 93 -65.5 158.5t-158.5 65.5q-92 0 -158 -65.5t-66 -158.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 146 103 249t249 103t249 -103t103 -249zM1578 993q10 -25 -1 -49t-36 -34q-9 -4 -23 -4 q-19 0 -35.5 11t-23.5 30q-68 178 -224 295q-21 16 -25 42t12 47q17 21 43 25t47 -12q183 -137 266 -351zM1788 1074q9 -25 -1.5 -49t-35.5 -34q-11 -4 -23 -4q-44 0 -60 41q-92 238 -297 393q-22 16 -25.5 42t12.5 47q16 22 42 25.5t47 -12.5q235 -175 341 -449z" /> <glyph glyph-name="uniF2A3" unicode="" horiz-adv-x="2304" d="M1032 576q-59 2 -84 55q-17 34 -48 53.5t-68 19.5q-53 0 -90.5 -37.5t-37.5 -90.5q0 -56 36 -89l10 -8q34 -31 82 -31q37 0 68 19.5t48 53.5q25 53 84 55zM1600 704q0 56 -36 89l-10 8q-34 31 -82 31q-37 0 -68 -19.5t-48 -53.5q-25 -53 -84 -55q59 -2 84 -55 q17 -34 48 -53.5t68 -19.5q53 0 90.5 37.5t37.5 90.5zM1174 925q-17 -35 -55 -48t-73 4q-62 31 -134 31q-51 0 -99 -17q3 0 9.5 0.5t9.5 0.5q92 0 170.5 -50t118.5 -133q17 -36 3.5 -73.5t-49.5 -54.5q-18 -9 -39 -9q21 0 39 -9q36 -17 49.5 -54.5t-3.5 -73.5 q-40 -83 -118.5 -133t-170.5 -50h-6q-16 2 -44 4l-290 27l-239 -120q-14 -7 -29 -7q-40 0 -57 35l-160 320q-11 23 -4 47.5t29 37.5l209 119l148 267q17 155 91.5 291.5t195.5 236.5q31 25 70.5 21.5t64.5 -34.5t21.5 -70t-34.5 -65q-70 -59 -117 -128q123 84 267 101 q40 5 71.5 -19t35.5 -64q5 -40 -19 -71.5t-64 -35.5q-84 -10 -159 -55q46 10 99 10q115 0 218 -50q36 -18 49 -55.5t-5 -73.5zM2137 1085l160 -320q11 -23 4 -47.5t-29 -37.5l-209 -119l-148 -267q-17 -155 -91.5 -291.5t-195.5 -236.5q-26 -22 -61 -22q-45 0 -74 35 q-25 31 -21.5 70t34.5 65q70 59 117 128q-123 -84 -267 -101q-4 -1 -12 -1q-36 0 -63.5 24t-31.5 60q-5 40 19 71.5t64 35.5q84 10 159 55q-46 -10 -99 -10q-115 0 -218 50q-36 18 -49 55.5t5 73.5q17 35 55 48t73 -4q62 -31 134 -31q51 0 99 17q-3 0 -9.5 -0.5t-9.5 -0.5 q-92 0 -170.5 50t-118.5 133q-17 36 -3.5 73.5t49.5 54.5q18 9 39 9q-21 0 -39 9q-36 17 -49.5 54.5t3.5 73.5q40 83 118.5 133t170.5 50h6h1q14 -2 42 -4l291 -27l239 120q14 7 29 7q40 0 57 -35z" /> <glyph glyph-name="uniF2A4" unicode="" horiz-adv-x="1792" d="M1056 704q0 -26 19 -45t45 -19t45 19t19 45q0 146 -103 249t-249 103t-249 -103t-103 -249q0 -26 19 -45t45 -19t45 19t19 45q0 93 66 158.5t158 65.5t158 -65.5t66 -158.5zM835 1280q-117 0 -223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5q0 -26 19 -45t45 -19t45 19 t19 45q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -55 -18 -103.5t-37.5 -74.5t-59.5 -72q-34 -39 -52 -63t-43.5 -66.5t-37 -91t-11.5 -105.5q0 -106 -75 -181t-181 -75q-26 0 -45 -19t-19 -45t19 -45t45 -19q159 0 271.5 112.5t112.5 271.5q0 41 7.5 74 t26.5 64t33.5 50t45.5 54q35 41 53 64.5t44 67.5t37.5 93.5t11.5 108.5q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5zM591 561l226 -226l-579 -579q-12 -12 -29 -12t-29 12l-168 168q-12 12 -12 29t12 29zM1612 1524l168 -168q12 -12 12 -29t-12 -30l-233 -233 l-26 -25l-71 -71q-66 153 -195 258l91 91l207 207q13 12 30 12t29 -12z" /> <glyph glyph-name="uniF2A5" unicode="" d="M866 1021q0 -27 -13 -94q-11 -50 -31.5 -150t-30.5 -150q-2 -11 -4.5 -12.5t-13.5 -2.5q-20 -2 -31 -2q-58 0 -84 49.5t-26 113.5q0 88 35 174t103 124q28 14 51 14q28 0 36.5 -16.5t8.5 -47.5zM1352 597q0 14 -39 75.5t-52 66.5q-21 8 -34 8q-91 0 -226 -77l-2 2 q3 22 27.5 135t24.5 178q0 233 -242 233q-24 0 -68 -6q-94 -17 -168.5 -89.5t-111.5 -166.5t-37 -189q0 -146 80.5 -225t227.5 -79q25 0 25 -3t-1 -5q-4 -34 -26 -117q-14 -52 -51.5 -101t-82.5 -49q-42 0 -42 47q0 24 10.5 47.5t25 39.5t29.5 28.5t26 20t11 8.5q0 3 -7 10 q-24 22 -58.5 36.5t-65.5 14.5q-35 0 -63.5 -34t-41 -75t-12.5 -75q0 -88 51.5 -142t138.5 -54q82 0 155 53t117.5 126t65.5 153q6 22 15.5 66.5t14.5 66.5q3 12 14 18q118 60 227 60q48 0 127 -18q1 -1 4 -1q5 0 9.5 4.5t4.5 8.5zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="uniF2A6" unicode="" horiz-adv-x="1535" d="M744 1231q0 24 -2 38.5t-8.5 30t-21 23t-37.5 7.5q-39 0 -78 -23q-105 -58 -159 -190.5t-54 -269.5q0 -44 8.5 -85.5t26.5 -80.5t52.5 -62.5t81.5 -23.5q4 0 18 -0.5t20 0t16 3t15 8.5t7 16q16 77 48 231.5t48 231.5q19 91 19 146zM1498 575q0 -7 -7.5 -13.5t-15.5 -6.5 l-6 1q-22 3 -62 11t-72 12.5t-63 4.5q-167 0 -351 -93q-15 -8 -21 -27q-10 -36 -24.5 -105.5t-22.5 -100.5q-23 -91 -70 -179.5t-112.5 -164.5t-154.5 -123t-185 -47q-135 0 -214.5 83.5t-79.5 219.5q0 53 19.5 117t63 116.5t97.5 52.5q38 0 120 -33.5t83 -61.5 q0 -1 -16.5 -12.5t-39.5 -31t-46 -44.5t-39 -61t-16 -74q0 -33 16.5 -53t48.5 -20q45 0 85 31.5t66.5 78t48 105.5t32.5 107t16 90v9q0 2 -3.5 3.5t-8.5 1.5h-10t-10 -0.5t-6 -0.5q-227 0 -352 122.5t-125 348.5q0 108 34.5 221t96 210t156 167.5t204.5 89.5q52 9 106 9 q374 0 374 -360q0 -98 -38 -273t-43 -211l3 -3q101 57 182.5 88t167.5 31q22 0 53 -13q19 -7 80 -102.5t61 -116.5z" /> <glyph glyph-name="uniF2A7" unicode="" horiz-adv-x="1664" d="M831 863q32 0 59 -18l222 -148q61 -40 110 -97l146 -170q40 -46 29 -106l-72 -413q-6 -32 -29.5 -53.5t-55.5 -25.5l-527 -56l-352 -32h-9q-39 0 -67.5 28t-28.5 68q0 37 27 64t65 32l260 32h-448q-41 0 -69.5 30t-26.5 71q2 39 32 65t69 26l442 1l-521 64q-41 5 -66 37 t-19 73q6 35 34.5 57.5t65.5 22.5h10l481 -60l-351 94q-38 10 -62 41.5t-18 68.5q6 36 33 58.5t62 22.5q6 0 20 -2l448 -96l217 -37q1 0 3 -0.5t3 -0.5q23 0 30.5 23t-12.5 36l-186 125q-35 23 -42 63.5t18 73.5q27 38 76 38zM761 661l186 -125l-218 37l-5 2l-36 38 l-238 262q-1 1 -2.5 3.5t-2.5 3.5q-24 31 -18.5 70t37.5 64q31 23 68 17.5t64 -33.5l142 -147q-2 -1 -5 -3.5t-4 -4.5q-32 -45 -23 -99t55 -85zM1648 1115l15 -266q4 -73 -11 -147l-48 -219q-12 -59 -67 -87l-106 -54q2 62 -39 109l-146 170q-53 61 -117 103l-222 148 q-34 23 -76 23q-51 0 -88 -37l-235 312q-25 33 -18 73.5t41 63.5q33 22 71.5 14t62.5 -40l266 -352l-262 455q-21 35 -10.5 75t47.5 59q35 18 72.5 6t57.5 -46l241 -420l-136 337q-15 35 -4.5 74t44.5 56q37 19 76 6t56 -51l193 -415l101 -196q8 -15 23 -17.5t27 7.5t11 26 l-12 224q-2 41 26 71t69 31q39 0 67 -28.5t30 -67.5z" /> <glyph glyph-name="uniF2A8" unicode="" horiz-adv-x="1792" d="M335 180q-2 0 -6 2q-86 57 -168.5 145t-139.5 180q-21 30 -21 69q0 9 2 19t4 18t7 18t8.5 16t10.5 17t10 15t12 15.5t11 14.5q184 251 452 365q-110 198 -110 211q0 19 17 29q116 64 128 64q18 0 28 -16l124 -229q92 19 192 19q266 0 497.5 -137.5t378.5 -369.5 q20 -31 20 -69t-20 -69q-91 -142 -218.5 -253.5t-278.5 -175.5q110 -198 110 -211q0 -20 -17 -29q-116 -64 -127 -64q-19 0 -29 16l-124 229l-64 119l-444 820l7 7q-58 -24 -99 -47q3 -5 127 -234t243 -449t119 -223q0 -7 -9 -9q-13 -3 -72 -3q-57 0 -60 7l-456 841 q-39 -28 -82 -68q24 -43 214 -393.5t190 -354.5q0 -10 -11 -10q-14 0 -82.5 22t-72.5 28l-106 197l-224 413q-44 -53 -78 -106q2 -3 18 -25t23 -34l176 -327q0 -10 -10 -10zM1165 282l49 -91q273 111 450 385q-180 277 -459 389q67 -64 103 -148.5t36 -176.5 q0 -106 -47 -200.5t-132 -157.5zM848 896q0 -20 14 -34t34 -14q86 0 147 -61t61 -147q0 -20 14 -34t34 -14t34 14t14 34q0 126 -89 215t-215 89q-20 0 -34 -14t-14 -34zM1214 961l-9 4l7 -7z" /> <glyph glyph-name="uniF2A9" unicode="" horiz-adv-x="1280" d="M1050 430q0 -215 -147 -374q-148 -161 -378 -161q-232 0 -378 161q-147 159 -147 374q0 147 68 270.5t189 196.5t268 73q96 0 182 -31q-32 -62 -39 -126q-66 28 -143 28q-167 0 -280.5 -123t-113.5 -291q0 -170 112.5 -288.5t281.5 -118.5t281 118.5t112 288.5 q0 89 -32 166q66 13 123 49q41 -98 41 -212zM846 619q0 -192 -79.5 -345t-238.5 -253l-14 -1q-29 0 -62 5q83 32 146.5 102.5t99.5 154.5t58.5 189t30 192.5t7.5 178.5q0 69 -3 103q55 -160 55 -326zM791 947v-2q-73 214 -206 440q88 -59 142.5 -186.5t63.5 -251.5z M1035 744q-83 0 -160 75q218 120 290 247q19 37 21 56q-42 -94 -139.5 -166.5t-204.5 -97.5q-35 54 -35 113q0 37 17 79t43 68q46 44 157 74q59 16 106 58.5t74 100.5q74 -105 74 -253q0 -109 -24 -170q-32 -77 -88.5 -130.5t-130.5 -53.5z" /> <glyph glyph-name="uniF2AA" unicode="" d="M1050 495q0 78 -28 147q-41 -25 -85 -34q22 -50 22 -114q0 -117 -77 -198.5t-193 -81.5t-193.5 81.5t-77.5 198.5q0 115 78 199.5t193 84.5q53 0 98 -19q4 43 27 87q-60 21 -125 21q-154 0 -257.5 -108.5t-103.5 -263.5t103.5 -261t257.5 -106t257.5 106.5t103.5 260.5z M872 850q2 -24 2 -71q0 -63 -5 -123t-20.5 -132.5t-40.5 -130t-68.5 -106t-100.5 -70.5q21 -3 42 -3h10q219 139 219 411q0 116 -38 225zM872 850q-4 80 -44 171.5t-98 130.5q92 -156 142 -302zM1207 955q0 102 -51 174q-41 -86 -124 -109q-69 -19 -109 -53.5t-40 -99.5 q0 -40 24 -77q74 17 140.5 67t95.5 115q-4 -52 -74.5 -111.5t-138.5 -97.5q52 -52 110 -52q51 0 90 37t60 90q17 42 17 117zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" /> <glyph glyph-name="uniF2AB" unicode="" d="M1279 388q0 22 -22 27q-67 15 -118 59t-80 108q-7 19 -7 25q0 15 19.5 26t43 17t43 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-12 0 -32 -8t-31 -8q-4 0 -12 2q5 95 5 114q0 79 -17 114q-36 78 -103 121.5t-152 43.5q-199 0 -275 -165q-17 -35 -17 -114q0 -19 5 -114 q-4 -2 -14 -2q-12 0 -32 7.5t-30 7.5q-21 0 -38.5 -12t-17.5 -32q0 -21 19.5 -35.5t43 -20.5t43 -17t19.5 -26q0 -6 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -46 137 -68q2 -5 6 -26t11.5 -30.5t23.5 -9.5q12 0 37.5 4.5t39.5 4.5q35 0 67 -15t54 -32.5t57.5 -32.5 t76.5 -15q43 0 79 15t57.5 32.5t53.5 32.5t67 15q14 0 39.5 -4t38.5 -4q16 0 23 10t11 30t6 25q137 22 137 68zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" /> <glyph glyph-name="uniF2AC" unicode="" horiz-adv-x="1664" d="M848 1408q134 1 240.5 -68.5t163.5 -192.5q27 -58 27 -179q0 -47 -9 -191q14 -7 28 -7q18 0 51 13.5t51 13.5q29 0 56 -18t27 -46q0 -32 -31.5 -54t-69 -31.5t-69 -29t-31.5 -47.5q0 -15 12 -43q37 -82 102.5 -150t144.5 -101q28 -12 80 -23q28 -6 28 -35 q0 -70 -219 -103q-7 -11 -11 -39t-14 -46.5t-33 -18.5q-20 0 -62 6.5t-64 6.5q-37 0 -62 -5q-32 -5 -63 -22.5t-58 -38t-58 -40.5t-76 -33.5t-99 -13.5q-52 0 -96.5 13.5t-75 33.5t-57.5 40.5t-58 38t-62 22.5q-26 5 -63 5q-24 0 -65.5 -7.5t-58.5 -7.5q-25 0 -35 18.5 t-14 47.5t-11 40q-219 33 -219 103q0 29 28 35q52 11 80 23q78 32 144.5 101t102.5 150q12 28 12 43q0 28 -31.5 47.5t-69.5 29.5t-69.5 31.5t-31.5 52.5q0 27 26 45.5t55 18.5q15 0 48 -13t53 -13q18 0 32 7q-9 142 -9 190q0 122 27 180q64 137 172 198t264 63z" /> <glyph glyph-name="uniF2AD" unicode="" d="M1280 388q0 22 -22 27q-67 14 -118 58t-80 109q-7 14 -7 25q0 15 19.5 26t42.5 17t42.5 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-11 0 -31 -8t-32 -8q-4 0 -12 2q5 63 5 115q0 78 -17 114q-36 78 -102.5 121.5t-152.5 43.5q-198 0 -275 -165q-18 -38 -18 -115 q0 -38 6 -114q-10 -2 -15 -2q-11 0 -31.5 8t-30.5 8q-20 0 -37.5 -12.5t-17.5 -32.5q0 -21 19.5 -35.5t42.5 -20.5t42.5 -17t19.5 -26q0 -11 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -47 138 -69q2 -5 6 -26t11 -30.5t23 -9.5q13 0 38.5 5t38.5 5q35 0 67.5 -15 t54.5 -32.5t57.5 -32.5t76.5 -15q43 0 79 15t57.5 32.5t54 32.5t67.5 15q13 0 39 -4.5t39 -4.5q15 0 22.5 9.5t11.5 31t5 24.5q138 22 138 69zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" /> <glyph glyph-name="uniF2AE" unicode="" horiz-adv-x="2304" d="M2304 1536q-69 -46 -125 -92t-89 -81t-59.5 -71.5t-37.5 -57.5t-22 -44.5t-14 -29.5q-10 -18 -35.5 -136.5t-48.5 -164.5q-15 -29 -50 -60.5t-67.5 -50.5t-72.5 -41t-48 -28q-47 -31 -151 -231q-341 14 -630 -158q-92 -53 -303 -179q47 16 86 31t55 22l15 7 q71 27 163 64.5t133.5 53.5t108 34.5t142.5 31.5q186 31 465 -7q1 0 10 -3q11 -6 14 -17t-3 -22l-194 -345q-15 -29 -47 -22q-128 24 -354 24q-146 0 -402 -44.5t-392 -46.5q-82 -1 -149 13t-107 37t-61 40t-33 34l-1 1v2q0 6 6 6q138 0 371 55q192 366 374.5 524t383.5 158 q5 0 14.5 -0.5t38 -5t55 -12t61.5 -24.5t63 -39.5t54 -59t40 -82.5l102 177q2 4 21 42.5t44.5 86.5t61 109.5t84 133.5t100.5 137q66 82 128 141.5t121.5 96.5t92.5 53.5t88 39.5z" /> <glyph glyph-name="uniF2B0" unicode="" d="M1322 640q0 -45 -5 -76l-236 14l224 -78q-19 -73 -58 -141l-214 103l177 -158q-44 -61 -107 -108l-157 178l103 -215q-61 -37 -140 -59l-79 228l14 -240q-38 -6 -76 -6t-76 6l14 238l-78 -226q-74 19 -140 59l103 215l-157 -178q-59 43 -108 108l178 158l-214 -104 q-39 69 -58 141l224 79l-237 -14q-5 42 -5 76q0 35 5 77l238 -14l-225 79q19 73 58 140l214 -104l-177 159q46 61 107 108l158 -178l-103 215q67 39 140 58l77 -224l-13 236q36 6 75 6q38 0 76 -6l-14 -237l78 225q74 -19 140 -59l-103 -214l158 178q61 -47 107 -108 l-177 -159l213 104q37 -62 58 -141l-224 -78l237 14q5 -31 5 -77zM1352 640q0 160 -78.5 295.5t-213 214t-292.5 78.5q-119 0 -227 -46.5t-186.5 -125t-124.5 -187.5t-46 -229q0 -119 46 -228t124.5 -187.5t186.5 -125t227 -46.5q158 0 292.5 78.5t213 214t78.5 294.5z M1425 1023v-766l-657 -383l-657 383v766l657 383zM768 -183l708 412v823l-708 411l-708 -411v-823zM1536 1088v-896l-768 -448l-768 448v896l768 448z" /> <glyph glyph-name="uniF2B1" unicode="" horiz-adv-x="1664" d="M339 1318h691l-26 -72h-665q-110 0 -188.5 -79t-78.5 -189v-771q0 -95 60.5 -169.5t153.5 -93.5q23 -5 98 -5v-72h-45q-140 0 -239.5 100t-99.5 240v771q0 140 99.5 240t239.5 100zM1190 1536h247l-482 -1294q-23 -61 -40.5 -103.5t-45 -98t-54 -93.5t-64.5 -78.5 t-79.5 -65t-95.5 -41t-116 -18.5v195q163 26 220 182q20 52 20 105q0 54 -20 106l-285 733h228l187 -585zM1664 978v-1111h-795q37 55 45 73h678v1038q0 85 -49.5 155t-129.5 99l25 67q101 -34 163.5 -123.5t62.5 -197.5z" /> <glyph glyph-name="uniF2B2" unicode="" horiz-adv-x="1792" d="M852 1227q0 -29 -17 -52.5t-45 -23.5t-45 23.5t-17 52.5t17 52.5t45 23.5t45 -23.5t17 -52.5zM688 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50 -21.5t-20 -51.5v-114q0 -30 20.5 -52t49.5 -22q30 0 50.5 22t20.5 52zM860 -149v114q0 30 -20 51.5t-50 21.5t-50.5 -21.5 t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22q29 0 49.5 22t20.5 52zM1034 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1208 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114 q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1476 535q-84 -160 -232 -259.5t-323 -99.5q-123 0 -229.5 51.5t-178.5 137t-113 197.5t-41 232q0 88 21 174q-104 -175 -104 -390q0 -162 65 -312t185 -251q30 57 91 57q56 0 86 -50q32 50 87 50q56 0 86 -50q32 50 87 50t87 -50 q30 50 86 50q28 0 52.5 -15.5t37.5 -40.5q112 94 177 231.5t73 287.5zM1326 564q0 75 -72 75q-17 0 -47 -6q-95 -19 -149 -19q-226 0 -226 243q0 86 30 204q-83 -127 -83 -275q0 -150 89 -260.5t235 -110.5q111 0 210 70q13 48 13 79zM884 1223q0 50 -32 89.5t-81 39.5 t-81 -39.5t-32 -89.5q0 -51 31.5 -90.5t81.5 -39.5t81.5 39.5t31.5 90.5zM1513 884q0 96 -37.5 179t-113 137t-173.5 54q-77 0 -149 -35t-127 -94q-48 -159 -48 -268q0 -104 45.5 -157t147.5 -53q53 0 142 19q36 6 53 6q51 0 77.5 -28t26.5 -80q0 -26 -4 -46 q75 68 117.5 165.5t42.5 200.5zM1792 667q0 -111 -33.5 -249.5t-93.5 -204.5q-58 -64 -195 -142.5t-228 -104.5l-4 -1v-114q0 -43 -29.5 -75t-72.5 -32q-56 0 -86 50q-32 -50 -87 -50t-87 50q-30 -50 -86 -50q-55 0 -87 50q-30 -50 -86 -50q-47 0 -75 33.5t-28 81.5 q-90 -68 -198 -68q-118 0 -211 80q54 1 106 20q-113 31 -182 127q32 -7 71 -7q89 0 164 46q-192 192 -240 306q-24 56 -24 160q0 57 9 125.5t31.5 146.5t55 141t86.5 105t120 42q59 0 81 -52q19 29 42 54q2 3 12 13t13 16q10 15 23 38t25 42t28 39q87 111 211.5 177 t260.5 66q35 0 62 -4q59 64 146 64q83 0 140 -57q5 -5 5 -12q0 -5 -6 -13.5t-12.5 -16t-16 -17l-10.5 -10.5q17 -6 36 -18t19 -24q0 -6 -16 -25q157 -138 197 -378q25 30 60 30q45 0 100 -49q90 -80 90 -279z" /> <glyph glyph-name="uniF2B3" unicode="" d="M917 631q0 33 -6 64h-362v-132h217q-12 -76 -74.5 -120.5t-142.5 -44.5q-99 0 -169 71.5t-70 170.5t70 170.5t169 71.5q93 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585h109v110 h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph glyph-name="uniF2B4" unicode="" d="M1536 1024v-839q0 -48 -49 -62q-174 -52 -338 -52q-73 0 -215.5 29.5t-227.5 29.5q-164 0 -370 -48v-338h-160v1368q-63 25 -101 81t-38 124q0 91 64 155t155 64t155 -64t64 -155q0 -68 -38 -124t-101 -81v-68q190 44 343 44q99 0 198 -15q14 -2 111.5 -22.5t149.5 -20.5 q77 0 165 18q11 2 80 21t89 19q26 0 45 -19t19 -45z" /> <glyph glyph-name="uniF2B5" unicode="" horiz-adv-x="2304" d="M192 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32zM1665 442q-10 13 -38.5 50t-41.5 54t-38 49t-42.5 53t-40.5 47t-45 49l-125 -140q-83 -94 -208.5 -92t-205.5 98q-57 69 -56.5 158t58.5 157l177 206q-22 11 -51 16.5t-47.5 6t-56.5 -0.5t-49 -1q-92 0 -158 -66 l-158 -158h-155v-544q5 0 21 0.5t22 0t19.5 -2t20.5 -4.5t17.5 -8.5t18.5 -13.5l297 -292q115 -111 227 -111q78 0 125 47q57 -20 112.5 8t72.5 85q74 -6 127 44q20 18 36 45.5t14 50.5q10 -10 43 -10q43 0 77 21t49.5 53t12 71.5t-30.5 73.5zM1824 384h96v512h-93l-157 180 q-66 76 -169 76h-167q-89 0 -146 -67l-209 -243q-28 -33 -28 -75t27 -75q43 -51 110 -52t111 49l193 218q25 23 53.5 21.5t47 -27t8.5 -56.5q16 -19 56 -63t60 -68q29 -36 82.5 -105.5t64.5 -84.5q52 -66 60 -140zM2112 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32z M2304 960v-640q0 -26 -19 -45t-45 -19h-434q-27 -65 -82 -106.5t-125 -51.5q-33 -48 -80.5 -81.5t-102.5 -45.5q-42 -53 -104.5 -81.5t-128.5 -24.5q-60 -34 -126 -39.5t-127.5 14t-117 53.5t-103.5 81l-287 282h-358q-26 0 -45 19t-19 45v672q0 26 19 45t45 19h421 q14 14 47 48t47.5 48t44 40t50.5 37.5t51 25.5t62 19.5t68 5.5h117q99 0 181 -56q82 56 181 56h167q35 0 67 -6t56.5 -14.5t51.5 -26.5t44.5 -31t43 -39.5t39 -42t41 -48t41.5 -48.5h355q26 0 45 -19t19 -45z" /> <glyph glyph-name="uniF2B6" unicode="" horiz-adv-x="1792" d="M1792 882v-978q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v978q0 15 11 24q8 7 39 34.5t41.5 36t45.5 37.5t70 55.5t96 73t143.5 107t192.5 140.5q5 4 52.5 40t71.5 52.5t64 35t69 18.5t69 -18.5t65 -35.5t71 -52t52 -40q110 -80 192.5 -140.5t143.5 -107 t96 -73t70 -55.5t45.5 -37.5t41.5 -36t39 -34.5q11 -9 11 -24zM1228 297q263 191 345 252q11 8 12.5 20.5t-6.5 23.5l-38 52q-8 11 -21 12.5t-24 -6.5q-231 -169 -343 -250q-5 -3 -52 -39t-71.5 -52.5t-64.5 -35t-69 -18.5t-69 18.5t-64.5 35t-71.5 52.5t-52 39 q-186 134 -343 250q-11 8 -24 6.5t-21 -12.5l-38 -52q-8 -11 -6.5 -23.5t12.5 -20.5q82 -61 345 -252q10 -8 50 -38t65 -47t64 -39.5t77.5 -33.5t75.5 -11t75.5 11t79 34.5t64.5 39.5t65 47.5t48 36.5z" /> <glyph glyph-name="uniF2B7" unicode="" horiz-adv-x="1792" d="M1474 623l39 -51q8 -11 6.5 -23.5t-11.5 -20.5q-43 -34 -126.5 -98.5t-146.5 -113t-67 -51.5q-39 -32 -60 -48t-60.5 -41t-76.5 -36.5t-74 -11.5h-1h-1q-37 0 -74 11.5t-76 36.5t-61 41.5t-60 47.5q-5 4 -65 50.5t-143.5 111t-122.5 94.5q-11 8 -12.5 20.5t6.5 23.5 l37 52q8 11 21.5 13t24.5 -7q94 -73 306 -236q5 -4 43.5 -35t60.5 -46.5t56.5 -32.5t58.5 -17h1h1q24 0 58.5 17t56.5 32.5t60.5 46.5t43.5 35q258 198 313 242q11 8 24 6.5t21 -12.5zM1664 -96v928q-90 83 -159 139q-91 74 -389 304q-3 2 -43 35t-61 48t-56 32.5t-59 17.5 h-1h-1q-24 0 -59 -17.5t-56 -32.5t-61 -48t-43 -35q-215 -166 -315.5 -245.5t-129.5 -104t-82 -74.5q-14 -12 -21 -19v-928q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 832v-928q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v928q0 56 41 94 q123 114 350 290.5t233 181.5q36 30 59 47.5t61.5 42t76 36.5t74.5 12h1h1q37 0 74.5 -12t76 -36.5t61.5 -42t59 -47.5q43 -36 156 -122t226 -177t201 -173q41 -38 41 -94z" /> <glyph glyph-name="uniF2B8" unicode="" d="M330 1l202 -214l-34 236l-216 213zM556 -225l274 218l-11 245l-300 -215zM245 413l227 -213l-48 327l-245 204zM495 189l317 214l-14 324l-352 -200zM843 178l95 -80l-2 239l-103 79q0 -1 1 -8.5t0 -12t-5 -7.5l-78 -52l85 -70q7 -6 7 -88zM138 930l256 -200l-68 465 l-279 173zM1173 267l15 234l-230 -164l2 -240zM417 722l373 194l-19 441l-423 -163zM1270 357l20 233l-226 142l-2 -105l144 -95q6 -4 4 -9l-7 -119zM1461 496l30 222l-179 -128l-20 -228zM1273 329l-71 49l-8 -117q0 -5 -4 -8l-234 -187q-7 -5 -14 0l-98 83l7 -161 q0 -5 -4 -8l-293 -234q-4 -2 -6 -2q-8 2 -8 3l-228 242q-4 4 -59 277q-2 7 5 11l61 37q-94 86 -95 92l-72 351q-2 7 6 12l94 45q-133 100 -135 108l-96 466q-2 10 7 13l433 135q5 0 8 -1l317 -153q6 -4 6 -9l20 -463q0 -7 -6 -10l-118 -61l126 -85q5 -2 5 -8l5 -123l121 74 q5 4 11 0l84 -56l3 110q0 6 5 9l206 126q6 3 11 0l245 -135q4 -4 5 -7t-6.5 -60t-17.5 -124.5t-10 -70.5q0 -5 -4 -7l-191 -153q-6 -5 -13 0z" /> <glyph glyph-name="uniF2B9" unicode="" horiz-adv-x="1664" d="M1201 298q0 57 -5.5 107t-21 100.5t-39.5 86t-64 58t-91 22.5q-6 -4 -33.5 -20.5t-42.5 -24.5t-40.5 -20t-49 -17t-46.5 -5t-46.5 5t-49 17t-40.5 20t-42.5 24.5t-33.5 20.5q-51 0 -91 -22.5t-64 -58t-39.5 -86t-21 -100.5t-5.5 -107q0 -73 42 -121.5t103 -48.5h576 q61 0 103 48.5t42 121.5zM1028 892q0 108 -76.5 184t-183.5 76t-183.5 -76t-76.5 -184q0 -107 76.5 -183t183.5 -76t183.5 76t76.5 183zM1664 352v-192q0 -14 -9 -23t-23 -9h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216 q66 0 113 -47t47 -113v-224h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23z" /> <glyph glyph-name="uniF2BA" unicode="" horiz-adv-x="1664" d="M1028 892q0 -107 -76.5 -183t-183.5 -76t-183.5 76t-76.5 183q0 108 76.5 184t183.5 76t183.5 -76t76.5 -184zM980 672q46 0 82.5 -17t60 -47.5t39.5 -67t24 -81t11.5 -82.5t3.5 -79q0 -67 -39.5 -118.5t-105.5 -51.5h-576q-66 0 -105.5 51.5t-39.5 118.5q0 48 4.5 93.5 t18.5 98.5t36.5 91.5t63 64.5t93.5 26h5q7 -4 32 -19.5t35.5 -21t33 -17t37 -16t35 -9t39.5 -4.5t39.5 4.5t35 9t37 16t33 17t35.5 21t32 19.5zM1664 928q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96 q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216q66 0 113 -47t47 -113v-224h96q13 0 22.5 -9.5t9.5 -22.5v-192zM1408 -96v1472q0 13 -9.5 22.5t-22.5 9.5h-1216 q-13 0 -22.5 -9.5t-9.5 -22.5v-1472q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5z" /> <glyph glyph-name="uniF2BB" unicode="" horiz-adv-x="2048" d="M1024 405q0 64 -9 117.5t-29.5 103t-60.5 78t-97 28.5q-6 -4 -30 -18t-37.5 -21.5t-35.5 -17.5t-43 -14.5t-42 -4.5t-42 4.5t-43 14.5t-35.5 17.5t-37.5 21.5t-30 18q-57 0 -97 -28.5t-60.5 -78t-29.5 -103t-9 -117.5t37 -106.5t91 -42.5h512q54 0 91 42.5t37 106.5z M867 925q0 94 -66.5 160.5t-160.5 66.5t-160.5 -66.5t-66.5 -160.5t66.5 -160.5t160.5 -66.5t160.5 66.5t66.5 160.5zM1792 416v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1792 676v56q0 15 -10.5 25.5t-25.5 10.5h-568 q-15 0 -25.5 -10.5t-10.5 -25.5v-56q0 -15 10.5 -25.5t25.5 -10.5h568q15 0 25.5 10.5t10.5 25.5zM1792 928v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-352v96q0 14 -9 23t-23 9 h-64q-14 0 -23 -9t-9 -23v-96h-768v96q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-96h-352q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> <glyph glyph-name="uniF2BC" unicode="" horiz-adv-x="2048" d="M1024 405q0 -64 -37 -106.5t-91 -42.5h-512q-54 0 -91 42.5t-37 106.5t9 117.5t29.5 103t60.5 78t97 28.5q6 -4 30 -18t37.5 -21.5t35.5 -17.5t43 -14.5t42 -4.5t42 4.5t43 14.5t35.5 17.5t37.5 21.5t30 18q57 0 97 -28.5t60.5 -78t29.5 -103t9 -117.5zM867 925 q0 -94 -66.5 -160.5t-160.5 -66.5t-160.5 66.5t-66.5 160.5t66.5 160.5t160.5 66.5t160.5 -66.5t66.5 -160.5zM1792 480v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1792 732v-56q0 -15 -10.5 -25.5t-25.5 -10.5h-568 q-15 0 -25.5 10.5t-10.5 25.5v56q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5zM1792 992v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1920 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1728q-13 0 -22.5 -9.5 t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h352v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h768v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h352q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113 t113 47h1728q66 0 113 -47t47 -113z" /> <glyph glyph-name="uniF2BD" unicode="" horiz-adv-x="1792" d="M1523 197q-22 155 -87.5 257.5t-184.5 118.5q-67 -74 -159.5 -115.5t-195.5 -41.5t-195.5 41.5t-159.5 115.5q-119 -16 -184.5 -118.5t-87.5 -257.5q106 -150 271 -237.5t356 -87.5t356 87.5t271 237.5zM1280 896q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5 t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1792 640q0 -182 -71 -347.5t-190.5 -286t-285.5 -191.5t-349 -71q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> <glyph glyph-name="uniF2BE" unicode="" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348q0 -181 -70.5 -347t-190.5 -286t-286 -191.5t-349 -71.5t-349 71t-285.5 191.5t-190.5 286t-71 347.5t71 348t191 286t286 191t348 71zM1515 185q149 205 149 455q0 156 -61 298t-164 245t-245 164t-298 61t-298 -61 t-245 -164t-164 -245t-61 -298q0 -250 149 -455q66 327 306 327q131 -128 313 -128t313 128q240 0 306 -327zM1280 832q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5z" /> <glyph glyph-name="uniF2C0" unicode="" d="M1201 752q47 -14 89.5 -38t89 -73t79.5 -115.5t55 -172t22 -236.5q0 -154 -100 -263.5t-241 -109.5h-854q-141 0 -241 109.5t-100 263.5q0 131 22 236.5t55 172t79.5 115.5t89 73t89.5 38q-79 125 -79 272q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5 t198.5 -40.5t163.5 -109.5t109.5 -163.5t40.5 -198.5q0 -147 -79 -272zM768 1408q-159 0 -271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5zM1195 -128q88 0 150.5 71.5t62.5 173.5q0 239 -78.5 377t-225.5 145 q-145 -127 -336 -127t-336 127q-147 -7 -225.5 -145t-78.5 -377q0 -102 62.5 -173.5t150.5 -71.5h854z" /> <glyph glyph-name="uniF2C1" unicode="" horiz-adv-x="1280" d="M1024 278q0 -64 -37 -107t-91 -43h-512q-54 0 -91 43t-37 107t9 118t29.5 104t61 78.5t96.5 28.5q80 -75 188 -75t188 75q56 0 96.5 -28.5t61 -78.5t29.5 -104t9 -118zM870 797q0 -94 -67.5 -160.5t-162.5 -66.5t-162.5 66.5t-67.5 160.5t67.5 160.5t162.5 66.5 t162.5 -66.5t67.5 -160.5zM1152 -96v1376h-1024v-1376q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1280 1376v-1472q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h352v-96q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v96h352 q66 0 113 -47t47 -113z" /> <glyph glyph-name="uniF2C2" unicode="" horiz-adv-x="2048" d="M896 324q0 54 -7.5 100.5t-24.5 90t-51 68.5t-81 25q-64 -64 -156 -64t-156 64q-47 0 -81 -25t-51 -68.5t-24.5 -90t-7.5 -100.5q0 -55 31.5 -93.5t75.5 -38.5h426q44 0 75.5 38.5t31.5 93.5zM768 768q0 80 -56 136t-136 56t-136 -56t-56 -136t56 -136t136 -56t136 56 t56 136zM1792 288v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1408 544v64q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1792 544v64q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23 v-64q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1792 800v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM128 1152h1792v96q0 14 -9 23t-23 9h-1728q-14 0 -23 -9t-9 -23v-96zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728 q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> <glyph glyph-name="uniF2C3" unicode="" horiz-adv-x="2048" d="M896 324q0 -55 -31.5 -93.5t-75.5 -38.5h-426q-44 0 -75.5 38.5t-31.5 93.5q0 54 7.5 100.5t24.5 90t51 68.5t81 25q64 -64 156 -64t156 64q47 0 81 -25t51 -68.5t24.5 -90t7.5 -100.5zM768 768q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z M1792 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1408 608v-64q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h320q14 0 23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v64 q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 864v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1920 32v1120h-1792v-1120q0 -13 9.5 -22.5t22.5 -9.5h1728q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47 h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> <glyph glyph-name="uniF2C4" unicode="" horiz-adv-x="1792" d="M1255 749q0 318 -105 474.5t-330 156.5q-222 0 -326 -157t-104 -474q0 -316 104 -471.5t326 -155.5q74 0 131 17q-22 43 -39 73t-44 65t-53.5 56.5t-63 36t-77.5 14.5q-46 0 -79 -16l-49 97q105 91 276 91q132 0 215.5 -54t150.5 -155q67 149 67 402zM1645 117h117 q3 -27 -2 -67t-26.5 -95t-58 -100.5t-107 -78t-162.5 -32.5q-71 0 -130.5 19t-105.5 56t-79 78t-66 96q-97 -27 -205 -27q-150 0 -292.5 58t-253 158.5t-178 249t-67.5 317.5q0 170 67.5 319.5t178.5 250.5t253.5 159t291.5 58q121 0 238.5 -36t217 -106t176 -164.5 t119.5 -219t43 -261.5q0 -190 -80.5 -347.5t-218.5 -264.5q47 -70 93.5 -106.5t104.5 -36.5q61 0 94 37.5t38 85.5z" /> <glyph glyph-name="uniF2C5" unicode="" horiz-adv-x="2304" d="M453 -101q0 -21 -16 -37.5t-37 -16.5q-1 0 -13 3q-63 15 -162 140q-225 284 -225 676q0 341 213 614q39 51 95 103.5t94 52.5q19 0 35 -13.5t16 -32.5q0 -27 -63 -90q-98 -102 -147 -184q-119 -199 -119 -449q0 -281 123 -491q50 -85 136 -173q2 -3 14.5 -16t19.5 -21 t17 -20.5t14.5 -23.5t4.5 -21zM1796 33q0 -29 -17.5 -48.5t-46.5 -19.5h-1081q-26 0 -45 19t-19 45q0 29 17.5 48.5t46.5 19.5h1081q26 0 45 -19t19 -45zM1581 644q0 -134 -67 -233q-25 -38 -69.5 -78.5t-83.5 -60.5q-16 -10 -27 -10q-7 0 -15 6t-8 12q0 9 19 30t42 46 t42 67.5t19 88.5q0 76 -35 130q-29 42 -46 42q-3 0 -3 -5q0 -12 7.5 -35.5t7.5 -36.5q0 -22 -21.5 -35t-44.5 -13q-66 0 -66 76q0 15 1.5 44t1.5 44q0 25 -10 46q-13 25 -42 53.5t-51 28.5q-5 0 -7 -0.5t-3.5 -2.5t-1.5 -6q0 -2 16 -26t16 -54q0 -37 -19 -68t-46 -54 t-53.5 -46t-45.5 -54t-19 -68q0 -98 42 -160q29 -43 79 -63q16 -5 17 -10q1 -2 1 -5q0 -16 -18 -16q-6 0 -33 11q-119 43 -195 139.5t-76 218.5q0 55 24.5 115.5t60 115t70.5 108.5t59.5 113.5t24.5 111.5q0 53 -25 94q-29 48 -56 64q-19 9 -19 21q0 20 41 20q50 0 110 -29 q41 -19 71 -44.5t49.5 -51t33.5 -62.5t22 -69t16 -80q0 -1 3 -17.5t4.5 -25t5.5 -25t9 -27t11 -21.5t14.5 -16.5t18.5 -5.5q23 0 37 14t14 37q0 25 -20 67t-20 52t10 10q27 0 93 -70q72 -76 102.5 -156t30.5 -186zM2304 615q0 -274 -138 -503q-19 -32 -48 -72t-68 -86.5 t-81 -77t-74 -30.5q-16 0 -31 15.5t-15 31.5q0 15 29 50.5t68.5 77t48.5 52.5q183 230 183 531q0 131 -20.5 235t-72.5 211q-58 119 -163 228q-2 3 -13 13.5t-16.5 16.5t-15 17.5t-15 20t-9.5 18.5t-4 19q0 19 16 35.5t35 16.5q70 0 196 -169q98 -131 146 -273t60 -314 q2 -42 2 -64z" /> <glyph glyph-name="uniF2C6" unicode="" horiz-adv-x="1792" d="M1189 229l147 693q9 44 -10.5 63t-51.5 7l-864 -333q-29 -11 -39.5 -25t-2.5 -26.5t32 -19.5l221 -69l513 323q21 14 32 6q7 -5 -4 -15l-415 -375v0v0l-16 -228q23 0 45 22l108 104l224 -165q64 -36 81 38zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> <glyph glyph-name="uniF2C7" unicode="" horiz-adv-x="1024" d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v907h128v-907q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 v128h192z" /> <glyph glyph-name="uniF2C8" unicode="" horiz-adv-x="1024" d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v651h128v-651q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 v128h192z" /> <glyph glyph-name="uniF2C9" unicode="" horiz-adv-x="1024" d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v395h128v-395q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 v128h192z" /> <glyph glyph-name="uniF2CA" unicode="" horiz-adv-x="1024" d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v139h128v-139q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 v128h192z" /> <glyph glyph-name="uniF2CB" unicode="" horiz-adv-x="1024" d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 79 56 135.5t136 56.5t136 -56.5t56 -135.5zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5z M896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z" /> <glyph glyph-name="uniF2CC" unicode="" horiz-adv-x="1920" d="M1433 1287q10 -10 10 -23t-10 -23l-626 -626q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l44 44q-72 91 -81.5 207t46.5 215q-74 71 -176 71q-106 0 -181 -75t-75 -181v-1280h-256v1280q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5q106 0 201 -41 t166 -115q94 39 197 24.5t185 -79.5l44 44q10 10 23 10t23 -10zM1344 1024q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1600 896q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1856 1024q26 0 45 -19t19 -45t-19 -45t-45 -19 t-45 19t-19 45t19 45t45 19zM1216 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1408 832q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM1728 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 768 q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 640q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1600 768q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 512q-26 0 -45 19t-19 45t19 45t45 19t45 -19 t19 -45t-19 -45t-45 -19zM1472 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 384 q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 256q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19z" /> <glyph glyph-name="uniF2CD" unicode="" horiz-adv-x="1792" d="M1664 448v-192q0 -169 -128 -286v-194q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v118q-63 -22 -128 -22h-768q-65 0 -128 22v-110q0 -17 -9.5 -28.5t-22.5 -11.5h-64q-13 0 -22.5 11.5t-9.5 28.5v186q-128 117 -128 286v192h1536zM704 864q0 -14 -9 -23t-23 -9t-23 9 t-9 23t9 23t23 9t23 -9t9 -23zM768 928q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM704 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1056q0 -14 -9 -23t-23 -9t-23 9 t-9 23t9 23t23 9t23 -9t9 -23zM704 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v640q0 106 75 181t181 75q108 0 184 -78q46 19 98 12t93 -39l22 22q11 11 22 0l42 -42 q11 -11 0 -22l-314 -314q-11 -11 -22 0l-42 42q-11 11 0 22l22 22q-36 46 -40.5 104t23.5 108q-37 35 -88 35q-53 0 -90.5 -37.5t-37.5 -90.5v-640h1504q14 0 23 -9t9 -23zM896 1056q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1120q0 -14 -9 -23t-23 -9 t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM896 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1248q0 -14 -9 -23 t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1024 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1088 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23z" /> <glyph glyph-name="uniF2CE" unicode="" d="M994 344q0 -86 -17 -197q-31 -215 -55 -313q-22 -90 -152 -90t-152 90q-24 98 -55 313q-17 110 -17 197q0 168 224 168t224 -168zM1536 768q0 -240 -134 -434t-350 -280q-8 -3 -15 3t-6 15q7 48 10 66q4 32 6 47q1 9 9 12q159 81 255.5 234t96.5 337q0 180 -91 330.5 t-247 234.5t-337 74q-124 -7 -237 -61t-193.5 -140.5t-128 -202t-46.5 -240.5q1 -184 99 -336.5t257 -231.5q7 -3 9 -12q3 -21 6 -45q1 -9 5 -32.5t6 -35.5q1 -9 -6.5 -15t-15.5 -2q-148 58 -261 169.5t-173.5 264t-52.5 319.5q7 143 66 273.5t154.5 227t225 157.5t272.5 70 q164 10 315.5 -46.5t261 -160.5t175 -250.5t65.5 -308.5zM994 800q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5zM1282 768q0 -122 -53.5 -228.5t-146.5 -177.5q-8 -6 -16 -2t-10 14q-6 52 -29 92q-7 10 3 20 q58 54 91 127t33 155q0 111 -58.5 204t-157.5 141.5t-212 36.5q-133 -15 -229 -113t-109 -231q-10 -92 23.5 -176t98.5 -144q10 -10 3 -20q-24 -41 -29 -93q-2 -9 -10 -13t-16 2q-95 74 -148.5 183t-51.5 234q3 131 69 244t177 181.5t241 74.5q144 7 268 -60t196.5 -187.5 t72.5 -263.5z" /> <glyph glyph-name="uniF2D0" unicode="" horiz-adv-x="1792" d="M256 128h1280v768h-1280v-768zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> <glyph glyph-name="uniF2D1" unicode="" horiz-adv-x="1792" d="M1792 224v-192q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> <glyph glyph-name="uniF2D2" unicode="" horiz-adv-x="2048" d="M256 0h768v512h-768v-512zM1280 512h512v768h-768v-256h96q66 0 113 -47t47 -113v-352zM2048 1376v-960q0 -66 -47 -113t-113 -47h-608v-352q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h608v352q0 66 47 113t113 47h960q66 0 113 -47 t47 -113z" /> <glyph glyph-name="uniF2D3" unicode="" horiz-adv-x="1792" d="M1175 215l146 146q10 10 10 23t-10 23l-233 233l233 233q10 10 10 23t-10 23l-146 146q-10 10 -23 10t-23 -10l-233 -233l-233 233q-10 10 -23 10t-23 -10l-146 -146q-10 -10 -10 -23t10 -23l233 -233l-233 -233q-10 -10 -10 -23t10 -23l146 -146q10 -10 23 -10t23 10 l233 233l233 -233q10 -10 23 -10t23 10zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> <glyph glyph-name="uniF2D4" unicode="" horiz-adv-x="1792" d="M1257 425l-146 -146q-10 -10 -23 -10t-23 10l-169 169l-169 -169q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l169 169l-169 169q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l169 -169l169 169q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-169 -169l169 -169q10 -10 10 -23t-10 -23zM256 128h1280v1024h-1280v-1024zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> <glyph glyph-name="uniF2D5" unicode="" horiz-adv-x="1792" d="M1070 358l306 564h-654l-306 -564h654zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> <glyph glyph-name="uniF2D6" unicode="" horiz-adv-x="1794" d="M1291 1060q-15 17 -35 8.5t-26 -28.5t5 -38q14 -17 40 -14.5t34 20.5t-18 52zM895 814q-8 -8 -19.5 -8t-18.5 8q-8 8 -8 19t8 18q7 8 18.5 8t19.5 -8q7 -7 7 -18t-7 -19zM1060 740l-35 -35q-12 -13 -29.5 -13t-30.5 13l-38 38q-12 13 -12 30t12 30l35 35q12 12 29.5 12 t30.5 -12l38 -39q12 -12 12 -29.5t-12 -29.5zM951 870q-7 -8 -18.5 -8t-19.5 8q-7 8 -7 19t7 19q8 8 19 8t19 -8t8 -19t-8 -19zM1354 968q-34 -64 -107.5 -85.5t-127.5 16.5q-38 28 -61 66.5t-21 87.5t39 92t75.5 53t70.5 -5t70 -51q2 -2 13 -12.5t14.5 -13.5t13 -13.5 t12.5 -15.5t10 -15.5t8.5 -18t4 -18.5t1 -21t-5 -22t-9.5 -24zM1555 486q3 20 -8.5 34.5t-27.5 21.5t-33 17t-23 20q-40 71 -84 98.5t-113 11.5q19 13 40 18.5t33 4.5l12 -1q2 45 -34 90q6 20 6.5 40.5t-2.5 30.5l-3 10q43 24 71 65t34 91q10 84 -43 150.5t-137 76.5 q-60 7 -114 -18.5t-82 -74.5q-30 -51 -33.5 -101t14.5 -87t43.5 -64t56.5 -42q-45 4 -88 36t-57 88q-28 108 32 222q-16 21 -29 32q-50 0 -89 -19q19 24 42 37t36 14l13 1q0 50 -13 78q-10 21 -32.5 28.5t-47 -3.5t-37.5 -40q2 4 4 7q-7 -28 -6.5 -75.5t19 -117t48.5 -122.5 q-25 -14 -47 -36q-35 -16 -85.5 -70.5t-84.5 -101.5l-33 -46q-90 -34 -181 -125.5t-75 -162.5q1 -16 11 -27q-15 -12 -30 -30q-21 -25 -21 -54t21.5 -40t63.5 6q41 19 77 49.5t55 60.5q-2 2 -6.5 5t-20.5 7.5t-33 3.5q23 5 51 12.5t40 10t27.5 6t26 4t23.5 0.5q14 -7 22 34 q7 37 7 90q0 102 -40 150q106 -103 101 -219q-1 -29 -15 -50t-27 -27l-13 -6q-4 -7 -19 -32t-26 -45.5t-26.5 -52t-25 -61t-17 -63t-6.5 -66.5t10 -63q-35 54 -37 80q-22 -24 -34.5 -39t-33.5 -42t-30.5 -46t-16.5 -41t-0.5 -38t25.5 -27q45 -25 144 64t190.5 221.5 t122.5 228.5q86 52 145 115.5t86 119.5q47 -93 154 -178q104 -83 167 -80q39 2 46 43zM1794 640q0 -182 -71 -348t-191 -286t-286.5 -191t-348.5 -71t-348.5 71t-286.5 191t-191 286t-71 348t71 348t191 286t286.5 191t348.5 71t348.5 -71t286.5 -191t191 -286t71 -348z" /> <glyph glyph-name="uniF2D7" unicode="" d="M518 1353v-655q103 -1 191.5 1.5t125.5 5.5l37 3q68 2 90.5 24.5t39.5 94.5l33 142h103l-14 -322l7 -319h-103l-29 127q-15 68 -45 93t-84 26q-87 8 -352 8v-556q0 -78 43.5 -115.5t133.5 -37.5h357q35 0 59.5 2t55 7.5t54 18t48.5 32t46 50.5t39 73l93 216h89 q-6 -37 -31.5 -252t-30.5 -276q-146 5 -263.5 8t-162.5 4h-44h-628l-376 -12v102l127 25q67 13 91.5 37t25.5 79l8 643q3 402 -8 645q-2 61 -25.5 84t-91.5 36l-127 24v102l376 -12h702q139 0 374 27q-6 -68 -14 -194.5t-12 -219.5l-5 -92h-93l-32 124q-31 121 -74 179.5 t-113 58.5h-548q-28 0 -35.5 -8.5t-7.5 -30.5z" /> <glyph glyph-name="uniF2D8" unicode="" d="M922 739v-182q0 -4 0.5 -15t0 -15l-1.5 -12t-3.5 -11.5t-6.5 -7.5t-11 -5.5t-16 -1.5v309q9 0 16 -1t11 -5t6.5 -5.5t3.5 -9.5t1 -10.5v-13.5v-14zM1238 643v-121q0 -1 0.5 -12.5t0 -15.5t-2.5 -11.5t-7.5 -10.5t-13.5 -3q-9 0 -14 9q-4 10 -4 165v7v8.5v9t1.5 8.5l3.5 7 t5 5.5t8 1.5q6 0 10 -1.5t6.5 -4.5t4 -6t2 -8.5t0.5 -8v-9.5v-9zM180 407h122v472h-122v-472zM614 407h106v472h-159l-28 -221q-20 148 -32 221h-158v-472h107v312l45 -312h76l43 319v-319zM1039 712q0 67 -5 90q-3 16 -11 28.5t-17 20.5t-25 14t-26.5 8.5t-31 4t-29 1.5 h-29.5h-12h-91v-472h56q169 -1 197 24.5t25 180.5q-1 62 -1 100zM1356 515v133q0 29 -2 45t-9.5 33.5t-24.5 25t-46 7.5q-46 0 -77 -34v154h-117v-472h110l7 30q30 -36 77 -36q50 0 66 30.5t16 83.5zM1536 1248v-1216q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113 v1216q0 66 47 113t113 47h1216q66 0 113 -47t47 -113z" /> <glyph glyph-name="uniF2D9" unicode="" horiz-adv-x="2176" d="M1143 -197q-6 1 -11 4q-13 8 -36 23t-86 65t-116.5 104.5t-112 140t-89.5 172.5q-17 3 -175 37q66 -213 235 -362t391 -184zM502 409l168 -28q-25 76 -41 167.5t-19 145.5l-4 53q-84 -82 -121 -224q5 -65 17 -114zM612 1018q-43 -64 -77 -148q44 46 74 68zM2049 584 q0 161 -62 307t-167.5 252t-250.5 168.5t-304 62.5q-147 0 -281 -52.5t-240 -148.5q-30 -58 -45 -160q60 51 143 83.5t158.5 43t143 13.5t108.5 -1l40 -3q33 -1 53 -15.5t24.5 -33t6.5 -37t-1 -28.5q-126 11 -227.5 0.5t-183 -43.5t-142.5 -71.5t-131 -98.5 q4 -36 11.5 -92.5t35.5 -178t62 -179.5q123 -6 247.5 14.5t214.5 53.5t162.5 67t109.5 59l37 24q22 16 39.5 20.5t30.5 -5t17 -34.5q14 -97 -39 -121q-208 -97 -467 -134q-135 -20 -317 -16q41 -96 110 -176.5t137 -127t130.5 -79t101.5 -43.5l39 -12q143 -23 263 15 q195 99 314 289t119 418zM2123 621q-14 -135 -40 -212q-70 -208 -181.5 -346.5t-318.5 -253.5q-48 -33 -82 -44q-72 -26 -163 -16q-36 -3 -73 -3q-283 0 -504.5 173t-295.5 442q-1 0 -4 0.5t-5 0.5q-6 -50 2.5 -112.5t26 -115t36 -98t31.5 -71.5l14 -26q8 -12 54 -82 q-71 38 -124.5 106.5t-78.5 140t-39.5 137t-17.5 107.5l-2 42q-5 2 -33.5 12.5t-48.5 18t-53 20.5t-57.5 25t-50 25.5t-42.5 27t-25 25.5q19 -10 50.5 -25.5t113 -45.5t145.5 -38l2 32q11 149 94 290q41 202 176 365q28 115 81 214q15 28 32 45t49 32q158 74 303.5 104 t302 11t306.5 -97q220 -115 333 -336t87 -474z" /> <glyph glyph-name="uniF2DA" unicode="" horiz-adv-x="1792" d="M1341 752q29 44 -6.5 129.5t-121.5 142.5q-58 39 -125.5 53.5t-118 4.5t-68.5 -37q-12 -23 -4.5 -28t42.5 -10q23 -3 38.5 -5t44.5 -9.5t56 -17.5q36 -13 67.5 -31.5t53 -37t40 -38.5t30.5 -38t22 -34.5t16.5 -28.5t12 -18.5t10.5 -6t11 9.5zM1704 178 q-52 -127 -148.5 -220t-214.5 -141.5t-253 -60.5t-266 13.5t-251 91t-210 161.5t-141.5 235.5t-46.5 303.5q1 41 8.5 84.5t12.5 64t24 80.5t23 73q-51 -208 1 -397t173 -318t291 -206t346 -83t349 74.5t289 244.5q20 27 18 14q0 -4 -4 -14zM1465 627q0 -104 -40.5 -199 t-108.5 -164t-162 -109.5t-198 -40.5t-198 40.5t-162 109.5t-108.5 164t-40.5 199t40.5 199t108.5 164t162 109.5t198 40.5t198 -40.5t162 -109.5t108.5 -164t40.5 -199zM1752 915q-65 147 -180.5 251t-253 153.5t-292 53.5t-301 -36.5t-275.5 -129t-220 -211.5t-131 -297 t-10 -373q-49 161 -51.5 311.5t35.5 272.5t109 227t165.5 180.5t207 126t232 71t242.5 9t236 -54t216 -124.5t178 -197q33 -50 62 -121t31 -112zM1690 573q12 244 -136.5 416t-396.5 240q-8 0 -10 5t24 8q125 -4 230 -50t173 -120t116 -168.5t58.5 -199t-1 -208 t-61.5 -197.5t-122.5 -167t-185 -117.5t-248.5 -46.5q108 30 201.5 80t174 123t129.5 176.5t55 225.5z" /> <glyph glyph-name="uniF2DB" unicode="" d="M192 256v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 512v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 768v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16 q0 16 16 16h112zM192 1024v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 1280v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM1280 1440v-1472q0 -40 -28 -68t-68 -28h-832q-40 0 -68 28 t-28 68v1472q0 40 28 68t68 28h832q40 0 68 -28t28 -68zM1536 208v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 464v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 720v-32 q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 976v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 1232v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16 h48q16 0 16 -16z" /> <glyph glyph-name="uniF2DC" unicode="" horiz-adv-x="1664" d="M1566 419l-167 -33l186 -107q23 -13 29.5 -38.5t-6.5 -48.5q-14 -23 -39 -29.5t-48 6.5l-186 106l55 -160q13 -38 -12 -63.5t-60.5 -20.5t-48.5 42l-102 300l-271 156v-313l208 -238q16 -18 17 -39t-11 -36.5t-28.5 -25t-37 -5.5t-36.5 22l-112 128v-214q0 -26 -19 -45 t-45 -19t-45 19t-19 45v214l-112 -128q-16 -18 -36.5 -22t-37 5.5t-28.5 25t-11 36.5t17 39l208 238v313l-271 -156l-102 -300q-13 -37 -48.5 -42t-60.5 20.5t-12 63.5l55 160l-186 -106q-23 -13 -48 -6.5t-39 29.5q-13 23 -6.5 48.5t29.5 38.5l186 107l-167 33 q-29 6 -42 29t-8.5 46.5t25.5 40t50 10.5l310 -62l271 157l-271 157l-310 -62q-4 -1 -13 -1q-27 0 -44 18t-19 40t11 43t40 26l167 33l-186 107q-23 13 -29.5 38.5t6.5 48.5t39 30t48 -7l186 -106l-55 160q-13 38 12 63.5t60.5 20.5t48.5 -42l102 -300l271 -156v313 l-208 238q-16 18 -17 39t11 36.5t28.5 25t37 5.5t36.5 -22l112 -128v214q0 26 19 45t45 19t45 -19t19 -45v-214l112 128q16 18 36.5 22t37 -5.5t28.5 -25t11 -36.5t-17 -39l-208 -238v-313l271 156l102 300q13 37 48.5 42t60.5 -20.5t12 -63.5l-55 -160l186 106 q23 13 48 6.5t39 -29.5q13 -23 6.5 -48.5t-29.5 -38.5l-186 -107l167 -33q27 -5 40 -26t11 -43t-19 -40t-44 -18q-9 0 -13 1l-310 62l-271 -157l271 -157l310 62q29 6 50 -10.5t25.5 -40t-8.5 -46.5t-42 -29z" /> <glyph glyph-name="uniF2DD" unicode="" horiz-adv-x="1792" d="M1473 607q7 118 -33 226.5t-113 189t-177 131t-221 57.5q-116 7 -225.5 -32t-192 -110.5t-135 -175t-59.5 -220.5q-7 -118 33 -226.5t113 -189t177.5 -131t221.5 -57.5q155 -9 293 59t224 195.5t94 283.5zM1792 1536l-349 -348q120 -117 180.5 -272t50.5 -321 q-11 -183 -102 -339t-241 -255.5t-332 -124.5l-999 -132l347 347q-120 116 -180.5 271.5t-50.5 321.5q11 184 102 340t241.5 255.5t332.5 124.5q167 22 500 66t500 66z" /> <glyph glyph-name="uniF2DE" unicode="" horiz-adv-x="1792" d="M948 508l163 -329h-51l-175 350l-171 -350h-49l179 374l-78 33l21 49l240 -102l-21 -50zM563 1100l304 -130l-130 -304l-304 130zM907 915l240 -103l-103 -239l-239 102zM1188 765l191 -81l-82 -190l-190 81zM1680 640q0 159 -62 304t-167.5 250.5t-250.5 167.5t-304 62 t-304 -62t-250.5 -167.5t-167.5 -250.5t-62 -304t62 -304t167.5 -250.5t250.5 -167.5t304 -62t304 62t250.5 167.5t167.5 250.5t62 304zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71 t286 -191t191 -286t71 -348z" /> <glyph glyph-name="uniF2E0" unicode="" horiz-adv-x="1920" d="M1334 302q-4 24 -27.5 34t-49.5 10.5t-48.5 12.5t-25.5 38q-5 47 33 139.5t75 181t32 127.5q-14 101 -117 103q-45 1 -75 -16l-3 -2l-5 -2.5t-4.5 -2t-5 -2t-5 -0.5t-6 1.5t-6 3.5t-6.5 5q-3 2 -9 8.5t-9 9t-8.5 7.5t-9.5 7.5t-9.5 5.5t-11 4.5t-11.5 2.5q-30 5 -48 -3 t-45 -31q-1 -1 -9 -8.5t-12.5 -11t-15 -10t-16.5 -5.5t-17 3q-54 27 -84 40q-41 18 -94 -5t-76 -65q-16 -28 -41 -98.5t-43.5 -132.5t-40 -134t-21.5 -73q-22 -69 18.5 -119t110.5 -46q30 2 50.5 15t38.5 46q7 13 79 199.5t77 194.5q6 11 21.5 18t29.5 0q27 -15 21 -53 q-2 -18 -51 -139.5t-50 -132.5q-6 -38 19.5 -56.5t60.5 -7t55 49.5q4 8 45.5 92t81.5 163.5t46 88.5q20 29 41 28q29 0 25 -38q-2 -16 -65.5 -147.5t-70.5 -159.5q-12 -53 13 -103t74 -74q17 -9 51 -15.5t71.5 -8t62.5 14t20 48.5zM383 86q3 -15 -5 -27.5t-23 -15.5 q-14 -3 -26.5 5t-15.5 23q-3 14 5 27t22 16t27 -5t16 -23zM953 -177q12 -17 8.5 -37.5t-20.5 -32.5t-37.5 -8t-32.5 21q-11 17 -7.5 37.5t20.5 32.5t37.5 8t31.5 -21zM177 635q-18 -27 -49.5 -33t-57.5 13q-26 18 -32 50t12 58q18 27 49.5 33t57.5 -12q26 -19 32 -50.5 t-12 -58.5zM1467 -42q19 -28 13 -61.5t-34 -52.5t-60.5 -13t-51.5 34t-13 61t33 53q28 19 60.5 13t52.5 -34zM1579 562q69 -113 42.5 -244.5t-134.5 -207.5q-90 -63 -199 -60q-20 -80 -84.5 -127t-143.5 -44.5t-140 57.5q-12 -9 -13 -10q-103 -71 -225 -48.5t-193 126.5 q-50 73 -53 164q-83 14 -142.5 70.5t-80.5 128t-2 152t81 138.5q-36 60 -38 128t24.5 125t79.5 98.5t121 50.5q32 85 99 148t146.5 91.5t168 17t159.5 -66.5q72 21 140 17.5t128.5 -36t104.5 -80t67.5 -115t17.5 -140.5q52 -16 87 -57t45.5 -89t-5.5 -99.5t-58 -87.5z M455 1222q14 -20 9.5 -44.5t-24.5 -38.5q-19 -14 -43.5 -9.5t-37.5 24.5q-14 20 -9.5 44.5t24.5 38.5q19 14 43.5 9.5t37.5 -24.5zM614 1503q4 -16 -5 -30.5t-26 -18.5t-31 5.5t-18 26.5q-3 17 6.5 31t25.5 18q17 4 31 -5.5t17 -26.5zM1800 555q4 -20 -6.5 -37t-30.5 -21 q-19 -4 -36 6.5t-21 30.5t6.5 37t30.5 22q20 4 36.5 -7.5t20.5 -30.5zM1136 1448q16 -27 8.5 -58.5t-35.5 -47.5q-27 -16 -57.5 -8.5t-46.5 34.5q-16 28 -8.5 59t34.5 48t58 9t47 -36zM1882 792q4 -15 -4 -27.5t-23 -16.5q-15 -3 -27.5 5.5t-15.5 22.5q-3 15 5 28t23 16 q14 3 26.5 -5t15.5 -23zM1691 1033q15 -22 10.5 -49t-26.5 -43q-22 -15 -49 -10t-42 27t-10 49t27 43t48.5 11t41.5 -28z" /> <glyph glyph-name="uniF2E1" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="uniF2E2" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="uniF2E3" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="uniF2E4" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="uniF2E5" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="uniF2E6" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="uniF2E7" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="_698" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="uniF2E9" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="uniF2EA" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="uniF2EB" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="uniF2EC" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="uniF2ED" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="uniF2EE" unicode="" horiz-adv-x="1792" /> <glyph glyph-name="lessequal" unicode="" horiz-adv-x="1792" /> </font> </defs></svg> PKAA#]�l����.system/helix3/assets/images/megamenu/4-4-4.pngnu�[����PNG IHDR�:�O�tEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:2B9D0B5C949711E48899E7639E2015A8" xmpMM:DocumentID="xmp.did:2B9D0B5D949711E48899E7639E2015A8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:2B9D0B5A949711E48899E7639E2015A8" stRef:documentID="xmp.did:2B9D0B5B949711E48899E7639E2015A8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>:A{cIDATx���1NTQ�b�51���6���P�*&�� ���%�+`8���BB���΅��wI��@"�~_r�f�s��'�0�L&���w1ob^Ĭx�f1G1_b�c~t�Fs�d:��ci$#�i7#K���cNbvc^9����o��o�~G�+#2"#2R�8�̪���j��x����w$�ʧ����0�_˔�nd$��=Go�{��5dDFd�"#�@6b��I3ҭ7+_##2"#I��.�S���Ȉ�Pd$�s{h����eDFd�"#�@��Csj�V)#2"#I���CF� KV�@��@P �@P ( �@��@��@P (P ( �@��@@��@P (( ����CF�n-�skhά�y���H*�c{hη��eDFd�"#�@�9��<2BI�sj�H��\����H*��1�c.�ҍ?�א������טm��ѷ��AFdDF���?�d'�m̙��Y���##2"#2�;#�$L���s8��*��Y��ǘg���#��Ȉ��ȕK奍Ip�IEND�B`�PKAA#]y� $$3system/helix3/assets/images/megamenu/3-3-3-3-12.pngnu�[����PNG IHDR��n+tEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:80DE1815949811E48899E7639E2015A8" xmpMM:DocumentID="xmp.did:80DE1816949811E48899E7639E2015A8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:80DE1813949811E48899E7639E2015A8" stRef:documentID="xmp.did:80DE1814949811E48899E7639E2015A8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�! ��IDATx���?oSWpXJG*P��5_��Ih����TU� ���a!L�.��P��=�E[F`i��':��XF���+�I�P�N����4 f8�S>�\��EV"g��3�y�y5�����~��x<�ᦛ�ȧ�����"�v�}�?�o�R��SO^��ٌ|��s9�o��o�������n���R��x���}���{iȷ���>q��I��ʷ}�эn�һ^�I?و�h���s�^7�э^z�K�ӑ;���7�K�F7�)�F/{Ir5��&��8ߺ�nt���n�R��4 knQ�Z��G7ǽ�T�% �Ew�f��� e��b/i@ιC5g ���P֍^*���;�nt�^z�`@0 ����`@0 `@0 ������`@0 0 ��=�}g�-����z@�9C5����P֍^*���;T�[�|�膲n�R��4 �ܡ�����F7�u��������E�ҍ.|�nt���n�R��4 /"�"nҙtۯ"/_��覬�T�c�[���c��n�z��F7z�e/�ρ܊\�������zǯ���F/��e����P�F����nE��<�7<?X�/���<���M��Kǽ���W�;9�nt�^z�_e�\�~���@0 ����`@0 `@0 �é�x� ��J߁�x�t�Jd=��ș���#�������'G�Q��/G6#Kn@6�\�l�l���������g �瑟�w$��inF�lȇ����#�Ȼq8 W~l��,��8�U���j3 ��+̀�s �i�[P�_e���`@0 `@0 ������`@0 0 ���`@��`@0 ��q@���y�3P�y3 O���̀�v����G0ɻq8 /"_G����>����a�G#��}���y��9���?��u��7�N�p+r!�M�Ido�s"��~����>��_8Z���)�IEND�B`�PKAA#]12���1system/helix3/assets/images/megamenu/4-4-4-12.pngnu�[����PNG IHDR�����tEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:80DE180D949811E48899E7639E2015A8" xmpMM:DocumentID="xmp.did:80DE180E949811E48899E7639E2015A8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:F84189E8949711E48899E7639E2015A8" stRef:documentID="xmp.did:80DE180C949811E48899E7639E2015A8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�XIDATx���ONSQ����CHN q@��pVa�L4��.���t�o�I;0qlCR����s����jy�F��/9�ep�I~i�T�z��혅��1b&*�D���1{1oc��>`fff�i4��mG�ȟ�Î�dGFz\����Х�h�ndwZ���kG��#��,����ufC�nv�/��s��#v�eo@�Ĭ�T���Jw���e�;bG8�#) c���^��Ow}�����#�v$d1fʙ�F���cG�!�#) 5gQ:���x�%ؑ��Ρtf>ގ�;BnGR@&�C�|��#v����:�#�rF�� �� �� �� �� �� �� ��0�����`G��c�P:'oG�!�#) ��C�|��#v����;��9(�x;bG��Iَi:��Hw�U�9vĎ�r;�r��v&C���i���;bG��H��xwcV\��_�JvחaG��td=f��С}�9���U�;bG��َ�~�p/�^���0���n�Vv�Kٝ�]�ϵ#vĎؑ�n�y·��l�bG�#��O�p)�v�w��� �� �� �� �� ��[�F�)���H��ݎY�y33�J�s��.�k�?V�z�c6c��]�1�b�:��~k9fG<�c*k�ro@�bV�+g�oT�V�w2�F<�`D^��IY�x� ��K�XL�9 z�r�9P�l Ȥs����Q�@Q�� �� �� �� �� �� �� �� ��0����L@����|rt���(� d;��,��Ԍ��Ә�1mg��/R;:�ƻ�""�ǫ����ρ���W��@^3k�Z��$܍���zK�0���J)}F�K̇ʯ����F��!��@��{>d�IEND�B`�PKAA#]� E__2system/helix3/assets/images/megamenu/4-4-4-6-6.pngnu�[����PNG IHDR��k�stEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:80DE1811949811E48899E7639E2015A8" xmpMM:DocumentID="xmp.did:80DE1812949811E48899E7639E2015A8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:80DE180F949811E48899E7639E2015A8" stRef:documentID="xmp.did:80DE1810949811E48899E7639E2015A8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�Ya0�IDATx���1k[�Y���e0���L�a�M$ت��jɟ��[Y����!0�����X�� 'a� 79�w�<|���gޏ��ɨ�f����1�1[1 �hss�9���m�^y���/���T����DF��ȝ��wb��9�y⡯����3ݹ��ʈ�Ȉ� d�%fә���l�K�GFdDFdd�X Oc�Ō����g�솟����H*�{1�᯳X?���ϼ��Ȉ�0�H�ǫ��Τ�Y�.���Ȉ�0�H*��:ۅ�ˈ�����y���Ux��Ȉ�0�H*oK��A�2"#2� #�@�:� #�ޘ@��@P (P ( �@��@@��@P (( ��@��@P �@P ( ��\ �W�d�K��1T��z�a��T ?�Cu� ���Ir����z�a��T �b~:�j�g���32"#2� #�@Nc��̜�ڛ�g}Z�9�a����x���y�k��� �ᯌ��~̋�����N��_�>2"#2"#Y�C�Ị�ݘ�1Sg������g:���ʈ�Ȉ��u]�*ն���}��DF��h6��J ��@��@P �@P ( �@��@��@P (P (+�dm�����%_��2f;f+f�1�&�1G1�1�c~��}�U�̨�����l:7��q�ۘɒ?���ݙ;s��|�Tb3�}��=�U��y�<�y�~"qFTd�s����3T�3�@��|X�ij�r�>�u��L�A�ǫ��΄����.���`gbgR�<wp��u���I��9����eg v&�7H�i\kg v&�]�E�4�"@��@P (P ( �@��@@��@P (( ��@��@P �@P ( ���������\ ǎ���k��Τ���9*���@�L*�C��ׂk��Τ���YP�������L�L*�Ә713gB�f9����3ؙ��x���Y*\����Rv��wf��@�c^4eo���:�y�_�v��wf� '1�bvc��L�kd�s��s>��{��ݙ?u�Jj���IEND�B`�PKAA#]�D(33,system/helix3/assets/images/megamenu/3-9.pngnu�[����PNG IHDR�9�}^tEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:F84189E2949711E48899E7639E2015A8" xmpMM:DocumentID="xmp.did:F84189E3949711E48899E7639E2015A8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:F84189E0949711E48899E7639E2015A8" stRef:documentID="xmp.did:F84189E1949711E48899E7639E2015A8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�E���IDATx���OKTQ�;Ҧh)An7V��@���Ƞm�"�-�jn�M}����:!f�I�=t�&������&w�;��zkmmmU}��܋���3^QG/&�ڍY��6�����_���=�O�{�sŽ �͘�y�}���c}�o�|�Y��fI�x�n5gy��َىy3�^���t�=;y ,��1�1�evbR��c����'� �Cy-�ȍ��|F�I�(�y<�i�(@+酪�9�"��[�Y+�}�<�K�e�Q�@�+����2�[��k+�Li7ͧiˢ135�Ί(X;�e94�j���(z��9'����ֽE�T ��P$�mL( �@��@@��@P (( ��@��@P �@P ( �@��@��@����^���ӫqֽE�T ��И�5κ�d��@�ˡ1�j��(X7ȫ�]Y��n�zXk1_�(�T {1��������1� r�w���g�ob��22�9��+�%%TKy7��@:1�+��N�nδs�g<��s/@�l.浪�@���ɘ�1կ�\�r�~�l#g8�3=����1b>T�>8�^�9i�\��>�)���[�P��IEND�B`�PKAA#]�f�2��,system/helix3/assets/images/megamenu/6-6.pngnu�[����PNG IHDR�:�O�tEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:2B9D0B58949711E48899E7639E2015A8" xmpMM:DocumentID="xmp.did:2B9D0B59949711E48899E7639E2015A8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:2B9D0B56949711E48899E7639E2015A8" stRef:documentID="xmp.did:2B9D0B57949711E48899E7639E2015A8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�o1IDATx���1J\QIj��2�4�A6�h�E�$B��HlK��\��@ � a��\��0�0W-����o��+~����7K��x��8�&��y�Y�a�fN2�2�?��F��`2���g����,�]�*�3�%�Rx`V�.�4��)3t�����9̬�X�ߪ>��2CיY���9�dGt���O�����Cf�:3�@�d� b��`Q2��$�@�<���|�n�^f��d�Ȇ]@�?�e��R ��� ��$3�@V��^��HfJ�<�h"30��CBP ( �@��@@��@P (P ( �@��@@��@P (( ��@��@�@.�����e 0L��HfJ���N��HfJ��4�@f 9(r�9�:vVs�(�Af��R �3o3�vB�ʹWs�(�Af����x�gv��P��->+3t���߁�e63�vD��y�=d��33�C��*O3�3�C۫���s�S��=�Sf�63W=�]�)��IEND�B`�PKAA#]��x�CC+system/helix3/assets/images/megamenu/12.pngnu�[����PNG IHDR�:�O�tEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:961752AB948D11E48899E7639E2015A8" xmpMM:DocumentID="xmp.did:961752AC948D11E48899E7639E2015A8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:961752A9948D11E48899E7639E2015A8" stRef:documentID="xmp.did:961752AA948D11E48899E7639E2015A8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�В�IDATx��۽JB�a���%���Z����ƾ@�6r�-/!����r� ¹���7� BO���ų���S�F����I� �k�XE��S�>֏}�?��҉������q�46�}И{�-*#���Ft��o��č�C�hEg�f�F<X2"ٌf�(��&,)�q��w*�d@v����2 �@E�Ț;PU� @@@@@@@@@@@@@@@@@@@@@@@@@@@@�i@>������h�yq*z����~��-XR6�.�;�}� d+γ���cW"��xd+~���;�����qш���Y���E�!6q3���U������m�J��`�1;��,�IEND�B`�PKAA#]�KE��/system/helix3/assets/images/megamenu/6-6-12.pngnu�[����PNG IHDR��k�stEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:F84189E6949711E48899E7639E2015A8" xmpMM:DocumentID="xmp.did:F84189E7949711E48899E7639E2015A8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:F84189E4949711E48899E7639E2015A8" stRef:documentID="xmp.did:F84189E5949711E48899E7639E2015A8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>8��90IDATx���MK�m�q ��ډ�Z�F�;�M��h�˲2D�KEPԮh�F��3�M�v���+H���4��=I�\��Q���>�{��������ӎ939�����1�1�c���V���oR�~�r7w7G���B�ǘ�1�#d2?��3~�����Ȼ� �B�˘);c�M��Q-�r7{7݀����'U������n(�n҃,�q��v��?>�k� ��M ȍ�SvB�ҳ}������vA�.���H�M Ȍ=P��!^�n(�nR@��� �*wC�w�r��1wC�@@@@@@@@@@@@@@@@��n И�A@b����m�wC�w��(��q77) k�@���k`��&�Y̆]P�O��r77) �bn�t�¤g�f���� ��M�m��c��b~���n(�nz�AL;�1��3~)?���P��� �1wb��l�������,���vz���� E��xUU�Y����뺶$����4��� �� �� �� �� ���O����h�;s5�33iMEډY�Y�y��UU����G1�@����1+���R��`��܈��������DbG�c<�b��c1OƼ#���V<N�H��s�N�M��S@.� �S@f���fS@�� ���R@��My��� �� �� �� �� �� �� �� ���& [�@C�) ����S@V����R@��l��)5�i �n�͘��p�Nn�n�m�ob�E�ⱜ���ρ܋��mG����@��Ĝ���y�cgEڋ��-��mX�h����\�IEND�B`�PKAA#]�{�11,system/helix3/assets/images/megamenu/5-7.pngnu�[����PNG IHDR�9�}^tEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:65B92BE1949711E48899E7639E2015A8" xmpMM:DocumentID="xmp.did:65B92BE2949711E48899E7639E2015A8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:65B92BDF949711E48899E7639E2015A8" stRef:documentID="xmp.did:65B92BE0949711E48899E7639E2015A8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>� �a�IDATx���OKTQ�M�E0��l�7�}��� �, K}�(���*��}���@Pku=m {A��^�\�y�P����{��ױ����p9� 2�����l�"[���Z����n��7�z'��J�~d6r=2b�P���f�S�}�������"�#+�[ʃ���}Z�5U�}ӛ���7��n$���|�fN*���q��8G�y��x�����1#���gni�@nG�#m3b�y�N���t�}�"g�E��Q��gȫ#q5�_�7��z��b*�{-��(�jd��k����g7ȌYP��9_���M2it��rvS���.%U��}����T �́ľBCt��@��@@��@P (( ��@��@P �@P ( �@��@��@P (P (�a��2.� *�=c������Wh��M��(h���a+Ⱥ9PP��ldЌ�� d-�c�������qvߥ�GF̈́!:�{ׯ��t�#� E=Ig�s��C��c�u��Q�%� E��ȇ���y��x�!��;���,�#w"�F C�����ot����Zd>�%�of�`?��|ޯ���?y��`�P�� ��|�&Zz�#�>�]��O~IEND�B`�PKAA#]��^\0system/helix3/assets/images/megamenu/3-3-3-3.pngnu�[����PNG IHDR�:�O�tEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:2B9D0B60949711E48899E7639E2015A8" xmpMM:DocumentID="xmp.did:65B92BDA949711E48899E7639E2015A8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:2B9D0B5E949711E48899E7639E2015A8" stRef:documentID="xmp.did:2B9D0B5F949711E48899E7639E2015A8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>2���zIDATx���1jTa��1�ˠ���� d�6j�>��4!}R+�݉3�n ()������!��8�z`�N#��[|��d2�q1�Qܝ�kqk#�8�k��*�y��i���?���tz�?�R��6��[m�_������}�ۏ[��g��o��oy?S��]��f��: [qqW��´�|��~�.5�h��ҷ9��q;ާ7���]�R��6�h�r!nϛ�n/�z^��좍6d�6 ��7د;|�K�.�hC�ir�[�V�ou��Em�6m@�{�����.5�h� ٦ �%�0�.F�K�.�hC�i��J�E�)m�`@0 ����`@0 `@0 ������`@0 0 �������J�E�)? _<�`�:|�K�.�hC�i�;�}�ou��Em�6m@�x�����.5�h� ٦ ȳ�Coѻ�|�y�R��6ڐmڀ|�����̷��.5�h� ����x_�m{��l�w�K�.�h�����������o{V��좍6K�fu惃�wq��n�]��w����{�縏qo��/���R��6�,u�f��ߟ#IEND�B`�PKAA#]4HM_ _ 4system/helix3/assets/images/megamenu/3-3-3-3-6-6.pngnu�[����PNG IHDR�����tEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:DB9E0786949811E48899E7639E2015A8" xmpMM:DocumentID="xmp.did:DB9E0787949811E48899E7639E2015A8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:DB9E0784949811E48899E7639E2015A8" stRef:documentID="xmp.did:DB9E0785949811E48899E7639E2015A8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>��h�IDATx���MkW�'��R\ici7� h�B��ƶ�b��v����C�Ԁ$[qmф�UK_�ACmWj�V7��!=��@V����������9s�_�'�]�~}��KQǢ��ފ��ݨ_��.F=�x����3����_��I�́�����G]�s���i�͋9�g��y��y�e���Q�E�F��٭�����^Nu�ܣQD�D��jlw��L����m6�9�Y���9u9�U=�L�����8u)�e-�Ğ��S<�l�s6γ��Z��:5�G�˽=����hc/���f�f�<+t���5�Uoz�5�xG�v�:Z���a6�y`6#1�Y��,����w��7�'�fB�z5��<0������y��^s���ZV�t�{��γ��Y ���P������fI�٘K��,�^}(敆כMm>�i6�9s)x��ٮ�lkx��/�1��ϳ-z@�@� @@� @ ��@� @ @ �@��@� @ � ����' �7��e6�R�y��>s��fS�����p��\ �g)@�������fI�٘K��,�}(�i�絬��B����gϳ �n�E�n�^7����u���b.f3��q�<�R�<��4jEOz��{���}�Q�G�ja/Vs�[�k6�9�Y��l�c��E}ez[�S��m,D���^����H��yV�<[�{ 碎D��G���{:��眍�0Ꞗv"���ׁٌ�l�gγ��H�~`�f�Q����}k$}����7�����}Q'�~���Ս�~�����x��g��p��y��y��)7<����py��fuN+̆��<����oМ��@� @@� @ ��@� @�ƶ��E]�lrr�_�/�.@��g���E�:�G����E]���O�Ϸ7T�7��5�{��w,#dO~���w|��g��ܛ�r"�rԸ�1���ߨNt�,{C�{� �E}=�Cu�1���7�{C�{�^��Qs�P�2��h��P�ޤ9���P���M��ߛ �zA��#�7)@���;��{C�{�d�>P�6���7T�7)@��4fo��� @ ��@� @ @ �@��@� @ �@�@�����H�m�rw[�co�~oR�,�����{C�{�d^��|�{`��&ȅ��zA�n�h��P�ޤY��,jUO��j~��[�ko�~o�>�m�I�@eKp2��m��ޛ��2u8�o=bĥw�H~�7��P��l�E �}Q_F��gԊ��[���O��N�x�?�7T�7� 0��)hWNIEND�B`�PKAA#]f�L,system/helix3/assets/images/megamenu/4-8.pngnu�[����PNG IHDR�:�O�tEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:F84189DE949711E48899E7639E2015A8" xmpMM:DocumentID="xmp.did:F84189DF949711E48899E7639E2015A8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:65B92BE3949711E48899E7639E2015A8" stRef:documentID="xmp.did:65B92BE4949711E48899E7639E2015A8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>;�2P�IDATx��ۿNQ�Yb�5!K�6j��ȟK��4j�#����d71Q[H��kc��ƻ3�l0��ߗ��ܝ��3�7,Co8V5��^G�G=�Z����Q_�Q'Q�����܋�F�Y?���F�3=��#gQg͑���Qߢ�E�0��|��,�糽 k�z麫z:?GV�#�3d7?�>�g����v�����O"˶��0�{�IO�GQ={�Y�|��M$=y�(~�N�H �Q� �b�C>�6�И#)@�*_[�$}���g�*_[�9�d�^g��z=4�H ����8+-���1GR�,ه�}�V��9��}`=4,���@� @ @ �@��@� @ �@� @@� @ � �ms�`f��� ��\�G��I��>��z=4�H ��}(��� �#)@N���E1�G��I2�zuiO:�2�������z�s ̓��5�OQ�D�}?��u�F�(~��yp�@��6�.�Q�\�=��u��6�;G6���2}�|���j��'��q>��|���t���'Q;z��#;����B���]�D�^IEND�B`�PKAA#] ���4system/helix3/assets/images/megamenu/2-2-2-2-2-2.pngnu�[����PNG IHDR�9�~�;tEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:65B92BDD949711E48899E7639E2015A8" xmpMM:DocumentID="xmp.did:65B92BDE949711E48899E7639E2015A8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:65B92BDB949711E48899E7639E2015A8" stRef:documentID="xmp.did:65B92BDC949711E48899E7639E2015A8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>*�T��IDATx��۱N�Q��_�,DM�����`�h���3�;���(��-�&����@ts�;�!)M����<ɷ��oz^N�D�n�㘷1;1�1k��7�9�9�9��=�^�7�C����C�y=�m=�w����_Ɯ�|��Z�v�{n��}��q��C=4��d|y���cֻ嶞ϱ���衇&z�#3�\-�1][�nB=4����$-�G�ג}�Y�|G=4��)4I��M�R��4�u�;z衉�H�IZ�]�v*��CM�pG M���l���+��CM�pG M��x�!�T>���������c�zh��&+~�XXXXX`y`y`y`y`y����������������XXXXX`y`y`y`y`y�����������,��2\�����,����W��z衉�H�IZ�?�Y��z衉�H�IZ���K��z衉�H�IZ�1�=�Ϙ��w��C=ܑB��<�ļo��b.+��CM�pG M���������ꡇ&z�#s�����a̫��%?�E>�႟������h2�G�����ݘ�1�%9�(������z衉�Li�O��O :p��IEND�B`�PKAA#]K��Z��-system/helix3/assets/images/select-bg-rtl.svgnu�[���<svg xmlns="http://www.w3.org/2000/svg" width="1854.539" height="295" preserveAspectRatio="xMinYMin meet"><path d="M13.573 145.7l6.9 6.9c.1.1.2.1.3.1s.2 0 .3-.1l6.9-6.9c.1-.1.1-.2.1-.3s0-.2-.1-.3l-.7-.7c-.1-.1-.2-.1-.3-.1s-.2 0-.3.1l-5.8 5.8-5.8-5.8c-.1-.1-.2-.1-.3-.1s-.2 0-.3.1l-.7.7c-.1.1-.1.2-.1.3-.296.1-.195.2-.096.3h-.002z"/><path fill="#fff" d="M44.54 0h1810v295h-1810z"/></svg> PKAA#]���'��*system/helix3/assets/images/layout/363.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:9B53E27F1FA811E4A9CCF17B15AF5A8C" xmpMM:DocumentID="xmp.did:9B53E2801FA811E4A9CCF17B15AF5A8C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:9B53E27D1FA811E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:9B53E27E1FA811E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>���H,IDATx�b�������Xճ@%pi` ��G]>��A�r�*a&Ef��IEND�B`�PKAA#]+�����)system/helix3/assets/images/layout/66.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:1C566C041FA911E4A9CCF17B15AF5A8C" xmpMM:DocumentID="xmp.did:1C566C051FA911E4A9CCF17B15AF5A8C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:F4BAE43F1FA811E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:F4BAE4401FA811E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>H�5�&IDATx�b��F &Z=T�m���G]>\`a "��cIEND�B`�PKAA#]AxL��*system/helix3/assets/images/layout/264.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:9B53E27B1FA811E4A9CCF17B15AF5A8C" xmpMM:DocumentID="xmp.did:9B53E27C1FA811E4A9CCF17B15AF5A8C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:9B53E2791FA811E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:9B53E27A1FA811E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>���+IDATx�b����|B�z�t $Z���Q���|� �z�&�4EIEND�B`�PKAA#]?�\��*system/helix3/assets/images/layout/444.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:F4BAE43D1FA811E4A9CCF17B15AF5A8C" xmpMM:DocumentID="xmp.did:F4BAE43E1FA811E4A9CCF17B15AF5A8C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:F4BAE43B1FA811E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:F4BAE43C1FA811E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>4��)IDATx�b��#�-�U�@���Y(q٨�G]N=�*a&t�J/IEND�B`�PKAA#]Զ�1��)system/helix3/assets/images/layout/39.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:E0624EA81FA811E4A9CCF17B15AF5A8C" xmpMM:DocumentID="xmp.did:E0624EA91FA811E4A9CCF17B15AF5A8C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:E0624EA61FA811E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:E0624EA71FA811E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�I�|(IDATx�b�������X�1ఀb�G]>��A�r��� ".eRIEND�B`�PKAA#]�����+system/helix3/assets/images/layout/3333.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:F4BAE4391FA811E4A9CCF17B15AF5A8C" xmpMM:DocumentID="xmp.did:F4BAE43A1FA811E4A9CCF17B15AF5A8C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:F4BAE4371FA811E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:F4BAE4381FA811E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>����%IDATx�b����)g�n6u5\8��Q�S.`��#D���IEND�B`�PKAA#]_B{���)system/helix3/assets/images/layout/12.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:1C566C081FA911E4A9CCF17B15AF5A8C" xmpMM:DocumentID="xmp.did:1C566C091FA911E4A9CCF17B15AF5A8C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:1C566C061FA911E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:1C566C071FA911E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�|]sIDATx�b�4,@�HK�G]>��A�r��RD��IEND�B`�PKAA#]2�i��*system/helix3/assets/images/layout/210.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:9B53E2771FA811E4A9CCF17B15AF5A8C" xmpMM:DocumentID="xmp.did:9B53E2781FA811E4A9CCF17B15AF5A8C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:8B3B48441FA711E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:9B53E2761FA811E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>Hkks'IDATx�b����|��@4�f���G]>\`�� "��|$IEND�B`�PKAA#]XW��-system/helix3/assets/images/layout/custom.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<�iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c067 79.157747, 2015/03/30-23:40:42 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:1C566C091FA911E4A9CCF17B15AF5A8C" xmpMM:DocumentID="xmp.did:44DE533D0FF411E5A433B05D68476CDB" xmpMM:InstanceID="xmp.iid:44DE533C0FF411E5A433B05D68476CDB" xmp:CreatorTool="Adobe Photoshop CC 2014 (Macintosh)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:f4ab5f41-db1f-4884-a06d-5a926b903ee3" stRef:documentID="adobe:docid:photoshop:38f93263-f553-1177-b8d0-b56cf9d19f62"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>j�a�IDATx�b������/X�1�a�����, �ľ8�1�a�f#��X��p�a��7�Ci ��6@��?�6|"�rN �b1 �bV�%�@��p�]�j��@l��x?���?v��7�k ��!��|��@�OjA�e:0�r��x6�IEND�B`�PKAA#]��UX��*system/helix3/assets/images/layout/282.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:DocumentID="xmp.did:A5F63B01AD6611E4B1CE850DA39C213E" xmpMM:InstanceID="xmp.iid:A5F63B00AD6611E4B1CE850DA39C213E" xmp:CreatorTool="Adobe Photoshop CC 2014 (Macintosh)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:1C566C081FA911E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:1C566C091FA911E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>x2�{,IDATx�b�����ň�X���2�i��.u� p9@�*a&J��SIEND�B`�PKAA#]1%X�+system/helix3/assets/images/layout/2442.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:DocumentID="xmp.did:A5F63B05AD6611E4B1CE850DA39C213E" xmpMM:InstanceID="xmp.iid:A5F63B04AD6611E4B1CE850DA39C213E" xmp:CreatorTool="Adobe Photoshop CC 2014 (Macintosh)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:1C566C081FA911E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:1C566C091FA911E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�{i)IDATx�b����|t@�<#���,h.u�������#�ӧ#IEND�B`�PKAA#]������*system/helix3/assets/images/layout/237.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:DocumentID="xmp.did:04DE7D80AD0C11E4B1CE850DA39C213E" xmpMM:InstanceID="xmp.iid:04DE7D7FAD0C11E4B1CE850DA39C213E" xmp:CreatorTool="Adobe Photoshop CC 2014 (Macintosh)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:1C566C081FA911E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:1C566C091FA911E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>���,IDATx�b������H���bl0��(�G]>��A�r���&0���IEND�B`�PKAA#]y���)system/helix3/assets/images/layout/48.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:E0624EAC1FA811E4A9CCF17B15AF5A8C" xmpMM:DocumentID="xmp.did:F4BAE4361FA811E4A9CCF17B15AF5A8C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:E0624EAA1FA811E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:E0624EAB1FA811E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�BD�(IDATx�b��#��X�0��l�G]>��A�r�b� "�AcLIEND�B`�PKAA#]�u���-system/helix3/assets/images/layout/222222.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:DocumentID="xmp.did:601C3ABEAD6711E4B1CE850DA39C213E" xmpMM:InstanceID="xmp.iid:601C3ABDAD6711E4B1CE850DA39C213E" xmp:CreatorTool="Adobe Photoshop CC 2014 (Macintosh)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:1C566C081FA911E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:1C566C091FA911E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>6�*�%IDATx�b���T�3��M]�BM���|����Ԥ-��"IEND�B`�PKAA#]�����*system/helix3/assets/images/layout/255.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:DocumentID="xmp.did:A5F63AFDAD6611E4B1CE850DA39C213E" xmpMM:InstanceID="xmp.iid:A5F63AFCAD6611E4B1CE850DA39C213E" xmp:CreatorTool="Adobe Photoshop CC 2014 (Macintosh)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:1C566C081FA911E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:1C566C091FA911E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>RLj�,IDATx�b�������P�U�M34|��..0��&Qqq�IEND�B`�PKAA#]S�b���)system/helix3/assets/images/layout/57.pngnu�[����PNG IHDR ��KtEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155772, 2014/01/13-19:44:00 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:E0624EA41FA811E4A9CCF17B15AF5A8C" xmpMM:DocumentID="xmp.did:E0624EA51FA811E4A9CCF17B15AF5A8C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:E0624EA21FA811E4A9CCF17B15AF5A8C" stRef:documentID="xmp.did:E0624EA31FA811E4A9CCF17B15AF5A8C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�%'>(IDATx�b��#��@52iɆ��|���:� "�^DIEND�B`�PKAA#]���� � *system/helix3/assets/images/helix-logo.pngnu�[����PNG IHDR�(y,�tEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02 "> <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 CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:549AA464A39211E49D3E95DDE8F1E26F" xmpMM:DocumentID="xmp.did:13E2B5FAA39311E49D3E95DDE8F1E26F"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:549AA462A39211E49D3E95DDE8F1E26F" stRef:documentID="xmp.did:549AA463A39211E49D3E95DDE8F1E26F"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>O�}8IDATx��]}lE߫�?*ED �_� ��D�ENM4��T�`��&�QBk�D��&��m5��R[5 J5)F0 �p ��hN�Қ� �8��V�ݽ��>��y�/�;ofv��o�̼ٽ�E"#����y%v�@��Y9��ж톖!I��� !D����]f�>`.Hخi�mnnv�3l�I�j`��F�������Y��߸�hD�N>�v�j*y��f���ч\d8�]��]�J� `�6��L�&��S�tܬ���SB7Y�9���)�1�ת�/�I%F�K3m�lM7KL��(�<E?V���ϗ���5D������;��^��b���Ԯ�E�.�Q{��{����4?��Q@%�����9�o��F>6wo�����6��I�Q�|�`�g/X��U�V+� 7g�w�+����x�ؒf/Hc���6��<�Ѧ>M��{����R�B�@��1��ub���u6v��K+9��C#��l�w��:�刦]L/(�I��M�G�e6�=��M@�o6/�s)�!M�~�.�W$Pvʮ�H�ߙF/HB+S9�{l�v�0&u!5�l��Fޘ�&�B�s�E�-�������e"�K��i)��ݼ?x��?C�M�hd�ˉ7 ��3�����|�U(vy��V {�q�"��՜L��U��I�4�=^��X�l��;: ����29��ϟ@�E��)n�R�"%-���L���"ާ��L���s�7;�0e� �s��uY���Y�)����9SJ}����i��#��+e��ȿK�_�NԀ�"�r�s�{4�iQne*���2�GOg+@�]A�+<u�hPm�16��v�L�Ǟ$4��%t�r�CYz�n9p/�^ΐy9ϛPx�m@A�ifz��k�O� �>�{�{)=�yq�m�(7%�|�v���x�D�n�됗ׯ�����(m�i��C��ڄnJ,�Cȿ'�V�p ّ�1�����irR�6����樹J���L`5�Ba�y@����#��\�K ^g�<��t�x@;�s��^�鯋v�)e�xO��F�U�����-^�rZ+��BP��v?�P| �����威�V ���1y�rac��mFt�Z��8��>`�W��|Ćx��JZ���F!�o���[���&��v: b|ԭ�v��E���?�I��>� }�ә�vg����v�XI;�*#�.I���|�~���D� �f��(sL�)�!_B=}�u�'�GN�ˢ�b��$��Ꮼ��]��<�6�NT�=�7c������^���#O��c���PK���@4��c\~ {�dNP����'y�;;�����(�v�:-ij�b��q��#�T�e��*�1-�j,tM@Xrހ�9�Dz�\��vAY��j��P���:�S��{��w��|�$`�I�7��o1�% ���� Eln~��|�I$&c����n��AJ�5D�}��ʇɋ���Ҕ��Qgf��*9��g��p3����%���r䠿.&s�uj;�wp��pj�y��C_T�:U�s���6�n�tF�k� �:���l������z���ʚ��̤0�-�ޫ,�&>J�3ߢ bz*��שR�����ʄ}X�i�:���b��[�b�R=�24�t�M6c݀E=���A��i���ªۣ�lw�~���y�<���^���*Tw�9��!�k1���zu��30��D=`a,��,���e}>{���BJHѕ� ��$F��8�����:�b�T��Ԓ��Jj��W����\0s�Ӡ ���'�^���͝�IEND�B`�PKAA#]�{���)system/helix3/assets/images/select-bg.svgnu�[���<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1854.54 295" preserveAspectRatio="xMinYMid" width="1854.54" height="295"><path d="M1825.1,145.7l6.9,6.9c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3-0.1l6.9-6.9c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3l-0.7-0.7c-0.1-0.1-0.2-0.1-0.3-0.1s-0.2,0-0.3,0.1l-5.8,5.8l-5.8-5.8c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.2,0-0.3,0.1l-0.7,0.7c-0.1,0.1-0.1,0.2-0.1,0.3C1824.9,145.5,1825,145.6,1825.1,145.7z" fill="#000"/><rect width="1810" height="295" fill="#fff"/></svg> PKAA#]V�oG G !system/helix3/assets/js/helper.jsnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ (function ($) { $.fn.rowSortable = function () { $(this) .sortable({ placeholder: "ui-state-highlight", forcePlaceholderSize: true, axis: "x", opacity: 0.8, tolerance: "pointer", start: function (event, ui) { $(".layoutbuilder-section .row") .find(".ui-state-highlight") .addClass($(ui.item).attr("class")); $(".layoutbuilder-section .row") .find(".ui-state-highlight") .css("height", $(ui.item).outerHeight()); }, }) .disableSelection(); }; //Random number function random_number() { return randomFromInterval(1, 1e6); } function randomFromInterval(e, t) { return Math.floor(Math.random() * (t - e + 1) + e); } $.fn.randomIds = function () { //Media $(this) .find(".media") .each(function () { var $id = random_number(); $(this) .find(".input-media") .attr("id", "media-" + $id); //Preview $(this) .find(".image-preview") .attr("id", "media-" + $id + "_preview_img"); $(this) .find(".image-preview") .find("img") .attr("id", "media-" + $id + "_preview"); $(this) .find("a.modal") .attr( "href", "index.php?option=com_media&view=images&tmpl=component&fieldid=" + "media-" + $id, ); $(this) .find("a.remove-media") .attr( "onClick", "jInsertFieldValue('', 'media-" + $id + "'); return false;", ); $(this) .find("a.remove-media") .on("click", function () { $(this).closest(".media").find(".input-media").val(""); }); }); //Re-initialize modal SqueezeBox.assign($(this).find("a.modal"), { parse: "rel", }); }; //remove ids $.fn.cleanRandomIds = function () { //Media $(this) .find(".media") .each(function () { $(this).find(".input-media").removeAttr("id"); //Preview $(this).find(".image-preview").removeAttr("id"); $(this).find(".image-preview").find("img").removeAttr("id"); $(this).find("a.modal").removeAttr("href"); $(this).find("a.remove-media").removeAttr("onClick"); }); return $(this); }; })(jQuery); PKAA#]�!#��|�|2system/helix3/assets/js/jquery-ui.draggable.min.jsnu�[���/*! jQuery UI - v1.11.4 - 2015-08-11 * http://jqueryui.com * Includes: core.js, widget.js, mouse.js, draggable.js * Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ (function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",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}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var s=0,n=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,a=n.call(arguments,1),o=0,r=a.length;r>o;o++)for(i in a[o])s=a[o][i],a[o].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(a){var o="string"==typeof a,r=n.call(arguments,1),h=this;return o?this.each(function(){var i,n=e.data(this,s);return"instance"===a?(h=n,!1):n?e.isFunction(n[a])&&"_"!==a.charAt(0)?(i=n[a].apply(n,r),i!==n&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+a+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+a+"'")}):(r.length&&(a=e.widget.extend.apply(null,[a].concat(r))),this.each(function(){var t=e.data(this,s);t?(t.option(a||{}),t._init&&t._init()):e.data(this,s,new i(a,this))})),h}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=s++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var a=!1;e(document).mouseup(function(){a=!1}),e.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!a){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),a=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),a=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),e.widget("ui.draggable",e.ui.mouse,{version:"1.11.4",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.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.options;return this._blurActiveElement(t),this.helper||i.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=e(this);return e("<div>").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var i=this.document[0];if(this.handleElement.is(t.target))try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(s){}},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.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"===e(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._normalizeRightBottom(),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(e){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:e.pageX-this.offset.left,top:e.pageY-this.offset.top}},_mouseDrag:function(t,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.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.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper),n=s?e(i.helper.apply(this.element[0],[t])):"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(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?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 t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.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=e(n.containment),s=i[0],s&&(t=/(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),(t?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,(t?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(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.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:t.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(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(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,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-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:h-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.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_normalizeRightBottom:function(){"y"!==this.options.axis&&"auto"!==this.helper.css("right")&&(this.helper.width(this.helper.width()),this.helper.css("right","auto")),"x"!==this.options.axis&&"auto"!==this.helper.css("bottom")&&(this.helper.height(this.helper.height()),this.helper.css("bottom","auto"))},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=e.extend({},i,{item:s.element});s.sortables=[],e(s.options.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",t,n))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,e.each(s.sortables,function(){var e=this;e.isOver?(e.isOver=0,s.cancelHelperRemoval=!0,e.cancelHelperRemoval=!1,e._storedCSS={position:e.placeholder.css("position"),top:e.placeholder.css("top"),left:e.placeholder.css("left")},e._mouseStop(t),e.options.helper=e.options._helper):(e.cancelHelperRemoval=!0,e._trigger("deactivate",t,n))})},drag:function(t,i,s){e.each(s.sortables,function(){var n=!1,a=this;a.positionAbs=s.positionAbs,a.helperProportions=s.helperProportions,a.offset.click=s.offset.click,a._intersectsWith(a.containerCache)&&(n=!0,e.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==a&&this._intersectsWith(this.containerCache)&&e.contains(a.element[0],this.element[0])&&(n=!1),n})),n?(a.isOver||(a.isOver=1,s._parent=i.helper.parent(),a.currentItem=i.helper.appendTo(a.element).data("ui-sortable-item",!0),a.options._helper=a.options.helper,a.options.helper=function(){return i.helper[0]},t.target=a.currentItem[0],a._mouseCapture(t,!0),a._mouseStart(t,!0,!0),a.offset.click.top=s.offset.click.top,a.offset.click.left=s.offset.click.left,a.offset.parent.left-=s.offset.parent.left-a.offset.parent.left,a.offset.parent.top-=s.offset.parent.top-a.offset.parent.top,s._trigger("toSortable",t),s.dropped=a.element,e.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,a.fromOutside=s),a.currentItem&&(a._mouseDrag(t),i.position=a.position)):a.isOver&&(a.isOver=0,a.cancelHelperRemoval=!0,a.options._revert=a.options.revert,a.options.revert=!1,a._trigger("out",t,a._uiHash(a)),a._mouseStop(t,!0),a.options.revert=a.options._revert,a.options.helper=a.options._helper,a.placeholder&&a.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(t),i.position=s._generatePosition(t,!0),s._trigger("fromSortable",t),s.dropped=!1,e.each(s.sortables,function(){this.refreshPositions()}))})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,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(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left-s.margins.left,l=h+s.snapElements[c].width,u=s.snapElements[c].top-s.margins.top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable});PKAA#]�x ���"system/helix3/assets/js/spimage.jsnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery(function ($) { function helix3GetCsrfTokenName($context) { var tokenName = $context.data("csrf-name"); if (tokenName) { return tokenName; } var $tokenInput = $context .closest("form") .find('input[type="hidden"]') .filter(function () { return /^[a-f0-9]{32}$/.test(this.name); }) .first(); return $tokenInput.length ? $tokenInput.attr("name") : null; } function helix3AppendCsrfToken(data, $context) { var tokenName = helix3GetCsrfTokenName($context); if (tokenName) { if (data instanceof FormData) { data.append(tokenName, "1"); } else { data[tokenName] = "1"; } } return tokenName; } $(".sp-image-field").each(function (index, el) { var $field = $(el); // Upload form $field.find(".btn-sp-image-upload").on("click", function (event) { event.preventDefault(); $field.find(".sp-image-upload").click(); }); //Upload $field.find(".sp-image-upload").on("change", function (e) { e.preventDefault(); var $this = $(this); var file = $(this).prop("files")[0]; var data = new FormData(); data.append("option", "com_ajax"); data.append("plugin", "helix3"); data.append("action", "upload_image"); data.append("imageonly", false); data.append("format", "json"); if (file.type.match(/image.*/)) { data.append("image", file); helix3AppendCsrfToken(data, $field); $.ajax({ type: "POST", data: data, contentType: false, cache: false, processData: false, beforeSend: function () { $this.prop("disabled", true); $field.find(".btn-sp-image-upload").attr("disabled", "disabled"); var loader = $( '<div class="sp-image-item-loader"><i class="fa fa-circle-o-notch fa-spin"></i></div>', ); $field.find(".sp-image-upload-wrapper").html(loader); }, success: function (response) { var data = $.parseJSON(response); if (data.status) { $field.find(".sp-image-upload-wrapper").empty().html(data.output); } else { $field.find(".sp-image-upload-wrapper").empty(); alert(data.output); } var $image = $field.find(".sp-image-upload-wrapper").find(">img"); if ($image.length) { $field.find(".btn-sp-image-upload").addClass("hide"); $field.find(".btn-sp-image-remove").removeClass("hide"); $field.find(".form-field-spimage").val($image.data("src")); } else { $field.find(".btn-sp-image-upload").removeClass("hide"); $field.find(".btn-sp-image-remove").addClass("hide"); $field.find(".form-field-spimage").val(""); } $this.val(""); $this.prop("disabled", false); $field.find(".btn-sp-image-upload").removeAttr("disabled"); }, error: function () { $field.find(".sp-image-upload-wrapper").empty(); $this.val(""); }, }); } $this.val(""); }); }); // Delete Image $(document).on("click", ".btn-sp-image-remove", function (event) { event.preventDefault(); var $this = $(this); var $parent = $this.closest(".sp-image-field"); if ( confirm( "You are about to permanently delete this item. 'Cancel' to stop, 'OK' to delete.", ) == true ) { var request = { option: "com_ajax", plugin: "helix3", action: "remove_image", src: $parent.find(".sp-image-upload-wrapper").find(">img").data("src"), format: "json", }; helix3AppendCsrfToken(request, $parent); $.ajax({ type: "POST", data: request, success: function (response) { var data = $.parseJSON(response); if (data.status) { $parent.find(".sp-image-upload-wrapper").empty(); $parent.find(".btn-sp-image-upload").removeClass("hide"); $parent.find(".btn-sp-image-remove").addClass("hide"); $parent.find(".form-field-spimage").val(""); } else { alert(data.output); } }, }); } }); }); PKAA#]��� �"�")system/helix3/assets/js/menu.generator.jsnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery(function ($) { $("#attrib-spmegamenu") .find(".control-group") .first() .find(".control-label") .remove(); $("#attrib-spmegamenu") .find(".control-group") .first() .find(">.controls") .removeClass() .addClass("megamenu") .unwrap(); //Section Sortable callbck $.fn.sectionSort = function () { $(this) .sortable({ items: ".menu-section", placeholder: "menu-section-state-highlight", forcePlaceholderSize: true, opacity: 0.8, handle: ".row-move", distance: 0.5, tolerance: "pointer", start: function (event, ui) { ui.placeholder.height(ui.item.height()); }, }) .disableSelection(); }; $.fn.columnSort = function () { $(this) .sortable({ items: ".column", placeholder: "ui-state-highlight", opacity: 0.8, dropOnEmpty: true, distance: 0.5, tolerance: "pointer", start: function (event, ui) { var plus; if (ui.item.hasClass("sp-col-sm-1")) plus = "sp-col-sm-1"; else if (ui.item.hasClass("sp-col-sm-2")) plus = "sp-col-sm-2"; else if (ui.item.hasClass("sp-col-sm-3")) plus = "sp-col-sm-3"; else if (ui.item.hasClass("sp-col-sm-4")) plus = "sp-col-sm-4"; else if (ui.item.hasClass("sp-col-sm-5")) plus = "sp-col-sm-5"; else if (ui.item.hasClass("sp-col-sm-7")) plus = "sp-col-sm-7"; else if (ui.item.hasClass("sp-col-sm-8")) plus = "sp-col-sm-8"; else if (ui.item.hasClass("sp-col-sm-9")) plus = "sp-col-sm-9"; else if (ui.item.hasClass("sp-col-sm-10")) plus = "sp-col-sm-10"; else if (ui.item.hasClass("sp-col-sm-11")) plus = "sp-col-sm-11"; else if (ui.item.hasClass("sp-col-sm-12")) plus = "sp-col-sm-12"; else plus = "sp-col-sm-6"; ui.placeholder.addClass(plus); ui.placeholder.height(ui.item.height()); }, }) .disableSelection(); }; function mdouleSortable() { $(".modules-container").sortable({ connectWith: ".modules-container", items: ".draggable-module", placeholder: "ui-state-highlight", opacity: 0.8, dropOnEmpty: true, distance: 0.5, tolerance: "pointer", }); } $("#megamenulayout").sectionSort(); $(".spmenu").columnSort(); mdouleSortable(); $(".modules-list") .find(".draggable-module") .draggable({ connectToSortable: ".modules-container", items: ".draggable-module", helper: "clone", stop: function (event, ui) { mdouleSortable(); ui.helper.removeAttr("style"); }, }); // Menu Width $("#menuWidth").change(function () { var width = $("#menuWidth").val(); if (width >= 200) { $("#megamenulayout").css("width", width).data("width", width); } else { alert("Width can't be less than 200 Pixels"); $("#menuWidth").val($("#megamenulayout").data("width")); } }); // Mega menu alignment $(".action-bar").on("click", ".alignment", function (event) { event.preventDefault(); var $that = $(this); $(".alignment").removeClass("active"); $that.addClass("active"); $("#megamenulayout").data("menu_align", $(this).data("al_flag")); }); //Modal $(document).on("click", ".add-layout", function (event) { event.preventDefault(); $("#layout-modal").spmodal(); }); //Remove Module $(document).on("click", ".modules-container .fa-remove", function (event) { event.preventDefault(); var modules_container = $(this).closest(".modules-container"); $(this).closest(".draggable-module").remove(); if (!modules_container.find(".draggable-module").length) { modules_container.empty(); } }); $(".layout-reset").on("click", function (event) { event.preventDefault(); var $that = $(this); var data = { action: "resetLayout", layoutName: $that.data("current_item"), }; var request = { option: "com_ajax", plugin: "helix3", data: data, format: "raw", }; $.ajax({ type: "POST", data: request, dataType: "html", success: function (response) { if (response) { $("#megamenulayout").find(".menu-section").remove(); $("#megamenulayout").append(response); // sorting layout $("#megamenulayout").sectionSort(); $(".spmenu").columnSort(); mdouleSortable(); } }, }); }); // new layout generator $(document).on("click", "#layout-modal a", function (event) { event.preventDefault(); if ($(this).hasClass("active")) { return; } var $that = $(this), newLayoutData = $that.data("layout"), layoutDesign = $that.data("design"), $parent = $("#layout-modal"), oldLayout = $("#megamenulayout").data("menu_item"), newLayout = [12]; if (newLayoutData != 12) { newLayout = newLayoutData.split(","); } if (newLayout.length !== 1 && newLayout.length < oldLayout) { alert("You can't add small layout than default layout"); return; } var colHtml = []; var designString = $("#" + layoutDesign).html(); $("#megamenulayout") .find(".column-items-wrap") .each(function (i, val) { var $that = $(this); colHtml[i] = this.innerHTML; }); if (!String.prototype.format) { String.prototype.format = function () { var args = arguments; return this.replace(/{(\d+)}/g, function (match, number) { return typeof args[number] != "undefined" ? args[number] : '<div class="modules-container"></div>'; }); }; } if (newLayout.length === 1) { var html = ""; for (var i = 0; i < colHtml.length; i++) { html += colHtml[i]; } var newLayoutHtml = designString.format(html); } else { var newLayoutHtml = designString.format( colHtml[0], colHtml[1], colHtml[2], colHtml[3], colHtml[4], colHtml[5], ); } // Manage Modal layout $parent.find(".active").removeClass("active"); $parent.spmodal("hide"); $(this).addClass("active"); var $oldLayoutHtml = $("#megamenulayout").find(".menu-section"); $oldLayoutHtml.remove(); $("#megamenulayout").append(newLayoutHtml); if (newLayout.length === 1) { $("#megamenulayout").find(".modules-container").remove(); $("#megamenulayout") .find(".column-items-wrap") .append('<div class="modules-container"></div>'); } $("#megamenulayout").sectionSort(); $(".spmenu").columnSort(); mdouleSortable(); }); document.adminForm.onsubmit = function (event) { var layout = []; // Get each row data; $("#megamenulayout") .find(".spmenu") .each(function (index) { var $row = $(this), rowIndex = index; layout[rowIndex] = { type: "row", attr: [], }; // Get each column data; $row.find(".column").each(function (index) { var $column = $(this), colIndex = index, colGrid = $column.data("column"); layout[rowIndex].attr[colIndex] = { type: "column", colGrid: colGrid, menuParentId: "", moduleId: "", }; // get current child id var menuParentId = ""; $column.find("h4").each(function (index, el) { menuParentId += $(this).data("current_child") + ","; }); if (menuParentId) { menuParentId = menuParentId.slice(",", -1); layout[rowIndex].attr[colIndex].menuParentId = menuParentId; } // get modules id var moduleId = ""; $column.find(".draggable-module").each(function (index, el) { moduleId += $(this).data("mod_id") + ","; }); if (moduleId) { moduleId = moduleId.slice(",", -1); layout[rowIndex].attr[colIndex].moduleId = moduleId; } }); }); var initData = $("#megamenulayout").data(); var menumData = { width: initData.width, menuItem: initData.menu_item, menuAlign: initData.menu_align, layout: layout, }; var megamenu = 0, mega_lenght = $("#megamenulayout").find(".column").length; if (mega_lenght > 1) { megamenu = 1; } $("#jform_params_megamenu").val(megamenu); $("#jform_params_menulayout").val(JSON.stringify(menumData)); }; }); PKAA#]����<�<*system/helix3/assets/js/admin.layout.j4.jsnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery(function ($) { /* ---------- Load existing template ------------- */ $(document).on("click", ".layout-del-action", function (event) { event.preventDefault(); var $that = $(this), layoutName = $(".layoutlist select").val(), data = { action: $that.data("action"), layoutName: layoutName, }; if ( confirm( "Click Ok button to delete " + layoutName + ", Cancel to leave.", ) != true ) { return false; } if (data.action != "remove") { alert("You are doing somethings wrong."); } var request = { option: "com_ajax", plugin: "helix3", data: data, format: "json", }; $.ajax({ type: "POST", data: request, beforeSend: function () { $(".layout-del-action .fa-spin").show(); }, success: function (response) { var data = $.parseJSON(response.data), layouts = data.layout, tplHtml = ""; $("#jform_params_layoutlist").find("option").remove(); if (layouts.length) { for (var i = 0; i < layouts.length; i++) { tplHtml += '<option value="' + layouts[i] + '">' + layouts[i].replace(".json", "") + "</option>"; } $("#jform_params_layoutlist").html(tplHtml); } $(".layout-del-action .fa-spin").fadeOut("fast"); }, error: function () { alert("Somethings wrong, Try again"); $(".layout-del-action .fa-spin").fadeOut("fast"); }, }); return false; }); // Save new copy of layout $(document).on("click", ".layout-save-action", function (event) { $("#layout-modal").find(".sp-modal-body").empty(); $("#layout-modal .sp-modal-title").text("Save New Layout"); $("#layout-modal #save-settings").data("flag", "save-layout"); var $clone = $(".save-box").clone(true); $("#layout-modal").find(".sp-modal-body").append($clone); $("#layout-modal").spmodal(); }); // load layout from file $(".layoutlist select").change(function () { var $that = $(this), layoutName = $that.val(), data = { action: "load", layoutName: layoutName, }; if (layoutName == "" || layoutName == " ") { alert("You are doing somethings wrong."); } var request = { option: "com_ajax", plugin: "helix3", data: data, format: "raw", }; $.ajax({ type: "POST", data: request, dataType: "html", beforeSend: function () {}, success: function (response) { $("#helix-layout-builder").empty(); $("#helix-layout-builder").append(response).fadeIn("normal"); jqueryUiLayout(); }, }); return false; }); /********* Layout Builder JavaScript **********/ jqueryUiLayout(); function jqueryUiLayout() { $("#helix-layout-builder") .sortable({ placeholder: "ui-state-highlight", forcePlaceholderSize: true, axis: "y", opacity: 0.8, tolerance: "pointer", }) .disableSelection(); $(".layoutbuilder-section").find(".row").rowSortable(); } // setInputValue Callback Function $.fn.setInputValue = function (options) { if (this.attr("type") == "checkbox") { if (options.filed == "1") { this.attr("checked", "checked"); } else { this.removeAttr("checked"); } } else { this.val(options.filed); } if (this.data("attrname") == "column_type") { if (this.val() == "component") { $(".form-group.name").hide(); } } }; // callback function, return checkbox value $.fn.getInputValue = function () { if (this.attr("type") == "checkbox") { if (this.is(":checked")) { return "1"; } else { return "0"; } } else { return this.val(); } }; // color picker initialize $.fn.initColorPicker = function () { this.find(".minicolors").each(function () { $(this).minicolors({ control: "hue", position: "bottom", theme: "bootstrap", }); }); }; // Open Row settings Modal $(document).on("click", ".row-ops-set", function (event) { event.preventDefault(); $(".layoutbuilder-section").removeClass("row-active"); $parent = $(this).closest(".layoutbuilder-section"); $parent.addClass("row-active"); $("#layout-modal").find(".sp-modal-body").empty(); $("#layout-modal .sp-modal-title").text("Row Settings"); $("#layout-modal #save-settings").data("flag", "row-setting"); var $clone = $(".row-settings").clone(true); $clone.find(".sppb-color").each(function () { $(this).addClass("minicolors"); }); $clone = $("#layout-modal").find(".sp-modal-body").append($clone); $clone.find(".addon-input").each(function () { var $that = $(this), attrValue = $parent.data($that.data("attrname")); $that.setInputValue({ filed: attrValue }); }); $clone.initColorPicker(); $("#layout-modal").spmodal(); }); // Open Column settings Modal $(document).on("click", ".col-ops-set", function (event) { event.preventDefault(); $(".layout-column").removeClass("column-active"); $parent = $(this).closest(".layout-column"); $parent.addClass("column-active"); $("#layout-modal").find(".sp-modal-body").empty(); $("#layout-modal .sp-modal-title").text("Column Settings"); $("#layout-modal #save-settings").data("flag", "col-setting"); var $clone = $(".column-settings").clone(true); $clone.find(".sppb-color").each(function () { $(this).addClass("minicolors"); }); $clone = $("#layout-modal").find(".sp-modal-body").append($clone); var comFlug = false; $clone.find(".addon-input").each(function () { var $that = $(this), $attrname = $that.data("attrname"), attrValue = $parent.data($attrname); if ($attrname == "column_type" && attrValue == "1") { comFlug = true; } else if ($attrname == "name" && comFlug == true) { $that.closest(".form-group").slideUp("fast"); } $that.setInputValue({ filed: attrValue }); }); $clone.initColorPicker(); $("#layout-modal").spmodal(); }); $(".input-column_type").change(function (event) { var $parent = $(this).closest(".column-settings"), flag = false; $("#helix-layout-builder") .find(".layout-column") .not(".column-active") .each(function (index, val) { if ($(this).data("column_type") == "1") { flag = true; return false; } }); if (flag) { alert("Component Area Taken"); $(this).prop("checked", false); $parent.children(".form-group.name").slideDown("400"); return false; } if ($(this).is(":checked")) { $parent.children(".form-group.name").slideUp("400"); } else { $parent.children(".form-group.name").slideDown("400"); } }); // Save Row Column Settings $(document).on("click", "#save-settings", function (event) { event.preventDefault(); var flag = $(this).data("flag"); switch (flag) { case "row-setting": $("#layout-modal") .find(".addon-input") .each(function () { var $this = $(this), $parent = $(".row-active"), $attrname = $this.data("attrname"); $parent.removeData($attrname); if ($attrname == "name") { var nameVal = $this.val(); if (nameVal != "" || $this.val() != null) { $(".row-active .section-title").text($this.val()); } else { $(".row-active .section-title").text("Section Header"); } } $parent.attr("data-" + $attrname, $this.getInputValue()); }); break; case "col-setting": var component = false; $("#layout-modal") .find(".addon-input") .each(function () { var $this = $(this), $parent = $(".column-active"), $attrname = $this.data("attrname"); ($parent.removeData($attrname), (dataVal = $this.val())); if ($attrname == "column_type" && $(this).is(":checked")) { component = true; $(".column-active .col-title").text("Component"); } else if ($attrname == "name" && component != true) { if (dataVal == "" || dataVal == undefined) { dataVal = "none"; } $(".column-active .col-title").text(dataVal); } $parent.attr("data-" + $attrname, $this.getInputValue()); }); break; case "save-layout": var layoutName = $("#layout-modal .addon-input").val(), data = { action: "save", layoutName: layoutName, content: JSON.stringify(getGeneratedLayout()), }; if (layoutName == "" || layoutName == " ") { alert("Without Name Layout Can't be save"); return false; } var request = { option: "com_ajax", plugin: "helix3", data: data, format: "json", }; $.ajax({ type: "POST", data: request, beforeSend: function () {}, success: function (response) { var data = $.parseJSON(response.data), layouts = data.layout, tplHtml = ""; $("#jform_params_layoutlist").find("option").remove(); if (layouts.length) { for (var i = 0; i < layouts.length; i++) { tplHtml += '<option value="' + layouts[i] + '">' + layouts[i].replace(".json", "") + "</option>"; } $("#jform_params_layoutlist").html(tplHtml); } }, error: function () { alert("Somethings wrong, Try again"); }, }); break; default: alert("You are doing somethings wrongs. Try again"); } }); // Column Layout Arrange $(document).on("click", ".column-layout", function (event) { event.preventDefault(); var $that = $(this), colType = $that.data("type"), column; if ($that.hasClass("active") && colType != "custom") { return; } if (colType == "custom") { column = prompt( "Enter your custom layout like 4,2,2,2,2 as total 12 grid", "4,2,2,2,2", ); } var $parent = $that.closest(".column-list"), $gparent = $that.closest(".layoutbuilder-section"), oldLayoutData = $parent.find(".active").data("layout"), oldLayout = ["12"], layoutData = $that.data("layout"), newLayout = ["12"]; if (oldLayoutData != 12) { oldLayout = oldLayoutData.split(","); } if (layoutData != 12) { newLayout = layoutData.split(","); } if (colType == "custom") { var error = true; if (column != null) { var colArray = column.split(","); var colSum = colArray.reduce(function (a, b) { return Number(a) + Number(b); }); if (colSum == 12) { newLayout = colArray; $(this).data("layout", column); error = false; } } if (error) { alert( "Error generated. Please correct your column arragnement and try again.", ); return false; } } var col = [], colAttr = []; $gparent.find(".layout-column").each(function (i, val) { col[i] = $(this).html(); var colData = $(this).data(); if (typeof colData == "object") { colAttr[i] = $(this).data(); } else { colAttr[i] = ""; } }); $parent.find(".active").removeClass("active"); $that.addClass("active"); var new_item = ""; for (var i = 0; i < newLayout.length; i++) { var dataAttr = ""; if (typeof colAttr[i] == "object") { $.each(colAttr[i], function (index, value) { dataAttr += " data-" + index + '="' + value + '"'; }); } new_item += '<div class="layout-column col-sm-' + newLayout[i].trim() + '" ' + dataAttr + ">"; if (col[i]) { new_item += col[i]; } else { new_item += '<div class="column"> <h6 class="col-title pull-left">None</h6> <a class="col-ops-set pull-right" href="#" ><i class="fa fa-gears"></i></a></div>'; } new_item += "</div>"; } $old_column = $gparent.find(".layout-column"); $gparent.find(".row.ui-sortable").append(new_item); $old_column.remove(); jqueryUiLayout(); }); // add row $(document).on("click", ".add-row", function (event) { event.preventDefault(); var $parent = $(this).closest(".layoutbuilder-section"), $rowClone = $("#layoutbuilder-section").clone(true); $rowClone.addClass("layoutbuilder-section").removeAttr("id"); $($rowClone).insertAfter($parent); jqueryUiLayout(); }); // Remove Row $(document).on("click", ".remove-row", function (event) { event.preventDefault(); if (confirm("Click Ok button to delete Row, Cancel to leave.") == true) { $(this) .closest(".layoutbuilder-section") .slideUp(500, function () { $(this).remove(); }); } }); // Generate Layout JSON function getGeneratedLayout() { var item = []; $("#helix-layout-builder") .find(".layoutbuilder-section") .each(function (index) { var $row = $(this), rowIndex = index, rowObj = $row.data(); delete rowObj.sortableItem; var activeLayout = $row.find(".column-layout.active"), layoutArray = activeLayout.data("layout"), layout = 12; if (layoutArray != 12) { layout = layoutArray.split(",").join(""); } item[rowIndex] = { type: "row", layout: layout, settings: rowObj, attr: [], }; // Find Column Elements $row.find(".layout-column").each(function (index) { var $column = $(this), colIndex = index, className = $column.attr("class"), colObj = $column.data(); delete colObj.sortableItem; item[rowIndex].attr[colIndex] = { type: "sp_col", className: className, settings: colObj, }; }); }); return item; } //On Submit document.adminForm.onsubmit = function (event) { //WebFonts $(".webfont").each(function () { var $that = $(this), webfont = { fontFamily: $that.find(".list-font-families").val(), fontWeight: $that.find(".list-font-weight").val(), fontSubset: $that.find(".list-font-subset").val(), fontSize: $that.find(".webfont-size").val(), }; $that.find(".input-webfont").val(JSON.stringify(webfont)); }); //Generate Layout $("#jform_params_layout").val(JSON.stringify(getGeneratedLayout())); }; }); PKAA#]G����$system/helix3/assets/js/spgallery.jsnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery(function ($) { function helix3GetCsrfTokenName($context) { var tokenName = $context.data("csrf-name"); if (tokenName) { return tokenName; } var $tokenInput = $context .closest("form") .find('input[type="hidden"]') .filter(function () { return /^[a-f0-9]{32}$/.test(this.name); }) .first(); return $tokenInput.length ? $tokenInput.attr("name") : null; } function helix3AppendCsrfToken(data, $context) { var tokenName = helix3GetCsrfTokenName($context); if (tokenName) { if (data instanceof FormData) { data.append(tokenName, "1"); } else { data[tokenName] = "1"; } } return tokenName; } $(".sp-gallery-field").each(function (index, el) { var $field = $(el); // Upload form $field.find(".btn-sp-gallery-item-upload").on("click", function (event) { event.preventDefault(); $field.find(".sp-gallery-item-upload").click(); }); //Sortable $field.find(".sp-gallery-items").sortable({ stop: function (event, ui) { // Set Value var images = []; $.each( $field.find(".sp-gallery-items").find(">li"), function (index, value) { images.push('"' + $(value).data("src") + '"'); }, ); var output = '{"' + $field.find(".form-field-spgallery").data("name") + '":[' + images + "]}"; $field.find(".form-field-spgallery").val(output); }, }); //Upload $field.find(".sp-gallery-item-upload").on("change", function (e) { e.preventDefault(); var $this = $(this); var file = $(this).prop("files")[0]; var data = new FormData(); data.append("option", "com_ajax"); data.append("plugin", "helix3"); data.append("action", "upload_image"); data.append("format", "json"); if (file.type.match(/image.*/)) { data.append("image", file); helix3AppendCsrfToken(data, $field); $.ajax({ type: "POST", data: data, contentType: false, cache: false, processData: false, beforeSend: function () { $this.prop("disabled", true); $field .find(".btn-sp-gallery-item-upload") .attr("disabled", "disabled"); var loader = $( '<li class="sp-gallery-item-loader"><i class="fa fa-circle-o-notch fa-spin"></i></li>', ); $this.prev(".sp-gallery-items").append(loader); }, success: function (response) { var data = $.parseJSON(response); if (data.status) { $field.find(".sp-gallery-item-loader").before(data.output); } else { alert(data.output); } $this.val(""); $this .prev(".sp-gallery-items") .find(".sp-gallery-item-loader") .remove(); $this.prop("disabled", false); $field.find(".btn-sp-gallery-item-upload").removeAttr("disabled"); var images = []; $.each( $field.find(".sp-gallery-items").find(">li"), function (index, value) { images.push('"' + $(value).data("src") + '"'); }, ); var output = '{"' + $field.find(".form-field-spgallery").data("name") + '":[' + images + "]}"; $(".form-field-spgallery").val(output); }, error: function () { $this .prev(".sp-gallery-items") .find(".sp-gallery-item-loader") .remove(); $this.val(""); }, }); } $this.val(""); }); }); // Delete Image $(document).on("click", ".btn-remove-image", function (event) { event.preventDefault(); var $this = $(this); if ( confirm( "You are about to permanently delete this item. 'Cancel' to stop, 'OK' to delete.", ) == true ) { var request = { option: "com_ajax", plugin: "helix3", action: "remove_image", src: $(this).parent().data("src"), format: "json", }; helix3AppendCsrfToken(request, $this.closest(".sp-gallery-field")); $.ajax({ type: "POST", data: request, success: function (response) { var data = $.parseJSON(response); if (data.status) { $this.parent().remove(); var images = []; $.each($(".sp-gallery-items").find(">li"), function (index, value) { images.push('"' + $(value).data("src") + '"'); }); var output = '{"' + $(".form-field-spgallery").data("name") + '":[' + images + "]}"; $(".form-field-spgallery").val(output); } else { alert(data.output); } }, }); } }); }); PKAA#]��66+system/helix3/assets/js/bootstrap.legacy.jsnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ (function ($) { // collapse var Collapse = function (element, options) { this.$element = $(element); this.options = $.extend({}, $.fn.collapse.defaults, options); if (this.options.parent) { this.$parent = $(this.options.parent); } this.options.toggle && this.toggle(); }; Collapse.prototype = { constructor: Collapse, dimension: function () { var hasWidth = this.$element.hasClass("width"); return hasWidth ? "width" : "height"; }, show: function () { var dimension, scroll, actives, hasData; if (this.transitioning || this.$element.hasClass("in")) return; dimension = this.dimension(); scroll = $.camelCase(["scroll", dimension].join("-")); actives = this.$parent && this.$parent.find("> .accordion-group > .in"); if (actives && actives.length) { hasData = actives.data("collapse"); if (hasData && hasData.transitioning) return; actives.collapse("hide"); hasData || actives.data("collapse", null); } this.$element[dimension](0); this.transition("addClass", $.Event("show"), "shown"); $.support.transition && this.$element[dimension](this.$element[0][scroll]); }, hide: function () { var dimension; if (this.transitioning || !this.$element.hasClass("in")) return; dimension = this.dimension(); this.reset(this.$element[dimension]()); this.transition("removeClass", $.Event("hide"), "hidden"); this.$element[dimension](0); }, reset: function (size) { var dimension = this.dimension(); this.$element.removeClass("collapse")[dimension](size || "auto")[0] .offsetWidth; this.$element[size !== null ? "addClass" : "removeClass"]("collapse"); return this; }, transition: function (method, startEvent, completeEvent) { var that = this, complete = function () { if (startEvent.type == "show") that.reset(); that.transitioning = 0; that.$element.trigger(completeEvent); }; this.$element.trigger(startEvent); if (startEvent.isDefaultPrevented()) return; this.transitioning = 1; this.$element[method]("in"); $.support.transition && this.$element.hasClass("collapse") ? this.$element.one($.support.transition.end, complete) : complete(); }, toggle: function () { this[this.$element.hasClass("in") ? "hide" : "show"](); }, }; var old = $.fn.collapse; $.fn.collapse = function (option) { return this.each(function () { var $this = $(this), data = $this.data("collapse"), options = $.extend( {}, $.fn.collapse.defaults, $this.data(), typeof option == "object" && option, ); if (!data) $this.data("collapse", (data = new Collapse(this, options))); if (typeof option == "string") data[option](); }); }; $.fn.collapse.defaults = { toggle: true, }; $.fn.collapse.Constructor = Collapse; $.fn.collapse.noConflict = function () { $.fn.collapse = old; return this; }; $(document).on( "click.collapse.data-api", "[data-toggle=collapse]", function (e) { var $this = $(this), href, target = $this.attr("data-target") || e.preventDefault() || ((href = $this.attr("href")) && href.replace(/.*(?=#[^\s]+$)/, "")), //strip for ie7 option = $(target).data("collapse") ? "toggle" : $this.data(); $this[$(target).hasClass("in") ? "addClass" : "removeClass"]("collapsed"); $(target).collapse(option); }, ); })(jQuery); PKAA#]=#�I����(system/helix3/assets/js/jquery-ui.min.jsnu�[���/*! jQuery UI - v1.12.1 - 2016-09-14 * http://jqueryui.com * Includes: widget.js, position.js, data.js, disable-selection.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, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.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(m.inline?m.dpDiv.parent()[0]:m.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 h=0,l=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={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][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:h,widgetName:e,widgetFullName:l}),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=l.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=l.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=h++,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 h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,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/,h=/top|center|bottom/,l=/[\+\-]\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"]):h.test(i[0])?["center"].concat(i):["center","center"]),i[0]=r.test(i[0])?i[0]:"center",i[1]=h.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.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,h=t(this),l=h.outerWidth(),c=h.outerHeight(),d=i(this,"marginLeft"),_=i(this,"marginTop"),x=l+d+i(this,"marginRight")+y.width,C=c+_+i(this,"marginBottom")+y.height,D=t.extend({},m),I=e(k.my,h.outerWidth(),h.outerHeight());"right"===n.my[0]?D.left-=l:"center"===n.my[0]&&(D.left-=l/2),"bottom"===n.my[1]?D.top-=c:"center"===n.my[1]&&(D.top-=c/2),D.left+=I[0],D.top+=I[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:l,elemHeight:c,collisionPosition:s,collisionWidth:x,collisionHeight:C,offset:[u[0]+I[0],u[1]+I[1]],my:n.my,at:n.at,within:b,elem:h})}),n.using&&(r=function(t){var e=g.left-D.left,i=e+p-l,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:h,left:D.left,top:D.top,width:l,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>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)}),h.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,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l: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,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l: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,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,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-h,(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,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,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-h,(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")}});var c="ui-effects-",u="ui-effects-style",d="ui-effects-animated",p=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=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].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*)/,h=[{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]]}}],l=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=l.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}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){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,h],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 l?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=l(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=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(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()}}),l.fn.parse.prototype=l.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),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(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,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(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=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[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))),l[i.idx]=n,this[h](l)))})})}),l.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=l(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(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.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"}}(p),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)&&(p.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 h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.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(),l=l.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.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(d)||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(c+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(c+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(u,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(u)||"",t.removeData(u)},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(c+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=c+"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(d),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(h)&&h.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=c.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[l](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===l:"show"===l)?(r[l](),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",h=s.complete,l=s.mode,c=[],u=function(e){var i=t(this),s=t.effects.mode(i,l)||o;i.data(d,!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?l?this[l](s.duration,h):this.each(function(){h&&h.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,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,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-h,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 f=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)},h=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),h&&h.css(t.effects.clipToBox(r)),r.clip=a),h&&h.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,h="hide"===r,l="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(l||h?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),l&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),h&&(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=h?2*u:u/2;h&&(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,h=r||"horizontal"===a,l=r||"vertical"===a;s=o.cssClip(),n.clip={top:l?(s.bottom-s.top)/2:s.top,right:h?(s.right-s.left)/2:s.right,bottom:l?(s.bottom-s.top)/2:s.bottom,left:h?(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",h="up"===r||"down"===r?"top":"left",l="up"===r||"left"===r?"-=":"+=",c="+="===l?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===h?"outerHeight":"outerWidth"](!0)/2,u[h]=l+s,a&&(n.css(u),u[h]=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,h,l,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(h=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,l=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?l*_:0),top:h+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:l*_),top:h+(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,h=/([0-9]+)%/.exec(r),l=!!e.horizFirst,c=l?["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;h&&(r=parseInt(h[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"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],l=["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,h,n.from.y,_),v=t.effects.setTransition(a,h,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,l,n.from.x,_),v=t.effects.setTransition(a,l,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)&&(h=h.concat(["marginTop","marginBottom"]).concat(r),l=l.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,h,n.from.y,o),a=t.effects.setTransition(i,h,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,l,n.from.x,o),a=t.effects.setTransition(i,l,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,h=2*(e.times||5)+(r?1:0),l=e.duration/h,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);h>u;u++)s.animate({opacity:c},l,e.easing),c=1-c;s.animate({opacity:c},l,e.easing),s.queue(i),t.effects.unshift(s,d,h+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,h=2*r+1,l=Math.round(e.duration/h),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,l,e.easing);r>s;s++)n.animate(p,l,e.easing).animate(f,l,e.easing);n.animate(p,l,e.easing).animate(d,l/2,e.easing).queue(i),t.effects.unshift(n,g,h+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,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u=e.distance||o["top"===l?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[l],d[l]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[h][1]]=d.clip[a[h][0]],"show"===r&&(o.cssClip(d.clip),o.css(l,d[l]),d.clip=s,d[l]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var f;t.uiBackCompat!==!1&&(f=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)})),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(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(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?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.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],h=r&&n.collapsible,l=h?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:h?t():a,newPanel:l};e.preventDefault(),r&&!n.collapsible||this._trigger("beforeActivate",e,u)===!1||(n.active=h?!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,h=t.css("box-sizing"),l=t.length&&(!e.length||t.index()<e.index()),c=this.options.animate||{},u=l&&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"===h&&(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.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.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,h=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=h.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=h.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 g=/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 h=n[s]("widget");t.data(h[0],"ui-controlgroup-data",o?o:n[s]("instance")),i.push(h[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(g,"")),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 m;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,h,l,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||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,c=document.documentElement.scrollLeft||document.body.scrollLeft,u=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+c,l/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(),m===n&&(m=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,h,l=this._getInst(e);return 2===arguments.length&&"string"==typeof i?"defaults"===i?t.extend({},t.datepicker._defaults):l?"all"===i?t.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),o=this._getDateDatepicker(e,!0),r=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),a(l.settings,n),null!==r&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,r)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(e):this._enableDatepicker(e)),this._attachments(t(e),l),this._autoSize(l),this._setDate(l,o),this._updateAlternate(l),this._updateDatepicker(l)),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,h,l,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}),h={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),h=t.datepicker._checkOffset(s,h,r),s.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?"static":r?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),s.inline||(l=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[l]?s.dpDiv.show(l,t.datepicker._get(s,"showOptions"),c):s.dpDiv[l||"show"](l?c:null),t.datepicker._shouldFocusInput(s)&&s.input.trigger("focus"),t.datepicker._curInst=s)) }},_updateDatepicker:function(e){this.maxRows=4,m=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,h=document.documentElement.clientWidth+(s?0:t(document).scrollLeft()),l=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>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+o>l&&l>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,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,c="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,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(h).match(o);if(!a)throw"Missing number at position "+h;return h+=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(h,s.length).toLowerCase()===s.toLowerCase()?(o=e[0],h+=s.length,!1):void 0}),-1!==o)return o+1;throw"Unknown name at position "+h},x=function(){if(i.charAt(h)!==e.charAt(n))throw"Unexpected literal at position "+h;h++};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>h&&(a=i.substr(h),!/^\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,h=function(e){var i=t.length>s+1&&t.charAt(s+1)===e;return i&&s++,i},l=function(t,e,i){var s=""+e;if(h(t))for(;i>s.length;)s="0"+s;return s},c=function(t,e,i,s){return h(t)?s[e]:i[e]},u="",d=!1;if(e)for(s=0;t.length>s;s++)if(d)"'"!==t.charAt(s)||h("'")?u+=t.charAt(s):d=!1;else switch(t.charAt(s)){case"d":u+=l("d",e.getDate(),2);break;case"D":u+=c("D",e.getDay(),n,o);break;case"o":u+=l("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+=l("m",e.getMonth()+1,2);break;case"M":u+=c("M",e.getMonth(),a,r);break;case"y":u+=h("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"'":h("'")?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(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":a+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a));break;case"y":case"Y":o+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a))}l=h.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,h,l,c,u,d,p,f,g,m,_,v,b,y,w,k,x,C,D,I,T,P,M,S,H,z,O,A,N,W,E,F,L,R=new Date,B=this._daylightSavingAdjust(new Date(R.getFullYear(),R.getMonth(),R.getDate())),Y=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"),$=this._get(t,"stepMonths"),X=1!==U[0]||1!==U[1],G=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),Q=this._getMinMaxDate(t,"min"),J=this._getMinMaxDate(t,"max"),Z=t.drawMonth-V,te=t.drawYear;if(0>Z&&(Z+=12,te--),J)for(e=this._daylightSavingAdjust(new Date(J.getFullYear(),J.getMonth()-U[0]*U[1]+1,J.getDate())),e=Q&&Q>e?Q: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-$,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-"+(Y?"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-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(t,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(te,Z+$,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-"+(Y?"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-"+(Y?"w":"e")+"'>"+n+"</span></a>",a=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?G:B,a=K?this.formatDate(a,r,this._getFormatConfig(t)):a,h=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>",l=j?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(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>":"")+(Y?"":h)+"</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)),I=" ui-corner-all",T="",X){if(T+="<div class='ui-datepicker-group",U[1]>1)switch(C){case 0:T+=" ui-datepicker-group-first",I=" ui-corner-"+(Y?"right":"left");break;case U[1]-1:T+=" ui-datepicker-group-last",I=" ui-corner-"+(Y?"left":"right");break;default:T+=" ui-datepicker-group-middle",I=""}T+="'>"}for(T+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+I+"'>"+(/all|left/.test(I)&&0===k?Y?o:s:"")+(/all|right/.test(I)&&0===k?Y?s:o:"")+this._generateMonthYearHeader(t,Z,te,Q,J,k>0||C>0,f,g)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",P=u?"<th class='ui-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",w=0;7>w;w++)M=(w+c)%7,P+="<th scope='col'"+((w+c+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+d[M]+"'>"+p[M]+"</span></th>";for(T+=P+"</tr></thead><tbody>",S=this._getDaysInMonth(te,Z),te===t.selectedYear&&Z===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,S)),H=(this._getFirstDayOfMonth(te,Z)-c+7)%7,z=Math.ceil((H+S)/7),O=X?this.maxRows>z?this.maxRows:z:z,this.maxRows=O,A=this._daylightSavingAdjust(new Date(te,Z,1-H)),N=0;O>N;N++){for(T+="<tr>",W=u?"<td class='ui-datepicker-week-col'>"+this._get(t,"calculateWeek")(A)+"</td>":"",w=0;7>w;w++)E=m?m.apply(t.input?t.input[0]:null,[A]):[!0,""],F=A.getMonth()!==Z,L=F&&!v||!E[0]||Q&&Q>A||J&&A>J,W+="<td class='"+((w+c+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(A.getTime()===D.getTime()&&Z===t.selectedMonth&&t._keyEvent||b.getTime()===A.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!_?"":" "+E[1]+(A.getTime()===G.getTime()?" "+this._currentClass:"")+(A.getTime()===B.getTime()?" ui-datepicker-today":""))+"'"+(F&&!_||!E[2]?"":" title='"+E[2].replace(/'/g,"'")+"'")+(L?"":" data-handler='selectDay' data-event='click' data-month='"+A.getMonth()+"' data-year='"+A.getFullYear()+"'")+">"+(F&&!_?" ":L?"<span class='ui-state-default'>"+A.getDate()+"</span>":"<a class='ui-state-default"+(A.getTime()===B.getTime()?" ui-state-highlight":"")+(A.getTime()===G.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+"' href='#'>"+A.getDate()+"</a>")+"</td>",A.setDate(A.getDate()+1),A=this._daylightSavingAdjust(A);T+=W+"</tr>"}Z++,Z>11&&(Z=0,te++),T+="</tbody></table>"+(X?"</div>"+(U[0]>0&&C===U[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),x+=T}y+=x}return y+=l,t._keyEvent=!1,y},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var h,l,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(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,y+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",c=0;12>c;c++)(!h||c>=s.getMonth())&&(!l||n.getMonth()>=c)&&(y+="<option value='"+c+"'"+(c===e?" selected='selected'":"")+">"+r[c]+"</option>");y+="</select>"}if(v||(b+=y+(!o&&m&&_?"":" ")),!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&&_?"":" ")+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,h=this._get(t,"yearRange");return h&&(i=h.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.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var _=!1;t(document).on("mouseup",function(){_=!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(!_){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(),_=!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,_=!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.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]),h=t.pageX,l=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]&&(h=i[0]+this.offset.click.left),t.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),t.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,l=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((h-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,h=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&&(h=this.originalPageX),"x"===a.axis&&(l=this.originalPageY)),{top:l-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:h-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,h,l,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--)h=s.snapElements[d].left-s.margins.left,l=h+s.snapElements[d].width,c=s.snapElements[d].top-s.margins.top,u=c+s.snapElements[d].height,h-g>_||m>l+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(h-_),r=g>=Math.abs(l-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:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).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(h-m),r=g>=Math.abs(l-_),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:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-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.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,h=this._change[o];return this._updatePrevProperties(),h?(i=h.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,h,l=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,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.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,h=this.originalPosition.top+this.originalSize.height,l=/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&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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,h={width:i.size.width-r,height:i.size.height-a},l=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(h,c&&l?{top:c,left:l}:{}),{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,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.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]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.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,h=a.containerOffset,l=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=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.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-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.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(),h=a.outerWidth()-e.sizeDiff.width,l=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:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),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,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,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=h,_&&(p+=l),v&&(f+=c),g&&(p-=l),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-l)&&(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-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable,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(" ")},_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(),h=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"+(h>=0?"+":"")+h,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.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)&&v(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 v=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,h=a+e.helperProportions.height,l=i.offset.left,c=i.offset.top,u=l+i.proportions().width,d=c+i.proportions().height;switch(s){case"fit":return o>=l&&u>=r&&a>=c&&d>=h;case"intersect":return o+e.helperProportions.width/2>l&&u>r-e.helperProportions.width/2&&a+e.helperProportions.height/2>c&&d>h-e.helperProportions.height/2;case"pointer":return t(n.pageY,c,i.proportions().height)&&t(n.pageX,l,i.proportions().width);case"touch":return(a>=c&&d>=a||h>=c&&d>=h||c>a&&h>d)&&(o>=l&&u>=o||r>=l&&u>=r||l>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&&v(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=v(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.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.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,h=e.pageY;return o>r&&(i=r,r=o,o=i),a>h&&(i=h,h=a,a=i),this.helper.css({left:o,top:a,width:r-o,height:h-a}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),l=!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?l=!(c.left>r||o>c.right||c.top>h||a>c.bottom):"fit"===n.tolerance&&(l=c.left>o&&r>c.right&&c.top>a&&h>c.bottom),l?(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.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(" ")},_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,h,l,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"),h=o.offset(),l=!t(e.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:e.pageX-h.left-o.width()/2,top:e.pageY-h.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,h=this,l=this._animateOff?!1:r.animate,c={};this._hasMultipleValues()?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),c["horizontal"===h.orientation?"left":"bottom"]=i+"%",t(this).stop(1,1)[l?"animate":"css"](c,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"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)[l?"animate":"css"](c,r.animate),"min"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:100-i+"%"},r.animate),"min"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"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.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,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,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&&h>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=[],h=[],l=this._connectWith();if(l&&e)for(s=l.length-1;s>=0;s--)for(o=t(l[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&h.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(h.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=h.length-1;s>=0;s--)h[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,h,l,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,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,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> </td>",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,h,l,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]&&(h=this.items[s].item.offset()[a],l=!1,e[u]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(e[u]-h)&&(n=Math.abs(e[u]-h),o=this.items[s],this.direction=l?"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,h=/(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():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?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.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"),h=t(s).closest("li"),l=h.attr("aria-controls");e._isLocal(s)?(n=s.hash,a=n.substring(1),o=e.element.find(e._sanitizeSelector(n))):(a=h.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)),l&&h.data("ui-tabs-aria-controls",l),h.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,h=r?t():this._getPanelForTab(o),l=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:l,newTab:r?t():o,newPanel:h};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(),l.length||h.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),h.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},h=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),h(n,e)},1)}).fail(function(t,e){setTimeout(function(){h(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){l.of=t,a.is(":hidden")||a.position(l)}var o,a,r,h,l=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(),h=t("<div>").html(a.find(".ui-tooltip-content").html()),h.removeAttr("name").find("[name]").removeAttr("name"),h.removeAttr("id").find("[id]").removeAttr("id"),h.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(l.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});PKAA#]> �2��'system/helix3/assets/js/post-formats.jsnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery(function ($) { $(".post-formats input").on("click", function () { checkFormate(); }); function checkFormate() { var formate = $(".post-formats input:checked").attr("value"); if (formate == undefined) { formate = "standard"; } if (typeof formate != "undefined") { $( "#jform_attribs_gallery, #jform_attribs_audio, #jform_attribs_audio, #jform_attribs_video, #jform_attribs_link_title, #jform_attribs_link_url, #jform_attribs_quote_text, #jform_attribs_quote_author, #jform_attribs_post_status", ) .closest(".control-group") .hide(); if (formate == "video") { $("#jform_attribs_video").closest(".control-group").show(); } else if (formate == "gallery") { $("#jform_attribs_gallery").closest(".control-group").show(); } else if (formate == "audio") { $("#jform_attribs_audio").closest(".control-group").show(); } else if (formate == "link") { $("#jform_attribs_link_title").closest(".control-group").show(); $("#jform_attribs_link_url").closest(".control-group").show(); } else if (formate == "quote") { $("#jform_attribs_quote_text").closest(".control-group").show(); $("#jform_attribs_quote_author").closest(".control-group").show(); } else if (formate == "status") { $("#jform_attribs_post_status").closest(".control-group").show(); } } } $(document).ready(function () { checkFormate(); }); }); PKAA#]U "%%$system/helix3/assets/js/helper.j4.jsnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ (function ($) { $.fn.rowSortable = function () { $(this) .sortable({ placeholder: "ui-state-highlight", forcePlaceholderSize: true, axis: "x", opacity: 0.8, tolerance: "pointer", start: function (event, ui) { $(".layoutbuilder-section .row") .find(".ui-state-highlight") .addClass($(ui.item).attr("class")); $(".layoutbuilder-section .row") .find(".ui-state-highlight") .css("height", $(ui.item).outerHeight()); }, }) .disableSelection(); }; })(jQuery); PKAA#]YQ��A�A'system/helix3/assets/js/admin.layout.jsnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery(function ($) { $(document).ready(function () { $(this) .find("select") .each(function () { $(this).chosen("destroy"); }); }); //end ready /* ---------- Load existing template ------------- */ $(".form-horizontal").on("click", ".layout-del-action", function (event) { event.preventDefault(); var $that = $(this), layoutName = $(".layoutlist select").val(), data = { action: $that.data("action"), layoutName: layoutName, }; if ( confirm( "Click Ok button to delete " + layoutName + ", Cancel to leave.", ) != true ) { return false; } if (data.action != "remove") { alert("You are doing somethings wrong."); } var request = { option: "com_ajax", plugin: "helix3", data: data, format: "json", }; $.ajax({ type: "POST", data: request, beforeSend: function () { $(".layout-del-action .fa-spin").show(); }, success: function (response) { var data = $.parseJSON(response.data), layouts = data.layout, tplHtml = ""; $("#jform_params_layoutlist").find("option").remove(); if (layouts.length) { for (var i = 0; i < layouts.length; i++) { tplHtml += '<option value="' + layouts[i] + '">' + layouts[i].replace(".json", "") + "</option>"; } $("#jform_params_layoutlist").html(tplHtml); } $(".layout-del-action .fa-spin").fadeOut("fast"); }, error: function () { alert("Somethings wrong, Try again"); $(".layout-del-action .fa-spin").fadeOut("fast"); }, }); return false; }); // Save new copy of layout $(".form-horizontal").on("click", ".layout-save-action", function (event) { $("#layout-modal").find(".sp-modal-body").empty(); $("#layout-modal .sp-modal-title").text("Save New Layout"); $("#layout-modal #save-settings").data("flag", "save-layout"); var $clone = $(".save-box").clone(true); $("#layout-modal").find(".sp-modal-body").append($clone); $("#layout-modal").spmodal(); }); // load layout from file $(".layoutlist select") .chosen() .change(function () { var $that = $(this), layoutName = $that.val(), data = { action: "load", layoutName: layoutName, }; if (layoutName == "" || layoutName == " ") { alert("You are doing somethings wrong."); } var request = { option: "com_ajax", plugin: "helix3", data: data, format: "raw", }; $.ajax({ type: "POST", data: request, dataType: "html", beforeSend: function () {}, success: function (response) { $("#helix-layout-builder").empty(); $("#helix-layout-builder").append(response).fadeIn("normal"); jqueryUiLayout(); }, }); return false; }); /********* Lyout Builder JavaScript **********/ jqueryUiLayout(); function jqueryUiLayout() { $("#helix-layout-builder") .sortable({ placeholder: "ui-state-highlight", forcePlaceholderSize: true, axis: "y", opacity: 0.8, tolerance: "pointer", }) .disableSelection(); $(".layoutbuilder-section").find(".row").rowSortable(); } // setInputValue Callback Function $.fn.setInputValue = function (options) { if (this.attr("type") == "checkbox") { if (options.filed == "1") { this.attr("checked", "checked"); } else { this.removeAttr("checked"); } } else if (this.hasClass("input-media")) { if (options.filed) { $imgParent = this.parent(".media"); $imgParent.find("img.media-preview").each(function () { $(this).attr("src", layoutbuilder_base + options.filed); }); } this.val(options.filed); } else { this.val(options.filed); } if (this.data("attrname") == "column_type") { if (this.val() == "component") { $(".form-group.name").hide(); } } }; // callback function, return checkbox value $.fn.getInputValue = function () { if (this.attr("type") == "checkbox") { if (this.attr("checked")) { return "1"; } else { return "0"; } } else { return this.val(); } }; // color picker initialize $.fn.initColorPicker = function () { this.find(".minicolors").each(function () { $(this).minicolors({ control: "hue", position: "bottom", theme: "bootstrap", }); }); }; // Open Row settings Modal $(document).on("click", ".row-ops-set", function (event) { event.preventDefault(); $(".layoutbuilder-section").removeClass("row-active"); $parent = $(this).closest(".layoutbuilder-section"); $parent.addClass("row-active"); $("#layout-modal").find(".sp-modal-body").empty(); $("#layout-modal .sp-modal-title").text("Row Settings"); $("#layout-modal #save-settings").data("flag", "row-setting"); var $clone = $(".row-settings").clone(true); $clone.find(".sppb-color").each(function () { $(this).addClass("minicolors"); }); $clone = $("#layout-modal").find(".sp-modal-body").append($clone); $clone.find(".addon-input").each(function () { var $that = $(this), attrValue = $parent.data($that.data("attrname")); $that.setInputValue({ filed: attrValue }); }); $clone.initColorPicker(); $("#layout-modal").randomIds(); $clone.find("select").chosen({ allow_single_deselect: true, }); $("#layout-modal").spmodal(); }); // Open Column settings Modal $(document).on("click", ".col-ops-set", function (event) { event.preventDefault(); $(".layout-column").removeClass("column-active"); $parent = $(this).closest(".layout-column"); $parent.addClass("column-active"); $("#layout-modal").find(".sp-modal-body").empty(); $("#layout-modal .sp-modal-title").text("Column Settings"); $("#layout-modal #save-settings").data("flag", "col-setting"); var $clone = $(".column-settings").clone(true); $clone.find(".sppb-color").each(function () { $(this).addClass("minicolors"); }); $clone = $("#layout-modal").find(".sp-modal-body").append($clone); var comFlug = false; $clone.find(".addon-input").each(function () { var $that = $(this), $attrname = $that.data("attrname"), attrValue = $parent.data($attrname); if ($attrname == "column_type" && attrValue == "1") { comFlug = true; } else if ($attrname == "name" && comFlug == true) { $that.closest(".form-group").slideUp("fast"); } $that.setInputValue({ filed: attrValue }); }); $clone.initColorPicker(); $clone.find("select").chosen({ allow_single_deselect: true, }); $("#layout-modal").randomIds(); $("#layout-modal").spmodal(); }); $(".input-column_type").change(function (event) { var $parent = $(this).closest(".column-settings"), flag = false; $("#helix-layout-builder") .find(".layout-column") .not(".column-active") .each(function (index, val) { if ($(this).data("column_type") == "1") { flag = true; return false; } }); if (flag) { alert("Component Area Taken"); $(this).prop("checked", false); $parent.children(".form-group.name").slideDown("400"); return false; } if ($(this).attr("checked")) { $parent.children(".form-group.name").slideUp("400"); } else { $parent.children(".form-group.name").slideDown("400"); } }); // Save Row Column Settings $(document).on("click", "#save-settings", function (event) { event.preventDefault(); var flag = $(this).data("flag"); switch (flag) { case "row-setting": $("#layout-modal") .find(".addon-input") .each(function () { var $this = $(this), $parent = $(".row-active"), $attrname = $this.data("attrname"); $parent.removeData($attrname); if ($attrname == "name") { var nameVal = $this.val(); if (nameVal != "" || $this.val() != null) { $(".row-active .section-title").text($this.val()); } else { $(".row-active .section-title").text("Section Header"); } } if ($this.attr("type") == "checkbox") { console.log("Original " + $attrname, $this.val()); console.log($attrname, $this.getInputValue()); } $parent.attr("data-" + $attrname, $this.getInputValue()); }); break; case "col-setting": var component = false; $("#layout-modal") .find(".addon-input") .each(function () { var $this = $(this), $parent = $(".column-active"), $attrname = $this.data("attrname"); ($parent.removeData($attrname), (dataVal = $this.val())); if ($attrname == "column_type" && $(this).attr("checked")) { component = true; $(".column-active .col-title").text("Component"); } else if ($attrname == "name" && component != true) { if (dataVal == "" || dataVal == undefined) { dataVal = "none"; } $(".column-active .col-title").text(dataVal); } $parent.attr("data-" + $attrname, $this.getInputValue()); }); break; case "save-layout": var layoutName = $("#layout-modal .addon-input").val(), data = { action: "save", layoutName: layoutName, content: JSON.stringify(getGeneratedLayout()), }; if (layoutName == "" || layoutName == " ") { alert("Without Name Layout Can't be save"); return false; } var request = { option: "com_ajax", plugin: "helix3", data: data, format: "json", }; $.ajax({ type: "POST", data: request, beforeSend: function () {}, success: function (response) { var data = $.parseJSON(response.data), layouts = data.layout, tplHtml = ""; $("#jform_params_layoutlist").find("option").remove(); if (layouts.length) { for (var i = 0; i < layouts.length; i++) { tplHtml += '<option value="' + layouts[i] + '">' + layouts[i].replace(".json", "") + "</option>"; } $("#jform_params_layoutlist").html(tplHtml); } }, error: function () { alert("Somethings wrong, Try again"); }, }); break; default: alert("You are doing somethings wrongs. Try again"); } }); // Column Layout Arrange $(document).on("click", ".column-layout", function (event) { event.preventDefault(); var $that = $(this), colType = $that.data("type"), column; if ($that.hasClass("active") && colType != "custom") { return; } if (colType == "custom") { column = prompt( "Enter your custom layout like 4,2,2,2,2 as total 12 grid", "4,2,2,2,2", ); } var $parent = $that.closest(".column-list"), $gparent = $that.closest(".layoutbuilder-section"), oldLayoutData = $parent.find(".active").data("layout"), oldLayout = ["12"], layoutData = $that.data("layout"), newLayout = ["12"]; if (oldLayoutData != 12) { oldLayout = oldLayoutData.split(","); } if (layoutData != 12) { newLayout = layoutData.split(","); } if (colType == "custom") { var error = true; if (column != null) { var colArray = column.split(","); var colSum = colArray.reduce(function (a, b) { return Number(a) + Number(b); }); if (colSum == 12) { newLayout = colArray; $(this).data("layout", column); error = false; } } if (error) { alert( "Error generated. Please correct your column arragnement and try again.", ); return false; } } var col = [], colAttr = []; $gparent.find(".layout-column").each(function (i, val) { col[i] = $(this).html(); var colData = $(this).data(); if (typeof colData == "object") { colAttr[i] = $(this).data(); } else { colAttr[i] = ""; } }); $parent.find(".active").removeClass("active"); $that.addClass("active"); var new_item = ""; for (var i = 0; i < newLayout.length; i++) { var dataAttr = ""; if (typeof colAttr[i] == "object") { $.each(colAttr[i], function (index, value) { dataAttr += " data-" + index + '="' + value + '"'; }); } new_item += '<div class="layout-column col-sm-' + newLayout[i].trim() + '" ' + dataAttr + ">"; if (col[i]) { new_item += col[i]; } else { new_item += '<div class="column"> <h6 class="col-title pull-left">None</h6> <a class="col-ops-set pull-right" href="#" ><i class="fa fa-gears"></i></a></div>'; } new_item += "</div>"; } $old_column = $gparent.find(".layout-column"); $gparent.find(".row.ui-sortable").append(new_item); $old_column.remove(); jqueryUiLayout(); }); // add row $(document).on("click", ".add-row", function (event) { event.preventDefault(); var $parent = $(this).closest(".layoutbuilder-section"), $rowClone = $("#layoutbuilder-section").clone(true); $rowClone.addClass("layoutbuilder-section").removeAttr("id"); $($rowClone).insertAfter($parent); jqueryUiLayout(); }); // Remove Row $(document).on("click", ".remove-row", function (event) { event.preventDefault(); if (confirm("Click Ok button to delete Row, Cancel to leave.") == true) { $(this) .closest(".layoutbuilder-section") .slideUp(500, function () { $(this).remove(); }); } }); // Remove Media $(document).on("click", ".remove-media", function () { var $that = $(this), $imgParent = $that.parent(".media"); $imgParent.find("img.media-preview").each(function () { $(this).attr("src", ""); $(this).closest(".image-preview").css("display", "none"); }); }); // Generate Layout JSON function getGeneratedLayout() { var item = []; $("#helix-layout-builder") .find(".layoutbuilder-section") .each(function (index) { var $row = $(this), rowIndex = index, rowObj = $row.data(); delete rowObj.sortableItem; var activeLayout = $row.find(".column-layout.active"), layoutArray = activeLayout.data("layout"), layout = 12; if (layoutArray != 12) { layout = layoutArray.split(",").join(""); } item[rowIndex] = { type: "row", layout: layout, settings: rowObj, attr: [], }; // Find Column Elements $row.find(".layout-column").each(function (index) { var $column = $(this), colIndex = index, className = $column.attr("class"), colObj = $column.data(); delete colObj.sortableItem; item[rowIndex].attr[colIndex] = { type: "sp_col", className: className, settings: colObj, }; }); }); return item; } //On Submit document.adminForm.onsubmit = function (event) { //WebFonts $(".webfont").each(function () { var $that = $(this), webfont = { fontFamily: $that.find(".list-font-families").val(), fontWeight: $that.find(".list-font-weight").val(), fontSubset: $that.find(".list-font-subset").val(), fontSize: $that.find(".webfont-size").val(), }; $that.find(".input-webfont").val(JSON.stringify(webfont)); }); //Generate Layout $("#jform_params_layout").val(JSON.stringify(getGeneratedLayout())); }; }); PKAA#]����!�!(system/helix3/assets/js/admin.general.jsnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery(function ($) { "use strict"; $(".form-horizontal").addClass("helix-options"); $(document).ready(function () { /*Basic Fields*/ $("#details") .find(">.row-fluid") .find("hr") .first() .prev() .andSelf() .remove(); $("#jform_params___field1-lbl").parent().parent().remove(); $("#details").find(".control-group").unwrap(); $("#jform_client_id").parent().removeClass().hide(); /*Basic Fields*/ var childParentEngine = function () { var classes = new Array(); $("fieldset.parent, select.parent").each(function () { var eleclass = $(this).attr("class").split(/\s/g); var $key = $.inArray("parent", eleclass); if ($key != -1) { classes.push(eleclass[$key + 1]); } }); $("fieldset.parent, select.parent").each(function () { var parent = $(this); var eleclass = $(this).attr("class").split(/\s/g); var childClassName = ".child"; var conditionClassName = ""; var i; for (i = 0; i < eleclass.length; i++) { if ($.inArray(eleclass[i], classes) < 0) { continue; } else { var elecls = "." + eleclass[i]; $(childClassName + elecls) .parents(".control-group") .hide(); if ($(parent).prop("type") == "fieldset") { var selected = $(parent).find("input[type=radio]:checked"); var radios = $(parent).find("input[type=radio]"); var activeItems = conditionClassName + elecls + "_" + $(selected).val(); var childitem = $.trim(childClassName + elecls + activeItems); setTimeout(function () { $(childitem).parents(".control-group").show(); }, 100); $(radios).on("click", function (event) { $(childClassName + elecls) .parents(".control-group") .hide(); $( childClassName + elecls + conditionClassName + elecls + "_" + $.trim($(this).val()), ) .parents(".control-group") .fadeIn(); }); } else if ($(parent).prop("type") == "select-one") { var element = $(parent); var selected = $(parent).find("option:selected"); var option = $(parent).find("option"); var activeItems = conditionClassName + elecls + "_" + $(selected).val(); var childitem = $.trim(childClassName + elecls + activeItems); setTimeout(function () { $(childitem).parents(".control-group").show(); }, 100); $(element).on("change", function (event) { $(childClassName + elecls) .parents(".control-group") .hide(); $( childClassName + elecls + conditionClassName + elecls + "_" + $.trim($(this).val()), ) .parents(".control-group") .fadeIn(); }); } } } }); }; //end childParentEngine $(".info-labels").unwrap(); $(".group_separator").each(function () { $(this).parent().prev().remove(); $(this).parent().parent().addClass("group-separator"); $(this).unwrap(); }); //Presets $(".preset").parent().unwrap().prev().remove(); $(".preset").parent().removeClass("controls").addClass("presets clearfix"); //Load Preset $("#attrib-preset") .find(".preset-control") .each(function () { if ($(this).hasClass(current_preset)) { $(this).closest(".control-group").show(); } else { $(this).closest(".control-group").hide(); } }); //Change Preset $(".preset").on("click", function (event) { event.preventDefault(); var $that = $(this); $(".preset").removeClass("active"); $(this).addClass("active"); $("#attrib-preset") .find(".preset-control") .each(function () { if ($(this).hasClass($that.data("preset"))) { $(this).closest(".control-group").fadeIn(); } else { $(this).closest(".control-group").hide(); } }); $("#template-preset").val($that.data("preset")); }); //Change Preset $(document).on("blur", ".preset-control", function (event) { event.preventDefault(); var active_preset = $(".preset.active").data("preset"); if ($(this).attr("id") == "jform_params_" + active_preset + "_major") { $(".preset.active").css("background-color", $(this).val()); } }); //Template Information $("#jform_template") .closest(".control-group") .appendTo($(".form-inline.form-inline-header")); $("#jform_home") .closest(".control-group") .appendTo($(".form-inline.form-inline-header")); $(".info-labels").next().appendTo($("#sp-theme-info")); $(".info-labels").prev().addBack().remove(); childParentEngine(); // Helix3 Admin Footer var footerHtml = '<div class="helix-footer-area">'; footerHtml += '<div class="clearfix">'; footerHtml += '<a class="helix-logo-area" href="https://www.joomshaper.com/helix" target="_blank">Helix3 Logo</a>'; footerHtml += '<span class="template-version">' + pluginVersion + "</span>"; footerHtml += "</div>"; footerHtml += '<div class="help-links">'; footerHtml += '<a href="https://www.joomshaper.com/documentation/helix-framework/helix3" target="_blank">Documentation</a><span>|</span>'; footerHtml += '<a href="https://www.facebook.com/groups/helix.framework" target="_blank">Helix Community</a><span>|</span>'; footerHtml += '<a href="https://www.joomshaper.com/page-builder" target="_blank">Page Builder Pro</a><span>|</span>'; footerHtml += '<a href="https://www.joomshaper.com/joomla-templates" target="_blank">Premium Templates</a><span>|</span>'; footerHtml += '<a href="https://www.joomshaper.com/joomla-extensions" target="_blank">Joomla Extensions</a>'; footerHtml += "</div>"; footerHtml += "</div>"; $(footerHtml).insertAfter(".form-horizontal"); }); //Media Button $(".input-prepend, .input-append") .find(".btn") .each(function () { if ($(this).is(".modal, .button-select")) { $(this).addClass("btn-success"); } else { $(this).addClass("btn-danger"); } }); $(".controls") .find(".field-media-preview") .each(function () { $(this).insertBefore($(this).parent().find(".input-append")); }); $(".control-group .field-media-preview") .not("img") .each(function () { $(this).append('<div id="preview_empty">No image selected.</div>'); }); // clear image $(".helix-options .controls .field-media-wrapper .input-append").on( "click", ".button-clear", function (event) { $(this) .closest(".field-media-wrapper") .find(".field-media-preview") .html('<div id="preview_empty">No image selected.</div>'); }, ); //Add .btn-group class $(".radio").addClass("btn-group"); //Import Template Settings $(".form-horizontal").on("click", "#import-settings", function (event) { event.preventDefault(); var $that = $(this), template_id = $that.data("template_id"), temp_settings = $.trim($("#import-data").val()); if (temp_settings == "") { return false; } if ( confirm( "Warning: It will change all current settings of this Template.", ) != true ) { return false; } var data = { action: "import", template_id: template_id, settings: temp_settings, }; var request = { option: "com_ajax", plugin: "helix3", data: data, format: "json", }; $.ajax({ type: "POST", data: request, success: function (response) { window.location.reload(); }, error: function () { alert("Somethings wrong, Try again"); }, }); return false; }); }); PKAA#]�1I��"system/helix3/assets/js/webfont.jsnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery(function ($) { //Web Fonts $(".list-font-families").on("change", function (event) { event.preventDefault(); var $that = $(this), layoutName = $(this).val(), data = { action: "fontVariants", layoutName: layoutName, }; var request = { option: "com_ajax", plugin: "helix3", data: data, format: "json", }; $.ajax({ type: "POST", data: request, success: function (response) { var font = $.parseJSON(response.data); $that.closest(".webfont").find(".list-font-weight").html(font.variants); $that.closest(".webfont").find(".list-font-subset").html(font.subsets); }, }); //Change Preview var font = $that.val().replace(" ", "+"); $("head").append( "<link href='//fonts.googleapis.com/css?family=" + font + "' rel='stylesheet' type='text/css'>", ); $(this) .closest(".webfont") .find(".webfont-preview") .fadeIn() .css("font-family", $(this).val()); return false; }); //Font Size $(".list-font-weight").on("change", function (event) { event.preventDefault(); var variant = $(this).val(), weight = "", style = "", family = $(this) .closest(".webfont") .find(".list-font-families") .val() .replace(" ", "+") + ":" + variant; if (variant == "regular") { weight = "regular"; style = ""; } else if (variant == "italic") { weight = "regular"; style = "italic"; } else { weight = parseInt(variant); style = $(this).val().replace(weight, ""); } $("head").append( "<link href='//fonts.googleapis.com/css?family=" + family + "' rel='stylesheet' type='text/css'>", ); $(this) .closest(".webfont") .find(".webfont-preview") .fadeIn() .css({ "font-family": $(this) .closest(".webfont") .find(".list-font-families") .val(), "font-weight": weight, "font-style": style, }); }); //Font Subset $(".list-font-subset").on("change", function (event) { event.preventDefault(); var subsets = $(this).val(), variant = $(this).closest(".webfont").find(".list-font-weight").val(), weight = "", style = "", family = $(this) .closest(".webfont") .find(".list-font-families") .val() .replace(" ", "+") + ":" + variant + "&subset=" + subsets; if (variant == "regular") { weight = "regular"; style = ""; } else if (variant == "italic") { weight = "regular"; style = "italic"; } else { weight = parseInt(variant); style = $(this).val().replace(weight, ""); } $("head").append( "<link href='//fonts.googleapis.com/css?family=" + family + "' rel='stylesheet' type='text/css'>", ); }); //Font Size $(".webfont-size").on("change", function (event) { event.preventDefault(); var font_size = $(this).val(), subsets = $(this).closest(".webfont").find(".list-font-subset").val(), variant = $(this).closest(".webfont").find(".list-font-weight").val(), weight = "", style = "", family = $(this) .closest(".webfont") .find(".list-font-families") .val() .replace(" ", "+") + ":" + variant + "&subset=" + subsets; if (variant == "regular") { weight = "regular"; style = ""; } else if (variant == "italic") { weight = "regular"; style = "italic"; } else { weight = parseInt(variant); style = $(this).val().replace(weight, ""); } $("head").append( "<link href='//fonts.googleapis.com/css?family=" + family + "' rel='stylesheet' type='text/css'>", ); $(this) .closest(".webfont") .find(".webfont-preview") .fadeIn() .css({ "font-family": $(this) .closest(".webfont") .find(".list-font-families") .val(), "font-weight": weight, "font-style": style, "font-size": $(this).val() + "px", "line-height": "1", }); }); //Update Fonts list $(".btn-update-fonts-list").on("click", function (event) { event.preventDefault(); var $that = $(this), data = { action: "updateFonts", layoutName: "", }; var request = { option: "com_ajax", plugin: "helix3", data: data, format: "raw", }; $.ajax({ type: "POST", data: request, beforeSend: function () { $that.prepend('<i class="fa fa-spinner fa-spin"></i> '); }, success: function (response) { $that.after(response); $that.find(".fa-spinner").remove(); $that .next() .delay(1000) .fadeOut(300, function () { $(this).remove(); }); }, }); return false; }); }); PKAA#]QB���R�R-system/helix3/assets/js/jquery.ui.core.min.jsnu�[���/*! jQuery UI - v1.9.2 - 2013-07-14 * http://jqueryui.com * Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js * Copyright 2013 jQuery Foundation and other contributors Licensed MIT */ (function(b,f){var a=0,e=/^ui-id-\d+$/;b.ui=b.ui||{};if(b.ui.version){return}b.extend(b.ui,{version:"1.9.2",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}});b.fn.extend({_focus:b.fn.focus,focus:function(g,h){return typeof g==="number"?this.each(function(){var i=this;setTimeout(function(){b(i).focus();if(h){h.call(i)}},g)}):this._focus.apply(this,arguments)},scrollParent:function(){var g;if((b.ui.ie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){g=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(b.css(this,"position"))&&(/(auto|scroll)/).test(b.css(this,"overflow")+b.css(this,"overflow-y")+b.css(this,"overflow-x"))}).eq(0)}else{g=this.parents().filter(function(){return(/(auto|scroll)/).test(b.css(this,"overflow")+b.css(this,"overflow-y")+b.css(this,"overflow-x"))}).eq(0)}return(/fixed/).test(this.css("position"))||!g.length?b(document):g},zIndex:function(j){if(j!==f){return this.css("zIndex",j)}if(this.length){var h=b(this[0]),g,i;while(h.length&&h[0]!==document){g=h.css("position");if(g==="absolute"||g==="relative"||g==="fixed"){i=parseInt(h.css("zIndex"),10);if(!isNaN(i)&&i!==0){return i}}h=h.parent()}}return 0},uniqueId:function(){return this.each(function(){if(!this.id){this.id="ui-id-"+(++a)}})},removeUniqueId:function(){return this.each(function(){if(e.test(this.id)){b(this).removeAttr("id")}})}});function d(i,g){var k,j,h,l=i.nodeName.toLowerCase();if("area"===l){k=i.parentNode;j=k.name;if(!i.href||!j||k.nodeName.toLowerCase()!=="map"){return false}h=b("img[usemap=#"+j+"]")[0];return !!h&&c(h)}return(/input|select|textarea|button|object/.test(l)?!i.disabled:"a"===l?i.href||g:g)&&c(i)}function c(g){return b.expr.filters.visible(g)&&!b(g).parents().andSelf().filter(function(){return b.css(this,"visibility")==="hidden"}).length}b.extend(b.expr[":"],{data:b.expr.createPseudo?b.expr.createPseudo(function(g){return function(h){return !!b.data(h,g)}}):function(j,h,g){return !!b.data(j,g[3])},focusable:function(g){return d(g,!isNaN(b.attr(g,"tabindex")))},tabbable:function(i){var g=b.attr(i,"tabindex"),h=isNaN(g);return(h||g>=0)&&d(i,!h)}});b(function(){var g=document.body,h=g.appendChild(h=document.createElement("div"));h.offsetHeight;b.extend(h.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});b.support.minHeight=h.offsetHeight===100;b.support.selectstart="onselectstart" in h;g.removeChild(h).style.display="none"});if(!b("<a>").outerWidth(1).jquery){b.each(["Width","Height"],function(j,g){var h=g==="Width"?["Left","Right"]:["Top","Bottom"],k=g.toLowerCase(),m={innerWidth:b.fn.innerWidth,innerHeight:b.fn.innerHeight,outerWidth:b.fn.outerWidth,outerHeight:b.fn.outerHeight};function l(o,n,i,p){b.each(h,function(){n-=parseFloat(b.css(o,"padding"+this))||0;if(i){n-=parseFloat(b.css(o,"border"+this+"Width"))||0}if(p){n-=parseFloat(b.css(o,"margin"+this))||0}});return n}b.fn["inner"+g]=function(i){if(i===f){return m["inner"+g].call(this)}return this.each(function(){b(this).css(k,l(this,i)+"px")})};b.fn["outer"+g]=function(i,n){if(typeof i!=="number"){return m["outer"+g].call(this,i)}return this.each(function(){b(this).css(k,l(this,i,true,n)+"px")})}})}if(b("<a>").data("a-b","a").removeData("a-b").data("a-b")){b.fn.removeData=(function(g){return function(h){if(arguments.length){return g.call(this,b.camelCase(h))}else{return g.call(this)}}})(b.fn.removeData)}(function(){var g=/msie ([\w.]+)/.exec(navigator.userAgent.toLowerCase())||[];b.ui.ie=g.length?true:false;b.ui.ie6=parseFloat(g[1],10)===6})();b.fn.extend({disableSelection:function(){return this.bind((b.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(g){g.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});b.extend(b.ui,{plugin:{add:function(h,j,l){var g,k=b.ui[h].prototype;for(g in l){k.plugins[g]=k.plugins[g]||[];k.plugins[g].push([j,l[g]])}},call:function(g,j,h){var k,l=g.plugins[j];if(!l||!g.element[0].parentNode||g.element[0].parentNode.nodeType===11){return}for(k=0;k<l.length;k++){if(g.options[l[k][0]]){l[k][1].apply(g.element,h)}}}},contains:b.contains,hasScroll:function(j,h){if(b(j).css("overflow")==="hidden"){return false}var g=(h&&h==="left")?"scrollLeft":"scrollTop",i=false;if(j[g]>0){return true}j[g]=1;i=(j[g]>0);j[g]=0;return i},isOverAxis:function(h,g,i){return(h>g)&&(h<(g+i))},isOver:function(l,h,k,j,g,i){return b.ui.isOverAxis(l,k,g)&&b.ui.isOverAxis(h,j,i)}})})(jQuery);(function(b,e){var a=0,d=Array.prototype.slice,c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)};b.widget=function(g,j,f){var m,l,i,k,h=g.split(".")[0];g=g.split(".")[1];m=h+"-"+g;if(!f){f=j;j=b.Widget}b.expr[":"][m.toLowerCase()]=function(n){return !!b.data(n,m)};b[h]=b[h]||{};l=b[h][g];i=b[h][g]=function(n,o){if(!this._createWidget){return new i(n,o)}if(arguments.length){this._createWidget(n,o)}};b.extend(i,l,{version:f.version,_proto:b.extend({},f),_childConstructors:[]});k=new j();k.options=b.widget.extend({},k.options);b.each(f,function(o,n){if(b.isFunction(n)){f[o]=(function(){var p=function(){return j.prototype[o].apply(this,arguments)},q=function(r){return j.prototype[o].apply(this,r)};return function(){var t=this._super,r=this._superApply,s;this._super=p;this._superApply=q;s=n.apply(this,arguments);this._super=t;this._superApply=r;return s}})()}});i.prototype=b.widget.extend(k,{widgetEventPrefix:l?k.widgetEventPrefix:g},f,{constructor:i,namespace:h,widgetName:g,widgetBaseClass:m,widgetFullName:m});if(l){b.each(l._childConstructors,function(o,p){var n=p.prototype;b.widget(n.namespace+"."+n.widgetName,i,p._proto)});delete l._childConstructors}else{j._childConstructors.push(i)}b.widget.bridge(g,i)};b.widget.extend=function(k){var g=d.call(arguments,1),j=0,f=g.length,h,i;for(;j<f;j++){for(h in g[j]){i=g[j][h];if(g[j].hasOwnProperty(h)&&i!==e){if(b.isPlainObject(i)){k[h]=b.isPlainObject(k[h])?b.widget.extend({},k[h],i):b.widget.extend({},i)}else{k[h]=i}}}}return k};b.widget.bridge=function(g,f){var h=f.prototype.widgetFullName||g;b.fn[g]=function(k){var i=typeof k==="string",j=d.call(arguments,1),l=this;k=!i&&j.length?b.widget.extend.apply(null,[k].concat(j)):k;if(i){this.each(function(){var n,m=b.data(this,h);if(!m){return b.error("cannot call methods on "+g+" prior to initialization; attempted to call method '"+k+"'")}if(!b.isFunction(m[k])||k.charAt(0)==="_"){return b.error("no such method '"+k+"' for "+g+" widget instance")}n=m[k].apply(m,j);if(n!==m&&n!==e){l=n&&n.jquery?l.pushStack(n.get()):n;return false}})}else{this.each(function(){var m=b.data(this,h);if(m){m.option(k||{})._init()}else{b.data(this,h,new f(k,this))}})}return l}};b.Widget=function(){};b.Widget._childConstructors=[];b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:false,create:null},_createWidget:function(f,g){g=b(g||this.defaultElement||this)[0];this.element=b(g);this.uuid=a++;this.eventNamespace="."+this.widgetName+this.uuid;this.options=b.widget.extend({},this.options,this._getCreateOptions(),f);this.bindings=b();this.hoverable=b();this.focusable=b();if(g!==this){b.data(g,this.widgetName,this);b.data(g,this.widgetFullName,this);this._on(true,this.element,{remove:function(h){if(h.target===g){this.destroy()}}});this.document=b(g.style?g.ownerDocument:g.document||g);this.window=b(this.document[0].defaultView||this.document[0].parentWindow)}this._create();this._trigger("create",null,this._getCreateEventData());this._init()},_getCreateOptions:b.noop,_getCreateEventData:b.noop,_create:b.noop,_init:b.noop,destroy:function(){this._destroy();this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(b.camelCase(this.widgetFullName));this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled ui-state-disabled");this.bindings.unbind(this.eventNamespace);this.hoverable.removeClass("ui-state-hover");this.focusable.removeClass("ui-state-focus")},_destroy:b.noop,widget:function(){return this.element},option:function(j,k){var f=j,l,h,g;if(arguments.length===0){return b.widget.extend({},this.options)}if(typeof j==="string"){f={};l=j.split(".");j=l.shift();if(l.length){h=f[j]=b.widget.extend({},this.options[j]);for(g=0;g<l.length-1;g++){h[l[g]]=h[l[g]]||{};h=h[l[g]]}j=l.pop();if(k===e){return h[j]===e?null:h[j]}h[j]=k}else{if(k===e){return this.options[j]===e?null:this.options[j]}f[j]=k}}this._setOptions(f);return this},_setOptions:function(f){var g;for(g in f){this._setOption(g,f[g])}return this},_setOption:function(f,g){this.options[f]=g;if(f==="disabled"){this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!g).attr("aria-disabled",g);this.hoverable.removeClass("ui-state-hover");this.focusable.removeClass("ui-state-focus")}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_on:function(i,h,g){var j,f=this;if(typeof i!=="boolean"){g=h;h=i;i=false}if(!g){g=h;h=this.element;j=this.widget()}else{h=j=b(h);this.bindings=this.bindings.add(h)}b.each(g,function(p,o){function m(){if(!i&&(f.options.disabled===true||b(this).hasClass("ui-state-disabled"))){return}return(typeof o==="string"?f[o]:o).apply(f,arguments)}if(typeof o!=="string"){m.guid=o.guid=o.guid||m.guid||b.guid++}var n=p.match(/^(\w+)\s*(.*)$/),l=n[1]+f.eventNamespace,k=n[2];if(k){j.delegate(k,l,m)}else{h.bind(l,m)}})},_off:function(g,f){f=(f||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace;g.unbind(f).undelegate(f)},_delay:function(i,h){function g(){return(typeof i==="string"?f[i]:i).apply(f,arguments)}var f=this;return setTimeout(g,h||0)},_hoverable:function(f){this.hoverable=this.hoverable.add(f);this._on(f,{mouseenter:function(g){b(g.currentTarget).addClass("ui-state-hover")},mouseleave:function(g){b(g.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(f){this.focusable=this.focusable.add(f);this._on(f,{focusin:function(g){b(g.currentTarget).addClass("ui-state-focus")},focusout:function(g){b(g.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(f,g,h){var k,j,i=this.options[f];h=h||{};g=b.Event(g);g.type=(f===this.widgetEventPrefix?f:this.widgetEventPrefix+f).toLowerCase();g.target=this.element[0];j=g.originalEvent;if(j){for(k in j){if(!(k in g)){g[k]=j[k]}}}this.element.trigger(g,h);return !(b.isFunction(i)&&i.apply(this.element[0],[g].concat(h))===false||g.isDefaultPrevented())}};b.each({show:"fadeIn",hide:"fadeOut"},function(g,f){b.Widget.prototype["_"+g]=function(j,i,l){if(typeof i==="string"){i={effect:i}}var k,h=!i?g:i===true||typeof i==="number"?f:i.effect||f;i=i||{};if(typeof i==="number"){i={duration:i}}k=!b.isEmptyObject(i);i.complete=l;if(i.delay){j.delay(i.delay)}if(k&&b.effects&&(b.effects.effect[h]||b.uiBackCompat!==false&&b.effects[h])){j[g](i)}else{if(h!==g&&j[h]){j[h](i.duration,i.easing,l)}else{j.queue(function(m){b(this)[g]();if(l){l.call(j[0])}m()})}}}});if(b.uiBackCompat!==false){b.Widget.prototype._getCreateOptions=function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]}}})(jQuery);(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{version:"1.9.2",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);if(this._mouseMoveDelegate){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)}},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which===1),d=(typeof this.options.cancel==="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.ui.ie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target===this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(e,c){e.ui=e.ui||{};var i,j=Math.max,n=Math.abs,l=Math.round,d=/left|center|right/,g=/top|center|bottom/,a=/[\+\-]\d+%?/,k=/^\w+/,b=/%$/,f=e.fn.position;function m(q,p,o){return[parseInt(q[0],10)*(b.test(q[0])?p/100:1),parseInt(q[1],10)*(b.test(q[1])?o/100:1)]}function h(o,p){return parseInt(e.css(o,p),10)||0}e.position={scrollbarWidth:function(){if(i!==c){return i}var p,o,r=e("<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),q=r.children()[0];e("body").append(r);p=q.offsetWidth;r.css("overflow","scroll");o=q.offsetWidth;if(p===o){o=r[0].clientWidth}r.remove();return(i=p-o)},getScrollInfo:function(s){var r=s.isWindow?"":s.element.css("overflow-x"),q=s.isWindow?"":s.element.css("overflow-y"),p=r==="scroll"||(r==="auto"&&s.width<s.element[0].scrollWidth),o=q==="scroll"||(q==="auto"&&s.height<s.element[0].scrollHeight);return{width:p?e.position.scrollbarWidth():0,height:o?e.position.scrollbarWidth():0}},getWithinInfo:function(p){var q=e(p||window),o=e.isWindow(q[0]);return{element:q,isWindow:o,offset:q.offset()||{left:0,top:0},scrollLeft:q.scrollLeft(),scrollTop:q.scrollTop(),width:o?q.width():q.outerWidth(),height:o?q.height():q.outerHeight()}}};e.fn.position=function(y){if(!y||!y.of){return f.apply(this,arguments)}y=e.extend({},y);var z,v,s,x,r,u=e(y.of),q=e.position.getWithinInfo(y.within),o=e.position.getScrollInfo(q),t=u[0],w=(y.collision||"flip").split(" "),p={};if(t.nodeType===9){v=u.width();s=u.height();x={top:0,left:0}}else{if(e.isWindow(t)){v=u.width();s=u.height();x={top:u.scrollTop(),left:u.scrollLeft()}}else{if(t.preventDefault){y.at="left top";v=s=0;x={top:t.pageY,left:t.pageX}}else{v=u.outerWidth();s=u.outerHeight();x=u.offset()}}}r=e.extend({},x);e.each(["my","at"],function(){var C=(y[this]||"").split(" "),B,A;if(C.length===1){C=d.test(C[0])?C.concat(["center"]):g.test(C[0])?["center"].concat(C):["center","center"]}C[0]=d.test(C[0])?C[0]:"center";C[1]=g.test(C[1])?C[1]:"center";B=a.exec(C[0]);A=a.exec(C[1]);p[this]=[B?B[0]:0,A?A[0]:0];y[this]=[k.exec(C[0])[0],k.exec(C[1])[0]]});if(w.length===1){w[1]=w[0]}if(y.at[0]==="right"){r.left+=v}else{if(y.at[0]==="center"){r.left+=v/2}}if(y.at[1]==="bottom"){r.top+=s}else{if(y.at[1]==="center"){r.top+=s/2}}z=m(p.at,v,s);r.left+=z[0];r.top+=z[1];return this.each(function(){var B,K,D=e(this),F=D.outerWidth(),C=D.outerHeight(),E=h(this,"marginLeft"),A=h(this,"marginTop"),J=F+E+h(this,"marginRight")+o.width,I=C+A+h(this,"marginBottom")+o.height,G=e.extend({},r),H=m(p.my,D.outerWidth(),D.outerHeight());if(y.my[0]==="right"){G.left-=F}else{if(y.my[0]==="center"){G.left-=F/2}}if(y.my[1]==="bottom"){G.top-=C}else{if(y.my[1]==="center"){G.top-=C/2}}G.left+=H[0];G.top+=H[1];if(!e.support.offsetFractions){G.left=l(G.left);G.top=l(G.top)}B={marginLeft:E,marginTop:A};e.each(["left","top"],function(M,L){if(e.ui.position[w[M]]){e.ui.position[w[M]][L](G,{targetWidth:v,targetHeight:s,elemWidth:F,elemHeight:C,collisionPosition:B,collisionWidth:J,collisionHeight:I,offset:[z[0]+H[0],z[1]+H[1]],my:y.my,at:y.at,within:q,elem:D})}});if(e.fn.bgiframe){D.bgiframe()}if(y.using){K=function(O){var Q=x.left-G.left,N=Q+v-F,P=x.top-G.top,M=P+s-C,L={target:{element:u,left:x.left,top:x.top,width:v,height:s},element:{element:D,left:G.left,top:G.top,width:F,height:C},horizontal:N<0?"left":Q>0?"right":"center",vertical:M<0?"top":P>0?"bottom":"middle"};if(v<F&&n(Q+N)<v){L.horizontal="center"}if(s<C&&n(P+M)<s){L.vertical="middle"}if(j(n(Q),n(N))>j(n(P),n(M))){L.important="horizontal"}else{L.important="vertical"}y.using.call(this,O,L)}}D.offset(e.extend(G,{using:K}))})};e.ui.position={fit:{left:function(s,r){var q=r.within,u=q.isWindow?q.scrollLeft:q.offset.left,w=q.width,t=s.left-r.collisionPosition.marginLeft,v=u-t,p=t+r.collisionWidth-w-u,o;if(r.collisionWidth>w){if(v>0&&p<=0){o=s.left+v+r.collisionWidth-w-u;s.left+=v-o}else{if(p>0&&v<=0){s.left=u}else{if(v>p){s.left=u+w-r.collisionWidth}else{s.left=u}}}}else{if(v>0){s.left+=v}else{if(p>0){s.left-=p}else{s.left=j(s.left-t,s.left)}}}},top:function(r,q){var p=q.within,v=p.isWindow?p.scrollTop:p.offset.top,w=q.within.height,t=r.top-q.collisionPosition.marginTop,u=v-t,s=t+q.collisionHeight-w-v,o;if(q.collisionHeight>w){if(u>0&&s<=0){o=r.top+u+q.collisionHeight-w-v;r.top+=u-o}else{if(s>0&&u<=0){r.top=v}else{if(u>s){r.top=v+w-q.collisionHeight}else{r.top=v}}}}else{if(u>0){r.top+=u}else{if(s>0){r.top-=s}else{r.top=j(r.top-t,r.top)}}}}},flip:{left:function(u,t){var s=t.within,y=s.offset.left+s.scrollLeft,B=s.width,q=s.isWindow?s.scrollLeft:s.offset.left,v=u.left-t.collisionPosition.marginLeft,z=v-q,p=v+t.collisionWidth-B-q,x=t.my[0]==="left"?-t.elemWidth:t.my[0]==="right"?t.elemWidth:0,A=t.at[0]==="left"?t.targetWidth:t.at[0]==="right"?-t.targetWidth:0,r=-2*t.offset[0],o,w;if(z<0){o=u.left+x+A+r+t.collisionWidth-B-y;if(o<0||o<n(z)){u.left+=x+A+r}}else{if(p>0){w=u.left-t.collisionPosition.marginLeft+x+A+r-q;if(w>0||n(w)<p){u.left+=x+A+r}}}},top:function(t,s){var r=s.within,A=r.offset.top+r.scrollTop,B=r.height,o=r.isWindow?r.scrollTop:r.offset.top,v=t.top-s.collisionPosition.marginTop,x=v-o,u=v+s.collisionHeight-B-o,y=s.my[1]==="top",w=y?-s.elemHeight:s.my[1]==="bottom"?s.elemHeight:0,C=s.at[1]==="top"?s.targetHeight:s.at[1]==="bottom"?-s.targetHeight:0,q=-2*s.offset[1],z,p;if(x<0){p=t.top+w+C+q+s.collisionHeight-B-A;if((t.top+w+C+q)>x&&(p<0||p<n(x))){t.top+=w+C+q}}else{if(u>0){z=t.top-s.collisionPosition.marginTop+w+C+q-o;if((t.top+w+C+q)>u&&(z>0||n(z)<u)){t.top+=w+C+q}}}}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments);e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments);e.ui.position.fit.top.apply(this,arguments)}}};(function(){var s,u,p,r,q,o=document.getElementsByTagName("body")[0],t=document.createElement("div");s=document.createElement(o?"div":"body");p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"};if(o){e.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"})}for(q in p){s.style[q]=p[q]}s.appendChild(t);u=o||document.documentElement;u.insertBefore(s,u.firstChild);t.style.cssText="position: absolute; left: 10.7432222px;";r=e(t).offset().left;e.support.offsetFractions=r>10&&r<11;s.innerHTML="";u.removeChild(s)})();if(e.uiBackCompat!==false){(function(p){var o=p.fn.position;p.fn.position=function(r){if(!r||!r.offset){return o.call(this,r)}var s=r.offset.split(" "),q=r.at.split(" ");if(s.length===1){s[1]=s[0]}if(/^\d/.test(s[0])){s[0]="+"+s[0]}if(/^\d/.test(s[1])){s[1]="+"+s[1]}if(q.length===1){if(/left|center|right/.test(q[0])){q[1]="center"}else{q[1]=q[0];q[0]="center"}}return o.call(this,p.extend(r,{at:q[0]+s[0]+" "+q[1]+s[1],offset:c}))}}(jQuery))}}(jQuery));PKAA#]�`��+system/helix3/assets/js/admin.general.j4.jsnu�[���/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery(function ($) { "use strict"; $("#style-form").addClass("helix-options"); $(document).ready(function () { // remove basic fields $(".info-labels").prev("h2").remove(); $(".info-labels").next("div").remove(); $(".info-labels").next("hr").addBack().remove(); $("#jform_params___field1-lbl").closest(".control-group").remove(); // child parent relation var childParentEngine = function () { var classes = new Array(); $(".parent:not(.child)").each(function () { var elClass = $(this).attr("class").split(/\s/g); var $key = $.inArray("parent", elClass); if ($key != -1) { classes.push(elClass[$key + 1]); } }); $(".parent:not(.child)").each(function () { var parent = $(this); var elClass = $(this).attr("class").split(/\s/g); var childClassName = ".child"; var conditionClassName = ""; var i; for (i = 0; i < elClass.length; i++) { if ($.inArray(elClass[i], classes) < 0) { continue; } else { var elCls = "." + elClass[i]; $(childClassName + elCls) .closest(".control-group") .hide(); if ($(parent).prop("type") != "select-one") { var selected = $(parent).find("input[type=radio]:checked"); var radios = $(parent).find("input[type=radio]"); var activeItems = conditionClassName + elCls + "_" + $(selected).val(); var childItem = $.trim(childClassName + elCls + activeItems); setTimeout(function () { $(childItem).closest(".control-group").show(); }, 100); $(radios).on("click", function (event) { $(childClassName + elCls) .closest(".control-group") .hide(); $( childClassName + elCls + conditionClassName + elCls + "_" + $.trim($(this).val()), ) .closest(".control-group") .fadeIn(); }); } else if ($(parent).prop("type") == "select-one") { var element = $(parent); var selected = $(parent).find("option:selected"); var activeItems = conditionClassName + elCls + "_" + $(selected).val(); var childItem = $.trim(childClassName + elCls + activeItems); setTimeout(function () { $(childItem).closest(".control-group").show(); }, 100); $(element).on("change", function (event) { $(childClassName + elCls) .closest(".control-group") .hide(); $( childClassName + elCls + conditionClassName + elCls + "_" + $.trim($(this).val()), ) .closest(".control-group") .fadeIn(); }); } } } }); }; //end childParentEngine $(".group_separator").each(function () { $(this).parent().prev().remove(); $(this).parent().parent().addClass("group-separator"); $(this).unwrap(); }); //Presets $(".preset").addClass("new-hello").parent().unwrap().prev().remove(); $(".preset").parent().removeClass("controls").addClass("presets clearfix"); //Load Preset $("#attrib-preset") .find(".preset-control") .each(function () { if ($(this).hasClass(current_preset)) { $(this).closest(".control-group").show(); } else { $(this).closest(".control-group").hide(); } }); //Change Preset $(".preset").on("click", function (event) { event.preventDefault(); var $that = $(this); $(".preset").removeClass("active"); $(this).addClass("active"); $("#attrib-preset") .find(".preset-control") .each(function () { if ($(this).hasClass($that.data("preset"))) { $(this).closest(".control-group").fadeIn(); } else { $(this).closest(".control-group").hide(); } }); $("#template-preset").val($that.data("preset")); }); //Change Preset $(document).on("blur", ".preset-control", function (event) { event.preventDefault(); var active_preset = $(".preset.active").data("preset"); if ($(this).attr("id") == "jform_params_" + active_preset + "_major") { $(".preset.active").css("background-color", $(this).val()); } }); //Template Information $("#jform_template") .closest(".control-group") .appendTo($(".title-alias")) .wrap('<div class="col-12 col-md-auto"></div>'); $("#jform_home1") .closest(".control-group") .appendTo($(".title-alias")) .wrap('<div class="col-12 col-md-auto"></div>'); $(".title-alias").find(">div:nth-child(2)").remove(); childParentEngine(); // Helix3 Admin Footer var footerHtml = '<div class="helix-footer-area">'; footerHtml += '<div class="clearfix">'; footerHtml += '<a class="helix-logo-area" href="https://www.joomshaper.com/helix" target="_blank">Helix3 Logo</a>'; footerHtml += '<span class="template-version">' + pluginVersion + "</span>"; footerHtml += "</div>"; footerHtml += '<div class="help-links">'; footerHtml += '<a href="https://www.joomshaper.com/documentation/helix-framework/helix3" target="_blank">Documentation</a><span>|</span>'; footerHtml += '<a href="https://www.facebook.com/groups/helix.framework" target="_blank">Helix Community</a><span>|</span>'; footerHtml += '<a href="https://www.joomshaper.com/page-builder" target="_blank">Page Builder Pro</a><span>|</span>'; footerHtml += '<a href="https://www.joomshaper.com/joomla-templates" target="_blank">Premium Templates</a><span>|</span>'; footerHtml += '<a href="https://www.joomshaper.com/joomla-extensions" target="_blank">Joomla Extensions</a>'; footerHtml += "</div>"; footerHtml += "</div>"; $(footerHtml).insertAfter("#style-form"); }); //Import Template Settings $(document).on("click", "#import-settings", function (event) { event.preventDefault(); var $that = $(this), template_id = $that.data("template_id"), temp_settings = $.trim($("#import-data").val()); if (temp_settings == "") { return false; } if ( confirm( "Warning: It will change all current settings of this Template.", ) != true ) { return false; } var data = { action: "import", template_id: template_id, settings: temp_settings, }; var request = { option: "com_ajax", plugin: "helix3", data: data, format: "json", }; $.ajax({ type: "POST", data: request, success: function (response) { window.location.reload(); }, error: function () { alert("Somethings wrong, Try again"); }, }); return false; }); }); PKAA#]������ system/helix3/assets/js/modal.jsnu�[���/* ======================================================================== * Bootstrap: modal.js v3.1.1 * http://getbootstrap.com/javascript/#modals * ======================================================================== * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +(function ($) { "use strict"; // MODAL CLASS DEFINITION // ====================== var SPModal = function (element, options) { this.options = options; this.$element = $(element); this.$backdrop = this.isShown = null; if (this.options.remote) { this.$element.find(".sp-modal-content").load( this.options.remote, $.proxy(function () { this.$element.trigger("loaded.bs.spmodal"); }, this) ); } }; SPModal.DEFAULTS = { backdrop: true, keyboard: false, show: true, }; SPModal.prototype.toggle = function (_relatedTarget) { return this[!this.isShown ? "show" : "hide"](_relatedTarget); }; SPModal.prototype.show = function (_relatedTarget) { $(document.body).addClass("sp-modal-open"); var that = this; var e = $.Event("show.bs.spmodal", { relatedTarget: _relatedTarget }); this.$element.trigger(e); if (this.isShown || e.isDefaultPrevented()) return; this.isShown = true; this.escape(); this.$element.on("click.dismiss.bs.spmodal", '[data-dismiss="spmodal"]', $.proxy(this.hide, this)); this.backdrop(function () { var transition = $.support.transition && that.$element.hasClass("fade"); if (!that.$element.parent().length) { that.$element.appendTo(document.body); // don't move modals dom position } that.$element.show().scrollTop(0); if (transition) { that.$element[0].offsetWidth; // force reflow } that.$element.addClass("in").attr("aria-hidden", false); that.enforceFocus(); var e = $.Event("shown.bs.spmodal", { relatedTarget: _relatedTarget }); transition ? that.$element .find(".sp-modal-dialog") // wait for modal to slide in .one($.support.transition.end, function () { that.$element.focus().trigger(e); }) .emulateTransitionEnd(300) : that.$element.focus().trigger(e); }); }; SPModal.prototype.hide = function (e) { $(document.body).removeClass("sp-modal-open"); if (e) e.preventDefault(); e = $.Event("hide.bs.spmodal"); this.$element.trigger(e); if (!this.isShown || e.isDefaultPrevented()) return; this.isShown = false; this.escape(); $(document).off("focusin.bs.spmodal"); this.$element.removeClass("in").attr("aria-hidden", true).off("click.dismiss.bs.spmodal"); $.support.transition && this.$element.hasClass("fade") ? this.$element.one($.support.transition.end, $.proxy(this.hideSPModal, this)).emulateTransitionEnd(300) : this.hideSPModal(); }; SPModal.prototype.enforceFocus = function () { $(document) .off("focusin.bs.spmodal") // guard against infinite focus loop .on( "focusin.bs.spmodal", $.proxy(function (e) { if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { this.$element.focus(); } }, this) ); }; SPModal.prototype.escape = function () { if (this.isShown && this.options.keyboard) { this.$element.on( "keyup.dismiss.bs.spmodal", $.proxy(function (e) { e.which == 27 && this.hide(); }, this) ); } else if (!this.isShown) { this.$element.off("keyup.dismiss.bs.spmodal"); } }; SPModal.prototype.hideSPModal = function () { var that = this; this.$element.hide(); this.backdrop(function () { that.removeBackdrop(); that.$element.trigger("hidden.bs.spmodal"); }); }; SPModal.prototype.removeBackdrop = function () { this.$backdrop && this.$backdrop.remove(); this.$backdrop = null; }; SPModal.prototype.backdrop = function (callback) { var animate = this.$element.hasClass("fade") ? "fade" : ""; if (this.isShown && this.options.backdrop) { var doAnimate = $.support.transition && animate; this.$backdrop = $('<div class="sp-modal-backdrop ' + animate + '" />').appendTo(document.body); /* this.$element.on('click.dismiss.bs.spmodal', $.proxy(function (e) { if (e.target !== e.currentTarget) return this.options.backdrop == 'static' ? this.$element[0].focus.call(this.$element[0]) : this.hide.call(this) }, this)) */ if (doAnimate) this.$backdrop[0].offsetWidth; // force reflow this.$backdrop.addClass("in"); if (!callback) return; doAnimate ? this.$backdrop.one($.support.transition.end, callback).emulateTransitionEnd(150) : callback(); } else if (!this.isShown && this.$backdrop) { this.$backdrop.removeClass("in"); $.support.transition && this.$element.hasClass("fade") ? this.$backdrop.one($.support.transition.end, callback).emulateTransitionEnd(150) : callback(); } else if (callback) { callback(); } }; // MODAL PLUGIN DEFINITION // ======================= var old = $.fn.spmodal; $.fn.spmodal = function (option, _relatedTarget) { return this.each(function () { var $this = $(this); var data = $this.data("bs.spmodal"); var options = $.extend({}, SPModal.DEFAULTS, $this.data(), typeof option == "object" && option); if (!data) $this.data("bs.spmodal", (data = new SPModal(this, options))); if (typeof option == "string") data[option](_relatedTarget); else if (options.show) data.show(_relatedTarget); }); }; $.fn.spmodal.Constructor = SPModal; // MODAL NO CONFLICT // ================= $.fn.spmodal.noConflict = function () { $.fn.spmodal = old; return this; }; // MODAL DATA-API // ============== $(document).on("click.bs.spmodal.data-api", '[data-toggle="spmodal"]', function (e) { var $this = $(this); var href = $this.attr("href"); var $target = $($this.attr("data-target") || (href && href.replace(/.*(?=#[^\s]+$)/, ""))); //strip for ie7 var option = $target.data("bs.spmodal") ? "toggle" : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()); if ($this.is("a")) e.preventDefault(); $target.spmodal(option, this).one("hide", function () { $this.is(":visible") && $this.focus(); }); }); })(jQuery); PKAA#]�"�c_c_1system/helix3/assets/js/jquery.ui.sortable.min.jsnu�[���/*! * jQuery UI Sortable v1.9.2 - 2013-07-14 * * http://jqueryui.com * * Copyright 2013 jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/sortable/ * * Depends: * jquery.ui.core.js * jquery.ui.mouse.js * jquery.ui.widget.js */ (function(a,b){a.widget("ui.sortable",a.ui.mouse,{version:"1.9.2",widgetEventPrefix:"sort",ready:false,options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1000},_create:function(){var c=this.options;this.containerCache={};this.element.addClass("ui-sortable");this.refresh();this.floating=this.items.length?c.axis==="x"||(/left|right/).test(this.items[0].item.css("float"))||(/inline|table-cell/).test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit();this.ready=true},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled");this._mouseDestroy();for(var c=this.items.length-1;c>=0;c--){this.items[c].item.removeData(this.widgetName+"-item")}return this},_setOption:function(c,d){if(c==="disabled"){this.options[c]=d;this.widget().toggleClass("ui-sortable-disabled",!!d)}else{a.Widget.prototype._setOption.apply(this,arguments)}},_mouseCapture:function(f,g){var e=this;if(this.reverting){return false}if(this.options.disabled||this.options.type=="static"){return false}this._refreshItems(f);var d=null,c=a(f.target).parents().each(function(){if(a.data(this,e.widgetName+"-item")==e){d=a(this);return false}});if(a.data(f.target,e.widgetName+"-item")==e){d=a(f.target)}if(!d){return false}if(this.options.handle&&!g){var h=false;a(this.options.handle,d).find("*").andSelf().each(function(){if(this==f.target){h=true}});if(!h){return false}}this.currentItem=d;this._removeCurrentsFromItems();return true},_mouseStart:function(e,f,c){var g=this.options;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};a.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;(g.cursorAt&&this._adjustOffsetFromHelper(g.cursorAt));this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};if(this.helper[0]!=this.currentItem[0]){this.currentItem.hide()}this._createPlaceholder();if(g.containment){this._setContainment()}if(g.cursor){if(a("body").css("cursor")){this._storedCursor=a("body").css("cursor")}a("body").css("cursor",g.cursor)}if(g.opacity){if(this.helper.css("opacity")){this._storedOpacity=this.helper.css("opacity")}this.helper.css("opacity",g.opacity)}if(g.zIndex){if(this.helper.css("zIndex")){this._storedZIndex=this.helper.css("zIndex")}this.helper.css("zIndex",g.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){this.overflowOffset=this.scrollParent.offset()}this._trigger("start",e,this._uiHash());if(!this._preserveHelperProportions){this._cacheHelperProportions()}if(!c){for(var d=this.containers.length-1;d>=0;d--){this.containers[d]._trigger("activate",e,this._uiHash(this))}}if(a.ui.ddmanager){a.ui.ddmanager.current=this}if(a.ui.ddmanager&&!g.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,e)}this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(e);return true},_mouseDrag:function(g){this.position=this._generatePosition(g);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs){this.lastPositionAbs=this.positionAbs}if(this.options.scroll){var h=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if((this.overflowOffset.top+this.scrollParent[0].offsetHeight)-g.pageY<h.scrollSensitivity){this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+h.scrollSpeed}else{if(g.pageY-this.overflowOffset.top<h.scrollSensitivity){this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-h.scrollSpeed}}if((this.overflowOffset.left+this.scrollParent[0].offsetWidth)-g.pageX<h.scrollSensitivity){this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+h.scrollSpeed}else{if(g.pageX-this.overflowOffset.left<h.scrollSensitivity){this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-h.scrollSpeed}}}else{if(g.pageY-a(document).scrollTop()<h.scrollSensitivity){c=a(document).scrollTop(a(document).scrollTop()-h.scrollSpeed)}else{if(a(window).height()-(g.pageY-a(document).scrollTop())<h.scrollSensitivity){c=a(document).scrollTop(a(document).scrollTop()+h.scrollSpeed)}}if(g.pageX-a(document).scrollLeft()<h.scrollSensitivity){c=a(document).scrollLeft(a(document).scrollLeft()-h.scrollSpeed)}else{if(a(window).width()-(g.pageX-a(document).scrollLeft())<h.scrollSensitivity){c=a(document).scrollLeft(a(document).scrollLeft()+h.scrollSpeed)}}}if(c!==false&&a.ui.ddmanager&&!h.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,g)}}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}for(var e=this.items.length-1;e>=0;e--){var f=this.items[e],d=f.item[0],j=this._intersectsWithPointer(f);if(!j){continue}if(f.instance!==this.currentContainer){continue}if(d!=this.currentItem[0]&&this.placeholder[j==1?"next":"prev"]()[0]!=d&&!a.contains(this.placeholder[0],d)&&(this.options.type=="semi-dynamic"?!a.contains(this.element[0],d):true)){this.direction=j==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f)){this._rearrange(g,f)}else{break}this._trigger("change",g,this._uiHash());break}}this._contactContainers(g);if(a.ui.ddmanager){a.ui.ddmanager.drag(this,g)}this._trigger("sort",g,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(d,e){if(!d){return}if(a.ui.ddmanager&&!this.options.dropBehaviour){a.ui.ddmanager.drop(this,d)}if(this.options.revert){var c=this;var f=this.placeholder.offset();this.reverting=true;a(this.helper).animate({left:f.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:f.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(d)})}else{this._clear(d,e)}return false},cancel:function(){if(this.dragging){this._mouseUp({target:null});if(this.options.helper=="original"){this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else{this.currentItem.show()}for(var c=this.containers.length-1;c>=0;c--){this.containers[c]._trigger("deactivate",null,this._uiHash(this));if(this.containers[c].containerCache.over){this.containers[c]._trigger("out",null,this._uiHash(this));this.containers[c].containerCache.over=0}}}if(this.placeholder){if(this.placeholder[0].parentNode){this.placeholder[0].parentNode.removeChild(this.placeholder[0])}if(this.options.helper!="original"&&this.helper&&this.helper[0].parentNode){this.helper.remove()}a.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});if(this.domPosition.prev){a(this.domPosition.prev).after(this.currentItem)}else{a(this.domPosition.parent).prepend(this.currentItem)}}return this},serialize:function(e){var c=this._getItemsAsjQuery(e&&e.connected);var d=[];e=e||{};a(c).each(function(){var f=(a(e.item||this).attr(e.attribute||"id")||"").match(e.expression||(/(.+)[-=_](.+)/));if(f){d.push((e.key||f[1]+"[]")+"="+(e.key&&e.expression?f[1]:f[2]))}});if(!d.length&&e.key){d.push(e.key+"=")}return d.join("&")},toArray:function(e){var c=this._getItemsAsjQuery(e&&e.connected);var d=[];e=e||{};c.each(function(){d.push(a(e.item||this).attr(e.attribute||"id")||"")});return d},_intersectsWith:function(m){var e=this.positionAbs.left,d=e+this.helperProportions.width,k=this.positionAbs.top,j=k+this.helperProportions.height;var f=m.left,c=f+m.width,n=m.top,i=n+m.height;var o=this.offset.click.top,h=this.offset.click.left;var g=(k+o)>n&&(k+o)<i&&(e+h)>f&&(e+h)<c;if(this.options.tolerance=="pointer"||this.options.forcePointerForContainers||(this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>m[this.floating?"width":"height"])){return g}else{return(f<e+(this.helperProportions.width/2)&&d-(this.helperProportions.width/2)<c&&n<k+(this.helperProportions.height/2)&&j-(this.helperProportions.height/2)<i)}},_intersectsWithPointer:function(e){var f=(this.options.axis==="x")||a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),d=(this.options.axis==="y")||a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),h=f&&d,c=this._getDragVerticalDirection(),g=this._getDragHorizontalDirection();if(!h){return false}return this.floating?(((g&&g=="right")||c=="down")?2:1):(c&&(c=="down"?2:1))},_intersectsWithSides:function(f){var d=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,f.top+(f.height/2),f.height),e=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,f.left+(f.width/2),f.width),c=this._getDragVerticalDirection(),g=this._getDragHorizontalDirection();if(this.floating&&g){return((g=="right"&&e)||(g=="left"&&!e))}else{return c&&((c=="down"&&d)||(c=="up"&&!d))}},_getDragVerticalDirection:function(){var c=this.positionAbs.top-this.lastPositionAbs.top;return c!=0&&(c>0?"down":"up")},_getDragHorizontalDirection:function(){var c=this.positionAbs.left-this.lastPositionAbs.left;return c!=0&&(c>0?"right":"left")},refresh:function(c){this._refreshItems(c);this.refreshPositions();return this},_connectWith:function(){var c=this.options;return c.connectWith.constructor==String?[c.connectWith]:c.connectWith},_getItemsAsjQuery:function(h){var c=[];var e=[];var g=this._connectWith();if(g&&h){for(var f=g.length-1;f>=0;f--){var l=a(g[f]);for(var d=l.length-1;d>=0;d--){var k=a.data(l[d],this.widgetName);if(k&&k!=this&&!k.options.disabled){e.push([a.isFunction(k.options.items)?k.options.items.call(k.element):a(k.options.items,k.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),k])}}}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var f=e.length-1;f>=0;f--){e[f][0].each(function(){c.push(this)})}return a(c)},_removeCurrentsFromItems:function(){var c=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=a.grep(this.items,function(e){for(var d=0;d<c.length;d++){if(c[d]==e.item[0]){return false}}return true})},_refreshItems:function(c){this.items=[];this.containers=[this];var k=this.items;var g=[[a.isFunction(this.options.items)?this.options.items.call(this.element[0],c,{item:this.currentItem}):a(this.options.items,this.element),this]];var m=this._connectWith();if(m&&this.ready){for(var f=m.length-1;f>=0;f--){var n=a(m[f]);for(var e=n.length-1;e>=0;e--){var h=a.data(n[e],this.widgetName);if(h&&h!=this&&!h.options.disabled){g.push([a.isFunction(h.options.items)?h.options.items.call(h.element[0],c,{item:this.currentItem}):a(h.options.items,h.element),h]);this.containers.push(h)}}}}for(var f=g.length-1;f>=0;f--){var l=g[f][1];var d=g[f][0];for(var e=0,o=d.length;e<o;e++){var p=a(d[e]);p.data(this.widgetName+"-item",l);k.push({item:p,instance:l,width:0,height:0,left:0,top:0})}}},refreshPositions:function(c){if(this.offsetParent&&this.helper){this.offset.parent=this._getParentOffset()}for(var e=this.items.length-1;e>=0;e--){var f=this.items[e];if(f.instance!=this.currentContainer&&this.currentContainer&&f.item[0]!=this.currentItem[0]){continue}var d=this.options.toleranceElement?a(this.options.toleranceElement,f.item):f.item;if(!c){f.width=d.outerWidth();f.height=d.outerHeight()}var g=d.offset();f.left=g.left;f.top=g.top}if(this.options.custom&&this.options.custom.refreshContainers){this.options.custom.refreshContainers.call(this)}else{for(var e=this.containers.length-1;e>=0;e--){var g=this.containers[e].element.offset();this.containers[e].containerCache.left=g.left;this.containers[e].containerCache.top=g.top;this.containers[e].containerCache.width=this.containers[e].element.outerWidth();this.containers[e].containerCache.height=this.containers[e].element.outerHeight()}}return this},_createPlaceholder:function(d){d=d||this;var e=d.options;if(!e.placeholder||e.placeholder.constructor==String){var c=e.placeholder;e.placeholder={element:function(){var f=a(document.createElement(d.currentItem[0].nodeName)).addClass(c||d.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!c){f.style.visibility="hidden"}return f},update:function(f,g){if(c&&!e.forcePlaceholderSize){return}if(!g.height()){g.height(d.currentItem.innerHeight()-parseInt(d.currentItem.css("paddingTop")||0,10)-parseInt(d.currentItem.css("paddingBottom")||0,10))}if(!g.width()){g.width(d.currentItem.innerWidth()-parseInt(d.currentItem.css("paddingLeft")||0,10)-parseInt(d.currentItem.css("paddingRight")||0,10))}}}}d.placeholder=a(e.placeholder.element.call(d.element,d.currentItem));d.currentItem.after(d.placeholder);e.placeholder.update(d,d.placeholder)},_contactContainers:function(c){var e=null,n=null;for(var h=this.containers.length-1;h>=0;h--){if(a.contains(this.currentItem[0],this.containers[h].element[0])){continue}if(this._intersectsWith(this.containers[h].containerCache)){if(e&&a.contains(this.containers[h].element[0],e.element[0])){continue}e=this.containers[h];n=h}else{if(this.containers[h].containerCache.over){this.containers[h]._trigger("out",c,this._uiHash(this));this.containers[h].containerCache.over=0}}}if(!e){return}if(this.containers.length===1){this.containers[n]._trigger("over",c,this._uiHash(this));this.containers[n].containerCache.over=1}else{var m=10000;var k=null;var l=this.containers[n].floating?"left":"top";var o=this.containers[n].floating?"width":"height";var d=this.positionAbs[l]+this.offset.click[l];for(var f=this.items.length-1;f>=0;f--){if(!a.contains(this.containers[n].element[0],this.items[f].item[0])){continue}if(this.items[f].item[0]==this.currentItem[0]){continue}var p=this.items[f].item.offset()[l];var g=false;if(Math.abs(p-d)>Math.abs(p+this.items[f][o]-d)){g=true;p+=this.items[f][o]}if(Math.abs(p-d)<m){m=Math.abs(p-d);k=this.items[f];this.direction=g?"up":"down"}}if(!k&&!this.options.dropOnEmpty){return}this.currentContainer=this.containers[n];k?this._rearrange(c,k,null,true):this._rearrange(c,null,this.containers[n].element,true);this._trigger("change",c,this._uiHash());this.containers[n]._trigger("change",c,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[n]._trigger("over",c,this._uiHash(this));this.containers[n].containerCache.over=1}},_createHelper:function(d){var e=this.options;var c=a.isFunction(e.helper)?a(e.helper.apply(this.element[0],[d,this.currentItem])):(e.helper=="clone"?this.currentItem.clone():this.currentItem);if(!c.parents("body").length){a(e.appendTo!="parent"?e.appendTo:this.currentItem[0].parentNode)[0].appendChild(c[0])}if(c[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")}}if(c[0].style.width==""||e.forceHelperSize){c.width(this.currentItem.width())}if(c[0].style.height==""||e.forceHelperSize){c.height(this.currentItem.height())}return c},_adjustOffsetFromHelper:function(c){if(typeof c=="string"){c=c.split(" ")}if(a.isArray(c)){c={left:+c[0],top:+c[1]||0}}if("left" in c){this.offset.click.left=c.left+this.margins.left}if("right" in c){this.offset.click.left=this.helperProportions.width-c.right+this.margins.left}if("top" in c){this.offset.click.top=c.top+this.margins.top}if("bottom" in c){this.offset.click.top=this.helperProportions.height-c.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var c=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.contains(this.scrollParent[0],this.offsetParent[0])){c.left+=this.scrollParent.scrollLeft();c.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.ui.ie)){c={top:0,left:0}}return{top:c.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:c.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var c=this.currentItem.position();return{top:c.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:c.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{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 f=this.options;if(f.containment=="parent"){f.containment=this.helper[0].parentNode}if(f.containment=="document"||f.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(f.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(f.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(f.containment)){var d=a(f.containment)[0];var e=a(f.containment).offset();var c=(a(d).css("overflow")!="hidden");this.containment=[e.left+(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0)-this.margins.left,e.top+(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0)-this.margins.top,e.left+(c?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,e.top+(c?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(g,i){if(!i){i=this.position}var e=g=="absolute"?1:-1;var f=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,h=(/(html|body)/i).test(c[0].tagName);return{top:(i.top+this.offset.relative.top*e+this.offset.parent.top*e-((this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(h?0:c.scrollTop()))*e)),left:(i.left+this.offset.relative.left*e+this.offset.parent.left*e-((this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():h?0:c.scrollLeft())*e))}},_generatePosition:function(f){var i=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,j=(/(html|body)/i).test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()}var e=f.pageX;var d=f.pageY;if(this.originalPosition){if(this.containment){if(f.pageX-this.offset.click.left<this.containment[0]){e=this.containment[0]+this.offset.click.left}if(f.pageY-this.offset.click.top<this.containment[1]){d=this.containment[1]+this.offset.click.top}if(f.pageX-this.offset.click.left>this.containment[2]){e=this.containment[2]+this.offset.click.left}if(f.pageY-this.offset.click.top>this.containment[3]){d=this.containment[3]+this.offset.click.top}}if(i.grid){var h=this.originalPageY+Math.round((d-this.originalPageY)/i.grid[1])*i.grid[1];d=this.containment?(!(h-this.offset.click.top<this.containment[1]||h-this.offset.click.top>this.containment[3])?h:(!(h-this.offset.click.top<this.containment[1])?h-i.grid[1]:h+i.grid[1])):h;var g=this.originalPageX+Math.round((e-this.originalPageX)/i.grid[0])*i.grid[0];e=this.containment?(!(g-this.offset.click.left<this.containment[0]||g-this.offset.click.left>this.containment[2])?g:(!(g-this.offset.click.left<this.containment[0])?g-i.grid[0]:g+i.grid[0])):g}}return{top:(d-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+((this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(j?0:c.scrollTop())))),left:(e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+((this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():j?0:c.scrollLeft())))}},_rearrange:function(g,f,d,e){d?d[0].appendChild(this.placeholder[0]):f.item[0].parentNode.insertBefore(this.placeholder[0],(this.direction=="down"?f.item[0]:f.item[0].nextSibling));this.counter=this.counter?++this.counter:1;var c=this.counter;this._delay(function(){if(c==this.counter){this.refreshPositions(!e)}})},_clear:function(d,e){this.reverting=false;var f=[];if(!this._noFinalSort&&this.currentItem.parent().length){this.placeholder.before(this.currentItem)}this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var c in this._storedCSS){if(this._storedCSS[c]=="auto"||this._storedCSS[c]=="static"){this._storedCSS[c]=""}}this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else{this.currentItem.show()}if(this.fromOutside&&!e){f.push(function(g){this._trigger("receive",g,this._uiHash(this.fromOutside))})}if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!e){f.push(function(g){this._trigger("update",g,this._uiHash())})}if(this!==this.currentContainer){if(!e){f.push(function(g){this._trigger("remove",g,this._uiHash())});f.push((function(g){return function(h){g._trigger("receive",h,this._uiHash(this))}}).call(this,this.currentContainer));f.push((function(g){return function(h){g._trigger("update",h,this._uiHash(this))}}).call(this,this.currentContainer))}}for(var c=this.containers.length-1;c>=0;c--){if(!e){f.push((function(g){return function(h){g._trigger("deactivate",h,this._uiHash(this))}}).call(this,this.containers[c]))}if(this.containers[c].containerCache.over){f.push((function(g){return function(h){g._trigger("out",h,this._uiHash(this))}}).call(this,this.containers[c]));this.containers[c].containerCache.over=0}}if(this._storedCursor){a("body").css("cursor",this._storedCursor)}if(this._storedOpacity){this.helper.css("opacity",this._storedOpacity)}if(this._storedZIndex){this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex)}this.dragging=false;if(this.cancelHelperRemoval){if(!e){this._trigger("beforeStop",d,this._uiHash());for(var c=0;c<f.length;c++){f[c].call(this,d)}this._trigger("stop",d,this._uiHash())}this.fromOutside=false;return false}if(!e){this._trigger("beforeStop",d,this._uiHash())}this.placeholder[0].parentNode.removeChild(this.placeholder[0]);if(this.helper[0]!=this.currentItem[0]){this.helper.remove()}this.helper=null;if(!e){for(var c=0;c<f.length;c++){f[c].call(this,d)}this._trigger("stop",d,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){if(a.Widget.prototype._trigger.apply(this,arguments)===false){this.cancel()}},_uiHash:function(c){var d=c||this;return{helper:d.helper,placeholder:d.placeholder||a([]),position:d.position,originalPosition:d.originalPosition,offset:d.positionAbs,item:d.currentItem,sender:c?c.element:null}}})})(jQuery);PKAA#]|s����8system/helix3/language/en-GB/en-GB.plg_system_helix3.ininu�[���;Megamenu HELIX_MENU="Helix3 Megamenu Options" HELIX_SUB_MENU="Helix3 Menu Options" HELIX_MENU_SHOW_TITLE="Show Menu Title" HELIX_MENU_SHOW_TITLE_DESC="Disable this option to hide menu title." HELIX_MENU_ICON="Menu Icon" HELIX_MENU_ICON_DESC="Select any icon from the list to display just before this menu item title." HELIX_MENU_CLASS="Custom CSS Class" HELIX_MENU_CLASS_DESC="Add custom css class to this menu item." HELIX_MENU_MANAGE_LAYOUT="Manage Layout" HELIX_GLOBAL_LEFT="Left" HELIX_GLOBAL_CENTER="Center" HELIX_GLOBAL_RIGHT="Right" HELIX_GLOBAL_FULL="Full" HELIX_GLOBAL_RESET="Reset" HELIX_MENU_SUB_WIDTH="Dropdown Width" HELIX_MENU_DRAG_MODULE="Drag Module" HELIX_MENU_CHOOSE_LAYOUT="Choose Layout" HELIX_YES="Yes" HELIX_NO="NO" HELIX_MENU_DROPDOWN_POSITION="Dropdown Position" HELIX_MENU_DROPDOWN_POSITION_DESC="Set the position of the dropdown under this menu item." ;Page Title HELIX_PAGE_TITLE="Helix3 Page Title" ENABLE_PAGE_TITLE="Enable Page Title" ENABLE_PAGE_TITLE_DESC="Enable this option show page title after just below the header." ENABLE_PAGE_TITLE="Enable Page Title" ENABLE_PAGE_TITLE_DESC="Enable this option show page title after just below the header." PAGE_TITLE_ALT="Alternative Title" PAGE_TITLE_ALT_DESC="Alternative title will override joomla default menu title." PAGE_SUBTITLE="Page Subtitle" PAGE_SUBTITLE_DESC="Add brief description about the page as page subtitle." PAGE_BACKGROUND_COLOR="Background Color" PAGE_BACKGROUND_COLOR_DESC="Background color for the title area." PAGE_BACKGROUND_IMAGE="Background Image" PAGE_BACKGROUND_IMAGE_DESC="Background image for the title area." ;Blog BLOG_OPTIONS="<i class='fa fa-joomla fa-fw'></i>Helix3 Blog Options" BLOG_POST_FORMAT_STANDARD="<i class='fa fa-thumb-tack fa-fw'></i> Standard" BLOG_POST_FORMAT_VIDEO="<i class='fa fa-film fa-fw'></i> Video" BLOG_POST_FORMAT_GALLERY="<i class='fa fa-picture-o fa-fw'></i> Gallery" BLOG_POST_FORMAT_AUDIO="<i class='fa fa-music fa-fw'></i> Audio" BLOG_POST_FORMAT_LINK="<i class='fa fa-link fa-fw'></i> Link" BLOG_POST_FORMAT_QUOTE="<i class='fa fa-quote-left fa-fw'></i> Quote" BLOG_POST_FORMAT_STATUS="<i class='fa fa-comment-o fa-fw'></i> Status" BLOG_POST_FEATURE_IMAGE="Featured Image" BLOG_POST_FEATURE_IMAGE_ALTER_TEXT="Feature Image Alt Text" BLOG_POST_FEATURE_IMAGE_ALTER_TEXT_DESCRIPTION="Insert Feature image's alter text" BLOG_POST_FORMAT_GALLERY_LABEL="Upload Gallery Images" BLOG_POST_FORMAT_GALLERY_DESCRIPTION="Select one or more images" BLOG_POST_FORMAT_AUDIO_LABEL="Audio Embed Code" BLOG_POST_FORMAT_AUDIO_DESCRIPTION="Write Your Audio Embed Code Here" BLOG_POST_FORMAT_VIDEO_LABEL="Video URL" BLOG_POST_FORMAT_VIDEO_DESCRIPTION="Add YouTube or Vimeo full URL." BLOG_POST_FORMAT_LINK_TITLE_LABEL="Link Title" BLOG_POST_FORMAT_LINK_TITLE_DESCRIPTION="Add the title of the link." BLOG_POST_FORMAT_LINK_LABEL="Link URL" BLOG_POST_FORMAT_LINK_DESCRIPTION="Add Link URL." BLOG_POST_FORMAT_QUOTE_TEXT_LABEL="Quote Text" BLOG_POST_FORMAT_QUOTE_TEXT_DESCRIPTION="Add quote text" BLOG_POST_FORMAT_QUOTE_AUTHOR_LABEL="Quote Author" BLOG_POST_FORMAT_QUOTE_AUTHOR_DESCRIPTION="Add Quote Author. e.g. John Doe" BLOG_POST_FORMAT_STATUS_LABEL="Add Status" BLOG_POST_FORMAT_STATUS_DESCRIPTION="Add embeded status. Write Facebook, Twitter etc status link" PKAA#]��>�^^ system/rstbox/script.install.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); require_once __DIR__ . '/script.install.helper.php'; class PlgSystemRstboxInstallerScript extends PlgSystemRstboxInstallerScriptHelper { public $name = 'RSTBOXRENDER'; public $alias = 'rstbox'; public $extension_type = 'plugin'; } PKAA#]�H����system/rstbox/rstbox.phpnu�[���<?php /** * @package EngageBox * @version 5.1.3 Pro * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2019 Tassos Marinos All Rights Reserved * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later */ defined('_JEXEC') or die('Restricted access'); jimport('joomla.filesystem.file'); /** * EngageBox Render Plugin */ class PlgSystemRstBox extends JPlugin { /** * Application Object * * @var object */ protected $app; /** * Boxes final HTML layout * * @var string */ private $html; /** * Component's param object * * @var JRegistry */ private $param; /** * The loaded indicator of helper * * @var boolean */ private $init; /** * onAfterDispatch Event */ public function onAfterDispatch() { // Get Helper if (!$this->getHelper()) { return; } // Preview a box template if ($preview_box = $this->app->input->get('engagebox_preview_template', null, 'BASE64')) { $this->html = EngageBox\Templates::render(base64_decode($preview_box)); return; } // Hide a popup via query string if ($popups_to_hide = (array) $this->app->input->getInt('engagebox_hide')) { foreach ($popups_to_hide as $popup_to_hide) { $cookie = new EngageBox\Cookie($popup_to_hide); $cookie->set(); } } $this->html = EngageBox\Boxes::render(); } /** * Listening to the onAfterRender event in order to append the boxes to the document */ public function onAfterRender() { // Get Helper if (!$this->getHelper()) { return; } // Break if no boxes found if (!$html = $this->html) { return; } // Prepare replacements $buffer = $this->app->getBody(); $closingTag = '</body>'; if (strpos($buffer, $closingTag)) { // If </body> exists prepend the box HTML $buffer = str_replace($closingTag, $html . $closingTag, $buffer); } else { // If </body> does not exist append to document's end $buffer .= $html; } // Set body's final layout $this->app->setBody($buffer); } /** * Method to handle AJAX requests. * If not passed a valid token the request will abort. * * Listening on URL: ?option=com_ajax&format=raw&plugin=rstbox&task=track * * @return JSON result formated in JSON */ public function onAjaxRstbox() { error_reporting(E_ALL & ~E_NOTICE); // JSession::checkToken('request') or die('Invalid Token'); // Check if a valid task passed if (!$task = $this->app->input->get('task', null)) { die('Invalid Task'); return; } // Check if task method exists $taskMethod = 'task' . ucfirst($task); if (!method_exists($this, $taskMethod)) { die('Task not found'); return; } // Initialize EngageBox Library if (!@include_once(JPATH_ADMINISTRATOR . '/components/com_rstbox/autoload.php')) { return; } // Run method $this->$taskMethod(); // Stop execution jexit(); } private function taskTrackEvent() { // Get the event name if (!$event = $this->app->input->get('event', null, 'WORD')) { die('Invalid Event'); return; } // Make sure we have a valid box ID passed if (!$box_id = $this->app->input->get('box', null, 'INT')) { die('Invalid Box ID'); return; } // Load box settings if (!$box = EngageBox\Box::get($box_id)) { return; } // Trigger Open & Close Event \JPluginHelper::importPlugin('engagebox'); $this->app->triggerEvent('onEngageBox' . ucfirst($event), [$box]); $options = $this->app->input->get('options', '', 'array'); $response['success'] = true; if ($event == 'open') { // Do not track when box is on test mode if (!$box->testmode) { EngageBox\Box::logOpenEvent($box_id); } } // Log impression in the database if ($event == 'close') { // Do not set any cookie if box is on test mode if (!$box->testmode && !isset($options['temporary'])) { $cookie = new EngageBox\Cookie($box_id); $cookie->set(); if ($cookie->exist()) { $response['action'] = 'stop'; } } } JFactory::getDocument()->setMimeEncoding('application/json'); echo json_encode($response); } /** * Loads the helper classes of plugin * * @return bool */ private function getHelper() { // Return if is helper is already loaded if ($this->init) { return true; } // Return if we are not in frontend if (!$this->app->isClient('site')) { return false; } // Return if compnent is not enabled $component = JComponentHelper::getComponent('com_rstbox', true); if (!$component->enabled) { return; } $this->param = $component->params; // Handle the component execution when the tmpl request paramter is overriden if (!$this->param->get("executeoutputoverride", false) && $this->app->input->get('tmpl', null, "cmd") != null) { return false; } // Run only on HTML pages if ($this->app->input->get('format', 'html', 'cmd') != 'html' || JFactory::getDocument()->getType() !== 'html') { return false; } // Initialize EngageBox Library if (!@include_once(JPATH_ADMINISTRATOR . '/components/com_rstbox/autoload.php')) { return false; } // Load Novarain Framework if (!@include_once(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { return false; } // Return if document type is Feed if (NRFramework\Functions::isFeed()) { return false; } return ($this->init = true); } }PKAA#]6C����system/rstbox/rstbox.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.4" type="plugin" group="system" method="upgrade"> <name>PLG_SYSTEM_RSTBOX</name> <description>PLG_SYSTEM_RSTBOX_DESC</description> <version>3.0</version> <creationDate>September 2015</creationDate> <copyright>Copyright © 2019 Tassos Marinos All Rights Reserved</copyright> <license>http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL</license> <author>Tassos Marinos</author> <authorEmail>info@tassos.gr</authorEmail> <authorUrl>http://www.tassos.gr</authorUrl> <scriptfile>script.install.php</scriptfile> <files> <filename plugin="rstbox">rstbox.php</filename> <filename>script.install.helper.php</filename> <folder>language</folder> </files> </extension>PKAA#]�5EKK8system/rstbox/language/en-GB/en-GB.plg_system_rstbox.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr/joomla-extensions ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr RSTBOXRENDER="EngageBox" PLG_SYSTEM_RSTBOX="System - EngageBox" PLG_SYSTEM_RSTBOX_DESC="System - EngageBox"PKAA#]�#o,,'system/rstbox/language/en-GB/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PKAA#];��22<system/rstbox/language/en-GB/en-GB.plg_system_rstbox.sys.ininu�[���; @package EngageBox ; @version 5.1.3 Pro ; ; @author Tassos Marinos - http://www.tassos.gr/joomla-extensions ; @copyright Copyright (c) 2018 Tassos Marinos. All rights reserved. ; @license http://www.tassos.gr PLG_SYSTEM_RSTBOX="System - EngageBox" PLG_SYSTEM_RSTBOX_DESC="System - EngageBox"PKAA#] ���w9w9'system/rstbox/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgSystemRstboxInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"; $NR_PRO = true; // If version file does not exist we assume we have a PRO version installed if (file_exists($versionFile)) { require_once($versionFile); } // The free version is installed. Accept install. if (!(bool)$NR_PRO) { return true; } // Current package is a PRO version. Accept install. if ($this->isPro()) { return true; } // User is trying to update from PRO version to FREE. Do not accept install. JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, __DIR__); JFactory::getApplication()->enqueueMessage( JText::_('NRI_ERROR_PRO_TO_FREE'), 'error' ); JFactory::getApplication()->enqueueMessage( html_entity_decode( JText::sprintf( 'NRI_ERROR_UNINSTALL_FIRST', '<a href="http://www.tassos.gr/joomla-extensions/' . $this->alias . '" target="_blank">', '</a>', JText::_($this->name) ) ), 'error' ); return false; } /** * Checks if current version is newer than the installed one * Used for Novarain Framework * * @return boolean [description] */ public function isNewer() { if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } $package_version = $this->getVersion(); return version_compare($installed_version, $package_version, '<='); } /** * Helper method triggered before installation * * @return bool */ public function onBeforeInstall() { if (!$this->canInstall()) { return false; } } /** * Helper method triggered after installation */ public function onAfterInstall() { } /** * Delete files * * @param array $folders */ public function deleteFiles($files = array()) { foreach ($files as $key => $file) { JFile::delete($file); } } /** * Deletes folders * * @param array $folders */ public function deleteFolders($folders = array()) { foreach ($folders as $folder) { if (!is_dir($folder)) { continue; } JFolder::delete($folder); } } public function dropIndex($table, $index) { $db = $this->db; // Check if index exists first $query = 'SHOW INDEX FROM ' . $db->quoteName('#__' . $table) . ' WHERE KEY_NAME = ' . $db->quote($index); $db->setQuery($query); $db->execute(); if (!$db->loadResult()) { return; } // Remove index $query = 'ALTER TABLE ' . $db->quoteName('#__' . $table) . ' DROP INDEX ' . $db->quoteName($index); $db->setQuery($query); $db->execute(); } public function dropUnwantedTables($tables) { if (!$tables) { return; } foreach ($tables as $table) { $query = "DROP TABLE IF EXISTS #__".$this->db->escape($table); $this->db->setQuery($query); $this->db->execute(); } } public function dropUnwantedColumns($table, $columns) { if (!$columns || !$table) { return; } $db = $this->db; // Check if columns exists in database function qt($n) { return(JFactory::getDBO()->quote($n)); } $query = 'SHOW COLUMNS FROM #__'.$table.' WHERE Field IN ('.implode(",", array_map("qt", $columns)).')'; $db->setQuery($query); $rows = $db->loadColumn(0); // Abort if we don't have any rows if (!$rows) { return; } // Let's remove the columns $q = ""; foreach ($rows as $key => $column) { $comma = (($key+1) < count($rows)) ? "," : ""; $q .= "drop ".$this->db->escape($column).$comma; } $query = "alter table #__".$table." $q"; $db->setQuery($query); $db->execute(); } public function fetch($table, $columns = "*", $where = null, $singlerow = false) { if (!$table) { return; } $db = $this->db; $query = $db->getQuery(true); $query ->select($columns) ->from("#__$table"); if (isset($where)) { $query->where("$where"); } $db->setQuery($query); return ($singlerow) ? $db->loadObject() : $db->loadObjectList(); } /** * Load the Novarain Framework * * @return boolean */ public function loadFramework() { if (is_file(JPATH_PLUGINS . '/system/nrframework/autoload.php')) { include_once JPATH_PLUGINS . '/system/nrframework/autoload.php'; } } /** * Re-orders plugin after passed array of plugins * * @param string $plugin Plugin element name * @param array $lowerPluginOrder Array of plugin element names * * @return boolean */ public function pluginOrderAfter($lowerPluginOrder) { if (!is_array($lowerPluginOrder) || !count($lowerPluginOrder)) { return; } $db = $this->db; // Get plugins max order $query = $db->getQuery(true); $query ->select($db->quoteName('b.ordering')) ->from($db->quoteName('#__extensions', 'b')) ->where($db->quoteName('b.element') . ' IN ("'.implode("\",\"",$lowerPluginOrder).'")') ->order('b.ordering desc'); $db->setQuery($query); $maxOrder = $db->loadResult(); if (is_null($maxOrder)) { return; } // Get plugin details $query ->clear() ->select(array($db->quoteName('extension_id'), $db->quoteName('ordering'))) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('element') . ' = ' . $db->quote($this->alias)); $db->setQuery($query); $pluginInfo = $db->loadObject(); if (!isset($pluginInfo->ordering) || $pluginInfo->ordering > $maxOrder) { return; } // Update the new plugin order $object = new stdClass(); $object->extension_id = $pluginInfo->extension_id; $object->ordering = ($maxOrder + 1); try { $db->updateObject('#__extensions', $object, 'extension_id'); } catch (Exception $e) { return $e->getMessage(); } } } PKAA#]U#l system/sef/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.sef * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\Sef\Extension\Sef; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Sef( $dispatcher, (array) PluginHelper::getPlugin('system', 'sef') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PKAA#]���j system/sef/src/Extension/Sef.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.sef * * @copyright (C) 2007 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Sef\Extension; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! SEF Plugin. * * @since 1.5 */ final class Sef extends CMSPlugin { /** * Add the canonical uri to the head. * * @return void * * @since 3.5 */ public function onAfterDispatch() { $doc = $this->getApplication()->getDocument(); if (!$this->getApplication()->isClient('site') || $doc->getType() !== 'html') { return; } $sefDomain = $this->params->get('domain', false); // Don't add a canonical html tag if no alternative domain has added in SEF plugin domain field. if (empty($sefDomain)) { return; } // Check if a canonical html tag already exists (for instance, added by a component). $canonical = ''; foreach ($doc->_links as $linkUrl => $link) { if (isset($link['relation']) && $link['relation'] === 'canonical') { $canonical = $linkUrl; break; } } // If a canonical html tag already exists get the canonical and change it to use the SEF plugin domain field. if (!empty($canonical)) { // Remove current canonical link. unset($doc->_links[$canonical]); // Set the current canonical link but use the SEF system plugin domain field. $canonical = $sefDomain . Uri::getInstance($canonical)->toString(['path', 'query', 'fragment']); } else { // If a canonical html doesn't exists already add a canonical html tag using the SEF plugin domain field. $canonical = $sefDomain . Uri::getInstance()->toString(['path', 'query', 'fragment']); } // Add the canonical link. $doc->addHeadLink(htmlspecialchars($canonical), 'canonical'); } /** * Convert the site URL to fit to the HTTP request. * * @return void */ public function onAfterRender() { if (!$this->getApplication()->isClient('site')) { return; } // Replace src links. $base = Uri::base(true) . '/'; $buffer = $this->getApplication()->getBody(); // For feeds we need to search for the URL with domain. $prefix = $this->getApplication()->getDocument()->getType() === 'feed' ? Uri::root() : ''; // Replace index.php URI by SEF URI. if (strpos($buffer, 'href="' . $prefix . 'index.php?') !== false) { preg_match_all('#href="' . $prefix . 'index.php\?([^"]+)"#m', $buffer, $matches); foreach ($matches[1] as $urlQueryString) { $buffer = str_replace( 'href="' . $prefix . 'index.php?' . $urlQueryString . '"', 'href="' . $prefix . Route::_('index.php?' . $urlQueryString) . '"', $buffer ); } $this->checkBuffer($buffer); } // Check for all unknown protocols (a protocol must contain at least one alphanumeric character followed by a ":"). $protocols = '[a-zA-Z0-9\-]+:'; $attributes = ['href=', 'src=', 'poster=']; foreach ($attributes as $attribute) { if (strpos($buffer, $attribute) !== false) { $regex = '#\s' . $attribute . '"(?!/|' . $protocols . '|\#|\')([^"]*)"#m'; $buffer = preg_replace($regex, ' ' . $attribute . '"' . $base . '$1"', $buffer); $this->checkBuffer($buffer); } } if (strpos($buffer, 'srcset=') !== false) { $regex = '#\s+srcset="([^"]+)"#m'; $buffer = preg_replace_callback( $regex, function ($match) use ($base, $protocols) { preg_match_all('#(?:[^\s]+)\s*(?:[\d\.]+[wx])?(?:\,\s*)?#i', $match[1], $matches); foreach ($matches[0] as &$src) { $src = preg_replace('#^(?!/|' . $protocols . '|\#|\')(.+)#', $base . '$1', $src); } return ' srcset="' . implode($matches[0]) . '"'; }, $buffer ); $this->checkBuffer($buffer); } // Replace all unknown protocols in javascript window open events. if (strpos($buffer, 'window.open(') !== false) { $regex = '#onclick="window.open\(\'(?!/|' . $protocols . '|\#)([^/]+[^\']*?\')#m'; $buffer = preg_replace($regex, 'onclick="window.open(\'' . $base . '$1', $buffer); $this->checkBuffer($buffer); } // Replace all unknown protocols in onmouseover and onmouseout attributes. $attributes = ['onmouseover=', 'onmouseout=']; foreach ($attributes as $attribute) { if (strpos($buffer, $attribute) !== false) { $regex = '#' . $attribute . '"this.src=([\']+)(?!/|' . $protocols . '|\#|\')([^"]+)"#m'; $buffer = preg_replace($regex, $attribute . '"this.src=$1' . $base . '$2"', $buffer); $this->checkBuffer($buffer); } } // Replace all unknown protocols in CSS background image. if (strpos($buffer, 'style=') !== false) { $regex_url = '\s*url\s*\(([\'\"]|\&\#0?3[49];)?(?!/|\&\#0?3[49];|' . $protocols . '|\#)([^\)\'\"]+)([\'\"]|\&\#0?3[49];)?\)'; $regex = '#style=\s*([\'\"])(.*):' . $regex_url . '#m'; $buffer = preg_replace($regex, 'style=$1$2: url($3' . $base . '$4$5)', $buffer); $this->checkBuffer($buffer); } // Replace all unknown protocols in OBJECT param tag. if (strpos($buffer, '<param') !== false) { // OBJECT <param name="xx", value="yy"> -- fix it only inside the <param> tag. $regex = '#(<param\s+)name\s*=\s*"(movie|src|url)"[^>]\s*value\s*=\s*"(?!/|' . $protocols . '|\#|\')([^"]*)"#m'; $buffer = preg_replace($regex, '$1name="$2" value="' . $base . '$3"', $buffer); $this->checkBuffer($buffer); // OBJECT <param value="xx", name="yy"> -- fix it only inside the <param> tag. $regex = '#(<param\s+[^>]*)value\s*=\s*"(?!/|' . $protocols . '|\#|\')([^"]*)"\s*name\s*=\s*"(movie|src|url)"#m'; $buffer = preg_replace($regex, '<param value="' . $base . '$2" name="$3"', $buffer); $this->checkBuffer($buffer); } // Replace all unknown protocols in OBJECT tag. if (strpos($buffer, '<object') !== false) { $regex = '#(<object\s+[^>]*)data\s*=\s*"(?!/|' . $protocols . '|\#|\')([^"]*)"#m'; $buffer = preg_replace($regex, '$1data="' . $base . '$2"', $buffer); $this->checkBuffer($buffer); } // Use the replaced HTML body. $this->getApplication()->setBody($buffer); } /** * Check the buffer. * * @param string $buffer Buffer to be checked. * * @return void */ private function checkBuffer($buffer) { if ($buffer === null) { switch (preg_last_error()) { case PREG_BACKTRACK_LIMIT_ERROR: $message = 'PHP regular expression limit reached (pcre.backtrack_limit)'; break; case PREG_RECURSION_LIMIT_ERROR: $message = 'PHP regular expression limit reached (pcre.recursion_limit)'; break; case PREG_BAD_UTF8_ERROR: $message = 'Bad UTF8 passed to PCRE function'; break; default: $message = 'Unknown PCRE error calling PCRE function'; } throw new \RuntimeException($message); } } } PKAA#]i�q-nnsystem/sef/sef.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_sef</name> <author>Joomla! Project</author> <creationDate>2007-12</creationDate> <copyright>(C) 2007 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_SEF_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\Sef</namespace> <files> <folder plugin="sef">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_system_sef.ini</language> <language tag="en-GB">language/en-GB/plg_system_sef.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="domain" type="url" label="PLG_SEF_DOMAIN_LABEL" description="PLG_SEF_DOMAIN_DESCRIPTION" hint="https://www.example.com" filter="url" validate="url" /> </fieldset> </fields> </config> </extension> PKAA#]�%�nn"system/guidedtours/guidedtours.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_guidedtours</name> <author>Joomla! Project</author> <creationDate>2023-02</creationDate> <copyright>(C) 2023 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.3.0</version> <description>PLG_SYSTEM_GUIDEDTOURS_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\GuidedTours</namespace> <files> <folder plugin="guidedtours">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_system_guidedtours.ini</language> <language tag="en-GB">language/en-GB/plg_system_guidedtours.sys.ini</language> </languages> </extension> PKAA#]����SS(system/guidedtours/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.guidedtours * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\WebAsset\WebAssetRegistry; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\GuidedTours\Extension\GuidedTours; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $app = Factory::getApplication(); $plugin = new GuidedTours( $dispatcher, (array) PluginHelper::getPlugin('system', 'guidedtours'), $app->isClient('administrator') ); $plugin->setApplication($app); $wa = $container->get(WebAssetRegistry::class); $wa->addRegistryFile('media/plg_system_guidedtours/joomla.asset.json'); return $plugin; } ); } }; PKAA#]�5̍WW0system/guidedtours/src/Extension/GuidedTours.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.guidedtours * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\GuidedTours\Extension; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Session\Session; use Joomla\Component\Guidedtours\Administrator\Extension\GuidedtoursComponent; use Joomla\Event\DispatcherInterface; use Joomla\Event\Event; use Joomla\Event\SubscriberInterface; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Guided Tours plugin to add interactive tours to the administrator interface. * * @since 4.3.0 */ final class GuidedTours extends CMSPlugin implements SubscriberInterface { /** * A mapping for the step types * * @var string[] * @since 4.3.0 */ protected $stepType = [ GuidedtoursComponent::STEP_NEXT => 'next', GuidedtoursComponent::STEP_REDIRECT => 'redirect', GuidedtoursComponent::STEP_INTERACTIVE => 'interactive', ]; /** * A mapping for the step interactive types * * @var string[] * @since 4.3.0 */ protected $stepInteractiveType = [ GuidedtoursComponent::STEP_INTERACTIVETYPE_FORM_SUBMIT => 'submit', GuidedtoursComponent::STEP_INTERACTIVETYPE_TEXT => 'text', GuidedtoursComponent::STEP_INTERACTIVETYPE_OTHER => 'other', GuidedtoursComponent::STEP_INTERACTIVETYPE_BUTTON => 'button', ]; /** * An internal flag whether plugin should listen any event. * * @var bool * * @since 4.3.0 */ protected static $enabled = false; /** * Constructor * * @param DispatcherInterface $subject The object to observe * @param array $config An optional associative array of configuration settings. * @param boolean $enabled An internal flag whether plugin should listen any event. * * @since 4.3.0 */ public function __construct($subject, array $config = [], bool $enabled = false) { $this->autoloadLanguage = $enabled; self::$enabled = $enabled; parent::__construct($subject, $config); } /** * function for getSubscribedEvents : new Joomla 4 feature * * @return array * * @since 4.3.0 */ public static function getSubscribedEvents(): array { return self::$enabled ? [ 'onAjaxGuidedtours' => 'startTour', 'onBeforeCompileHead' => 'onBeforeCompileHead', ] : []; } /** * Retrieve and starts a tour and its steps through Ajax. * * @return null|object * * @since 4.3.0 */ public function startTour(Event $event) { $tourId = (int) $this->getApplication()->getInput()->getInt('id'); $activeTourId = null; $tour = null; if ($tourId > 0) { $tour = $this->getTour($tourId); if (!empty($tour->id)) { $activeTourId = $tour->id; } } $event->setArgument('result', $tour ?? new \stdClass()); return $tour; } /** * Listener for the `onBeforeCompileHead` event * * @return void * * @since 4.3.0 */ public function onBeforeCompileHead() { $app = $this->getApplication(); $doc = $app->getDocument(); $user = $app->getIdentity(); if ($user != null && $user->id > 0) { Text::script('JCANCEL'); Text::script('PLG_SYSTEM_GUIDEDTOURS_BACK'); Text::script('PLG_SYSTEM_GUIDEDTOURS_COMPLETE'); Text::script('PLG_SYSTEM_GUIDEDTOURS_COULD_NOT_LOAD_THE_TOUR'); Text::script('PLG_SYSTEM_GUIDEDTOURS_NEXT'); Text::script('PLG_SYSTEM_GUIDEDTOURS_START'); Text::script('PLG_SYSTEM_GUIDEDTOURS_STEP_NUMBER_OF'); Text::script('PLG_SYSTEM_GUIDEDTOURS_TOUR_ERROR'); $doc->addScriptOptions('com_guidedtours.token', Session::getFormToken()); // Load required assets $doc->getWebAssetManager() ->usePreset('plg_system_guidedtours.guidedtours'); } } /** * Get a tour and its steps or null if not found * * @param integer $tourId The ID of the tour to load * * @return null|object * * @since 4.3.0 */ private function getTour(int $tourId) { $app = $this->getApplication(); $user = $app->getIdentity(); $factory = $app->bootComponent('com_guidedtours')->getMVCFactory(); $tourModel = $factory->createModel( 'Tour', 'Administrator', ['ignore_request' => true] ); $item = $tourModel->getItem($tourId); if (empty($item->id) || $item->published < 1 || !in_array($item->access, $user->getAuthorisedViewLevels())) { return null; } // We don't want to show all parameters, so take only a subset of the tour attributes $tour = new \stdClass(); $tour->id = $item->id; $stepsModel = $factory->createModel( 'Steps', 'Administrator', ['ignore_request' => true] ); $stepsModel->setState('filter.tour_id', $item->id); $stepsModel->setState('filter.published', 1); $stepsModel->setState('list.ordering', 'a.ordering'); $stepsModel->setState('list.direction', 'ASC'); $steps = $stepsModel->getItems(); $tour->steps = []; $temp = new \stdClass(); $temp->id = 0; $temp->title = $this->getApplication()->getLanguage()->_($item->title); $temp->description = $this->getApplication()->getLanguage()->_($item->description); $temp->url = $item->url; // Replace 'images/' to '../images/' when using an image from /images in backend. $temp->description = preg_replace('*src\=\"(?!administrator\/)images/*', 'src="../images/', $temp->description); $tour->steps[] = $temp; foreach ($steps as $i => $step) { $temp = new \stdClass(); $temp->id = $i + 1; $temp->title = $this->getApplication()->getLanguage()->_($step->title); $temp->description = $this->getApplication()->getLanguage()->_($step->description); $temp->position = $step->position; $temp->target = $step->target; $temp->type = $this->stepType[$step->type]; $temp->interactive_type = $this->stepInteractiveType[$step->interactive_type]; $temp->url = $step->url; // Replace 'images/' to '../images/' when using an image from /images in backend. $temp->description = preg_replace('*src\=\"(?!administrator\/)images/*', 'src="../images/', $temp->description); $tour->steps[] = $temp; } return $tour; } } PKAA#]d����0system/debug/src/DataCollector/InfoCollector.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.Debug * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug\DataCollector; use DebugBar\DataCollector\AssetProvider; use Joomla\CMS\Application\AdministratorApplication; use Joomla\CMS\Application\SiteApplication; use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; use Joomla\CMS\User\User; use Joomla\Plugin\System\Debug\AbstractDataCollector; use Joomla\Registry\Registry; use Psr\Http\Message\ResponseInterface; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * InfoDataCollector * * @since 4.0.0 */ class InfoCollector extends AbstractDataCollector implements AssetProvider { /** * Collector name. * * @var string * @since 4.0.0 */ private $name = 'info'; /** * Request ID. * * @var string * @since 4.0.0 */ private $requestId; /** * InfoDataCollector constructor. * * @param Registry $params Parameters * @param string $requestId Request ID * * @since 4.0.0 */ public function __construct(Registry $params, $requestId) { $this->requestId = $requestId; parent::__construct($params); } /** * Returns the unique name of the collector * * @since 4.0.0 * @return string */ public function getName(): string { return $this->name; } /** * Returns a hash where keys are control names and their values * an array of options as defined in {@see \DebugBar\JavascriptRenderer::addControl()} * * @since 4.0.0 * @return array */ public function getWidgets(): array { return [ 'info' => [ 'icon' => 'info-circle', 'title' => 'J! Info', 'widget' => 'PhpDebugBar.Widgets.InfoWidget', 'map' => $this->name, 'default' => '{}', ], ]; } /** * Returns an array with the following keys: * - base_path * - base_url * - css: an array of filenames * - js: an array of filenames * * @since 4.0.0 * @return array */ public function getAssets(): array { return [ 'js' => Uri::root(true) . '/media/plg_system_debug/widgets/info/widget.min.js', 'css' => Uri::root(true) . '/media/plg_system_debug/widgets/info/widget.min.css', ]; } /** * Called by the DebugBar when data needs to be collected * * @since 4.0.0 * * @return array Collected data */ public function collect(): array { /** @type SiteApplication|AdministratorApplication $application */ $application = Factory::getApplication(); $model = $application->bootComponent('com_admin') ->getMVCFactory()->createModel('Sysinfo', 'Administrator'); return [ 'phpVersion' => PHP_VERSION, 'joomlaVersion' => JVERSION, 'requestId' => $this->requestId, 'identity' => $this->getIdentityInfo($application->getIdentity()), 'response' => $this->getResponseInfo($application->getResponse()), 'template' => $this->getTemplateInfo($application->getTemplate(true)), 'database' => $this->getDatabaseInfo($model->getInfo()), ]; } /** * Get Identity info. * * @param User $identity The identity. * * @since 4.0.0 * * @return array */ private function getIdentityInfo(User $identity): array { if (!$identity->id) { return ['type' => 'guest']; } return [ 'type' => 'user', 'id' => $identity->id, 'name' => $identity->name, 'username' => $identity->username, ]; } /** * Get response info. * * @param ResponseInterface $response The response. * * @since 4.0.0 * * @return array */ private function getResponseInfo(ResponseInterface $response): array { return [ 'status_code' => $response->getStatusCode(), ]; } /** * Get template info. * * @param object $template The template. * * @since 4.0.0 * * @return array */ private function getTemplateInfo($template): array { return [ 'template' => $template->template ?? '', 'home' => $template->home ?? '', 'id' => $template->id ?? '', ]; } /** * Get database info. * * @param array $info General information. * * @since 4.0.0 * * @return array */ private function getDatabaseInfo(array $info): array { return [ 'dbserver' => $info['dbserver'] ?? '', 'dbversion' => $info['dbversion'] ?? '', 'dbcollation' => $info['dbcollation'] ?? '', 'dbconnectioncollation' => $info['dbconnectioncollation'] ?? '', 'dbconnectionencryption' => $info['dbconnectionencryption'] ?? '', 'dbconnencryptsupported' => $info['dbconnencryptsupported'] ?? '', ]; } } PKAA#]A�um**;system/debug/src/DataCollector/LanguageStringsCollector.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.Debug * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug\DataCollector; use DebugBar\DataCollector\AssetProvider; use Joomla\CMS\Factory; use Joomla\CMS\Language\Language; use Joomla\CMS\Uri\Uri; use Joomla\Plugin\System\Debug\AbstractDataCollector; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * LanguageStringsDataCollector * * @since 4.0.0 */ class LanguageStringsCollector extends AbstractDataCollector implements AssetProvider { /** * Collector name. * * @var string * @since 4.0.0 */ private $name = 'languageStrings'; /** * Called by the DebugBar when data needs to be collected * * @since 4.0.0 * * @return array Collected data */ public function collect(): array { return [ 'data' => $this->getData(), 'count' => $this->getCount(), ]; } /** * Returns the unique name of the collector * * @since 4.0.0 * * @return string */ public function getName(): string { return $this->name; } /** * Returns a hash where keys are control names and their values * an array of options as defined in {@see \DebugBar\JavascriptRenderer::addControl()} * * @since 4.0.0 * * @return array */ public function getWidgets(): array { return [ 'untranslated' => [ 'icon' => 'question-circle', 'widget' => 'PhpDebugBar.Widgets.languageStringsWidget', 'map' => $this->name . '.data', 'default' => '', ], 'untranslated:badge' => [ 'map' => $this->name . '.count', 'default' => 'null', ], ]; } /** * Returns an array with the following keys: * - base_path * - base_url * - css: an array of filenames * - js: an array of filenames * * @since 4.0.0 * @return array */ public function getAssets(): array { return [ 'js' => Uri::root(true) . '/media/plg_system_debug/widgets/languageStrings/widget.min.js', 'css' => Uri::root(true) . '/media/plg_system_debug/widgets/languageStrings/widget.min.css', ]; } /** * Collect data. * * @return array * * @since 4.0.0 */ private function getData(): array { $orphans = Factory::getLanguage()->getOrphans(); $data = []; foreach ($orphans as $orphan => $occurrences) { $data[$orphan] = []; foreach ($occurrences as $occurrence) { $item = []; $item['string'] = $occurrence['string'] ?? 'n/a'; $item['trace'] = []; $item['caller'] = ''; if (isset($occurrence['trace'])) { $cnt = 0; $trace = []; $callerLocation = ''; array_shift($occurrence['trace']); foreach ($occurrence['trace'] as $i => $stack) { $class = $stack['class'] ?? ''; $file = $stack['file'] ?? ''; $line = $stack['line'] ?? ''; $caller = $this->formatCallerInfo($stack); $location = $file && $line ? "$file:$line" : 'same'; $isCaller = 0; if (!$callerLocation && $class !== Language::class && !strpos($file, 'Text.php')) { $callerLocation = $location; $isCaller = 1; } $trace[] = [ \count($occurrence['trace']) - $cnt, $isCaller, $caller, $file, $line, ]; $cnt++; } $item['trace'] = $trace; $item['caller'] = $callerLocation; } $data[$orphan][] = $item; } } return [ 'orphans' => $data, 'jroot' => JPATH_ROOT, 'xdebugLink' => $this->getXdebugLinkTemplate(), ]; } /** * Get a count value. * * @return integer * * @since 4.0.0 */ private function getCount(): int { return \count(Factory::getLanguage()->getOrphans()); } } PKAA#]bY��3system/debug/src/DataCollector/SessionCollector.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.Debug * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug\DataCollector; use Joomla\CMS\Factory; use Joomla\Plugin\System\Debug\AbstractDataCollector; use Joomla\Plugin\System\Debug\Extension\Debug; use Joomla\Registry\Registry; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * SessionDataCollector * * @since 4.0.0 */ class SessionCollector extends AbstractDataCollector { /** * Collector name. * * @var string * @since 4.0.0 */ private $name = 'session'; /** * Collected data. * * @var array * @since 4.4.0 */ protected $sessionData; /** * Constructor. * * @param Registry $params Parameters. * @param bool $collect Collect the session data. * * @since 4.4.0 */ public function __construct($params, $collect = false) { parent::__construct($params); if ($collect) { $this->collect(); } } /** * Called by the DebugBar when data needs to be collected * * @param bool $overwrite Overwrite the previously collected session data. * * @return array Collected data * * @since 4.0.0 */ public function collect($overwrite = false) { if ($this->sessionData === null || $overwrite) { $this->sessionData = []; $data = Factory::getApplication()->getSession()->all(); // redact value of potentially secret keys array_walk_recursive($data, static function (&$value, $key) { if (!preg_match(Debug::PROTECTED_COLLECTOR_KEYS, $key)) { return; } $value = '***redacted***'; }); foreach ($data as $key => $value) { $this->sessionData[$key] = $this->getDataFormatter()->formatVar($value); } } return ['data' => $this->sessionData]; } /** * Returns the unique name of the collector * * @since 4.0.0 * * @return string */ public function getName() { return $this->name; } /** * Returns a hash where keys are control names and their values * an array of options as defined in {@see \DebugBar\JavascriptRenderer::addControl()} * * @since 4.0.0 * * @return array */ public function getWidgets() { return [ 'session' => [ 'icon' => 'key', 'widget' => 'PhpDebugBar.Widgets.VariableListWidget', 'map' => $this->name . '.data', 'default' => '[]', ], ]; } } PKAA#]ff�5��2system/debug/src/DataCollector/MemoryCollector.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.Debug * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug\DataCollector; use Joomla\Plugin\System\Debug\AbstractDataCollector; use Joomla\Registry\Registry; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Collects info about the request duration as well as providing * a way to log duration of any operations * * @since 4.4.0 */ class MemoryCollector extends AbstractDataCollector { /** * @var boolean * @since 4.4.0 */ protected $realUsage = false; /** * @var float * @since 4.4.0 */ protected $peakUsage = 0; /** * @param Registry $params Parameters. * @param float $peakUsage * @param boolean $realUsage * * @since 4.4.0 */ public function __construct(Registry $params, $peakUsage = null, $realUsage = null) { parent::__construct($params); if ($peakUsage !== null) { $this->peakUsage = $peakUsage; } if ($realUsage !== null) { $this->realUsage = $realUsage; } } /** * Returns whether total allocated memory page size is used instead of actual used memory size * by the application. See $real_usage parameter on memory_get_peak_usage for details. * * @return boolean * * @since 4.4.0 */ public function getRealUsage() { return $this->realUsage; } /** * Sets whether total allocated memory page size is used instead of actual used memory size * by the application. See $real_usage parameter on memory_get_peak_usage for details. * * @param boolean $realUsage * * @since 4.4.0 */ public function setRealUsage($realUsage) { $this->realUsage = $realUsage; } /** * Returns the peak memory usage * * @return integer * * @since 4.4.0 */ public function getPeakUsage() { return $this->peakUsage; } /** * Updates the peak memory usage value * * @since 4.4.0 */ public function updatePeakUsage() { if ($this->peakUsage === null) { $this->peakUsage = memory_get_peak_usage($this->realUsage); } } /** * @return array * * @since 4.4.0 */ public function collect() { $this->updatePeakUsage(); return [ 'peak_usage' => $this->peakUsage, 'peak_usage_str' => $this->getDataFormatter()->formatBytes($this->peakUsage, 3), ]; } /** * @return string * * @since 4.4.0 */ public function getName() { return 'memory'; } /** * @return array * * @since 4.4.0 */ public function getWidgets() { return [ 'memory' => [ 'icon' => 'cogs', 'tooltip' => 'Memory Usage', 'map' => 'memory.peak_usage_str', 'default' => "'0B'", ], ]; } } PKAA#]�oP9system/debug/src/DataCollector/LanguageFilesCollector.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.Debug * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug\DataCollector; use DebugBar\DataCollector\AssetProvider; use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; use Joomla\Plugin\System\Debug\AbstractDataCollector; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * LanguageFilesDataCollector * * @since 4.0.0 */ class LanguageFilesCollector extends AbstractDataCollector implements AssetProvider { /** * Collector name. * * @var string * @since 4.0.0 */ private $name = 'languageFiles'; /** * The count. * * @var integer * @since 4.0.0 */ private $count = 0; /** * Called by the DebugBar when data needs to be collected * * @since 4.0.0 * * @return array Collected data */ public function collect(): array { $paths = Factory::getLanguage()->getPaths(); $loaded = []; foreach ($paths as $extension => $files) { $loaded[$extension] = []; foreach ($files as $file => $status) { $loaded[$extension][$file] = $status; if ($status) { $this->count++; } } } return [ 'loaded' => $loaded, 'xdebugLink' => $this->getXdebugLinkTemplate(), 'jroot' => JPATH_ROOT, 'count' => $this->count, ]; } /** * Returns the unique name of the collector * * @since 4.0.0 * * @return string */ public function getName(): string { return $this->name; } /** * Returns a hash where keys are control names and their values * an array of options as defined in {@see \DebugBar\JavascriptRenderer::addControl()} * * @since 4.0.0 * * @return array */ public function getWidgets(): array { return [ 'loaded' => [ 'icon' => 'language', 'widget' => 'PhpDebugBar.Widgets.languageFilesWidget', 'map' => $this->name, 'default' => '[]', ], 'loaded:badge' => [ 'map' => $this->name . '.count', 'default' => 'null', ], ]; } /** * Returns an array with the following keys: * - base_path * - base_url * - css: an array of filenames * - js: an array of filenames * * @since 4.0.0 * @return array */ public function getAssets(): array { return [ 'js' => Uri::root(true) . '/media/plg_system_debug/widgets/languageFiles/widget.min.js', 'css' => Uri::root(true) . '/media/plg_system_debug/widgets/languageFiles/widget.min.css', ]; } } PKAA#]���1||0system/debug/src/DataCollector/UserCollector.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.Debug * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug\DataCollector; use DebugBar\DataCollector\DataCollectorInterface; use Joomla\CMS\Factory; use Joomla\CMS\User\UserFactoryInterface; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * User collector that stores the user id of the person making the request allowing us to filter on it after storage * * @since 4.2.4 */ class UserCollector implements DataCollectorInterface { /** * Collector name. * * @var string * @since 4.2.4 */ private $name = 'juser'; /** * Called by the DebugBar when data needs to be collected * * @since 4.2.4 * * @return array Collected data */ public function collect() { $user = Factory::getApplication()->getIdentity() ?: Factory::getContainer()->get(UserFactoryInterface::class)->loadUserById(0); return ['user_id' => $user->id]; } /** * Returns the unique name of the collector * * @since 4.2.4 * * @return string */ public function getName() { return $this->name; } } PKAA#]�v�SS1system/debug/src/DataCollector/QueryCollector.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.Debug * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug\DataCollector; use DebugBar\DataCollector\AssetProvider; use Joomla\CMS\Uri\Uri; use Joomla\Database\Monitor\DebugMonitor; use Joomla\Plugin\System\Debug\AbstractDataCollector; use Joomla\Registry\Registry; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * QueryDataCollector * * @since 4.0.0 */ class QueryCollector extends AbstractDataCollector implements AssetProvider { /** * Collector name. * * @var string * @since 4.0.0 */ private $name = 'queries'; /** * The query monitor. * * @var DebugMonitor * @since 4.0.0 */ private $queryMonitor; /** * Profile data. * * @var array * @since 4.0.0 */ private $profiles; /** * Explain data. * * @var array * @since 4.0.0 */ private $explains; /** * Accumulated Duration. * * @var integer * @since 4.0.0 */ private $accumulatedDuration = 0; /** * Accumulated Memory. * * @var integer * @since 4.0.0 */ private $accumulatedMemory = 0; /** * Constructor. * * @param Registry $params Parameters. * @param DebugMonitor $queryMonitor Query monitor. * @param array $profiles Profile data. * @param array $explains Explain data * * @since 4.0.0 */ public function __construct(Registry $params, DebugMonitor $queryMonitor, array $profiles, array $explains) { $this->queryMonitor = $queryMonitor; parent::__construct($params); $this->profiles = $profiles; $this->explains = $explains; } /** * Called by the DebugBar when data needs to be collected * * @since 4.0.0 * * @return array Collected data */ public function collect(): array { $statements = $this->getStatements(); return [ 'data' => [ 'statements' => $statements, 'nb_statements' => \count($statements), 'accumulated_duration_str' => $this->getDataFormatter()->formatDuration($this->accumulatedDuration), 'memory_usage_str' => $this->getDataFormatter()->formatBytes($this->accumulatedMemory), 'xdebug_link' => $this->getXdebugLinkTemplate(), 'root_path' => JPATH_ROOT, ], 'count' => \count($this->queryMonitor->getLogs()), ]; } /** * Returns the unique name of the collector * * @since 4.0.0 * * @return string */ public function getName(): string { return $this->name; } /** * Returns a hash where keys are control names and their values * an array of options as defined in {@see \DebugBar\JavascriptRenderer::addControl()} * * @since 4.0.0 * * @return array */ public function getWidgets(): array { return [ 'queries' => [ 'icon' => 'database', 'widget' => 'PhpDebugBar.Widgets.SQLQueriesWidget', 'map' => $this->name . '.data', 'default' => '[]', ], 'queries:badge' => [ 'map' => $this->name . '.count', 'default' => 'null', ], ]; } /** * Assets for the collector. * * @since 4.0.0 * * @return array */ public function getAssets(): array { return [ 'css' => Uri::root(true) . '/media/plg_system_debug/widgets/sqlqueries/widget.min.css', 'js' => Uri::root(true) . '/media/plg_system_debug/widgets/sqlqueries/widget.min.js', ]; } /** * Prepare the executed statements data. * * @since 4.0.0 * * @return array */ private function getStatements(): array { $statements = []; $logs = $this->queryMonitor->getLogs(); $boundParams = $this->queryMonitor->getBoundParams(); $timings = $this->queryMonitor->getTimings(); $memoryLogs = $this->queryMonitor->getMemoryLogs(); $stacks = $this->queryMonitor->getCallStacks(); $collectStacks = $this->params->get('query_traces'); foreach ($logs as $id => $item) { $queryTime = 0; $queryMemory = 0; if ($timings && isset($timings[$id * 2 + 1])) { // Compute the query time. $queryTime = ($timings[$id * 2 + 1] - $timings[$id * 2]); $this->accumulatedDuration += $queryTime; } if ($memoryLogs && isset($memoryLogs[$id * 2 + 1])) { // Compute the query memory usage. $queryMemory = ($memoryLogs[$id * 2 + 1] - $memoryLogs[$id * 2]); $this->accumulatedMemory += $queryMemory; } $trace = []; $callerLocation = ''; if (isset($stacks[$id])) { $cnt = 0; foreach ($stacks[$id] as $i => $stack) { $class = $stack['class'] ?? ''; $file = $stack['file'] ?? ''; $line = $stack['line'] ?? ''; $caller = $this->formatCallerInfo($stack); $location = $file && $line ? "$file:$line" : 'same'; $isCaller = 0; if (\Joomla\Database\DatabaseDriver::class === $class && false === strpos($file, 'DatabaseDriver.php')) { $callerLocation = $location; $isCaller = 1; } if ($collectStacks) { $trace[] = [\count($stacks[$id]) - $cnt, $isCaller, $caller, $file, $line]; } $cnt++; } } $explain = $this->explains[$id] ?? []; $explainColumns = []; // Extract column labels for Explain table if ($explain) { $explainColumns = array_keys(reset($explain)); } $statements[] = [ 'sql' => $item, 'params' => $boundParams[$id] ?? [], 'duration_str' => $this->getDataFormatter()->formatDuration($queryTime), 'memory_str' => $this->getDataFormatter()->formatBytes($queryMemory), 'caller' => $callerLocation, 'callstack' => $trace, 'explain' => $explain, 'explain_col' => $explainColumns, 'profile' => $this->profiles[$id] ?? [], ]; } return $statements; } } PKAA#]*^f`!`!3system/debug/src/DataCollector/ProfileCollector.phpnu�[���<?php /** * This file is part of the DebugBar package. * * @copyright (c) 2013 Maxime Bouroumeau-Fuseau * @license For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Joomla\Plugin\System\Debug\DataCollector; use DebugBar\DebugBarException; use Joomla\CMS\Profiler\Profiler; use Joomla\Plugin\System\Debug\AbstractDataCollector; use Joomla\Registry\Registry; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Collects info about the request duration as well as providing * a way to log duration of any operations * * @since version */ class ProfileCollector extends AbstractDataCollector { /** * Request start time. * * @var float * @since 4.0.0 */ protected $requestStartTime; /** * Request end time. * * @var float * @since 4.0.0 */ protected $requestEndTime; /** * Started measures. * * @var array * @since 4.0.0 */ protected $startedMeasures = []; /** * Measures. * * @var array * @since 4.0.0 */ protected $measures = []; /** * Constructor. * * @param Registry $params Parameters. * * @since 4.0.0 */ public function __construct(Registry $params) { if (isset($_SERVER['REQUEST_TIME_FLOAT'])) { $this->requestStartTime = $_SERVER['REQUEST_TIME_FLOAT']; } else { $this->requestStartTime = microtime(true); } parent::__construct($params); } /** * Starts a measure. * * @param string $name Internal name, used to stop the measure * @param string|null $label Public name * @param string|null $collector The source of the collector * * @return void * * @since 4.0.0 */ public function startMeasure($name, $label = null, $collector = null) { $start = microtime(true); $this->startedMeasures[$name] = [ 'label' => $label ?: $name, 'start' => $start, 'collector' => $collector, ]; } /** * Check a measure exists * * @param string $name Group name. * * @return bool * * @since 4.0.0 */ public function hasStartedMeasure($name): bool { return isset($this->startedMeasures[$name]); } /** * Stops a measure. * * @param string $name Measurement name. * @param array $params Parameters * * @return void * * @since 4.0.0 * * @throws DebugBarException */ public function stopMeasure($name, array $params = []) { $end = microtime(true); if (!$this->hasStartedMeasure($name)) { throw new DebugBarException("Failed stopping measure '$name' because it hasn't been started"); } $this->addMeasure($this->startedMeasures[$name]['label'], $this->startedMeasures[$name]['start'], $end, $params, $this->startedMeasures[$name]['collector']); unset($this->startedMeasures[$name]); } /** * Adds a measure * * @param string $label A label. * @param float $start Start of request. * @param float $end End of request. * @param array $params Parameters. * @param string|null $collector A collector. * * @return void * * @since 4.0.0 */ public function addMeasure($label, $start, $end, array $params = [], $collector = null) { $this->measures[] = [ 'label' => $label, 'start' => $start, 'relative_start' => $start - $this->requestStartTime, 'end' => $end, 'relative_end' => $end - $this->requestEndTime, 'duration' => $end - $start, 'duration_str' => $this->getDataFormatter()->formatDuration($end - $start), 'params' => $params, 'collector' => $collector, ]; } /** * Utility function to measure the execution of a Closure * * @param string $label A label. * @param \Closure $closure A closure. * @param string|null $collector A collector. * * @return void * * @since 4.0.0 */ public function measure($label, \Closure $closure, $collector = null) { $name = spl_object_hash($closure); $this->startMeasure($name, $label, $collector); $result = $closure(); $params = \is_array($result) ? $result : []; $this->stopMeasure($name, $params); } /** * Returns an array of all measures * * @return array * * @since 4.0.0 */ public function getMeasures(): array { return $this->measures; } /** * Returns the request start time * * @return float * * @since 4.0.0 */ public function getRequestStartTime(): float { return $this->requestStartTime; } /** * Returns the request end time * * @return float * * @since 4.0.0 */ public function getRequestEndTime(): float { return $this->requestEndTime; } /** * Returns the duration of a request * * @return float * * @since 4.0.0 */ public function getRequestDuration(): float { if ($this->requestEndTime !== null) { return $this->requestEndTime - $this->requestStartTime; } return microtime(true) - $this->requestStartTime; } /** * Sets request end time. * * @param float $time Request end time. * * @return $this * * @since 4.4.0 */ public function setRequestEndTime($time): self { $this->requestEndTime = $time; return $this; } /** * Called by the DebugBar when data needs to be collected * * @return array Collected data * * @since 4.0.0 */ public function collect(): array { $this->requestEndTime = $this->requestEndTime ?? microtime(true); $start = $this->requestStartTime; $marks = Profiler::getInstance('Application')->getMarks(); foreach ($marks as $mark) { $mem = $this->getDataFormatter()->formatBytes(abs($mark->memory) * 1048576); $label = $mark->label . " ($mem)"; $end = $start + $mark->time / 1000; $this->addMeasure($label, $start, $end); $start = $end; } foreach (array_keys($this->startedMeasures) as $name) { $this->stopMeasure($name); } usort( $this->measures, function ($a, $b) { if ($a['start'] === $b['start']) { return 0; } return $a['start'] < $b['start'] ? -1 : 1; } ); return [ 'start' => $this->requestStartTime, 'end' => $this->requestEndTime, 'duration' => $this->getRequestDuration(), 'duration_str' => $this->getDataFormatter()->formatDuration($this->getRequestDuration()), 'measures' => array_values($this->measures), 'rawMarks' => $marks, ]; } /** * Returns the unique name of the collector * * @return string * * @since 4.0.0 */ public function getName(): string { return 'profile'; } /** * Returns a hash where keys are control names and their values * an array of options as defined in {@see \DebugBar\JavascriptRenderer::addControl()} * * @return array * * @since 4.0.0 */ public function getWidgets(): array { return [ 'profileTime' => [ 'icon' => 'clock-o', 'tooltip' => 'Request Duration', 'map' => 'profile.duration_str', 'default' => "'0ms'", ], 'profile' => [ 'icon' => 'clock-o', 'widget' => 'PhpDebugBar.Widgets.TimelineWidget', 'map' => 'profile', 'default' => '{}', ], ]; } } PKAA#]�g6� � :system/debug/src/DataCollector/LanguageErrorsCollector.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.Debug * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug\DataCollector; use DebugBar\DataCollector\AssetProvider; use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; use Joomla\Plugin\System\Debug\AbstractDataCollector; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * LanguageErrorsDataCollector * * @since 4.0.0 */ class LanguageErrorsCollector extends AbstractDataCollector implements AssetProvider { /** * Collector name. * * @var string * @since 4.0.0 */ private $name = 'languageErrors'; /** * The count. * * @var integer * @since 4.0.0 */ private $count = 0; /** * Called by the DebugBar when data needs to be collected * * @since 4.0.0 * * @return array Collected data */ public function collect(): array { return [ 'data' => [ 'files' => $this->getData(), 'jroot' => JPATH_ROOT, 'xdebugLink' => $this->getXdebugLinkTemplate(), ], 'count' => $this->getCount(), ]; } /** * Returns the unique name of the collector * * @since 4.0.0 * * @return string */ public function getName(): string { return $this->name; } /** * Returns a hash where keys are control names and their values * an array of options as defined in {@see \DebugBar\JavascriptRenderer::addControl()} * * @since 4.0.0 * * @return array */ public function getWidgets(): array { return [ 'errors' => [ 'icon' => 'warning', 'widget' => 'PhpDebugBar.Widgets.languageErrorsWidget', 'map' => $this->name . '.data', 'default' => '', ], 'errors:badge' => [ 'map' => $this->name . '.count', 'default' => 'null', ], ]; } /** * Returns an array with the following keys: * - base_path * - base_url * - css: an array of filenames * - js: an array of filenames * * @since 4.0.0 * @return array */ public function getAssets() { return [ 'js' => Uri::root(true) . '/media/plg_system_debug/widgets/languageErrors/widget.min.js', 'css' => Uri::root(true) . '/media/plg_system_debug/widgets/languageErrors/widget.min.css', ]; } /** * Collect data. * * @return array * * @since 4.0.0 */ private function getData(): array { $errorFiles = Factory::getLanguage()->getErrorFiles(); $errors = []; if (\count($errorFiles)) { foreach ($errorFiles as $file => $lines) { foreach ($lines as $line) { $errors[] = [$file, $line]; $this->count++; } } } return $errors; } /** * Get a count value. * * @return int * * @since 4.0.0 */ private function getCount(): int { return $this->count; } } PKAA#]F�Hu{{7system/debug/src/DataCollector/RequestDataCollector.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.Debug * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug\DataCollector; use Joomla\Plugin\System\Debug\Extension\Debug; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Collects info about the request content while redacting potentially secret content * * @since 4.2.4 */ class RequestDataCollector extends \DebugBar\DataCollector\RequestDataCollector { /** * Called by the DebugBar when data needs to be collected * * @since 4.2.4 * * @return array */ public function collect() { $vars = ['_GET', '_POST', '_SESSION', '_COOKIE', '_SERVER']; $returnData = []; foreach ($vars as $var) { if (isset($GLOBALS[$var])) { $key = "$" . $var; $data = $GLOBALS[$var]; // Replace Joomla session data from session data, it will be collected by SessionCollector if ($var === '_SESSION' && !empty($data['joomla'])) { $data['joomla'] = '***redacted***'; } array_walk_recursive($data, static function (&$value, $key) { if (!preg_match(Debug::PROTECTED_COLLECTOR_KEYS, $key)) { return; } $value = '***redacted***'; }); if ($this->isHtmlVarDumperUsed()) { $returnData[$key] = $this->getVarDumper()->renderVar($data); } else { $returnData[$key] = $this->getDataFormatter()->formatVar($data); } } } return $returnData; } } PKAA#]OQ��'system/debug/src/JavascriptRenderer.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.Debug * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug; use DebugBar\DebugBar; use DebugBar\JavascriptRenderer as DebugBarJavascriptRenderer; use Joomla\CMS\Factory; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Custom JavascriptRenderer for DebugBar * * @since 4.0.0 */ class JavascriptRenderer extends DebugBarJavascriptRenderer { /** * Class constructor. * * @param \DebugBar\DebugBar $debugBar DebugBar instance * @param string $baseUrl The base URL from which assets will be served * @param string $basePath The path which assets are relative to * * @since 4.0.0 */ public function __construct(DebugBar $debugBar, $baseUrl = null, $basePath = null) { parent::__construct($debugBar, $baseUrl, $basePath); // Disable features that loaded by Joomla! API, or not in use $this->setEnableJqueryNoConflict(false); $this->disableVendor('jquery'); $this->disableVendor('fontawesome'); } /** * Renders the html to include needed assets * * Only useful if Assetic is not used * * @return string * * @since 4.0.0 */ public function renderHead() { list($cssFiles, $jsFiles, $inlineCss, $inlineJs, $inlineHead) = $this->getAssets(null, self::RELATIVE_URL); $html = ''; $doc = Factory::getApplication()->getDocument(); foreach ($cssFiles as $file) { $html .= sprintf('<link rel="stylesheet" type="text/css" href="%s">' . "\n", $file); } foreach ($inlineCss as $content) { $html .= sprintf('<style>%s</style>' . "\n", $content); } foreach ($jsFiles as $file) { $html .= sprintf('<script type="text/javascript" src="%s" defer></script>' . "\n", $file); } $nonce = ''; if ($doc->cspNonce) { $nonce = ' nonce="' . $doc->cspNonce . '"'; } foreach ($inlineJs as $content) { $html .= sprintf('<script type="module"%s>%s</script>' . "\n", $nonce, $content); } foreach ($inlineHead as $content) { $html .= $content . "\n"; } return $html; } /** * Returns the code needed to display the debug bar * * AJAX request should not render the initialization code. * * @param boolean $initialize Whether or not to render the debug bar initialization code * @param boolean $renderStackedData Whether or not to render the stacked data * * @return string * * @since 4.0.0 */ public function render($initialize = true, $renderStackedData = true) { $js = ''; $doc = Factory::getApplication()->getDocument(); if ($initialize) { $js = $this->getJsInitializationCode(); } if ($renderStackedData && $this->debugBar->hasStackedData()) { foreach ($this->debugBar->getStackedData() as $id => $data) { $js .= $this->getAddDatasetCode($id, $data, '(stacked)'); } } $suffix = !$initialize ? '(ajax)' : null; $js .= $this->getAddDatasetCode($this->debugBar->getCurrentRequestId(), $this->debugBar->getData(), $suffix); $nonce = ''; if ($doc->cspNonce) { $nonce = ' nonce="' . $doc->cspNonce . '"'; } if ($this->useRequireJs) { return "<script type=\"module\"$nonce>\nrequire(['debugbar'], function(PhpDebugBar){ $js });\n</script>\n"; } else { return "<script type=\"module\"$nonce>\n$js\n</script>\n"; } } } PKAA#]�øe: : "system/debug/src/DataFormatter.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.Debug * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug; use DebugBar\DataFormatter\DataFormatter as DebugBarDataFormatter; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * DataFormatter * * @since 4.0.0 */ class DataFormatter extends DebugBarDataFormatter { /** * Strip the root path. * * @param string $path The path. * @param string $replacement The replacement * * @return string * * @since 4.0.0 */ public function formatPath($path, $replacement = ''): string { return str_replace(JPATH_ROOT, $replacement, $path); } /** * Format a string from back trace. * * @param array $call The array to format * * @return string * * @since 4.0.0 */ public function formatCallerInfo(array $call): string { $string = ''; if (isset($call['class'])) { // If entry has Class/Method print it. $string .= htmlspecialchars($call['class'] . $call['type'] . $call['function']) . '()'; } elseif (isset($call['args'][0]) && \is_array($call['args'][0])) { $string .= htmlspecialchars($call['function']) . ' ('; foreach ($call['args'][0] as $arg) { // Check if the arguments can be used as string if (\is_object($arg) && !method_exists($arg, '__toString')) { $arg = \get_class($arg); } // Keep only the size of array if (\is_array($arg)) { $arg = 'Array(count=' . \count($arg) . ')'; } $string .= htmlspecialchars($arg) . ', '; } $string = rtrim($string, ', ') . ')'; } elseif (isset($call['args'][0])) { $string .= htmlspecialchars($call['function']) . '('; if (is_scalar($call['args'][0])) { $string .= $call['args'][0]; } elseif (\is_object($call['args'][0])) { $string .= \get_class($call['args'][0]); } else { $string .= gettype($call['args'][0]); } $string .= ')'; } else { // It's a function. $string .= htmlspecialchars($call['function']) . '()'; } return $string; } } PKAA#]�)�iZ Z *system/debug/src/AbstractDataCollector.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.Debug * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug; use DebugBar\DataCollector\DataCollector; use DebugBar\DataCollector\Renderable; use Joomla\Registry\Registry; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * AbstractDataCollector * * @since 4.0.0 */ abstract class AbstractDataCollector extends DataCollector implements Renderable { /** * Parameters. * * @var Registry * @since 4.0.0 */ protected $params; /** * The default formatter. * * @var DataFormatter * @since 4.0.0 */ private static $defaultDataFormatter; /** * AbstractDataCollector constructor. * * @param Registry $params Parameters. * * @since 4.0.0 */ public function __construct(Registry $params) { $this->params = $params; } /** * Get a data formatter. * * @since 4.0.0 * @return DataFormatter */ public function getDataFormatter(): DataFormatter { if ($this->dataFormater === null) { $this->dataFormater = self::getDefaultDataFormatter(); } return $this->dataFormater; } /** * Returns the default data formatter * * @since 4.0.0 * @return DataFormatter */ public static function getDefaultDataFormatter(): DataFormatter { if (self::$defaultDataFormatter === null) { self::$defaultDataFormatter = new DataFormatter(); } return self::$defaultDataFormatter; } /** * Strip the Joomla! root path. * * @param string $path The path. * * @return string * * @since 4.0.0 */ public function formatPath($path): string { return $this->getDataFormatter()->formatPath($path); } /** * Format a string from back trace. * * @param array $call The array to format * * @return string * * @since 4.0.0 */ public function formatCallerInfo(array $call): string { return $this->getDataFormatter()->formatCallerInfo($call); } } PKAA#]*����\�\$system/debug/src/Extension/Debug.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.debug * * @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug\Extension; use DebugBar\DataCollector\MessagesCollector; use DebugBar\DebugBar; use DebugBar\OpenHandler; use Joomla\Application\ApplicationEvents; use Joomla\CMS\Application\CMSApplicationInterface; use Joomla\CMS\Document\HtmlDocument; use Joomla\CMS\Log\Log; use Joomla\CMS\Log\LogEntry; use Joomla\CMS\Log\Logger\InMemoryLogger; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Profiler\Profiler; use Joomla\CMS\Session\Session; use Joomla\CMS\Uri\Uri; use Joomla\Database\DatabaseAwareTrait; use Joomla\Database\DatabaseInterface; use Joomla\Database\Event\ConnectionEvent; use Joomla\Event\DispatcherInterface; use Joomla\Event\Event; use Joomla\Event\Priority; use Joomla\Event\SubscriberInterface; use Joomla\Plugin\System\Debug\DataCollector\InfoCollector; use Joomla\Plugin\System\Debug\DataCollector\LanguageErrorsCollector; use Joomla\Plugin\System\Debug\DataCollector\LanguageFilesCollector; use Joomla\Plugin\System\Debug\DataCollector\LanguageStringsCollector; use Joomla\Plugin\System\Debug\DataCollector\MemoryCollector; use Joomla\Plugin\System\Debug\DataCollector\ProfileCollector; use Joomla\Plugin\System\Debug\DataCollector\QueryCollector; use Joomla\Plugin\System\Debug\DataCollector\RequestDataCollector; use Joomla\Plugin\System\Debug\DataCollector\SessionCollector; use Joomla\Plugin\System\Debug\DataCollector\UserCollector; use Joomla\Plugin\System\Debug\JavascriptRenderer; use Joomla\Plugin\System\Debug\JoomlaHttpDriver; use Joomla\Plugin\System\Debug\Storage\FileStorage; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! Debug plugin. * * @since 1.5 */ final class Debug extends CMSPlugin implements SubscriberInterface { use DatabaseAwareTrait; /** * List of protected keys that will be redacted in multiple data collected * * @since 4.2.4 */ public const PROTECTED_COLLECTOR_KEYS = "/password|passwd|pwd|secret|token|server_auth|_pass|smtppass|otpKey|otep/i"; /** * True if debug lang is on. * * @var boolean * @since 3.0 */ private $debugLang; /** * Holds log entries handled by the plugin. * * @var LogEntry[] * @since 3.1 */ private $logEntries = []; /** * Holds all SHOW PROFILE FOR QUERY n, indexed by n-1. * * @var array * @since 3.1.2 */ private $sqlShowProfileEach = []; /** * Holds all EXPLAIN EXTENDED for all queries. * * @var array * @since 3.1.2 */ private $explains = []; /** * @var DebugBar * @since 4.0.0 */ private $debugBar; /** * The query monitor. * * @var \Joomla\Database\Monitor\DebugMonitor * @since 4.0.0 */ private $queryMonitor; /** * AJAX marker * * @var bool * @since 4.0.0 */ protected $isAjax = false; /** * Whether displaying a logs is enabled * * @var bool * @since 4.0.0 */ protected $showLogs = false; /** * The time spent in onAfterDisconnect() * * @var float * @since 4.4.0 */ protected $timeInOnAfterDisconnect = 0; /** * @return array * * @since 4.1.3 */ public static function getSubscribedEvents(): array { return [ 'onBeforeCompileHead' => 'onBeforeCompileHead', 'onAjaxDebug' => 'onAjaxDebug', 'onBeforeRespond' => 'onBeforeRespond', 'onAfterRespond' => [ 'onAfterRespond', Priority::MIN, ], ApplicationEvents::AFTER_RESPOND => [ 'onAfterRespond', Priority::MIN, ], 'onAfterDisconnect' => 'onAfterDisconnect', ]; } /** * @param DispatcherInterface $dispatcher The object to observe -- event dispatcher. * @param array $config An optional associative array of configuration settings. * @param CMSApplicationInterface $app The app * @param DatabaseInterface $db The db * * @since 1.5 */ public function __construct(DispatcherInterface $dispatcher, $config, CMSApplicationInterface $app, DatabaseInterface $db) { parent::__construct($dispatcher, $config); $this->setApplication($app); $this->setDatabase($db); $this->debugLang = $this->getApplication()->get('debug_lang'); // Skip the plugin if debug is off if (!$this->debugLang && !$this->getApplication()->get('debug')) { return; } $this->getApplication()->set('gzip', false); ob_start(); ob_implicit_flush(false); /** @var \Joomla\Database\Monitor\DebugMonitor */ $this->queryMonitor = $this->getDatabase()->getMonitor(); if (!$this->params->get('queries', 1)) { // Remove the database driver monitor $this->getDatabase()->setMonitor(null); } $this->debugBar = new DebugBar(); // Check whether we want to track the request history for future use. if ($this->params->get('track_request_history', false)) { $storagePath = JPATH_CACHE . '/plg_system_debug_' . $this->getApplication()->getName(); $this->debugBar->setStorage(new FileStorage($storagePath)); } $this->debugBar->setHttpDriver(new JoomlaHttpDriver($this->getApplication())); $this->isAjax = $this->getApplication()->getInput()->get('option') === 'com_ajax' && $this->getApplication()->getInput()->get('plugin') === 'debug' && $this->getApplication()->getInput()->get('group') === 'system'; $this->showLogs = (bool) $this->params->get('logs', true); // Log deprecated class aliases if ($this->showLogs && $this->getApplication()->get('log_deprecated')) { foreach (\JLoader::getDeprecatedAliases() as $deprecation) { Log::add( sprintf( '%1$s has been aliased to %2$s and the former class name is deprecated. The alias will be removed in %3$s.', $deprecation['old'], $deprecation['new'], $deprecation['version'] ), Log::WARNING, 'deprecation-notes' ); } } } /** * Add an assets for debugger. * * @return void * * @since 4.0.0 */ public function onBeforeCompileHead() { // Only if debugging or language debug is enabled. if ((JDEBUG || $this->debugLang) && $this->isAuthorisedDisplayDebug() && $this->getApplication()->getDocument() instanceof HtmlDocument) { // Use our own jQuery and fontawesome instead of the debug bar shipped version $assetManager = $this->getApplication()->getDocument()->getWebAssetManager(); $assetManager->registerAndUseStyle( 'plg.system.debug', 'plg_system_debug/debug.css', [], [], ['fontawesome'] ); $assetManager->registerAndUseScript( 'plg.system.debug', 'plg_system_debug/debug.min.js', [], ['defer' => true], ['jquery'] ); } // Disable asset media version if needed. if (JDEBUG && (int) $this->params->get('refresh_assets', 1) === 0) { $this->getApplication()->getDocument()->setMediaVersion(''); } } /** * Show the debug info. * * @return void * * @since 1.6 */ public function onAfterRespond() { $endTime = microtime(true) - $this->timeInOnAfterDisconnect; $endMemory = memory_get_peak_usage(false); // Do not collect data if debugging or language debug is not enabled. if ((!JDEBUG && !$this->debugLang) || $this->isAjax) { return; } // User has to be authorised to see the debug information. if (!$this->isAuthorisedDisplayDebug()) { return; } // Load language. $this->loadLanguage(); $this->debugBar->addCollector(new InfoCollector($this->params, $this->debugBar->getCurrentRequestId())); $this->debugBar->addCollector(new UserCollector()); if (JDEBUG) { if ($this->params->get('memory', 1)) { $this->debugBar->addCollector(new MemoryCollector($this->params, $endMemory)); } if ($this->params->get('request', 1)) { $this->debugBar->addCollector(new RequestDataCollector()); } if ($this->params->get('session', 1)) { $this->debugBar->addCollector(new SessionCollector($this->params, true)); } if ($this->params->get('profile', 1)) { $this->debugBar->addCollector((new ProfileCollector($this->params))->setRequestEndTime($endTime)); } if ($this->params->get('queries', 1)) { // Remember session form token for possible future usage. $formToken = Session::getFormToken(); // Close session to collect possible session-related queries. $this->getApplication()->getSession()->close(); // Call $db->disconnect() here to trigger the onAfterDisconnect() method here in this class! $this->getDatabase()->disconnect(); $this->debugBar->addCollector(new QueryCollector($this->params, $this->queryMonitor, $this->sqlShowProfileEach, $this->explains)); } if ($this->showLogs) { $this->collectLogs(); } } if ($this->debugLang) { $this->debugBar->addCollector(new LanguageFilesCollector($this->params)); $this->debugBar->addCollector(new LanguageStringsCollector($this->params)); $this->debugBar->addCollector(new LanguageErrorsCollector($this->params)); } // Only render for HTML output. if (!($this->getApplication()->getDocument() instanceof HtmlDocument)) { $this->debugBar->stackData(); return; } $debugBarRenderer = new JavascriptRenderer($this->debugBar, Uri::root(true) . '/media/vendor/debugbar/'); $openHandlerUrl = Uri::base(true) . '/index.php?option=com_ajax&plugin=debug&group=system&format=raw&action=openhandler'; $openHandlerUrl .= '&' . ($formToken ?? Session::getFormToken()) . '=1'; $debugBarRenderer->setOpenHandlerUrl($openHandlerUrl); /** * @todo disable highlightjs from the DebugBar, import it through NPM * and deliver it through Joomla's API * Also every DebugBar script and stylesheet needs to use Joomla's API * $debugBarRenderer->disableVendor('highlightjs'); */ // Capture output. $contents = ob_get_contents(); if ($contents) { ob_end_clean(); } // No debug for Safari and Chrome redirection. if ( strpos($contents, '<html><head><meta http-equiv="refresh" content="0;') === 0 && strpos(strtolower($_SERVER['HTTP_USER_AGENT'] ?? ''), 'webkit') !== false ) { $this->debugBar->stackData(); echo $contents; return; } echo str_replace('</body>', $debugBarRenderer->renderHead() . $debugBarRenderer->render() . '</body>', $contents); } /** * AJAX handler * * @param Event $event * * @return void * * @since 4.0.0 */ public function onAjaxDebug($event) { // Do not render if debugging or language debug is not enabled. if (!JDEBUG && !$this->debugLang) { return; } // User has to be authorised to see the debug information. if (!$this->isAuthorisedDisplayDebug() || !Session::checkToken('request')) { return; } switch ($this->getApplication()->getInput()->get('action')) { case 'openhandler': $result = $event['result'] ?: []; $handler = new OpenHandler($this->debugBar); $result[] = $handler->handle($this->getApplication()->getInput()->request->getArray(), false, false); $event['result'] = $result; break; } } /** * Method to check if the current user is allowed to see the debug information or not. * * @return boolean True if access is allowed. * * @since 3.0 */ private function isAuthorisedDisplayDebug(): bool { static $result; if ($result !== null) { return $result; } // If the user is not allowed to view the output then end here. $filterGroups = (array) $this->params->get('filter_groups', []); if (!empty($filterGroups)) { $userGroups = $this->getApplication()->getIdentity()->get('groups'); if (!array_intersect($filterGroups, $userGroups)) { $result = false; return false; } } $result = true; return true; } /** * Disconnect handler for database to collect profiling and explain information. * * @param ConnectionEvent $event Event object * * @return void * * @since 4.0.0 */ public function onAfterDisconnect(ConnectionEvent $event) { if (!JDEBUG) { return; } $startTime = microtime(true); $db = $event->getDriver(); // Remove the monitor to avoid monitoring the following queries $db->setMonitor(null); if ($this->params->get('query_profiles') && $db->getServerType() === 'mysql') { try { // Check if profiling is enabled. $db->setQuery("SHOW VARIABLES LIKE 'have_profiling'"); $hasProfiling = $db->loadResult(); if ($hasProfiling) { // Run a SHOW PROFILE query. $db->setQuery('SHOW PROFILES'); $sqlShowProfiles = $db->loadAssocList(); if ($sqlShowProfiles) { foreach ($sqlShowProfiles as $qn) { // Run SHOW PROFILE FOR QUERY for each query where a profile is available (max 100). $db->setQuery('SHOW PROFILE FOR QUERY ' . (int) $qn['Query_ID']); $this->sqlShowProfileEach[$qn['Query_ID'] - 1] = $db->loadAssocList(); } } } else { $this->sqlShowProfileEach[0] = [['Error' => 'MySql have_profiling = off']]; } } catch (\Exception $e) { $this->sqlShowProfileEach[0] = [['Error' => $e->getMessage()]]; } } if ($this->params->get('query_explains') && in_array($db->getServerType(), ['mysql', 'postgresql'], true)) { $logs = $this->queryMonitor->getLogs(); $boundParams = $this->queryMonitor->getBoundParams(); foreach ($logs as $k => $query) { $dbVersion56 = $db->getServerType() === 'mysql' && version_compare($db->getVersion(), '5.6', '>='); $dbVersion80 = $db->getServerType() === 'mysql' && version_compare($db->getVersion(), '8.0', '>='); if ($dbVersion80) { $dbVersion56 = false; } if ((stripos($query, 'select') === 0) || ($dbVersion56 && ((stripos($query, 'delete') === 0) || (stripos($query, 'update') === 0)))) { try { $queryInstance = $db->getQuery(true); $queryInstance->setQuery('EXPLAIN ' . ($dbVersion56 ? 'EXTENDED ' : '') . $query); if ($boundParams[$k]) { foreach ($boundParams[$k] as $key => $obj) { $queryInstance->bind($key, $obj->value, $obj->dataType, $obj->length, $obj->driverOptions); } } $this->explains[$k] = $db->setQuery($queryInstance)->loadAssocList(); } catch (\Exception $e) { $this->explains[$k] = [['error' => $e->getMessage()]]; } } } } $this->timeInOnAfterDisconnect = microtime(true) - $startTime; } /** * Store log messages so they can be displayed later. * This function is passed log entries by JLogLoggerCallback. * * @param LogEntry $entry A log entry. * * @return void * * @since 3.1 * * @deprecated 4.3 will be removed in 6.0 * Use \Joomla\CMS\Log\Log::add(LogEntry $entry) instead */ public function logger(LogEntry $entry) { if (!$this->showLogs) { return; } $this->logEntries[] = $entry; } /** * Collect log messages. * * @return void * * @since 4.0.0 */ private function collectLogs() { $loggerOptions = ['group' => 'default']; $logger = new InMemoryLogger($loggerOptions); $logEntries = $logger->getCollectedEntries(); if (!$this->logEntries && !$logEntries) { return; } if ($this->logEntries) { $logEntries = array_merge($logEntries, $this->logEntries); } $logDeprecated = $this->getApplication()->get('log_deprecated', 0); $logDeprecatedCore = $this->params->get('log-deprecated-core', 0); $this->debugBar->addCollector(new MessagesCollector('log')); if ($logDeprecated) { $this->debugBar->addCollector(new MessagesCollector('deprecated')); $this->debugBar->addCollector(new MessagesCollector('deprecation-notes')); } if ($logDeprecatedCore) { $this->debugBar->addCollector(new MessagesCollector('deprecated-core')); } foreach ($logEntries as $entry) { switch ($entry->category) { case 'deprecation-notes': if ($logDeprecated) { $this->debugBar[$entry->category]->addMessage($entry->message); } break; case 'deprecated': if (!$logDeprecated && !$logDeprecatedCore) { break; } $file = ''; $line = ''; // Find the caller, skip Log methods and trigger_error function foreach ($entry->callStack as $stackEntry) { if ( !empty($stackEntry['class']) && ($stackEntry['class'] === 'Joomla\CMS\Log\LogEntry' || $stackEntry['class'] === 'Joomla\CMS\Log\Log') ) { continue; } if ( empty($stackEntry['class']) && !empty($stackEntry['function']) && $stackEntry['function'] === 'trigger_error' ) { continue; } $file = $stackEntry['file'] ?? ''; $line = $stackEntry['line'] ?? ''; break; } $category = $entry->category; $relative = $file ? str_replace(JPATH_ROOT, '', $file) : ''; if ($relative && 0 === strpos($relative, '/libraries/src')) { if (!$logDeprecatedCore) { break; } $category .= '-core'; } elseif (!$logDeprecated) { break; } $message = [ 'message' => $entry->message, 'caller' => $file . ':' . $line, // @todo 'stack' => $entry->callStack; ]; $this->debugBar[$category]->addMessage($message, 'warning'); break; case 'databasequery': // Should be collected by its own collector break; default: switch ($entry->priority) { case Log::EMERGENCY: case Log::ALERT: case Log::CRITICAL: case Log::ERROR: $level = 'error'; break; case Log::WARNING: $level = 'warning'; break; default: $level = 'info'; } $this->debugBar['log']->addMessage($entry->category . ' - ' . $entry->message, $level); break; } } } /** * Add server timing headers when profile is activated. * * @return void * * @since 4.1.0 */ public function onBeforeRespond(): void { if (!JDEBUG || !$this->params->get('profile', 1)) { return; } $metrics = ''; $moduleTime = 0; $accessTime = 0; foreach (Profiler::getInstance('Application')->getMarks() as $index => $mark) { // Ignore the before mark as the after one contains the timing of the action if (stripos($mark->label, 'before') !== false) { continue; } // Collect the module render time if (strpos($mark->label, 'mod_') !== false) { $moduleTime += $mark->time; continue; } // Collect the access render time if (strpos($mark->label, 'Access:') !== false) { $accessTime += $mark->time; continue; } $desc = str_ireplace('after', '', $mark->label); $name = preg_replace('/[^\da-z]/i', '', $desc); $metrics .= sprintf('%s;dur=%f;desc="%s", ', $index . $name, $mark->time, $desc); // Do not create too large headers, some web servers don't love them if (strlen($metrics) > 3000) { $metrics .= 'System;dur=0;desc="Data truncated to 3000 characters", '; break; } } // Add the module entry $metrics .= 'Modules;dur=' . $moduleTime . ';desc="Modules", '; // Add the access entry $metrics .= 'Access;dur=' . $accessTime . ';desc="Access"'; $this->getApplication()->setHeader('Server-Timing', $metrics); } } PKAA#]A�6= = %system/debug/src/JoomlaHttpDriver.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.Debug * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug; use DebugBar\HttpDriverInterface; use Joomla\Application\WebApplicationInterface; use Joomla\CMS\Application\CMSApplicationInterface; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla HTTP driver for DebugBar * * @since 4.1.5 */ final class JoomlaHttpDriver implements HttpDriverInterface { /** * @var CMSApplicationInterface * * @since 4.1.5 */ private $app; /** * @var array * * @since 4.1.5 */ private $dummySession = []; /** * Constructor. * * @param CMSApplicationInterface $app * * @since 4.1.5 */ public function __construct(CMSApplicationInterface $app) { $this->app = $app; } /** * Sets HTTP headers * * @param array $headers * * @since 4.1.5 */ public function setHeaders(array $headers) { if ($this->app instanceof WebApplicationInterface) { foreach ($headers as $name => $value) { $this->app->setHeader($name, $value, true); } } } /** * Checks if the session is started * * @return boolean * * @since 4.1.5 */ public function isSessionStarted() { return true; } /** * Sets a value in the session * * @param string $name * @param string $value * * @since 4.1.5 */ public function setSessionValue($name, $value) { $this->dummySession[$name] = $value; } /** * Checks if a value is in the session * * @param string $name * * @return boolean * * @since 4.1.5 */ public function hasSessionValue($name) { return array_key_exists($name, $this->dummySession); } /** * Returns a value from the session * * @param string $name * * @return mixed * * @since 4.1.5 */ public function getSessionValue($name) { return $this->dummySession[$name] ?? null; } /** * Deletes a value from the session * * @param string $name * * @since 4.1.5 */ public function deleteSessionValue($name) { unset($this->dummySession[$name]); } } PKAA#]���v��(system/debug/src/Storage/FileStorage.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.Debug * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Debug\Storage; use Joomla\CMS\Factory; use Joomla\CMS\Filesystem\Folder; use Joomla\CMS\User\UserFactoryInterface; use Joomla\Filesystem\File; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Stores collected data into files * * @since 4.0.0 */ class FileStorage extends \DebugBar\Storage\FileStorage { /** * Saves collected data * * @param string $id The log id * @param string $data The log data * * @return void * * @since 4.0.0 */ public function save($id, $data) { if (!file_exists($this->dirname)) { Folder::create($this->dirname); } $dataStr = '<?php die(); ?>#(^-^)#' . json_encode($data); File::write($this->makeFilename($id), $dataStr); } /** * Returns collected data with the specified id * * @param string $id The log id * * @return array * * @since 4.0.0 */ public function get($id) { $dataStr = file_get_contents($this->makeFilename($id)); $dataStr = str_replace('<?php die(); ?>#(^-^)#', '', $dataStr); return json_decode($dataStr, true) ?: []; } /** * Returns a metadata about collected data * * @param array $filters Filtering options * @param integer $max The limit, items per page * @param integer $offset The offset * * @return array * * @since 4.0.0 */ public function find(array $filters = [], $max = 20, $offset = 0) { // Loop through all .php files and remember the modified time and id. $files = []; foreach (new \DirectoryIterator($this->dirname) as $file) { if ($file->getExtension() == 'php') { $files[] = [ 'time' => $file->getMTime(), 'id' => $file->getBasename('.php'), ]; } } // Sort the files, newest first usort( $files, function ($a, $b) { if ($a['time'] === $b['time']) { return 0; } return $a['time'] < $b['time'] ? 1 : -1; } ); // Load the metadata and filter the results. $results = []; $i = 0; foreach ($files as $file) { // When filter is empty, skip loading the offset if ($i++ < $offset && empty($filters)) { $results[] = null; continue; } $data = $this->get($file['id']); if (!$this->isSecureToReturnData($data)) { continue; } $meta = $data['__meta']; unset($data); if ($this->filter($meta, $filters)) { $results[] = $meta; } if (\count($results) >= ($max + $offset)) { break; } } return \array_slice($results, $offset, $max); } /** * Get a full path to the file * * @param string $id The log id * * @return string * * @since 4.0.0 */ public function makeFilename($id) { return $this->dirname . basename($id) . '.php'; } /** * Check if the user is allowed to view the request. Users can only see their own requests. * * @param array $data The data item to process * * @return boolean * * @since 4.2.4 */ private function isSecureToReturnData($data): bool { /** * We only started this collector in Joomla 4.2.4 - any older files we have to assume are insecure. */ if (!array_key_exists('juser', $data)) { return false; } $currentUser = Factory::getUser(); $currentUserId = $currentUser->id; $currentUserSuperAdmin = $currentUser->authorise('core.admin'); /** * Guests aren't allowed to look at other requests because there's no guarantee it's the same guest. Potentially * in the future this could be refined to check the session ID to show some requests. But it's unlikely we want * guests to be using the debug bar anyhow */ if ($currentUserId === 0) { return false; } /** @var \Joomla\CMS\User\User $user */ $user = Factory::getContainer()->get(UserFactoryInterface::class) ->loadUserById($data['juser']['user_id']); // Super users are allowed to look at other users requests. Otherwise users can only see their own requests. if ($currentUserSuperAdmin || $user->id === $currentUserId) { return true; } return false; } } PKAA#]�OF�ZZsystem/debug/debug.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_debug</name> <author>Joomla! Project</author> <creationDate>2006-12</creationDate> <copyright>(C) 2006 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_DEBUG_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\Debug</namespace> <files> <folder plugin="debug">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_system_debug.ini</language> <language tag="en-GB">language/en-GB/plg_system_debug.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="refresh_assets" type="radio" label="PLG_DEBUG_FIELD_REFRESH_ASSETS_LABEL" description="PLG_DEBUG_FIELD_REFRESH_ASSETS_DESC" layout="joomla.form.field.radio.switcher" default="1" filter="integer" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="filter_groups" type="usergrouplist" label="PLG_DEBUG_FIELD_ALLOWED_GROUPS_LABEL" multiple="true" layout="joomla.form.field.list-fancy-select" filter="intarray" /> <field name="memory" type="radio" label="PLG_DEBUG_FIELD_MEMORY_LABEL" layout="joomla.form.field.radio.switcher" default="1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="request" type="radio" label="PLG_DEBUG_FIELD_REQUEST_LABEL" layout="joomla.form.field.radio.switcher" default="1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="session" type="radio" label="PLG_DEBUG_FIELD_SESSION_LABEL" layout="joomla.form.field.radio.switcher" default="1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="profile" type="radio" label="PLG_DEBUG_FIELD_PROFILING_LABEL" layout="joomla.form.field.radio.switcher" default="1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="queries" type="radio" label="PLG_DEBUG_FIELD_QUERIES_LABEL" layout="joomla.form.field.radio.switcher" default="1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="query_traces" type="radio" label="PLG_DEBUG_FIELD_QUERY_TRACES_LABEL" layout="joomla.form.field.radio.switcher" default="0" showon="queries:1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="query_profiles" type="radio" label="PLG_DEBUG_FIELD_QUERY_PROFILES_LABEL" layout="joomla.form.field.radio.switcher" default="0" showon="queries:1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="query_explains" type="radio" label="PLG_DEBUG_FIELD_QUERY_EXPLAINS_LABEL" layout="joomla.form.field.radio.switcher" default="0" showon="queries:1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="track_request_history" type="radio" label="PLG_DEBUG_FIELD_TRACK_REQUEST_HISTORY_LABEL" description="PLG_DEBUG_FIELD_TRACK_REQUEST_HISTORY_DESC" layout="joomla.form.field.radio.switcher" default="0" filter="integer" > <option value="0">JDISABLED</option> <option value="1">JENABLED</option> </field> </fieldset> <fieldset name="language" label="PLG_DEBUG_LANGUAGE_FIELDSET_LABEL" > <field name="language_errorfiles" type="radio" label="PLG_DEBUG_FIELD_LANGUAGE_ERRORFILES_LABEL" layout="joomla.form.field.radio.switcher" default="1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="language_files" type="radio" label="PLG_DEBUG_FIELD_LANGUAGE_FILES_LABEL" layout="joomla.form.field.radio.switcher" default="1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="language_strings" type="radio" label="PLG_DEBUG_FIELD_LANGUAGE_STRING_LABEL" layout="joomla.form.field.radio.switcher" default="1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="strip-first" type="radio" label="PLG_DEBUG_FIELD_STRIP_FIRST_LABEL" layout="joomla.form.field.radio.switcher" default="1" filter="integer" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="strip-prefix" type="textarea" label="PLG_DEBUG_FIELD_STRIP_PREFIX_LABEL" description="PLG_DEBUG_FIELD_STRIP_PREFIX_DESC" cols="30" rows="4" /> <field name="strip-suffix" type="textarea" label="PLG_DEBUG_FIELD_STRIP_SUFFIX_LABEL" description="PLG_DEBUG_FIELD_STRIP_SUFFIX_DESC" cols="30" rows="4" /> </fieldset> <fieldset name="logging" label="PLG_DEBUG_LOGGING_FIELDSET_LABEL" > <field name="logs" type="radio" label="PLG_DEBUG_FIELD_LOGS_LABEL" layout="joomla.form.field.radio.switcher" default="1" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="log-deprecated-core" type="radio" label="PLG_DEBUG_FIELD_LOG_DEPRECATED_CORE_LABEL" layout="joomla.form.field.radio.switcher" default="0" filter="integer" showon="logs:1" > <option value="0">JNO</option> <option value="1">JYES</option> </field> </fieldset> </fields> </config> </extension> PKAA#]����"system/debug/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.debug * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\Debug\Extension\Debug; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { return new Debug( $container->get(DispatcherInterface::class), (array) PluginHelper::getPlugin('system', 'debug'), Factory::getApplication(), $container->get(DatabaseInterface::class) ); } ); } }; PKAA#]E�%%#system/skipto/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.skipto * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\Skipto\Extension\Skipto; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Skipto( $dispatcher, (array) PluginHelper::getPlugin('system', 'skipto') ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PKAA#] I9�[[&system/skipto/src/Extension/Skipto.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.skipto * * @copyright (C) 2020 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Skipto\Extension; use Joomla\CMS\Plugin\CMSPlugin; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Skipto plugin to add accessible keyboard navigation to the site and administrator templates. * * @since 4.0.0 */ final class Skipto extends CMSPlugin { /** * Add the skipto navigation menu. * * @return void * * @since 4.0.0 */ public function onAfterDispatch() { $section = $this->params->get('section', 'administrator'); if ($section !== 'both' && $this->getApplication()->isClient($section) !== true) { return; } // Get the document object. $document = $this->getApplication()->getDocument(); if ($document->getType() !== 'html') { return; } // Are we in a modal? if ($this->getApplication()->getInput()->get('tmpl', '', 'cmd') === 'component') { return; } // Load language file. $this->loadLanguage(); // Add plugin settings and strings for translations in JavaScript. $document->addScriptOptions( 'skipto-settings', [ 'settings' => [ 'skipTo' => [ // Feature switches 'enableActions' => false, 'enableHeadingLevelShortcuts' => false, // Customization of button and menu 'accesskey' => '9', 'displayOption' => 'popup', // Button labels and messages 'buttonLabel' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_TITLE'), 'buttonTooltipAccesskey' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_ACCESS_KEY'), // Menu labels and messages 'landmarkGroupLabel' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_LANDMARK'), 'headingGroupLabel' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_HEADING'), 'mofnGroupLabel' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_HEADING_MOFN'), 'headingLevelLabel' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_HEADING_LEVEL'), 'mainLabel' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_LANDMARK_MAIN'), 'searchLabel' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_LANDMARK_SEARCH'), 'navLabel' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_LANDMARK_NAV'), 'regionLabel' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_LANDMARK_REGION'), 'asideLabel' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_LANDMARK_ASIDE'), 'footerLabel' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_LANDMARK_FOOTER'), 'headerLabel' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_LANDMARK_HEADER'), 'formLabel' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_LANDMARK_FORM'), 'msgNoLandmarksFound' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_LANDMARK_NONE'), 'msgNoHeadingsFound' => $this->getApplication()->getLanguage()->_('PLG_SYSTEM_SKIPTO_HEADING_NONE'), // Selectors for landmark and headings sections 'headings' => 'h1, h2, h3', 'landmarks' => 'main, nav, search, aside, header, footer, form', ], ], ] ); /** @var \Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $document->getWebAssetManager(); $wa->useScript('skipto'); } } PKAA#]����((system/skipto/skipto.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_skipto</name> <author>Joomla! Project</author> <creationDate>2020-02</creationDate> <copyright>(C) 2019 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>4.0.0</version> <description>PLG_SYSTEM_SKIPTO_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\Skipto</namespace> <files> <folder plugin="skipto">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_system_skipto.ini</language> <language tag="en-GB">language/en-GB/plg_system_skipto.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="section" type="list" label="PLG_SYSTEM_SKIPTO_SECTION" default="administrator" validate="options" > <option value="site">PLG_SYSTEM_SKIPTO_SECTION_SITE</option> <option value="administrator">PLG_SYSTEM_SKIPTO_SECTION_ADMIN</option> <option value="both">PLG_SYSTEM_SKIPTO_SECTION_BOTH</option> </field> </fieldset> </fields> </config> </extension> PKAA#]����system/bagallery/bagallery.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.0" type="plugin" group="system" method="upgrade"> <name>BaGallery - System</name> <author>Balbooa</author> <creationDate>18 June 2015</creationDate> <copyright>Balbooa 2016</copyright> <license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license> <authorEmail>support@balbooa.com</authorEmail> <authorUrl>http://balbooa.com</authorUrl> <version>2.3.4</version> <description>Plugin allows to Display Gallery in the front end</description> <files> <filename plugin="bagallery">bagallery.php</filename> </files> </extension>PKAA#]��S���system/bagallery/bagallery.phpnu�[���<?php /** * @package BaGallery * @author Balbooa http://www.balbooa.com/ * @copyright Copyright @ Balbooa * @license http://www.gnu.org/licenses/gpl.html GNU/GPL */ defined('_JEXEC') or die; jimport( 'joomla.plugin.plugin' ); jimport('joomla.filesystem.folder'); class plgSystemBagallery extends JPlugin { public function __construct(&$subject, $config) { parent::__construct($subject, $config); } public function onAfterInitialise() { $app = JFactory::getApplication(); if ($app->isClient('site')) { $path = JPATH_ROOT . '/components/com_bagallery/helpers/bagallery.php'; $params = JComponentHelper::getParams('com_bagallery'); JLoader::register('bagalleryHelper', $path); bagalleryHelper::prepareParams($params); if (isset($_GET['fbclid'])) { $url = $_SERVER['REQUEST_URI']; $pos = strpos($url, 'fbclid'); $delimiter = $url[$pos - 1]; $url = str_replace($delimiter.'fbclid='.$_GET['fbclid'], '', $url); header('Location: '.$url); } } } public function onBeforeCompileHead() { $app = JFactory::getApplication(); $loaded = JLoader::getClassList( ); $doc = JFactory::getDocument(); if (isset($loaded['bagalleryhelper'])) { $option = $app->input->get('option', '', 'string'); $a_id = $app->input->get('a_id', '', 'string'); if ($app->isClient('site') && empty($a_id) && $doc->getType() == 'html' && $option != 'com_config') { bagalleryHelper::addStyle(); } } } public function onAfterRender() { $app = JFactory::getApplication(); $doc = JFactory::getDocument(); if ($app->isClient('site') && $doc->getType() == 'html') { $this->setGalleries(); } else if ($app->isClient('administrator') && $doc->getType() == 'html' && JVERSION >= '4.0.0') { $html = $app->getBody(); $html = str_replace('<body', '<body data-joomla-version="4"', $html); $app->setBody($html); } } public function onBeforeRenderGridbox() { $this->setGalleries(); } public function setGalleries() { $app = JFactory::getApplication(); $option = $app->input->get('option', '', 'string'); $a_id = $app->input->get('a_id', '', 'string'); if (empty($a_id) && $option != 'com_config' && $option != 'com_search' && $option != 'com_finder') { $loaded = JLoader::getClassList(); $view = $app->input->get('view', '', 'string'); if (isset($loaded['bagalleryhelper']) && !($option == 'com_sppagebuilder' && $view == 'form')) { $html = $app->getBody(); $pos = strpos($html, '</head>'); $head = substr($html, 0, $pos); $body = substr($html, $pos); if (strpos($head, 'name="og:') !== false) { $head = str_replace('name="og:', 'property="og:', $head); if (strpos($head, 'prefix="og: http://ogp.me/ns#"') === false) { $head = str_replace('<html', '<html prefix="og: http://ogp.me/ns#" ', $head); } } $html = $head.$this->getContent($body); $app->setBody($html); } } else if ($option == 'com_search' || $option == 'com_finder') { $regex = '/\[gallery ID=+(.*?)\]/i'; $html = $app->getBody(); preg_match_all($regex, $html, $matches, PREG_SET_ORDER); if ($matches) { $html = @preg_replace($regex, '', $html); $app->setBody($html); } } } public function getContent($body) { $regex = '/\[gallery ID=+(.*?)\]/i'; $array = array(); preg_match_all($regex, $body, $matches, PREG_SET_ORDER); if ($matches) { foreach ($matches as $index => $match) { $gallery = explode(',', $match[1]); $id = $gallery[0]; $pos = strpos($id, ' category ID'); if ($pos !== false) { $id = substr($id, 0, $pos); } if (isset($id)) { if (bagalleryHelper::checkGallery($id)) { if (!in_array($id, $array)) { $array[] = $id; } $doc = JFactory::getDocument(); $gallery = bagalleryHelper::drawHTMLPage($match[1]); $about = bagalleryHelper::aboutUs(); $v = $about->version; $url = JURI::root().'components/com_bagallery/assets/js/ba-gallery.js?'.$v; $body = @preg_replace("|\[gallery ID=".$match[1]."\]|", addcslashes($gallery, '\\$'), $body, 1); } } } if (!empty($array)) { $body = bagalleryHelper::drawScripts($array).$body; } } return $body; } } function gallery_sc(){}PKAA#].���!system/redirect/form/excludes.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <form> <fieldset> <field name="term" type="text" label="PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_TERM_LABEL" description="PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_TERM_DESC" required="true" /> <field name="regexp" type="checkbox" label="PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_REGEXP_LABEL" filter="integer" /> </fieldset> </form> PKAA#]�A���%system/redirect/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.redirect * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\Redirect\Extension\Redirect; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new Redirect( $dispatcher, (array) PluginHelper::getPlugin('system', 'redirect') ); $plugin->setApplication(Factory::getApplication()); $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } }; PKAA#]%|���$�$*system/redirect/src/Extension/Redirect.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.redirect * * @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Redirect\Extension; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Event\ErrorEvent; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\Database\DatabaseAwareTrait; use Joomla\Database\ParameterType; use Joomla\Event\SubscriberInterface; use Joomla\String\StringHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Plugin class for redirect handling. * * @since 1.6 */ final class Redirect extends CMSPlugin implements SubscriberInterface { use DatabaseAwareTrait; /** * Affects constructor behavior. If true, language files will be loaded automatically. * * @var boolean * @since 3.4 */ protected $autoloadLanguage = false; /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 4.0.0 */ public static function getSubscribedEvents(): array { return ['onError' => 'handleError']; } /** * Internal processor for all error handlers * * @param ErrorEvent $event The event object * * @return void * * @since 3.5 */ public function handleError(ErrorEvent $event) { /** @var \Joomla\CMS\Application\CMSApplication $app */ $app = $event->getApplication(); if ($app->isClient('administrator') || ((int) $event->getError()->getCode() !== 404)) { return; } $uri = Uri::getInstance(); // These are the original URLs $orgurl = rawurldecode($uri->toString(['scheme', 'host', 'port', 'path', 'query', 'fragment'])); $orgurlRel = rawurldecode($uri->toString(['path', 'query', 'fragment'])); // The above doesn't work for sub directories, so do this $orgurlRootRel = str_replace(Uri::root(), '', $orgurl); // For when users have added / to the url $orgurlRootRelSlash = str_replace(Uri::root(), '/', $orgurl); $orgurlWithoutQuery = rawurldecode($uri->toString(['scheme', 'host', 'port', 'path', 'fragment'])); $orgurlRelWithoutQuery = rawurldecode($uri->toString(['path', 'fragment'])); // These are the URLs we save and use $url = StringHelper::strtolower(rawurldecode($uri->toString(['scheme', 'host', 'port', 'path', 'query', 'fragment']))); $urlRel = StringHelper::strtolower(rawurldecode($uri->toString(['path', 'query', 'fragment']))); // The above doesn't work for sub directories, so do this $urlRootRel = str_replace(Uri::root(), '', $url); // For when users have added / to the url $urlRootRelSlash = str_replace(Uri::root(), '/', $url); $urlWithoutQuery = StringHelper::strtolower(rawurldecode($uri->toString(['scheme', 'host', 'port', 'path', 'fragment']))); $urlRelWithoutQuery = StringHelper::strtolower(rawurldecode($uri->toString(['path', 'fragment']))); $excludes = (array) $this->params->get('exclude_urls'); $skipUrl = false; foreach ($excludes as $exclude) { if (empty($exclude->term)) { continue; } if (!empty($exclude->regexp)) { // Only check $url, because it includes all other sub urls if (preg_match('/' . $exclude->term . '/i', $orgurlRel)) { $skipUrl = true; break; } } else { if (StringHelper::strpos($orgurlRel, $exclude->term) !== false) { $skipUrl = true; break; } } } /** * Why is this (still) here? * Because hackers still try urls with mosConfig_* and Url Injection with =http[s]:// and we dont want to log/redirect these requests */ if ($skipUrl || (strpos($url, 'mosConfig_') !== false) || (strpos($url, '=http') !== false)) { return; } $query = $this->getDatabase()->getQuery(true); $query->select('*') ->from($this->getDatabase()->quoteName('#__redirect_links')) ->whereIn( $this->getDatabase()->quoteName('old_url'), [ $url, $urlRel, $urlRootRel, $urlRootRelSlash, $urlWithoutQuery, $urlRelWithoutQuery, $orgurl, $orgurlRel, $orgurlRootRel, $orgurlRootRelSlash, $orgurlWithoutQuery, $orgurlRelWithoutQuery, ], ParameterType::STRING ); $this->getDatabase()->setQuery($query); $redirect = null; try { $redirects = $this->getDatabase()->loadAssocList(); } catch (\Exception $e) { $event->setError(new \Exception($this->getApplication()->getLanguage()->_('PLG_SYSTEM_REDIRECT_ERROR_UPDATING_DATABASE'), 500, $e)); return; } $possibleMatches = array_unique( [ $url, $urlRel, $urlRootRel, $urlRootRelSlash, $urlWithoutQuery, $urlRelWithoutQuery, $orgurl, $orgurlRel, $orgurlRootRel, $orgurlRootRelSlash, $orgurlWithoutQuery, $orgurlRelWithoutQuery, ] ); foreach ($possibleMatches as $match) { if (($index = array_search($match, array_column($redirects, 'old_url'))) !== false) { $redirect = (object) $redirects[$index]; if ((int) $redirect->published === 1) { break; } } } // A redirect object was found and, if published, will be used if ($redirect !== null && ((int) $redirect->published === 1)) { if (!$redirect->header || (bool) ComponentHelper::getParams('com_redirect')->get('mode', false) === false) { $redirect->header = 301; } if ($redirect->header < 400 && $redirect->header >= 300) { $urlQuery = $uri->getQuery(); $oldUrlParts = parse_url($redirect->old_url); $newUrl = $redirect->new_url; if ($urlQuery !== '' && empty($oldUrlParts['query'])) { $newUrl .= '?' . $urlQuery; } $dest = Uri::isInternal($newUrl) || strpos($newUrl, 'http') === false ? Route::_($newUrl) : $newUrl; // In case the url contains double // lets remove it $destination = str_replace(Uri::root() . '/', Uri::root(), $dest); // Always count redirect hits $redirect->hits++; try { $this->getDatabase()->updateObject('#__redirect_links', $redirect, 'id'); } catch (\Exception $e) { // We don't log issues for now } $app->redirect($destination, (int) $redirect->header); } $event->setError(new \RuntimeException($event->getError()->getMessage(), $redirect->header, $event->getError())); } elseif ($redirect === null) { // No redirect object was found so we create an entry in the redirect table if ((bool) $this->params->get('collect_urls', 1)) { if (!$this->params->get('includeUrl', 1)) { $url = $urlRel; } $nowDate = Factory::getDate()->toSql(); $data = (object) [ 'id' => 0, 'old_url' => $url, 'referer' => $app->getInput()->server->getString('HTTP_REFERER', ''), 'hits' => 1, 'published' => 0, 'created_date' => $nowDate, 'modified_date' => $nowDate, ]; try { $this->getDatabase()->insertObject('#__redirect_links', $data, 'id'); } catch (\Exception $e) { $event->setError(new \Exception($this->getApplication()->getLanguage()->_('PLG_SYSTEM_REDIRECT_ERROR_UPDATING_DATABASE'), 500, $e)); return; } } } else { // We have an unpublished redirect object, increment the hit counter $redirect->hits++; try { $this->getDatabase()->updateObject('#__redirect_links', $redirect, ['id']); } catch (\Exception $e) { $event->setError(new \Exception($this->getApplication()->getLanguage()->_('PLG_SYSTEM_REDIRECT_ERROR_UPDATING_DATABASE'), 500, $e)); return; } } } } PKAA#]��//system/redirect/redirect.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_redirect</name> <author>Joomla! Project</author> <creationDate>2009-04</creationDate> <copyright>(C) 2009 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_SYSTEM_REDIRECT_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\Redirect</namespace> <files> <folder>form</folder> <folder plugin="redirect">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_system_redirect.ini</language> <language tag="en-GB">language/en-GB/plg_system_redirect.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="collect_urls" type="radio" layout="joomla.form.field.radio.switcher" label="PLG_SYSTEM_REDIRECT_FIELD_COLLECT_URLS_LABEL" default="1" filter="integer" > <option value="0">JDISABLED</option> <option value="1">JENABLED</option> </field> <field name="includeUrl" type="radio" layout="joomla.form.field.radio.switcher" label="PLG_SYSTEM_REDIRECT_FIELD_STORE_FULL_URL_LABEL" default="1" filter="integer" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="exclude_urls" type="subform" label="PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_LABEL" multiple="true" formsource="plugins/system/redirect/form/excludes.xml" layout="joomla.form.field.subform.repeatable-table" /> </fieldset> </fields> </config> </extension> PKAA#]1vD�&system/sppagebuilder/sppagebuilder.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.6" type="plugin" group="system" method="upgrade"> <name>System - SP PageBuilder</name> <author>JoomShaper.com</author> <creationDate>Sep 2016</creationDate> <copyright>Copyright (C) 2010 - 2025 JoomShaper. All rights reserved.</copyright> <license>http://www.gnu.org/licenses/gpl-2.0.html GPLv2 or later</license> <authorEmail>support@joomshaper.com</authorEmail> <authorUrl>www.joomshaper.com</authorUrl> <version>6.8.0</version> <description>SP Page Builder System plugin to add support for 3rd party components</description> <files> <filename plugin="sppagebuilder">sppagebuilder.php</filename> <folder plugin="sppagebuilder">assets</folder> </files> </extension> PKAA#]�G�i����&system/sppagebuilder/sppagebuilder.phpnu�[���<?php /** * @package SP Page Builder * @author JoomShaper http://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later */ //no direct access defined('_JEXEC') or die('restricted access'); use Joomla\CMS\Application\CMSApplication; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Event\Table\AfterLoadEvent; use Joomla\CMS\Event\Table\AfterStoreEvent; use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Filesystem\Folder; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Language\Multilanguage; use Joomla\CMS\Menu\AdministratorMenuItem; use Joomla\CMS\Version; use JoomShaper\SPPageBuilder\DynamicContent\Constants\CollectionIds; JLoader::register('SppagebuilderHelper', JPATH_ADMINISTRATOR . '/components/com_sppagebuilder/helpers/sppagebuilder.php'); require_once JPATH_ROOT . '/components/com_sppagebuilder/helpers/integration-helper.php'; require_once JPATH_ROOT . '/components/com_sppagebuilder/helpers/autoload.php'; require_once JPATH_ROOT . '/components/com_sppagebuilder/helpers/route.php'; require_once JPATH_ROOT . '/components/com_sppagebuilder/helpers/constants.php'; if (file_exists(JPATH_ROOT . '/administrator/components/com_sppagebuilder/vendor/autoload.php')) { require_once JPATH_ROOT . '/administrator/components/com_sppagebuilder/vendor/autoload.php'; } if (file_exists(JPATH_ROOT . '/administrator/components/com_sppagebuilder/dynamic-content/helper.php')) { require_once JPATH_ROOT . '/administrator/components/com_sppagebuilder/dynamic-content/helper.php'; } BuilderAutoload::loadAliases(); BuilderAutoload::loadClasses(); BuilderAutoload::loadHelperClasses(); class plgSystemSppagebuilder extends CMSPlugin { protected $autoloadLanguage = true; protected $popupContents = []; protected $articleDetailsPageContent = ''; protected $articleIndexPageContent = ''; private function getPopupsByIds(array $ids) { if (empty($ids)) { return []; } $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select('*') ->from($db->quoteName('#__sppagebuilder')) ->where($db->quoteName('id') . ' IN (' . implode(',', $ids) . ')') ->where($db->quoteName('published') . ' = 1') ->where($db->quoteName('extension_view') . ' = ' . $db->quote('popup')); $db->setQuery($query); try { return $db->loadObjectList(); } catch (Exception $error) { return []; } } protected function getPageContentById($ids) { $idArray = array_map( function ($item) { return $item->id; }, $ids ?? [] ); if (empty($idArray)) { return []; } $popups = $this->getPopupsByIds($idArray); if (empty($popups)) { return []; } return array_map( function ($popup) { return AddonParser::viewAddons(json_decode($popup->content), 0, 'page-popups', 1, true, [], true); }, $popups ); } function getPopupIds() { $popupIds = []; $params = ComponentHelper::getParams('com_sppagebuilder'); $popupVisibility = $params->get('popup_visibility', []); /** @var CMSApplication $app */ $app = Factory::getApplication(); $input = $app->input; $pageId = $input->get('id', '', 'INT'); $menus = $app->getMenu(); $activeMenu = $menus->getActive(); $activeMenuId = $activeMenu->id ?? null; if (!empty($popupVisibility)) { foreach ($popupVisibility as $value) { if (!empty($value->popup_type) && $value->popup_type === 'specific_pages') { $selectedPages = !empty($value->selected_pages) ? $value->selected_pages : []; $isItemFound = in_array($pageId, $selectedPages); if ($isItemFound) { $popupIds[] = $value; } } elseif (!empty($value->popup_type) && $value->popup_type === 'specific_menus') { $selectedMenus = !empty($value->selected_menus) ? $value->selected_menus : []; $selectedMenuIds = array_map( function ($item) { return (new Uri($item))->getVar('Itemid'); }, $selectedMenus ); $isItemFound = in_array($activeMenuId, $selectedMenuIds); if ($isItemFound) { $popupIds[] = $value; } } elseif (!empty($value->popup_type) && $value->popup_type === 'entire_site') { $currentValue = $value; if (!empty($value->is_excluded_pages)) { $excludedPages = !empty($value->excluded_pages) ? $value->excluded_pages : []; if (in_array($pageId, $excludedPages)) { $currentValue = null; } } if (!empty($value->is_excluded_menus)) { $excludedMenus = !empty($value->excluded_menus) ? $value->excluded_menus : []; $menuIds = array_map( function ($item) { return (new Uri($item))->getVar('Itemid'); }, $excludedMenus ); if (in_array($activeMenuId, $menuIds)) { $currentValue = null; } } if (!empty($currentValue)) { $popupIds[] = $value; } } } } return $popupIds; } /** * $moduleData * Holds the page content of pagebuilder after requesting for duplication * * @var stdClass * @since 5.4 */ public static $moduleData = null; private function loadPopupContent() { $app = Factory::getApplication(); $input = $app->input; $pageId = $input->get('id', '', 'INT'); $view = $input->get('view', '', 'STRING'); $option = $input->get('option', '', 'STRING'); try { if ($option === 'com_sppagebuilder' && $view === 'form') { return; } $doc = Factory::getDocument(); $doc->addScriptDeclaration(' document.addEventListener("DOMContentLoaded", () =>{ window.htmlAddContent = window?.htmlAddContent || ""; if (window.htmlAddContent) { document.body.insertAdjacentHTML("beforeend", window.htmlAddContent); } }); '); if ($option === 'com_sppagebuilder' && !empty($pageId)) { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName(array('extension_view'))) ->from($db->quoteName('#__sppagebuilder')) ->where($db->quoteName('id') . ' = ' . $pageId); $db->setQuery($query); $result = $db->loadObject(); if (!empty($result->extension_view) && $result->extension_view === 'popup') { return; } } $popupContent = []; $popupIds = $this->getPopupIds(); $popupContent = $this->getPageContentById($popupIds); $hasPopupContent = !empty($popupContent); if ($option !== 'com_sppagebuilder' && $view !== 'page' && $hasPopupContent) { $params = ComponentHelper::getParams('com_sppagebuilder'); if ($params->get('fontawesome', 1)) { SppagebuilderHelperSite::addStylesheet('font-awesome-6.min.css'); SppagebuilderHelperSite::addStylesheet('font-awesome-v4-shims.css'); } if (!$params->get('disableanimatecss', 0)) { SppagebuilderHelperSite::addStylesheet('animate.min.css'); } if (!$params->get('disablecss', 0)) { SppagebuilderHelperSite::addStylesheet('sppagebuilder.css'); if (!$params->get('disableanimatecss', 0)) { SppagebuilderHelperSite::addStylesheet('animate.min.css'); } SppagebuilderHelperSite::addContainerMaxWidth(); } // load font assets form database SppagebuilderHelperSite::loadAssets(); HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'components/com_sppagebuilder/assets/js/jquery.parallax.js', ['version' => SppagebuilderHelperSite::getVersion(true)]); HTMLHelper::_('script', 'components/com_sppagebuilder/assets/js/es5_interaction.js', ['version' => SppagebuilderHelperSite::getVersion(true)], ['defer' => true]); HTMLHelper::_('script', 'components/com_sppagebuilder/assets/js/sppagebuilder.js', ['version' => SppagebuilderHelperSite::getVersion(true)], ['defer' => true]); } $this->popupContents = $popupContent; } catch (RuntimeException $e) { $app->enqueueMessage($e->getMessage(), 'error'); } } function onBeforeRender() { /** @var CMSApplication */ $app = Factory::getApplication(); if ($app->isClient('administrator')) { $integration = self::getIntegration(); if (!$integration) { return; } $input = $app->input; $option = $input->get('option', '', 'STRING'); $view = $input->get('view', '', 'STRING'); $id = $input->get($integration['id_alias'], 0, 'INT'); $layout = $input->get('layout', '', 'STRING'); if (!($option == 'com_' . $integration['group'] && $view == $integration['view'])) { return; } SppagebuilderHelper::loadAssets('css'); $doc = Factory::getDocument(); $doc->addScript(Uri::root(true) . '/plugins/system/sppagebuilder/assets/js/init.js?' . SppagebuilderHelper::getVersion(true)); $pagebuilder_enabled = 0; if ($page_content = self::getPageContent($option, $view, $id)) { $page_content = ApplicationHelper::preparePageData($page_content); $pagebuilder_enabled = (int) $page_content->active; } $integration_element = '.adminform'; if ($option == 'com_content') { $integration_element = '.adminform'; } else if ($option == 'com_k2') { $integration_element = '.k2ItemFormEditor'; } $doc->addScriptdeclaration('var spIntergationElement="' . $integration_element . '";'); $doc->addScriptdeclaration('var spPagebuilderEnabled=' . $pagebuilder_enabled . ';'); } else { $input = $app->input; $option = $input->get('option', '', 'STRING'); $view = $input->get('view', '', 'STRING'); $task = $input->get('task', '', 'STRING'); $id = $input->get('id', 0, 'INT'); $pageName = ''; if ($option == 'com_content' && $view == 'article') { $pageName = "{$view}-{$id}.css"; } elseif ($option == 'com_j2store' && $view == 'products' && $task == 'view') { $pageName = "article-{$id}.css"; } elseif ($option == 'com_k2' && $view == 'item') { $pageName = "item-{$id}.css"; } elseif ($option == 'com_sppagebuilder' && $view == 'page') { $pageName = "{$view}-{$id}.css"; } $file_path = JPATH_ROOT . '/media/sppagebuilder/css/' . $pageName; $file_url = Uri::base(true) . '/media/sppagebuilder/css/' . $pageName; if (file_exists($file_path)) { $doc = Factory::getDocument(); $doc->addStyleSheet($file_url); } } if ($app->isClient('site')) { $this->loadPopupContent(); if ($option === 'com_content' && ($view === 'article' || $view === 'category' || $view === 'featured' || $view === 'archive')) { self::loadPageBuilderSiteLanguage(); SppagebuilderHelperSite::addStylesheet('dynamic-content.css'); SppagebuilderHelperSite::addScript('dynamic-content.js'); } if ($option === 'com_content' && $view === 'article') { $this->loadArticleDetailsPage(); } else if ($option === 'com_content' && ($view === 'category' || $view === 'featured' || $view === 'archive')) { $this->loadArticleIndexPage(); } } } private function adjustedMargin($originalData) { $marginElems = explode(' ', $originalData); $topBottomMargin = "calc({$marginElems[0]} - {$marginElems[2]})"; $leftRightMargin = "calc({$marginElems[3]} - {$marginElems[1]})"; return "{$topBottomMargin} {$leftRightMargin}"; } private function getCssOutput($popupAttribs, $popupId) { /** @var CMSApplication */ $cssOutput = ''; if (!empty($popupAttribs['custom_css'])) { $cssOutput .= $popupAttribs['custom_css']; } $cssOutput .= ' '; $popupAttribs['enter_animation_duration'] = isset($popupAttribs['enter_animation_duration']) && isset($popupAttribs['toggle_enter_animation']) && $popupAttribs['toggle_enter_animation'] == 1 ? $popupAttribs['enter_animation_duration'] : (isset($popupAttribs['toggle_enter_animation']) && $popupAttribs['toggle_enter_animation'] == 1 ? 2000 : 0); $popupAttribs['exit_animation_duration'] = isset($popupAttribs['exit_animation_duration']) && isset($popupAttribs['toggle_exit_animation']) && $popupAttribs['toggle_exit_animation'] == 1 ? $popupAttribs['exit_animation_duration'] : (isset($popupAttribs['toggle_exit_animation']) && $popupAttribs['toggle_exit_animation'] == 1 ? 2000 : 0); $popupAttribs['enter_animation_delay'] = isset($popupAttribs['enter_animation_delay']) && isset($popupAttribs['toggle_enter_animation']) && $popupAttribs['toggle_enter_animation'] == 1 ? $popupAttribs['enter_animation_delay'] : 0; $popupAttribs['exit_animation_delay'] = isset($popupAttribs['exit_animation_delay']) && isset($popupAttribs['toggle_exit_animation']) && $popupAttribs['toggle_exit_animation'] == 1 ? $popupAttribs['exit_animation_delay'] : 0; $popupAttribs['enter_animation'] = isset($popupAttribs['enter_animation']) ? $popupAttribs['enter_animation'] : 'fadeIn'; $popupAttribs['exit_animation'] = isset($popupAttribs['exit_animation']) ? $popupAttribs['exit_animation'] : 'rotateIn'; $width_xl = !empty($popupAttribs['width']['xl']) ? $popupAttribs['width']['xl'] . $popupAttribs['width']['unit'] : ''; $width_lg = !empty($popupAttribs['width']['lg']) ? $popupAttribs['width']['lg'] . $popupAttribs['width']['unit'] : $width_xl; $width_md = !empty($popupAttribs['width']['md']) ? $popupAttribs['width']['md'] . $popupAttribs['width']['unit'] : $width_lg; $width_sm = !empty($popupAttribs['width']['sm']) ? $popupAttribs['width']['sm'] . $popupAttribs['width']['unit'] : $width_md; $width_xs = !empty($popupAttribs['width']['xs']) ? $popupAttribs['width']['xs'] . $popupAttribs['width']['unit'] : $width_sm; $max_width_xl = !empty($popupAttribs['max_width']['xl']) ? $popupAttribs['max_width']['xl'] . $popupAttribs['max_width']['unit'] : ''; $max_width_lg = !empty($popupAttribs['max_width']['lg']) ? $popupAttribs['max_width']['lg'] . $popupAttribs['max_width']['unit'] : $max_width_xl; $max_width_md = !empty($popupAttribs['max_width']['md']) ? $popupAttribs['max_width']['md'] . $popupAttribs['max_width']['unit'] : $max_width_lg; $max_width_sm = !empty($popupAttribs['max_width']['sm']) ? $popupAttribs['max_width']['sm'] . $popupAttribs['max_width']['unit'] : $max_width_md; $max_width_xs = !empty($popupAttribs['max_width']['xs']) ? $popupAttribs['max_width']['xs'] . $popupAttribs['max_width']['unit'] : $max_width_sm; $height_xl = !empty($popupAttribs['height']['xl']) ? $popupAttribs['height']['xl'] . ($popupAttribs['height']['unit'] !== '%' ? $popupAttribs['height']['unit'] : 'vh') : ''; $height_lg = !empty($popupAttribs['height']['lg']) ? $popupAttribs['height']['lg'] . ($popupAttribs['height']['unit'] !== '%' ? $popupAttribs['height']['unit'] : 'vh') : $height_xl; $height_md = !empty($popupAttribs['height']['md']) ? $popupAttribs['height']['md'] . ($popupAttribs['height']['unit'] !== '%' ? $popupAttribs['height']['unit'] : 'vh') : $height_lg; $height_sm = !empty($popupAttribs['height']['sm']) ? $popupAttribs['height']['sm'] . ($popupAttribs['height']['unit'] !== '%' ? $popupAttribs['height']['unit'] :'vh') : $height_md; $height_xs = !empty($popupAttribs['height']['xs']) ? $popupAttribs['height']['xs'] . ($popupAttribs['height']['unit'] !== '%' ? $popupAttribs['height']['unit'] : 'vh') : $height_sm; $max_height_xl = !empty($popupAttribs['max_height']['xl']) ? $popupAttribs['max_height']['xl'] . ($popupAttribs['max_height']['unit'] !== '%' ? $popupAttribs['max_height']['unit'] : 'vh') : ''; $max_height_lg = !empty($popupAttribs['max_height']['lg']) ? $popupAttribs['max_height']['lg'] . ($popupAttribs['max_height']['unit'] !== '%' ? $popupAttribs['max_height']['unit'] : 'vh') : $max_height_xl; $max_height_md = !empty($popupAttribs['max_height']['md']) ? $popupAttribs['max_height']['md'] . ($popupAttribs['max_height']['unit'] !== '%' ? $popupAttribs['max_height']['unit'] : 'vh') : $max_height_lg; $max_height_sm = !empty($popupAttribs['max_height']['sm']) ? $popupAttribs['max_height']['sm'] . ($popupAttribs['max_height']['unit'] !== '%' ? $popupAttribs['max-height']['unit'] :'vh') : $max_height_md; $max_height_xs = !empty($popupAttribs['max_height']['xs']) ? $popupAttribs['max_height']['xs'] . ($popupAttribs['max_height']['unit'] !== '%' ? $popupAttribs['max_height']['unit'] : 'vh') : $max_height_sm; $border_radius_xl = !empty($popupAttribs['border_radius']['xl']) ? $popupAttribs['border_radius']['xl'] . $popupAttribs['border_radius']['unit'] : ''; $border_radius_lg = !empty($popupAttribs['border_radius']['lg']) ? $popupAttribs['border_radius']['lg'] . $popupAttribs['border_radius']['unit'] : $border_radius_xl; $border_radius_md = !empty($popupAttribs['border_radius']['md']) ? $popupAttribs['border_radius']['md'] . $popupAttribs['border_radius']['unit'] : $border_radius_lg; $border_radius_sm = !empty($popupAttribs['border_radius']['sm']) ? $popupAttribs['border_radius']['sm'] . $popupAttribs['border_radius']['unit'] : $border_radius_md; $border_radius_xs = !empty($popupAttribs['border_radius']['xs']) ? $popupAttribs['border_radius']['xs'] . $popupAttribs['border_radius']['unit'] : $border_radius_sm; $responsiveStr = ' .page-' . $popupId . '.sp-pagebuilder-popup .builder-container { ' . (!empty($width_xl) ? ('width: ' . $width_xl . ';') : '') . ' ' . (!empty($max_width_xl) ? ('max-width: ' . $max_width_xl . ';') : '') . ' ' . (!empty($height_xl) ? ('height: ' . $height_xl . ';') : '') . ' ' . (!empty($max_height_xl) ? ('max-height: ' . $max_height_xl . ';') : '') . ' ' . (!empty($border_radius_xl) ? ('border-radius: ' . $border_radius_xl . ';') : '') . ' } @media (max-width: 1200px) { .page-' . $popupId . '.sp-pagebuilder-popup .builder-container { ' . (!empty($width_lg) ? ('width: ' . $width_lg . ';') : '') . ' ' . (!empty($max_width_lg) ? ('max-width: ' . $max_width_lg . ';') : '') . ' ' . (!empty($height_lg) ? ('height: ' . $height_lg . ';') : '') . ' ' . (!empty($max_height_lg) ? ('max-height: ' . $max_height_lg . ';') : '') . ' ' . (!empty($border_radius_lg) ? ('border-radius: ' . $border_radius_lg . ';') : '') . ' } } @media (max-width: 992px) { .page-' . $popupId . '.sp-pagebuilder-popup .builder-container { ' . (!empty($width_md) ? ('width: ' . $width_md) . ';' : '') . ' ' . (!empty($max_width_md) ? ('max-width: ' . $max_width_md . ';') : '') . ' ' . (!empty($height_md) ? ('height: ' . $height_md . ';') : '') . ' ' . (!empty($max_height_md) ? ('max-height: ' . $max_height_md . ';') : '') . ' ' . (!empty($border_radius_md) ? ('border-radius: ' . $border_radius_md . ';') : '') . ' } } @media (max-width: 768px) { .page-' . $popupId . '.sp-pagebuilder-popup .builder-container { ' . (!empty($width_sm) ? ('width: ' . $width_sm . ';') : '') . ' ' . (!empty($max_width_sm) ? ('max-width: ' . $max_width_sm . ';') : '') . ' ' . (!empty($height_sm) ? ('height: ' . $height_sm . ';') : '') . ' ' . (!empty($max_height_sm) ? ('max-height: ' . $max_height_sm . ';') : '') . ' ' . (!empty($border_radius_sm) ? ('border-radius: ' . $border_radius_sm . ';') : '') . ' } } @media (max-width: 575px) { .page-' . $popupId . '.sp-pagebuilder-popup .builder-container { ' . (!empty($width_xs) ? ('width: ' . $width_xs . ';') : '') . ' ' . (!empty($max_width_xs) ? ('max-width: ' . $max_width_xs . ';') : '') . ' ' . (!empty($height_xs) ? ('height: ' . $height_xs . ';') : '') . ' ' . (!empty($max_height_xs) ? ('max-height: ' . $max_height_xs . ';') : '') . ' ' . (!empty($border_radius_xs) ? ('border-radius: ' . $border_radius_xs . ';') : '') . ' } } '; $cssOutput .= $responsiveStr; $cssOutput .= ' .page-' . $popupId . '.sp-pagebuilder-popup .builder-container { position: absolute; animation-duration: ' . (isset($popupAttribs['enter_animation_duration']) ? (($popupAttribs['enter_animation_duration'] / 1000) . 's;') : '2s;') . ' } '; $cssOutput .= ' .page-' . $popupId . '.sp-pagebuilder-popup .builder-container { padding: ' . (!empty($popupAttribs['padding']) ? $popupAttribs['padding'] : 'initial') . '; margin: ' . (!empty($popupAttribs['margin']) ? $this->adjustedMargin($popupAttribs['margin']) : 'initial') . '; border-width: ' . (!empty($popupAttribs['border']['border_width']) ? $popupAttribs['border']['border_width'] : 'initial') . '; border-style: ' . (!empty($popupAttribs['border']['border_style']) ? $popupAttribs['border']['border_style'] : 'initial') . '; border-color: ' . (!empty($popupAttribs['border']['border_color']) ? $popupAttribs['border']['border_color'] : 'initial') . '; } '; $cssOutput .= ' .page-' . $popupId . '.sp-pagebuilder-popup { display: none; }'; $cssOutput .= ' #sp-pagebuilder-overlay-' . $popupId . ' { display: none; }'; if (!empty($popupAttribs['boxshadow']) && $popupAttribs['boxshadow']['enabled'] === true) { $cssOutput .= ' .page-' . $popupId . '.sp-pagebuilder-popup .builder-container { box-shadow: ' . ((bool)($popupAttribs['boxshadow']['ho']) ? $popupAttribs['boxshadow']['ho'] : '0') . 'px ' . ((bool)($popupAttribs['boxshadow']['vo']) ? $popupAttribs['boxshadow']['vo'] : '0') . 'px ' . ((bool)($popupAttribs['boxshadow']['blur']) ? $popupAttribs['boxshadow']['blur'] : '0') . 'px ' . ((bool)($popupAttribs['boxshadow']['spread']) ? $popupAttribs['boxshadow']['spread'] : '0') . 'px ' . ((bool)($popupAttribs['boxshadow']['color']) ? $popupAttribs['boxshadow']['color'] : 'initial') . '; } '; } $cssOutput .= ' .page-' . $popupId . '.sp-pagebuilder-popup .builder-container { background-color: ' . (!empty($popupAttribs['bg_color']) ? $popupAttribs['bg_color'] : 'white') . '; } '; if (!empty($popupAttribs['background_type']) && !empty($popupAttribs['bg_media']) && $popupAttribs['background_type'] === 'image') { $bgImageSrc = $popupAttribs['bg_media']['src']; if (!preg_match('#^(https?://|//)#', $bgImageSrc) && substr($bgImageSrc, 0, 1) !== '/') { $bgImageSrc = Uri::root(true) . '/' . ltrim($bgImageSrc, '/'); } $cssOutput .= ' .page-' . $popupId . '.sp-pagebuilder-popup .builder-container { background-image: url("' . $bgImageSrc . '"); background-repeat: ' . (!empty($popupAttribs['bg_media_repeat']) ? $popupAttribs['bg_media_repeat'] : 'no-repeat') . '; background-attachment: ' . (!empty($popupAttribs['bg_media_attachment']) ? $popupAttribs['bg_media_attachment'] : 'initial') . '; background-position: ' . (!empty($popupAttribs['bg_media_position']) ? $popupAttribs['bg_media_position'] : 'initial') . '; background-size: ' . (!empty($popupAttribs['bg_media_size']) ? $popupAttribs['bg_media_size'] : 'cover') . ';' . (!empty($popupAttribs['bg_media_overlay']) && $popupAttribs['bg_media_overlay'] === 1 ? 'background-blend-mode: ' . $popupAttribs['bg_media_overlay_blend_mode'] : 'normal') . '; } '; } else if (!empty($popupAttribs['background_type']) && $popupAttribs['background_type'] === 'gradient') { $deg = !empty($popupAttribs['bg_gradient']['deg']) ? $popupAttribs['bg_gradient']['deg'] : 45; $radialPos = !empty($popupAttribs['bg_gradient']['radialPos']) ? $popupAttribs['bg_gradient']['radialPos'] : 'center center'; $color = !empty($popupAttribs['bg_gradient']['color']) ? $popupAttribs['bg_gradient']['color'] : '#00C6FB'; $color2 = !empty($popupAttribs['bg_gradient']['color2']) ? $popupAttribs['bg_gradient']['color2'] : '#005BEA'; $pos = !empty($popupAttribs['bg_gradient']['pos']) ? $popupAttribs['bg_gradient']['pos'] : 0; $pos2 = !empty($popupAttribs['bg_gradient']['pos2']) ? $popupAttribs['bg_gradient']['pos2'] : 100; $type = !empty($popupAttribs['bg_gradient']['type']) ? $popupAttribs['bg_gradient']['type'] : 'linear'; if (!(bool)$deg) { $deg = 45; } if (!(bool)$radialPos) { $radialPos = 'center center'; } if (!(bool)$color) { $color = '#00C6FB'; } if (!(bool)$color2) { $color2 = '#005BEA'; } if (!(bool)$pos) { $pos = 0; } if (!(bool)$pos2) { $pos2 = 100; } if (!(bool)$type) { $type = 'linear'; } if ($type === 'linear') { $cssOutput .= ' .page-' . $popupId . '.sp-pagebuilder-popup .builder-container { background-color: unset; background-image: linear-gradient(' . $deg . 'deg, ' . $color . ' ' . $pos . '%, ' . $color2 . ' ' . $pos2 . '%); }'; } else if ($type === 'radial') { $cssOutput .= ' .page-' . $popupId . '.sp-pagebuilder-popup .builder-container { background-color: unset; background-image: radial-gradient(' . $radialPos . ', ' . $color . ' ' . $pos . '%, ' . $color2 . ' ' . $pos2 . '%); }'; } } if (!isset($popupAttribs['overlay']) || ($popupAttribs['overlay'] === 1)) { $cssOutput .= ' #sp-pagebuilder-overlay-' . $popupId . ' { background-color: ' . (!empty($popupAttribs['overlay_bg_color']) && (bool)$popupAttribs['overlay_bg_color'] ? $popupAttribs['overlay_bg_color'] : 'rgba(0, 0, 0, 0.7)') . '; } '; if (!empty($popupAttribs['overlay']) && !empty($popupAttribs['overlay_bg_media']) && !empty($popupAttribs['overlay_background_type']) && $popupAttribs['overlay_background_type'] === 'image') { $overlayBgImageSrc = $popupAttribs['overlay_bg_media']['src']; if (!preg_match('#^(https?://|//)#', $overlayBgImageSrc) && substr($overlayBgImageSrc, 0, 1) !== '/') { $overlayBgImageSrc = Uri::root(true) . '/' . ltrim($overlayBgImageSrc, '/'); } $cssOutput .= ' #sp-pagebuilder-overlay-' . $popupId . ' { background-image: url("' . $overlayBgImageSrc . '"); background-repeat: ' . (!empty($popupAttribs['overlay_bg_media_repeat']) ? $popupAttribs['overlay_bg_media_repeat'] : 'no-repeat') . '; background-attachment: ' . (!empty($popupAttribs['overlay_bg_media_attachment']) ? $popupAttribs['overlay_bg_media_attachment'] : 'initial') . '; background-position: ' . (!empty($popupAttribs['overlay_bg_media_position']) ? $popupAttribs['overlay_bg_media_position'] : 'initial') . '; background-size: ' . (!empty($popupAttribs['overlay_bg_media_size']) ? $popupAttribs['overlay_bg_media_size'] : 'cover') . ';' . (!empty($popupAttribs['overlay_bg_media_overlay']) && $popupAttribs['overlay_bg_media_overlay'] === 1 ? 'background-blend-mode: ' . $popupAttribs['overlay_bg_media_overlay_blend_mode'] : 'normal') . '; } '; } else if (!empty($popupAttribs['overlay']) && !empty($popupAttribs['overlay_background_type']) && $popupAttribs['overlay_background_type'] === 'gradient') { $deg = !empty($popupAttribs['overlay_bg_gradient']['deg']) ? $popupAttribs['overlay_bg_gradient']['deg'] : 45; $radialPos = !empty($popupAttribs['overlay_bg_gradient']['radialPos']) ? $popupAttribs['overlay_bg_gradient']['radialPos'] : 'center center'; $color = !empty($popupAttribs['overlay_bg_gradient']['color']) ? $popupAttribs['overlay_bg_gradient']['color'] : '#00C6FB'; $color2 = !empty($popupAttribs['overlay_bg_gradient']['color2']) ? $popupAttribs['overlay_bg_gradient']['color2'] : '#005BEA'; $pos = !empty($popupAttribs['overlay_bg_gradient']['pos']) ? $popupAttribs['overlay_bg_gradient']['pos'] : 0; $pos2 = !empty($popupAttribs['overlay_bg_gradient']['pos2']) ? $popupAttribs['overlay_bg_gradient']['pos2'] : 100; $type = !empty($popupAttribs['overlay_bg_gradient']['type']) ? $popupAttribs['overlay_bg_gradient']['type'] : 'linear'; if (!(bool)$deg) { $deg = 45; } if (!(bool)$radialPos) { $radialPos = 'center center'; } if (!(bool)$color) { $color = '#00C6FB'; } if (!(bool)$color2) { $color2 = '#005BEA'; } if (!(bool)$pos) { $pos = 0; } if (!(bool)$pos2) { $pos2 = 100; } if (!(bool)$type) { $type = 'linear'; } if ($type === 'linear') { $cssOutput .= ' #sp-pagebuilder-overlay-' . $popupId . ' { background-color: unset; background-image: linear-gradient(' . $deg . 'deg, ' . $color . ' ' . $pos . '%, ' . $color2 . ' ' . $pos2 . '%); }'; } else if ($type === 'radial') { $cssOutput .= ' #sp-pagebuilder-overlay-' . $popupId . ' { background-color: unset; background-image: radial-gradient(' . $radialPos . ', ' . $color . ' ' . $pos . '%, ' . $color2 . ' ' . $pos2 . '%); }'; } } } else if (isset($popupAttribs['overlay']) && $popupAttribs['overlay'] === 0) { $cssOutput .= ' #sp-pagebuilder-overlay-' . $popupId . ' { display: none; } '; } $cssOutput .= ' #sp-pagebuilder-popup-close-btn-' . $popupId . ' { display: flex; justify-content: center; align-items: center; } '; $cssOutput .= ' #sp-pagebuilder-popup-close-btn-' . $popupId . ' { color: ' . (!empty($popupAttribs['close_btn_color']) ? $popupAttribs['close_btn_color'] : 'initial') . '; } '; $cssOutput .= ' #sp-pagebuilder-popup-close-btn-' . $popupId . ':hover { color: ' . (!empty($popupAttribs['close_btn_color_hover']) ? $popupAttribs['close_btn_color_hover'] : 'initial') . ' !important; background-color: ' . (!empty($popupAttribs['close_btn_bg_color_hover']) ? $popupAttribs['close_btn_bg_color_hover'] : 'initial') . ' !important; } '; $cssOutput .= ' #sp-pagebuilder-popup-close-btn-' . $popupId . ' { color: ' . (!empty($popupAttribs['close_btn_color']) ? $popupAttribs['close_btn_color'] : 'initial') . '; border-width: ' . (!empty($popupAttribs['close_btn_border']['border_width']) ? $popupAttribs['close_btn_border']['border_width'] : 'initial') . '; border-style: ' . (!empty($popupAttribs['close_btn_border']['border_style']) ? $popupAttribs['close_btn_border']['border_style'] : 'initial') . '; border-color: ' . (!empty($popupAttribs['close_btn_border']['border_color']) ? $popupAttribs['close_btn_border']['border_color'] : 'initial') . '; border-radius: ' . (!empty($popupAttribs['close_btn_border_radius']) ? ($popupAttribs['close_btn_border_radius'] . 'px') : '0px') . '; } #sp-pagebuilder-popup-close-btn-' . $popupId . ' { background-color: ' . (!empty($popupAttribs['close_btn_bg_color']) ? $popupAttribs['close_btn_bg_color'] : 'initial') . '; } #sp-pagebuilder-popup-close-btn-' . $popupId . ' { padding: ' . (!empty($popupAttribs['close_btn_padding']) ? $popupAttribs['close_btn_padding'] : 'initial') . '; } '; if (empty($popupAttribs['close_btn_position']) || $popupAttribs['close_btn_position'] === 'inside' || $popupAttribs['close_btn_position'] === 0 || $popupAttribs['close_btn_position'] === '' || empty($popupAttribs['close_btn_position'])) { $cssOutput .= ' #sp-pagebuilder-popup-close-btn-' . $popupId .' { transform: scale(1.2); right: 25px; top: 20px; }'; } else if ($popupAttribs['close_btn_position'] === 'outside' || $popupAttribs['close_btn_position'] === 1) { $cssOutput .= ' #sp-pagebuilder-popup-close-btn-' . $popupId .' { transform: scale(1.2); right: 5px; top: -30px; }'; } else if ($popupAttribs['close_btn_position'] === 'outside' || $popupAttribs['close_btn_position'] === 'custom') { $btn_position_x_xl = !empty($popupAttribs['close_btn_position_x']['xl']) ? $popupAttribs['close_btn_position_x']['xl'] . $popupAttribs['close_btn_position_x']['unit'] : (isset($popupAttribs['close_btn_position_x']['xl']) && $popupAttribs['close_btn_position_x']['xl'] == '0' ? '0' : '25px'); $btn_position_x_lg = !empty($popupAttribs['close_btn_position_x']['lg']) ? $popupAttribs['close_btn_position_x']['lg'] . $popupAttribs['close_btn_position_x']['unit'] : (isset($popupAttribs['close_btn_position_x']['lg']) && $popupAttribs['close_btn_position_x']['lg'] == '0' ? '0' : $btn_position_x_xl); $btn_position_x_md = !empty($popupAttribs['close_btn_position_x']['md']) ? $popupAttribs['close_btn_position_x']['md'] . $popupAttribs['close_btn_position_x']['unit'] : (isset($popupAttribs['close_btn_position_x']['md']) && $popupAttribs['close_btn_position_x']['md'] == '0' ? '0' : $btn_position_x_lg); $btn_position_x_sm = !empty($popupAttribs['close_btn_position_x']['sm']) ? $popupAttribs['close_btn_position_x']['sm'] . $popupAttribs['close_btn_position_x']['unit'] : (isset($popupAttribs['close_btn_position_x']['sm']) && $popupAttribs['close_btn_position_x']['sm'] == '0' ? '0' : $btn_position_x_md); $btn_position_x_xs = !empty($popupAttribs['close_btn_position_x']['xs']) ? $popupAttribs['close_btn_position_x']['xs'] . $popupAttribs['close_btn_position_x']['unit'] : (isset($popupAttribs['close_btn_position_x']['xs']) && $popupAttribs['close_btn_position_x']['xs'] == '0' ? '0' : $btn_position_x_sm); $btn_position_y_xl = !empty($popupAttribs['close_btn_position_y']['xl']) ? $popupAttribs['close_btn_position_y']['xl'] . ($popupAttribs['close_btn_position_y']['unit'] !== '%' ? $popupAttribs['close_btn_position_y']['unit'] : 'vh') : (isset($popupAttribs['close_btn_position_y']['xl']) && $popupAttribs['close_btn_position_y']['xl'] == '0' ? '0' : '20px'); $btn_position_y_lg = !empty($popupAttribs['close_btn_position_y']['lg']) ? $popupAttribs['close_btn_position_y']['lg'] . ($popupAttribs['close_btn_position_y']['unit'] !== '%' ? $popupAttribs['close_btn_position_y']['unit'] : 'vh') : (isset($popupAttribs['close_btn_position_y']['lg']) && $popupAttribs['close_btn_position_y']['lg'] == '0' ? '0' : $btn_position_y_xl); $btn_position_y_md = !empty($popupAttribs['close_btn_position_y']['md']) ? $popupAttribs['close_btn_position_y']['md'] . ($popupAttribs['close_btn_position_y']['unit'] !== '%' ? $popupAttribs['close_btn_position_y']['unit'] : 'vh') : ((isset($popupAttribs['close_btn_position_y']['md']) && $popupAttribs['close_btn_position_y']['md'] == '0' ? '0' : $btn_position_y_lg)); $btn_position_y_sm = !empty($popupAttribs['close_btn_position_y']['sm']) ? $popupAttribs['close_btn_position_y']['sm'] . ($popupAttribs['close_btn_position_y']['unit'] !== '%' ? $popupAttribs['close_btn_position_y']['unit'] : 'vh') : (((isset($popupAttribs['close_btn_position_y']['sm']) && $popupAttribs['close_btn_position_y']['sm'] == '0' ? '0' : $btn_position_y_md))); $btn_position_y_xs = !empty($popupAttribs['close_btn_position_y']['xs']) ? $popupAttribs['close_btn_position_y']['xs'] . ($popupAttribs['close_btn_position_y']['unit'] !== '%' ? $popupAttribs['close_btn_position_y']['unit'] : 'vh') : (((isset($popupAttribs['close_btn_position_y']['xs']) && $popupAttribs['close_btn_position_y']['xs'] == '0' ? '0' : $btn_position_y_sm))); $cssOutput .= ' #sp-pagebuilder-popup-close-btn-' . $popupId . ' { transform: scale(1.2); right: ' . $btn_position_x_xl . '; top: ' . $btn_position_y_xl . '; } @media (max-width: 1200px) { #sp-pagebuilder-popup-close-btn-' . $popupId . ' { right: ' . $btn_position_x_lg . '; top: ' . $btn_position_y_lg . '; } } @media (max-width: 992px) { #sp-pagebuilder-popup-close-btn-' . $popupId . ' { right: ' . $btn_position_x_md . '; top: ' . $btn_position_y_md . '; } } @media (max-width: 768px) { #sp-pagebuilder-popup-close-btn-' . $popupId . ' { right: ' . $btn_position_x_sm . '; top: ' . $btn_position_y_sm . '; } } @media (max-width: 575px) { #sp-pagebuilder-popup-close-btn-' . $popupId . ' { right: ' . $btn_position_x_xs . '; top: ' . $btn_position_y_xs . '; } } '; } return $cssOutput; } private function getPositionScriptContent($popupId, $formattedPopupAttribs) { $scriptContent = ' const data = ' . $formattedPopupAttribs . '; function onElementLoaded(element) { const container = element; const mediaQueryMap = { "default": "xl", "(max-width: 1200px)": "lg", "(max-width: 992px)": "md", "(max-width: 768px)": "sm", "(max-width: 575px)": "xs" }; const getResponsivePosition = (size = "default") => { const activeDevice = mediaQueryMap[size]; const windowHeight = window?.innerHeight; const containerHeight = container?.clientHeight; const windowWidth = window?.innerWidth; const containerWidth = container?.clientWidth; if (!data?.position) { data.position = { top: { xl: "", lg: "", md: "", sm: "", unit: "%" }, left: { xl: "", lg: "", md: "", sm: "", unit: "%" } }; } data.position = { top: { xl: data?.position?.top?.xl, lg: data?.position?.top?.lg || data?.position?.top?.xl, md: data?.position?.top?.md || data?.position?.top?.lg || data?.position?.top?.xl, sm: data?.position?.top?.sm || data?.position?.top?.md || data?.position?.top?.lg || data?.position?.top?.xl, xs: data?.position?.top?.xs || data?.position?.top?.sm || data?.position?.top?.md || data?.position?.top?.lg || data?.position?.top?.xl, unit: data?.position?.top?.unit, }, left: { xl: data?.position?.left?.xl, lg: data?.position?.left?.lg || data?.position?.top?.xl, md: data?.position?.left?.md || data?.position?.left?.lg || data?.position?.top?.xl, sm: data?.position?.left?.sm || data?.position?.left?.md || data?.position?.left?.lg || data?.position?.top?.xl, xs: data?.position?.left?.xs || data?.position?.left?.sm || data?.position?.left?.md || data?.position?.left?.lg || data?.position?.top?.xl, unit: data?.position?.left?.unit, }, }; if (data?.position?.top?.unit !== "%") { container.style["top"] = data?.position?.top[activeDevice] + data?.position?.top?.unit; } else if (data?.position?.top?.unit === "%") { if (data?.position?.top[activeDevice] !== "") { if (data?.position?.top[activeDevice] != 50) { container.style["top"] = `calc(${data?.position?.top[activeDevice]}${data?.position?.top?.unit} - ${ (data?.position?.top[activeDevice] * containerHeight) / 100 }px)`; } } } if (data?.position?.left?.unit !== "%") { container.style["left"] = data?.position?.left[activeDevice] + data?.position?.left?.unit; } else if (data?.position?.left?.unit === "%") { if (data?.position?.left[activeDevice] !== "") { if (data?.position?.left[activeDevice] != 50) { container.style["left"] = `calc(${data?.position?.left[activeDevice]}${data?.position?.left?.unit} - ${ (data?.position?.left[activeDevice] * containerWidth) / 100 }px)`; } } } if ( (data?.position?.top[activeDevice] === "" || data?.position?.top[activeDevice] == 50) && data?.position?.top?.unit === "%" ) { const isTop = windowHeight - containerHeight <= 0 ? "0" : null; container.style["top"] = isTop ? isTop : `calc(50% - ${containerHeight / 2}px)`; } if ( (data?.position?.left[activeDevice] === "" || data?.position?.left[activeDevice] == 50) && data?.position?.left?.unit === "%" ) { const isLeft = windowWidth - containerWidth <= 0 ? "0" : null; container.style["left"] = isLeft ? isLeft : `calc(50% - ${containerWidth / 2}px)`; } if (data?.position?.top[activeDevice] == 100 && data?.position?.top?.unit === "%") { container.style["top"] = `calc(100% - ${containerHeight}px)`; } if (data?.position?.left[activeDevice] == 100 && data?.position?.left?.unit === "%") { container.style["left"] = `calc(100% - ${containerWidth}px)`; } } const mediaLG = window.matchMedia("(max-width: 1200px)"); const mediaMD = window.matchMedia("(max-width: 992px)"); const mediaSM = window.matchMedia("(max-width: 768px)"); const mediaXS = window.matchMedia("(max-width: 575px)"); function handleTabletChange() { if (mediaXS.matches) { getResponsivePosition("(max-width: 575px)"); } else if (mediaSM.matches) { getResponsivePosition("(max-width: 768px)"); } else if (mediaMD.matches) { getResponsivePosition("(max-width: 992px)"); } else if (mediaLG.matches) { getResponsivePosition("(max-width: 1200px)"); } else { getResponsivePosition(); } } mediaLG.addListener(handleTabletChange); mediaMD.addListener(handleTabletChange); mediaSM.addListener(handleTabletChange); mediaXS.addListener(handleTabletChange); handleTabletChange(mediaLG); handleTabletChange(mediaMD); handleTabletChange(mediaSM); handleTabletChange(mediaXS); }; const elementSelector = " .page-' . $popupId . '.sp-pagebuilder-popup .builder-container"; const observerOptions = { childList: true, subtree: true }; const observerCallback = (mutationsList, observer) => { for (let mutation of mutationsList) { if (mutation.type === "childList") { const element = document.querySelector(elementSelector); if (element) { onElementLoaded(element); window.onresize = () => onElementLoaded(element); observer.disconnect(); break; } } } }; const observer = new MutationObserver(observerCallback); observer.observe(document.body, observerOptions); const element = document.querySelector(elementSelector); if (element) { onElementLoaded(element); window.onresize = () => onElementLoaded(element); observer.disconnect(); } window.addEventListener("beforeunload", function() { window.onresize = null; }); '; return $scriptContent; } private function getVisibilityScriptContent($popupId, $popupAttribs) { $popupAttribs['enter_animation_duration'] = isset($popupAttribs['enter_animation_duration']) && isset($popupAttribs['toggle_enter_animation']) && $popupAttribs['toggle_enter_animation'] == 1 ? $popupAttribs['enter_animation_duration'] : (isset($popupAttribs['toggle_enter_animation']) && $popupAttribs['toggle_enter_animation'] == 1 ? 2000 : 0); $popupAttribs['exit_animation_duration'] = isset($popupAttribs['exit_animation_duration']) && isset($popupAttribs['toggle_exit_animation']) && $popupAttribs['toggle_exit_animation'] == 1 ? $popupAttribs['exit_animation_duration'] : (isset($popupAttribs['toggle_exit_animation']) && $popupAttribs['toggle_exit_animation'] == 1 ? 2000 : 0); $popupAttribs['enter_animation_delay'] = isset($popupAttribs['enter_animation_delay']) && isset($popupAttribs['toggle_enter_animation']) && $popupAttribs['toggle_enter_animation'] == 1 ? $popupAttribs['enter_animation_delay'] : 0; $popupAttribs['exit_animation_delay'] = isset($popupAttribs['exit_animation_delay']) && isset($popupAttribs['toggle_exit_animation']) && $popupAttribs['toggle_exit_animation'] == 1 ? $popupAttribs['exit_animation_delay'] : 0; $popupAttribs['enter_animation'] = isset($popupAttribs['enter_animation']) ? $popupAttribs['enter_animation'] : 'fadeIn'; $popupAttribs['exit_animation'] = isset($popupAttribs['exit_animation']) ? $popupAttribs['exit_animation'] : 'rotateIn'; $dontShowScript = ' function isRestricted(id) { const restrictedIds = JSON.parse(localStorage.getItem("restricted-popup-ids")); if (!restrictedIds) return false; return restrictedIds.includes(id); } function isPermitted(id) { const storedTime = localStorage.getItem("reappear-popup-' . $popupId . '"); if (storedTime) { const currentTimestamp = new Date().getTime(); if (currentTimestamp - storedTime > 0) return true; return false; } return true; } function isWithinDateRange() { const dateRange = ' . (!empty($popupAttribs['date_range']['from']) && !empty($popupAttribs['date_range']['to']) ? json_encode($popupAttribs['date_range']) : 'null') . '; if (dateRange === null) { return true; } if (new Date(dateRange?.from) <= new Date(new Date().toISOString().split("T")[0] + "T06:00:00") && new Date(dateRange?.to) >= new Date(new Date().toISOString().split("T")[0] + "T06:00:00")) { return true; } return false; } '; $scriptContent = ''; if (!empty($popupAttribs['trigger_condition']) && $popupAttribs['trigger_condition'] === 'on_scroll') { $scriptContent = 'window.addEventListener("DOMContentLoaded", (event) => { if (isRestricted(' . $popupId . ')) return; if (!isPermitted(' . $popupId . ')) return; if (!isWithinDateRange(' . $popupId . ')) return; let previousScrollPosition = window.scrollY; window.onscroll = function() { const scrollPercentage = ' . (!empty($popupAttribs['scroll_percentage']) ? $popupAttribs['scroll_percentage'] : 40) . '; const scrollDirection = "' . (!empty($popupAttribs['scroll_direction']) ? $popupAttribs['scroll_direction'] : 'down') . '"; const scrollableHeight = document.documentElement.scrollHeight - window.innerHeight; const scrollPosition = (window.scrollY / scrollableHeight) * 100; const containerDiv = document.querySelector(".page-' . $popupId . ' .sp-pagebuilder-container-popup"); const overlayDiv = document.querySelector("#sp-pagebuilder-overlay-' . $popupId .'"); if (scrollDirection === "down" && scrollPosition > previousScrollPosition) { if (scrollPosition > scrollPercentage) { setTimeout(() => { containerDiv.parentNode.style.display = "block"; overlayDiv.style.display = "block"; ' . $this->getPositionScriptContent($popupId, json_encode($popupAttribs)) . ' }, ' . $popupAttribs['enter_animation_delay'] . '); ' . (!empty($popupAttribs['toggle_enter_animation']) && ($popupAttribs['toggle_enter_animation'] === 1 || $popupAttribs['toggle_enter_animation'] === 1) ? ' containerDiv.children[0].style.animationDirection = "normal"; containerDiv.children[0].setAttribute("class", "' . (!empty($popupAttribs['css_class']) ? $popupAttribs['css_class'] : "") . ' page-content builder-container ' . $popupAttribs['enter_animation'] . '");' : "") . ' } } else if (scrollDirection === "up" && scrollPosition < previousScrollPosition) { if (scrollPosition < scrollPercentage) { setTimeout(() => { containerDiv.parentNode.style.display = "block"; overlayDiv.style.display = "block"; ' . $this->getPositionScriptContent($popupId, json_encode($popupAttribs)) . ' }, ' . $popupAttribs['enter_animation_delay'] . '); ' . (!empty($popupAttribs['toggle_enter_animation']) && ($popupAttribs['toggle_enter_animation'] === 1 || $popupAttribs['toggle_enter_animation'] === 1) ? ' containerDiv.children[0].style.animationDirection = "normal"; containerDiv.children[0].setAttribute("class", "' . (!empty($popupAttribs['css_class']) ? $popupAttribs['css_class'] : "") . ' page-content builder-container ' . $popupAttribs['enter_animation'] . '");' : "") . ' } } previousScrollPosition = scrollPosition; }; }); '; } else if (!empty($popupAttribs['trigger_condition']) && $popupAttribs['trigger_condition'] === 'on_landing') { $scriptContent = 'window.addEventListener("DOMContentLoaded", (event) => { if (isRestricted(' . $popupId . ')) return; if (!isPermitted(' . $popupId . ')) return; if (!isWithinDateRange(' . $popupId . ')) return; const landingAfter = ' . (!empty($popupAttribs['landing_after']) ? $popupAttribs['landing_after'] : 0) . '; const landingShowAfter = ' . (!empty($popupAttribs['landing_show_after']) ? $popupAttribs['landing_show_after'] : "null") . '; const containerDiv = document.querySelector(".page-' . $popupId . ' .sp-pagebuilder-container-popup"); const overlayDiv = document.querySelector("#sp-pagebuilder-overlay-' . $popupId .'"); function getCookie(name) { let nameEQ = name + "="; let cookies = document.cookie.split(";"); for (let i = 0; i < cookies.length; i++) { let cookie = cookies[i].trim(); if (cookie.indexOf(nameEQ) === 0) { return decodeURIComponent(cookie.substring(nameEQ.length, cookie.length)); } } return null; } function setCookie(name, value, days = null) { let expires = ""; if (days) { let date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); expires = "; expires=" + date.toUTCString(); } document.cookie = name + "=" + (encodeURIComponent(value) || "") + expires + "; path=/"; } function deleteCookie(name, path = "/", domain = null) { let cookieString = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC"; if (path) { cookieString += "; path=" + path; } if (domain) { cookieString += "; domain=" + domain; } document.cookie = cookieString; } if (landingShowAfter === null) { const cookieLanding = getCookie("landingShowAfter-' . $popupId . '"); if (cookieLanding !== null) { deleteCookie("landingShowAfter-' . $popupId . '", "/"); } setTimeout(() => { containerDiv.parentNode.style.display = "block"; overlayDiv.style.display = "block"; ' . $this->getPositionScriptContent($popupId, json_encode($popupAttribs)) . ' ' . (!empty($popupAttribs['toggle_enter_animation']) && ($popupAttribs['toggle_enter_animation'] === 1 || $popupAttribs['toggle_enter_animation'] === 1) ? ' containerDiv.children[0].style.animationDirection = "normal"; containerDiv.children[0].setAttribute("class", "' . (!empty($popupAttribs['css_class']) ? $popupAttribs['css_class'] : "") . ' page-content builder-container ' . $popupAttribs['enter_animation'] . '");' : "") . ' }, (landingAfter * 1000) + ' . $popupAttribs['enter_animation_delay'] . '); } else { let totalHits = 0; const cookieLanding = getCookie("landingShowAfter-' . $popupId . '"); if (cookieLanding === null) { totalHits = 1; setCookie("landingShowAfter-' . $popupId . '", 1); } else { totalHits = Number(cookieLanding) + 1; setCookie("landingShowAfter-' . $popupId . '", totalHits); } if (landingShowAfter === totalHits) { setTimeout(() => { containerDiv.parentNode.style.display = "block"; overlayDiv.style.display = "block"; ' . $this->getPositionScriptContent($popupId, json_encode($popupAttribs)) . ' ' . (!empty($popupAttribs['toggle_enter_animation']) && ($popupAttribs['toggle_enter_animation'] === 1 || $popupAttribs['toggle_enter_animation'] === 1) ? ' containerDiv.children[0].style.animationDirection = "normal"; containerDiv.children[0].setAttribute("class", "' . (!empty($popupAttribs['css_class']) ? $popupAttribs['css_class'] : "") . ' page-content builder-container ' . $popupAttribs['enter_animation'] . '");' : "") . ' }, (landingAfter * 1000) + ' . $popupAttribs['enter_animation_delay'] . '); } } }); '; } else if (!empty($popupAttribs['trigger_condition']) && $popupAttribs['trigger_condition'] === 'on_click') { $scriptContent = 'window.addEventListener("DOMContentLoaded", (event) => { if (isRestricted(' . $popupId . ')) return; if (!isPermitted(' . $popupId . ')) return; if (!isWithinDateRange(' . $popupId . ')) return; const clickType = "' . (!empty($popupAttribs['click_type']) ? $popupAttribs['click_type'] : 'random') . '"; const clickCount = ' . (!empty($popupAttribs['click_count']) ? $popupAttribs['click_count'] : 1) . '; const clickArea = ' . (!empty($popupAttribs['click_area']) ? '"' . $popupAttribs['click_area'] . '"' : "null") . '; let clicked = 0; let isShown = false; if (clickType === "random") { document.addEventListener("click", (event) => { if (isRestricted(' . $popupId . ')) return; if (!isPermitted(' . $popupId . ')) return; if (!isWithinDateRange(' . $popupId . ')) return; let closePopupArea = "#sp-pagebuilder-popup-close-btn-' . $popupId . '"; let targetNode = event.target; if (targetNode.closest(closePopupArea)) { return; } clicked++; if (clicked >= clickCount) { const containerDiv = document.querySelector(".page-' . $popupId . ' .sp-pagebuilder-container-popup"); const overlayDiv = document.querySelector("#sp-pagebuilder-overlay-' . $popupId .'"); setTimeout(() => { containerDiv.parentNode.style.display = "block"; overlayDiv.style.display = "block"; ' . $this->getPositionScriptContent($popupId, json_encode($popupAttribs)) . ' }, ' . $popupAttribs['enter_animation_delay'] . '); ' . (!empty($popupAttribs['toggle_enter_animation']) && ($popupAttribs['toggle_enter_animation'] === 1 || $popupAttribs['toggle_enter_animation'] === 1) ? ' containerDiv.children[0].style.animationDirection = "normal"; containerDiv.children[0].setAttribute("class", "' . (!empty($popupAttribs['css_class']) ? $popupAttribs['css_class'] : "") . ' page-content builder-container ' . $popupAttribs['enter_animation'] . '");' : "") . ' } }); } else if (clickType === "specific") { if (clickArea !== null && clickArea !== undefined) { const selectedArea = document.querySelectorAll(clickArea); if(selectedArea !== null && selectedArea !== undefined) { Array.from(selectedArea).forEach(area => { area.addEventListener("click", () => { if (isRestricted(' . $popupId . ')) return; if (!isPermitted(' . $popupId . ')) return; if (!isWithinDateRange(' . $popupId . ')) return; clicked++; if (clicked >= clickCount) { const containerDiv = document.querySelector(".page-' . $popupId . ' .sp-pagebuilder-container-popup"); const overlayDiv = document.querySelector("#sp-pagebuilder-overlay-' . $popupId .'"); setTimeout(() => { containerDiv.parentNode.style.display = "block"; overlayDiv.style.display = "block"; ' . $this->getPositionScriptContent($popupId, json_encode($popupAttribs)) . ' }, ' . $popupAttribs['enter_animation_delay'] . '); ' . (!empty($popupAttribs['toggle_enter_animation']) && ($popupAttribs['toggle_enter_animation'] === 1 || $popupAttribs['toggle_enter_animation'] === 1) ? ' containerDiv.children[0].style.animationDirection = "normal"; containerDiv.children[0].setAttribute("class", "' . (!empty($popupAttribs['css_class']) ? $popupAttribs['css_class'] : "") . ' page-content builder-container ' . $popupAttribs['enter_animation'] . '");' : "") . ' isShown = true; } }); }); } } } }); '; } else if (!empty($popupAttribs['trigger_condition']) && $popupAttribs['trigger_condition'] === 'on_hover') { $scriptContent = 'window.addEventListener("DOMContentLoaded", (event) => { if (isRestricted(' . $popupId . ')) return; if (!isPermitted(' . $popupId . ')) return; if (!isWithinDateRange(' . $popupId . ')) return; const hoverArea = "' . (!empty($popupAttribs['hover_area']) ? $popupAttribs['hover_area'] . '"' : "null") . '; const selectedArea = document.querySelectorAll(hoverArea); Array.from(selectedArea).forEach(area => { area.addEventListener("mouseover", () => { const containerDiv = document.querySelector(".page-' . $popupId . ' .sp-pagebuilder-container-popup"); const overlayDiv = document.querySelector("#sp-pagebuilder-overlay-' . $popupId .'"); setTimeout(() => { containerDiv.parentNode.style.display = "block"; overlayDiv.style.display = "block"; ' . $this->getPositionScriptContent($popupId, json_encode($popupAttribs)) . ' }, ' . $popupAttribs['enter_animation_delay'] . '); ' . (!empty($popupAttribs['toggle_enter_animation']) && ($popupAttribs['toggle_enter_animation'] === 1 || $popupAttribs['toggle_enter_animation'] === 1) ? ' containerDiv.children[0].style.animationDirection = "normal"; containerDiv.children[0].setAttribute("class", "' . (!empty($popupAttribs['css_class']) ? $popupAttribs['css_class'] : "") . ' page-content builder-container ' . $popupAttribs['enter_animation'] . '");' : "") . ' }); }); }); '; } else if (!empty($popupAttribs['trigger_condition']) && $popupAttribs['trigger_condition'] === 'on_inactivity') { $scriptContent = 'window.addEventListener("DOMContentLoaded", (event) => { if (isRestricted(' . $popupId . ')) return; if (!isPermitted(' . $popupId . ')) return; if (!isWithinDateRange(' . $popupId . ')) return; const inactivityDuration = ' . (!empty($popupAttribs['inactivity_duration']) ? $popupAttribs['inactivity_duration'] : 0) . '; let idleTimeCounter = 0; let idleInterval = null; function resetIdleTimer(idleInterval) { if (!idleInterval) { idleInterval = setInterval(() => { if (document.body.getAttribute("data-stop-timer") == "true") { document.removeEventListener("mousemove", stopIdleCounter, false); document.removeEventListener("keypress", stopIdleCounter, false); document.removeEventListener("scroll", stopIdleCounter, false); document.removeEventListener("click", stopIdleCounter, false); clearInterval(idleInterval); } idleTimeCounter++; if (idleTimeCounter >= inactivityDuration) { const containerDiv = document.querySelector(".page-' . $popupId . ' .sp-pagebuilder-container-popup"); const overlayDiv = document.querySelector("#sp-pagebuilder-overlay-' . $popupId .'"); setTimeout(() => { containerDiv.parentNode.style.display = "block"; overlayDiv.style.display = "block"; ' . $this->getPositionScriptContent($popupId, json_encode($popupAttribs)) . ' }, ' . $popupAttribs['enter_animation_delay'] . '); ' . (!empty($popupAttribs['toggle_enter_animation']) && ($popupAttribs['toggle_enter_animation'] === 1 || $popupAttribs['toggle_enter_animation'] === 1) ? ' containerDiv.children[0].style.animationDirection = "normal"; containerDiv.children[0].setAttribute("class", "' . (!empty($popupAttribs['css_class']) ? $popupAttribs['css_class'] : "") . ' page-content builder-container ' . $popupAttribs['enter_animation'] . '");' : "") . ' } }, 1000); } } function stopIdleCounter() { clearInterval(idleInterval); idleInterval = null; idleTimeCounter = 0; } window.onload = function() { resetIdleTimer(idleInterval); document.addEventListener("mousemove", stopIdleCounter, false); document.addEventListener("keypress", stopIdleCounter, false); document.addEventListener("scroll", stopIdleCounter, false); document.addEventListener("click", stopIdleCounter, false); }; }); '; } $scriptContent .= ' window.addEventListener("DOMContentLoaded", (event) => { if (isRestricted(' . $popupId . ')) return; if (!isPermitted(' . $popupId . ')) return; if (!isWithinDateRange(' . $popupId . ')) return; const containerBuilderDiv = document.querySelector(".page-' . $popupId . '.sp-pagebuilder-popup .builder-container"); const displayValue = window.getComputedStyle(containerBuilderDiv, null).display; if (displayValue === "block") { ' . $this->getPositionScriptContent($popupId, json_encode($popupAttribs)) . '; } }); '; return $dontShowScript . ' ' . $scriptContent; } private function getAdvancedScriptContent($popupId, $popupAttribs) { $popupAttribs['enter_animation_duration'] = isset($popupAttribs['enter_animation_duration']) && isset($popupAttribs['toggle_enter_animation']) && $popupAttribs['toggle_enter_animation'] == 1 ? $popupAttribs['enter_animation_duration'] : (isset($popupAttribs['toggle_enter_animation']) && $popupAttribs['toggle_enter_animation'] == 1 ? 2000 : 0); $popupAttribs['exit_animation_duration'] = isset($popupAttribs['exit_animation_duration']) && isset($popupAttribs['toggle_exit_animation']) && $popupAttribs['toggle_exit_animation'] == 1 ? $popupAttribs['exit_animation_duration'] : (isset($popupAttribs['toggle_exit_animation']) && $popupAttribs['toggle_exit_animation'] == 1 ? 2000 : 0); $popupAttribs['enter_animation_delay'] = isset($popupAttribs['enter_animation_delay']) && isset($popupAttribs['toggle_enter_animation']) && $popupAttribs['toggle_enter_animation'] == 1 ? $popupAttribs['enter_animation_delay'] : 0; $popupAttribs['exit_animation_delay'] = isset($popupAttribs['exit_animation_delay']) && isset($popupAttribs['toggle_exit_animation']) && $popupAttribs['toggle_exit_animation'] == 1 ? $popupAttribs['exit_animation_delay'] : 0; $popupAttribs['enter_animation'] = isset($popupAttribs['enter_animation']) ? $popupAttribs['enter_animation'] : 'fadeIn'; $popupAttribs['exit_animation'] = isset($popupAttribs['exit_animation']) ? $popupAttribs['exit_animation'] : 'rotateIn'; $scriptContent = 'window.addEventListener("DOMContentLoaded", (event) => { const builder = document.querySelector(".page-' . $popupId . ' .sp-pagebuilder-container-popup"); const builderOverlay = document.getElementById("sp-pagebuilder-overlay-' . $popupId . '"); '; if (!empty($popupAttribs['auto_close']) && $popupAttribs['auto_close'] === 1) { if (!empty($popupAttribs['auto_close_after'])) { $landingDelay = 0; $popupAutoClose = !empty($popupAttribs['auto_close_after']) ? $popupAttribs['auto_close_after'] : 10; if (!empty($popupAttribs['trigger_condition']) && $popupAttribs['trigger_condition'] === 'on_landing') { $landingDelay = !empty($popupAttribs['landing_after']) ? $popupAttribs['landing_after'] : 0; } $scriptContent .= ' setTimeout(() => { ' . (!empty($popupAttribs['toggle_exit_animation']) && ($popupAttribs['toggle_exit_animation'] === 1 || $popupAttribs['toggle_exit_animation'] === 1) ? ' builder.children[0].style.animationDirection = "reverse"; builder.children[0].style.animationDuration = "' . ($popupAttribs['exit_animation_duration'] / 1000) . 's"; builder.children[0].style.animationDelay = "' . ($popupAttribs['exit_animation_delay'] / 1000) . 's"; builder.children[0].setAttribute("class", "page-content builder-container ' . $popupAttribs['exit_animation'] . '");' : "") . ' }, ' . ((($landingDelay + $popupAutoClose) * 1000)) . '); builder.parentNode.style.animationDelay = "' . ($popupAttribs['exit_animation_delay'] / 1000) . 's"; builder.parentNode.style.animationDuration = "' . ($popupAttribs['exit_animation_duration'] / 1000) . 's"; setTimeout(() => { builder.parentNode.style.display = "none"; builderOverlay.style.display = "none"; }, ' . ((($landingDelay + $popupAutoClose) * 1000) + $popupAttribs['exit_animation_duration'] + $popupAttribs['exit_animation_delay']) . '); '; } } if (!empty($popupAttribs['close_outside_click']) && $popupAttribs['close_outside_click'] === 1) { $scriptContent .= ' window.onclick = function (event) { if (!(event.target.getAttribute("class") === "' . (!empty($popupAttribs['css_class']) ? $popupAttribs['css_class'] : "") . ' page-content builder-container" || event.target.querySelector(".builder-container") === null)) { builder.parentNode.style.animationDelay = "' . ($popupAttribs['exit_animation_delay'] / 1000) . 's"; builder.parentNode.style.animationDuration = "' . ($popupAttribs['exit_animation_duration'] / 1000) . 's"; setTimeout(() => { builder.parentNode.style.display = "none"; builderOverlay.style.display = "none"; }, ' . ($popupAttribs['exit_animation_duration'] + $popupAttribs['exit_animation_delay']) . '); } }; '; } if (!empty($popupAttribs['close_on_esc']) && $popupAttribs['close_on_esc'] === 1) { $scriptContent .= ' window.addEventListener("keydown", function(e) { if (e.key === "Escape" || e.key === "Esc") { builder.parentNode.style.animationDelay = "' . ($popupAttribs['exit_animation_delay'] / 1000) . 's"; builder.parentNode.style.animationDuration = "' . ($popupAttribs['exit_animation_duration'] / 1000) . 's"; setTimeout(() => { builder.parentNode.style.display = "none"; builderOverlay.style.display = "none"; }, ' . ($popupAttribs['exit_animation_duration'] + $popupAttribs['exit_animation_delay']) . '); } }); '; } if (!empty($popupAttribs['disable_page_scrolling']) && $popupAttribs['disable_page_scrolling'] === 1) { $scriptContent .= ' document.body.style.overflowY = "hidden"; '; } $scriptContent .= ' var timeUnitMap = { sec: 1000, min: 60000, hr: 3600000, day: 86400000, never: 0, }; var reappearAfter = new Date().getTime() + (' . (isset($popupAttribs['reappear_after']) && !empty($popupAttribs['reappear_after']['value']) ? $popupAttribs['reappear_after']['value'] : 0) . ' * ' . ((isset($popupAttribs['reappear_after'])) && !empty($popupAttribs['reappear_after']['value']) ? 'timeUnitMap["' . $popupAttribs['reappear_after']['unit'] . '"]' : 0) . '); if (' . (isset($popupAttribs['reappear_after']) && !empty($popupAttribs['reappear_after']['unit']) ? ('"' . $popupAttribs['reappear_after']['unit'] . '"') : "null") . ' == "never") { reappearAfter = new Date().getTime() + 3153600000000; } localStorage.setItem("reappear-popup-' . $popupId . '", reappearAfter); '; $scriptContent .= ' });'; return $scriptContent; } private function getScriptContent($popupId, $popupAttribs) { $popupAttribs['enter_animation_duration'] = isset($popupAttribs['enter_animation_duration']) && isset($popupAttribs['toggle_enter_animation']) && $popupAttribs['toggle_enter_animation'] == 1 ? $popupAttribs['enter_animation_duration'] : (isset($popupAttribs['toggle_enter_animation']) && $popupAttribs['toggle_enter_animation'] == 1 ? 2000 : 0); $popupAttribs['exit_animation_duration'] = isset($popupAttribs['exit_animation_duration']) && isset($popupAttribs['toggle_exit_animation']) && $popupAttribs['toggle_exit_animation'] == 1 ? $popupAttribs['exit_animation_duration'] : (isset($popupAttribs['toggle_exit_animation']) && $popupAttribs['toggle_exit_animation'] == 1 ? 2000 : 0); $popupAttribs['enter_animation_delay'] = isset($popupAttribs['enter_animation_delay']) && isset($popupAttribs['toggle_enter_animation']) && $popupAttribs['toggle_enter_animation'] == 1 ? $popupAttribs['enter_animation_delay'] : 0; $popupAttribs['exit_animation_delay'] = isset($popupAttribs['exit_animation_delay']) && isset($popupAttribs['toggle_exit_animation']) && $popupAttribs['toggle_exit_animation'] == 1 ? $popupAttribs['exit_animation_delay'] : 0; $popupAttribs['enter_animation'] = isset($popupAttribs['enter_animation']) ? $popupAttribs['enter_animation'] : 'fadeIn'; $popupAttribs['exit_animation'] = isset($popupAttribs['exit_animation']) ? $popupAttribs['exit_animation'] : 'rotateIn'; $scriptContent = 'window.addEventListener("DOMContentLoaded", (event) => { function getImageSrc(imageSrc) { if (!imageSrc?.src) return imageSrc; if (imageSrc.src.includes("http://") || imageSrc.src.includes("https://")) { return { ...imageSrc, src: imageSrc?.src }; } else { const baseUrl = window.location.origin; const originalSrc = baseUrl + "/" + imageSrc?.src; const formattedSrc = originalSrc.replace(/\\\/g, `/`); return { ...imageSrc, src: formattedSrc }; } } const popupData = ' . json_encode($popupAttribs) . '; const newCloseElement = document.createElement("div"); newCloseElement.setAttribute("id", "sp-pagebuilder-popup-close-btn-' . $popupId . '"); newCloseElement.setAttribute("class", "sp-pagebuilder-popup-close-btn sp-pagebuilder-popup-close-btn-hover-' . $popupId . '"); newCloseElement.setAttribute("role", "button"); newCloseElement.setAttribute("role", "button"); if (popupData?.close_btn_text && !popupData?.close_btn_is_icon) { newCloseElement.style.gap = "5px"; } newCloseElement.innerHTML = ` <span class="close-btn-text" style="display: inline-block;">${popupData?.close_btn_text || ""}</span> <span class="close-btn-icon ${(popupData?.close_btn_icon !== undefined) ? popupData?.close_btn_icon : "fas fa-times"}" style="display: inline-block;" title="' . (Text::_('COM_SPPAGEBUILDER_TOP_PANEL_CLOSE')) . '"></span> `; const setClosePopup = (selector = null) => { if (selector === null) return; Array.from(document.querySelectorAll(selector)).forEach(element => { element.addEventListener("click", () => { const builder = document.querySelector(".page-' . $popupId . ' .sp-pagebuilder-container-popup"); ' . (!empty($popupAttribs['toggle_exit_animation']) && ($popupAttribs['toggle_exit_animation'] === 1 || $popupAttribs['toggle_exit_animation'] === 1) ? ' builder.children[0].style.animationDirection = "reverse"; builder.children[0].setAttribute("class", "' . (!empty($popupAttribs['css_class']) ? $popupAttribs['css_class'] : "") . ' page-content builder-container ' . $popupAttribs['exit_animation'] . '");' : "") . ' builder.children[0].style.animationDelay = "' . ($popupAttribs['exit_animation_delay'] / 1000) . 's"; builder.children[0].style.animationDuration = "' . ($popupAttribs['exit_animation_duration'] / 1000) . 's"; setTimeout(() => { builder.parentNode.style.display = "none"; document.getElementById("sp-pagebuilder-overlay-' . $popupId . '").style.display = "none"; document.body.style.overflowY = "auto"; }, ' . (!empty($popupAttribs['toggle_exit_animation']) && ($popupAttribs['toggle_exit_animation'] === 1 || $popupAttribs['toggle_exit_animation'] === 1) ? ($popupAttribs['exit_animation_duration'] + $popupAttribs['exit_animation_delay']) : "") . '); window.onscroll = null; document.body.setAttribute("data-stop-timer", "true"); }); }); }; const builder = document.querySelector(".page-' . $popupId . ' .sp-pagebuilder-container-popup"); builder?.children[0]?.insertBefore(newCloseElement, builder?.children[0]?.children[0]); builder.children[0].setAttribute("class", "' . (!empty($popupAttribs['css_class']) ? $popupAttribs['css_class'] : "") . ' page-content builder-container"); let landingDelay = 0; if ( ' . ((!empty($popupAttribs['trigger_condition']) && $popupAttribs['trigger_condition'] === 'on_landing') ? 1 : 0) . ') { landingDelay = ' . (!empty($popupAttribs['landing_after']) ? ($popupAttribs['landing_after'] * 1000) : 0) . '; } if (' . ((!empty($popupAttribs['toggle_enter_animation']) && !empty($popupAttribs['toggle_exit_animation']) && ($popupAttribs['enter_animation'] === $popupAttribs['exit_animation'])) ? 1 : 0) . ') { setTimeout(() => { ' . (!empty($popupAttribs['toggle_enter_animation']) && ($popupAttribs['toggle_enter_animation'] === 1 || $popupAttribs['toggle_enter_animation'] === 1) ? ' builder.children[0].setAttribute("class", "' . (!empty($popupAttribs['css_class']) ? $popupAttribs['css_class'] : "") . ' page-content builder-container");' : "") . ' }, landingDelay + ' . ((!empty($popupAttribs['enter_animation_delay']) ? $popupAttribs['enter_animation_delay'] : 0) + (!empty($popupAttribs['enter_animation_duration']) ? $popupAttribs['enter_animation_duration'] : 0)) . '); } setClosePopup("#sp-pagebuilder-popup-close-btn-' . $popupId . '"); if (popupData?.close_on_click) { setClosePopup(popupData?.close_on_click); } });'; return $scriptContent; } private function renderPopupByIds() { /** @var CMSApplication $app */ $app = Factory::getApplication(); $popupIds = $this->getPopupIds(); $idArray = array_map( function ($item) { return $item->id; }, $popupIds ?? [] ); $popups = $this->getPopupsByIds($idArray); if (empty($popups)) { return; } foreach ($popups as $key => $popup) { $popupContent = $this->popupContents[$key] ?? ''; $popupId = $popup->id; $body = $app->getBody(); if (!$this->isPopupAccessLevelPermitted($popup->access)) { continue; } $popupAttribs = !empty($popup->attribs) && is_string($popup->attribs) ? json_decode($popup->attribs, true) : []; $scriptContent = $this->getScriptContent($popupId, $popupAttribs); $cssOutput = $this->getCssOutput($popupAttribs, $popupId); $visibilityScriptContent = ''; if (!empty($popupAttribs['trigger_condition'])) { $visibilityScriptContent = $this->getVisibilityScriptContent($popupId, $popupAttribs); } $advancedScriptContent = $this->getAdvancedScriptContent($popupId, $popupAttribs); $responsive_class = ''; $responsive_class .= (isset($popupAttribs['hidden_xl']) && filter_var($popupAttribs['hidden_xl'], FILTER_VALIDATE_BOOLEAN)) ? ' sppb-hidden-xl ' : ''; $responsive_class .= (isset($popupAttribs['hidden_lg']) && filter_var($popupAttribs['hidden_lg'], FILTER_VALIDATE_BOOLEAN)) ? ' sppb-hidden-lg ' : ''; $responsive_class .= (isset($popupAttribs['hidden_md']) && filter_var($popupAttribs['hidden_md'], FILTER_VALIDATE_BOOLEAN)) ? ' sppb-hidden-md ' : ''; $responsive_class .= (isset($popupAttribs['hidden_sm']) && filter_var($popupAttribs['hidden_sm'], FILTER_VALIDATE_BOOLEAN)) ? ' sppb-hidden-sm ' : ''; $responsive_class .= (isset($popupAttribs['hidden_xs']) && filter_var($popupAttribs['hidden_xs'], FILTER_VALIDATE_BOOLEAN)) ? ' sppb-hidden-xs ' : ''; $popupDiv = ' <div class="' .$responsive_class. '" id="sp-pagebuilder-overlay-'. $popupId . '" style="position: fixed; inset: 0; z-index: 9999;"></div> <div class="sp-page-builder page-' . $popupId . ' sp-pagebuilder-popup '. $responsive_class .'"> <div class="sp-pagebuilder-container-popup"> <div class=" page-content builder-container">' . $popupContent . '</div> </div> <script>' . $scriptContent . '</script> <style>' . $cssOutput . '</style> <script>' . $visibilityScriptContent . '</script> <script>' . $advancedScriptContent . '</script> </div> '; $app->setBody($body . $popupDiv); } } /** * Checks if the current user has permission to access the popup based on its access level. * * This method retrieves the current user's authorized view levels and checks if the * popup's access level is included in that list. If it is, the user is permitted to * view the popup; otherwise, they are not. * * @param int $popupAccessLevel The access level of the popup. * * @return bool True if the user is permitted to view the popup, false otherwise. */ private function isPopupAccessLevelPermitted($popupAccessLevel) { $user = Factory::getUser(); $userAccessLevels = $user->getAuthorisedViewLevels(); if (in_array($popupAccessLevel, $userAccessLevels)) { return true; } return false; } /** * Checks if the provided HTML content is a standard HTML document. * * This method verifies whether the HTML content contains a DOCTYPE declaration * and includes opening and closing `<html>` tags, which are the key components * of a standard HTML document. * * @param string $htmlContent * * @return bool */ private function isStandardHTMLDocument($htmlContent) { $hasDoctype = stripos($htmlContent, '<!DOCTYPE') !== false; return $hasDoctype; } private function renderPopup() { $app = Factory::getApplication(); $input = $app->input; $pageId = $input->get('id', '', 'INT'); $view = $input->get('view', '', 'STRING'); $option = $input->get('option', '', 'STRING'); if ($option == 'com_sppagebuilder' && $view === 'form') { return; } if ($this->isStandardHTMLDocument($app->getBody()) === false) { return; } try { if ($option === 'com_sppagebuilder' && !empty($pageId)) { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName(array('extension_view'))) ->from($db->quoteName('#__sppagebuilder')) ->where($db->quoteName('id') . ' = ' . $pageId); $db->setQuery($query); $result = $db->loadObject(); if (!empty($result->extension_view) && $result->extension_view === 'popup') { return; } } $this->renderPopupByIds(); } catch (RuntimeException $e) { $app->enqueueMessage($e->getMessage(), 'error'); } } function isShaperHelixUltimate() { /** @var CMSApplication $app */ $doc = new DOMDocument(); libxml_use_internal_errors(true); try { /** @var CMSApplication $app */ $app = Factory::getApplication(); $body = $app->getBody(); $doc->loadHTML($body); libxml_clear_errors(); $xpath = new DOMXPath($doc); /** @var DOMElement $bodyNode */ $bodyNode = $xpath->query('//body')->item(0); return $bodyNode ? strpos($bodyNode->getAttribute('class'), 'helix-ultimate') !== false : false; } catch (Exception $e) { return false; } } function divWithHtml(DOMDocument $doc, string $html): DOMElement { $wrapper = $doc->createElement('div'); $tmp = new DOMDocument(); libxml_use_internal_errors(true); $tmp->loadHTML('<?xml encoding="UTF-8"><div id="__frag__">'.$html.'</div>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_clear_errors(); $xp = new DOMXPath($tmp); $box = $xp->query('//*[@id="__frag__"]')->item(0); if ($box) { foreach (iterator_to_array($box->childNodes) as $child) { $wrapper->appendChild($doc->importNode($child, true)); } } return $wrapper; } function onAfterRender() { /** @var CMSApplication $app */ $app = Factory::getApplication(); $input = $app->input; $option = $input->get('option', '', 'STRING'); $view = $input->get('view', '', 'STRING'); if ($app->isClient('administrator')) { $integration = self::getIntegration(); if (!$integration) { return; } $layout = $input->get('layout', '', 'STRING'); $id = $input->get($integration['id_alias'], 0, 'INT'); if (!($option === 'com_' . $integration['group'] && $view === $integration['view'])) { return; } if (isset($integration['frontend_only']) && $integration['frontend_only']) { return; } // Page Builder state $pagebuilder_enabled = 0; $viewId = 0; $language = "*"; if ($page_content = self::getPageContent($option, $view, $id)) { $page_content = ApplicationHelper::preparePageData($page_content); $viewId = $page_content->id; $pagebuilder_enabled = $page_content->active; $language = $page_content->language; } // Add script $body = $app->getBody(); $frontendEditorLink = 'index.php?option=com_sppagebuilder&view=form&tmpl=component&layout=edit&extension=com_content&extension_view=article&id=' . $viewId; $backendEditorLink = 'index.php?option=com_sppagebuilder&view=editor&extension=com_content&extension_view=article&article_id=' . $id; if ($language && $language !== '*' && Multilanguage::isEnabled()) { $frontendEditorLink .= '&lang=' . $language; $backendEditorLink .= '&lang=' . $language; } $backendEditorLink .= '&tmpl=component#/editor/' . $viewId; $frontendEditorLink = str_replace('/administrator', '', SppagebuilderHelperRoute::buildRoute($frontendEditorLink)); if (!$viewId || !$pagebuilder_enabled) { $dashboardHTML = '<div class="sp-pagebuilder-alert sp-pagebuilder-alert-info">' . Text::_('Save the article first for getting the editor!') . '</div>'; } else { $sppbParams = ComponentHelper::getParams('com_sppagebuilder'); $enableFrontendEditing = (bool) $sppbParams->get('enable_frontend_editing', 1); $dashboardHTML = '<a href="' . $backendEditorLink . '" class="sp-pagebuilder-button-outline">Edit with Backend Editor</a>'; if ($enableFrontendEditing) { $dashboardHTML .= '<a href="' . $frontendEditorLink . '" class="sp-pagebuilder-button">Edit with Frontend Editor</a>'; } } if ($option === 'com_k2') { $body = str_replace('<div class="k2ItemFormEditor">', '<div class="builder-integrations"><div class="builder-integration-toggler"><span class="builder-integration-button builder-integration-button-joomla" action-switch-builder data-action="editor" role="button">Joomla Editor</span><span class="builder-integration-button builder-integration-button-editor" action-switch-builder data-action="sppagebuilder" role="button">Edit with SP Page Builder</span></div></div><div class="builder-integration-component pagebuilder-' . str_replace('_', '-', $option) . '" style="display: none;"></div><div class="k2ItemFormEditor">', $body); } else { $body = str_replace('<fieldset class="adminform">', '<div class="builder-integrations"><div class="builder-integration-toggler"><span class="builder-integration-button builder-integration-button-joomla" action-switch-builder data-action="editor" role="button">Joomla Editor</span><span class="builder-integration-button builder-integration-button-editor" action-switch-builder data-action="sppagebuilder" role="button"><span class="builder-svg-icon"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 21 24"><path d="M17.718 13.306c.658-.668 1.814-.642 2.476 0 .677.66.655 1.747 0 2.414a43.761 43.761 0 0 1-2.11 2.04C13.586 21.77 7.932 24.178 1.77 23.977.82 23.95.019 23.223.019 22.271c0-.901.804-1.736 1.75-1.707 1.943.062 3.406-.062 5.206-.507a20.241 20.241 0 0 0 2.072-.635c.171-.062.341-.128.51-.197l.224-.098c.292-.131.584-.267.872-.408a22.872 22.872 0 0 0 3.225-1.96c.075-.054.146-.109.221-.16l-.086.066c.105-.08.21-.16.314-.244a32.013 32.013 0 0 0 1.703-1.463c.58-.533 1.137-1.09 1.688-1.652Zm-9.886-.843c.562-.292 1.1-.628 1.609-1.002a.32.32 0 0 0 .128-.258.312.312 0 0 0-.136-.253L5.411 8.123a.331.331 0 0 0-.47.092.312.312 0 0 0-.047.167l.015 4.716a.311.311 0 0 0 .127.25.33.33 0 0 0 .281.056 11.07 11.07 0 0 0 2.515-.941ZM15.356 9.699 4.213 1.39 2.806.343.27.843c-.527.879-.134 1.772.622 2.334 3.712 2.767 7.427 5.54 11.143 8.308.52.387 1.04.773 1.557 1.16.751.561 1.96.113 2.394-.612.528-.88.127-1.773-.629-2.334Z" fill="currentColor"/><path d="M7.098 17.74c1.093-.243 2.17-.7 3.17-1.177 2.08-.988 4.007-2.41 5.444-4.184.299-.368.513-.714.513-1.207 0-.42-.192-.92-.513-1.207-.632-.565-1.871-.748-2.477 0-.55.683-1.17 1.31-1.852 1.87-.116.096-.236.191-.352.286.273-.194-.288.23 0 0-.8.564-1.635 1.072-2.526 1.495-.19.091-.381.175-.572.259-.124.054-.412.138.13-.051-.093.033-.183.073-.272.11-.277.105-.558.207-.843.298-.253.08-.512.16-.774.219-.894.197-1.504 1.251-1.224 2.101.3.908 1.19 1.4 2.148 1.189ZM2.86.38A1.753 1.753 0 0 0 1.774 0C.824 0 .023.78.023 1.707V22.22c0 .923.804 1.707 1.75 1.707.952 0 1.752-.78 1.752-1.707V.875L2.859.38Z" fill="currentColor"/></svg></span> SP Page Builder</span></div></div><div class="builder-integration-component pagebuilder-' . str_replace('_', '-', $option) . '" style="display: none;">' . $dashboardHTML . '</div><fieldset class="adminform">', $body); } // Page Builder fields $body = str_replace('</form>', '<input type="hidden" id="jform_attribs_sppagebuilder_content" name="jform[attribs][sppagebuilder_content]"></form>' . "\n", $body); $body = str_replace('</form>', '<input type="hidden" id="jform_attribs_sppagebuilder_article_id" name="jform[attribs][sppagebuilder_article_id]" value="' . $id . '"></form>' . "\n", $body); $body = str_replace('</form>', '<input type="hidden" id="jform_attribs_sppagebuilder_active" name="jform[attribs][sppagebuilder_active]" value="' . $pagebuilder_enabled . '"></form>' . "\n", $body); $app->setBody($body); } if ($app->isClient('site')) { $this->renderPopup(); if ($view !== 'form' && $this->isStandardHTMLDocument($app->getBody()) === true) { $this->renderColorSwitcher(); } if ($option === 'com_content' && $view === 'article') { $body = $app->getBody(); $doc = new DOMDocument(); libxml_use_internal_errors(true); $doc->loadHTML($body, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_clear_errors(); if ($this->articleDetailsPageContent) { $xpath = new DOMXPath($doc); if (!empty($xpath->query('//main')) && $xpath->query('//main')->length > 0) { $querySelector = "//main"; if ($this->isShaperHelixUltimate()) { $querySelector = "//*[@id='sp-main-body']"; } foreach ($xpath->query($querySelector) as $node) { while ($node->firstChild) { $node->removeChild($node->firstChild); } $div = $this->divWithHtml($doc, $this->articleDetailsPageContent); $div->setAttribute('class', 'page-content'); $divWrapper = $doc->createElement('div'); $divWrapper->setAttribute('id', 'sp-page-builder'); $divWrapper->setAttribute('class', 'sp-page-builder'); $divWrapper->appendChild($div); $node->appendChild($divWrapper); } $out = $doc->saveHTML(); $app->setBody($out); } } } else if ($option === 'com_content' && ($view === 'category' || $view === 'featured' || $view === 'archive')) { $body = $app->getBody(); $doc = new DOMDocument(); libxml_use_internal_errors(true); $doc->loadHTML($body, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_clear_errors(); if ($this->articleIndexPageContent) { $xpath = new DOMXPath($doc); if (!empty($xpath->query('//main')) && $xpath->query('//main')->length > 0) { $querySelector = "//main"; if ($this->isShaperHelixUltimate()) { $querySelector = "//*[@id='sp-main-body']"; } foreach ($xpath->query($querySelector) as $node) { while ($node->firstChild) { $node->removeChild($node->firstChild); } $div = $this->divWithHtml($doc, $this->articleIndexPageContent); $div->setAttribute('class', 'page-content'); $divWrapper = $doc->createElement('div'); $divWrapper->setAttribute('id', 'sp-page-builder'); $divWrapper->setAttribute('class', 'sp-page-builder'); $divWrapper->appendChild($div); $node->appendChild($divWrapper); } $out = $doc->saveHTML(); $app->setBody($out); } } } } } /** * Render the color switcher. * * @return void * @since 5.7.0 */ private function renderColorSwitcher() { $params = ComponentHelper::getParams('com_sppagebuilder'); $colorVariables = $params->get('sppb_color_variables', []); $isEnabledColoSwitcher = $params->get('show_color_switcher', 0); $modes = []; $colors = []; foreach($colorVariables as $colorVariable) { $path = $colorVariable->path; $mode = $path[1]; $value = $colorVariable->value; if (!isset($colors[$mode])) { array_push($modes, $mode); $colors[$mode] = [$value]; } else { array_push($colors[$mode], $value); } } if($isEnabledColoSwitcher && count($modes) > 1) { $app = Factory::getApplication(); $body = $app->getBody(); $colorSwitcherContent = ' <div class="sppb-color-switcher-modes"> <div class="sppb-color-switcher-toggle"> <svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" clip-rule="evenodd" d="M0.25 0.75H7.25V12.75C7.25 14.683 5.683 16.25 3.75 16.25C1.817 16.25 0.25 14.683 0.25 12.75V0.75ZM1.75 2.25V12.75C1.75 13.8546 2.64543 14.75 3.75 14.75C4.85457 14.75 5.75 13.8546 5.75 12.75V2.25H1.75Z" fill="#415162"></path> <path d="M4.25 12.716C4.25 12.9921 4.02614 13.216 3.75 13.216C3.47386 13.216 3.25 12.9921 3.25 12.716C3.25 12.4398 3.47386 12.216 3.75 12.216C4.02614 12.216 4.25 12.4398 4.25 12.716Z" fill="#415162"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M9.89941 0.9375L14.8492 5.88725L8 13L7.96967 10.6454L12.7278 5.88725L9.89941 3.05882L8 5L7.96967 2.86724L9.89941 0.9375Z" fill="#415162"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M15.75 9.25V16.25H6L7.5 14.75H14.25V10.75H11L12.5 9.25H15.75Z" fill="#415162"></path> </svg> <span> <i class="fas fa-chevron-up"></i> <i class="fas fa-chevron-down"></i> </span> </div> <div class="sppb-color-switcher-colors-wrapper"> <div class="sppb-color-switcher-colors"> ' . implode('', array_map(function($mode) use ($colors) { $gradientColors = count($colors[$mode]) > 1 ? $colors[$mode][0] . ' 50%, ' . $colors[$mode][1] . ' 50%' : $colors[$mode][0] . ' 100%'; return sprintf( '<span class="sppb-color-switcher-color" data-mode="%s" style="background-image: linear-gradient(-45deg, %s)"></span>', $mode, $gradientColors ); }, $modes)) . ' </div> </div> </div> '; $app->setBody($body . $colorSwitcherContent); } } private function getArticleDetailsPage($id) { if (empty($id)) { return ''; } try { $db = Factory::getDbo(); $query = $db->getQuery(true) ->select('*') ->from($db->quoteName('#__sppagebuilder')) ->where($db->quoteName('extension') . ' = ' . $db->quote('com_sppagebuilder')) ->where($db->quoteName('extension_view') . ' = ' . $db->quote('dynamic_content:detail')) ->where($db->quoteName('view_id') . ' = ' . CollectionIds::ARTICLES_COLLECTION_ID) ->where($db->quoteName('published') . ' = 1'); $db->setQuery($query); $page = $db->loadObject(); if (empty($page)) { return ''; } if (!class_exists('ApplicationHelper')) { require_once JPATH_ROOT . '/administrator/components/com_sppagebuilder/editor/helpers/ApplicationHelper.php'; } $page = ApplicationHelper::preparePageData($page); $app = Factory::getApplication(); $input = $app->input; $input->set('collection_item_id', [$id]); $input->set('collection_type', 'articles'); if (!class_exists('AddonParser')) { require_once JPATH_ROOT . '/components/com_sppagebuilder/parser/addon-parser.php'; } if (!class_exists('SppagebuilderHelperSite')) { require_once JPATH_ROOT . '/components/com_sppagebuilder/helpers/helper.php'; } SppagebuilderHelperSite::initView($page); $content = AddonParser::viewAddons($page->text, 0, 'page-' . $page->id); $css = ''; if (isset($page->css) && $page->css) { $css = '<style type="text/css">' . $page->css . '</style>'; } return $css . $content; } catch (Exception $e) { // Log error for debugging $app = Factory::getApplication(); if ($app->isClient('administrator')) { $app->enqueueMessage('Error rendering article details page: ' . $e->getMessage(), 'error'); } return ''; } } private function getArticleIndexPage($id) { try { $db = Factory::getDbo(); $query = $db->getQuery(true) ->select('*') ->from($db->quoteName('#__sppagebuilder')) ->where($db->quoteName('extension') . ' = ' . $db->quote('com_sppagebuilder')) ->where($db->quoteName('extension_view') . ' = ' . $db->quote('dynamic_content:index')) ->where($db->quoteName('view_id') . ' = ' . CollectionIds::ARTICLES_COLLECTION_ID) ->where($db->quoteName('published') . ' = 1'); $db->setQuery($query); $page = $db->loadObject(); if (empty($page)) { return ''; } if (!class_exists('ApplicationHelper')) { require_once JPATH_ROOT . '/administrator/components/com_sppagebuilder/editor/helpers/ApplicationHelper.php'; } $page = ApplicationHelper::preparePageData($page); $app = Factory::getApplication(); $input = $app->input; $input->set('collection_item_id', [$id]); $input->set('collection_type', 'articles'); if (!class_exists('AddonParser')) { require_once JPATH_ROOT . '/components/com_sppagebuilder/parser/addon-parser.php'; } if (!class_exists('SppagebuilderHelperSite')) { require_once JPATH_ROOT . '/components/com_sppagebuilder/helpers/helper.php'; } SppagebuilderHelperSite::initView($page); $content = AddonParser::viewAddons($page->text, 0, 'page-' . $page->id); $css = ''; if (isset($page->css) && $page->css) { $css = '<style type="text/css">' . $page->css . '</style>'; } return $css . $content; } catch (Exception $e) { // Log error for debugging $app = Factory::getApplication(); if ($app->isClient('administrator')) { $app->enqueueMessage('Error rendering article index page: ' . $e->getMessage(), 'error'); } return ''; } } private function loadArticleDetailsPage() { $app = Factory::getApplication(); $input = $app->input; $id = $input->get('id', 0, 'INT'); $params = ComponentHelper::getParams('com_sppagebuilder'); $showArticleDetailsPageAsDefault = $params->get('show_article_details_page_as_default', 0); if (empty($id)) { return; } if (!$showArticleDetailsPageAsDefault) { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select(['id, content']) ->from($db->quoteName('#__sppagebuilder')) ->where($db->quoteName('extension_view') . ' = ' . $db->quote('article')) ->where($db->quoteName('view_id') . ' = ' . $db->quote($id)) ->where($db->quoteName('active') . ' = ' . $db->quote('1')) ->where($db->quoteName('published') . ' = 1'); $db->setQuery($query); $result = $db->loadObject(); if (!empty($result->content)) { $articleContent = json_decode($result->content); if (!empty($articleContent)) { return null; } } } $detailsPage = $this->getArticleDetailsPage($id); if (!empty($detailsPage)) { $this->articleDetailsPageContent = $detailsPage; } } private function loadArticleIndexPage() { $app = Factory::getApplication(); $input = $app->input; $id = $input->get('id', 0, 'INT'); $indexPage = $this->getArticleIndexPage($id); if (!empty($indexPage)) { $this->articleIndexPageContent = $indexPage; } } /** * Get the default colors from the template style (Helix) * * @return mixed * @since 5.7.0 */ private function getDefaultThemeColors() { $colorPrefix = 'sppb'; $keysToExtract = [ "topbar_bg_color", "topbar_text_color", "header_bg_color", "logo_text_color", "menu_text_color", "menu_text_hover_color", "menu_text_active_color", "menu_dropdown_bg_color", "menu_dropdown_text_color", "menu_dropdown_text_hover_color", "menu_dropdown_text_active_color", "offcanvas_menu_icon_color", "offcanvas_menu_bg_color", "offcanvas_menu_items_and_items_color", "offcanvas_menu_active_menu_item_color", "text_color", "bg_color", "link_color", "link_hover_color", "footer_bg_color", "footer_text_color", "footer_link_color", "footer_link_hover_color", ]; $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select(['params']) ->from($db->quoteName('#__template_styles')) ->where($db->quoteName('client_id') . ' = 0') ->where($db->quoteName('home') . ' = 1'); $db->setQuery($query); try { $ext = $db->loadObject(); $styleObj = !empty($ext->params) ? $ext->params : "{}"; $styleObjDecoded = \json_decode($styleObj); $isCustomTemplateStyle = isset($styleObjDecoded->custom_style) && $styleObjDecoded->custom_style == 1; if(!$isCustomTemplateStyle && isset($styleObjDecoded->preset) && !empty($styleObjDecoded->preset)) { $styleObjDecoded = json_decode($styleObjDecoded->preset); } $newStyleObj = new \stdClass(); foreach ($keysToExtract as $key) { if (isset($styleObjDecoded->$key)) { $newStyleObj->$key = $styleObjDecoded->$key; } } $styleObjDecoded = $newStyleObj; if (empty($styleObjDecoded->custom_style) && !empty($styleObjDecoded->preset)) { $styleObjDecoded = json_decode($styleObjDecoded->preset); } $colorValues = []; foreach ($styleObjDecoded as $key => $value) { if (is_string($value) && !empty($value)) { array_push($colorValues, [ 'path' => [$colorPrefix . '-' . str_replace('_', '-', strtolower ($key)), ''], 'value' => $value, 'isTemplateColor' => true, ]); } } return json_encode($colorValues); } catch (\Exception $e) { return "{}"; } } /** * Remove the Joomla! default template styles for the editor view. * * @return void * @since 4.1.0 */ public function onBeforeCompileHead() { /** @var CMSApplication */ $app = Factory::getApplication(); $input = $app->input; $option = $input->get('option'); $view = $input->get('view', 'editor'); $version = new Version(); $JoomlaVersion = (float) $version->getShortVersion(); $doc = $app->getDocument(); $params = ComponentHelper::getParams('com_sppagebuilder'); $colorVariables = $params->get('sppb_color_variables', []); $configuredDefaultColorMode = $params->get('sppb_default_color_mode', ''); $defaultColorMode = ''; $themeColors = json_decode($this->getDefaultThemeColors()); $themeColorVariables = []; $modes = []; if(!empty($themeColors)) { foreach($themeColors as $themeColor) { $variableName = '--' . $themeColor->path[0]; $colorValue = $themeColor->value; array_push($themeColorVariables, $variableName . ": " . $colorValue); } $themeColorVariableString = ':root {'. implode("; ", $themeColorVariables) . '}'; $doc->addStyleDeclaration($themeColorVariableString); } if(!empty($colorVariables)) { if(count($colorVariables) > 0) { foreach($colorVariables as $colorVariable) { $path = $colorVariable->path; $mode = $path[1]; array_push($modes, $mode); } $modes = array_unique($modes); $defaultColorMode = $modes[0]; } } $resolvedDefaultColorMode = $defaultColorMode; if (!empty($configuredDefaultColorMode) && in_array($configuredDefaultColorMode, $modes, true)) { $resolvedDefaultColorMode = $configuredDefaultColorMode; } $isEnabledColoSwitcher = $params->get('show_color_switcher', 0); if ($app->isClient('site')) { $cookie = $app->input->cookie->get('sppb_user_timezone', null, 'STRING'); if(!$cookie){ $timeZoneCookie = <<<JS (function () { try { var SPPB_TIME_ZONE = Intl.DateTimeFormat().resolvedOptions().timeZone; if (!SPPB_TIME_ZONE){ return; } document.cookie = 'sppb_user_timezone=' + encodeURIComponent(SPPB_TIME_ZONE) + '; path=/' + '; max-age=43200'; // 12 hours } catch (e) {} })(); JS; $doc->addScriptDeclaration($timeZoneCookie); } } $doc->addScriptDeclaration(' const initColorMode = () => { const colorVariableData = []; const sppbColorVariablePrefix = "--sppb"; let activeColorMode = localStorage.getItem("sppbActiveColorMode") || "' . $resolvedDefaultColorMode . '"; ' . (!$isEnabledColoSwitcher ? ('activeColorMode = "' . $resolvedDefaultColorMode . '"') : '') . '; const modes = ' . json_encode($modes) . '; if(!modes?.includes(activeColorMode)) { activeColorMode = "' . $resolvedDefaultColorMode . '"; localStorage.setItem("sppbActiveColorMode", activeColorMode); } document?.body?.setAttribute("data-sppb-color-mode", activeColorMode); if (!localStorage.getItem("sppbActiveColorMode")) { localStorage.setItem("sppbActiveColorMode", activeColorMode); } if (window.sppbColorVariables) { const colorVariables = typeof(window.sppbColorVariables) === "string" ? JSON.parse(window.sppbColorVariables) : window.sppbColorVariables; for (const colorVariable of colorVariables) { const { path, value } = colorVariable; const variable = String(path[0]).trim().toLowerCase().replaceAll(" ", "-"); const mode = path[1]; const variableName = `${sppbColorVariablePrefix}-${variable}`; if (activeColorMode === mode) { colorVariableData.push(`${variableName}: ${value}`); } } document.documentElement.style.cssText += colorVariableData.join(";"); } }; window.sppbColorVariables = ' . json_encode($colorVariables) . '; initColorMode(); document.addEventListener("DOMContentLoaded", initColorMode); '); if($app->isClient('site') && $view !== 'form' && $isEnabledColoSwitcher) { SppagebuilderHelper::addScript('color-switcher.js', ''); SppagebuilderHelper::addStylesheet('color-switcher.css', ''); } if ($app->isClient('administrator') && $option === 'com_sppagebuilder' && $view === 'editor') { if ($JoomlaVersion < 4) { $headData = Factory::getDocument()->getHeadData(); $stylesheets = $headData['styleSheets']; foreach ($stylesheets as $url => $value) { if (stripos($url, 'template.css') !== false) { unset($stylesheets[$url]); } } $headData['styleSheets'] = $stylesheets; Factory::getDocument()->setHeadData($headData); } else { $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->disablePreset('template.atum.ltr'); $wa->disablePreset('template.atum.rtl'); $wa->disableStyle('template.atum.ltr'); $wa->disableStyle('template.atum.rtl'); $wa->disableStyle('template.active.language'); $wa->disableStyle('template.user'); } } } /** * Enforce the application to use tmpl=component if there is not. * * @return void * @since 4.1.0 */ public function onAfterDispatch() { $app = Factory::getApplication(); $input = $app->input; $option = $input->get('option'); $view = $input->get('view', 'editor'); $tmpl = $input->get('tmpl'); if ($app->isClient('administrator') && $option === 'com_sppagebuilder' && $view === 'editor') { if ($tmpl !== 'component') { $input->set('tmpl', 'component'); } } } private static function loadPageBuilderSiteLanguage() { $lang = Factory::getLanguage(); $lang->load('com_sppagebuilder', JPATH_SITE, 'en-GB', true); $lang->load('com_sppagebuilder', JPATH_SITE, null, true); } private static function loadPageBuilderLanguage() { $lang = Factory::getLanguage(); $lang->load('com_sppagebuilder', JPATH_ADMINISTRATOR, $lang->getName(), true); $lang->load('tpl_' . self::getTemplate(), JPATH_SITE, $lang->getName(), true); require_once JPATH_ROOT . '/administrator/components/com_sppagebuilder/helpers/language.php'; } private static function getPageContent($extension = 'com_content', $extension_view = 'article', $view_id = 0) { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName(array('id', 'text', 'content', 'active', 'language', 'version'))); $query->from($db->quoteName('#__sppagebuilder')); $query->where($db->quoteName('extension') . ' = ' . $db->quote($extension)); $query->where($db->quoteName('extension_view') . ' = ' . $db->quote($extension_view)); $query->where($db->quoteName('view_id') . ' = ' . $view_id); $db->setQuery($query); $result = $db->loadObject(); if ($result) { return $result; } return false; } private static function getIntegration() { $app = Factory::getApplication(); $option = $app->input->get('option', '', 'STRING'); $group = str_replace('com_', '', $option); $integrations = BuilderIntegrationHelper::getIntegrations(); if (!isset($integrations[$group])) { return false; } $integration = $integrations[$group]; $name = $integration['name']; $enabled = PluginHelper::isEnabled($group, $name); if ($enabled) { return $integration; } return false; } private static function getTemplate() { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName(array('template'))); $query->from($db->quoteName('#__template_styles')); $query->where($db->quoteName('client_id') . ' = ' . $db->quote(0)); $query->where($db->quoteName('home') . ' = ' . $db->quote(1)); $db->setQuery($query); return $db->loadResult(); } public function onExtensionAfterSave($option, $data) { if (($option === 'com_config.component') && ($data->element === 'com_sppagebuilder')) { $admin_cache = JPATH_ROOT . '/administrator/cache/sppagebuilder'; if (\file_exists($admin_cache)) { Folder::delete($admin_cache); } $site_cache = JPATH_ROOT . '/cache/sppagebuilder'; if (\file_exists($site_cache)) { Folder::delete($site_cache); } } } /** * onTableAfterLoad * This joomla event function is called during the initial phase of duplication * It is used to capture the data related to the module which needs to be duplicated * (function is run for every module in the list, but goes down the list from the initial order of the module in point, so the first time the function is called it always provides with the data of the module which is supposed to be duplicated) * The function doesnt run for other irrelevant modules and returns if moduleData is already present, which happens when the function runs for the first time * Using the information from the event, the page builder content is extracted from the module and stored in moduleData * @param AfterLoadeEvent $event, the event provides us with the data of the modules * @return void * @since 5.4 */ public function onTableAfterLoad(AfterLoadEvent $event) { if(!empty($this->moduleData)) { return; } $app = Factory::getApplication(); $input = $app->input; $option = $input->get('option'); $view = $input->get('view', 'editor'); $task = $input->get('task'); if($app->isClient('administrator') && $option === 'com_modules' && $view === 'modules' && $task == 'duplicate') { $module = $event['subject']; if($module instanceof Joomla\CMS\Table\Module) { $id = $module->id; if($id) { $db = Factory::getDbo(); $query = $db->getQuery(); $query->clear(); $query->select('*')->from($db->quoteName('#__sppagebuilder'))->where($db->quoteName('view_id') . '=' . $id); $db->setQuery($query); $result = $db->loadObject(); if(!empty($result)) { $status = $result->published; if($status === -2) { return; } $this->moduleData = $result; } } } } } /** * onTableAfterStore * This joomla event function is called after a module has been duplicated * It is used to update the duplicated module with the page builder content data of the original module it was duplicated from * The content data is from the duplication action is stored inside the moduleContent static variable * Through the event we get the duplicated modules id by exploding the name property in the provided events subject section * A new page builder entry is created and the title is passed from the duplicated modules title and the view id is updated to be the duplicated modules id * * @param AfterStoreEvent $event, the event provides us with the newly duplicated modules id * @return void * @since 5.4 */ public function onTableAfterStore(AfterStoreEvent $event) { $app = Factory::getApplication(); $input = $app->input; $option = $input->get('option'); $view = $input->get('view', 'editor'); $task = $input->get('task'); if($app->isClient('administrator') && $option === 'com_modules' && $view === 'modules' && $task == 'duplicate') { $module = $event['subject']; if($module instanceof Joomla\CMS\Table\Asset) { $moduleId = array_pop(explode('.', $module->name)); $moduleContent = $this->moduleData->content ?? $this->moduleData->text ?? '[]'; $moduleContentParsed = json_decode($moduleContent); foreach($moduleContentParsed as $section) { if(isset($section->id) && !empty($section->id)) { $section->id = $this->uuid(); } } $moduleContent = json_encode($moduleContentParsed); $user = Factory::getUser(); $dateTime = Factory::getDate()->toSql(); $values = [ 'title' => $module->title, 'text' => '', 'content' => $moduleContent, 'option' => 'mod_sppagebuilder', 'view' => 'module', 'id' => $moduleId, 'active' => 0, 'published' => 1, 'catid' => 0, 'created_on' => $dateTime, 'created_by' => $user->id, 'modified' => $dateTime, 'modified_by' => $user->id, 'access' => $this->moduleData->access, 'language' => '*', 'action' => 'apply', 'version' => SppagebuilderHelper::getVersion() ]; SppagebuilderHelper::onAfterSavingModule($values); } } } private function uuid() { return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, // Version 4 UUID mt_rand(0, 0x3fff) | 0x8000, // Variant mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); } public function onPreprocessMenuItems($context, &$items) { if (version_compare(JVERSION, '4.0.0', '<')) { return; } if (!Factory::getApplication()->isClient('administrator')) { return; } if ($context !== 'com_menus.administrator.module') { return; } static $isMenuItemAlreadyAdded = false; if ($isMenuItemAlreadyAdded) { return; } $isMenuItemAlreadyAdded = true; self::loadPageBuilderLanguage(); $newItem = new AdministratorMenuItem([ 'id' => 'custom-reports', 'title' => Text::_('COM_SPPAGEBUILDER_COMMENT_TITLE'), 'link' => 'index.php?option=com_sppagebuilder&view=comments', 'access' => 1, 'icon' => 'fas fa-comment', 'class' => 'menu-item-icon icon-comment', ]); foreach ($items as $item) { if ($item->title === 'COM_CONTENT_MENUS' && $item->hasChildren()) { $item->addChild($newItem); break; } } } } PKAA#]���:&system/sppagebuilder/assets/js/init.jsnu�[���jQuery(document).ready(function ($) { if (spPagebuilderEnabled) { $(spIntergationElement).hide(); $(".builder-integration-component").show(); $(".builder-integration-button-editor").addClass("is-active"); } else { $(".builder-integration-component").hide(); $(spIntergationElement).show(); $(".builder-integration-button-joomla").addClass("is-active"); } $("[action-switch-builder]").on("click", function (event) { event.preventDefault(); $("[action-switch-builder]").removeClass("is-active"); $(this).addClass("is-active"); var action = $(this).data("action"); // get shared parent container var $container = $(this).parent(".sp-pagebuilder-btn-group").parent(); if (action === "editor") { $(".builder-integration-component").hide(); $(spIntergationElement).show(); $("#jform_attribs_sppagebuilder_active").val("0"); if (typeof WFEditor !== "undefined") { $(".wf-editor", $container).each(function () { var value = this.nodeName === "TEXTAREA" ? this.value : this.innerHTML; // pass content from textarea to editor Joomla.editors.instances[this.id].setValue(value); // show editor and tabs $(this).parent(".wf-editor-container").show(); }); } } else { if (typeof WFEditor !== "undefined") { $(".wf-editor", $container).each(function () { // pass content to textarea Joomla.editors.instances[this.id].getValue(); // hide editor and tabs $(this).parent(".wf-editor-container").hide(); }); } $(spIntergationElement).hide(); $(".builder-integration-component").show(); $("#jform_attribs_sppagebuilder_active").val("1"); } }); }); PKAA#]�sJ^aa6system/privacyconsent/src/Extension/PrivacyConsent.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.privacyconsent * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\PrivacyConsent\Extension; use Joomla\CMS\Application\ApplicationHelper; use Joomla\CMS\Cache\Cache; use Joomla\CMS\Factory; use Joomla\CMS\Form\Form; use Joomla\CMS\Form\FormHelper; use Joomla\CMS\Language\Associations; use Joomla\CMS\Language\Text; use Joomla\CMS\Mail\Exception\MailDisabledException; use Joomla\CMS\Mail\MailTemplate; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\User\UserHelper; use Joomla\Component\Actionlogs\Administrator\Model\ActionlogModel; use Joomla\Component\Messages\Administrator\Model\MessageModel; use Joomla\Database\DatabaseAwareTrait; use Joomla\Database\Exception\ExecutionFailureException; use Joomla\Database\ParameterType; use Joomla\Utilities\ArrayHelper; use PHPMailer\PHPMailer\Exception as phpmailerException; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * An example custom privacyconsent plugin. * * @since 3.9.0 */ final class PrivacyConsent extends CMSPlugin { use DatabaseAwareTrait; /** * Load the language file on instantiation. * * @var boolean * @since 3.9.0 */ protected $autoloadLanguage = true; /** * Adds additional fields to the user editing form * * @param Form $form The form to be altered. * @param mixed $data The associated data for the form. * * @return boolean * * @since 3.9.0 */ public function onContentPrepareForm(Form $form, $data) { // Check we are manipulating a valid form - we only display this on user registration form and user profile form. $name = $form->getName(); if (!in_array($name, ['com_users.profile', 'com_users.registration'])) { return true; } // We only display this if user has not consented before if (is_object($data)) { $userId = $data->id ?? 0; if ($userId > 0 && $this->isUserConsented($userId)) { return true; } } // Add the privacy policy fields to the form. FormHelper::addFieldPrefix('Joomla\\Plugin\\System\\PrivacyConsent\\Field'); FormHelper::addFormPath(JPATH_PLUGINS . '/' . $this->_type . '/' . $this->_name . '/forms'); $form->loadFile('privacyconsent'); $privacyType = $this->params->get('privacy_type', 'article'); $privacyId = ($privacyType == 'menu_item') ? $this->getPrivacyItemId() : $this->getPrivacyArticleId(); $privacynote = $this->params->get('privacy_note'); // Push the privacy article ID into the privacy field. $form->setFieldAttribute('privacy', $privacyType, $privacyId, 'privacyconsent'); $form->setFieldAttribute('privacy', 'note', $privacynote, 'privacyconsent'); } /** * Method is called before user data is stored in the database * * @param array $user Holds the old user data. * @param boolean $isNew True if a new user is stored. * @param array $data Holds the new user data. * * @return boolean * * @since 3.9.0 * @throws \InvalidArgumentException on missing required data. */ public function onUserBeforeSave($user, $isNew, $data) { // // Only check for front-end user creation/update profile if ($this->getApplication()->isClient('administrator')) { return true; } $userId = ArrayHelper::getValue($user, 'id', 0, 'int'); // User already consented before, no need to check it further if ($userId > 0 && $this->isUserConsented($userId)) { return true; } // Check that the privacy is checked if required ie only in registration from frontend. $input = $this->getApplication()->getInput(); $option = $input->get('option'); $task = $input->post->get('task'); $form = $input->post->get('jform', [], 'array'); if ( $option == 'com_users' && in_array($task, ['registration.register', 'profile.save']) && empty($form['privacyconsent']['privacy']) ) { throw new \InvalidArgumentException($this->getApplication()->getLanguage()->_('PLG_SYSTEM_PRIVACYCONSENT_FIELD_ERROR')); } return true; } /** * Saves user privacy confirmation * * @param array $data entered user data * @param boolean $isNew true if this is a new user * @param boolean $result true if saving the user worked * @param string $error error message * * @return void * * @since 3.9.0 */ public function onUserAfterSave($data, $isNew, $result, $error): void { // Only create an entry on front-end user creation/update profile if ($this->getApplication()->isClient('administrator')) { return; } // Get the user's ID $userId = ArrayHelper::getValue($data, 'id', 0, 'int'); // If user already consented before, no need to check it further if ($userId > 0 && $this->isUserConsented($userId)) { return; } $input = $this->getApplication()->getInput(); $option = $input->get('option'); $task = $input->post->get('task'); $form = $input->post->get('jform', [], 'array'); if ( $option == 'com_users' && in_array($task, ['registration.register', 'profile.save']) && !empty($form['privacyconsent']['privacy']) ) { $userId = ArrayHelper::getValue($data, 'id', 0, 'int'); // Get the user's IP address $ip = $input->server->get('REMOTE_ADDR', '', 'string'); // Get the user agent string $userAgent = $input->server->get('HTTP_USER_AGENT', '', 'string'); // Create the user note $userNote = (object) [ 'user_id' => $userId, 'subject' => 'PLG_SYSTEM_PRIVACYCONSENT_SUBJECT', 'body' => Text::sprintf('PLG_SYSTEM_PRIVACYCONSENT_BODY', $ip, $userAgent), 'created' => Factory::getDate()->toSql(), ]; try { $this->getDatabase()->insertObject('#__privacy_consents', $userNote); } catch (\Exception $e) { // Do nothing if the save fails } $userId = ArrayHelper::getValue($data, 'id', 0, 'int'); $message = [ 'action' => 'consent', 'id' => $userId, 'title' => $data['name'], 'itemlink' => 'index.php?option=com_users&task=user.edit&id=' . $userId, 'userid' => $userId, 'username' => $data['username'], 'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $userId, ]; /** @var ActionlogModel $model */ $model = $this->getApplication()->bootComponent('com_actionlogs')->getMVCFactory()->createModel('Actionlog', 'Administrator'); $model->addLog([$message], 'PLG_SYSTEM_PRIVACYCONSENT_CONSENT', 'plg_system_privacyconsent', $userId); } } /** * Remove all user privacy consent information for the given user ID * * Method is called after user data is deleted from the database * * @param array $user Holds the user data * @param boolean $success True if user was successfully stored in the database * @param string $msg Message * * @return void * * @since 3.9.0 */ public function onUserAfterDelete($user, $success, $msg): void { if (!$success) { return; } $userId = ArrayHelper::getValue($user, 'id', 0, 'int'); if ($userId) { // Remove user's consent $query = $this->getDatabase()->getQuery(true) ->delete($this->getDatabase()->quoteName('#__privacy_consents')) ->where($this->getDatabase()->quoteName('user_id') . ' = :userid') ->bind(':userid', $userId, ParameterType::INTEGER); $this->getDatabase()->setQuery($query); $this->getDatabase()->execute(); } } /** * If logged in users haven't agreed to privacy consent, redirect them to profile edit page, ask them to agree to * privacy consent before allowing access to any other pages * * @return void * * @since 3.9.0 */ public function onAfterRoute() { // Run this in frontend only if (!$this->getApplication()->isClient('site')) { return; } $userId = $this->getApplication()->getIdentity()->id; // Check to see whether user already consented, if not, redirect to user profile page if ($userId > 0) { // If user consented before, no need to check it further if ($this->isUserConsented($userId)) { return; } $input = $this->getApplication()->getInput(); $option = $input->getCmd('option'); $task = $input->get('task', ''); $view = $input->getString('view', ''); $layout = $input->getString('layout', ''); $id = $input->getInt('id'); $privacyArticleId = $this->getPrivacyArticleId(); /* * If user is already on edit profile screen or view privacy article * or press update/apply button, or logout, do nothing to avoid infinite redirect */ $allowedUserTasks = [ 'profile.save', 'profile.apply', 'user.logout', 'user.menulogout', 'method', 'methods', 'captive', 'callback', ]; $isAllowedUserTask = in_array($task, $allowedUserTasks) || substr($task, 0, 8) === 'captive.' || substr($task, 0, 8) === 'methods.' || substr($task, 0, 7) === 'method.' || substr($task, 0, 9) === 'callback.'; if ( ($option == 'com_users' && $isAllowedUserTask) || ($option == 'com_content' && $view == 'article' && $id == $privacyArticleId) || ($option == 'com_users' && $view == 'profile' && $layout == 'edit') ) { return; } // Redirect to com_users profile edit $this->getApplication()->enqueueMessage($this->getRedirectMessage(), 'notice'); $link = 'index.php?option=com_users&view=profile&layout=edit'; $this->getApplication()->redirect(Route::_($link, false)); } } /** * Event to specify whether a privacy policy has been published. * * @param array &$policy The privacy policy status data, passed by reference, with keys "published", "editLink" and "articlePublished". * * @return void * * @since 3.9.0 */ public function onPrivacyCheckPrivacyPolicyPublished(&$policy) { // If another plugin has already indicated a policy is published, we won't change anything here if ($policy['published']) { return; } $articleId = (int) $this->params->get('privacy_article'); if (!$articleId) { return; } // Check if the article exists in database and is published $query = $this->getDatabase()->getQuery(true) ->select($this->getDatabase()->quoteName(['id', 'state'])) ->from($this->getDatabase()->quoteName('#__content')) ->where($this->getDatabase()->quoteName('id') . ' = :id') ->bind(':id', $articleId, ParameterType::INTEGER); $this->getDatabase()->setQuery($query); $article = $this->getDatabase()->loadObject(); // Check if the article exists if (!$article) { return; } // Check if the article is published if ($article->state == 1) { $policy['articlePublished'] = true; } $policy['published'] = true; $policy['editLink'] = Route::_('index.php?option=com_content&task=article.edit&id=' . $articleId); } /** * Returns the configured redirect message and falls back to the default version. * * @return string redirect message * * @since 3.9.0 */ private function getRedirectMessage() { $messageOnRedirect = trim($this->params->get('messageOnRedirect', '')); if (empty($messageOnRedirect)) { return $this->getApplication()->getLanguage()->_('PLG_SYSTEM_PRIVACYCONSENT_REDIRECT_MESSAGE_DEFAULT'); } return $messageOnRedirect; } /** * Method to check if the given user has consented yet * * @param integer $userId ID of uer to check * * @return boolean * * @since 3.9.0 */ private function isUserConsented($userId) { $userId = (int) $userId; $db = $this->getDatabase(); $query = $db->getQuery(true); $query->select('COUNT(*)') ->from($db->quoteName('#__privacy_consents')) ->where($db->quoteName('user_id') . ' = :userid') ->where($db->quoteName('subject') . ' = ' . $db->quote('PLG_SYSTEM_PRIVACYCONSENT_SUBJECT')) ->where($db->quoteName('state') . ' = 1') ->bind(':userid', $userId, ParameterType::INTEGER); $db->setQuery($query); return (int) $db->loadResult() > 0; } /** * Get privacy article ID. If the site is a multilingual website and there is associated article for the * current language, ID of the associated article will be returned * * @return integer * * @since 3.9.0 */ private function getPrivacyArticleId() { $privacyArticleId = $this->params->get('privacy_article'); if ($privacyArticleId > 0 && Associations::isEnabled()) { $privacyAssociated = Associations::getAssociations('com_content', '#__content', 'com_content.item', $privacyArticleId); $currentLang = $this->getApplication()->getLanguage()->getTag(); if (isset($privacyAssociated[$currentLang])) { $privacyArticleId = $privacyAssociated[$currentLang]->id; } } return $privacyArticleId; } /** * Get privacy menu item ID. If the site is a multilingual website and there is associated menu item for the * current language, ID of the associated menu item will be returned. * * @return integer * * @since 4.0.0 */ private function getPrivacyItemId() { $itemId = $this->params->get('privacy_menu_item'); if ($itemId > 0 && Associations::isEnabled()) { $privacyAssociated = Associations::getAssociations('com_menus', '#__menu', 'com_menus.item', $itemId, 'id', '', ''); $currentLang = $this->getApplication()->getLanguage()->getTag(); if (isset($privacyAssociated[$currentLang])) { $itemId = $privacyAssociated[$currentLang]->id; } } return $itemId; } /** * The privacy consent expiration check code is triggered after the page has fully rendered. * * @return void * * @since 3.9.0 */ public function onAfterRender() { if (!$this->params->get('enabled', 0)) { return; } $cacheTimeout = (int) $this->params->get('cachetimeout', 30); $cacheTimeout = 24 * 3600 * $cacheTimeout; // Do we need to run? Compare the last run timestamp stored in the plugin's options with the current // timestamp. If the difference is greater than the cache timeout we shall not execute again. $now = time(); $last = (int) $this->params->get('lastrun', 0); if ((abs($now - $last) < $cacheTimeout)) { return; } // Update last run status $this->params->set('lastrun', $now); $paramsJson = $this->params->toString('JSON'); $db = $this->getDatabase(); $query = $db->getQuery(true) ->update($db->quoteName('#__extensions')) ->set($db->quoteName('params') . ' = :params') ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) ->where($db->quoteName('folder') . ' = ' . $db->quote('system')) ->where($db->quoteName('element') . ' = ' . $db->quote('privacyconsent')) ->bind(':params', $paramsJson); try { // Lock the tables to prevent multiple plugin executions causing a race condition $db->lockTable('#__extensions'); } catch (\Exception $e) { // If we can't lock the tables it's too risky to continue execution return; } try { // Update the plugin parameters $result = $db->setQuery($query)->execute(); $this->clearCacheGroups(['com_plugins'], [0, 1]); } catch (\Exception $exc) { // If we failed to execute $db->unlockTables(); $result = false; } try { // Unlock the tables after writing $db->unlockTables(); } catch (\Exception $e) { // If we can't lock the tables assume we have somehow failed $result = false; } // Stop on failure if (!$result) { return; } // Delete the expired privacy consents $this->invalidateExpiredConsents(); // Remind for privacy consents near to expire $this->remindExpiringConsents(); } /** * Method to send the remind for privacy consents renew * * @return integer * * @since 3.9.0 */ private function remindExpiringConsents() { // Load the parameters. $expire = (int) $this->params->get('consentexpiration', 365); $remind = (int) $this->params->get('remind', 30); $now = Factory::getDate()->toSql(); $period = '-' . ($expire - $remind); $db = $this->getDatabase(); $query = $db->getQuery(true); $query->select($db->quoteName(['r.id', 'r.user_id', 'u.email'])) ->from($db->quoteName('#__privacy_consents', 'r')) ->join('LEFT', $db->quoteName('#__users', 'u'), $db->quoteName('u.id') . ' = ' . $db->quoteName('r.user_id')) ->where($db->quoteName('subject') . ' = ' . $db->quote('PLG_SYSTEM_PRIVACYCONSENT_SUBJECT')) ->where($db->quoteName('remind') . ' = 0') ->where($query->dateAdd($db->quote($now), $period, 'DAY') . ' > ' . $db->quoteName('created')); try { $users = $db->setQuery($query)->loadObjectList(); } catch (ExecutionFailureException $exception) { return false; } $app = $this->getApplication(); $linkMode = $app->get('force_ssl', 0) == 2 ? Route::TLS_FORCE : Route::TLS_IGNORE; foreach ($users as $user) { $token = ApplicationHelper::getHash(UserHelper::genRandomPassword()); $hashedToken = UserHelper::hashPassword($token); // The mail try { $templateData = [ 'sitename' => $app->get('sitename'), 'url' => Uri::root(), 'tokenurl' => Route::link('site', 'index.php?option=com_privacy&view=remind&remind_token=' . $token, false, $linkMode, true), 'formurl' => Route::link('site', 'index.php?option=com_privacy&view=remind', false, $linkMode, true), 'token' => $token, ]; $mailer = new MailTemplate('plg_system_privacyconsent.request.reminder', $app->getLanguage()->getTag()); $mailer->addTemplateData($templateData); $mailer->addRecipient($user->email); $mailResult = $mailer->send(); if ($mailResult === false) { return false; } $userId = (int) $user->id; // Update the privacy_consents item to not send the reminder again $query->clear() ->update($db->quoteName('#__privacy_consents')) ->set($db->quoteName('remind') . ' = 1') ->set($db->quoteName('token') . ' = :token') ->where($db->quoteName('id') . ' = :userid') ->bind(':token', $hashedToken) ->bind(':userid', $userId, ParameterType::INTEGER); $db->setQuery($query); try { $db->execute(); } catch (\RuntimeException $e) { return false; } } catch (MailDisabledException | phpmailerException $exception) { return false; } } } /** * Method to delete the expired privacy consents * * @return boolean * * @since 3.9.0 */ private function invalidateExpiredConsents() { // Load the parameters. $expire = (int) $this->params->get('consentexpiration', 365); $now = Factory::getDate()->toSql(); $period = '-' . $expire; $db = $this->getDatabase(); $query = $db->getQuery(true); $query->select($db->quoteName(['id', 'user_id'])) ->from($db->quoteName('#__privacy_consents')) ->where($query->dateAdd($db->quote($now), $period, 'DAY') . ' > ' . $db->quoteName('created')) ->where($db->quoteName('subject') . ' = ' . $db->quote('PLG_SYSTEM_PRIVACYCONSENT_SUBJECT')) ->where($db->quoteName('state') . ' = 1'); $db->setQuery($query); try { $users = $db->loadObjectList(); } catch (\RuntimeException $e) { return false; } // Do not process further if no expired consents found if (empty($users)) { return true; } // Push a notification to the site's super users /** @var MessageModel $messageModel */ $messageModel = $this->getApplication()->bootComponent('com_messages')->getMVCFactory()->createModel('Message', 'Administrator'); foreach ($users as $user) { $userId = (int) $user->id; $query = $db->getQuery(true) ->update($db->quoteName('#__privacy_consents')) ->set($db->quoteName('state') . ' = 0') ->where($db->quoteName('id') . ' = :userid') ->bind(':userid', $userId, ParameterType::INTEGER); $db->setQuery($query); try { $db->execute(); } catch (\RuntimeException $e) { return false; } $messageModel->notifySuperUsers( $this->getApplication()->getLanguage()->_('PLG_SYSTEM_PRIVACYCONSENT_NOTIFICATION_USER_PRIVACY_EXPIRED_SUBJECT'), Text::sprintf('PLG_SYSTEM_PRIVACYCONSENT_NOTIFICATION_USER_PRIVACY_EXPIRED_MESSAGE', Factory::getUser($user->user_id)->username) ); } return true; } /** * Clears cache groups. We use it to clear the plugins cache after we update the last run timestamp. * * @param array $clearGroups The cache groups to clean * @param array $cacheClients The cache clients (site, admin) to clean * * @return void * * @since 3.9.0 */ private function clearCacheGroups(array $clearGroups, array $cacheClients = [0, 1]) { foreach ($clearGroups as $group) { foreach ($cacheClients as $client_id) { try { $options = [ 'defaultgroup' => $group, 'cachebase' => $client_id ? JPATH_ADMINISTRATOR . '/cache' : $this->getApplication()->get('cache_path', JPATH_SITE . '/cache'), ]; $cache = Cache::getInstance('callback', $options); $cache->clean(); } catch (\Exception $e) { // Ignore it } } } } } PKAA#]��h��0system/privacyconsent/src/Field/PrivacyField.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.privacyconsent * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\PrivacyConsent\Field; use Joomla\CMS\Factory; use Joomla\CMS\Form\Field\RadioField; use Joomla\CMS\Language\Multilanguage; use Joomla\CMS\Language\Text; use Joomla\Component\Content\Site\Helper\RouteHelper; use Joomla\Database\ParameterType; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Provides input for privacy * * @since 3.9.0 */ class PrivacyField extends RadioField { /** * The form field type. * * @var string * @since 3.9.0 */ protected $type = 'privacy'; /** * Method to get the field input markup. * * @return string The field input markup. * * @since 3.9.0 */ protected function getInput() { // Display the message before the field echo $this->getRenderer('plugins.system.privacyconsent.message')->render($this->getLayoutData()); return parent::getInput(); } /** * Method to get the field label markup. * * @return string The field label markup. * * @since 3.9.0 */ protected function getLabel() { if ($this->hidden) { return ''; } return $this->getRenderer('plugins.system.privacyconsent.label')->render($this->getLayoutData()); } /** * Method to get the data to be passed to the layout for rendering. * * @return array * * @since 3.9.4 */ protected function getLayoutData() { $data = parent::getLayoutData(); $article = false; $link = false; $privacyArticle = $this->element['article'] > 0 ? (int) $this->element['article'] : 0; if ($privacyArticle && Factory::getApplication()->isClient('site')) { $db = $this->getDatabase(); $query = $db->getQuery(true) ->select($db->quoteName(['id', 'alias', 'catid', 'language'])) ->from($db->quoteName('#__content')) ->where($db->quoteName('id') . ' = :id') ->bind(':id', $privacyArticle, ParameterType::INTEGER); $db->setQuery($query); $article = $db->loadObject(); $slug = $article->alias ? ($article->id . ':' . $article->alias) : $article->id; $article->link = RouteHelper::getArticleRoute($slug, $article->catid, $article->language); $link = $article->link; } $privacyMenuItem = $this->element['menu_item'] > 0 ? (int) $this->element['menu_item'] : 0; if ($privacyMenuItem && Factory::getApplication()->isClient('site')) { $link = 'index.php?Itemid=' . $privacyMenuItem; if (Multilanguage::isEnabled()) { $db = $this->getDatabase(); $query = $db->getQuery(true) ->select($db->quoteName(['id', 'language'])) ->from($db->quoteName('#__menu')) ->where($db->quoteName('id') . ' = :id') ->bind(':id', $privacyMenuItem, ParameterType::INTEGER); $db->setQuery($query); $menuItem = $db->loadObject(); $link .= '&lang=' . $menuItem->language; } } $extraData = [ 'privacynote' => !empty($this->element['note']) ? $this->element['note'] : Text::_('PLG_SYSTEM_PRIVACYCONSENT_NOTE_FIELD_DEFAULT'), 'options' => $this->getOptions(), 'value' => (string) $this->value, 'translateLabel' => $this->translateLabel, 'translateDescription' => $this->translateDescription, 'translateHint' => $this->translateHint, 'privacyArticle' => $privacyArticle, 'article' => $article, 'privacyLink' => $link, ]; return array_merge($data, $extraData); } } PKAA#]���++(system/privacyconsent/privacyconsent.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_privacyconsent</name> <author>Joomla! Project</author> <creationDate>2018-04</creationDate> <copyright>(C) 2018 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.9.0</version> <description>PLG_SYSTEM_PRIVACYCONSENT_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\PrivacyConsent</namespace> <files> <folder>forms</folder> <folder plugin="privacyconsent">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_system_privacyconsent.ini</language> <language tag="en-GB">language/en-GB/plg_system_privacyconsent.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic" addfieldprefix="Joomla\Component\Content\Administrator\Field"> <field name="privacy_note" type="textarea" label="PLG_SYSTEM_PRIVACYCONSENT_NOTE_FIELD_LABEL" description="PLG_SYSTEM_PRIVACYCONSENT_NOTE_FIELD_DESC" hint="PLG_SYSTEM_PRIVACYCONSENT_NOTE_FIELD_DEFAULT" rows="7" cols="20" filter="html" /> <field name="privacy_type" type="list" label="PLG_SYSTEM_PRIVACYCONSENT_FIELD_TYPE_LABEL" default="article" validate="options" > <option value="article">PLG_SYSTEM_PRIVACYCONSENT_FIELD_TYPE_ARTICLE</option> <option value="menu_item">PLG_SYSTEM_PRIVACYCONSENT_FIELD_TYPE_MENU_ITEM</option> </field> <field name="privacy_article" type="modal_article" label="PLG_SYSTEM_PRIVACYCONSENT_FIELD_ARTICLE_LABEL" description="PLG_SYSTEM_PRIVACYCONSENT_FIELD_ARTICLE_DESC" select="true" new="true" edit="true" clear="true" filter="integer" showon="privacy_type:article" /> <field addfieldprefix="Joomla\Component\Menus\Administrator\Field" name="privacy_menu_item" type="modal_menu" label="PLG_SYSTEM_PRIVACYCONSENT_FIELD_MENU_ITEM_LABEL" select="true" new="true" edit="true" clear="true" filter="integer" showon="privacy_type:menu_item" /> <field name="messageOnRedirect" type="textarea" label="PLG_SYSTEM_PRIVACYCONSENT_REDIRECT_MESSAGE_LABEL" description="PLG_SYSTEM_PRIVACYCONSENT_REDIRECT_MESSAGE_DESC" hint="PLG_SYSTEM_PRIVACYCONSENT_REDIRECT_MESSAGE_DEFAULT" class="span12" rows="7" cols="20" filter="html" /> </fieldset> <fieldset name="expiration" label="PLG_SYSTEM_PRIVACYCONSENT_EXPIRATION_FIELDSET_LABEL" > <field name="enabled" type="radio" label="PLG_SYSTEM_PRIVACYCONSENT_FIELD_ENABLED_LABEL" description="PLG_SYSTEM_PRIVACYCONSENT_FIELD_ENABLED_DESC" layout="joomla.form.field.radio.switcher" default="0" filter="integer" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="cachetimeout" type="integer" label="PLG_SYSTEM_PRIVACYCONSENT_CACHETIMEOUT_LABEL" description="PLG_SYSTEM_PRIVACYCONSENT_CACHETIMEOUT_DESC" first="0" last="120" step="1" default="30" filter="int" validate="number" /> <field name="consentexpiration" type="integer" label="PLG_SYSTEM_PRIVACYCONSENT_CONSENTEXPIRATION_LABEL" description="PLG_SYSTEM_PRIVACYCONSENT_CONSENTEXPIRATION_DESC" first="180" last="720" step="30" default="360" filter="int" validate="number" /> <field name="remind" type="integer" label="PLG_SYSTEM_PRIVACYCONSENT_REMINDBEFORE_LABEL" description="PLG_SYSTEM_PRIVACYCONSENT_REMINDBEFORE_DESC" first="0" last="120" step="1" default="30" filter="int" validate="number" /> <field name="lastrun" type="hidden" default="0" filter="integer" /> </fieldset> </fields> </config> </extension> PKAA#]`�%!.system/privacyconsent/forms/privacyconsent.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <form> <fields name="privacyconsent"> <fieldset name="privacyconsent" label="PLG_SYSTEM_PRIVACYCONSENT_LABEL" > <field name="privacy" type="privacy" label="PLG_SYSTEM_PRIVACYCONSENT_FIELD_LABEL" default="0" filter="integer" required="true" > <option value="1">PLG_SYSTEM_PRIVACYCONSENT_OPTION_AGREE</option> <option value="0">PLG_SYSTEM_PRIVACYCONSENT_OPTION_DO_NOT_AGREE</option> </field> </fieldset> </fields> </form> PKAA#]й����+system/privacyconsent/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.privacyconsent * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\PrivacyConsent\Extension\PrivacyConsent; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { $dispatcher = $container->get(DispatcherInterface::class); $plugin = new PrivacyConsent( $dispatcher, (array) PluginHelper::getPlugin('system', 'privacyconsent') ); $plugin->setApplication(Factory::getApplication()); $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } }; PKBA#]0�BB+system/helixultimate/core/helixultimate.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die('Restricted Access'); use HelixUltimate\Framework\Core\HelixUltimate as BaseHelixUltimate; use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Log\Log; /** * Extends the Helix Ultimate for legacy support. * * @since 2.0.0 * @deprecated 3.0 Instead of using HelixUltimate from helixultimate/core/helixultimate.php * Use from HelixUltimate\Framework\Core\HelixUltimate namespace. */ class HelixUltimate extends BaseHelixUltimate { /** * Constructor function for the legacy helixultimate. * * @since 2.0.0 */ public function __construct() { Log::add( sprintf('/plugins/system/helixultimate/core/%s is deprecated. Use from the namespace HelixUltimate\Framework\Core\HelixUltimate instead.', __CLASS__), Log::WARNING, 'deprecated' ); parent::__construct(); Helper::flushSettingsDataToJs(); } }PKBA#]?K���8�8'system/helixultimate/core/lib/icons.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Core\Lib; defined('_JEXEC') or die('restricted aceess'); /** * Class for font-awesome icons. * * @since 2.0.0 */ class FontawesomeIcons { /** * Font awesome icon class names. * * @var array Font-awesome class names. * @since 2.0.0 */ private $fa_class_lists = array( 'fa-500px', 'fa-adjust', 'fa-adn', 'fa-align-center', 'fa-align-justify', 'fa-align-left', 'fa-align-right', 'fa-amazon', 'fa-ambulance', 'fa-anchor', 'fa-android', 'fa-angellist', 'fa-angle-double-down', 'fa-angle-double-left', 'fa-angle-double-right', 'fa-angle-double-up', 'fa-angle-down', 'fa-angle-left', 'fa-angle-right', 'fa-angle-up', 'fa-apple', 'fa-archive', 'fa-area-chart', 'fa-arrow-circle-down', 'fa-arrow-circle-left', 'fa-arrow-circle-o-down', 'fa-arrow-circle-o-left', 'fa-arrow-circle-o-right', 'fa-arrow-circle-o-up', 'fa-arrow-circle-right', 'fa-arrow-circle-up', 'fa-arrow-down', 'fa-arrow-left', 'fa-arrow-right', 'fa-arrow-up', 'fa-arrows', 'fa-arrows-alt', 'fa-arrows-h', 'fa-arrows-v', 'fa-asterisk', 'fa-at', 'fa-automobile', 'fa-backward', 'fa-balance-scale', 'fa-ban', 'fa-bank', 'fa-bar-chart', 'fa-bar-chart-o', 'fa-barcode', 'fa-bars', 'fa-battery-0', 'fa-battery-1', 'fa-battery-2', 'fa-battery-3', 'fa-battery-4', 'fa-battery-empty', 'fa-battery-full', 'fa-battery-half', 'fa-battery-quarter', 'fa-battery-three-quarters', 'fa-bed', 'fa-beer', 'fa-behance', 'fa-behance-square', 'fa-bell', 'fa-bell-o', 'fa-bell-slash', 'fa-bell-slash-o', 'fa-bicycle', 'fa-binoculars', 'fa-birthday-cake', 'fa-bitbucket', 'fa-bitbucket-square', 'fa-bitcoin', 'fa-black-tie', 'fa-bluetooth', 'fa-bluetooth-b', 'fa-bold', 'fa-bolt', 'fa-bomb', 'fa-book', 'fa-bookmark', 'fa-bookmark-o', 'fa-briefcase', 'fa-btc', 'fa-bug', 'fa-building', 'fa-building-o', 'fa-bullhorn', 'fa-bullseye', 'fa-bus', 'fa-buysellads', 'fa-cab', 'fa-calculator', 'fa-calendar', 'fa-calendar-check-o', 'fa-calendar-minus-o', 'fa-calendar-o', 'fa-calendar-plus-o', 'fa-calendar-times-o', 'fa-camera', 'fa-camera-retro', 'fa-car', 'fa-caret-down', 'fa-caret-left', 'fa-caret-right', 'fa-caret-square-o-down', 'fa-caret-square-o-left', 'fa-caret-square-o-right', 'fa-caret-square-o-up', 'fa-caret-up', 'fa-cart-arrow-down', 'fa-cart-plus', 'fa-cc', 'fa-cc-amex', 'fa-cc-diners-club', 'fa-cc-discover', 'fa-cc-jcb', 'fa-cc-mastercard', 'fa-cc-paypal', 'fa-cc-stripe', 'fa-cc-visa', 'fa-certificate', 'fa-chain', 'fa-chain-broken', 'fa-check', 'fa-check-circle', 'fa-check-circle-o', 'fa-check-square', 'fa-check-square-o', 'fa-chevron-circle-down', 'fa-chevron-circle-left', 'fa-chevron-circle-right', 'fa-chevron-circle-up', 'fa-chevron-down', 'fa-chevron-left', 'fa-chevron-right', 'fa-chevron-up', 'fa-child', 'fa-chrome', 'fa-circle', 'fa-circle-o', 'fa-circle-o-notch', 'fa-circle-thin', 'fa-clipboard', 'fa-clock-o', 'fa-clone', 'fa-close', 'fa-cloud', 'fa-cloud-download', 'fa-cloud-upload', 'fa-cny', 'fa-code', 'fa-code-fork', 'fa-codepen', 'fa-codiepie', 'fa-coffee', 'fa-cog', 'fa-cogs', 'fa-columns', 'fa-comment', 'fa-comment-o', 'fa-commenting', 'fa-commenting-o', 'fa-comments', 'fa-comments-o', 'fa-compass', 'fa-compress', 'fa-connectdevelop', 'fa-contao', 'fa-copy', 'fa-copyright', 'fa-creative-commons', 'fa-credit-card', 'fa-credit-card-alt', 'fa-crop', 'fa-crosshairs', 'fa-css3', 'fa-cube', 'fa-cubes', 'fa-cut', 'fa-cutlery', 'fa-dashboard', 'fa-dashcube', 'fa-database', 'fa-dedent', 'fa-delicious', 'fa-desktop', 'fa-deviantart', 'fa-diamond', 'fa-digg', 'fa-dollar', 'fa-dot-circle-o', 'fa-download', 'fa-dribbble', 'fa-dropbox', 'fa-drupal', 'fa-edge', 'fa-edit', 'fa-eject', 'fa-ellipsis-h', 'fa-ellipsis-v', 'fa-empire', 'fa-envelope', 'fa-envelope-o', 'fa-envelope-square', 'fa-eraser', 'fa-eur', 'fa-euro', 'fa-exchange', 'fa-exclamation', 'fa-exclamation-circle', 'fa-exclamation-triangle', 'fa-expand', 'fa-expeditedssl', 'fa-external-link', 'fa-external-link-square', 'fa-eye', 'fa-eye-slash', 'fa-eyedropper', 'fa-facebook', 'fa-facebook-f', 'fa-facebook-official', 'fa-facebook-square', 'fa-fast-backward', 'fa-fast-forward', 'fa-fax', 'fa-feed', 'fa-female', 'fa-fighter-jet', 'fa-file', 'fa-file-archive-o', 'fa-file-audio-o', 'fa-file-code-o', 'fa-file-excel-o', 'fa-file-image-o', 'fa-file-movie-o', 'fa-file-o', 'fa-file-pdf-o', 'fa-file-photo-o', 'fa-file-picture-o', 'fa-file-powerpoint-o', 'fa-file-sound-o', 'fa-file-text', 'fa-file-text-o', 'fa-file-video-o', 'fa-file-word-o', 'fa-file-zip-o', 'fa-files-o', 'fa-film', 'fa-filter', 'fa-fire', 'fa-fire-extinguisher', 'fa-firefox', 'fa-flag', 'fa-flag-checkered', 'fa-flag-o', 'fa-flash', 'fa-flask', 'fa-flickr', 'fa-floppy-o', 'fa-folder', 'fa-folder-o', 'fa-folder-open', 'fa-folder-open-o', 'fa-font', 'fa-fonticons', 'fa-fort-awesome', 'fa-forumbee', 'fa-forward', 'fa-foursquare', 'fa-frown-o', 'fa-futbol-o', 'fa-gamepad', 'fa-gavel', 'fa-gbp', 'fa-ge', 'fa-gear', 'fa-gears', 'fa-genderless', 'fa-get-pocket', 'fa-gg', 'fa-gg-circle', 'fa-gift', 'fa-git', 'fa-git-square', 'fa-github', 'fa-github-alt', 'fa-github-square', 'fa-gittip', 'fa-glass', 'fa-globe', 'fa-google', 'fa-google-plus', 'fa-google-plus-square', 'fa-google-wallet', 'fa-graduation-cap', 'fa-gratipay', 'fa-group', 'fa-h-square', 'fa-hacker-news', 'fa-hand-grab-o', 'fa-hand-lizard-o', 'fa-hand-o-down', 'fa-hand-o-left', 'fa-hand-o-right', 'fa-hand-o-up', 'fa-hand-paper-o', 'fa-hand-peace-o', 'fa-hand-pointer-o', 'fa-hand-rock-o', 'fa-hand-scissors-o', 'fa-hand-spock-o', 'fa-hand-stop-o', 'fa-hashtag', 'fa-hdd-o', 'fa-header', 'fa-headphones', 'fa-heart', 'fa-heart-o', 'fa-heartbeat', 'fa-history', 'fa-home', 'fa-hospital-o', 'fa-hotel', 'fa-hourglass', 'fa-hourglass-1', 'fa-hourglass-2', 'fa-hourglass-3', 'fa-hourglass-end', 'fa-hourglass-half', 'fa-hourglass-o', 'fa-hourglass-start', 'fa-houzz', 'fa-html5', 'fa-i-cursor', 'fa-ils', 'fa-image', 'fa-inbox', 'fa-indent', 'fa-industry', 'fa-info', 'fa-info-circle', 'fa-inr', 'fa-instagram', 'fa-institution', 'fa-internet-explorer', 'fa-intersex', 'fa-ioxhost', 'fa-italic', 'fa-joomla', 'fa-jpy', 'fa-jsfiddle', 'fa-key', 'fa-keyboard-o', 'fa-krw', 'fa-language', 'fa-laptop', 'fa-lastfm', 'fa-lastfm-square', 'fa-leaf', 'fa-leanpub', 'fa-legal', 'fa-lemon-o', 'fa-level-down', 'fa-level-up', 'fa-life-bouy', 'fa-life-buoy', 'fa-life-ring', 'fa-life-saver', 'fa-lightbulb-o', 'fa-line-chart', 'fa-link', 'fa-linkedin', 'fa-linkedin-square', 'fa-linux', 'fa-list', 'fa-list-alt', 'fa-list-ol', 'fa-list-ul', 'fa-location-arrow', 'fa-lock', 'fa-long-arrow-down', 'fa-long-arrow-left', 'fa-long-arrow-right', 'fa-long-arrow-up', 'fa-magic', 'fa-magnet', 'fa-mail-forward', 'fa-mail-reply', 'fa-mail-reply-all', 'fa-male', 'fa-map', 'fa-map-marker', 'fa-map-o', 'fa-map-pin', 'fa-map-signs', 'fa-mars', 'fa-mars-double', 'fa-mars-stroke', 'fa-mars-stroke-h', 'fa-mars-stroke-v', 'fa-maxcdn', 'fa-meanpath', 'fa-medium', 'fa-medkit', 'fa-meh-o', 'fa-mercury', 'fa-microphone', 'fa-microphone-slash', 'fa-minus', 'fa-minus-circle', 'fa-minus-square', 'fa-minus-square-o', 'fa-mixcloud', 'fa-mobile', 'fa-mobile-phone', 'fa-modx', 'fa-money', 'fa-moon-o', 'fa-mortar-board', 'fa-motorcycle', 'fa-mouse-pointer', 'fa-music', 'fa-navicon', 'fa-neuter', 'fa-newspaper-o', 'fa-object-group', 'fa-object-ungroup', 'fa-odnoklassniki', 'fa-odnoklassniki-square', 'fa-opencart', 'fa-openid', 'fa-opera', 'fa-optin-monster', 'fa-outdent', 'fa-pagelines', 'fa-paint-brush', 'fa-paper-plane', 'fa-paper-plane-o', 'fa-paperclip', 'fa-paragraph', 'fa-paste', 'fa-pause', 'fa-pause-circle', 'fa-pause-circle-o', 'fa-paw', 'fa-paypal', 'fa-pencil', 'fa-pencil-square', 'fa-pencil-square-o', 'fa-percent', 'fa-phone', 'fa-phone-square', 'fa-photo', 'fa-picture-o', 'fa-pie-chart', 'fa-pied-piper', 'fa-pied-piper-alt', 'fa-pinterest', 'fa-pinterest-p', 'fa-pinterest-square', 'fa-plane', 'fa-play', 'fa-play-circle', 'fa-play-circle-o', 'fa-plug', 'fa-plus', 'fa-plus-circle', 'fa-plus-square', 'fa-plus-square-o', 'fa-power-off', 'fa-print', 'fa-product-hunt', 'fa-puzzle-piece', 'fa-qq', 'fa-qrcode', 'fa-question', 'fa-question-circle', 'fa-quote-left', 'fa-quote-right', 'fa-ra', 'fa-random', 'fa-rebel', 'fa-recycle', 'fa-reddit', 'fa-reddit-alien', 'fa-reddit-square', 'fa-refresh', 'fa-registered', 'fa-remove', 'fa-renren', 'fa-reorder', 'fa-repeat', 'fa-reply', 'fa-reply-all', 'fa-retweet', 'fa-rmb', 'fa-road', 'fa-rocket', 'fa-rotate-left', 'fa-rotate-right', 'fa-rouble', 'fa-rss', 'fa-rss-square', 'fa-rub', 'fa-ruble', 'fa-rupee', 'fa-safari', 'fa-save', 'fa-scissors', 'fa-scribd', 'fa-search', 'fa-search-minus', 'fa-search-plus', 'fa-sellsy', 'fa-send', 'fa-send-o', 'fa-server', 'fa-share', 'fa-share-alt', 'fa-share-alt-square', 'fa-share-square', 'fa-share-square-o', 'fa-shekel', 'fa-sheqel', 'fa-shield', 'fa-ship', 'fa-shirtsinbulk', 'fa-shopping-bag', 'fa-shopping-basket', 'fa-shopping-cart', 'fa-sign-in', 'fa-sign-out', 'fa-signal', 'fa-simplybuilt', 'fa-sitemap', 'fa-skyatlas', 'fa-slack', 'fa-sliders-h', 'fa-slideshare', 'fa-smile-o', 'fa-soccer-ball-o', 'fa-sort', 'fa-sort-alpha-asc', 'fa-sort-alpha-desc', 'fa-sort-amount-asc', 'fa-sort-amount-desc', 'fa-sort-asc', 'fa-sort-desc', 'fa-sort-down', 'fa-sort-numeric-asc', 'fa-sort-numeric-desc', 'fa-sort-up', 'fa-soundcloud', 'fa-space-shuttle', 'fa-spinner', 'fa-spoon', 'fa-spotify', 'fa-square', 'fa-square-o', 'fa-stack-exchange', 'fa-stack-overflow', 'fa-star', 'fa-star-half', 'fa-star-half-empty', 'fa-star-half-full', 'fa-star-half-o', 'fa-star-o', 'fa-steam', 'fa-steam-square', 'fa-step-backward', 'fa-step-forward', 'fa-stethoscope', 'fa-sticky-note', 'fa-sticky-note-o', 'fa-stop', 'fa-stop-circle', 'fa-stop-circle-o', 'fa-street-view', 'fa-strikethrough', 'fa-stumbleupon', 'fa-stumbleupon-circle', 'fa-subscript', 'fa-subway', 'fa-suitcase', 'fa-sun-o', 'fa-superscript', 'fa-support', 'fa-table', 'fa-tablet', 'fa-tachometer', 'fa-tag', 'fa-tags', 'fa-tasks', 'fa-taxi', 'fa-television', 'fa-tencent-weibo', 'fa-terminal', 'fa-text-height', 'fa-text-width', 'fa-th', 'fa-th-large', 'fa-th-list', 'fa-thumb-tack', 'fa-thumbs-down', 'fa-thumbs-o-down', 'fa-thumbs-o-up', 'fa-thumbs-up', 'fa-ticket', 'fa-times', 'fa-times-circle', 'fa-times-circle-o', 'fa-tint', 'fa-toggle-down', 'fa-toggle-left', 'fa-toggle-off', 'fa-toggle-on', 'fa-toggle-right', 'fa-toggle-up', 'fa-trademark', 'fa-train', 'fa-transgender', 'fa-transgender-alt', 'fa-trash', 'fa-trash-o', 'fa-tree', 'fa-trello', 'fa-tripadvisor', 'fa-trophy', 'fa-truck', 'fa-try', 'fa-tty', 'fa-tumblr', 'fa-tumblr-square', 'fa-turkish-lira', 'fa-tv', 'fa-twitch', 'fa-twitter', 'fa-twitter-square', 'fa-umbrella', 'fa-underline', 'fa-undo', 'fa-university', 'fa-unlink', 'fa-unlock', 'fa-unlock-alt', 'fa-unsorted', 'fa-upload', 'fa-usb', 'fa-usd', 'fa-user', 'fa-user-md', 'fa-user-plus', 'fa-user-secret', 'fa-user-times', 'fa-users', 'fa-venus', 'fa-venus-double', 'fa-venus-mars', 'fa-viacoin', 'fa-video-camera', 'fa-vimeo', 'fa-vimeo-square', 'fa-vine', 'fa-vk', 'fa-volume-down', 'fa-volume-off', 'fa-volume-up', 'fa-warning', 'fa-wechat', 'fa-weibo', 'fa-weixin', 'fa-whatsapp', 'fa-wheelchair', 'fa-wifi', 'fa-wikipedia-w', 'fa-windows', 'fa-won', 'fa-wordpress', 'fa-wrench', 'fa-xing', 'fa-xing-square', 'fa-y-combinator', 'fa-y-combinator-square', 'fa-yahoo', 'fa-yc', 'fa-yc-square', 'fa-yelp', 'fa-yen', 'fa-youtube', 'fa-youtube-play', 'fa-youtube-square', // New 'fa-address-book', 'fa-address-book-o', 'fa-address-card', 'fa-address-card-o', 'fa-vcard', 'fa-vcard-o', 'fa-bandcamp', 'fa-bathtub', 'fa-s15', 'fa-bath', 'fa-id-card', 'fa-drivers-license-o', 'fa-id-card-o', 'fa-eercast', 'fa-envelope-open', 'fa-envelope-open-o', 'fa-etsy', 'fa-free-code-camp', 'fa-grav', 'fa-handshake-o', 'fa-id-badge', 'fa-id-card-o', 'fa-imdb', 'fa-linode', 'fa-meetup', 'fa-microchip', 'fa-podcast', 'fa-quora', 'fa-ravelry', 'fa-shower', 'fa-snowflake-o', 'fa-superpowers', 'fa-telegram', 'fa-thermometer', 'fa-thermometer-full', 'fa-thermometer-4', 'fa-thermometer-3', 'fa-thermometer-three-quarters', 'fa-thermometer-2', 'fa-thermometer-half', 'fa-thermometer-1', 'fa-thermometer-quarter', 'fa-thermometer-0', 'fa-thermometer-empty', 'fa-window-close', 'fa-window-close-o', 'fa-user-circle', 'fa-user-circle-o', 'fa-user-o', 'fa-window-maximize', 'fa-window-restore', 'fa-wpexplorer' ); /** * Fontawesome icons array. * * @var array Fontawesome icons. * @since 2.0.0 */ private $icons = array(); /** * Constructor function. * * @return void * @since 2.0.0 */ public function __construct() { $this->icons = $this->fa_class_lists; } /** * Get icon list. * * @return array Fontawesome icons. * @Since 1.0.0 */ public function getIcons() { return $this->icons; } /** * Add icon into the array. * * @param string $icon The icon class * * @return void * @since 2.0.0 */ public function addIcon($icon) { $this->icons[] = $icon; } } PKBA#]y$�%%1system/helixultimate/core/lib/helixmenuhelper.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Core\Lib; defined('_JEXEC') or die('Restricted access'); use Joomla\CMS\Language\Text; use HelixUltimate\Framework\Core\Lib\FontawesomeIcons; use Joomla\CMS\Menu\SiteMenu; $current_menu_id = $this->form->getValue('id'); $JMenuSite = new SiteMenu; $module_list = $this->getModuleNameById(); $fontawesome = new FontawesomeIcons; $mega_align = array( 'left' => Text::_('HELIX_ULTIMATE_GLOBAL_LEFT'), 'center' => Text::_('HELIX_ULTIMATE_GLOBAL_CENTER'), 'right' => Text::_('HELIX_ULTIMATE_GLOBAL_RIGHT'), 'full' => Text::_('HELIX_ULTIMATE_GLOBAL_FULL'), ); $dropdown_list = array( 'left' => Text::_('HELIX_ULTIMATE_GLOBAL_LEFT'), 'right' => Text::_('HELIX_ULTIMATE_GLOBAL_RIGHT') ); $menu_width = 600; $align = 'right'; $layout = array(); $enable_megamenu = 0; $show_title = 1; $custom_class = ''; $faicon = ''; $dropdown = 'right'; $badge = ''; $badge_position = ''; $badge_bg_color = ''; $badge_text_color = ''; $display_class = ''; $dropdown_class = ''; $unique_menu_item_count = 0; if (isset($menu_data->megamenu)) { $enable_megamenu = $menu_data->megamenu; } if (isset($menu_data->width)) { $menu_width = $menu_data->width; } if (isset($menu_data->menualign)) { $align = $menu_data->menualign; } if (isset($menu_data->layout)) { $layout = $menu_data->layout; } if (isset($menu_data->showtitle)) { $show_title = $menu_data->showtitle; } if (isset($menu_data->customclass)) { $custom_class = $menu_data->customclass; } if (isset($menu_data->faicon) && $menu_data->faicon) { $faicon = $menu_data->faicon; } if (isset($menu_data->dropdown)) { $dropdown = $menu_data->dropdown; } if (isset($menu_data->badge)) { $badge = $menu_data->badge; } if (isset($menu_data->badge_position)) { $badge_position = $menu_data->badge_position; } if (isset($menu_data->badge_bg_color)) { $badge_bg_color = $menu_data->badge_bg_color; } if (isset($menu_data->badge_text_color)) { $badge_text_color = $menu_data->badge_text_color; } if (!$enable_megamenu) { $display_class = ' hide-menu-builder'; } else { $dropdown_class = ' hide-menu-builder'; } $custom_class_label = Text::_('HELIX_ULTIMATE_MENU_CUSTOM_CLASS'); $badge_label = Text::_('HELIX_ULTIMATE_MENU_BADGE_TEXT'); $unique_menu_items = $this->uniqueMenuItems($current_menu_id, $layout); if ($unique_menu_items) { $unique_menu_item_count = count($unique_menu_items); } ?> <div class="hu-row"> <div class="hu-col-sm-9"> <div class="hu-megamenu-wrap"> <div class="hu-megamenu-actions"> <?php if ((int) $menu_item->parent_id === 1) { echo $this->switchFieldHTML('toggler', Text::_('HELIX_ULTIMATE_MENU_ENABLED'), $enable_megamenu); echo $this->textFieldHTML('width', Text::_('HELIX_ULTIMATE_MENU_SUB_WIDTH'), 400, $menu_width, 'number', $display_class); echo $this->selectFieldHTML('alignment', Text::_('HELIX_ULTIMATE_MENU_SUB_ALIGNMENT'), $mega_align, $align, $display_class); } echo $this->switchFieldHTML('title-toggler', Text::_('HELIX_ULTIMATE_MENU_SHOW_TITLE'), $show_title); echo $this->selectFieldHTML('dropdown', 'Dropdown Position', $dropdown_list, $dropdown, $dropdown_class); echo $this->selectFieldHTML('fa-icon', Text::_('HELIX_ULTIMATE_MENU_ICON'), $fontawesome->getIcons(), $faicon); echo $this->textFieldHTML('custom-class', $custom_class_label, '', $custom_class); echo $this->textFieldHTML('menu-badge', $badge_label, '', $badge); echo $this->selectFieldHTML('badge-position', 'Badge Position', $dropdown_list, $badge_position); echo $this->colorFieldHTML('bg-color', 'Background Color', '#333333', $badge_bg_color); echo $this->colorFieldHTML('text-color', 'Text Color', '#ffffff', $badge_text_color); ?> </div> <div id="hu-megamenu-layout" class="hu-megamenu-layout hu-megamenu-field-control<?php echo ($enable_megamenu != 1)?' hide-menu-builder':''?>" data-megamenu="<?php echo (int) $enable_megamenu; ?>" data-width="<?php echo htmlspecialchars($menu_width, ENT_QUOTES, 'UTF-8'); ?>" data-menualign="<?php echo htmlspecialchars($align, ENT_QUOTES, 'UTF-8'); ?>" data-dropdown="<?php echo htmlspecialchars($dropdown, ENT_QUOTES, 'UTF-8'); ?>" data-showtitle="<?php echo (int) $show_title; ?>" data-customclass="<?php echo htmlspecialchars($custom_class, ENT_QUOTES, 'UTF-8'); ?>" data-faicon="<?php echo htmlspecialchars($faicon, ENT_QUOTES, 'UTF-8'); ?>" data-badge="<?php echo htmlspecialchars($badge, ENT_QUOTES, 'UTF-8'); ?>" data-badge_position="<?php echo htmlspecialchars($badge_position, ENT_QUOTES, 'UTF-8'); ?>" data-badge_bg_color="<?php echo htmlspecialchars($badge_bg_color, ENT_QUOTES, 'UTF-8'); ?>" data-badge_text_color="<?php echo htmlspecialchars($badge_text_color, ENT_QUOTES, 'UTF-8'); ?>"> <?php if ($layout) { $col_number = 0; ?> <?php foreach ($layout as $key => $row) { ?> <div class="hu-megamenu-row"> <div class="hu-megamenu-row-actions clearfix"> <div class="hu-action-move-row"> <span class="fas fa-sort" aria-hidden="true"></span> Row</div> <a href="#" class="hu-action-detele-row"><span class="fas fa-trash" aria-hidden="true"></span></a> </div> <div class="hu-row"> <?php if (! empty($row->attr) ) { ?> <?php foreach ($row->attr as $col_key => $col) { ?> <div class="hu-megmenu-col hu-col-sm-<?php echo $col->colGrid; ?>" data-grid="<?php echo $col->colGrid; ?>"> <div class="hu-megamenu-column"> <div class="hu-megamenu-column-actions"> <span class="hu-action-move-column"><span class="fas fa-arrows-alt" aria-hidden="true"></span> Column</span> </div> <?php $col_list = '<div class="hu-megamenu-item-list">'; if ( isset($col->items) && count($col->items)) { foreach ($col->items as $item) { if ($item->type === 'module') { $modules = $this->getModuleNameById($item->item_id); $title = $modules->title . '<a href="javascript:;" class="hu-megamenu-remove-module"><span class="fas fa-times" aria-hidden="true"></span></a>'; } elseif ($item->type === 'menu_item') { $title = $JMenuSite->getItem($item->item_id)->title; } $col_list .= '<div class="hu-megamenu-item" data-mod_id="'. $item->item_id .'" data-type="'. $item->type .'">'; $col_list .= '<div class="hu-megamenu-item-module">'; $col_list .= '<div class="hu-megamenu-item-module-title">' . $title . '</div>'; $col_list .= '</div>'; $col_list .= '</div>'; } } if ($unique_menu_item_count && (int) $col_number === 0) { $col_number++; foreach ($unique_menu_items as $key => $item_id) { $col_list .= '<div class="hu-megamenu-item" data-mod_id="' . $item_id .'" data-type="menu_item">'; $col_list .= '<div class="hu-megamenu-item-module">'; $col_list .= '<div class="hu-megamenu-item-module-title">' . $JMenuSite->getItem($item_id)->title .'</div>'; $col_list .= '</div>'; $col_list .= '</div>'; } } $col_list .= '</div>'; echo $col_list; ?> </div> </div> <?php } ?> <?php } ?> </div> </div> <?php } ?> <?php } ?> </div> </div> <div class="hu-megamenu-add-row hu-megamenu-field-control clearfix<?php echo ($enable_megamenu != 1)?' hide-menu-builder':''?>"> <button id="hu-choose-megamenu-layout" class="hu-choose-megamenu-layout"><span class="fas fa-plus-circle" aria-hidden="true"></span> Add New Row</button> <div class="hu-megamenu-modal" id="hu-megamenu-layout-modal" style="display: none;" > <div class="hu-row"> <?php foreach ($this->row_layouts as $row_layout) { $col_grids = explode('+', $row_layout); ?> <div class="hu-col-sm-4"> <div class="hu-megamenu-grids" data-layout="<?php echo $row_layout; ?>"> <div class="hu-row"> <?php foreach ($col_grids as $col_grid) { ?> <div class="hu-col-sm-<?php echo $col_grid; ?>"><div><?php echo $col_grid; ?></div></div> <?php } ?> </div> </div> </div> <?php } ?> </div> </div> </div> <!-- End of Row Layout Structure --> </div> <?php if ((int) $menu_item->parent_id === 1 && $module_list) : ?> <div class="hu-col-sm-3"> <div class="hu-megamenu-sidebar <?php echo ($enable_megamenu != 1) ? ' hide-menu-builder' : ''; ?>"> <h3><span class="fas fa-bars" aria-hidden="true"></span> <?php echo Text::_('HELIX_ULTIMATE_MENU_MODULE_LIST'); ?></h3> <div class="hu-megamenu-module-list"> <?php foreach ($module_list as $module) : ?> <div class="hu-megamenu-draggable-module" data-mod_id="<?php echo $module->id; ?>" data-type="module"><span class="fas fa-arrows-alt" aria-hidden="true"></span> <?php echo $module->title; ?></div> <?php endforeach; ?> </div> </div> </div> <!-- End of Module List --> <?php endif; ?> </div> PKBA#]�\ 'system/helixultimate/core/lib/fonts.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Core\Lib; defined('_JEXEC') or die('Restricted access'); $systemFonts = array( 'Arial' => array( 'weights' => array( 'regular', 'italic', 'bold', 'bold italic' ), ), 'Tahoma', 'Verdana', 'Helvetica', 'Times New Roman', 'Trebuchet MS', 'Georgia' ); PKBA#]`�:���*system/helixultimate/core/classes/menu.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use HelixUltimate\Framework\Core\Classes\HelixultimateMenu as BaseHelixUltimateMenu; use Joomla\CMS\Log\Log; defined('_JEXEC') or die(); /** * HelixUltimate menu for legacy support. * * @since 2.0.0 * @deprecated 3.0.0 Instead of using this class by requiring directly from index.php or other files, * use from the BaseHelixUltimateMenu directly. * @see templates/{template}/index.php file for reference. */ class HelixultimateMenu extends BaseHelixUltimateMenu { /** * Constructor class. * * @param string $class Classes. * @param string $name Name attribute * * @return void * @since 2.0.0 */ public function __construct($class = '', $name = '') { Log::add( sprintf('/plugins/system/helixultimate/core/classes/%s is deprecated. Use HelixUltimate\Framework\Core\Classes\HelixultimateMenu instead.', __CLASS__), Log::WARNING, 'deprecated' ); parent::__construct($class, $name); } } PKBA#]nj�ü-�-0system/helixultimate/assets/js/sticky-sidebar.jsnu�[���!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.StickySidebar={})}(this,function(t){"use strict";var e,i,n,s="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},o=((e=function(t,e){var i,n;(n=function(t){Object.defineProperty(t,"__esModule",{value:!0});var e,i,n=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=(e=".stickySidebar",i={topSpacing:0,bottomSpacing:0,containerSelector:!1,innerWrapperSelector:".inner-wrapper-sticky",stickyClass:"is-affixed",resizeSensor:!0,minWidth:!1},function(){function t(e){var n=this,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(function t(e,i){if(!(e instanceof i))throw TypeError("Cannot call a class as a function")}(this,t),this.options=t.extend(i,s),this.sidebar="string"==typeof e?document.querySelector(e):e,void 0===this.sidebar)throw Error("There is no specific sidebar element.");this.sidebarInner=!1,this.container=this.sidebar.parentElement,this.affixedType="STATIC",this.direction="down",this.support={transform:!1,transform3d:!1},this._initialized=!1,this._reStyle=!1,this._breakpoint=!1,this.dimensions={translateY:0,maxTranslateY:0,topSpacing:0,lastTopSpacing:0,bottomSpacing:0,lastBottomSpacing:0,sidebarHeight:0,sidebarWidth:0,containerTop:0,containerHeight:0,viewportHeight:0,viewportTop:0,lastViewportTop:0},["handleEvent"].forEach(function(t){n[t]=n[t].bind(n)}),this.initialize()}return n(t,[{key:"initialize",value:function t(){var e=this;if(this._setSupportFeatures(),this.options.innerWrapperSelector&&(this.sidebarInner=this.sidebar.querySelector(this.options.innerWrapperSelector),null===this.sidebarInner&&(this.sidebarInner=!1)),!this.sidebarInner){var i=document.createElement("div");for(i.setAttribute("class","inner-wrapper-sticky"),this.sidebar.appendChild(i);this.sidebar.firstChild!=i;)i.appendChild(this.sidebar.firstChild);this.sidebarInner=this.sidebar.querySelector(".inner-wrapper-sticky")}if(this.options.containerSelector){var n=document.querySelectorAll(this.options.containerSelector);if((n=Array.prototype.slice.call(n)).forEach(function(t,i){t.contains(e.sidebar)&&(e.container=t)}),!n.length)throw Error("The container does not contains on the sidebar.")}"function"!=typeof this.options.topSpacing&&(this.options.topSpacing=parseInt(this.options.topSpacing)||0),"function"!=typeof this.options.bottomSpacing&&(this.options.bottomSpacing=parseInt(this.options.bottomSpacing)||0),this._widthBreakpoint(),this.calcDimensions(),this.stickyPosition(),this.bindEvents(),this._initialized=!0}},{key:"bindEvents",value:function t(){window.addEventListener("resize",this,{passive:!0,capture:!1}),window.addEventListener("scroll",this,{passive:!0,capture:!1}),this.sidebar.addEventListener("update"+e,this),this.options.resizeSensor&&"undefined"!=typeof ResizeSensor&&(new ResizeSensor(this.sidebarInner,this.handleEvent),new ResizeSensor(this.container,this.handleEvent))}},{key:"handleEvent",value:function t(e){this.updateSticky(e)}},{key:"calcDimensions",value:function e(){if(!this._breakpoint){var i=this.dimensions;i.containerTop=t.offsetRelative(this.container).top,i.containerHeight=this.container.clientHeight,i.containerBottom=i.containerTop+i.containerHeight,i.sidebarHeight=this.sidebarInner.offsetHeight,i.sidebarWidth=this.sidebarInner.offsetWidth,i.viewportHeight=window.innerHeight,i.maxTranslateY=i.containerHeight-i.sidebarHeight,this._calcDimensionsWithScroll()}}},{key:"_calcDimensionsWithScroll",value:function e(){var i=this.dimensions;i.sidebarLeft=t.offsetRelative(this.sidebar).left,i.viewportTop=document.documentElement.scrollTop||document.body.scrollTop,i.viewportBottom=i.viewportTop+i.viewportHeight,i.viewportLeft=document.documentElement.scrollLeft||document.body.scrollLeft,i.topSpacing=this.options.topSpacing,i.bottomSpacing=this.options.bottomSpacing,"function"==typeof i.topSpacing&&(i.topSpacing=parseInt(i.topSpacing(this.sidebar))||0),"function"==typeof i.bottomSpacing&&(i.bottomSpacing=parseInt(i.bottomSpacing(this.sidebar))||0),"VIEWPORT-TOP"===this.affixedType?i.topSpacing<i.lastTopSpacing&&(i.translateY+=i.lastTopSpacing-i.topSpacing,this._reStyle=!0):"VIEWPORT-BOTTOM"===this.affixedType&&i.bottomSpacing<i.lastBottomSpacing&&(i.translateY+=i.lastBottomSpacing-i.bottomSpacing,this._reStyle=!0),i.lastTopSpacing=i.topSpacing,i.lastBottomSpacing=i.bottomSpacing}},{key:"isSidebarFitsViewport",value:function t(){var e=this.dimensions,i="down"===this.scrollDirection?e.lastBottomSpacing:e.lastTopSpacing;return this.dimensions.sidebarHeight+i<this.dimensions.viewportHeight}},{key:"observeScrollDir",value:function t(){var e=this.dimensions;if(e.lastViewportTop!==e.viewportTop){var i="down"===this.direction?Math.min:Math.max;e.viewportTop===i(e.viewportTop,e.lastViewportTop)&&(this.direction="down"===this.direction?"up":"down")}}},{key:"getAffixType",value:function t(){this._calcDimensionsWithScroll();var e=this.dimensions,i=e.viewportTop+e.topSpacing,n=this.affixedType;return i<=e.containerTop||e.containerHeight<=e.sidebarHeight?(e.translateY=0,n="STATIC"):n="up"===this.direction?this._getAffixTypeScrollingUp():this._getAffixTypeScrollingDown(),e.translateY=Math.max(0,e.translateY),e.translateY=Math.min(e.containerHeight,e.translateY),e.translateY=Math.round(e.translateY),e.lastViewportTop=e.viewportTop,n}},{key:"_getAffixTypeScrollingDown",value:function t(){var e=this.dimensions,i=e.sidebarHeight+e.containerTop,n=e.viewportTop+e.topSpacing,s=e.viewportBottom-e.bottomSpacing,o=this.affixedType;return this.isSidebarFitsViewport()?e.sidebarHeight+n>=e.containerBottom?(e.translateY=e.containerBottom-i,o="CONTAINER-BOTTOM"):n>=e.containerTop&&(e.translateY=n-e.containerTop,o="VIEWPORT-TOP"):e.containerBottom<=s?(e.translateY=e.containerBottom-i,o="CONTAINER-BOTTOM"):i+e.translateY<=s?(e.translateY=s-i,o="VIEWPORT-BOTTOM"):e.containerTop+e.translateY<=n&&0!==e.translateY&&e.maxTranslateY!==e.translateY&&(o="VIEWPORT-UNBOTTOM"),o}},{key:"_getAffixTypeScrollingUp",value:function t(){var e=this.dimensions,i=e.sidebarHeight+e.containerTop,n=e.viewportTop+e.topSpacing,s=e.viewportBottom-e.bottomSpacing,o=this.affixedType;return n<=e.translateY+e.containerTop?(e.translateY=n-e.containerTop,o="VIEWPORT-TOP"):e.containerBottom<=s?(e.translateY=e.containerBottom-i,o="CONTAINER-BOTTOM"):!this.isSidebarFitsViewport()&&e.containerTop<=n&&0!==e.translateY&&e.maxTranslateY!==e.translateY&&(o="VIEWPORT-UNBOTTOM"),o}},{key:"_getStyle",value:function e(i){if(void 0!==i){var n={inner:{},outer:{}},s=this.dimensions;switch(i){case"VIEWPORT-TOP":n.inner={position:"fixed",top:s.topSpacing,left:s.sidebarLeft-s.viewportLeft,width:s.sidebarWidth};break;case"VIEWPORT-BOTTOM":n.inner={position:"fixed",top:"auto",left:s.sidebarLeft,bottom:s.bottomSpacing,width:s.sidebarWidth};break;case"CONTAINER-BOTTOM":case"VIEWPORT-UNBOTTOM":var o=this._getTranslate(0,s.translateY+"px");o?n.inner={transform:o}:n.inner={position:"absolute",top:s.translateY,width:s.sidebarWidth}}switch(i){case"VIEWPORT-TOP":case"VIEWPORT-BOTTOM":case"VIEWPORT-UNBOTTOM":case"CONTAINER-BOTTOM":n.outer={height:s.sidebarHeight,position:"relative"}}return n.outer=t.extend({height:"",position:""},n.outer),n.inner=t.extend({position:"relative",top:"",left:"",bottom:"",width:"",transform:""},n.inner),n}}},{key:"stickyPosition",value:function i(n){if(!this._breakpoint){n=this._reStyle||n||!1,this.options.topSpacing,this.options.bottomSpacing;var s=this.getAffixType(),o=this._getStyle(s);if((this.affixedType!=s||n)&&s){var r="affix."+s.toLowerCase().replace("viewport-","")+e;for(var a in t.eventTrigger(this.sidebar,r),"STATIC"===s?t.removeClass(this.sidebar,this.options.stickyClass):t.addClass(this.sidebar,this.options.stickyClass),o.outer){var p="number"==typeof o.outer[a]?"px":"";this.sidebar.style[a]=o.outer[a]+p}for(var c in o.inner){var l="number"==typeof o.inner[c]?"px":"";this.sidebarInner.style[c]=o.inner[c]+l}var h="affixed."+s.toLowerCase().replace("viewport-","")+e;t.eventTrigger(this.sidebar,h)}else this._initialized&&(this.sidebarInner.style.left=o.inner.left);this.affixedType=s}}},{key:"_widthBreakpoint",value:function e(){window.innerWidth<=this.options.minWidth?(this._breakpoint=!0,this.affixedType="STATIC",this.sidebar.removeAttribute("style"),t.removeClass(this.sidebar,this.options.stickyClass),this.sidebarInner.removeAttribute("style")):this._breakpoint=!1}},{key:"updateSticky",value:function t(){var e,i=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};!this._running&&(this._running=!0,e=n.type,requestAnimationFrame(function(){"scroll"===e?(i._calcDimensionsWithScroll(),i.observeScrollDir(),i.stickyPosition()):(i._widthBreakpoint(),i.calcDimensions(),i.stickyPosition(!0)),i._running=!1}))}},{key:"_setSupportFeatures",value:function e(){var i=this.support;i.transform=t.supportTransform(),i.transform3d=t.supportTransform(!0)}},{key:"_getTranslate",value:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return this.support.transform3d?"translate3d("+e+", "+i+", "+n+")":!!this.support.translate&&"translate("+e+", "+i+")"}},{key:"destroy",value:function t(){window.removeEventListener("resize",this,{capture:!1}),window.removeEventListener("scroll",this,{capture:!1}),this.sidebar.classList.remove(this.options.stickyClass),this.sidebar.style.minHeight="",this.sidebar.removeEventListener("update"+e,this);var i={inner:{},outer:{}};for(var n in i.inner={position:"",top:"",left:"",bottom:"",width:"",transform:""},i.outer={height:"",position:""},i.outer)this.sidebar.style[n]=i.outer[n];for(var s in i.inner)this.sidebarInner.style[s]=i.inner[s];this.options.resizeSensor&&"undefined"!=typeof ResizeSensor&&(ResizeSensor.detach(this.sidebarInner,this.handleEvent),ResizeSensor.detach(this.container,this.handleEvent))}}],[{key:"supportTransform",value:function t(e){var i=!1,n=e?"perspective":"transform",s=n.charAt(0).toUpperCase()+n.slice(1),o=document.createElement("support").style;return(n+" "+["Webkit","Moz","O","ms"].join(s+" ")+s).split(" ").forEach(function(t,e){if(void 0!==o[t])return i=t,!1}),i}},{key:"eventTrigger",value:function t(e,i,n){try{var s=new CustomEvent(i,{detail:n})}catch(o){var s=document.createEvent("CustomEvent");s.initCustomEvent(i,!0,!0,n)}e.dispatchEvent(s)}},{key:"extend",value:function t(e,i){var n={};for(var s in e)void 0!==i[s]?n[s]=i[s]:n[s]=e[s];return n}},{key:"offsetRelative",value:function t(e){var i={left:0,top:0};do{var n=e.offsetTop,s=e.offsetLeft;isNaN(n)||(i.top+=n),isNaN(s)||(i.left+=s),e="BODY"===e.tagName?e.parentElement:e.offsetParent}while(e);return i}},{key:"addClass",value:function e(i,n){t.hasClass(i,n)||(i.classList?i.classList.add(n):i.className+=" "+n)}},{key:"removeClass",value:function e(i,n){t.hasClass(i,n)&&(i.classList?i.classList.remove(n):i.className=i.className.replace(RegExp("(^|\\b)"+n.split(" ").join("|")+"(\\b|$)","gi")," "))}},{key:"hasClass",value:function t(e,i){return e.classList?e.classList.contains(i):RegExp("(^| )"+i+"( |$)","gi").test(e.className)}},{key:"defaults",get:function(){return i}}]),t}());t.default=s,window.StickySidebar=s})(e)})(i={exports:{}},i.exports),i.exports),r=(n=o)&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n;t.default=r,t.__moduleExports=o,Object.defineProperty(t,"__esModule",{value:!0})});PKBA#]�書�3system/helixultimate/assets/js/admin/menubuilder.jsnu�[���jQuery((function(e){const t=Joomla.getOptions("meta")||{};var a=null,n=null,o=e("select[name=menu]").val()||"mainmenu";function i(){e(document).off("click",".hu-add-menu-item")}function s(a){const n=`${t.base}/administrator/index.php?option=com_ajax&helix=ultimate&request=task&action=getMenuItems&menutype=${a}&helix_id=${helixUltimateStyleId}`;e.ajax({type:"GET",url:n,beforeSend(){e(document).off("click",".hu-branch-tools .hu-branch-tools-icon")},success(a){(a=a&&JSON.parse(a)).status&&(e("#hu-menu-builder-container").html(a.data),i(),Joomla.sortable.run(),e(document).on("sortCompleted",(async function(a,n){let o=n.item.data("itemid"),i=n.item.data("parent"),s=n.item.getParent(),l=s.length?s.data("itemid"):1;var r;+i==+l?u(s,!0):(await(r={id:o,parent:l},new Promise((function(a,n){const o=`${t.base}/administrator/index.php?option=com_ajax&helix=ultimate&request=task&action=parentAdoption&helix_id=${helixUltimateStyleId}`;e.ajax({method:"POST",url:o,data:r,success(e){e="string"==typeof e&&e.length>0?JSON.parse(e):e,a(e)},error(e){n(e)}})})))).status&&(n.item.data("parent",l).attr("data-parent",l),u(s))})),e(document).on("click",".hu-branch-tools .hu-branch-tools-icon",(function(t){t.preventDefault();let a=this;e(".hu-branch-tools .hu-branch-tools-list").each((function(){e(this).hasClass("active")&&e(this)[0]!==e(a).next(".hu-branch-tools-list")[0]&&(e(this).removeClass("active"),e(this).fadeIn())})),e(this).next(".hu-branch-tools-list").toggleClass("active").fadeToggle()})),e(document).on("click",".hu-branch-tools .hu-branch-tools-list-edit",(function(t){t.preventDefault(),r(),c(e(this).closest(".hu-menu-tree-branch").data("itemid")||0)})),e(document).on("click",".hu-branch-tools .hu-branch-tools-list-delete",(function(t){t.preventDefault(),r();const a=e(this).closest(".hu-menu-tree-branch").data("itemid")||0;window.confirm("Are you sure to delete the item?")&&l(a)})),e(document).on("click",".hu-branch-tools .hu-branch-tools-list-megamenu",(async function(a){a.preventDefault(),r();const n=e(this).closest(".hu-menu-tree-branch"),o=n.data("parent")||1,i=n.data("itemid")||0,s=await function(a){return new Promise(((n,o)=>{const i=`${t.base}/administrator/index.php?option=com_ajax&helix=ultimate&request=task&action=generateMegaMenuBody&id=${a}&helix_id=${helixUltimateStyleId}`;e.ajax({method:"GET",url:i,success(e){e="string"==typeof e&&e.length>0&&JSON.parse(e),n(e)},error(e){o(e)}})}))}(i);s.status&&(e(document).helixUltimateMegamenuModal({title:"1"==o?"Mega Menu":"Settings",className:"hu-mega-menu-builder",targetType:"id",target:"megaMenuModal",body:s.html}),Joomla.helixMegaMenu.run())})))},complete(){Joomla.reloadPreview(),Joomla.utils.calculateSiblingDistances()}})}function i(){e(document).off("click",".hu-branch-tools .hu-branch-tools-list-delete"),e(document).off("click",".hu-branch-tools .hu-branch-tools-list-edit"),e(document).off("click",".hu-branch-tools .hu-branch-tools-list-megamenu")}function l(a){const n=`${t.base}/administrator/index.php?option=com_menus&task=items.trash&cid[]=${a}`;e.ajax({method:"GET",url:n,success(e){s(o)},error(e){Joomla.HelixToaster.error("Something went wrong!","Error")},complete(){!function(){const a=`${t.base}/administrator/index.php?option=com_ajax&helix=ultimate&request=task&action=rebuildMenu&helix_id=${helixUltimateStyleId}`;e.ajax({method:"GET",url:a,success(e){},error(e){alert("Rebuild menu failed with: "+e.message)}})}(),Joomla.HelixToaster.error("Menu item has been successfully removed!","Success")}})}function r(){e(".hu-branch-tools .hu-branch-tools-list").each((function(){e(this).hasClass("active")&&(e(this).removeClass("active"),e(this).hide())}))}function c(e){m({title:"Edit Menu Item",targetType:"id",target:"editMenuItem",className:"edit-menu-item",frameUrl:t.base+"/administrator/index.php?option=com_menus&task=item.edit&tmpl=component&menutype="+o+"&id="+e}),h("edit-menu-item","item.save")}function u(a,n=!1){let o=a.length?a.getChildren():e(document).getRootChildren();if(0===o.length)return;const i={cid:[],order:[]};var s;o.each((function(t){i.cid.push(e(this).data("itemid")),i.order.push(t+1)})),(s=i,new Promise((function(a,n){const o=`${t.base}/administrator/index.php?option=com_menus&view=items&task=items.saveOrderAjax&tmpl=component`;e.ajax({method:"POST",url:o,data:s,success(e){a(e)},error(e){n(e)}})}))).then((function(){Joomla.reloadPreview()}))}function m({title:t,targetType:o,target:i,className:s,frameUrl:l}){e(document).helixUltimateFrameModal({title:t,targetType:o,target:i,className:s,frameUrl:l}),a=e(`.hu-modal.${s}`),(n=a.find("iframe")).off("load"),e(document).off("click",`.hu-modal.${s} button.hu-save-btn`),a.find(".hu-save-btn").prop("disabled",!0),a.find(".hu-cancel-btn").on("click",(function(t){e(this).closeModal()}))}function d(t){const a=e(".hu-spinner");t?a.hasClass("hidden")&&a.removeClass("hidden"):a.hasClass("hidden")||a.addClass("hidden")}function h(t,a="item.apply"){const i=`.hu-modal.${t} button.hu-save-btn`;n.on("load",(function(){const t=n.contents();e(i).prop("disabled",!1),e(document).off("click",i),e(document).on("click",i,Joomla.utils.debounce((async function(){const n=e(t).find("form");n.find("input[name=task]").val(a),n.find("input[name=task]").attr("value",a);const i=t[0].formvalidator.isValid(n[0]);if(d(!0),i)try{const t=await function(t){const a=t.attr("action"),n=t.serializeArray();return new Promise(((t,o)=>{e.ajax({method:"POST",url:a,data:n,success(e){t(e)},error(e){o(e)}})}))}(n),i=e('<div class="hu-menuitem-resp"></div>').hide().html(t),l=i.find(".alert-heading"),r=i.find(".alert-message"),c=l.length>0?l.text():"",u=r.length>0?r.text():"",m=i.find("#system-message-container noscript"),h=e("<div></div>").hide().html(m.text());if(h.find(".alert-danger").length>0)return Joomla.HelixToaster.error(m.html(),"Error"),void d(!1);t&&"Error"!==c?(s(o),e(this).closeModal(),"item.apply"===a?Joomla.HelixToaster.success("Menu item has been successfully added!","Saved"):"item.save"===a&&Joomla.HelixToaster.success("Changes have been successfully saved!","Updated")):Joomla.HelixToaster.error(u,"Error"),d(!1)}catch(e){Joomla.HelixToaster.error("Something went wrong!","Error"),d(!1)}else d(!1)}),500))}))}s(o),e("select[name=menu]").on("change",(function(){s(o=e(this).val())})),e(document).on("click",".hu-add-menu-item",(function(e){e.preventDefault(),m({title:"Add New Item",targetType:"id",target:"addNewMenuItem",className:"add-new-menu-item",frameUrl:t.base+"/administrator/index.php?option=com_menus&task=item.add&tmpl=component&menutype="+o}),h("add-new-menu-item","item.apply")})),i()}));PKBA#]�R���/system/helixultimate/assets/js/admin/webfont.jsnu�[���/** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery((function(t){Joomla.initColorPicker(".hu-font-color-input");let e=t(".hu-field-webfont").data("id");t("#"+e);function i(t){let e=t.find(".hu-webfont-list").val(),i=t.find(".hu-webfont-weight-list").val(),n=t.find(".hu-webfont-unit.active").find(".hu-unit-field-value").val(),s=t.find(".hu-font-color-input").val(),a=(t.find(".hu-webfont-subset-list").val(),t.find(".hu-font-line-height-input").val()),o=t.find("[name=hu-font-letter-spacing-input]").val(),l=t.find("input.hu-text-decoration").val(),c=t.find("input.hu-text-align").val(),f=t.find(".hu-webfont-preview");e&&f.css("font-family",e),i?f.css("font-weight",i):f.css("font-weight","100"),n?(/(em|rem|px|%)$/.test(o)||(n+="px"),n=n.replace(/\s+/,""),f.css("font-size",n)):f.css("font-size",""),s?f.css("color",s):f.css("color","#000000"),a?f.css("line-height",a):f.css("line-height",""),o?(/(em|rem|px|%)$/.test(o)||(o+="px"),o=o.replace(/\s+/,""),f.css("letter-spacing",o)):f.css("letter-spacing",""),l&&f.css("text-decoration",l),c&&f.css("text-align",c)}t(".hu-field-webfont").each((function(){i(t(this))})),t(document).on("change",".hu-webfont-list",(function(e){e.preventDefault();var n=t(this),s=n.val();if(-1!==t.inArray(s,["Arial","Tahoma","Verdana","Helvetica","Times New Roman","Trebuchet MS","Georgia"]))n.closest(".hu-field-webfont").find(".hu-webfont-subset-list").html("").trigger("liszt:updated");else{var a={action:"fontVariants",option:"com_ajax",helix:"ultimate",request:"task",data:{fontName:s},format:"json"};t.ajax({type:"POST",data:a,success:function(e){var i=t.parseJSON(e);n.closest(".hu-field-webfont").find(".hu-webfont-subset-list").html(i.subsets).trigger("liszt:updated")}});var o=n.val().replace(" ","+");t("head").append("<link href='//fonts.googleapis.com/css?family="+o+":100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic&display=swap' rel='stylesheet' type='text/css'>")}return i(t(this).closest(".hu-field-webfont")),!1})),t(document).on("change",".hu-webfont-unit .hu-unit-field-value",(function(e){e.preventDefault(),i(t(this).closest(".hu-field-webfont"))})),t(".hu-font-color-input").on("input",(function(e){e.preventDefault(),i(t(this).closest(".hu-field-webfont"))})),t(".hu-font-line-height-input").on("change",(function(e){e.preventDefault(),i(t(this).closest(".hu-field-webfont"))})),t("[name=hu-font-letter-spacing-input]").on("change",(function(e){e.preventDefault(),i(t(this).closest(".hu-field-webfont"))})),t(document).on("change",".hu-webfont-weight-list",(function(e){e.preventDefault(),i(t(this).closest(".hu-field-webfont"))})),t(document).on("change",".hu-webfont-style-list",(function(e){e.preventDefault(),i(t(this).closest(".hu-field-webfont"))})),t(".list-font-subset").on("change",(function(e){e.preventDefault();var i=t(this).closest(".hu-field-webfont").find(".hu-webfont-list").val().replace(" ","+");t("head").append("<link href='//fonts.googleapis.com/css?family="+i+":100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic&subset="+t(this).val()+"&display=swap' rel='stylesheet' type='text/css'>")})),t(".hu-font-decoration .hu-action-group .hu-switcher-action").on("click",(function(e){e.preventDefault(),e.stopPropagation(),t(this).siblings().removeClass("active"),t(this).addClass("active"),t(this).closest(".hu-font-decoration").find("input.hu-text-decoration").val(t(this).data("value")).trigger("change"),i(t(this).closest(".hu-field-webfont"))})),t(".hu-font-alignment .hu-action-group .hu-switcher-action").on("click",(function(e){e.preventDefault(),e.stopPropagation(),t(this).siblings().removeClass("active"),t(this).addClass("active"),t(this).closest(".hu-font-alignment").find("input.hu-text-align").val(t(this).data("value")).trigger("change"),i(t(this).closest(".hu-field-webfont"))})),t(document).on("click","#update_fonts",(function(e){e.preventDefault();var i=t(this);return t.ajax({type:"POST",data:{action:"update-font-list",option:"com_ajax",helix:"ultimate",request:"task",data:{},format:"json"},beforeSend:function(){i.find("span").addClass("fa-spin")},success:function(e){var n=t.parseJSON(e);n.status?i.after(n.message):(i.after("<p class='font-update-failed'>Unexpected error occurs. Please make sure that, you have inserted Google Font API key.</p>"),i.find("span").removeClass("fa-spin"))},complete(e){200===e.status&&(i.find("span").removeClass("fa-spin"),i.next().delay(2e3).fadeOut(300,(function(){t(this).remove()})))}}),!1}))}));PKBA#]�����.system/helixultimate/assets/js/admin/fields.jsnu�[���jQuery((function(e){function t(t,n,i){for(var a,l,o,h,c=!0,s=t.data("revealon")||[],r=0,u=s.length;r<u;r++)o=(l=s[r]||{}).field,h=i.find('[name="'+o+'"], [name="'+o+'[]"]'),l.valid=0,h.each((function(){var t=e(this);for(var n in-1!==["checkbox","radio"].indexOf(t.attr("type"))?a=(t.prop("checked")>>0).toString():null==(a=t.val())&&"select"==t.prop("tagName").toLowerCase()&&(a=[]),"object"!=typeof a&&(a=JSON.parse('["'+a+'"]')),a)a.propertyIsEnumerable(n)&&("="==s[r].sign&&-1!==s[r].values.indexOf(a[n])&&(s[r].valid=1),"!="==s[r].sign&&-1===s[r].values.indexOf(a[n])&&(s[r].valid=1))})),""===l.op?0===l.valid&&(c=!1):("AND"===l.op&&l.valid+s[r-1].valid<2&&(c=!1,l.valid=0),"OR"===l.op&&l.valid+s[r-1].valid>0&&(c=!0,l.valid=1));if(t.is("option")){t.toggle(c),t.attr("disabled",!c);var d=t.parent();e("#"+d.attr("id")+"_chzn").length&&(d.trigger("liszt:updated"),d.trigger("chosen:updated"))}(n=n&&!t.hasClass("no-animation")&&!t.hasClass("no-animate")&&!t.find(".no-animation, .no-animate").length)?c?t.slideDown():t.slideUp():t.toggle(c)}e(".hu-input-color").each((function(){e(this).addClass("minicolors")})),e(".hu-menu-builder .minicolors").each((function(){e(this).minicolors({control:"hue",position:"bottom",theme:"bootstrap",keywords:"transparent, initial, inherit",letterCase:"uppercase",opacity:!0})})),e(".hu-field-alignment .hu-switcher-action").on("click",(function(t){t.preventDefault();const n=e(this).siblings();n.hasClass("active")&&n.removeClass("active"),e(this).addClass("active");e(this).closest(".hu-field-alignment").find("input[type=hidden]").val(e(this).data("value")).trigger("change")})),e(document).on("change",".hu-menu-hierarchy-container .hu-menu-item-selector.select-all",(function(t){t.preventDefault();const n=e(this).closest(".hu-menu-hierarchy-list").find(".hu-menu-hierarchy-item:not(.level-0)"),i=e(this).closest(".hu-menu-hierarchy-container").find("input[type=hidden]");let a=e(this).prop("checked"),l=[];a||l.length>0&&(l=[]),n.each((function(){const t=e(this).find("input[type=checkbox]");t.prop("checked",a);const n=t.val();a&&-1===l.indexOf(n)&&l.push(n)})),i.val(JSON.stringify(l)).trigger("change")})),e(document).on("change",".hu-menu-hierarchy-container .hu-menu-item-selector:not(.level-0)",(function(t){t.preventDefault();const n=e(this).closest(".hu-menu-hierarchy-container").find("input[type=hidden]"),i=e(this).closest(".hu-menu-hierarchy-list").find("input[type=checkbox].select-all"),a=i.data("elements");let l=n.val();l=l.length&&JSON.parse(l)||[];const o=e(this).val();if(e(this).prop("checked"))-1===l.indexOf(o)&&l.push(o);else{let e=l.indexOf(o);e>-1&&l.splice(e,1)}l.length===a.length?i.prop("checked",!0):i.prop("checked",!1),n.val(JSON.stringify(l)).trigger("change")})),Joomla.setUpShowon=function(n){n=n||document;for(var i=e(n).find("[data-revealon]"),a=0,l=i.length;a<l;a++)!function(){for(var l,o=e(i[a]),h=o.data("revealon")||[],c=e(),s=0,r=h.length;s<r;s++)l=h[s].field,c=c.add(e('[name="'+l+'"], [name="'+l+'[]"]'));t(o,!0,n),c.on("change keyup",(function(){t(o,!0,n)}))}()},e(document).on("blur",".hu-unit-field-input",(function(t){t.preventDefault();let n=e(this).val(),i="px",a=e(this).parent().find("input.hu-unit-field-value");if(n=n.replace(/\s/g,""),""===n)return void a.val("");const l=n.match(/^([+-]?(?:\d+|\d*\.\d+))(px|em|rem|%)?$/i);l&&l.length>0?([_,n,i]=l,void 0===i&&(i=e(this).parent().find("select.hu-unit-select").val()||"px")):n=parseFloat(n)||"",e(this).val(n),e(this).next("select.hu-unit-select").val(i),a.val(`${n}${i}`).trigger("change")})),e(document).on("change","select.hu-unit-select",(function(t){t.preventDefault();let n=e(this).val()||"px",i=e(this).parent().find("input.hu-unit-field-input").val(),a=e(this).parent().find("input.hu-unit-field-value");i&&a.val(`${i}${n}`).trigger("change")}))}));PKBA#]�<l�:�:0system/helixultimate/assets/js/admin/megamenu.jsnu�[���var megaMenu={run(){this.declareDOMVariables(),this.initMiniColors(),this.jQueryPluginExtension(),this.initChosen(),this.removeEventListeners(),this.handleMegaMenuToggle(),this.toggleSidebarSettings($megamenu.prop("checked")),this.handleSidebarSettings(),this.handleCloseModal(),this.rowSortable(".hu-megamenu-rows-container"),this.columnSortable(".hu-megamenu-columns-container"),this.itemSortable(".hu-megamenu-column-contents"),this.handleSaveMegaMenuSettings(),this.handleRemoveRow(),this.handleLoadSlots(),this.handleCustomLayoutDisplay(),this.handleLayoutOptionSelection(),this.handleCustomLayoutSelection(),this.handleRowWiseColumnLayoutSelection(),this.openModulePopover(),this.handleClosePopover(),this.handleAddNewCell(),this.handleRemoveCell(),this.toggleColumnsSlots(),this.handleModuleSearch()},jQueryPluginExtension(){$.fn.extend({test(){return this.css("color","#fff")}})},initChosen(){$("select[data-husearch]").chosen({width:"100%",allow_single_deselect:!0,placeholder_text_single:Joomla.Text._("HELIX_ULTIMATE_SELECT_ICON_LABEL")})},declareDOMVariables(){$megamenu=$(".hu-megamenu-builder-megamenu"),$settingsInput=$("#hu-megamenu-layout-settings"),$saveBtn=$(".hu-megamenu-save-btn"),$cancelBtn=$(".hu-megamenu-cancel-btn"),$rowsContainer=$(".hu-megamenu-rows-container"),$popover=$(".hu-megamenu-popover");itemId=$("#hu-menu-itemid").val(),settingsData=$settingsInput.val(),settingsData=settingsData&&JSON.parse(settingsData),settingsData=$.extend({badge:"",badge_bg_color:"",badge_position:"",badge_text_color:"",customclass:"",dropdown:"right",faicon:"",layout:[],megamenu:0,menualign:"full",showtitle:1,width:"600px"},settingsData),baseUrl=$("#hu-base-url").val()},handleRemoveCell(){$(document).on("click",".hu-megamenu-cell-remove",(function(){const e=$(this).closest(".hu-megamenu-cell").data("cellid")||1,t=$(this).closest(".hu-megamenu-col").data("columnid")||1,a=$(this).closest(".hu-megamenu-row-wrapper").data("rowid")||1;$(this).closest(".hu-megamenu-cell").slideUp((function(){$(this).remove();let o=settingsData.layout[a-1].attr[t-1],n=void 0!==o.items?o.items:[];n.length>0&&n.splice(e-1,1),settingsData.layout[a-1].attr[t-1].items=n}))}))},handleAddNewCell(){const e=this;$(document).off("click",".hu-megamenu-insert-module"),$(document).off("click",".hu-megamenu-insert-menu"),$(document).on("click",".hu-megamenu-insert-module",(async function(){const t=$(this).data("module"),a="module",o=$popover.data("rowid"),n=$popover.data("columnid"),s=o-1,l=n-1;settingsData.layout[s].attr||(settingsData.layout[s].attr=[]);const u=settingsData.layout[s].attr[l]||{items:[]};u.items||(u.items=[]);const i={type:a,item_id:t,itemId:itemId,rowId:o,columnId:n,cellId:u.items.length+1},m=await e.addNewCell(i);m.status&&($(`.hu-megamenu-row-wrapper[data-rowid=${o}] .hu-megamenu-col[data-columnid=${n}] .hu-megamenu-column-contents`).append(m.html),e.closePopover(),u.items.push({type:a,item_id:t}),settingsData.layout[s].attr[l]=u)})),$(document).on("click",".hu-megamenu-insert-menu",(async function(){const t=$(this).data("child"),a="menu_item",o=$popover.data("rowid"),n=$popover.data("columnid"),s=o-1,l=n-1,u=settingsData.layout[s].attr[l]||{items:[]};u.items||(u.items=[]);const i={type:a,item_id:t,itemId:itemId,rowId:o,columnId:n,cellId:u.items.length+1},m=await e.addNewCell(i);m.status&&($(`.hu-megamenu-row-wrapper[data-rowid=${o}] .hu-megamenu-col[data-columnid=${n}] .hu-megamenu-column-contents`).append(m.html),e.closePopover(),u.items.push({type:a,item_id:t}),settingsData.layout[s].attr[l]=u)}))},addNewCell(e){let t=`${baseUrl}/administrator/index.php?option=com_ajax&helix=ultimate&request=task&action=generateNewCell&helix_id=${helixUltimateStyleId}`;return new Promise(((a,o)=>{$.ajax({method:"POST",url:t,data:e,success(e){e="string"==typeof e&&e.length>0&&JSON.parse(e),a(e)},error(e){o(e)}})}))},handleClosePopover(){const e=this;$(document).on("click",".hu-megamenu-popover-close",(function(){e.closePopover()}))},openPopover(){!$popover.hasClass("show")&&$popover.addClass("show"),$(".hu-megamenu-module-search").val("")},closePopover(){$popover.hasClass("show")&&$popover.removeClass("show")},openModulePopover(){const e=this;$(document).on("click",".hu-megamenu-add-new-item",(async function(t){const a=$(this).closest(".hu-megamenu-col").data("columnid")||1,o=$(this).closest(".hu-megamenu-row-wrapper").data("rowid")||1;$popover.data("rowid",o).data("columnid",a).attr("data-rowid",o).attr("data-columnid",a);const n=await e.getModulesContents();n.status&&$popover.find(".hu-megamenu-modules-container").html(n.html),e.openPopover()}))},handleModuleSearch(){let e=null,t=this;$(document).on("keyup",".hu-megamenu-module-search",(function(a){a.preventDefault(),e&&clearTimeout(e),e=setTimeout((async()=>{let{value:e}=a.target;const o=await t.getModulesContents(e);o.status&&$popover.find(".hu-megamenu-modules-container").html(o.html)}),100)}))},getModulesContents(e=""){const t=`${baseUrl}/administrator/index.php?option=com_ajax&helix=ultimate&request=task&action=getModuleList&keyword=${e}&helix_id=${helixUltimateStyleId}`,a={keyword:e,itemId:itemId};return new Promise(((e,o)=>{$.ajax({method:"GET",url:t,data:a,success(t){t="string"==typeof t&&t.length>0&&JSON.parse(t),e(t)},error(e){o(e)}})}))},initMiniColors(){$(".hu-input-color").each((function(){!$(this).hasClass("minicolors")&&$(this).addClass("minicolors")})),Joomla.initColorPicker(".hu-megamenu-container .minicolors")},handleMegaMenuToggle(){let e=this;$megamenu.on("change",(function(t){t.preventDefault(),e.toggleSidebarSettings($(this).prop("checked"))}))},toggleSidebarSettings(e){let t=$(".hu-megamenu-grid"),a=$(".hu-megamenu-settings"),o=$(".hu-megamenu-alignment"),n=$(".hu-menuitem-dropdown-position"),s=$(".hu-mega-menu-builder");e?(a.hasClass("show")||a.addClass("show"),t.hasClass("show")||t.addClass("show"),s.hasClass("collapsed")&&s.removeClass("collapsed"),o.show(),n.hide()):(a.hasClass("show")&&a.removeClass("show"),t.hasClass("show")&&t.removeClass("show"),s.hasClass("collapsed")||s.addClass("collapsed"),o.hide(),n.show())},handleCustomLayoutDisplay(){$(document).on("click",".hu-megamenu-custom",(function(){$(this).closest(".hu-megamenu-columns-layout").find(".hu-megamenu-custom-layout").slideToggle(100)}))},closeRowLayoutDisplay(){let e=$(".hu-megamenu-row-slots");e.hasClass("show")&&e.removeClass("show")},closeLayoutDisplay(){$(".hu-megamenu-add-slots").hide()},removeEventListeners(){$(document).off("click",".hu-megamenu-add-slots .hu-megamenu-custom-layout-apply"),$(document).off("click",".hu-megamenu-remove-row"),$(document).off("click",".hu-megamenu-add-row > a"),$(document).off("click",".hu-megamenu-custom"),$(document).off("click",".hu-megamenu-columns"),$(document).off("click",".hu-megamenu-add-new-item"),$(document).off("click",".hu-megamenu-cell-options-item"),$(document).off("click",".hu-megamenu-popover-close"),$(document).off("click",".hu-megamenu-insert-module"),$(document).off("click",".hu-megamenu-cell-remove"),$(document).off("click",".hu-megamenu-add-slots .hu-megamenu-column-layout:not(.hu-megamenu-custom)"),$(document).off("click",".hu-megamenu-row-slots .hu-megamenu-column-layout:not(.hu-megamenu-custom)"),$(document).off("click",".hu-megamenu-row-slots .hu-megamenu-custom-layout-apply"),$cancelBtn.off("click"),$saveBtn.off("click"),$megamenu.off("change")},handleRowWiseColumnLayoutSelection(){const e=this;$(document).on("click",".hu-megamenu-row-slots .hu-megamenu-column-layout:not(.hu-megamenu-custom)",(async function(){const t=$(this).closest(".hu-megamenu-row-wrapper").data("rowid")-1,a=$(this).data("layout")||"12";await e.changeRowsColumns({rowIndex:t,layout:a,$container:$(this).closest(".hu-megamenu-row-wrapper").find(".hu-megamenu-columns-container")})})),$(document).on("click",".hu-megamenu-row-slots .hu-megamenu-custom-layout-apply",(async function(){const t=$(this).closest(".hu-megamenu-row-wrapper").data("rowid")-1,a=$(this).parent().find(".hu-megamenu-custom-layout-field").val();await e.changeRowsColumns({rowIndex:t,layout:a,$container:$(this).closest(".hu-megamenu-row-wrapper").find(".hu-megamenu-columns-container")})}))},async changeRowsColumns({rowIndex:e,layout:t,$container:a}){const o=settingsData.layout[e],n=await this.updateRowLayout({layout:t,rowData:JSON.stringify(o),rowId:e+1,itemId:itemId});n.status&&(a.html(n.html),settingsData.layout[e]=n.data,this.closeRowLayoutDisplay(),this.refreshSortable(["item"]))},updateRowLayout:({layout:e,rowData:t,rowId:a,itemId:o})=>new Promise(((n,s)=>{const l=`${baseUrl}/administrator/index.php?option=com_ajax&helix=ultimate&request=task&action=updateRowLayout&helix_id=${helixUltimateStyleId}`,u={layout:e,data:t,rowId:a,itemId:o};$.ajax({method:"POST",url:l,data:u,success(e){e=!("string"!=typeof e||!e.length)&&JSON.parse(e),n(e)},error(e){s(e)}})})),handleLayoutOptionSelection(){let e=this;$(document).on("click",".hu-megamenu-add-slots .hu-megamenu-column-layout:not(.hu-megamenu-custom)",(async function(t){t.preventDefault();const a=$(this).data("layout")||"12",o=settingsData.layout.length+1,n=await e.generateRow(a,o,itemId);n.status&&($rowsContainer.append(n.data),e.closeLayoutDisplay(),settingsData.layout.push(n.row),e.refreshSortable(["column","item"]))}))},handleCustomLayoutSelection(){let e=this;$(document).on("click",".hu-megamenu-add-slots .hu-megamenu-custom-layout-apply",(async function(t){t.preventDefault();let a=$(".hu-megamenu-custom-layout-field").val(),o=settingsData.layout.length+1;if(""==a)return;const n=await e.generateRow(a,o,itemId);n.status&&($rowsContainer.append(n.data),e.closeLayoutDisplay(),settingsData.layout.push(n.row),e.refreshSortable())}))},toggleColumnsSlots(){$(document).on("click",".hu-megamenu-columns",(function(){$(this).closest(".hu-megamenu-row-toolbar-right").find(".hu-megamenu-row-slots").toggleClass("show")}))},generateRow:(e,t,a)=>new Promise(((o,n)=>{const s=`${baseUrl}/administrator/index.php?option=com_ajax&helix=ultimate&request=task&action=generateRow&helix_id=${helixUltimateStyleId}`,l={layout:e,rowId:t,itemId:a};$.ajax({method:"POST",url:s,data:l,success(e){e=!("string"!=typeof e||!e.length)&&JSON.parse(e),o(e)},error(e){n(e)}})})),handleSidebarSettings(){let e=this;[".hu-megamenu-sidebar [name=megamenu]",".hu-megamenu-sidebar [name=width]",".hu-megamenu-sidebar [name=dropdown]",".hu-megamenu-sidebar [name=showtitle]",".hu-megamenu-sidebar [name=menualign]",".hu-megamenu-sidebar [name=faicon]",".hu-megamenu-sidebar [name=customclass]",".hu-megamenu-sidebar [name=badge]",".hu-megamenu-sidebar [name=badge_position]",".hu-megamenu-sidebar [name=badge_bg_color]",".hu-megamenu-sidebar [name=badge_text_color]"].forEach((t=>{$(t).on("change",(function(t){t.preventDefault();let{name:a,value:o}=t.target;o="checkbox"===$(this).attr("type")?($(this).prop("checked")>>0).toString():o,e.updateSettingsField(a,o)}))}))},swapRow(e,t){let a=settingsData.layout,o=a.splice(e,1);a.splice(t,0,o[0]),settingsData.layout=a},swapColumn(e,t,a){let o=settingsData.layout[e].attr,n=o.splice(t,1);o.splice(a,0,n[0]),settingsData.layout[e].attr=o},swapItem({prevRowIndex:e,prevColIndex:t,prevItemIndex:a,currRowIndex:o,currColIndex:n,currItemIndex:s}){let l=[...settingsData.layout[e].attr[t].items],u=l.splice(a,1);settingsData.layout[e].attr[t].items=l;let i=settingsData.layout[o].attr[n];void 0===i.items&&(i.items=[]);let m=[...i.items];0===m.length?m.push(u[0]):m.splice(s,0,u[0]),i.items=m,settingsData.layout[o].attr[n]=i},updateSettings(){$settingsInput.val(JSON.stringify(settingsData))},updateSettingsField(e,t){settingsData[e]=t},handleRemoveRow(){$(document).on("click",".hu-megamenu-remove-row",(function(e){e.preventDefault();let t=$(this).closest(".hu-megamenu-row-wrapper"),a=t.index();t.slideUp(100,(function(){$(this).remove(),settingsData.layout.splice(a,1)}))}))},handleLoadSlots(){$(document).on("click",".hu-megamenu-add-row > a",(function(){$(this).closest(".hu-megamenu-grid").find(".hu-megamenu-add-slots").toggle()}))},handleCloseModal(){$cancelBtn.on("click",(function(){$(this).closeModal()}))},handleSaveMegaMenuSettings(){let e=this;$saveBtn.on("click",(function(){e.saveMegaMenuSettings()}))},saveMegaMenuSettings(){const e=`${baseUrl}/administrator/index.php?option=com_ajax&helix=ultimate&request=task&action=saveMegaMenuSettings&helix_id=${helixUltimateStyleId}`,t={settings:settingsData,id:itemId};$.ajax({method:"POST",url:e,data:t,success(e){(e="string"==typeof e&&e.length>0&&JSON.parse(e)).status&&Joomla.reloadPreview()},error(e){alert("Something went wrong!")},complete(){$(document).closeModal(),Joomla.HelixToaster.success("Saved mega menu settings!","Success")}})},refreshSortable(e){e||(e=["row","column","item"]),"string"==typeof e&&(e=[e]);const t={row:{selector:".hu-megamenu-rows-container",func:"rowSortable"},column:{selector:".hu-megamenu-columns-container",func:"columnSortable"},item:{selector:".hu-megamenu-column-contents",func:"itemSortable"}};for(let a=0;a<e.length;a++)if(void 0!==t[e[a]]){let o=t[e[a]];this[o.func](o.selector)}},updateRows(){$(".hu-megamenu-row-wrapper").each((function(e){$(this).data("rowid",e+1).attr("data-rowid",e+1)}))},rowSortable(e){let t=this,a=null,o=null;$(e).sortable({handle:".hu-megamenu-row-drag-handlers",placeholder:"hu-row-sortable-placeholder",axis:"y",items:"> *",tolerance:"pointer",scroll:!0,start(e,t){let o=t.helper.outerHeight();o-=2,t.placeholder.css({height:o}),a=t.item.index()},stop(e,n){o=n.item.index(),t.swapRow(a,o),t.updateRows()}}).disableSelection()},updateColumns(e){$(`.hu-megamenu-row-wrapper[data-rowid=${e+1}]`).find(".hu-megamenu-col").each((function(e){$(this).data("columnid",e+1).attr("data-columnid",e+1)}))},columnSortable(e){let t,a,o,n,s=this;$(e).sortable({handle:".hu-megamenu-column-drag-handler",placeholder:"hu-column-sortable-placeholder",containment:".hu-megamenu-grid",axis:"x",items:"> *",start(e,a){let s=a.helper.outerHeight(),l=a.helper.outerWidth();a.placeholder.css({height:s,width:l}),o=a.item.closest(".hu-megamenu-row-wrapper").data("rowid")-1,t=a.item.index(),n=a.item.closest(".hu-megamenu-columns-container"),n.addClass("hu-megamenu-column-dragging")},stop(e,l){a=l.item.index(),s.swapColumn(o,t,a),s.updateColumns(o),n.removeClass("hu-megamenu-column-dragging")}})},itemSortable(e){let t,a,o,n,s,l,u,i=this;$(e).sortable({connectWith:".hu-megamenu-column-contents",placeholder:"hu-item-sortable-placeholder",containment:".hu-megamenu-grid",items:"> .hu-megamenu-cell",start(e,t){let a=t.helper.outerHeight(),l=t.helper.outerWidth();t.placeholder.css({height:a,width:l}),n=(t.item.closest(".hu-megamenu-col").data("columnid")||1)-1,o=(t.item.closest(".hu-megamenu-row-wrapper").data("rowid")||1)-1,s=t.item.index(),u=t.item.find(".hu-megamenu-cell-remove"),u.css({opacity:0})},stop(e,m){a=(m.item.closest(".hu-megamenu-col").data("columnid")||1)-1,t=(m.item.closest(".hu-megamenu-row-wrapper").data("rowid")||1)-1,l=m.item.index(),i.swapItem({prevRowIndex:o,prevColIndex:n,prevItemIndex:s,currRowIndex:t,currColIndex:a,currItemIndex:l}),u.css({opacity:1})}}).disableSelection()}};Joomla.helixMegaMenu=megaMenu;PKBA#]OZ��&&-system/helixultimate/assets/js/admin/modal.jsnu�[���/** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery((function(a){a.fn.extend({closeModal(){return a(".hu-modal-overlay, .hu-modal").fadeOut().remove(),a("body").removeClass("hu-modal-open"),this}}),a.fn.helixUltimateMegamenuModal=function(e){e=a.extend({title:"Mega Menu",className:"",targetType:"id",target:"",body:"",footer:""},e),a(".hu-modal-overlay, .hu-modal").remove();const{title:s,className:t,targetType:l,target:d,body:n,footer:o}=e;let i='<div class="hu-modal-overlay"></div>';i+='<div class="hu-modal '+t+'" data-target_type="'+l+'" data-target="'+d+'" style="display:none;">',i+='<div class="hu-modal-header">',i+='<h4 class="hu-modal-header-title">'+s+"</h4>",i+='<a href="#" class="action-hu-modal-close"><span class="fas fa-times" aria-hidden="true"></span></a>',i+="</div>",i+='<div class="hu-modal-inner">',i+='<div class="hu-modal-content">',n&&(i+='<div class="hu-modal-megamenu-container">',i+=n,i+="</div>"),i+="</div>",i+="</div>",i+='<div class="hu-modal-footer footer-right">',i+='<button class="hu-btn hu-btn-link hu-megamenu-cancel-btn">Cancel</button>',i+='<button class="hu-btn hu-btn-primary hu-megamenu-save-btn">Save</button>',i+="</div>",i+="</div>";const r=a("body").addClass("hu-modal-open");r.append(i),r.find(".hu-modal").fadeIn(300)},a.fn.helixUltimateFrameModal=function(e){e=a.extend({title:"Helix Ultimate",className:"",targetType:"",target:"",footer:"",frameUrl:""},e);const{title:s,target:t,targetType:l,body:d,footer:n,frameUrl:o,className:i}=e;a(".hu-modal-overlay, .hu-modal").remove();let r='<div class="hu-modal-overlay"></div>';r+='<div class="hu-modal '+i+'" data-target_type="'+l+'" data-target="'+t+'" style="display:none;">',r+='<div class="hu-modal-header">',r+='<h4 class="hu-modal-header-title">'+s+"</h4>",r+='<a href="#" class="action-hu-modal-close"><span class="fas fa-times" aria-hidden="true"></span></a>',r+="</div>",r+='<div class="hu-modal-inner">',r+='<div class="hu-modal-content">',o&&(r+='<div class="hu-modal-frame-container">',r+='<iframe src="'+o+'" width="100%" height="100%"></iframe>',r+="</div>"),r+="</div>",r+="</div>",r+='<div class="hu-modal-footer footer-right">',r+='<button class="hu-btn hu-btn-link hu-cancel-btn">Cancel</button>',r+='<button class="hu-btn hu-btn-primary hu-save-btn">',r+='<div class="hu-spinner hidden spinner-border spinner-border-sm" role="status"><span class="visually-hidden">Loading...</span></div>',r+=" Save",r+="</button>",r+="</div>",r+="</div>",r+="</div>";const h=a("body").addClass("hu-modal-open");h.append(r),h.find(".hu-modal").fadeIn(300)},a.fn.helixUltimateModal=function(e){e=a.extend({target_type:"",target:""},e);a(".hu-modal-overlay, .hu-modal").remove();var s='<div class="hu-modal-overlay"></div>';s+='<div class="hu-modal" data-target_type="'+e.target_type+'" data-target="'+e.target+'">',s+='<div class="hu-modal-header">',s+='<input type="file" id="hu-file-input" accept="image/png, image/jpg, image/jpeg, image/webp, image/gif" style="display:none;" multiple>',s+='<div class="hu-modal-breadcrumbs"></div>',s+='<div class="hu-modal-actions-left">',s+='<a href="#" class="hu-btn hu-btn-primary hu-modal-action-select hu-mr-2"><span class="fas fa-check" aria-hidden="true"></span> Select</a>',s+='<a href="#" class="hu-btn hu-btn-secondary hu-modal-action-cancel hu-mr-2"><span class="fas fa-times" aria-hidden="true"></span> Cancel</a>',s+='<a href="#" class="hu-btn hu-btn-danger hu-btn-last hu-modal-action-delete"><span class="fas fa-minus-circle" aria-hidden="true"></span> Delete</a>',s+="</div>",s+='<div class="hu-modal-actions-right">',s+='<a href="#" class="hu-btn hu-btn-primary hu-modal-action-upload hu-mr-2"><span class="fas fa-upload" aria-hidden="true"></span> Upload</a>',s+='<a href="#" class="hu-btn hu-btn-secondary hu-btn-last hu-modal-action-new-folder"><span class="fas fa-plus" aria-hidden="true"></span> New Folder</a>',s+='<a href="#" class="action-hu-modal-close"><span class="fas fa-times" aria-hidden="true"></span></a>',s+="</div>",s+="</div>",s+='<div class="hu-modal-inner">',s+='<div class="hu-modal-preloader"><span class="fas fa-circle-notch fa-pulse fa-spin fa-3x fa-fw" aria-hidden="true"></span></div>',s+="</div>",s+="</div>",a("body").addClass("hu-modal-open").append(s)},a.fn.helixUltimateOptionsModal=function(e){e=a.extend({target:"",title:"Options",flag:"",class:"",applyBtnClass:"hu-settings-apply",footerButtons:[]},e);a(".hu-options-modal-overlay, .hu-options-modal").remove();var s='<div class="hu-options-modal-overlay"></div>';s+='<div class="hu-options-modal '+e.class+'" data-target="#'+e.target+'">',s+='<div class="hu-options-modal-header">',s+='<span class="hu-options-modal-header-title">'+e.title+"</span>",s+='<a href="#" class="action-hu-options-modal-close"><span class="fas fa-times" aria-hidden="true"></span></a>',s+="</div>",s+='<div class="hu-options-modal-inner">',s+='<div class="hu-options-modal-content">',s+="</div>",s+="</div>",s+='<div class="hu-options-modal-footer">',s+=`<a href="#" class="hu-btn hu-btn-primary ${e.applyBtnClass}" data-flag="${e.flag}"><span class="fas fa-check"></span> Apply</a>`,e.footerButtons.length&&(s+=e.footerButtons.map((a=>a))),s+="</div>",s+="</div>",a("body").addClass("hu-options-modal-open").append(s)}}));PKBA#]Br���-system/helixultimate/assets/js/admin/utils.jsnu�[���const asciiToHex=e=>"0x"+e.split("").map((e=>e.charCodeAt(0).toString(16))).join(""),getCurrentTimeString=()=>{const e=new Date;return e.getFullYear()+"-"+(e.getMonth()+1)+"-"+e.getDate()+"-"+e.getHours()+":"+e.getMinutes()+":"+e.getSeconds()+":"+e.getMinutes()},helixHash=e=>{let t=0;const{length:n}=e;if(0===n)return t;for(let i=0;i<n;i++){t=(t<<5)-t+e.charCodeAt(i),t&=t}return t},triggerEvent=(e,t)=>{if(document.createEvent&&e){const n=document.createEvent("HTMLEvents");n.initEvent(t,!1,!1),e.dispatchEvent(n)}},setCookie=(e,t="",n=1)=>{let i="";if(n){let e=new Date;e.setTime(e.getTime()+24*n*60*60*1e3),i="; expires="+e.toUTCString()}document.cookie=e+"="+t+i+"; path=/"},getCookie=e=>{e+="=";let t=document.cookie.split(";");for(let n=0;n<t.length;n++){let i=t[n];for(;" "==i.charAt(0);)i=i.substring(1,i.length);if(0==i.indexOf(e))return i.substring(e.length,i.length)}},deleteCookie=e=>{document.cookie=e+"=; Max-Age=-99999999;"},debounce=(e,t)=>{let n;return function(){let i=this,o=arguments,s=function(){n=null,e.apply(i,o)};clearTimeout(n),n=setTimeout(s,t||200)}},getCenterPosition=e=>{const{top:t,left:n,width:i,height:o}=e.getBoundingClientRect();return{x:n+i/2,y:t+o/2}},getDistance=(e,t)=>{const n=getCenterPosition(e),i=getCenterPosition(t);return{distanceX:Math.floor(Math.abs(n.x-i.x)),distanceY:Math.floor(Math.abs(n.y-i.y))}};function calculateSiblingDistances(){const e=".hu-menu-tree-branch";$(e).each((function(){const t=$(this).getBranchLevel()||1;if($(this).find(".hu-menu-branch-path").show(),"function"==typeof $(this).nextSibling)if(t>1){const n=$(this).nextSibling();if(n.length){const e=getDistance($(this).get(0),n.get(0));n.find(".hu-menu-branch-path").css("height",`${Math.max(e.distanceY+8,55)}px`)}else{const n=$(this).next(e),i=n.getBranchLevel()||1;n.length>0&&i>t&&n.find(".hu-menu-branch-path").css("height","55px")}}else $(this).find(".hu-menu-branch-path").hide()}))}Joomla.utils={asciiToHex:asciiToHex,getCurrentTimeString:getCurrentTimeString,helixHash:helixHash,triggerEvent:triggerEvent,setCookie:setCookie,getCookie:getCookie,deleteCookie:deleteCookie,debounce:debounce,getDistance:getDistance,calculateSiblingDistances:calculateSiblingDistances};PKBA#]=#�I����5system/helixultimate/assets/js/admin/jquery-ui.min.jsnu�[���/*! jQuery UI - v1.12.1 - 2016-09-14 * http://jqueryui.com * Includes: widget.js, position.js, data.js, disable-selection.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, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.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(m.inline?m.dpDiv.parent()[0]:m.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 h=0,l=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={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][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:h,widgetName:e,widgetFullName:l}),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=l.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=l.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=h++,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 h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,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/,h=/top|center|bottom/,l=/[\+\-]\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"]):h.test(i[0])?["center"].concat(i):["center","center"]),i[0]=r.test(i[0])?i[0]:"center",i[1]=h.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.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,h=t(this),l=h.outerWidth(),c=h.outerHeight(),d=i(this,"marginLeft"),_=i(this,"marginTop"),x=l+d+i(this,"marginRight")+y.width,C=c+_+i(this,"marginBottom")+y.height,D=t.extend({},m),I=e(k.my,h.outerWidth(),h.outerHeight());"right"===n.my[0]?D.left-=l:"center"===n.my[0]&&(D.left-=l/2),"bottom"===n.my[1]?D.top-=c:"center"===n.my[1]&&(D.top-=c/2),D.left+=I[0],D.top+=I[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:l,elemHeight:c,collisionPosition:s,collisionWidth:x,collisionHeight:C,offset:[u[0]+I[0],u[1]+I[1]],my:n.my,at:n.at,within:b,elem:h})}),n.using&&(r=function(t){var e=g.left-D.left,i=e+p-l,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:h,left:D.left,top:D.top,width:l,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>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)}),h.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,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l: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,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l: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,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,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-h,(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,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,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-h,(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")}});var c="ui-effects-",u="ui-effects-style",d="ui-effects-animated",p=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=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].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*)/,h=[{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]]}}],l=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=l.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}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){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,h],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 l?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=l(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=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(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()}}),l.fn.parse.prototype=l.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),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(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,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(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=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[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))),l[i.idx]=n,this[h](l)))})})}),l.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=l(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(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.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"}}(p),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)&&(p.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 h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.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(),l=l.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.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(d)||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(c+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(c+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(u,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(u)||"",t.removeData(u)},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(c+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=c+"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(d),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(h)&&h.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=c.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[l](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===l:"show"===l)?(r[l](),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",h=s.complete,l=s.mode,c=[],u=function(e){var i=t(this),s=t.effects.mode(i,l)||o;i.data(d,!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?l?this[l](s.duration,h):this.each(function(){h&&h.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,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,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-h,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 f=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)},h=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),h&&h.css(t.effects.clipToBox(r)),r.clip=a),h&&h.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,h="hide"===r,l="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(l||h?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),l&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),h&&(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=h?2*u:u/2;h&&(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,h=r||"horizontal"===a,l=r||"vertical"===a;s=o.cssClip(),n.clip={top:l?(s.bottom-s.top)/2:s.top,right:h?(s.right-s.left)/2:s.right,bottom:l?(s.bottom-s.top)/2:s.bottom,left:h?(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",h="up"===r||"down"===r?"top":"left",l="up"===r||"left"===r?"-=":"+=",c="+="===l?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===h?"outerHeight":"outerWidth"](!0)/2,u[h]=l+s,a&&(n.css(u),u[h]=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,h,l,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(h=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,l=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?l*_:0),top:h+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:l*_),top:h+(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,h=/([0-9]+)%/.exec(r),l=!!e.horizFirst,c=l?["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;h&&(r=parseInt(h[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"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],l=["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,h,n.from.y,_),v=t.effects.setTransition(a,h,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,l,n.from.x,_),v=t.effects.setTransition(a,l,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)&&(h=h.concat(["marginTop","marginBottom"]).concat(r),l=l.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,h,n.from.y,o),a=t.effects.setTransition(i,h,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,l,n.from.x,o),a=t.effects.setTransition(i,l,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,h=2*(e.times||5)+(r?1:0),l=e.duration/h,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);h>u;u++)s.animate({opacity:c},l,e.easing),c=1-c;s.animate({opacity:c},l,e.easing),s.queue(i),t.effects.unshift(s,d,h+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,h=2*r+1,l=Math.round(e.duration/h),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,l,e.easing);r>s;s++)n.animate(p,l,e.easing).animate(f,l,e.easing);n.animate(p,l,e.easing).animate(d,l/2,e.easing).queue(i),t.effects.unshift(n,g,h+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,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u=e.distance||o["top"===l?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[l],d[l]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[h][1]]=d.clip[a[h][0]],"show"===r&&(o.cssClip(d.clip),o.css(l,d[l]),d.clip=s,d[l]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var f;t.uiBackCompat!==!1&&(f=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)})),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(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(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?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.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],h=r&&n.collapsible,l=h?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:h?t():a,newPanel:l};e.preventDefault(),r&&!n.collapsible||this._trigger("beforeActivate",e,u)===!1||(n.active=h?!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,h=t.css("box-sizing"),l=t.length&&(!e.length||t.index()<e.index()),c=this.options.animate||{},u=l&&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"===h&&(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.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.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,h=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=h.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=h.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 g=/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 h=n[s]("widget");t.data(h[0],"ui-controlgroup-data",o?o:n[s]("instance")),i.push(h[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(g,"")),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 m;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,h,l,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||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,c=document.documentElement.scrollLeft||document.body.scrollLeft,u=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+c,l/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(),m===n&&(m=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,h,l=this._getInst(e);return 2===arguments.length&&"string"==typeof i?"defaults"===i?t.extend({},t.datepicker._defaults):l?"all"===i?t.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),o=this._getDateDatepicker(e,!0),r=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),a(l.settings,n),null!==r&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,r)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(e):this._enableDatepicker(e)),this._attachments(t(e),l),this._autoSize(l),this._setDate(l,o),this._updateAlternate(l),this._updateDatepicker(l)),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,h,l,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}),h={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),h=t.datepicker._checkOffset(s,h,r),s.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?"static":r?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),s.inline||(l=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[l]?s.dpDiv.show(l,t.datepicker._get(s,"showOptions"),c):s.dpDiv[l||"show"](l?c:null),t.datepicker._shouldFocusInput(s)&&s.input.trigger("focus"),t.datepicker._curInst=s)) }},_updateDatepicker:function(e){this.maxRows=4,m=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,h=document.documentElement.clientWidth+(s?0:t(document).scrollLeft()),l=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>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+o>l&&l>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,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,c="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,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(h).match(o);if(!a)throw"Missing number at position "+h;return h+=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(h,s.length).toLowerCase()===s.toLowerCase()?(o=e[0],h+=s.length,!1):void 0}),-1!==o)return o+1;throw"Unknown name at position "+h},x=function(){if(i.charAt(h)!==e.charAt(n))throw"Unexpected literal at position "+h;h++};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>h&&(a=i.substr(h),!/^\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,h=function(e){var i=t.length>s+1&&t.charAt(s+1)===e;return i&&s++,i},l=function(t,e,i){var s=""+e;if(h(t))for(;i>s.length;)s="0"+s;return s},c=function(t,e,i,s){return h(t)?s[e]:i[e]},u="",d=!1;if(e)for(s=0;t.length>s;s++)if(d)"'"!==t.charAt(s)||h("'")?u+=t.charAt(s):d=!1;else switch(t.charAt(s)){case"d":u+=l("d",e.getDate(),2);break;case"D":u+=c("D",e.getDay(),n,o);break;case"o":u+=l("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+=l("m",e.getMonth()+1,2);break;case"M":u+=c("M",e.getMonth(),a,r);break;case"y":u+=h("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"'":h("'")?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(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":a+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a));break;case"y":case"Y":o+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a))}l=h.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,h,l,c,u,d,p,f,g,m,_,v,b,y,w,k,x,C,D,I,T,P,M,S,H,z,O,A,N,W,E,F,L,R=new Date,B=this._daylightSavingAdjust(new Date(R.getFullYear(),R.getMonth(),R.getDate())),Y=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"),$=this._get(t,"stepMonths"),X=1!==U[0]||1!==U[1],G=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),Q=this._getMinMaxDate(t,"min"),J=this._getMinMaxDate(t,"max"),Z=t.drawMonth-V,te=t.drawYear;if(0>Z&&(Z+=12,te--),J)for(e=this._daylightSavingAdjust(new Date(J.getFullYear(),J.getMonth()-U[0]*U[1]+1,J.getDate())),e=Q&&Q>e?Q: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-$,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-"+(Y?"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-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(t,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(te,Z+$,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-"+(Y?"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-"+(Y?"w":"e")+"'>"+n+"</span></a>",a=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?G:B,a=K?this.formatDate(a,r,this._getFormatConfig(t)):a,h=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>",l=j?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(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>":"")+(Y?"":h)+"</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)),I=" ui-corner-all",T="",X){if(T+="<div class='ui-datepicker-group",U[1]>1)switch(C){case 0:T+=" ui-datepicker-group-first",I=" ui-corner-"+(Y?"right":"left");break;case U[1]-1:T+=" ui-datepicker-group-last",I=" ui-corner-"+(Y?"left":"right");break;default:T+=" ui-datepicker-group-middle",I=""}T+="'>"}for(T+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+I+"'>"+(/all|left/.test(I)&&0===k?Y?o:s:"")+(/all|right/.test(I)&&0===k?Y?s:o:"")+this._generateMonthYearHeader(t,Z,te,Q,J,k>0||C>0,f,g)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",P=u?"<th class='ui-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",w=0;7>w;w++)M=(w+c)%7,P+="<th scope='col'"+((w+c+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+d[M]+"'>"+p[M]+"</span></th>";for(T+=P+"</tr></thead><tbody>",S=this._getDaysInMonth(te,Z),te===t.selectedYear&&Z===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,S)),H=(this._getFirstDayOfMonth(te,Z)-c+7)%7,z=Math.ceil((H+S)/7),O=X?this.maxRows>z?this.maxRows:z:z,this.maxRows=O,A=this._daylightSavingAdjust(new Date(te,Z,1-H)),N=0;O>N;N++){for(T+="<tr>",W=u?"<td class='ui-datepicker-week-col'>"+this._get(t,"calculateWeek")(A)+"</td>":"",w=0;7>w;w++)E=m?m.apply(t.input?t.input[0]:null,[A]):[!0,""],F=A.getMonth()!==Z,L=F&&!v||!E[0]||Q&&Q>A||J&&A>J,W+="<td class='"+((w+c+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(A.getTime()===D.getTime()&&Z===t.selectedMonth&&t._keyEvent||b.getTime()===A.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!_?"":" "+E[1]+(A.getTime()===G.getTime()?" "+this._currentClass:"")+(A.getTime()===B.getTime()?" ui-datepicker-today":""))+"'"+(F&&!_||!E[2]?"":" title='"+E[2].replace(/'/g,"'")+"'")+(L?"":" data-handler='selectDay' data-event='click' data-month='"+A.getMonth()+"' data-year='"+A.getFullYear()+"'")+">"+(F&&!_?" ":L?"<span class='ui-state-default'>"+A.getDate()+"</span>":"<a class='ui-state-default"+(A.getTime()===B.getTime()?" ui-state-highlight":"")+(A.getTime()===G.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+"' href='#'>"+A.getDate()+"</a>")+"</td>",A.setDate(A.getDate()+1),A=this._daylightSavingAdjust(A);T+=W+"</tr>"}Z++,Z>11&&(Z=0,te++),T+="</tbody></table>"+(X?"</div>"+(U[0]>0&&C===U[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),x+=T}y+=x}return y+=l,t._keyEvent=!1,y},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var h,l,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(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,y+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",c=0;12>c;c++)(!h||c>=s.getMonth())&&(!l||n.getMonth()>=c)&&(y+="<option value='"+c+"'"+(c===e?" selected='selected'":"")+">"+r[c]+"</option>");y+="</select>"}if(v||(b+=y+(!o&&m&&_?"":" ")),!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&&_?"":" ")+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,h=this._get(t,"yearRange");return h&&(i=h.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.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var _=!1;t(document).on("mouseup",function(){_=!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(!_){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(),_=!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,_=!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.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]),h=t.pageX,l=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]&&(h=i[0]+this.offset.click.left),t.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),t.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,l=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((h-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,h=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&&(h=this.originalPageX),"x"===a.axis&&(l=this.originalPageY)),{top:l-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:h-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,h,l,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--)h=s.snapElements[d].left-s.margins.left,l=h+s.snapElements[d].width,c=s.snapElements[d].top-s.margins.top,u=c+s.snapElements[d].height,h-g>_||m>l+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(h-_),r=g>=Math.abs(l-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:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).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(h-m),r=g>=Math.abs(l-_),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:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-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.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,h=this._change[o];return this._updatePrevProperties(),h?(i=h.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,h,l=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,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.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,h=this.originalPosition.top+this.originalSize.height,l=/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&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-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,h={width:i.size.width-r,height:i.size.height-a},l=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(h,c&&l?{top:c,left:l}:{}),{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,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.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]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.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,h=a.containerOffset,l=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=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.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-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.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(),h=a.outerWidth()-e.sizeDiff.width,l=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:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),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,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,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=h,_&&(p+=l),v&&(f+=c),g&&(p-=l),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-l)&&(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-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable,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(" ")},_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(),h=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"+(h>=0?"+":"")+h,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.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)&&v(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 v=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,h=a+e.helperProportions.height,l=i.offset.left,c=i.offset.top,u=l+i.proportions().width,d=c+i.proportions().height;switch(s){case"fit":return o>=l&&u>=r&&a>=c&&d>=h;case"intersect":return o+e.helperProportions.width/2>l&&u>r-e.helperProportions.width/2&&a+e.helperProportions.height/2>c&&d>h-e.helperProportions.height/2;case"pointer":return t(n.pageY,c,i.proportions().height)&&t(n.pageX,l,i.proportions().width);case"touch":return(a>=c&&d>=a||h>=c&&d>=h||c>a&&h>d)&&(o>=l&&u>=o||r>=l&&u>=r||l>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&&v(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=v(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.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.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,h=e.pageY;return o>r&&(i=r,r=o,o=i),a>h&&(i=h,h=a,a=i),this.helper.css({left:o,top:a,width:r-o,height:h-a}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),l=!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?l=!(c.left>r||o>c.right||c.top>h||a>c.bottom):"fit"===n.tolerance&&(l=c.left>o&&r>c.right&&c.top>a&&h>c.bottom),l?(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.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(" ")},_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,h,l,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"),h=o.offset(),l=!t(e.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:e.pageX-h.left-o.width()/2,top:e.pageY-h.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,h=this,l=this._animateOff?!1:r.animate,c={};this._hasMultipleValues()?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),c["horizontal"===h.orientation?"left":"bottom"]=i+"%",t(this).stop(1,1)[l?"animate":"css"](c,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"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)[l?"animate":"css"](c,r.animate),"min"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:100-i+"%"},r.animate),"min"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"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.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,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,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&&h>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=[],h=[],l=this._connectWith();if(l&&e)for(s=l.length-1;s>=0;s--)for(o=t(l[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&h.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(h.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=h.length-1;s>=0;s--)h[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,h,l,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,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,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> </td>",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,h,l,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]&&(h=this.items[s].item.offset()[a],l=!1,e[u]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(e[u]-h)&&(n=Math.abs(e[u]-h),o=this.items[s],this.direction=l?"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,h=/(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():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?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.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"),h=t(s).closest("li"),l=h.attr("aria-controls");e._isLocal(s)?(n=s.hash,a=n.substring(1),o=e.element.find(e._sanitizeSelector(n))):(a=h.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)),l&&h.data("ui-tabs-aria-controls",l),h.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,h=r?t():this._getPanelForTab(o),l=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:l,newTab:r?t():o,newPanel:h};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(),l.length||h.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),h.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},h=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),h(n,e)},1)}).fail(function(t,e){setTimeout(function(){h(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){l.of=t,a.is(":hidden")||a.position(l)}var o,a,r,h,l=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(),h=t("<div>").html(a.find(".ui-tooltip-content").html()),h.removeAttr("name").find("[name]").removeAttr("name"),h.removeAttr("id").find("[id]").removeAttr("id"),h.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(l.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});PKBA#]�P�Njj-system/helixultimate/assets/js/admin/media.jsnu�[���/** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery((function(e){e(".hu-media-picker").on("click",(function(a){a.preventDefault();var t=this,i="id",o="";void 0!==e(this).data("id")?(i="id",o=e(this).data("id")):void 0!==e(this).data("target")&&(i="data",o=e(this).data("target")),e(this).helixUltimateModal({target_type:i,target:o});e.ajax({type:"POST",data:{action:"view-media",option:"com_ajax",helix:"ultimate",request:"task",format:"json"},beforeSend:function(){e(t).find(".fa").removeClass("fa-picture-o").addClass("fa-spinner fa-spin")},success:function(a){var i=e.parseJSON(a);e(t).find(".fa").removeClass("fa-spinner fa-spin").addClass("fa-picture-o"),i.status?(e(".hu-modal-breadcrumbs").html(i.breadcrumbs),e(".hu-modal-inner").html(i.output)):(e(".hu-modal-overlay, .hu-modal").remove(),e("body").addClass("hu-modal-open"),alert(i.output))},error:function(){alert("Somethings wrong, Try again")}})})),e(document).on("dblclick",".hu-media-folder",(function(a){a.preventDefault();var t={action:"view-media",option:"com_ajax",helix:"ultimate",request:"task",path:e(this).data("path"),format:"json"};e.ajax({type:"POST",data:t,beforeSend:function(){e(".hu-media-selected").removeClass("hu-media-selected"),e(".hu-modal-actions-left").hide(),e(".hu-modal-actions-right").show(),e(".hu-modal-inner").html('<div class="hu-modal-preloader"><span class="fas fa-circle-notch fa-pulse fa-spin fa-3x fa-fw" aria-hidden="true"></span></div>')},success:function(a){var t=e.parseJSON(a);t.status?(e(".hu-modal-breadcrumbs").html(t.breadcrumbs),e(".hu-modal-inner").html(t.output)):alert(t.output)},error:function(){alert("Somethings wrong, Try again")}})})),e(document).on("click",".hu-media-breadcrumb-item > a",(function(a){a.preventDefault();var t={action:"view-media",option:"com_ajax",helix:"ultimate",request:"task",path:e(this).data("path"),format:"json"};e.ajax({type:"POST",data:t,beforeSend:function(){e(".hu-modal-inner").html('<div class="hu-modal-preloader"><span class="fas fa-circle-notch fa-pulse fa-spin fa-3x fa-fw" aria-hidden="true"></span></div>')},success:function(a){var t=e.parseJSON(a);t.status?(e(".hu-modal-breadcrumbs").html(t.breadcrumbs),e(".hu-modal-inner").html(t.output)):alert(t.output)},error:function(){alert("Somethings wrong, Try again")}})})),e(document).on("click",".hu-media-folder, .hu-media-image",(function(a){a.preventDefault(),e(".hu-media-selected").removeClass("hu-media-selected"),e(this).addClass("hu-media-selected"),e(this).hasClass("hu-media-folder")?e(".hu-modal-action-select").hide():e(".hu-modal-action-select").removeAttr("style"),e(".hu-modal-actions-left").show(),e(".hu-modal-actions-right").hide()})),e(document).on("click",".hu-modal-action-select",(function(a){a.preventDefault();var t=e(".hu-media-selected").data("path"),i=e(".hu-media-selected").data("preview"),o=e(".hu-modal").attr("data-target");if("data"==e(".hu-modal").attr("data-target_type")){e(".hu-options-modal").find('[data-attrname="'+o+'"]').val(t).trigger("change");const a=document.querySelector(`.hu-options-modal [data-attrname=${o}]`);Joomla.utils.triggerEvent(a,"change"),e(".hu-options-modal").find('[data-attrname="'+o+'"]').prev(".hu-image-holder").html('<img src="'+i+'" alt="">');let d=e(".hu-options-modal").find('[data-attrname="'+o+'"]').siblings(".hu-media-clear");d.hasClass("hide")&&d.removeClass("hide")}else{e("#"+o).val(t).trigger("change"),Joomla.utils.triggerEvent(document.querySelector(`#${o}`),"change"),e("#"+o).prev(".hu-image-holder").html('<img src="'+i+'" alt="">');let a=e("#"+o).siblings(".hu-media-clear");a.hasClass("hide")&&a.removeClass("hide")}e(".hu-modal-overlay, .hu-modal").remove(),e("body").removeClass("hu-modal-open")})),e(document).on("click",".hu-modal-action-cancel",(function(a){a.preventDefault(),e(".hu-media-selected").removeClass("hu-media-selected"),e(".hu-modal-actions-left").hide(),e(".hu-modal-actions-right").show()})),e(document).on("click",".action-hu-modal-close",(function(a){a.preventDefault(),e(".hu-modal-overlay, .hu-modal").remove(),e("body").removeClass("hu-modal-open")})),e(document).on("click",".hu-media-clear",(function(a){a.preventDefault(),e(this).parent().find("input").val("").trigger("change"),Joomla.utils.triggerEvent(a.target.parentNode.querySelector("input"),"change"),e(this).parent().find(".hu-image-holder").empty(),e(this).hasClass("hide")||e(this).addClass("hide")})),e(document).on("click",".hu-modal-action-delete",(function(a){a.preventDefault();var t="file";if(e(".hu-media-selected").length){if(t=e(".hu-media-selected").hasClass("hu-media-folder")?"folder":"file",confirm("Are you sure you want to delete this "+t+"?")){var i={action:"delete-media",option:"com_ajax",helix:"ultimate",request:"task",type:t,path:e(".hu-media-selected").data("path"),format:"json"};e.ajax({type:"POST",data:i,success:function(a){var t=e.parseJSON(a);t.status?(e(".hu-media-selected").remove(),e(".hu-modal-actions-left").hide(),e(".hu-modal-actions-right").show()):alert(t.message)},error:function(){alert("Somethings wrong, Try again")}})}}else alert("Please select a file or directory first to delete.")})),e(document).on("click",".hu-modal-action-new-folder",(function(a){a.preventDefault();var t=prompt("Please enter the name of the directory which should be created.");if(null==t||""==t);else{var i={action:"create-folder",option:"com_ajax",helix:"ultimate",request:"task",folder_name:t,path:e(".hu-media-breadcrumb-item.active").data("path"),format:"json"};e.ajax({type:"POST",data:i,success:function(a){var t=e.parseJSON(a);t.status?e(".hu-modal-inner").html(t.output):alert(t.message)},error:function(){alert("Somethings wrong, Try again")}})}})),e.fn.uploadMedia=function(a){a=e.extend({data:"",index:""},a);e.ajax({type:"POST",url:"index.php?option=com_ajax&helix=ultimate&request=task&action=upload-media&format=json&helix_id="+helixUltimateStyleId,data:a.data,contentType:!1,cache:!1,processData:!1,beforeSend:function(){var t='<li class="hu-media-progress '+a.index+'">';t+='<div class="hu-media-thumb">',t+='<div class="hu-progress"><div class="hu-progress-bar"></div></div>',t+="</div>",t+='<div class="hu-media-label"><span class="fas fa-circle-notch fa-spin" aria-hidden="true"></span> <span class="hu-media-upload-percentage"></span>Uploading...</div>',t+="</li>",e("#hu-media-manager").animate({scrollTop:e("#hu-media-manager").prop("scrollHeight")},1e3),e(".hu-media").append(t)},success:function(t){var i=e.parseJSON(t);i.status?e("."+a.index).removeClass().addClass("hu-media-image").attr("data-path",i.path).attr("data-preview",i.src).html(i.output):(e("."+a.index).remove(),alert(i.message))},xhr:function(){return myXhr=e.ajaxSettings.xhr(),myXhr.upload?myXhr.upload.addEventListener("progress",(function(t){e("."+a.index).find(".hu-progress-bar").css("width",Math.floor(t.loaded/t.total*100)+"%"),e("."+a.index).find(".hu-media-upload-percentage").text(Math.floor(t.loaded/t.total*100)+"% ")}),!1):alert("Uploadress is not supported."),myXhr}})},e(document).on("click",".hu-modal-action-upload",(function(a){a.preventDefault(),e("#hu-file-input").click()})),e(document).on("change","#hu-file-input",(function(a){a.preventDefault();var t=e(this),o=e(this).prop("files");for(i=0;i<o.length;i++){var d=o[i].name.split(".").pop().toLowerCase();if("svg"!==d)if("png"==d||"jpg"==d||"jpeg"==d||"webp"==d||"gif"==d){var r=new FormData;r.append("file",o[i]),r.append("path",e(".hu-media-breadcrumb-item.active").data("path")),r.append("index","media-id-"+Math.floor(1e6*Math.random()+1)),e(this).uploadMedia({data:r,index:"media-id-"+Math.floor(1e6*Math.random()+1)})}else alert(Joomla.Text._("COM_SPPAGEBUILDER_MEDIA_MANAGER_FILE_NOT_SUPPORTED","File not supported"));else alert(Joomla.Text._("HELIX_ULTIMATE_MEDIA_SVG_NOT_SUPPORTED_FOR_UPLOAD","SVG is not supported for upload. Upload via Joomla Media, then select the file here."))}t.val("")}))}));PKBA#]`NŜ�,�,.system/helixultimate/assets/js/admin/layout.jsnu�[���/** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery((function(t){function e(){let e=-1,n=-1;t("#hu-layout-builder").sortable({placeholder:"ui-state-highlight",forcePlaceholderSize:!0,axis:"y",opacity:1,tolerance:"pointer",start(t,o){e=o.item.index()},stop(t,a){n=a.item.index(),e!==n&&(o(),Joomla.HelixToaster.success("Rows position changed!","Layout Settings"))}}).disableSelection(),t(".hu-layout-section").find("[data-hu-layout-row]").rowSortable()}function o(){var e;t("#layout").val(JSON.stringify((e=[],t("#hu-layout-builder").find(".hu-layout-section").each((function(o){var n=t(this),a=o,i=n.data();delete i.sortableItem;var l=n.find(".hu-column-layout.active").data("layout"),s=12;12!=l&&(s=l.split(",").join("")),e[a]={type:"row",layout:s,settings:i,attr:[]},n.find(".hu-layout-column").each((function(o){var n=o,i=t(this).data();delete i.sortableItem,e[a].attr[n]={type:"sp_col",settings:i}}))})),e))).trigger("change")}t(document).on("click",".hu-add-columns",(function(e){e.preventDefault(),e.stopPropagation(),t(this).closest("li").find(".hu-column-list").slideToggle(300)})),t(document).on("click",".hu-column-layout:not(.hu-layout-custom-btn)",(function(){t(this).closest(".hu-column-list").slideUp(300)})),t.fn.rowSortable=function(){let e=-1,n=-1;t(this).sortable({placeholder:"ui-state-highlight",forcePlaceholderSize:!0,axis:"x",opacity:1,tolerance:"pointer",start(o,n){t(".hu-layout-section [data-hu-layout-row]").find(".ui-state-highlight").addClass(t(n.item).attr("class")),t(".hu-layout-section [data-hu-layout-row]").find(".ui-state-highlight").css("height",t(n.item).outerHeight()),e=n.item.index()},stop(t,a){n=a.item.index(),e!==n&&(o(),Joomla.HelixToaster.success("Columns position changed!","Layout Settings"))}}).disableSelection()},e(),t.fn.setInputValue=function(e){"checkbox"==this.attr("type")?"1"==e.field?this.attr("checked","checked"):this.removeAttr("checked"):this.hasClass("input-select")?(this.val(e.field),this.trigger("liszt:updated"),this.trigger("chosen:updated")):this.hasClass("input-media")?(e.field&&($imgParent=this.parent(".media"),$imgParent.find("img.media-preview").each((function(){t(this).attr("src",layoutbuilder_base+e.field)}))),this.val(e.field)):this.val(e.field),"column_type"==this.data("attrname")&&"component"==this.val()&&t(".form-group.name").hide()},t.fn.getInputValue=function(){return"checkbox"==this.attr("type")?this.prop("checked")?"1":"0":this.val()},t.fn.initColorPicker=function(){Joomla.initColorPicker(this.find(".minicolors"))},t(document).on("click",".hu-row-options",(function(e){e.preventDefault(),t(this).helixUltimateOptionsModal({flag:"row-setting",title:"<span class='fas fa-cogs hu-mr-2'></span> Row Options",class:"hu-modal-small"}),t(".hu-layout-section").removeClass("row-active"),$parent=t(this).closest(".hu-layout-section"),$parent.addClass("row-active"),t("#hu-row-settings").find("select.hu-input").each((function(){t(this).chosen("destroy")}));var o=t("#hu-row-settings").clone(!0);o.find(".hu-input-color").each((function(){t(this).addClass("minicolors")})),o.find("select.hu-input").each((function(){t(this).chosen({width:"100%"})})),(o=t(".hu-options-modal-inner").html(o.removeAttr("id").addClass("hu-options-modal-content"))).find(".hu-input").each((function(){var e=t(this),o=$parent.data(e.data("attrname"));if(e.setInputValue({field:o}),e.hasClass("hu-input-media")&&o){e.prev(".hu-image-holder").html('<img src="'+e.data("baseurl")+o+'" alt="">');let t=e.siblings(".hu-media-clear");t.hasClass("hide")&&t.removeClass("hide")}})),o.initColorPicker()})),t(document).on("click",".hu-column-options",(function(e){e.preventDefault(),t(this).helixUltimateOptionsModal({flag:"column-setting",title:"<span class='fas fa-cog'></span> Column Options",class:"hu-modal-small"}),t(".hu-layout-column").removeClass("column-active"),$parent=t(this).closest(".hu-layout-column"),$parent.addClass("column-active"),t("#hu-column-settings").find("select.hu-input").each((function(){t(this).chosen("destroy")}));var o=t("#hu-column-settings").clone(!0);o.find(".hu-input-color").each((function(){t(this).addClass("minicolors")})),o=t(".hu-options-modal-inner").html(o.removeAttr("id").addClass("hu-options-modal-content"));var n=!0;o.find(".hu-input").each((function(){var e=t(this),o=e.data("attrname"),a=$parent.data(e.data("attrname"));e.setInputValue({field:a}),("name"==o&&"right"==a||"name"==o&&"left"==a)&&(n=!1),n&&"sticky_position"==o&&(e.prop("checked")&&e.prop("checked",!1),e.closest(".control-group").hide())})),o.find("select.hu-input").each((function(){t(this).chosen({width:"100%"})})),o.initColorPicker(),t('select[data-attrname="name"]').chosen().on("change",(function(){var e=t(this).val();"right"==e||"left"==e?t(this).closest(".control-group").next().show():(t(this).closest(".control-group").next().hide(),t(this).closest(".control-group").next().find(".hu-input-sticky_position").prop("checked",!1))}))})),t(".hu-input-column_type").change((function(e){var n=t(this).closest(".hu-modal-content"),a=!1;if(t("#hu-layout-builder").find(".hu-layout-column").not(".column-active").each((function(e,o){if("1"==t(this).data("column_type"))return a=!0,!1})),a)return alert("Component Area Taken"),t(this).prop("checked",!1),n.children(".control-group.name").slideDown("400"),!1;t(this).attr("checked")?(t(".hu-layout-column.column-active").find(".hu-column").addClass("hu-column-component"),n.children(".control-group.name").slideUp("400")):(t("#hu-layout-builder").find(".hu-column-component").removeClass("hu-column-component"),n.children(".control-group.name").slideDown("400")),o()})),t(document).on("click",".hu-settings-apply",(function(e){switch(e.preventDefault(),t(this).data("flag")){case"row-setting":t(".hu-options-modal-content").find(".hu-input").each((function(){var e=t(this),o=t(".row-active"),n=e.data("attrname");if(o.removeData(n),"name"==n){var a=e.val();""==a||null==a?t(".row-active .hu-section-title").text("Section Header"):t(".row-active .hu-section-title").text(e.val())}o.data(n,e.getInputValue())})),t(".hu-options-modal-overlay, .hu-options-modal").remove(),t("body").removeClass("hu-options-modal-open");break;case"column-setting":var n=!1;t(".hu-options-modal-content").find(".hu-input").each((function(){var e=t(this),o=t(".column-active"),a=e.data("attrname"),i=e.val();o.removeData(a),"column_type"==a&&t(this).attr("checked")?(n=!0,t(".column-active .hu-column-title").text("Component")):"name"==a&&1!=n&&(""!=i&&null!=i||(i="none"),t(".column-active .hu-column-title").text(i)),o.data(a,e.getInputValue())})),t(".hu-options-modal-overlay, .hu-options-modal").remove(),t("body").removeClass("hu-options-modal-open");break;case"menu-row-setting":case"menu-col-setting":t(".hu-options-modal-overlay, .hu-options-modal").remove(),t("body").removeClass("hu-options-modal-open");break;default:alert("You are doing somethings wrongs. Try again")}o(),Joomla.HelixToaster.success("Changes applied successfully!","Layout Settings")})),t(document).on("click",".hu-settings-cancel, .action-hu-options-modal-close",(function(e){e.preventDefault(),t(".hu-options-modal-overlay, .hu-options-modal").remove(),t("body").removeClass("hu-options-modal-open")})),t(document).on("click",".hu-column-layout",(function(n){n.preventDefault();var a=t(this),i=a.data("type");if((!a.hasClass("active")||"custom"==i)&&"custom"!==i){var l=a.closest(".hu-column-list"),s=a.closest(".hu-layout-section"),u=l.find(".active").data("layout"),c=a.data("layout"),h=["12"];12!=u&&u.split("+"),12!=c&&(h=c.split("+"));var r=[],d=[];s.find(".hu-layout-column").each((function(e,o){r[e]=t(this).html();var n=t(this).data();d[e]="object"==typeof n?t(this).data():""})),l.find(".active").removeClass("active"),a.addClass("active");for(var m="",p=0;p<h.length;p++){var f="";"object"!=typeof d[p]?d[p]={grid_size:h[p].trim(),column_type:0,name:"none"}:d[p].grid_size=h[p].trim(),t.each(d[p],(function(t,e){f+=" data-"+t+'="'+e+'"'})),m+='<div class="hu-layout-column col-'+h[p].trim()+'" '+f+">",r[p]?m+=r[p]:(m+='<div class="hu-column">',m+='<span class="hu-column-title">none</span>',m+='<a class="hu-column-options" href="#"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="3" fill="none"><path fill="#020B53" fill-rule="evenodd" d="M3 1.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm6 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM13.5 3a1.5 1.5 0 100-3 1.5 1.5 0 000 3z" clip-rule="evenodd" opacity=".4"/></svg></a>',m+="</div>"),m+="</div>"}$old_column=s.find(".hu-layout-column"),s.find("[data-hu-layout-row]").append(m),$old_column.remove(),e(),Joomla.HelixToaster.success("Grid pattern updated to <strong>"+h.join("+")+"</strong>","Layout Settings"),o()}})),t(document).on("click",".hu-layout-custom-btn",(function(e){e.preventDefault();t(this).closest(".hu-column-list").find(".hu-layout-custom").slideToggle(300)})),t(document).on("click",".hu-layout-custom-apply",(function(n){n.preventDefault();let a=t(this).closest(".hu-column-list").find(".hu-layout-custom-btn"),i=a.closest(".hu-column-list"),l=a.closest(".hu-layout-section"),s=i.find(".active").data("layout"),u=["12"],c=column=t(this).closest("div").find("input").val()||"12",h=["12"];12!=s&&(u=s.split("+")),12!=c&&(h=c.split("+"));var r=column.split("+");if(12!=r.reduce((function(t,e){return Number(t)+Number(e)})))return void alert("Invalid grid pattern!");h=r,a.data("layout",column).attr("data-layout",column);var d=[],m=[];l.find(".hu-layout-column").each((function(e,o){d[e]=t(this).html();var n=t(this).data();m[e]="object"==typeof n?t(this).data():""})),i.find(".active").removeClass("active"),a.addClass("active");let p="";for(let e=0;e<h.length;e++){let o="";"object"!=typeof m[e]?m[e]={grid_size:h[e].trim(),column_type:0,name:"none"}:m[e].grid_size=h[e].trim(),t.each(m[e],(function(t,e){o+=" data-"+t+'="'+e+'"'})),p+='<div class="hu-layout-column col-'+h[e].trim()+'" '+o+">",d[e]?p+=d[e]:(p+='<div class="hu-column">',p+='<span class="hu-column-title">none</span>',p+='<a class="hu-column-options" href="#"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="3" fill="none"><path fill="#020B53" fill-rule="evenodd" d="M3 1.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm6 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM13.5 3a1.5 1.5 0 100-3 1.5 1.5 0 000 3z" clip-rule="evenodd" opacity=".4"/></svg></a>',p+="</div>"),p+="</div>"}$old_column=l.find(".hu-layout-column"),l.find("[data-hu-layout-row]").append(p),$old_column.remove(),e(),Joomla.HelixToaster.success("Grid pattern updated to <strong>"+h.join("+")+"</strong>","Layout Settings"),o(),a.closest(".hu-column-list").slideUp(300)})),t(document).on("click",".hu-add-row",(function(n){n.preventDefault();var a=t(this).closest(".hu-layout-section"),i=t("#hu-layout-section").clone(!0);i.addClass("hu-layout-section").removeAttr("id"),t(i).insertAfter(a),e(),Joomla.HelixToaster.success("New row added!","Layout Settings"),o()})),t(document).on("click",".hu-remove-row",(function(e){e.preventDefault(),1==confirm("Click Ok button to delete Row, Cancel to leave.")&&t(this).closest(".hu-layout-section").slideUp(500,(function(){t(this).remove(),Joomla.HelixToaster.error("Row is removed!","Layout Settings"),o()}))})),t(document).on("click",".remove-media",(function(){t(this).parent(".media").find("img.media-preview").each((function(){t(this).attr("src",""),t(this).closest(".image-preview").css("display","none")})),o()}))}));PKBA#]9)Z?QQ6system/helixultimate/assets/js/admin/menu.generator.jsnu�[���/** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery((function(e){function a(){e(".hu-megamenu-item-list").sortable({connectWith:".hu-megamenu-item-list",items:" .hu-megamenu-item",placeholder:"drop-highlight",start:function(e,a){a.placeholder.height(a.item.height())},stop:function(e,a){}}).disableSelection(),e(".hu-megamenu-module-list").sortable({connectWith:".hu-megamenu-item-list",items:" .hu-megamenu-draggable-module",placeholder:"drop-highlight",helper:"clone",start:function(e,a){a.placeholder.height(a.item.height())},update:function(t,n){var u=n.item.text(),o='<div class="hu-megamenu-item-module"><div class="hu-megamenu-item-module-title"><a href="javascript:;" class="hu-megamenu-remove-module"><span class="fas fa-times" aria-hidden="true"></span></a><span>'+u+"</span></div></div>";n.item.removeAttr("style class").addClass("hu-megamenu-item").html(o),n.item.clone().insertAfter(n.item.html('<span class="fas fa-arrows-alt" aria-hidden="true"></span> '+u).removeAttr("class").addClass("hu-megamenu-draggable-module")),e(this).sortable("cancel"),a()}}).disableSelection(),e(".hu-megamenu-row").sortable({start:function(e,a){a.placeholder.height(a.item.height()),a.placeholder.width(a.item.width()-50)},items:".hu-megmenu-col",handle:".hu-action-move-column",placeholder:"drop-col-highlight",stop:function(e,a){}}),e("#hu-megamenu-layout").sortable({start:function(e,a){a.placeholder.height(a.item.height()),a.placeholder.width(a.item.width()-50)},items:".hu-megamenu-row",handle:".hu-action-move-row",placeholder:"drop-highlight",stop:function(e,a){}}),e(document).on("click",".hu-megamenu-remove-module",(function(a){a.preventDefault(),e(this).closest(".hu-megamenu-item").remove()}))}e("#attrib-helixultimatemegamenu").find(".control-group").first().find(".control-label").remove(),e("#attrib-helixultimatemegamenu").find(".control-group").first().find(">.controls").removeClass().addClass("megamenu").unwrap(),e(document).on("click","#hu-megamenu-toggler",(function(a){var t=e(this).is(":checked");e("#hu-megamenu-layout").data("megamenu",t),t?(e(".hu-megamenu-field-control, .hu-megamenu-sidebar").removeClass("hide-menu-builder"),e(".hu-dropdown-field-control").addClass("hide-menu-builder")):(e(".hu-megamenu-field-control, .hu-megamenu-sidebar").addClass("hide-menu-builder"),e(".hu-dropdown-field-control").removeClass("hide-menu-builder"))})),e(document).on("change","#hu-megamenu-width",(function(a){e("#hu-megamenu-layout").data("width",e(this).val())})),e(document).on("change","#hu-megamenu-alignment",(function(a){e("#hu-megamenu-layout").data("menualign",e(this).val())})),e(document).on("click","#hu-megamenu-title-toggler",(function(a){e("#hu-megamenu-layout").data("showtitle",e(this).is(":checked"))})),e(document).on("change","#hu-megamenu-dropdown",(function(a){e("#hu-megamenu-layout").data("dropdown",e(this).val())})),e(document).on("change","#hu-megamenu-fa-icon",(function(a){e("#hu-megamenu-layout").data("faicon",e(this).val())})),e(document).on("change","#hu-megamenu-custom-class",(function(a){e("#hu-megamenu-layout").data("customclass",e(this).val())})),e(document).on("change","#hu-megamenu-menu-badge",(function(a){e("#hu-megamenu-layout").data("badge",e(this).val())})),e(document).on("change","#hu-megamenu-badge-position",(function(a){e("#hu-megamenu-layout").data("badge_position",e(this).val())})),e(document).on("change","#hu-menu-badge-bg-color",(function(a){e("#hu-megamenu-layout").data("badge_bg_color",e(this).val())})),e(document).on("change","#hu-menu-badge-text-color",(function(a){e("#hu-megamenu-layout").data("badge_text_color",e(this).val())})),document.adminForm.onsubmit=function(a){var t=[];e("#hu-megamenu-layout").find(".hu-megamenu-row").each((function(a){var n=e(this),u=a;t[u]={type:"row",attr:[]},n.find(".hu-megmenu-col").each((function(a){var n=e(this),o=a,i=n.attr("data-grid");t[u].attr[o]={type:"column",colGrid:i,menuParentId:"",moduleId:"",items:[]};var m="";n.find("h4").each((function(a,t){m+=e(this).data("current_child")+","})),m&&(m=m.slice(",",-1),t[u].attr[o].menuParentId=m);var l="";n.find(".hu-megamenu-item").each((function(a,n){l+=e(this).data("mod_id")+",";var i=e(this).data("type"),m=e(this).data("mod_id");t[u].attr[o].items[a]={type:i,item_id:m}})),l&&(l=l.slice(",",-1),t[u].attr[o].moduleId=l)}))}));var n=e("#hu-megamenu-layout").data(),u={width:n.width||"0",menuitem:n.menuitem,menualign:n.menualign,megamenu:n.megamenu,showtitle:n.showtitle,faicon:n.faicon,customclass:n.customclass,dropdown:n.dropdown,badge:n.badge,badge_position:n.badge_position,badge_bg_color:n.badge_bg_color,badge_text_color:n.badge_text_color,layout:t};e("#jform_params_helixultimatemenulayout").val(JSON.stringify(u))},e(document).on("click","#hu-choose-megamenu-layout",(function(a){a.preventDefault(),e("#hu-megamenu-layout-modal").toggle()})),e(document).on("click",".hu-megamenu-grids",(function(t){t.preventDefault();var n=e(this).attr("data-layout"),u='<div class="hu-megamenu-row">';u+='<div class="hu-megamenu-row-actions clearfix">',u+='<div class="hu-action-move-row">',u+='<span class="fas fa-sort" aria-hidden="true"></span> Row',u+="</div>",u+='<a href="#" class="hu-action-detele-row"><span class="far fa-trash-alt" aria-hidden="true"></span></a>',u+="</div>",u+='<div class="hu-row">';var o='<div class="hu-megmenu-col hu-col-sm-{col}" data-grid="{grid}">';o+='<div class="hu-megamenu-column">',o+='<div class="hu-megamenu-column-actions">',o+='<span class="hu-action-move-column"><span class="fas fa-arrows-alt" aria-hidden="true"></span> Column</span>',o+="</div>",o+='<div class="hu-megamenu-item-list"></div>',o+="</div>",o+="</div>";var m="";if(12!=n){var l=n.split("+");for(i=0;i<l.length;i++)m+=o.replace("{col}",l[i]).replace("{grid}",l[i])}else m+=o.replace("{col}",12).replace("{grid}",12);u+=m,u+="</div>",u+="</div>",e("#hu-megamenu-layout").append(u),e(this).closest("#hu-megamenu-layout-modal").hide(),a()})),a(),e(document).on("click",".hu-action-detele-row",(function(a){a.preventDefault(),e(this).closest(".hu-megamenu-row").remove()}))}));PKBA#]��4system/helixultimate/assets/js/admin/blog-options.jsnu�[���/** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery((function(e){function a(e,a){return"undefined"!=typeof Joomla&&Joomla.Text?Joomla.Text._(e,a):a}function t(){var a={},t="undefined"!=typeof Joomla?Joomla.getOptions("csrf.token"):null;return t?(a[t]=1,a):(e('#adminForm input[type="hidden"]').each((function(){"1"===this.value&&/^[a-f0-9]{32}$/i.test(this.name)&&(a[this.name]="1")})),a)}function r(e){if(e&&"object"==typeof e)return e;if("string"!=typeof e||!e.length)return null;try{return JSON.parse(e)}catch(e){return null}}function l(){var a=e("#jform_id");if(a.length){var t=parseInt(a.val(),10);if(t>0)return t}var i=window.location.search.match(/(?:[?&](?:id|a_id)=)(\d+)/);return i?parseInt(i[1],10):0}function o(e){e.find(".hu-image-upload-wrapper").empty(),e.removeClass("hu-image-field-has-image").addClass("hu-image-field-empty"),e.find("#jform_attribs_helix_ultimate_image").val("")}e(document).ready((function(){var a,t=e("#myTabTabs").find(">li").first();e('a[href="#attrib-helix_ultimate_blog_options"]').parent().insertAfter(t),(a=e("#jform_attribs_helix_ultimate_article_format label.active")).length>0&&a.click()})),e(".hu-image-field").each((function(i,l){var o=e(l);o.find(".btn-hu-image-upload").on("click",(function(e){e.preventDefault(),o.find(".hu-image-upload").click()})),o.find(".hu-image-upload").on("change",(function(i){i.preventDefault();var l=e(this),n=e(this).prop("files")[0],s=new FormData,d=t();s.append("option","com_ajax"),s.append("helix","ultimate"),s.append("request","task"),s.append("action","upload-blog-image"),s.append("format","json"),Object.keys(d).forEach((function(e){s.append(e,d[e])})),n.type.match(/image.*/)&&(s.append("image",n),e.ajax({type:"POST",data:s,dataType:"json",contentType:!1,cache:!1,processData:!1,beforeSend:function(){l.prop("disabled",!0),o.find(".btn-hu-image-upload").attr("disabled","disabled");var a=e('<div class="hu-image-item-loader"><div class="progress" id="upload-image-progress"><div class="bar"></div></div></div>');o.find(".hu-image-upload-wrapper").addClass("loading").html(a)},success:function(t){var i=r(t);if(!i)return o.find(".hu-image-upload-wrapper").removeClass("loading").empty(),void alert(a("HELIX_ULTIMATE_UPLOAD_IMAGE_FAILED","Unable to upload image. Please try again."));i.status?o.find(".hu-image-upload-wrapper").removeClass("loading").empty().html(i.output):o.find(".hu-image-upload-wrapper").removeClass("loading").empty();var n=o.find(".hu-image-upload-wrapper").find(">img");n.length?(e(".hu-image-field").removeClass("hu-image-field-empty").addClass("hu-image-field-has-image"),o.find("#jform_attribs_helix_ultimate_image").val(n.data("src"))):(e(".hu-image-field").removeClass("hu-image-field-has-image").addClass("hu-image-field-empty"),o.find("#jform_attribs_helix_ultimate_image").val("")),l.val(""),l.prop("disabled",!1),o.find(".btn-hu-image-upload").removeAttr("disabled")},xhr:function(){return myXhr=e.ajaxSettings.xhr(),myXhr.upload?myXhr.upload.addEventListener("progress",(function(a){e("#upload-image-progress").find(".bar").css("width",Math.floor(a.loaded/a.total*100)+"%")}),!1):alert(a("HELIX_ULTIMATE_UPLOAD_PROGRESS_NOT_SUPPORTED","Upload progress is not supported.")),myXhr},error:function(){o.find(".hu-image-upload-wrapper").empty(),l.val("")}})),l.val("")}))})),e(document).on("click",".btn-hu-image-remove",(function(i){i.preventDefault();var n=e(this).closest(".hu-image-field"),s=l();if(!0===confirm(a("JGLOBAL_CONFIRM_DELETE","Are you sure you want to delete?"))){if(s<=0)return void o(n);var d=e.extend({option:"com_ajax",helix:"ultimate",request:"task",action:"remove-blog-image",id:s,src:n.find(".hu-image-upload-wrapper").find(">img").attr("data-src")||n.find(".hu-image-upload-wrapper").find(">img").data("src"),format:"json"},t());e.ajax({type:"POST",data:d,dataType:"json",success:function(e){var t=r(e);t?t.status?o(n):alert(t.output||a("HELIX_ULTIMATE_REMOVE_IMAGE_FAILED","Unable to remove image. Please try again.")):alert(a("HELIX_ULTIMATE_REMOVE_IMAGE_FAILED","Unable to remove image. Please try again."))},error:function(){alert(a("HELIX_ULTIMATE_REMOVE_IMAGE_FAILED","Unable to remove image. Please try again."))}})}})),e(".btn-hu-gallery-item-upload").on("click",(function(a){a.preventDefault(),e("#hu-gallery-item-upload").click()})),e("#hu-gallery-item-upload").on("change",(function(l){l.preventDefault();var o=e(this),n=e(this).prop("files");Joomla.getOptions("system.paths");for(i=0;i<n.length;i++){var s=n[i].name.split(".").pop().toLowerCase();if("png"==s||"jpg"==s||"jpeg"==s||"gif"==s||"svg"==s||"webp"==s){let l="gallery-id-"+Math.floor(1e6*Math.random()+1);var d=new FormData,u=t();d.append("option","com_ajax"),d.append("helix","ultimate"),d.append("request","task"),d.append("action","upload-blog-image"),d.append("image",n[i]),d.append("index",l),d.append("gallery",!0),d.append("format","json"),Object.keys(u).forEach((function(e){d.append(e,u[e])})),e.ajax({type:"POST",data:d,dataType:"json",contentType:!1,cache:!1,processData:!1,beforeSend:function(){var a=e('<li class="hu-gallery-item loading" id="'+l+'"><div class="progress"><div class="bar"></div></div></li>');e(".hu-gallery-items").append(a)},success:function(t){var i=r(t);if(!i)return e("#"+l).remove(),void alert(a("HELIX_ULTIMATE_UPLOAD_GALLERY_IMAGE_FAILED","Unable to upload gallery image. Please try again."));i.status?e("#"+l).attr("data-src",i.data_src).removeClass("loading").empty().html(i.output):(e("#"+l).remove(),alert(i.output));let o=[];e(".hu-gallery-items").find(">.hu-gallery-item").each((function(a,t){o.push('"'+e(t).data("src")+'"')}));let n='{"helix_ultimate_gallery_images":['+o+"]}";e("#jform_attribs_helix_ultimate_gallery").val(n)},xhr:function(){return myXhr=e.ajaxSettings.xhr(),myXhr.upload?myXhr.upload.addEventListener("progress",(function(a){e("#"+l).find(".bar").css("width",Math.floor(a.loaded/a.total*100)+"%")}),!1):console.log(a("HELIX_ULTIMATE_UPLOAD_PROGRESS_NOT_SUPPORTED","Upload progress is not supported.")),myXhr}})}}o.val("")})),e(".hu-gallery-items").sortable({stop:function(a,t){let i=[];e(".hu-gallery-item").each((function(a,t){i.push('"'+e(t).data("src")+'"')}));let r='{"helix_ultimate_gallery_images":['+i+"]}";e("#jform_attribs_helix_ultimate_gallery").val(r)}}),e(document).on("click",".btn-hu-remove-gallery-image",(function(i){i.preventDefault();var o=e(this).parent(),n=l();if(!0===confirm(a("JGLOBAL_CONFIRM_DELETE","Are you sure you want to delete?"))){var s=function(){o.remove();let a=[];e(".hu-gallery-item").each((function(t,i){a.push('"'+e(i).data("src")+'"')}));let t='{"helix_ultimate_gallery_images":['+a+"]}";e("#jform_attribs_helix_ultimate_gallery").val(t)};if(n<=0)return void s();var d=e.extend({option:"com_ajax",helix:"ultimate",request:"task",action:"remove-blog-image",id:n,src:o.attr("data-src")||o.data("src"),format:"json"},t());e.ajax({type:"POST",data:d,dataType:"json",success:function(e){var t=r(e);t?t.status?s():alert(t.output||a("HELIX_ULTIMATE_REMOVE_GALLERY_IMAGE_FAILED","Unable to remove gallery image. Please try again.")):alert(a("HELIX_ULTIMATE_REMOVE_GALLERY_IMAGE_FAILED","Unable to remove gallery image. Please try again."))},error:function(){alert(a("HELIX_ULTIMATE_REMOVE_GALLERY_IMAGE_FAILED","Unable to remove gallery image. Please try again."))}})}}))}));PKBA#]H�iK**/system/helixultimate/assets/js/admin/details.jsnu�[���/** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery((function(o){o(".hu-options").unwrap(),o(".hu-options").prev().remove()}));PKBA#]�45system/helixultimate/assets/js/admin/devices-field.jsnu�[���jQuery(document).ready((function(e){let t=e(".helix-field"),i=t.find("input"),a=Joomla.getOptions("data")||{};t.length>0&&t.find(".helix-devices .device-btn").on("click",(function(d){d.preventDefault();let l=e(this).data("device");!function(t){const i={lg:"100%",md:`${a.breakpoints.tablet}px`,sm:`${a.breakpoints.mobile}px`},d={md:"desktop",sm:"tablet",xs:"mobile",desktop:"desktop",tablet:"tablet",mobile:"mobile"};e(`.hu-device[data-device=${d[t]}]`).parent().find(".active").removeClass("active"),e(`.hu-device[data-device=${d[t]}]`).addClass("active");e("#hu-template-preview").animate({width:i[t]},500,"linear")}(l),i.val(l).trigger("change"),t.find(".helix-devices .device-btn").each((function(){e(this).hasClass("active")&&e(this).removeClass("active")})),e(this).addClass("active")}))}));PKBA#]��Y�rr4system/helixultimate/assets/js/admin/treeSortable.jsnu�[���/** * Tree sortable jQuery library using jQuery UI sortable. * * @package TreeSortable * @license MIT * @author Sajeeb Ahamed */ var $=jQuery,treeSortable={options:{depth:20,treeSelector:"#hu-menu-tree",branchSelector:".hu-menu-tree-branch",dragHandlerSelector:".hu-branch-drag-handler",placeholderName:"hu-sortable-placeholder",childrenBusSelector:".hu-menu-children-bus",levelPrefix:"hu-branch-level",maxLevel:10},run(){this.jQuerySupplements(),this.initSorting()},getTreeEdge:()=>$(treeSortable.options.treeSelector).offset().left,pxToNumber:e=>new RegExp("px$","i").test(e)?1*e.slice(0,-2):0,numberToPx:e=>`${e}px`,jQuerySupplements(){const{options:e}=treeSortable,{levelPrefix:t}=e;$.fn.extend({getBranchLevel(){if(0===$(this).length)return 0;const{depth:t}=e,r=$(this).css("margin-left");return/(px)|(em)|(rem)$/i.test(r)?Math.floor(r.slice(0,-2)/t)+1:Math.floor(r/t)+1},updateBranchLevel(e,r=null){return this.each((function(){r=r||$(this).getBranchLevel()||1,$(this).removeClass(t+"-"+r).addClass(t+"-"+e)}))},shiftBranchLevel(e){return this.each((function(){let r=$(this).getBranchLevel()||1,l=r+e;$(this).removeClass(t+"-"+r).addClass(t+"-"+l)}))},getParent(){const{options:{branchSelector:e}}=treeSortable,t=$(this).getBranchLevel()||1;let r=$(this).prev(e);for(;r.length&&r.getBranchLevel()>=t;)r=r.prev(e);return r},getRootChildren(){const{options:{branchSelector:e,treeSelector:t,levelPrefix:r}}=treeSortable;return $(t).children(`${e}.${r}-1`)},getChildren(){const{options:{branchSelector:e}}=treeSortable;let t=$();return this.each((function(){let r=$(this).getBranchLevel()||1,l=$(this).next(e);for(;l.length&&l.getBranchLevel()>r;)t=t.add(l),l=l.next(e)})),t},nextBranch(){return $(this).next()},prevBranch(){return $(this).prev()},nextSibling(){const{options:{branchSelector:e}}=treeSortable;let t=$(this).getBranchLevel()||1,r=$(this).next(e),l=r.getBranchLevel();for(;r.length&&l>t;)r=r.next(e),l=r.getBranchLevel();return+l==+t?r:$()},prevSibling(){const{options:{branchSelector:e}}=treeSortable;let t=$(this).getBranchLevel()||1,r=$(this).prev(e),l=r.getBranchLevel();for(;r.length&&l>t;)r=r.prev(e),l=r.getBranchLevel();return l===t?r:$()},getSiblings(e=null){const{options:{treeSelector:t,branchSelector:r}}=treeSortable;e=e||$(this).getBranchLevel();let l=[],a=$(`${t} > ${r}`),h=this;return a.length&&a.each((function(){+$(this).getBranchLevel()==+e&&h[0]!==$(this)[0]&&l.push($(this))})),l}})},updateBranchZIndex(){const{options:{treeSelector:e,branchSelector:t}}=treeSortable,r=$(`${e} > ${t}`),l=r.length;r.length&&r.each((function(e){$(this).css("z-index",Math.max(1,l-e))}))},initSorting(){const{options:e,pxToNumber:t,numberToPx:r,updateBranchZIndex:l}=treeSortable,{treeSelector:a,dragHandlerSelector:h,placeholderName:n,childrenBusSelector:o}=e;let c=1,i=1,s=null,p=0,g=0,d=!1;$(a).sortable({handle:h,placeholder:n,items:"> *",start(e,l){const a=l.item.getBranchLevel();l.placeholder.updateBranchLevel(a),g=l.item.index(),i=a,s=l.item.find(o),s.append(l.item.next().getChildren());let n=s.outerHeight(),d=l.placeholder.css("margin-top");n+=n>0?t(d):0,n+=l.helper.outerHeight(),p=n,n-=2;let u=l.helper.find(h).outerWidth()-2;l.placeholder.css({height:n,width:u});const v=l.placeholder.nextBranch();v.css("margin-top",r(p)),l.placeholder.detach(),$(this).sortable("refresh"),l.item.after(l.placeholder),v.css("margin-top",0),c=a,$(".hu-menu-tree-branch .hu-menu-branch-path").hide()},sort(e,t){const{options:r,getTreeEdge:l}=treeSortable,{depth:a,maxLevel:h}=r;let n=l(),o=t.helper.offset().left,i=1,s=h,g=t.placeholder.prevBranch();g=g[0]===t.item[0]?g.prevBranch():g;let u=g.getBranchLevel();s=Math.min(u+1,h);let v=1;if(t.placeholder.nextSibling().length)v=t.placeholder.getBranchLevel()||1;else{v=t.placeholder.nextBranch().getBranchLevel()||1}i=Math.max(1,v);let m=Math.max(0,o-n),b=Math.floor(m/a)+1;if(b=Math.max(i,Math.min(b,s)),(e=>{let t=e.helper.offset().top+p,r=e.placeholder.nextBranch(),l=r.offset()||0,a=r.outerHeight();return t>l.top+a/3})(t)){let e=t.placeholder.nextBranch();e.getChildren().length&&(b=e.getBranchLevel()+1),e.after(t.placeholder),$(this).sortable("refreshPositions")}let f=t.item.getSiblings(b);if(f.length>0){let e=t.item.data("alias");if(d=f.some((t=>t.data("alias")===e)),d)return}var B,x;B=t.placeholder,x=b,B.updateBranchLevel(x),c=x},change(e,t){let r=t.placeholder.prevBranch();r=r[0]===t.item[0]?r.prevBranch():r;let l=r.getBranchLevel()||1;if(r.length){t.placeholder.detach();let e=r.getChildren();e&&e.length&&(l+=1),t.placeholder.updateBranchLevel(l),r.after(t.placeholder)}},stop(e,t){$(".hu-menu-tree-branch:not(.hu-branch-level-1) .hu-menu-branch-path").show(),d&&Joomla.HelixToaster.error(`Can't set the same alias <strong>${t.item.data("alias")}</strong> in the same menu level!`,"Error");const r=s.children().insertAfter(t.item);s.empty(),t.item.updateBranchLevel(c),r.shiftBranchLevel(c-i);t.item.find(".hu-branch-tools-list-megamenu").html(c>1?'<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" class="bi bi-gear" viewBox="0 0 16 16"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492zM5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0z"></path><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52l-.094-.319zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.377l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115l.094-.319z"></path></svg>':'<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" class="bi bi-grid-1x2" viewBox="0 0 16 16"><path d="M6 1H1v14h5V1zm9 0h-5v5h5V1zm0 9v5h-5v-5h5zM0 1a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V1zm9 0a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1h-5a1 1 0 0 1-1-1V1zm1 8a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h5a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1h-5z"></path></svg>'),c===i&&g===t.item.index()||$(document).trigger("sortCompleted",[t]),Joomla.utils.calculateSiblingDistances()}})}};Joomla.sortable=treeSortable;PKBA#]�� /system/helixultimate/assets/js/admin/presets.jsnu�[���/** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery((function(e){let t=e(".hu-presets #presets-data"),a=e(".hu-presets .hu-preset"),s=t.val();function n(n,o,r,l){s[o].data=n,console.log(n),t.val(JSON.stringify(s)),a.each((function(){let t=this;e(this).data("preset")===o&&Object.entries(n).forEach((function([a,s]){e(t).attr(`data-${a}`,s),e(t).data(a,s)}))})),r.html(l.find("> div")),window.purgeCss(),e(".hu-options-modal-overlay, .hu-options-modal").remove(),e("body").removeClass("hu-options-modal-open");let i=function(e){let t=Object.values(e).reduce((function(e,t){return e[t]=(e[t]||0)+1,e}),{}),a=0;return Object.entries(t).reduce((function(e,[t,s]){return s>=a&&(a=s,e=t),e}),"")}(n),u=e(`.hu-preset[data-preset=${o}]`);u.css({"background-color":i}),u.find(".hu-edit-preset").css({color:i}),e(`.hu-preset[data-preset=${o}]`).click()}"string"==typeof s&&s.length&&(s=JSON.parse(s)),e(document).on("click",".hu-edit-preset",(function(t){t.preventDefault(),t.stopPropagation();let a=e(this).data("preset_data")||"",{name:s,data:o}=a,r=e(`.hu-preset-container#${s}`),l=r.clone(!0);l.each((function(){e(this).find("input").removeAttr("id")})),e(this).helixUltimateOptionsModal({flag:"edit-presets",title:`<span class='fas fa-cogs hu-mr-2'></span> Edit Preset: ${s}`,class:`hu-modal-small edit-preset-modal modal-${s}`,applyBtnClass:"hu-save-preset",footerButtons:['<a href="#" class="hu-btn hu-btn-secondary helix-preset-reset hu-ml-auto"><span class="fas fa-sync-alt" aria-hidden="true"></span> Reset to Default</a>']}),e(".hu-options-modal-inner").html(l.removeAttr("id").removeAttr("style").addClass("hu-options-modal-content")),l.find("input.preset-control").each((function(){e(this).on("change",(function(t){t.preventDefault();let a=e(this).attr("name"),s=e(this).val();o[a]=s}))}));let i=e(`.edit-preset-modal.modal-${s}`).find(".hu-save-preset"),u=e(`.edit-preset-modal.modal-${s}`).find(".helix-preset-reset");i.length&&(i.on("click",(function(e){e.preventDefault(),n(o,s,r,l)})),u.on("click",(function(t){if(t.preventDefault(),window.confirm("Do you really want to reset your changes to default?")){n(JSON.parse(e("#default-values").val())[s],s,r,l)}})))}))}));PKBA#]���K�K6system/helixultimate/assets/js/admin/helix-ultimate.jsnu�[���/** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ window.addEventListener("DOMContentLoaded",(()=>{void 0!==Joomla.Showon&&void 0!==Joomla.Showon.initialise&&Joomla.Showon.initialise(document)})),jQuery((function(e){"use strict";var t=Joomla.getOptions("data")||{};let i=Joomla.getOptions("meta")||{};const a=localStorage||window.localStorage;let s=null;Joomla.initColorPicker=function(t,i={}){const a={animationSpeed:50,animationEasing:"swing",control:"hue",position:"bottom",theme:"bootstrap",keywords:"transparent, initial, inherit",letterCase:"uppercase"};e(t).each((function(){e(this).minicolors({...a,...i})}))};const o=()=>{let t=a.getItem("toolbarPosition")||{};t="string"==typeof t&&t.length>0&&JSON.parse(t);let i=e(".hu-container"),s=e("#hu-options-panel"),o=i.width(),n=s.width();t.left+n>o?t.left=o-n-20:t.left<0&&(t.left=20),t&&e(".hu-options-core").css({left:t.left+"px",top:t.top+"px"}),e(".hu-options-core").show()};o(),window.addEventListener("resize",o);window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;let n=document.getElementById("hu-template-preview");function l(){const e=n.contentWindow.location.href;e.length&&"about:blank"!==e&&(n.src=n.getAttribute("src"))}function r(){e("#layout").val(JSON.stringify(m())),f(),e(".hu-input-preset").val(JSON.stringify(e(".hu-preset.active").data()));let t=e("#hu-style-form").find("input, select, textarea").not(".internal-use-only").serializeArray(),i=!1;e.ajax({type:"POST",url:"index.php?option=com_ajax&request=task&helix=ultimate&id="+helixUltimateStyleId+"&action=draft-tmpl-style&format=json&helix_id="+helixUltimateStyleId,data:t,beforeSend:function(){Joomla.helixLoading(!0,!1),i=!0},success:function(t){var a=e.parseJSON(t);if(a.status){let e=document.getElementById("hu-template-preview");l(),e.addEventListener("load",(function(){i&&Joomla.helixLoading(!1,a.isDrafted),i=!1}))}},error:function(e){console.error("error: Something went wrong!",e),Joomla.HelixToaster.error("Error:"+e.message,"Error")}})}function c(t){const i=e(".hu-topbar-save-spinner");t?i.hasClass("hidden")&&(i.removeClass("hidden"),i.closest(".action-save-template").find("svg").hide()):i.hasClass("hidden")||(i.addClass("hidden"),i.closest(".action-save-template").find("svg").show())}function h(e,t,i,a){a!=i&&(i=a,e.closest(".controls").attr("data-currpoint",i),e.closest(".controls").data("currpoint",i),e.closest(".controls").hasClass("helix-input-touched")||e.closest(".controls").addClass("helix-input-touched"),r()),a==t&&e.closest(".controls").hasClass("helix-input-touched")&&e.closest(".controls").removeClass("helix-input-touched")}function d({name:t,parent:i,map:a,device:s}){["","_sm","_xs"].forEach((a=>{const s=e(`input[name=${t}${a}]`).closest(i);s.hasClass("field-hidden")||s.addClass("field-hidden")}));const o=`input[name=${t}${"md"===a[s]?"":"_"+a[s]}]`;e(o).closest(i).removeClass("field-hidden")}function u(i){const a={desktop:"100%",tablet:`${t.breakpoints.tablet}px`,mobile:`${t.breakpoints.mobile}px`,md:"100%",sm:`${t.breakpoints.tablet}px`,xs:`${t.breakpoints.mobile}px`},s={md:"desktop",sm:"tablet",xs:"mobile",desktop:"desktop",tablet:"tablet",mobile:"mobile"},o={desktop:"md",tablet:"sm",mobile:"xs"},n=e("#hu-template-preview");e(`.hu-device[data-device=${s[i]}]`).parent().find(".active").removeClass("active"),e(`.hu-device[data-device=${s[i]}]`).addClass("active"),["","-sm","-xs"].forEach((t=>{e(`.hu-webfont-size-field${t}`).closest(".hu-webfont-unit").removeClass("active")})),e("input.hu-webfont-size-field"+("md"===o[i]?"":"-"+o[i])).closest(".hu-webfont-unit").addClass("active"),d({name:"header_height",parent:".group-style-header",map:o,device:i}),d({name:"logo_height",parent:".group-style-logo",map:o,device:i}),n.animate({width:a[i]},300,"linear")}function p(){let t=e(".hu-options-core"),i=e(".hu-edit-panel.active-panel"),a=e("#hu-options-panel"),s=e(".hu-container"),o=a.offset(),n=a.width(),l=i.width(),r=s.width();o.left+n+10+l>r?(t.hasClass("hu-panel-position-right")&&t.removeClass("hu-panel-position-right"),t.addClass("hu-panel-position-left")):(t.hasClass("hu-panel-position-left")&&t.removeClass("hu-panel-position-left"),t.addClass("hu-panel-position-right"))}function f(){e(".hu-field-webfont").each((function(){var t=e(this),i={fontFamily:t.find(".hu-webfont-list").val(),fontSize:t.find("[name=hu-webfont-size-field]").val(),fontSize_sm:t.find("[name=hu-webfont-size-field-sm]").val(),fontSize_xs:t.find("[name=hu-webfont-size-field-xs]").val(),fontWeight:t.find(".hu-webfont-weight-list").val(),fontStyle:t.find(".hu-webfont-style-list").val(),fontSubset:t.find(".hu-webfont-subset-list").val(),fontColor:t.find(".hu-font-color-input").val(),fontLineHeight:t.find(".hu-font-line-height-input").val(),fontLetterSpacing:t.find("[name=hu-font-letter-spacing-input]").val(),textDecoration:t.find(".hu-text-decoration").val(),textAlign:t.find(".hu-text-align").val()};t.find(".hu-webfont-input").val(JSON.stringify(i))}))}function m(){var t=[];return e("#hu-layout-builder").find(".hu-layout-section").each((function(i){var a=e(this),s=i,o=a.data();delete o.sortableItem;var n=a.find(".hu-column-layout.active").data("layout"),l=12;12!=n&&(l=n.split(",").join("")),t[s]={type:"row",layout:l,settings:o,attr:[]},a.find(".hu-layout-column").each((function(i){var a=i,o=e(this).data();delete o.sortableItem,t[s].attr[a]={type:"sp_col",settings:o}}))})),t}Joomla.reloadPreview=l,n.addEventListener("load",(function(){let e=n.contentWindow.document,i=e.querySelector(".body-innerwrapper");e.querySelectorAll("a").forEach((e=>{let t=e.getAttribute("href")||"";if("#"===t||""===t)return;let i=new URLSearchParams(new URL(e.href).search);if(i.has("helixMode"))return;i.append("helixMode","edit");let a=e.href.split("?");a[1]=i.toString(),e.setAttribute("href",a.join("?"))})),e.body.classList.add("back-panel"),i&&(i.style.marginTop=`${t.topbarHeight}px`)})),e(document).on("keyup",(function(t){if(27===t.which){if(e(".hu-megamenu-popover").hasClass("show"))return void e(".hu-megamenu-popover").removeClass("show");e("body").hasClass("hu-modal-open")&&e(document).closeModal()}})),e(document).off("keyup"),e(".reload-preview-iframe").on("click",(function(t){t.preventDefault();let i=this;l(),e(this).addClass("spin"),n.addEventListener("load",(function(){e(i).removeClass("spin")}))})),e(".hu-topbar").tooltip({classes:{"ui-tooltip":"ui-corner-all"},position:{my:"left top+8px"},hide:!1,show:!1}),e(".action-reset-drafts, .reload-preview-iframe").tooltip({classes:{"ui-tooltip":"ui-corner-all"},position:{my:"left top+10px"},hide:!1,show:!1}),Joomla.helixLoading=function(t,i){const a=e(".hu-loading-msg"),o=e(".hu-done-msg"),n=e(".action-reset-drafts");a.hide(),o.hide(),n.hide(),t?(n.hide(),o.hide(),a.show()):(a.hide(),n.hide(),o.show()),s&&clearTimeout(s),(async()=>{t||await function(e=500){return new Promise((t=>{s=setTimeout(t,e)}))}(2e3),o.hide(),i?n.show():n.hide()})()},e(".hu-menu-builder input[name=megamenu]").on("change",(function(t){t.preventDefault();const i=e(this).closest(".controls"),a=i.data("safepoint"),s=i.data("currpoint"),o=Joomla.utils.helixHash(e(this).val());h(e(this),a,s,o)})),e("form#hu-style-form").find('input[type="text"], input[type="email"], input[type="number"]').on("keydown",(function(e){13!==e.keyCode||e.preventDefault()})),e("form#hu-style-form").find('input[type="text"], input[type="email"], input[type="number"], textarea').on("blur",(function(t){t.preventDefault();let i=e(this).closest(".controls");if(!i.hasClass("field-reset")&&i.hasClass("trackable")){let t=e(this).closest(".controls").data("safepoint"),i=e(this).closest(".controls").data("currpoint"),a=e(this).val();h(e(this),t,i,a)}})),e("form#hu-style-form").find('input[type="checkbox"], input[type=color]').on("change",(function(t){t.preventDefault(),console.log("change fired!");let i=e(this).closest(".controls");if(!i.hasClass("field-reset")&&i.hasClass("trackable")){let t=e(this).closest(".controls").data("safepoint"),i=e(this).closest(".controls").data("currpoint"),a=e(this).prop("checked")?1:0;h(e(this),t,i,a)}})),e("form#hu-style-form").find('select, input[type="hidden"]').on("change",(function(t){t.preventDefault();let i=e(this).closest(".controls");if(!i.hasClass("field-reset")&&i.hasClass("trackable")){let t=e(this).closest(".controls").data("safepoint"),i=e(this).closest(".controls").data("currpoint"),a=e(this).val();h(e(this),t,i,a)}})),e(".action-reset-drafts").on("click",(function(t){t.preventDefault();e(this).hasClass("hide")||(!function(){let t=e("form#hu-style-form").find(".controls.helix-input-touched");t.length>0&&t.each(((t,i)=>{e(i).hasClass("field-reset")||e(i).addClass("field-reset")}))}(),window.confirm("Do you really want to reset your settings?")&&(e("#layout").val(JSON.stringify(m())),f(),e(".hu-input-preset").val(JSON.stringify(e(".hu-preset.active").data())),e.ajax({type:"GET",url:"index.php?option=com_ajax&request=task&helix=ultimate&id="+helixUltimateStyleId+"&action=reset-drafted-settings&format=json&helix_id="+helixUltimateStyleId,success:function(t){if(e.parseJSON(t).status){document.getElementById("hu-template-preview");l()}},error:function(e){console.error("error",e)},complete:function(){!function(){let t=e("form#hu-style-form").find(".controls.helix-input-touched.field-reset");t.length>0&&t.each((function(t,a){let s=e(a);if(s.length>0){let t=s.data("safepoint"),a=s.data("selector"),o=s.find(a);if(o.length>0){let i=void 0!==o.attr("type")&&o.attr("type").toLowerCase();if(i&&"checkbox"===i){let e=1==t;o.prop("checked",e)}"megamenu"===o.attr("name")&&e(".hu-megamenu-action-tracker").val("restore").trigger("change"),"megamenu"!==o.attr("name")&&(o.val(t),o.attr("value",t),o.change()),s.attr("data-currpoint",t),s.data("currpoint",t),"select"===o.prop("tagName").toLowerCase()&&s.find(a+"_chzn").length>0&&(o.trigger("liszt:updated"),o.trigger("chosen:updated"))}let n=s.find(".hu-image-holder img");n.length>0&&n.attr("src",`${i.base}/${t}`),s.find(".hu-header-item").each((function(){e(this).hasClass("active")&&e(this).removeClass("active"),e(this).data("style")===t&&e(this).addClass("active")})),s.removeClass("helix-input-touched"),s.removeClass("field-reset")}}))}(),Joomla.HelixToaster.success("Successfully rolled back to the previous state!","Success"),e(".hu-loading-msg").hide(),e(".hu-done-msg").hide(),e(".action-reset-drafts").hide()}})))})),e(".action-save-template").on("click",Joomla.utils.debounce((function(t){t.preventDefault();c(!0),s&&clearTimeout(s),e("#layout").val(JSON.stringify(m())),f(),e(".hu-input-preset").val(JSON.stringify(e(".hu-preset.active").data()));e(this).data("id"),e(this).data("view");const i=e("#hu-style-form").find("input, select, textarea").not(".internal-use-only").serializeArray();e.ajax({type:"POST",url:"index.php?option=com_ajax&request=task&helix=ultimate&id="+helixUltimateStyleId+"&action=save-tmpl-style&format=json&helix_id="+helixUltimateStyleId,data:i,success:function(t){var i=e.parseJSON(t);if(i.status){document.getElementById("hu-template-preview").contentWindow.location.reload(!0),Joomla.HelixToaster.success("Changes have been successfully saved!","Success"),e(".hu-loading-msg").hide(),e(".hu-done-msg").hide(),e(".action-reset-drafts").hide(),c(!1)}else Joomla.HelixToaster.error(i.message,"Failed"),e(".hu-loading-msg").hide(),e(".hu-done-msg").hide(),e(".action-reset-drafts").hide(),c(!1);!function(){let t=e("form#hu-style-form").find(".controls.helix-input-touched");t.length>0&&t.each((function(t,i){let a=e(i);if(a.length>0){let e=a.data("selector"),t=a.find(e);t.length>0&&t.attr("value",t.val()),a.attr("data-setvalue",t.val()),a.data("setvalue",t.val()),a.removeClass("helix-input-touched")}}))}()},complete(){},error:function(e){console.error("error",e),Joomla.HelixToaster.error("Error: "+e.message,"Error"),c(!1)}})}),500)),e(".hu-device").on("click",(function(t){t.preventDefault();const i=e(this).data("device");e(this).parent().find(".active").removeClass("active"),e(this).addClass("active"),u(i)})),d({name:"logo_height",parent:".group-style-logo",map:{desktop:"md",tablet:"sm",mobile:"xs"},device:"desktop"}),e("#hu-style-form").find('input[type="checkbox"]:not(.hu-menu-item-selector)').each((function(){e(this).closest(".control-group").addClass("control-group-checkbox")})),e(".hu-options-core").draggable({iframeFix:!0,cursor:"grabbing",handle:".hu-panel-handle",containment:"#helix-ultimate",drag:function(e,t){a.setItem("toolbarPosition",JSON.stringify(t.position)),p()}}),e(".hu-fieldset-header").on("click",(function(t){t.preventDefault();let i=e(this).data("fieldset");if(e("."+i+"-panel").hasClass("active-panel"))return e("."+i+"-panel").removeClass("active-panel"),void e(this).removeClass("active");e("."+i+"-panel").parent().find(".active-panel").removeClass("active-panel"),e("."+i+"-panel").addClass("active-panel"),e(this).parents("#hu-options").find(".hu-fieldset .hu-fieldset-header").hasClass("active")&&e(this).parents("#hu-options").find(".hu-fieldset .hu-fieldset-header").removeClass("active"),e(this).addClass("active"),p(),Joomla.utils.calculateSiblingDistances()})),e(".hu-panel-close").on("click",(function(t){t.preventDefault(),e(this).closest(".hu-edit-panel").hasClass("active-panel")&&e(this).closest(".hu-edit-panel").removeClass("active-panel");let i=e(`.${e(this).data("sidebarclass")} .hu-fieldset-header`);i.hasClass("active")&&i.removeClass("active")})),e(".hu-fieldset-toggle-icon").on("click",(function(t){t.preventDefault(),e(".hu-fieldset").removeClass("active"),e("#hu, #hu-options").removeClass()})),e(".hu-group-header-box").on("click",(function(t){t.preventDefault();let i=e(this).closest(".hu-edit-panel").find(".hu-group-wrap").find(".hu-field-list.active-group");if(i.length>0){i.data("uid")!==e(this).next().data("uid")&&(i.removeClass("active-group"),i.parent().removeClass("active"),i.slideUp(400))}let a=e(this).next();a.hasClass("active-group")?(e(this).parent().removeClass("active"),a.removeClass("active-group"),a.slideUp(400)):(a.addClass("active-group"),e(this).parent().addClass("active"),a.slideDown(400))})),e(".hu-header-item").on("click",(function(t){t.preventDefault();var i=e(this).closest(".hu-header-list");i.find(".hu-header-item").removeClass("active"),e(this).addClass("active");var a=e(this).data("style"),s=i.data("name");e("#"+s).val(a).trigger("change")})),e(".hu-offcanvas-item").on("click",(function(t){t.preventDefault();var i=e(this).closest(".hu-offcanvas-list");i.find(".hu-offcanvas-item").removeClass("active"),e(this).addClass("active");var a=e(this).data("style"),s=i.data("name");e("#"+s).val(a).trigger("change")})),e(document).ready((function(){"checked"==e("#custom_style").attr("checked")?e(".hu-fieldset-presets").find(".hu-group-wrap").show():e(".hu-fieldset-presets").find(".hu-group-wrap").hide()})),e(document).on("change","#custom_style",(function(t){t.preventDefault(),"checked"==e(this).attr("checked")?e(".hu-fieldset-presets").find(".hu-group-wrap").slideDown():e(".hu-fieldset-presets").find(".hu-group-wrap").slideUp()})),e(document).on("click",".hu-preset",(function(t){t.preventDefault(),e(".hu-preset").removeClass("active"),e(this).addClass("active"),r()})),e(".helix-responsive-devices span").click((function(){if(e(this).hasClass("active"))return;const t=e(this).parents(".hu-webfont-size");t.find("input").removeClass("active");const i=e(this).data("active_class");t.find(i).addClass("active"),e(this).parent().find("span.active").removeClass("active"),e(this).addClass("active");u(e(this).data("device"))})),window.purgeCss=function(t=null){e.ajax({type:"POST",url:"index.php?option=com_ajax&request=task&helix=ultimate&id="+helixUltimateStyleId+"&action=purge-css-file&format=json&helix_id="+helixUltimateStyleId,data:{},beforeSend:function(){t&&t.append('<span class="fas fa-circle-notch fa-spin" aria-hidden="true"></span>')},success:function(i){var a=e.parseJSON(i);t&&a.status&&(t.find("span").remove(),t.removeClass("disable"))},error:function(){alert("Somethings wrong, Try again")}})},e(".btn-purge-hu-css").on("click",(function(t){t.preventDefault();var i=e(this);i.hasClass("disable")||(i.addClass("disable"),window.purgeCss(i))})),e("#btn-hu-import-settings").on("click",(function(t){t.preventDefault(),e("#helix-import-file").click()})),e("#helix-import-file").on("change",(function(t){const i=new FileReader;i.onload=function(t){JSON.parse(t.target.result);var i={action:"import-tmpl-style",option:"com_ajax",helix:"ultimate",request:"task",data:{settings:t.target.result},format:"json"};return e.ajax({type:"POST",data:i,success:function(t){e.parseJSON(t).status&&window.location.reload()},complete(){Joomla.HelixToaster.success("Settings have been successfully imported!","Success")},error:function(){Joomla.HelixToaster.error("Something went wrong importing settings!","Error")}}),!1},i.readAsText(t.target.files[0])})),e(".hu-help-icon").on("click",(function(t){t.preventDefault();let i=e(this).closest(".control-group").find(".hu-control-help");e(this).toggleClass("active"),i.hasClass("show")?(i.removeClass("show"),i.slideUp(100)):(i.addClass("show"),i.slideDown(100)),e(this).closest(".control-group").siblings().each((function(){let t=e(this).find(".hu-control-help");t.hasClass("show")&&(t.removeClass("show"),t.slideUp(100))}))})),e(document).on("click",".hu-option-group-title",(function(t){t.preventDefault(),e(this).closest(".hu-option-group").toggleClass("active").siblings().removeClass("active")}));let v={};function g(){e(".hu-group-wrap").each((function(){if(e(this).attr("data-dependon")){let t=e(this).data("dependon"),[i,a]=t.split(":"),s=e(`[name=${i}]`),o=s.val();"checkbox"===s.prop("type")&&(o=s.prop("checked"),a=1==a),o==a?e(this).fadeIn(300):e(this).fadeOut(300),v[i]=s}}))}g(),Object.values(v).forEach((function(e){e.on("change",(function(e){e.preventDefault(),g()}))})),function(){let t=e(".hu-field-dimension-width"),i=e(".hu-field-dimension-height");t.on("keyup",(function(t){t.preventDefault();let i=e(this).closest(".controls").find(".hu-field-dimension-input"),a=i.val()||"0x0",s=e(this).val(),[o,n]=a.toLowerCase().split("x");""===s&&(s="0"),o=s,a=`${o}x${n}`,i.val(a)})),i.on("keyup",(function(t){t.preventDefault();let i=e(this).closest(".controls").find(".hu-field-dimension-input"),a=i.val()||"0x0",s=e(this).val(),[o,n]=a.toLowerCase().split("x");""===s&&(s="0"),n=s,a=`${o}x${n}`,i.val(a)}))}();let y=[];function w(){e(".control-group[data-enableon]").each((function(){let[t,i]=e(this).data("enableon").split(":"),a=e(`[name=${t}]`);y.push(a);let s=a.val();"checkbox"===a.prop("type")&&(s=a.prop("checked"),i=1==i),s==i?(e(this).find("input, select, textarea").prop("readonly",!1),e(this).hasClass("uneditable")&&e(this).removeClass("uneditable")):(e(this).find("input, select, textarea").prop("readonly",!0),e(this).hasClass("uneditable")||e(this).addClass("uneditable"))}))}w(),y.forEach((function(e){e.on("change",(function(){w()}))})),e(".hu-switcher .hu-action-group [hu-switcher-action]").on("click",(function(t){let i=e(this).data("value");e(this).siblings().removeClass("active"),e(this).addClass("active"),e(this).closest(".hu-switcher").find("input[type=hidden]").val(i).trigger("change");const a=t.target.closest(".hu-switcher").querySelector("input[type=hidden]");Joomla.utils.triggerEvent(a,"change")}))}));PKBA#]IV�.uu/system/helixultimate/assets/js/admin/toaster.jsnu�[���const HelixToaster={options:{timeout:5e3,containerId:"hu-toaster-container",prefix:"hu-toaster",position:"hu-toaster-bottom-right",titleClass:"",messageClass:"",target:"body"},toasts:[],toastIndex:0,elementTimeout:null,success(t,e,s){this.createToaster({type:"success",message:t,title:e,options:s})},error(t,e,s){this.createToaster({type:"error",message:t,title:e,options:s})},info(t,e,s){this.createToaster({type:"info",message:t,title:e,options:s})},warning(t,e,s){this.createToaster({type:"warning",message:t,title:e,options:s})},getTypeClass:t=>`hu-toast-${t}`,createContainer(){const t=document.createElement("div");return t.setAttribute("id",this.options.containerId),t.setAttribute("class",this.options.position),document.querySelector(this.options.target).appendChild(t),t},createToaster({type:t,message:e,title:s,options:i}){const o=document.createElement("div");o.setAttribute("class",this.options.prefix+" "+this.getTypeClass(t));let a=`\n\t\t\t<div class="hu-toaster-info-icon"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" class="bi bi-info-circle" viewBox="0 0 20 20"><path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/><path d="M8.93 6.588l-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0z"/></svg></div>\n\t\t\t<div class="hu-toaster-wrap">\n\t\t\t\t<div class="${`${this.options.prefix}-title ${this.options.titleClass}`}">${s}</div>\n\t\t\t\t<div class="${`${this.options.prefix}-message ${this.options.messageClass}`}">${e}</div>\n\t\t\t</div>\n\t\t\t<div class="hu-toaster-close"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-x" viewBox="0 0 16 16"><path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z"/></svg></div>\n\n\t\t`;o.innerHTML=a,o.style.animationName="huFadeInUp",o.style.animationDuration=".35s",this.toasts.push(o),this.toastIndex++,this.getContainer().appendChild(o),this.elementTimeout=setTimeout((()=>{o.style.animationName="huFadeInDown",o.style.animationDuration=".35s",o.style.opacity=0,setTimeout((()=>{o.parentNode.removeChild(o)}),450)}),this.options.timeout),o.addEventListener("click",(t=>{t.preventDefault(),this.elementTimeout&&clearTimeout(this.elementTimeout),o.style.animationName="huFadeInDown",o.style.animationDuration=".35s",o.style.opacity=0,setTimeout((()=>{o.parentNode.removeChild(o)}),450)}))},getContainer(){let t=document.querySelector(`#${this.options.containerId}`);return t||(t=this.createContainer()),t},displayToaster(){const t=this.getContainer();t.innerHTML="",this.toasts.forEach((e=>{t.appendChild(e)}))},delay:(t=1e3)=>new Promise((e=>setTimeout(e,t))),removeToaster(t){return new Promise((e=>{this.toasts.splice(t,1);const s=document.querySelector(`#${this.options.containerId}`);s.firstChild&&s.removeChild(s.firstChild),e({status:!0})}))}};Joomla.HelixToaster=HelixToaster;PKBA#]P�fR����/system/helixultimate/assets/js/bootstrap.min.jsnu�[���/*! * Bootstrap v5.0.2 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e(t.Popper)}(this,(function(t){"use strict";function e(t){if(t&&t.__esModule)return t;var e=Object.create(null);return t&&Object.keys(t).forEach((function(s){if("default"!==s){var i=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(e,s,i.get?i:{enumerable:!0,get:function(){return t[s]}})}})),e.default=t,Object.freeze(e)}var s=e(t);const i={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter(t=>t.matches(e)),parents(t,e){const s=[];let i=t.parentNode;for(;i&&i.nodeType===Node.ELEMENT_NODE&&3!==i.nodeType;)i.matches(e)&&s.push(i),i=i.parentNode;return s},prev(t,e){let s=t.previousElementSibling;for(;s;){if(s.matches(e))return[s];s=s.previousElementSibling}return[]},next(t,e){let s=t.nextElementSibling;for(;s;){if(s.matches(e))return[s];s=s.nextElementSibling}return[]}},n=t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t},o=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let s=t.getAttribute("href");if(!s||!s.includes("#")&&!s.startsWith("."))return null;s.includes("#")&&!s.startsWith("#")&&(s="#"+s.split("#")[1]),e=s&&"#"!==s?s.trim():null}return e},r=t=>{const e=o(t);return e&&document.querySelector(e)?e:null},a=t=>{const e=o(t);return e?document.querySelector(e):null},l=t=>{t.dispatchEvent(new Event("transitionend"))},c=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),h=t=>c(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?i.findOne(t):null,d=(t,e,s)=>{Object.keys(s).forEach(i=>{const n=s[i],o=e[i],r=o&&c(o)?"element":null==(a=o)?""+a:{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase();var a;if(!new RegExp(n).test(r))throw new TypeError(`${t.toUpperCase()}: Option "${i}" provided type "${r}" but expected type "${n}".`)})},u=t=>!(!c(t)||0===t.getClientRects().length)&&"visible"===getComputedStyle(t).getPropertyValue("visibility"),g=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),p=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?p(t.parentNode):null},f=()=>{},m=t=>t.offsetHeight,_=()=>{const{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},b=[],v=()=>"rtl"===document.documentElement.dir,y=t=>{var e;e=()=>{const e=_();if(e){const s=t.NAME,i=e.fn[s];e.fn[s]=t.jQueryInterface,e.fn[s].Constructor=t,e.fn[s].noConflict=()=>(e.fn[s]=i,t.jQueryInterface)}},"loading"===document.readyState?(b.length||document.addEventListener("DOMContentLoaded",()=>{b.forEach(t=>t())}),b.push(e)):e()},w=t=>{"function"==typeof t&&t()},E=(t,e,s=!0)=>{if(!s)return void w(t);const i=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:s}=window.getComputedStyle(t);const i=Number.parseFloat(e),n=Number.parseFloat(s);return i||n?(e=e.split(",")[0],s=s.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(s))):0})(e)+5;let n=!1;const o=({target:s})=>{s===e&&(n=!0,e.removeEventListener("transitionend",o),w(t))};e.addEventListener("transitionend",o),setTimeout(()=>{n||l(e)},i)},A=(t,e,s,i)=>{let n=t.indexOf(e);if(-1===n)return t[!s&&i?t.length-1:0];const o=t.length;return n+=s?1:-1,i&&(n=(n+o)%o),t[Math.max(0,Math.min(n,o-1))]},T=/[^.]*(?=\..*)\.|.*/,C=/\..*/,k=/::\d+$/,L={};let O=1;const D={mouseenter:"mouseover",mouseleave:"mouseout"},I=/^(mouseenter|mouseleave)/i,N=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function S(t,e){return e&&`${e}::${O++}`||t.uidEvent||O++}function x(t){const e=S(t);return t.uidEvent=e,L[e]=L[e]||{},L[e]}function M(t,e,s=null){const i=Object.keys(t);for(let n=0,o=i.length;n<o;n++){const o=t[i[n]];if(o.originalHandler===e&&o.delegationSelector===s)return o}return null}function P(t,e,s){const i="string"==typeof e,n=i?s:e;let o=R(t);return N.has(o)||(o=t),[i,n,o]}function j(t,e,s,i,n){if("string"!=typeof e||!t)return;if(s||(s=i,i=null),I.test(e)){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};i?i=t(i):s=t(s)}const[o,r,a]=P(e,s,i),l=x(t),c=l[a]||(l[a]={}),h=M(c,r,o?s:null);if(h)return void(h.oneOff=h.oneOff&&n);const d=S(r,e.replace(T,"")),u=o?function(t,e,s){return function i(n){const o=t.querySelectorAll(e);for(let{target:r}=n;r&&r!==this;r=r.parentNode)for(let a=o.length;a--;)if(o[a]===r)return n.delegateTarget=r,i.oneOff&&B.off(t,n.type,e,s),s.apply(r,[n]);return null}}(t,s,i):function(t,e){return function s(i){return i.delegateTarget=t,s.oneOff&&B.off(t,i.type,e),e.apply(t,[i])}}(t,s);u.delegationSelector=o?s:null,u.originalHandler=r,u.oneOff=n,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function H(t,e,s,i,n){const o=M(e[s],i,n);o&&(t.removeEventListener(s,o,Boolean(n)),delete e[s][o.uidEvent])}function R(t){return t=t.replace(C,""),D[t]||t}const B={on(t,e,s,i){j(t,e,s,i,!1)},one(t,e,s,i){j(t,e,s,i,!0)},off(t,e,s,i){if("string"!=typeof e||!t)return;const[n,o,r]=P(e,s,i),a=r!==e,l=x(t),c=e.startsWith(".");if(void 0!==o){if(!l||!l[r])return;return void H(t,l,r,o,n?s:null)}c&&Object.keys(l).forEach(s=>{!function(t,e,s,i){const n=e[s]||{};Object.keys(n).forEach(o=>{if(o.includes(i)){const i=n[o];H(t,e,s,i.originalHandler,i.delegationSelector)}})}(t,l,s,e.slice(1))});const h=l[r]||{};Object.keys(h).forEach(s=>{const i=s.replace(k,"");if(!a||e.includes(i)){const e=h[s];H(t,l,r,e.originalHandler,e.delegationSelector)}})},trigger(t,e,s){if("string"!=typeof e||!t)return null;const i=_(),n=R(e),o=e!==n,r=N.has(n);let a,l=!0,c=!0,h=!1,d=null;return o&&i&&(a=i.Event(e,s),i(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),h=a.isDefaultPrevented()),r?(d=document.createEvent("HTMLEvents"),d.initEvent(n,l,!0)):d=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==s&&Object.keys(s).forEach(t=>{Object.defineProperty(d,t,{get:()=>s[t]})}),h&&d.preventDefault(),c&&t.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},$=new Map;var W={set(t,e,s){$.has(t)||$.set(t,new Map);const i=$.get(t);i.has(e)||0===i.size?i.set(e,s):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(i.keys())[0]}.`)},get:(t,e)=>$.has(t)&&$.get(t).get(e)||null,remove(t,e){if(!$.has(t))return;const s=$.get(t);s.delete(e),0===s.size&&$.delete(t)}};class q{constructor(t){(t=h(t))&&(this._element=t,W.set(this._element,this.constructor.DATA_KEY,this))}dispose(){W.remove(this._element,this.constructor.DATA_KEY),B.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(t=>{this[t]=null})}_queueCallback(t,e,s=!0){E(t,e,s)}static getInstance(t){return W.get(t,this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.0.2"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return"bs."+this.NAME}static get EVENT_KEY(){return"."+this.DATA_KEY}}class z extends q{static get NAME(){return"alert"}close(t){const e=t?this._getRootElement(t):this._element,s=this._triggerCloseEvent(e);null===s||s.defaultPrevented||this._removeElement(e)}_getRootElement(t){return a(t)||t.closest(".alert")}_triggerCloseEvent(t){return B.trigger(t,"close.bs.alert")}_removeElement(t){t.classList.remove("show");const e=t.classList.contains("fade");this._queueCallback(()=>this._destroyElement(t),t,e)}_destroyElement(t){t.remove(),B.trigger(t,"closed.bs.alert")}static jQueryInterface(t){return this.each((function(){const e=z.getOrCreateInstance(this);"close"===t&&e[t](this)}))}static handleDismiss(t){return function(e){e&&e.preventDefault(),t.close(this)}}}B.on(document,"click.bs.alert.data-api",'[data-bs-dismiss="alert"]',z.handleDismiss(new z)),y(z);class F extends q{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=F.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}function U(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function K(t){return t.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}B.on(document,"click.bs.button.data-api",'[data-bs-toggle="button"]',t=>{t.preventDefault();const e=t.target.closest('[data-bs-toggle="button"]');F.getOrCreateInstance(e).toggle()}),y(F);const V={setDataAttribute(t,e,s){t.setAttribute("data-bs-"+K(e),s)},removeDataAttribute(t,e){t.removeAttribute("data-bs-"+K(e))},getDataAttributes(t){if(!t)return{};const e={};return Object.keys(t.dataset).filter(t=>t.startsWith("bs")).forEach(s=>{let i=s.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=U(t.dataset[s])}),e},getDataAttribute:(t,e)=>U(t.getAttribute("data-bs-"+K(e))),offset(t){const e=t.getBoundingClientRect();return{top:e.top+document.body.scrollTop,left:e.left+document.body.scrollLeft}},position:t=>({top:t.offsetTop,left:t.offsetLeft})},Q={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},X={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},Y="next",G="prev",Z="left",J="right",tt={ArrowLeft:J,ArrowRight:Z};class et extends q{constructor(t,e){super(t),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._indicatorsElement=i.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return Q}static get NAME(){return"carousel"}next(){this._slide(Y)}nextWhenVisible(){!document.hidden&&u(this._element)&&this.next()}prev(){this._slide(G)}pause(t){t||(this._isPaused=!0),i.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(l(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(t){this._activeElement=i.findOne(".active.carousel-item",this._element);const e=this._getItemIndex(this._activeElement);if(t>this._items.length-1||t<0)return;if(this._isSliding)return void B.one(this._element,"slid.bs.carousel",()=>this.to(t));if(e===t)return this.pause(),void this.cycle();const s=t>e?Y:G;this._slide(s,this._items[t])}_getConfig(t){return t={...Q,...V.getDataAttributes(this._element),..."object"==typeof t?t:{}},d("carousel",t,X),t}_handleSwipe(){const t=Math.abs(this.touchDeltaX);if(t<=40)return;const e=t/this.touchDeltaX;this.touchDeltaX=0,e&&this._slide(e>0?J:Z)}_addEventListeners(){this._config.keyboard&&B.on(this._element,"keydown.bs.carousel",t=>this._keydown(t)),"hover"===this._config.pause&&(B.on(this._element,"mouseenter.bs.carousel",t=>this.pause(t)),B.on(this._element,"mouseleave.bs.carousel",t=>this.cycle(t))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const t=t=>{!this._pointerEvent||"pen"!==t.pointerType&&"touch"!==t.pointerType?this._pointerEvent||(this.touchStartX=t.touches[0].clientX):this.touchStartX=t.clientX},e=t=>{this.touchDeltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this.touchStartX},s=t=>{!this._pointerEvent||"pen"!==t.pointerType&&"touch"!==t.pointerType||(this.touchDeltaX=t.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(t=>this.cycle(t),500+this._config.interval))};i.find(".carousel-item img",this._element).forEach(t=>{B.on(t,"dragstart.bs.carousel",t=>t.preventDefault())}),this._pointerEvent?(B.on(this._element,"pointerdown.bs.carousel",e=>t(e)),B.on(this._element,"pointerup.bs.carousel",t=>s(t)),this._element.classList.add("pointer-event")):(B.on(this._element,"touchstart.bs.carousel",e=>t(e)),B.on(this._element,"touchmove.bs.carousel",t=>e(t)),B.on(this._element,"touchend.bs.carousel",t=>s(t)))}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=tt[t.key];e&&(t.preventDefault(),this._slide(e))}_getItemIndex(t){return this._items=t&&t.parentNode?i.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)}_getItemByOrder(t,e){const s=t===Y;return A(this._items,e,s,this._config.wrap)}_triggerSlideEvent(t,e){const s=this._getItemIndex(t),n=this._getItemIndex(i.findOne(".active.carousel-item",this._element));return B.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:n,to:s})}_setActiveIndicatorElement(t){if(this._indicatorsElement){const e=i.findOne(".active",this._indicatorsElement);e.classList.remove("active"),e.removeAttribute("aria-current");const s=i.find("[data-bs-target]",this._indicatorsElement);for(let e=0;e<s.length;e++)if(Number.parseInt(s[e].getAttribute("data-bs-slide-to"),10)===this._getItemIndex(t)){s[e].classList.add("active"),s[e].setAttribute("aria-current","true");break}}}_updateInterval(){const t=this._activeElement||i.findOne(".active.carousel-item",this._element);if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}_slide(t,e){const s=this._directionToOrder(t),n=i.findOne(".active.carousel-item",this._element),o=this._getItemIndex(n),r=e||this._getItemByOrder(s,n),a=this._getItemIndex(r),l=Boolean(this._interval),c=s===Y,h=c?"carousel-item-start":"carousel-item-end",d=c?"carousel-item-next":"carousel-item-prev",u=this._orderToDirection(s);if(r&&r.classList.contains("active"))return void(this._isSliding=!1);if(this._isSliding)return;if(this._triggerSlideEvent(r,u).defaultPrevented)return;if(!n||!r)return;this._isSliding=!0,l&&this.pause(),this._setActiveIndicatorElement(r),this._activeElement=r;const g=()=>{B.trigger(this._element,"slid.bs.carousel",{relatedTarget:r,direction:u,from:o,to:a})};if(this._element.classList.contains("slide")){r.classList.add(d),m(r),n.classList.add(h),r.classList.add(h);const t=()=>{r.classList.remove(h,d),r.classList.add("active"),n.classList.remove("active",d,h),this._isSliding=!1,setTimeout(g,0)};this._queueCallback(t,n,!0)}else n.classList.remove("active"),r.classList.add("active"),this._isSliding=!1,g();l&&this.cycle()}_directionToOrder(t){return[J,Z].includes(t)?v()?t===Z?G:Y:t===Z?Y:G:t}_orderToDirection(t){return[Y,G].includes(t)?v()?t===G?Z:J:t===G?J:Z:t}static carouselInterface(t,e){const s=et.getOrCreateInstance(t,e);let{_config:i}=s;"object"==typeof e&&(i={...i,...e});const n="string"==typeof e?e:i.slide;if("number"==typeof e)s.to(e);else if("string"==typeof n){if(void 0===s[n])throw new TypeError(`No method named "${n}"`);s[n]()}else i.interval&&i.ride&&(s.pause(),s.cycle())}static jQueryInterface(t){return this.each((function(){et.carouselInterface(this,t)}))}static dataApiClickHandler(t){const e=a(this);if(!e||!e.classList.contains("carousel"))return;const s={...V.getDataAttributes(e),...V.getDataAttributes(this)},i=this.getAttribute("data-bs-slide-to");i&&(s.interval=!1),et.carouselInterface(e,s),i&&et.getInstance(e).to(i),t.preventDefault()}}B.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",et.dataApiClickHandler),B.on(window,"load.bs.carousel.data-api",()=>{const t=i.find('[data-bs-ride="carousel"]');for(let e=0,s=t.length;e<s;e++)et.carouselInterface(t[e],et.getInstance(t[e]))}),y(et);const st={toggle:!0,parent:""},it={toggle:"boolean",parent:"(string|element)"};class nt extends q{constructor(t,e){super(t),this._isTransitioning=!1,this._config=this._getConfig(e),this._triggerArray=i.find(`[data-bs-toggle="collapse"][href="#${this._element.id}"],[data-bs-toggle="collapse"][data-bs-target="#${this._element.id}"]`);const s=i.find('[data-bs-toggle="collapse"]');for(let t=0,e=s.length;t<e;t++){const e=s[t],n=r(e),o=i.find(n).filter(t=>t===this._element);null!==n&&o.length&&(this._selector=n,this._triggerArray.push(e))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}static get Default(){return st}static get NAME(){return"collapse"}toggle(){this._element.classList.contains("show")?this.hide():this.show()}show(){if(this._isTransitioning||this._element.classList.contains("show"))return;let t,e;this._parent&&(t=i.find(".show, .collapsing",this._parent).filter(t=>"string"==typeof this._config.parent?t.getAttribute("data-bs-parent")===this._config.parent:t.classList.contains("collapse")),0===t.length&&(t=null));const s=i.findOne(this._selector);if(t){const i=t.find(t=>s!==t);if(e=i?nt.getInstance(i):null,e&&e._isTransitioning)return}if(B.trigger(this._element,"show.bs.collapse").defaultPrevented)return;t&&t.forEach(t=>{s!==t&&nt.collapseInterface(t,"hide"),e||W.set(t,"bs.collapse",null)});const n=this._getDimension();this._element.classList.remove("collapse"),this._element.classList.add("collapsing"),this._element.style[n]=0,this._triggerArray.length&&this._triggerArray.forEach(t=>{t.classList.remove("collapsed"),t.setAttribute("aria-expanded",!0)}),this.setTransitioning(!0);const o="scroll"+(n[0].toUpperCase()+n.slice(1));this._queueCallback(()=>{this._element.classList.remove("collapsing"),this._element.classList.add("collapse","show"),this._element.style[n]="",this.setTransitioning(!1),B.trigger(this._element,"shown.bs.collapse")},this._element,!0),this._element.style[n]=this._element[o]+"px"}hide(){if(this._isTransitioning||!this._element.classList.contains("show"))return;if(B.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=this._element.getBoundingClientRect()[t]+"px",m(this._element),this._element.classList.add("collapsing"),this._element.classList.remove("collapse","show");const e=this._triggerArray.length;if(e>0)for(let t=0;t<e;t++){const e=this._triggerArray[t],s=a(e);s&&!s.classList.contains("show")&&(e.classList.add("collapsed"),e.setAttribute("aria-expanded",!1))}this.setTransitioning(!0),this._element.style[t]="",this._queueCallback(()=>{this.setTransitioning(!1),this._element.classList.remove("collapsing"),this._element.classList.add("collapse"),B.trigger(this._element,"hidden.bs.collapse")},this._element,!0)}setTransitioning(t){this._isTransitioning=t}_getConfig(t){return(t={...st,...t}).toggle=Boolean(t.toggle),d("collapse",t,it),t}_getDimension(){return this._element.classList.contains("width")?"width":"height"}_getParent(){let{parent:t}=this._config;t=h(t);const e=`[data-bs-toggle="collapse"][data-bs-parent="${t}"]`;return i.find(e,t).forEach(t=>{const e=a(t);this._addAriaAndCollapsedClass(e,[t])}),t}_addAriaAndCollapsedClass(t,e){if(!t||!e.length)return;const s=t.classList.contains("show");e.forEach(t=>{s?t.classList.remove("collapsed"):t.classList.add("collapsed"),t.setAttribute("aria-expanded",s)})}static collapseInterface(t,e){let s=nt.getInstance(t);const i={...st,...V.getDataAttributes(t),..."object"==typeof e&&e?e:{}};if(!s&&i.toggle&&"string"==typeof e&&/show|hide/.test(e)&&(i.toggle=!1),s||(s=new nt(t,i)),"string"==typeof e){if(void 0===s[e])throw new TypeError(`No method named "${e}"`);s[e]()}}static jQueryInterface(t){return this.each((function(){nt.collapseInterface(this,t)}))}}B.on(document,"click.bs.collapse.data-api",'[data-bs-toggle="collapse"]',(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=V.getDataAttributes(this),s=r(this);i.find(s).forEach(t=>{const s=nt.getInstance(t);let i;s?(null===s._parent&&"string"==typeof e.parent&&(s._config.parent=e.parent,s._parent=s._getParent()),i="toggle"):i=e,nt.collapseInterface(t,i)})})),y(nt);const ot=new RegExp("ArrowUp|ArrowDown|Escape"),rt=v()?"top-end":"top-start",at=v()?"top-start":"top-end",lt=v()?"bottom-end":"bottom-start",ct=v()?"bottom-start":"bottom-end",ht=v()?"left-start":"right-start",dt=v()?"right-start":"left-start",ut={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},gt={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class pt extends q{constructor(t,e){super(t),this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}static get Default(){return ut}static get DefaultType(){return gt}static get NAME(){return"dropdown"}toggle(){g(this._element)||(this._element.classList.contains("show")?this.hide():this.show())}show(){if(g(this._element)||this._menu.classList.contains("show"))return;const t=pt.getParentFromElement(this._element),e={relatedTarget:this._element};if(!B.trigger(this._element,"show.bs.dropdown",e).defaultPrevented){if(this._inNavbar)V.setDataAttribute(this._menu,"popper","none");else{if(void 0===s)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;"parent"===this._config.reference?e=t:c(this._config.reference)?e=h(this._config.reference):"object"==typeof this._config.reference&&(e=this._config.reference);const i=this._getPopperConfig(),n=i.modifiers.find(t=>"applyStyles"===t.name&&!1===t.enabled);this._popper=s.createPopper(e,this._menu,i),n&&V.setDataAttribute(this._menu,"popper","static")}"ontouchstart"in document.documentElement&&!t.closest(".navbar-nav")&&[].concat(...document.body.children).forEach(t=>B.on(t,"mouseover",f)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.toggle("show"),this._element.classList.toggle("show"),B.trigger(this._element,"shown.bs.dropdown",e)}}hide(){if(g(this._element)||!this._menu.classList.contains("show"))return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_addEventListeners(){B.on(this._element,"click.bs.dropdown",t=>{t.preventDefault(),this.toggle()})}_completeHide(t){B.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>B.off(t,"mouseover",f)),this._popper&&this._popper.destroy(),this._menu.classList.remove("show"),this._element.classList.remove("show"),this._element.setAttribute("aria-expanded","false"),V.removeDataAttribute(this._menu,"popper"),B.trigger(this._element,"hidden.bs.dropdown",t))}_getConfig(t){if(t={...this.constructor.Default,...V.getDataAttributes(this._element),...t},d("dropdown",t,this.constructor.DefaultType),"object"==typeof t.reference&&!c(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError("dropdown".toUpperCase()+': Option "reference" provided type "object" without a required "getBoundingClientRect" method.');return t}_getMenuElement(){return i.next(this._element,".dropdown-menu")[0]}_getPlacement(){const t=this._element.parentNode;if(t.classList.contains("dropend"))return ht;if(t.classList.contains("dropstart"))return dt;const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?at:rt:e?ct:lt}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const s=i.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(u);s.length&&A(s,e,"ArrowDown"===t,!s.includes(e)).focus()}static dropdownInterface(t,e){const s=pt.getOrCreateInstance(t,e);if("string"==typeof e){if(void 0===s[e])throw new TypeError(`No method named "${e}"`);s[e]()}}static jQueryInterface(t){return this.each((function(){pt.dropdownInterface(this,t)}))}static clearMenus(t){if(t&&(2===t.button||"keyup"===t.type&&"Tab"!==t.key))return;const e=i.find('[data-bs-toggle="dropdown"]');for(let s=0,i=e.length;s<i;s++){const i=pt.getInstance(e[s]);if(!i||!1===i._config.autoClose)continue;if(!i._element.classList.contains("show"))continue;const n={relatedTarget:i._element};if(t){const e=t.composedPath(),s=e.includes(i._menu);if(e.includes(i._element)||"inside"===i._config.autoClose&&!s||"outside"===i._config.autoClose&&s)continue;if(i._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;"click"===t.type&&(n.clickEvent=t)}i._completeHide(n)}}static getParentFromElement(t){return a(t)||t.parentNode}static dataApiKeydownHandler(t){if(/input|textarea/i.test(t.target.tagName)?"Space"===t.key||"Escape"!==t.key&&("ArrowDown"!==t.key&&"ArrowUp"!==t.key||t.target.closest(".dropdown-menu")):!ot.test(t.key))return;const e=this.classList.contains("show");if(!e&&"Escape"===t.key)return;if(t.preventDefault(),t.stopPropagation(),g(this))return;const s=()=>this.matches('[data-bs-toggle="dropdown"]')?this:i.prev(this,'[data-bs-toggle="dropdown"]')[0];return"Escape"===t.key?(s().focus(),void pt.clearMenus()):"ArrowUp"===t.key||"ArrowDown"===t.key?(e||s().click(),void pt.getInstance(s())._selectMenuItem(t)):void(e&&"Space"!==t.key||pt.clearMenus())}}B.on(document,"keydown.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',pt.dataApiKeydownHandler),B.on(document,"keydown.bs.dropdown.data-api",".dropdown-menu",pt.dataApiKeydownHandler),B.on(document,"click.bs.dropdown.data-api",pt.clearMenus),B.on(document,"keyup.bs.dropdown.data-api",pt.clearMenus),B.on(document,"click.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',(function(t){t.preventDefault(),pt.dropdownInterface(this)})),y(pt);class ft{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",e=>e+t),this._setElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight",e=>e+t),this._setElementAttributes(".sticky-top","marginRight",e=>e-t)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,s){const i=this.getWidth();this._applyManipulationCallback(t,t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+i)return;this._saveInitialAttribute(t,e);const n=window.getComputedStyle(t)[e];t.style[e]=s(Number.parseFloat(n))+"px"})}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight"),this._resetElementAttributes(".sticky-top","marginRight")}_saveInitialAttribute(t,e){const s=t.style[e];s&&V.setDataAttribute(t,e,s)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,t=>{const s=V.getDataAttribute(t,e);void 0===s?t.style.removeProperty(e):(V.removeDataAttribute(t,e),t.style[e]=s)})}_applyManipulationCallback(t,e){c(t)?e(t):i.find(t,this._element).forEach(e)}isOverflowing(){return this.getWidth()>0}}const mt={isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},_t={isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"};class bt{constructor(t){this._config=this._getConfig(t),this._isAppended=!1,this._element=null}show(t){this._config.isVisible?(this._append(),this._config.isAnimated&&m(this._getElement()),this._getElement().classList.add("show"),this._emulateAnimation(()=>{w(t)})):w(t)}hide(t){this._config.isVisible?(this._getElement().classList.remove("show"),this._emulateAnimation(()=>{this.dispose(),w(t)})):w(t)}_getElement(){if(!this._element){const t=document.createElement("div");t.className="modal-backdrop",this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_getConfig(t){return(t={...mt,..."object"==typeof t?t:{}}).rootElement=h(t.rootElement),d("backdrop",t,_t),t}_append(){this._isAppended||(this._config.rootElement.appendChild(this._getElement()),B.on(this._getElement(),"mousedown.bs.backdrop",()=>{w(this._config.clickCallback)}),this._isAppended=!0)}dispose(){this._isAppended&&(B.off(this._element,"mousedown.bs.backdrop"),this._element.remove(),this._isAppended=!1)}_emulateAnimation(t){E(t,this._getElement(),this._config.isAnimated)}}const vt={backdrop:!0,keyboard:!0,focus:!0},yt={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"};class wt extends q{constructor(t,e){super(t),this._config=this._getConfig(e),this._dialog=i.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new ft}static get Default(){return vt}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||B.trigger(this._element,"show.bs.modal",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add("modal-open"),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),B.on(this._element,"click.dismiss.bs.modal",'[data-bs-dismiss="modal"]',t=>this.hide(t)),B.on(this._dialog,"mousedown.dismiss.bs.modal",()=>{B.one(this._element,"mouseup.dismiss.bs.modal",t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(t)))}hide(t){if(t&&["A","AREA"].includes(t.target.tagName)&&t.preventDefault(),!this._isShown||this._isTransitioning)return;if(B.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const e=this._isAnimated();e&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),B.off(document,"focusin.bs.modal"),this._element.classList.remove("show"),B.off(this._element,"click.dismiss.bs.modal"),B.off(this._dialog,"mousedown.dismiss.bs.modal"),this._queueCallback(()=>this._hideModal(),this._element,e)}dispose(){[window,this._dialog].forEach(t=>B.off(t,".bs.modal")),this._backdrop.dispose(),super.dispose(),B.off(document,"focusin.bs.modal")}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new bt({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_getConfig(t){return t={...vt,...V.getDataAttributes(this._element),..."object"==typeof t?t:{}},d("modal",t,yt),t}_showElement(t){const e=this._isAnimated(),s=i.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,s&&(s.scrollTop=0),e&&m(this._element),this._element.classList.add("show"),this._config.focus&&this._enforceFocus(),this._queueCallback(()=>{this._config.focus&&this._element.focus(),this._isTransitioning=!1,B.trigger(this._element,"shown.bs.modal",{relatedTarget:t})},this._dialog,e)}_enforceFocus(){B.off(document,"focusin.bs.modal"),B.on(document,"focusin.bs.modal",t=>{document===t.target||this._element===t.target||this._element.contains(t.target)||this._element.focus()})}_setEscapeEvent(){this._isShown?B.on(this._element,"keydown.dismiss.bs.modal",t=>{this._config.keyboard&&"Escape"===t.key?(t.preventDefault(),this.hide()):this._config.keyboard||"Escape"!==t.key||this._triggerBackdropTransition()}):B.off(this._element,"keydown.dismiss.bs.modal")}_setResizeEvent(){this._isShown?B.on(window,"resize.bs.modal",()=>this._adjustDialog()):B.off(window,"resize.bs.modal")}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove("modal-open"),this._resetAdjustments(),this._scrollBar.reset(),B.trigger(this._element,"hidden.bs.modal")})}_showBackdrop(t){B.on(this._element,"click.dismiss.bs.modal",t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())}),this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(B.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:t,scrollHeight:e,style:s}=this._element,i=e>document.documentElement.clientHeight;!i&&"hidden"===s.overflowY||t.contains("modal-static")||(i||(s.overflowY="hidden"),t.add("modal-static"),this._queueCallback(()=>{t.remove("modal-static"),i||this._queueCallback(()=>{s.overflowY=""},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),s=e>0;(!s&&t&&!v()||s&&!t&&v())&&(this._element.style.paddingLeft=e+"px"),(s&&!t&&!v()||!s&&t&&v())&&(this._element.style.paddingRight=e+"px")}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const s=wt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===s[t])throw new TypeError(`No method named "${t}"`);s[t](e)}}))}}B.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=a(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),B.one(e,"show.bs.modal",t=>{t.defaultPrevented||B.one(e,"hidden.bs.modal",()=>{u(this)&&this.focus()})}),wt.getOrCreateInstance(e).toggle(this)})),y(wt);const Et={backdrop:!0,keyboard:!0,scroll:!1},At={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"};class Tt extends q{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._addEventListeners()}static get NAME(){return"offcanvas"}static get Default(){return Et}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||B.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||((new ft).hide(),this._enforceFocusOnElement(this._element)),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add("show"),this._queueCallback(()=>{B.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})},this._element,!0))}hide(){this._isShown&&(B.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(B.off(document,"focusin.bs.offcanvas"),this._element.blur(),this._isShown=!1,this._element.classList.remove("show"),this._backdrop.hide(),this._queueCallback(()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new ft).reset(),B.trigger(this._element,"hidden.bs.offcanvas")},this._element,!0)))}dispose(){this._backdrop.dispose(),super.dispose(),B.off(document,"focusin.bs.offcanvas")}_getConfig(t){return t={...Et,...V.getDataAttributes(this._element),..."object"==typeof t?t:{}},d("offcanvas",t,At),t}_initializeBackDrop(){return new bt({isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_enforceFocusOnElement(t){B.off(document,"focusin.bs.offcanvas"),B.on(document,"focusin.bs.offcanvas",e=>{document===e.target||t===e.target||t.contains(e.target)||t.focus()}),t.focus()}_addEventListeners(){B.on(this._element,"click.dismiss.bs.offcanvas",'[data-bs-dismiss="offcanvas"]',()=>this.hide()),B.on(this._element,"keydown.dismiss.bs.offcanvas",t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()})}static jQueryInterface(t){return this.each((function(){const e=Tt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}B.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=a(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),g(this))return;B.one(e,"hidden.bs.offcanvas",()=>{u(this)&&this.focus()});const s=i.findOne(".offcanvas.show");s&&s!==e&&Tt.getInstance(s).hide(),Tt.getOrCreateInstance(e).toggle(this)})),B.on(window,"load.bs.offcanvas.data-api",()=>i.find(".offcanvas.show").forEach(t=>Tt.getOrCreateInstance(t).show())),y(Tt);const Ct=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),kt=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i,Lt=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Ot=(t,e)=>{const s=t.nodeName.toLowerCase();if(e.includes(s))return!Ct.has(s)||Boolean(kt.test(t.nodeValue)||Lt.test(t.nodeValue));const i=e.filter(t=>t instanceof RegExp);for(let t=0,e=i.length;t<e;t++)if(i[t].test(s))return!0;return!1};function Dt(t,e,s){if(!t.length)return t;if(s&&"function"==typeof s)return s(t);const i=(new window.DOMParser).parseFromString(t,"text/html"),n=Object.keys(e),o=[].concat(...i.body.querySelectorAll("*"));for(let t=0,s=o.length;t<s;t++){const s=o[t],i=s.nodeName.toLowerCase();if(!n.includes(i)){s.remove();continue}const r=[].concat(...s.attributes),a=[].concat(e["*"]||[],e[i]||[]);r.forEach(t=>{Ot(t,a)||s.removeAttribute(t.nodeName)})}return i.body.innerHTML}const It=new RegExp("(^|\\s)bs-tooltip\\S+","g"),Nt=new Set(["sanitize","allowList","sanitizeFn"]),St={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},xt={AUTO:"auto",TOP:"top",RIGHT:v()?"left":"right",BOTTOM:"bottom",LEFT:v()?"right":"left"},Mt={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},Pt={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"};class jt extends q{constructor(t,e){if(void 0===s)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return Mt}static get NAME(){return"tooltip"}static get Event(){return Pt}static get DefaultType(){return St}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled)if(t){const e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),B.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.remove(),this._popper&&this._popper.destroy(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const t=B.trigger(this._element,this.constructor.Event.SHOW),e=p(this._element),i=null===e?this._element.ownerDocument.documentElement.contains(this._element):e.contains(this._element);if(t.defaultPrevented||!i)return;const o=this.getTipElement(),r=n(this.constructor.NAME);o.setAttribute("id",r),this._element.setAttribute("aria-describedby",r),this.setContent(),this._config.animation&&o.classList.add("fade");const a="function"==typeof this._config.placement?this._config.placement.call(this,o,this._element):this._config.placement,l=this._getAttachment(a);this._addAttachmentClass(l);const{container:c}=this._config;W.set(o,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(c.appendChild(o),B.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=s.createPopper(this._element,o,this._getPopperConfig(l)),o.classList.add("show");const h="function"==typeof this._config.customClass?this._config.customClass():this._config.customClass;h&&o.classList.add(...h.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>{B.on(t,"mouseover",f)});const d=this.tip.classList.contains("fade");this._queueCallback(()=>{const t=this._hoverState;this._hoverState=null,B.trigger(this._element,this.constructor.Event.SHOWN),"out"===t&&this._leave(null,this)},this.tip,d)}hide(){if(!this._popper)return;const t=this.getTipElement();if(B.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;t.classList.remove("show"),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>B.off(t,"mouseover",f)),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const e=this.tip.classList.contains("fade");this._queueCallback(()=>{this._isWithActiveTrigger()||("show"!==this._hoverState&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),B.trigger(this._element,this.constructor.Event.HIDDEN),this._popper&&(this._popper.destroy(),this._popper=null))},this.tip,e),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");return t.innerHTML=this._config.template,this.tip=t.children[0],this.tip}setContent(){const t=this.getTipElement();this.setElementContent(i.findOne(".tooltip-inner",t),this.getTitle()),t.classList.remove("fade","show")}setElementContent(t,e){if(null!==t)return c(e)?(e=h(e),void(this._config.html?e.parentNode!==t&&(t.innerHTML="",t.appendChild(e)):t.textContent=e.textContent)):void(this._config.html?(this._config.sanitize&&(e=Dt(e,this._config.allowList,this._config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){let t=this._element.getAttribute("data-bs-original-title");return t||(t="function"==typeof this._config.title?this._config.title.call(this._element):this._config.title),t}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){const s=this.constructor.DATA_KEY;return(e=e||W.get(t.delegateTarget,s))||(e=new this.constructor(t.delegateTarget,this._getDelegateConfig()),W.set(t.delegateTarget,s,e)),e}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(t))}_getAttachment(t){return xt[t.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(t=>{if("click"===t)B.on(this._element,this.constructor.Event.CLICK,this._config.selector,t=>this.toggle(t));else if("manual"!==t){const e="hover"===t?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,s="hover"===t?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;B.on(this._element,e,this._config.selector,t=>this._enter(t)),B.on(this._element,s,this._config.selector,t=>this._leave(t))}}),this._hideModalHandler=()=>{this._element&&this.hide()},B.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e.getTipElement().classList.contains("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e._config.delay&&e._config.delay.show?e._timeout=setTimeout(()=>{"show"===e._hoverState&&e.show()},e._config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e._config.delay&&e._config.delay.hide?e._timeout=setTimeout(()=>{"out"===e._hoverState&&e.hide()},e._config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=V.getDataAttributes(this._element);return Object.keys(e).forEach(t=>{Nt.has(t)&&delete e[t]}),(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).container=!1===t.container?document.body:h(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),d("tooltip",t,this.constructor.DefaultType),t.sanitize&&(t.template=Dt(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){const t={};if(this._config)for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_cleanTipClass(){const t=this.getTipElement(),e=t.getAttribute("class").match(It);null!==e&&e.length>0&&e.map(t=>t.trim()).forEach(e=>t.classList.remove(e))}_handlePopperPlacementChange(t){const{state:e}=t;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))}static jQueryInterface(t){return this.each((function(){const e=jt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}y(jt);const Ht=new RegExp("(^|\\s)bs-popover\\S+","g"),Rt={...jt.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'},Bt={...jt.DefaultType,content:"(string|element|function)"},$t={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class Wt extends jt{static get Default(){return Rt}static get NAME(){return"popover"}static get Event(){return $t}static get DefaultType(){return Bt}isWithContent(){return this.getTitle()||this._getContent()}getTipElement(){return this.tip||(this.tip=super.getTipElement(),this.getTitle()||i.findOne(".popover-header",this.tip).remove(),this._getContent()||i.findOne(".popover-body",this.tip).remove()),this.tip}setContent(){const t=this.getTipElement();this.setElementContent(i.findOne(".popover-header",t),this.getTitle());let e=this._getContent();"function"==typeof e&&(e=e.call(this._element)),this.setElementContent(i.findOne(".popover-body",t),e),t.classList.remove("fade","show")}_addAttachmentClass(t){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(t))}_getContent(){return this._element.getAttribute("data-bs-content")||this._config.content}_cleanTipClass(){const t=this.getTipElement(),e=t.getAttribute("class").match(Ht);null!==e&&e.length>0&&e.map(t=>t.trim()).forEach(e=>t.classList.remove(e))}static jQueryInterface(t){return this.each((function(){const e=Wt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}y(Wt);const qt={offset:10,method:"auto",target:""},zt={offset:"number",method:"string",target:"(string|element)"};class Ft extends q{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._selector=`${this._config.target} .nav-link, ${this._config.target} .list-group-item, ${this._config.target} .dropdown-item`,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,B.on(this._scrollElement,"scroll.bs.scrollspy",()=>this._process()),this.refresh(),this._process()}static get Default(){return qt}static get NAME(){return"scrollspy"}refresh(){const t=this._scrollElement===this._scrollElement.window?"offset":"position",e="auto"===this._config.method?t:this._config.method,s="position"===e?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),i.find(this._selector).map(t=>{const n=r(t),o=n?i.findOne(n):null;if(o){const t=o.getBoundingClientRect();if(t.width||t.height)return[V[e](o).top+s,n]}return null}).filter(t=>t).sort((t,e)=>t[0]-e[0]).forEach(t=>{this._offsets.push(t[0]),this._targets.push(t[1])})}dispose(){B.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(t){if("string"!=typeof(t={...qt,...V.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}}).target&&c(t.target)){let{id:e}=t.target;e||(e=n("scrollspy"),t.target.id=e),t.target="#"+e}return d("scrollspy",t,zt),t}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),s=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=s){const t=this._targets[this._targets.length-1];this._activeTarget!==t&&this._activate(t)}else{if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(let e=this._offsets.length;e--;)this._activeTarget!==this._targets[e]&&t>=this._offsets[e]&&(void 0===this._offsets[e+1]||t<this._offsets[e+1])&&this._activate(this._targets[e])}}_activate(t){this._activeTarget=t,this._clear();const e=this._selector.split(",").map(e=>`${e}[data-bs-target="${t}"],${e}[href="${t}"]`),s=i.findOne(e.join(","));s.classList.contains("dropdown-item")?(i.findOne(".dropdown-toggle",s.closest(".dropdown")).classList.add("active"),s.classList.add("active")):(s.classList.add("active"),i.parents(s,".nav, .list-group").forEach(t=>{i.prev(t,".nav-link, .list-group-item").forEach(t=>t.classList.add("active")),i.prev(t,".nav-item").forEach(t=>{i.children(t,".nav-link").forEach(t=>t.classList.add("active"))})})),B.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:t})}_clear(){i.find(this._selector).filter(t=>t.classList.contains("active")).forEach(t=>t.classList.remove("active"))}static jQueryInterface(t){return this.each((function(){const e=Ft.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}B.on(window,"load.bs.scrollspy.data-api",()=>{i.find('[data-bs-spy="scroll"]').forEach(t=>new Ft(t))}),y(Ft);class Ut extends q{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains("active"))return;let t;const e=a(this._element),s=this._element.closest(".nav, .list-group");if(s){const e="UL"===s.nodeName||"OL"===s.nodeName?":scope > li > .active":".active";t=i.find(e,s),t=t[t.length-1]}const n=t?B.trigger(t,"hide.bs.tab",{relatedTarget:this._element}):null;if(B.trigger(this._element,"show.bs.tab",{relatedTarget:t}).defaultPrevented||null!==n&&n.defaultPrevented)return;this._activate(this._element,s);const o=()=>{B.trigger(t,"hidden.bs.tab",{relatedTarget:this._element}),B.trigger(this._element,"shown.bs.tab",{relatedTarget:t})};e?this._activate(e,e.parentNode,o):o()}_activate(t,e,s){const n=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?i.children(e,".active"):i.find(":scope > li > .active",e))[0],o=s&&n&&n.classList.contains("fade"),r=()=>this._transitionComplete(t,n,s);n&&o?(n.classList.remove("show"),this._queueCallback(r,t,!0)):r()}_transitionComplete(t,e,s){if(e){e.classList.remove("active");const t=i.findOne(":scope > .dropdown-menu .active",e.parentNode);t&&t.classList.remove("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}t.classList.add("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),m(t),t.classList.contains("fade")&&t.classList.add("show");let n=t.parentNode;if(n&&"LI"===n.nodeName&&(n=n.parentNode),n&&n.classList.contains("dropdown-menu")){const e=t.closest(".dropdown");e&&i.find(".dropdown-toggle",e).forEach(t=>t.classList.add("active")),t.setAttribute("aria-expanded",!0)}s&&s()}static jQueryInterface(t){return this.each((function(){const e=Ut.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}B.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),g(this)||Ut.getOrCreateInstance(this).show()})),y(Ut);const Kt={animation:"boolean",autohide:"boolean",delay:"number"},Vt={animation:!0,autohide:!0,delay:5e3};class Qt extends q{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return Kt}static get Default(){return Vt}static get NAME(){return"toast"}show(){B.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove("hide"),m(this._element),this._element.classList.add("showing"),this._queueCallback(()=>{this._element.classList.remove("showing"),this._element.classList.add("show"),B.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this._element.classList.contains("show")&&(B.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.remove("show"),this._queueCallback(()=>{this._element.classList.add("hide"),B.trigger(this._element,"hidden.bs.toast")},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),super.dispose()}_getConfig(t){return t={...Vt,...V.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},d("toast",t,this.constructor.DefaultType),t}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const s=t.relatedTarget;this._element===s||this._element.contains(s)||this._maybeScheduleHide()}_setListeners(){B.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',()=>this.hide()),B.on(this._element,"mouseover.bs.toast",t=>this._onInteraction(t,!0)),B.on(this._element,"mouseout.bs.toast",t=>this._onInteraction(t,!1)),B.on(this._element,"focusin.bs.toast",t=>this._onInteraction(t,!0)),B.on(this._element,"focusout.bs.toast",t=>this._onInteraction(t,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Qt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return y(Qt),{Alert:z,Button:F,Carousel:et,Collapse:nt,Dropdown:pt,Modal:wt,Offcanvas:Tt,Popover:Wt,ScrollSpy:Ft,Tab:Ut,Toast:Qt,Tooltip:jt}}));PKBA#]]�4�����/system/helixultimate/assets/js/chosen.jquery.jsnu�[���(function() { var $, AbstractChosen, Chosen, SelectParser, bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; SelectParser = (function() { function SelectParser() { this.options_index = 0; this.parsed = []; } SelectParser.prototype.add_node = function(child) { if (child.nodeName.toUpperCase() === "OPTGROUP") { return this.add_group(child); } else { return this.add_option(child); } }; SelectParser.prototype.add_group = function(group) { var group_position, i, len, option, ref, results1; group_position = this.parsed.length; this.parsed.push({ array_index: group_position, group: true, label: group.label, title: group.title ? group.title : void 0, children: 0, disabled: group.disabled, classes: group.className }); ref = group.childNodes; results1 = []; for (i = 0, len = ref.length; i < len; i++) { option = ref[i]; results1.push(this.add_option(option, group_position, group.disabled)); } return results1; }; SelectParser.prototype.add_option = function(option, group_position, group_disabled) { if (option.nodeName.toUpperCase() === "OPTION") { if (option.text !== "") { if (group_position != null) { this.parsed[group_position].children += 1; } this.parsed.push({ array_index: this.parsed.length, options_index: this.options_index, value: option.value, text: option.text, html: option.innerHTML, title: option.title ? option.title : void 0, selected: option.selected, disabled: group_disabled === true ? group_disabled : option.disabled, group_array_index: group_position, group_label: group_position != null ? this.parsed[group_position].label : null, classes: option.className, style: option.style.cssText }); } else { this.parsed.push({ array_index: this.parsed.length, options_index: this.options_index, empty: true }); } return this.options_index += 1; } }; return SelectParser; })(); SelectParser.select_to_array = function(select) { var child, i, len, parser, ref; parser = new SelectParser(); ref = select.childNodes; for (i = 0, len = ref.length; i < len; i++) { child = ref[i]; parser.add_node(child); } return parser.parsed; }; AbstractChosen = (function() { function AbstractChosen(form_field, options1) { this.form_field = form_field; this.options = options1 != null ? options1 : {}; this.label_click_handler = bind(this.label_click_handler, this); if (!AbstractChosen.browser_is_supported()) { return; } this.is_multiple = this.form_field.multiple; this.set_default_text(); this.set_default_values(); this.setup(); this.set_up_html(); this.register_observers(); this.on_ready(); } AbstractChosen.prototype.set_default_values = function() { this.click_test_action = (function(_this) { return function(evt) { return _this.test_active_click(evt); }; })(this); this.activate_action = (function(_this) { return function(evt) { return _this.activate_field(evt); }; })(this); this.active_field = false; this.mouse_on_container = false; this.results_showing = false; this.result_highlighted = null; this.is_rtl = this.options.rtl || /\bchosen-rtl\b/.test(this.form_field.className); this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false; this.disable_search_threshold = this.options.disable_search_threshold || 0; this.disable_search = this.options.disable_search || false; this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true; this.group_search = this.options.group_search != null ? this.options.group_search : true; this.search_contains = this.options.search_contains || false; this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true; this.max_selected_options = this.options.max_selected_options || Infinity; this.inherit_select_classes = this.options.inherit_select_classes || false; this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true; this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true; this.include_group_label_in_selected = this.options.include_group_label_in_selected || false; this.max_shown_results = this.options.max_shown_results || Number.POSITIVE_INFINITY; this.case_sensitive_search = this.options.case_sensitive_search || false; return this.hide_results_on_select = this.options.hide_results_on_select != null ? this.options.hide_results_on_select : true; }; AbstractChosen.prototype.set_default_text = function() { if (this.form_field.getAttribute("data-placeholder")) { this.default_text = this.form_field.getAttribute("data-placeholder"); } else if (this.is_multiple) { this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text; } else { this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text; } this.default_text = this.escape_html(this.default_text); return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text; }; AbstractChosen.prototype.choice_label = function(item) { if (this.include_group_label_in_selected && (item.group_label != null)) { return "<b class='group-name'>" + (this.escape_html(item.group_label)) + "</b>" + item.html; } else { return item.html; } }; AbstractChosen.prototype.mouse_enter = function() { return this.mouse_on_container = true; }; AbstractChosen.prototype.mouse_leave = function() { return this.mouse_on_container = false; }; AbstractChosen.prototype.input_focus = function(evt) { if (this.is_multiple) { if (!this.active_field) { return setTimeout(((function(_this) { return function() { return _this.container_mousedown(); }; })(this)), 50); } } else { if (!this.active_field) { return this.activate_field(); } } }; AbstractChosen.prototype.input_blur = function(evt) { if (!this.mouse_on_container) { this.active_field = false; return setTimeout(((function(_this) { return function() { return _this.blur_test(); }; })(this)), 100); } }; AbstractChosen.prototype.label_click_handler = function(evt) { if (this.is_multiple) { return this.container_mousedown(evt); } else { return this.activate_field(); } }; AbstractChosen.prototype.results_option_build = function(options) { var content, data, data_content, i, len, ref, shown_results; content = ''; shown_results = 0; ref = this.results_data; for (i = 0, len = ref.length; i < len; i++) { data = ref[i]; data_content = ''; if (data.group) { data_content = this.result_add_group(data); } else { data_content = this.result_add_option(data); } if (data_content !== '') { shown_results++; content += data_content; } if (options != null ? options.first : void 0) { if (data.selected && this.is_multiple) { this.choice_build(data); } else if (data.selected && !this.is_multiple) { this.single_set_selected_text(this.choice_label(data)); } } if (shown_results >= this.max_shown_results) { break; } } return content; }; AbstractChosen.prototype.result_add_option = function(option) { var classes, option_el; if (!option.search_match) { return ''; } if (!this.include_option_in_results(option)) { return ''; } classes = []; if (!option.disabled && !(option.selected && this.is_multiple)) { classes.push("active-result"); } if (option.disabled && !(option.selected && this.is_multiple)) { classes.push("disabled-result"); } if (option.selected) { classes.push("result-selected"); } if (option.group_array_index != null) { classes.push("group-option"); } if (option.classes !== "") { classes.push(option.classes); } option_el = document.createElement("li"); option_el.className = classes.join(" "); if (option.style) { option_el.style.cssText = option.style; } option_el.setAttribute("data-option-array-index", option.array_index); option_el.innerHTML = option.highlighted_html || option.html; if (option.title) { option_el.title = option.title; } return this.outerHTML(option_el); }; AbstractChosen.prototype.result_add_group = function(group) { var classes, group_el; if (!(group.search_match || group.group_match)) { return ''; } if (!(group.active_options > 0)) { return ''; } classes = []; classes.push("group-result"); if (group.classes) { classes.push(group.classes); } group_el = document.createElement("li"); group_el.className = classes.join(" "); group_el.innerHTML = group.highlighted_html || this.escape_html(group.label); if (group.title) { group_el.title = group.title; } return this.outerHTML(group_el); }; AbstractChosen.prototype.results_update_field = function() { this.set_default_text(); if (!this.is_multiple) { this.results_reset_cleanup(); } this.result_clear_highlight(); this.results_build(); if (this.results_showing) { return this.winnow_results(); } }; AbstractChosen.prototype.reset_single_select_options = function() { var i, len, ref, result, results1; ref = this.results_data; results1 = []; for (i = 0, len = ref.length; i < len; i++) { result = ref[i]; if (result.selected) { results1.push(result.selected = false); } else { results1.push(void 0); } } return results1; }; AbstractChosen.prototype.results_toggle = function() { if (this.results_showing) { return this.results_hide(); } else { return this.results_show(); } }; AbstractChosen.prototype.results_search = function(evt) { if (this.results_showing) { return this.winnow_results(); } else { return this.results_show(); } }; AbstractChosen.prototype.winnow_results = function(options) { var escapedQuery, fix, i, len, option, prefix, query, ref, regex, results, results_group, search_match, startpos, suffix, text; this.no_results_clear(); results = 0; query = this.get_search_text(); escapedQuery = query.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); regex = this.get_search_regex(escapedQuery); ref = this.results_data; for (i = 0, len = ref.length; i < len; i++) { option = ref[i]; option.search_match = false; results_group = null; search_match = null; option.highlighted_html = ''; if (this.include_option_in_results(option)) { if (option.group) { option.group_match = false; option.active_options = 0; } if ((option.group_array_index != null) && this.results_data[option.group_array_index]) { results_group = this.results_data[option.group_array_index]; if (results_group.active_options === 0 && results_group.search_match) { results += 1; } results_group.active_options += 1; } text = option.group ? option.label : option.text; if (!(option.group && !this.group_search)) { search_match = this.search_string_match(text, regex); option.search_match = search_match != null; if (option.search_match && !option.group) { results += 1; } if (option.search_match) { if (query.length) { startpos = search_match.index; prefix = text.slice(0, startpos); fix = text.slice(startpos, startpos + query.length); suffix = text.slice(startpos + query.length); option.highlighted_html = (this.escape_html(prefix)) + "<em>" + (this.escape_html(fix)) + "</em>" + (this.escape_html(suffix)); } if (results_group != null) { results_group.group_match = true; } } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) { option.search_match = true; } } } } this.result_clear_highlight(); if (results < 1 && query.length) { this.update_results_content(""); return this.no_results(query); } else { this.update_results_content(this.results_option_build()); if (!(options != null ? options.skip_highlight : void 0)) { return this.winnow_results_set_highlight(); } } }; AbstractChosen.prototype.get_search_regex = function(escaped_search_string) { var regex_flag, regex_string; regex_string = this.search_contains ? escaped_search_string : "(^|\\s|\\b)" + escaped_search_string + "[^\\s]*"; if (!(this.enable_split_word_search || this.search_contains)) { regex_string = "^" + regex_string; } regex_flag = this.case_sensitive_search ? "" : "i"; return new RegExp(regex_string, regex_flag); }; AbstractChosen.prototype.search_string_match = function(search_string, regex) { var match; match = regex.exec(search_string); if (!this.search_contains && (match != null ? match[1] : void 0)) { match.index += 1; } return match; }; AbstractChosen.prototype.choices_count = function() { var i, len, option, ref; if (this.selected_option_count != null) { return this.selected_option_count; } this.selected_option_count = 0; ref = this.form_field.options; for (i = 0, len = ref.length; i < len; i++) { option = ref[i]; if (option.selected) { this.selected_option_count += 1; } } return this.selected_option_count; }; AbstractChosen.prototype.choices_click = function(evt) { evt.preventDefault(); this.activate_field(); if (!(this.results_showing || this.is_disabled)) { return this.results_show(); } }; AbstractChosen.prototype.keydown_checker = function(evt) { var ref, stroke; stroke = (ref = evt.which) != null ? ref : evt.keyCode; this.search_field_scale(); if (stroke !== 8 && this.pending_backstroke) { this.clear_backstroke(); } switch (stroke) { case 8: this.backstroke_length = this.get_search_field_value().length; break; case 9: if (this.results_showing && !this.is_multiple) { this.result_select(evt); } this.mouse_on_container = false; break; case 13: if (this.results_showing) { evt.preventDefault(); } break; case 27: if (this.results_showing) { evt.preventDefault(); } break; case 32: if (this.disable_search) { evt.preventDefault(); } break; case 38: evt.preventDefault(); this.keyup_arrow(); break; case 40: evt.preventDefault(); this.keydown_arrow(); break; } }; AbstractChosen.prototype.keyup_checker = function(evt) { var ref, stroke; stroke = (ref = evt.which) != null ? ref : evt.keyCode; this.search_field_scale(); switch (stroke) { case 8: if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) { this.keydown_backstroke(); } else if (!this.pending_backstroke) { this.result_clear_highlight(); this.results_search(); } break; case 13: evt.preventDefault(); if (this.results_showing) { this.result_select(evt); } break; case 27: if (this.results_showing) { this.results_hide(); } break; case 9: case 16: case 17: case 18: case 38: case 40: case 91: break; default: this.results_search(); break; } }; AbstractChosen.prototype.clipboard_event_checker = function(evt) { if (this.is_disabled) { return; } return setTimeout(((function(_this) { return function() { return _this.results_search(); }; })(this)), 50); }; AbstractChosen.prototype.container_width = function() { if (this.options.width != null) { return this.options.width; } else { return this.form_field.offsetWidth + "px"; } }; AbstractChosen.prototype.include_option_in_results = function(option) { if (this.is_multiple && (!this.display_selected_options && option.selected)) { return false; } if (!this.display_disabled_options && option.disabled) { return false; } if (option.empty) { return false; } return true; }; AbstractChosen.prototype.search_results_touchstart = function(evt) { this.touch_started = true; return this.search_results_mouseover(evt); }; AbstractChosen.prototype.search_results_touchmove = function(evt) { this.touch_started = false; return this.search_results_mouseout(evt); }; AbstractChosen.prototype.search_results_touchend = function(evt) { if (this.touch_started) { return this.search_results_mouseup(evt); } }; AbstractChosen.prototype.outerHTML = function(element) { var tmp; if (element.outerHTML) { return element.outerHTML; } tmp = document.createElement("div"); tmp.appendChild(element); return tmp.innerHTML; }; AbstractChosen.prototype.get_single_html = function() { return "<a class=\"chosen-single chosen-default\">\n <span>" + this.default_text + "</span>\n <div><b></b></div>\n</a>\n<div class=\"chosen-drop\">\n <div class=\"chosen-search\">\n <input class=\"chosen-search-input\" type=\"text\" autocomplete=\"off\" />\n </div>\n <ul class=\"chosen-results\"></ul>\n</div>"; }; AbstractChosen.prototype.get_multi_html = function() { return "<ul class=\"chosen-choices\">\n <li class=\"search-field\">\n <input class=\"chosen-search-input\" type=\"text\" autocomplete=\"off\" value=\"" + this.default_text + "\" />\n </li>\n</ul>\n<div class=\"chosen-drop\">\n <ul class=\"chosen-results\"></ul>\n</div>"; }; AbstractChosen.prototype.get_no_results_html = function(terms) { return "<li class=\"no-results\">\n " + this.results_none_found + " <span>" + (this.escape_html(terms)) + "</span>\n</li>"; }; AbstractChosen.browser_is_supported = function() { if ("Microsoft Internet Explorer" === window.navigator.appName) { return document.documentMode >= 8; } if (/iP(od|hone)/i.test(window.navigator.userAgent) || /IEMobile/i.test(window.navigator.userAgent) || /Windows Phone/i.test(window.navigator.userAgent) || /BlackBerry/i.test(window.navigator.userAgent) || /BB10/i.test(window.navigator.userAgent) || /Android.*Mobile/i.test(window.navigator.userAgent)) { return false; } return true; }; AbstractChosen.default_multiple_text = "Select Some Options"; AbstractChosen.default_single_text = "Select an Option"; AbstractChosen.default_no_result_text = "No results match"; return AbstractChosen; })(); $ = jQuery; $.fn.extend({ chosen: function(options) { if (!AbstractChosen.browser_is_supported()) { return this; } return this.each(function(input_field) { var $this, chosen; $this = $(this); chosen = $this.data('chosen'); if (options === 'destroy') { if (chosen instanceof Chosen) { chosen.destroy(); } return; } if (!(chosen instanceof Chosen)) { $this.data('chosen', new Chosen(this, options)); } }); } }); Chosen = (function(superClass) { extend(Chosen, superClass); function Chosen() { return Chosen.__super__.constructor.apply(this, arguments); } Chosen.prototype.setup = function() { this.form_field_jq = $(this.form_field); return this.current_selectedIndex = this.form_field.selectedIndex; }; Chosen.prototype.set_up_html = function() { var container_classes, container_props; container_classes = ["chosen-container"]; container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single")); if (this.inherit_select_classes && this.form_field.className) { container_classes.push(this.form_field.className); } if (this.is_rtl) { container_classes.push("chosen-rtl"); } container_props = { 'class': container_classes.join(' '), 'title': this.form_field.title }; if (this.form_field.id.length) { container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen"; } this.container = $("<div />", container_props); this.container.width(this.container_width()); if (this.is_multiple) { this.container.html(this.get_multi_html()); } else { this.container.html(this.get_single_html()); } this.form_field_jq.hide().after(this.container); this.dropdown = this.container.find('div.chosen-drop').first(); this.search_field = this.container.find('input').first(); this.search_results = this.container.find('ul.chosen-results').first(); this.search_field_scale(); this.search_no_results = this.container.find('li.no-results').first(); if (this.is_multiple) { this.search_choices = this.container.find('ul.chosen-choices').first(); this.search_container = this.container.find('li.search-field').first(); } else { this.search_container = this.container.find('div.chosen-search').first(); this.selected_item = this.container.find('.chosen-single').first(); } this.results_build(); this.set_tab_index(); return this.set_label_behavior(); }; Chosen.prototype.on_ready = function() { return this.form_field_jq.trigger("chosen:ready", { chosen: this }); }; Chosen.prototype.register_observers = function() { this.container.on('touchstart.chosen', (function(_this) { return function(evt) { _this.container_mousedown(evt); }; })(this)); this.container.on('touchend.chosen', (function(_this) { return function(evt) { _this.container_mouseup(evt); }; })(this)); this.container.on('mousedown.chosen', (function(_this) { return function(evt) { _this.container_mousedown(evt); }; })(this)); this.container.on('mouseup.chosen', (function(_this) { return function(evt) { _this.container_mouseup(evt); }; })(this)); this.container.on('mouseenter.chosen', (function(_this) { return function(evt) { _this.mouse_enter(evt); }; })(this)); this.container.on('mouseleave.chosen', (function(_this) { return function(evt) { _this.mouse_leave(evt); }; })(this)); this.search_results.on('mouseup.chosen', (function(_this) { return function(evt) { _this.search_results_mouseup(evt); }; })(this)); this.search_results.on('mouseover.chosen', (function(_this) { return function(evt) { _this.search_results_mouseover(evt); }; })(this)); this.search_results.on('mouseout.chosen', (function(_this) { return function(evt) { _this.search_results_mouseout(evt); }; })(this)); this.search_results.on('mousewheel.chosen DOMMouseScroll.chosen', (function(_this) { return function(evt) { _this.search_results_mousewheel(evt); }; })(this)); this.search_results.on('touchstart.chosen', (function(_this) { return function(evt) { _this.search_results_touchstart(evt); }; })(this)); this.search_results.on('touchmove.chosen', (function(_this) { return function(evt) { _this.search_results_touchmove(evt); }; })(this)); this.search_results.on('touchend.chosen', (function(_this) { return function(evt) { _this.search_results_touchend(evt); }; })(this)); this.form_field_jq.on("chosen:updated.chosen", (function(_this) { return function(evt) { _this.results_update_field(evt); }; })(this)); this.form_field_jq.on("chosen:activate.chosen", (function(_this) { return function(evt) { _this.activate_field(evt); }; })(this)); this.form_field_jq.on("chosen:open.chosen", (function(_this) { return function(evt) { _this.container_mousedown(evt); }; })(this)); this.form_field_jq.on("chosen:close.chosen", (function(_this) { return function(evt) { _this.close_field(evt); }; })(this)); this.search_field.on('blur.chosen', (function(_this) { return function(evt) { _this.input_blur(evt); }; })(this)); this.search_field.on('keyup.chosen', (function(_this) { return function(evt) { _this.keyup_checker(evt); }; })(this)); this.search_field.on('keydown.chosen', (function(_this) { return function(evt) { _this.keydown_checker(evt); }; })(this)); this.search_field.on('focus.chosen', (function(_this) { return function(evt) { _this.input_focus(evt); }; })(this)); this.search_field.on('cut.chosen', (function(_this) { return function(evt) { _this.clipboard_event_checker(evt); }; })(this)); this.search_field.on('paste.chosen', (function(_this) { return function(evt) { _this.clipboard_event_checker(evt); }; })(this)); if (this.is_multiple) { return this.search_choices.on('click.chosen', (function(_this) { return function(evt) { _this.choices_click(evt); }; })(this)); } else { return this.container.on('click.chosen', function(evt) { evt.preventDefault(); }); } }; Chosen.prototype.destroy = function() { $(this.container[0].ownerDocument).off('click.chosen', this.click_test_action); if (this.form_field_label.length > 0) { this.form_field_label.off('click.chosen'); } if (this.search_field[0].tabIndex) { this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex; } this.container.remove(); this.form_field_jq.removeData('chosen'); return this.form_field_jq.show(); }; Chosen.prototype.search_field_disabled = function() { this.is_disabled = this.form_field.disabled || this.form_field_jq.parents('fieldset').is(':disabled'); this.container.toggleClass('chosen-disabled', this.is_disabled); this.search_field[0].disabled = this.is_disabled; if (!this.is_multiple) { this.selected_item.off('focus.chosen', this.activate_field); } if (this.is_disabled) { return this.close_field(); } else if (!this.is_multiple) { return this.selected_item.on('focus.chosen', this.activate_field); } }; Chosen.prototype.container_mousedown = function(evt) { var ref; if (this.is_disabled) { return; } if (evt && ((ref = evt.type) === 'mousedown' || ref === 'touchstart') && !this.results_showing) { evt.preventDefault(); } if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) { if (!this.active_field) { if (this.is_multiple) { this.search_field.val(""); } $(this.container[0].ownerDocument).on('click.chosen', this.click_test_action); this.results_show(); } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) { evt.preventDefault(); this.results_toggle(); } return this.activate_field(); } }; Chosen.prototype.container_mouseup = function(evt) { if (evt.target.nodeName === "ABBR" && !this.is_disabled) { return this.results_reset(evt); } }; Chosen.prototype.search_results_mousewheel = function(evt) { var delta; if (evt.originalEvent) { delta = evt.originalEvent.deltaY || -evt.originalEvent.wheelDelta || evt.originalEvent.detail; } if (delta != null) { evt.preventDefault(); if (evt.type === 'DOMMouseScroll') { delta = delta * 40; } return this.search_results.scrollTop(delta + this.search_results.scrollTop()); } }; Chosen.prototype.blur_test = function(evt) { if (!this.active_field && this.container.hasClass("chosen-container-active")) { return this.close_field(); } }; Chosen.prototype.close_field = function() { $(this.container[0].ownerDocument).off("click.chosen", this.click_test_action); this.active_field = false; this.results_hide(); this.container.removeClass("chosen-container-active"); this.clear_backstroke(); this.show_search_field_default(); this.search_field_scale(); return this.search_field.blur(); }; Chosen.prototype.activate_field = function() { if (this.is_disabled) { return; } this.container.addClass("chosen-container-active"); this.active_field = true; this.search_field.val(this.search_field.val()); return this.search_field.focus(); }; Chosen.prototype.test_active_click = function(evt) { var active_container; active_container = $(evt.target).closest('.chosen-container'); if (active_container.length && this.container[0] === active_container[0]) { return this.active_field = true; } else { return this.close_field(); } }; Chosen.prototype.results_build = function() { this.parsing = true; this.selected_option_count = null; this.results_data = SelectParser.select_to_array(this.form_field); if (this.is_multiple) { this.search_choices.find("li.search-choice").remove(); } else { this.single_set_selected_text(); if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) { this.search_field[0].readOnly = true; this.container.addClass("chosen-container-single-nosearch"); } else { this.search_field[0].readOnly = false; this.container.removeClass("chosen-container-single-nosearch"); } } this.update_results_content(this.results_option_build({ first: true })); this.search_field_disabled(); this.show_search_field_default(); this.search_field_scale(); return this.parsing = false; }; Chosen.prototype.result_do_highlight = function(el) { var high_bottom, high_top, maxHeight, visible_bottom, visible_top; if (el.length) { this.result_clear_highlight(); this.result_highlight = el; this.result_highlight.addClass("highlighted"); maxHeight = parseInt(this.search_results.css("maxHeight"), 10); visible_top = this.search_results.scrollTop(); visible_bottom = maxHeight + visible_top; high_top = this.result_highlight.position().top + this.search_results.scrollTop(); high_bottom = high_top + this.result_highlight.outerHeight(); if (high_bottom >= visible_bottom) { return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0); } else if (high_top < visible_top) { return this.search_results.scrollTop(high_top); } } }; Chosen.prototype.result_clear_highlight = function() { if (this.result_highlight) { this.result_highlight.removeClass("highlighted"); } return this.result_highlight = null; }; Chosen.prototype.results_show = function() { if (this.is_multiple && this.max_selected_options <= this.choices_count()) { this.form_field_jq.trigger("chosen:maxselected", { chosen: this }); return false; } this.container.addClass("chosen-with-drop"); this.results_showing = true; this.search_field.focus(); this.search_field.val(this.get_search_field_value()); this.winnow_results(); return this.form_field_jq.trigger("chosen:showing_dropdown", { chosen: this }); }; Chosen.prototype.update_results_content = function(content) { return this.search_results.html(content); }; Chosen.prototype.results_hide = function() { if (this.results_showing) { this.result_clear_highlight(); this.container.removeClass("chosen-with-drop"); this.form_field_jq.trigger("chosen:hiding_dropdown", { chosen: this }); } return this.results_showing = false; }; Chosen.prototype.set_tab_index = function(el) { var ti; ti = this.form_field.tabIndex; if (ti === -1) { ti = -1; } else { ti = 0; } this.form_field.tabIndex = -1; this.search_field[0].tabIndex = ti; return this.search_field[0].tabIndex; }; Chosen.prototype.set_label_behavior = function() { this.form_field_label = this.form_field_jq.parents("label"); if (!this.form_field_label.length && this.form_field.id.length) { this.form_field_label = $("label[for='" + this.form_field.id + "']"); } if (this.form_field_label.length > 0) { return this.form_field_label.on('click.chosen', this.label_click_handler); } }; Chosen.prototype.show_search_field_default = function() { if (this.is_multiple && this.choices_count() < 1 && !this.active_field) { this.search_field.val(this.default_text); return this.search_field.addClass("default"); } else { this.search_field.val(""); return this.search_field.removeClass("default"); } }; Chosen.prototype.search_results_mouseup = function(evt) { var target; target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); if (target.length) { this.result_highlight = target; this.result_select(evt); return this.search_field.focus(); } }; Chosen.prototype.search_results_mouseover = function(evt) { var target; target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); if (target) { return this.result_do_highlight(target); } }; Chosen.prototype.search_results_mouseout = function(evt) { if ($(evt.target).hasClass("active-result") || $(evt.target).parents('.active-result').first()) { return this.result_clear_highlight(); } }; Chosen.prototype.choice_build = function(item) { var choice, close_link; choice = $('<li />', { "class": "search-choice" }).html("<span>" + (this.choice_label(item)) + "</span>"); if (item.disabled) { choice.addClass('search-choice-disabled'); } else { close_link = $('<a />', { "class": 'search-choice-close', 'data-option-array-index': item.array_index }); close_link.on('click.chosen', (function(_this) { return function(evt) { return _this.choice_destroy_link_click(evt); }; })(this)); choice.append(close_link); } return this.search_container.before(choice); }; Chosen.prototype.choice_destroy_link_click = function(evt) { evt.preventDefault(); evt.stopPropagation(); if (!this.is_disabled) { return this.choice_destroy($(evt.target)); } }; Chosen.prototype.choice_destroy = function(link) { if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) { if (this.active_field) { this.search_field.focus(); } else { this.show_search_field_default(); } if (this.is_multiple && this.choices_count() > 0 && this.get_search_field_value().length < 1) { this.results_hide(); } link.parents('li').first().remove(); return this.search_field_scale(); } }; Chosen.prototype.results_reset = function() { this.reset_single_select_options(); this.form_field.options[0].selected = true; this.single_set_selected_text(); this.show_search_field_default(); this.results_reset_cleanup(); this.trigger_form_field_change(); if (this.active_field) { return this.results_hide(); } }; Chosen.prototype.results_reset_cleanup = function() { this.current_selectedIndex = this.form_field.selectedIndex; return this.selected_item.find("abbr").remove(); }; Chosen.prototype.result_select = function(evt) { var high, item; if (this.result_highlight) { high = this.result_highlight; this.result_clear_highlight(); if (this.is_multiple && this.max_selected_options <= this.choices_count()) { this.form_field_jq.trigger("chosen:maxselected", { chosen: this }); return false; } if (this.is_multiple) { high.removeClass("active-result"); } else { this.reset_single_select_options(); } high.addClass("result-selected"); item = this.results_data[high[0].getAttribute("data-option-array-index")]; item.selected = true; this.form_field.options[item.options_index].selected = true; this.selected_option_count = null; if (this.is_multiple) { this.choice_build(item); } else { this.single_set_selected_text(this.choice_label(item)); } if (this.is_multiple && (!this.hide_results_on_select || (evt.metaKey || evt.ctrlKey))) { if (evt.metaKey || evt.ctrlKey) { this.winnow_results({ skip_highlight: true }); } else { this.search_field.val(""); this.winnow_results(); } } else { this.results_hide(); this.show_search_field_default(); } if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) { this.trigger_form_field_change({ selected: this.form_field.options[item.options_index].value }); } this.current_selectedIndex = this.form_field.selectedIndex; evt.preventDefault(); return this.search_field_scale(); } }; Chosen.prototype.single_set_selected_text = function(text) { if (text == null) { text = this.default_text; } if (text === this.default_text) { this.selected_item.addClass("chosen-default"); } else { this.single_deselect_control_build(); this.selected_item.removeClass("chosen-default"); } return this.selected_item.find("span").html(text); }; Chosen.prototype.result_deselect = function(pos) { var result_data; result_data = this.results_data[pos]; if (!this.form_field.options[result_data.options_index].disabled) { result_data.selected = false; this.form_field.options[result_data.options_index].selected = false; this.selected_option_count = null; this.result_clear_highlight(); if (this.results_showing) { this.winnow_results(); } this.trigger_form_field_change({ deselected: this.form_field.options[result_data.options_index].value }); this.search_field_scale(); return true; } else { return false; } }; Chosen.prototype.single_deselect_control_build = function() { if (!this.allow_single_deselect) { return; } if (!this.selected_item.find("abbr").length) { this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>"); } return this.selected_item.addClass("chosen-single-with-deselect"); }; Chosen.prototype.get_search_field_value = function() { return this.search_field.val(); }; Chosen.prototype.get_search_text = function() { return $.trim(this.get_search_field_value()); }; Chosen.prototype.escape_html = function(text) { return $('<div/>').text(text).html(); }; Chosen.prototype.winnow_results_set_highlight = function() { var do_high, selected_results; selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : []; do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first(); if (do_high != null) { return this.result_do_highlight(do_high); } }; Chosen.prototype.no_results = function(terms) { var no_results_html; no_results_html = this.get_no_results_html(terms); this.search_results.append(no_results_html); return this.form_field_jq.trigger("chosen:no_results", { chosen: this }); }; Chosen.prototype.no_results_clear = function() { return this.search_results.find(".no-results").remove(); }; Chosen.prototype.keydown_arrow = function() { var next_sib; if (this.results_showing && this.result_highlight) { next_sib = this.result_highlight.nextAll("li.active-result").first(); if (next_sib) { return this.result_do_highlight(next_sib); } } else { return this.results_show(); } }; Chosen.prototype.keyup_arrow = function() { var prev_sibs; if (!this.results_showing && !this.is_multiple) { return this.results_show(); } else if (this.result_highlight) { prev_sibs = this.result_highlight.prevAll("li.active-result"); if (prev_sibs.length) { return this.result_do_highlight(prev_sibs.first()); } else { if (this.choices_count() > 0) { this.results_hide(); } return this.result_clear_highlight(); } } }; Chosen.prototype.keydown_backstroke = function() { var next_available_destroy; if (this.pending_backstroke) { this.choice_destroy(this.pending_backstroke.find("a").first()); return this.clear_backstroke(); } else { next_available_destroy = this.search_container.siblings("li.search-choice").last(); if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) { this.pending_backstroke = next_available_destroy; if (this.single_backstroke_delete) { return this.keydown_backstroke(); } else { return this.pending_backstroke.addClass("search-choice-focus"); } } } }; Chosen.prototype.clear_backstroke = function() { if (this.pending_backstroke) { this.pending_backstroke.removeClass("search-choice-focus"); } return this.pending_backstroke = null; }; Chosen.prototype.search_field_scale = function() { var div, i, len, style, style_block, styles, width; if (!this.is_multiple) { return; } style_block = { position: 'absolute', left: '-1000px', top: '-1000px', display: 'none', whiteSpace: 'pre' }; styles = ['fontSize', 'fontStyle', 'fontWeight', 'fontFamily', 'lineHeight', 'textTransform', 'letterSpacing']; for (i = 0, len = styles.length; i < len; i++) { style = styles[i]; style_block[style] = this.search_field.css(style); } div = $('<div />').css(style_block); div.text(this.get_search_field_value()); $('body').append(div); width = div.width() + 25; div.remove(); if (this.container.is(':visible')) { width = Math.min(this.container.outerWidth() - 10, width); } return this.search_field.width(width); }; Chosen.prototype.trigger_form_field_change = function(extra) { this.form_field_jq.trigger("input", extra); return this.form_field_jq.trigger("change", extra); }; return Chosen; })(AbstractChosen); document.AbstractChosen = AbstractChosen; document.Chosen = Chosen; }).call(this); PKBA#]\�V� 1system/helixultimate/assets/css/frontend-edit.cssnu�[���.layout-edit select,.layout-edit select.inputbox{width:250px;max-width:100%}.layout-edit .btn-toolbar{margin-bottom:20px}.layout-edit .tab-content{padding-top:20px}.layout-edit #editor-xtd-buttons,.layout-edit .toggle-editor{margin-top:20px}.layout-edit .btn-group input[type=radio]{display:none}iframe,svg{max-width:100%}#sbox-content>iframe{height:100%}.alert.alert-message{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert.alert-message h4{color:#468847}.manager.thumbnails{list-style:none;padding:0;margin:0 0 0 -20px}.manager.thumbnails li{text-align:center;display:block;float:left;width:80px;height:80px;line-height:18px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.055);box-shadow:0 1px 3px rgba(0,0,0,.055);position:relative}.manager.thumbnails li [class*=" icon-"],.manager.thumbnails li [class^=icon-]{font-size:14px;line-height:14px;color:#08c;display:inline-block;margin-top:6px}.manager.thumbnails li .height-50{margin-top:4px;height:50px;margin-bottom:4px}.manager.thumbnails li a{text-decoration:none;color:#08c;font-size:13px}.manager.thumbnails li:hover{background:#f7fcff;border-color:rgba(82,168,236,.8);-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);-webkit-transition:all .4s;transition:all .4s}#mailto-window{margin:20px}#mailto-window>h2{font-size:18px;margin-top:0}#mailto-window input[type=text]{height:auto!important}.chzn-container.chzn-container-multi input[type=text]{min-height:30px}.com-content-adminForm textarea{width:350px;height:100px}.com-content-adminForm .input-prepend.input-append .media-preview.add-on{height:34px;line-height:26px}.modal.modal-btn{position:relative;display:inline-block}.com-config .form-horizontal .accordion-body{overflow:hidden}.com-config .form-horizontal .accordion-body.in:hover{overflow:visible}.com-config .form-horizontal .accordion-body .input-prepend.input-append .media-preview.add-on{height:34px;line-height:26px}.com-config .form-horizontal .accordion-body .input-prepend.input-append .btn{position:relative;cursor:pointer;color:#333;border:1px solid #bbb}PKBA#]:,�%�%+system/helixultimate/assets/css/choices.cssnu�[���@charset "UTF-8";.choices{position:relative;margin-bottom:24px;font-size:16px}.choices:focus{outline:0}.choices:last-child{margin-bottom:0}.choices.is-disabled .choices__inner,.choices.is-disabled .choices__input{background-color:#eaeaea;cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.choices.is-disabled .choices__item{cursor:not-allowed}.choices [hidden]{display:none!important}.choices[data-type*=select-one]{cursor:pointer}.choices[data-type*=select-one] .choices__inner{padding-bottom:7.5px}.choices[data-type*=select-one] .choices__input{display:block;width:100%;padding:10px;border-bottom:1px solid var(--gray);background-color:var(--white);margin:0}.choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==);padding:0;background-size:8px;position:absolute;top:50%;right:0;margin-top:-10px;margin-right:25px;height:20px;width:20px;border-radius:10em;opacity:.5}.choices[data-type*=select-one] .choices__button:focus,.choices[data-type*=select-one] .choices__button:hover{opacity:1}.choices[data-type*=select-one] .choices__button:focus{box-shadow:0 0 0 2px var(--cyan)}.choices[data-type*=select-one] .choices__item[data-value=''] .choices__button{display:none}.choices[data-type*=select-one]:after{content:'';height:0;width:0;border-style:solid;border-color:#333 transparent transparent transparent;border-width:5px;position:absolute;right:11.5px;top:50%;margin-top:-2.5px;pointer-events:none}.choices[data-type*=select-one].is-open:after{border-color:transparent transparent #333 transparent;margin-top:-7.5px}.choices[data-type*=select-one][dir=rtl]:after{left:11.5px;right:auto}.choices[data-type*=select-one][dir=rtl] .choices__button{right:auto;left:0;margin-left:25px;margin-right:0}.choices[data-type*=select-multiple] .choices__inner,.choices[data-type*=text] .choices__inner{cursor:text}.choices[data-type*=select-multiple] .choices__button,.choices[data-type*=text] .choices__button{position:relative;display:inline-block;margin-top:0;margin-right:-4px;margin-bottom:0;margin-left:8px;padding-left:16px;border-left:1px solid #008fa1;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==);background-size:8px;width:8px;line-height:1;opacity:.75;border-radius:0}.choices[data-type*=select-multiple] .choices__button:focus,.choices[data-type*=select-multiple] .choices__button:hover,.choices[data-type*=text] .choices__button:focus,.choices[data-type*=text] .choices__button:hover{opacity:1}.choices__inner{display:inline-block;vertical-align:top;width:100%;background-color:var(--light);padding:5px 7.5px 0;border:1px solid var(--gray);border-radius:2.5px;font-size:14px;min-height:39px;overflow:hidden}.is-focused .choices__inner,.is-open .choices__inner{border-color:#b7b7b7}.is-open .choices__inner{border-radius:2.5px 2.5px 0 0}.is-flipped.is-open .choices__inner{border-radius:0 0 2.5px 2.5px}.choices__list{margin:0;padding-left:0;list-style:none}.choices__list--single{display:inline-block;padding:4px 16px 4px 4px;width:100%}[dir=rtl] .choices__list--single{padding-right:4px;padding-left:16px}.choices__list--single .choices__item{width:100%}.choices__list--multiple{display:inline}.choices__list--multiple .choices__item{display:inline-block;vertical-align:middle;border-radius:20px;padding:4px 10px;font-size:12px;font-weight:500;margin-right:3.75px;margin-bottom:3.75px;background-color:var(--cyan);border:1px solid #00a5bb;color:#222;word-break:break-all;box-sizing:border-box}.choices__list--multiple .choices__item[data-deletable]{padding-right:5px}[dir=rtl] .choices__list--multiple .choices__item{margin-right:0;margin-left:3.75px}.choices__list--multiple .choices__item.is-highlighted{background-color:#00a5bb;border:1px solid #008fa1}.is-disabled .choices__list--multiple .choices__item{background-color:#aaa;border:1px solid #919191}.choices__list--dropdown{visibility:hidden;z-index:1;position:absolute;width:100%;background-color:var(--white);border:1px solid var(--gray);top:100%;margin-top:-1px;border-bottom-left-radius:2.5px;border-bottom-right-radius:2.5px;overflow:hidden;word-break:break-all;will-change:visibility}.choices__list--dropdown.is-active{visibility:visible}.is-open .choices__list--dropdown{border-color:#b7b7b7}.is-flipped .choices__list--dropdown{top:auto;bottom:100%;margin-top:0;margin-bottom:-1px;border-radius:.25rem .25rem 0 0}.choices__list--dropdown .choices__list{position:relative;max-height:300px;overflow:auto;-webkit-overflow-scrolling:touch;will-change:scroll-position}.choices__list--dropdown .choices__item{position:relative;padding:10px;font-size:14px}[dir=rtl] .choices__list--dropdown .choices__item{text-align:right}@media (min-width:640px){.choices__list--dropdown .choices__item--selectable{padding-right:100px}.choices__list--dropdown .choices__item--selectable:after{content:attr(data-select-text);font-size:12px;opacity:0;position:absolute;right:10px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}[dir=rtl] .choices__list--dropdown .choices__item--selectable{text-align:right;padding-left:100px;padding-right:10px}[dir=rtl] .choices__list--dropdown .choices__item--selectable:after{right:auto;left:10px}}.choices__list--dropdown .choices__item--selectable.is-highlighted{background-color:#f2f2f2}.choices__list--dropdown .choices__item--selectable.is-highlighted:after{opacity:.5}.choices__item{cursor:default}.choices__item--selectable{cursor:pointer}.choices__item--disabled{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;opacity:.5}.choices__heading{font-weight:600;font-size:12px;padding:10px;border-bottom:1px solid #f7f7f7;color:gray}.choices__button{text-indent:-9999px;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center;cursor:pointer}.choices__button:focus{outline:0}.choices__input{display:inline-block;vertical-align:baseline;background-color:var(--light);font-size:14px;margin-bottom:5px;border:0;border-radius:0;max-width:100%;padding:4px 0 4px 2px}.choices__input:focus{outline:0}[dir=rtl] .choices__input{padding-right:2px;padding-left:0}.choices__placeholder{opacity:.5}.choices{border:0;border-radius:.25rem}.choices:hover{cursor:pointer}.choices.is-focused{box-shadow:0 0 0 .2rem rgba(0,0,0,.1)}.choices__inner{padding:.4rem 1rem;margin-bottom:0;font-size:1rem;border:solid 1px #ced4da;border-radius:.25rem;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.is-focused .choices__inner{border-color:#000}.choices__input{padding:0;margin-bottom:0;font-size:1rem;background-color:transparent}.choices__input::-moz-placeholder{color:#484f56;opacity:1}.choices__input::-webkit-input-placeholder{color:#484f56;opacity:1}.choices__list--dropdown{z-index:1060}.choices__list--multiple .choices__item{position:relative;margin:2px;background-color:rgb(var(--dark));-webkit-margin-end:2px;margin-inline-end:2px;border:0;border-radius:.25rem;color:var(--white)}.choices__list--multiple .choices__item.is-highlighted{background-color:rgba(var(--dark),.9);opacity:1}.choices .choices__list--dropdown .choices__item{-webkit-padding-end:10px;padding-inline-end:10px}.choices .choices__list--dropdown .choices__item--selectable::after{display:none}.choices__button_joomla{position:relative;padding:0 10px;color:inherit;text-indent:-9999px;cursor:pointer;background:0 0;border:0;opacity:.5;-webkit-appearance:none;-moz-appearance:none;appearance:none}.choices__button_joomla::before{position:absolute;top:0;right:0;bottom:0;left:0;display:block;text-align:center;text-indent:0;content:'×'}.choices__button_joomla:focus,.choices__button_joomla:hover{opacity:1}.choices__button_joomla:focus{outline:0}.choices[data-type*=select-multiple] .choices__inner,.choices[data-type*=select-one] .choices__inner{-webkit-padding-end:3rem;padding-inline-end:3rem;cursor:pointer;background:url(../images/select-bg.svg) no-repeat 100%/116rem;background-color:#eaedf0}[dir=rtl] .choices[data-type*=select-multiple] .choices__inner,[dir=rtl] .choices[data-type*=select-one] .choices__inner{background:url(../images/select-bg-rtl.svg) no-repeat 0/116rem;background-color:#eaedf0}.choices[data-type*=select-one] .choices__item{display:flex;justify-content:space-between}.choices[data-type*=select-one] .choices__button_joomla{position:absolute;top:50%;right:0;width:20px;height:20px;padding:0;margin-top:-10px;margin-right:50px;border-radius:10em;opacity:.5}[dir=rtl] .choices[data-type*=select-one] .choices__button_joomla{right:auto;left:0;margin-right:0;margin-left:50px}.choices[data-type*=select-one] .choices__button_joomla:focus,.choices[data-type*=select-one] .choices__button_joomla:hover{opacity:1}.choices[data-type*=select-one] .choices__button_joomla:focus{box-shadow:0 0 0 2px var(--cyan)}.choices[data-type*=select-one]::after{display:none}.choices[data-type*=select-multiple] .choices__input,.choices[data-type*=text] .choices__input{padding:.2rem 0}.choices__heading{font-size:1.2rem}PKBA#]��H�L}L}7system/helixultimate/assets/css/admin/jquery-ui.min.cssnu�[���/*! 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/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6 * Copyright jQuery Foundation and other contributors; Licensed MIT */ .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-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:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.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 #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.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:#454545;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 #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.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:#2b2b2b;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 #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.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_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_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("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_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:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.003;filter:Alpha(Opacity=.3)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666}PKBA#]��d���6system/helixultimate/assets/css/admin/menu-builder.cssnu�[���#hu-menu-builder-container{margin-bottom:20px}.hu-modal.add-new-menu-item{width:1024px;height:600px}#hu-menu-tree{padding:0;list-style:none;margin:0}#hu-menu-tree .hu-menu-tree-branch{margin-bottom:0;position:relative}.hu-menu-tree-branch>.hu-menu-tree-contents{clear:both;line-height:1.5;position:relative;margin:10px 0 0}.hu-menu-tree-branch.hu-branch-level-1 .hu-menu-tree-contents .hu-menu-branch-path{display:none}.hu-menu-tree-contents .hu-menu-branch-path{display:block;position:absolute;width:11px;height:47px;bottom:50%;left:-12px;border:1px solid #a2beda;border-top:0;border-right:0;padding:4px 0 0;padding-top:3px;border-bottom-left-radius:6px}.hu-menu-tree-contents .hu-branch-drag-handler{cursor:move;background:#fff;border:1px solid #fff;color:rgba(var(--dark));border-radius:4px;position:relative;padding:8px 10px;height:auto;min-height:20px;max-width:450px;line-height:1.4;word-wrap:break-word;transition:color .4s ease-in,border-color .4s ease-in}.hu-branch-drag-handler .hu-branch-tools{position:absolute;top:50%;right:10px;transform:translate3d(0,-50%,0);z-index:11;background:#fff;padding-left:10px;display:none}.hu-branch-drag-handler:hover .hu-branch-tools{display:block;animation:fadeInRight .5s}.hu-branch-drag-handler .hu-branch-tools .hu-branch-tools-list{padding:0;display:flex;list-style:none}.hu-branch-drag-handler .hu-branch-tools .hu-branch-tools-list>li:not(:last-child){margin-right:10px}.hu-branch-drag-handler .hu-branch-tools .hu-branch-tools-list a{color:#878787;transition:color .3s}.hu-branch-drag-handler .hu-branch-tools .hu-branch-tools-list a:focus,.hu-branch-drag-handler .hu-branch-tools .hu-branch-tools-list a:hover{color:rgb(var(--primary))}.hu-branch-drag-handler .hu-branch-icon{margin-right:5px}.hu-menu-tree-contents .hu-branch-drag-handler .hu-branch-icon svg{fill:rgba(var(--dark),.8)}.hu-menu-tree-contents .hu-branch-drag-handler:hover{border-color:rgb(var(--primary))}.hu-menu-tree-contents .hu-branch-drag-handler:hover .hu-branch-icon svg{fill:rgb(var(--primary))}.hu-menu-tree-contents .hu-branch-drag-handler:hover .hu-branch-tools>a{opacity:1}#hu-menu-tree .hu-sortable-placeholder{border:1px dashed #3f3f3f;height:35px;width:450px;margin-top:10px}.hu-menu-tree-branch.ui-sortable-helper .hu-menu-tree-contents{margin-top:0}.hu-menu-tree-branch.ui-sortable-helper .hu-menu-children-bus .hu-menu-tree-contents{margin-top:10px}.hu-menu-tree-branch .hu-menu-children-bus:empty{display:none}#hu-menu-tree .hu-megamenu-branch-muted .hu-branch-tools{background:#d9deeb}.hu-branch-level-1{margin-left:0}.hu-branch-level-2{margin-left:20px}.hu-branch-level-3{margin-left:40px}.hu-branch-level-4{margin-left:60px}.hu-branch-level-5{margin-left:80px}.hu-branch-level-6{margin-left:100px}.hu-branch-level-7{margin-left:120px}.hu-branch-level-8{margin-left:140px}.hu-branch-level-9{margin-left:160px}.hu-branch-level-10{margin-left:180px}.hu-branch-level-1 .hu-menu-children-bus{margin-left:0}.hu-branch-level-2 .hu-menu-children-bus{margin-left:-20px}.hu-branch-level-3 .hu-menu-children-bus{margin-left:-40px}.hu-branch-level-4 .hu-menu-children-bus{margin-left:-60px}.hu-branch-level-5 .hu-menu-children-bus{margin-left:-80px}.hu-branch-level-6 .hu-menu-children-bus{margin-left:-100px}.hu-branch-level-7 .hu-menu-children-bus{margin-left:-120px}.hu-branch-level-8 .hu-menu-children-bus{margin-left:-140px}.hu-branch-level-9 .hu-menu-children-bus{margin-left:-160px}.hu-branch-level-10 .hu-menu-children-bus{margin-left:-180px}@-webkit-keyframes fadeInRight{from{opacity:0;-webkit-transform:translate3d(10px,-50%,0);transform:translate3d(10px,-50%,0)}to{opacity:1;-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}}@keyframes fadeInRight{from{opacity:0;-webkit-transform:translate3d(10px,-50%,0);transform:translate3d(10px,-50%,0)}to{opacity:1;-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}}.animate__fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}PKBA#]�� )��7system/helixultimate/assets/css/admin/devices-field.cssnu�[���.helix-devices{text-align:right}.helix-devices .device-btn{border:none;background:0 0;outline:0;width:25px;height:25px;padding:3px;cursor:pointer;display:inline-flex;justify-content:center;align-items:center;transition:all 1s ease}.helix-devices .device-btn:hover{background:#b9d8fa;border-radius:100%}.helix-devices .device-btn:hover path{fill:#2a98ff}.helix-devices .device-btn.active{background:#b9d8fa;border-radius:100%}.helix-devices .device-btn.active path{fill:#2a98ff}PKBA#]b����/system/helixultimate/assets/css/admin/modal.cssnu�[���@import url(https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap);.hu-modal-open,.hu-options-modal-open{overflow:hidden}.hu-modal-open .hu-options-modal,.hu-modal-open .hu-options-modal-overlay{display:none}.hu-modal-overlay,.hu-options-modal-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:999;background:rgba(0,0,0,.6)}.hu-modal,.hu-options-modal{position:fixed;top:50px;left:50%;width:1000px;height:640px;max-width:100%;max-height:100%;z-index:9991;background:#f0f4fa;border-radius:8px;-webkit-transform:translateX(-50%);transform:translateX(-50%);font-family:Roboto,sans-serif;transition:250ms width ease-out}.hu-modal.collapsed .hu-megamenu-container .hu-megamenu-sidebar{margin-right:0;width:320px}.hu-modal-small{top:5%;width:420px;height:90%}.hu-modal-medium{top:5%;width:600px;height:90%}.hu-modal-large{top:5%;width:800px;height:90%}.hu-modal-header,.hu-options-modal-header{position:absolute;top:0;left:0;width:100%;display:flex;background:#e0e7f9;box-shadow:inset 0 -1px 0 #c9d4f9;height:53px;border-radius:8px 8px 0 0;padding:0 20px 0 24px;z-index:99;align-items:center;justify-content:space-between}.hu-modal-header-title,.hu-options-modal-header-title{font-size:18px;font-weight:500;color:rgb(var(--primary));margin:0}.hu-modal-frame-container{height:100%}.hu-modal-frame-container iframe{height:100%;width:100%;border:none}.hu-modal-footer,.hu-options-modal-footer{position:absolute;bottom:0;left:0;width:100%;display:flex;background:#e0e7f9;box-shadow:inset 0 1px 0 #c9d4f9;border-radius:0 0 8px 8px;height:62px;border-radius:0 0 8px 8px;padding:0 20px;z-index:99;align-items:center}.hu-modal-footer.footer-right{justify-content:flex-end!important}.hu-modal-footer .hu-btn{text-decoration:none;font-size:14px;font-weight:500}.hu-modal-footer .hu-megamenu-cancel-btn{color:#676d98}.hu-modal-footer .hu-megamenu-save-btn{color:#fff}.hu-modal-footer .hu-megamenu-cancel-btn:hover{color:rgb(var(--primary))}.hu-modal-breadcrumbs{width:560px}.hu-modal-actions-left{position:absolute;top:0;left:20px;height:60px;padding-top:15px;background:#e8eef3;z-index:3;width:560px;display:none}.hu-modal-actions-right{width:320px;text-align:right}.hu-modal-actions-right .action-hu-modal-close{margin-left:20px}.action-hu-modal-close,.action-hu-options-modal-close{color:#676d98;line-height:30px;font-size:16px;text-align:center;z-index:3;transition:color .4s,background-color .4s}.action-hu-modal-close:hover,.action-hu-options-modal-close:hover{color:rgb(var(--primary))}.hu-media-breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0;margin:0;list-style:none}.hu-media-breadcrumb-item{height:60px;line-height:60px;font-size:14px;text-transform:capitalize}.hu-media-breadcrumb-item+.hu-media-breadcrumb-item::before{font-family:'Font Awesome 5 Free';display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#868e96;content:'\f105';font-weight:900}.hu-media-breadcrumb-item+.hu-media-breadcrumb-item:hover::before{text-decoration:underline}.hu-media-breadcrumb-item+.hu-media-breadcrumb-item:hover::before{text-decoration:none}.hu-media-breadcrumb-item{color:#868e96}.hu-modal-inner,.hu-options-modal-inner{position:relative;width:100%;height:100%;overflow:hidden;border-radius:8px}.hu-modal-preloader{position:relative;width:100%;height:100%;display:table;text-align:center}.hu-modal-preloader .fas{display:table-cell;vertical-align:middle}#hu-media-manager,.hu-modal-content{position:absolute;top:68px;left:15px;right:15px;bottom:15px}.hu-options-modal-content{position:absolute;top:60px;left:0;right:0;bottom:0;overflow-y:auto}.hu-modal-content,.hu-options-modal-content{bottom:75px}.hu-options-modal-content>.control-group:first-child{margin-top:0;padding-top:0;border-top:0}.hu-media{list-style:none;padding:0;margin:-10px;height:100%;overflow-y:auto}.hu-media:empty{margin:0;border:2px dashed #e8eef3;position:absolute;top:0;left:0;right:0;bottom:0;border-radius:5px;overflow:hidden}.hu-media:empty:before{content:'This folder is empty';font-size:16px;font-weight:700;position:absolute;top:50%;left:50%;transform:translate(-50%)}.hu-media>li{width:140px;height:180px;display:block;float:left;margin:10px;position:relative}.hu-media-thumb{height:140px;width:140px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:4px;border:1px solid #fff;margin-bottom:4px;cursor:pointer;position:relative;background-color:#fff}.hu-media-thumb-new{animation:newFolder 5s}@keyframes newFolder{from{background-color:#e8f7ed}to{background-color:#fff}}.hu-media-image .hu-media-thumb img{background:#e7e8ec;border:1px solid #d4d5d9;border-radius:3px}.hu-media-selected .hu-media-thumb{background:#d6e8fa;border-color:#d6e8fa}.hu-media-select{display:block;position:absolute;top:10px;right:10px;width:24px;height:24px;line-height:24px;text-align:center;font-size:13px;border:1px solid #d4d5d9;border-radius:3px;z-index:993;opacity:0;cursor:pointer;transition:opacity .4s;-webkit-transition:opacity .4s}.hu-media>li:hover .hu-media-select{opacity:1}.hu-media-select>span{display:none}.hu-media-selected .hu-media-select{border-color:rgb(var(--primary));background-color:rgb(var(--primary));opacity:1}.hu-media-selected .hu-media-select>span{display:block;color:#fff;line-height:24px}.hu-media-label{width:90%;margin-left:5%;height:40px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;cursor:pointer;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:12px;line-height:1.5em;color:#1b2733;word-wrap:break-word;overflow:hidden}.hu-media-thumb img{-webkit-box-sizing:border-box;box-sizing:border-box;max-height:100%;max-width:100%;cursor:pointer;outline:0}.hu-image-holder img{-webkit-box-sizing:border-box;box-sizing:border-box;max-height:100%;max-width:100%;outline:0;border-radius:5px}.hu-image-holder:not(:empty){margin-bottom:15px}.hu-progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;width:100%;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.hu-progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;background-color:#007bff;transition:width .6s ease}PKBA#]�c˯���8system/helixultimate/assets/css/admin/helix-ultimate.cssnu�[���.ui-tooltip{background:#000!important;height:auto!important;max-width:200px!important;padding:5px!important;border-radius:3px!important}.ui-tooltip .ui-tooltip-content{font-size:11px;font-weight:100;color:#fff}.hu-fade-border{height:1px;width:100%;background:linear-gradient(90deg,#eff4fb 0,#7983a7 55.01%,#eff4fb 101.56%);opacity:.4}.hu-m-0{margin:0!important}.hu-m-1{margin:.25rem!important}.hu-m-2{margin:.5rem!important}.hu-m-3{margin:1rem!important}.hu-m-4{margin:1.5rem!important}.hu-m-5{margin:3rem!important}.hu-m-auto{margin:auto!important}.hu-mx-0{margin-right:0!important;margin-left:0!important}.hu-mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.hu-mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.hu-mx-3{margin-right:1rem!important;margin-left:1rem!important}.hu-mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.hu-mx-5{margin-right:3rem!important;margin-left:3rem!important}.hu-mx-auto{margin-right:auto!important;margin-left:auto!important}.hu-my-0{margin-top:0!important;margin-bottom:0!important}.hu-my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.hu-my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.hu-my-3{margin-top:1rem!important;margin-bottom:1rem!important}.hu-my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.hu-my-5{margin-top:3rem!important;margin-bottom:3rem!important}.hu-my-auto{margin-top:auto!important;margin-bottom:auto!important}.hu-mt-0{margin-top:0!important}.hu-mt-1{margin-top:.25rem!important}.hu-mt-2{margin-top:.5rem!important}.hu-mt-3{margin-top:1rem!important}.hu-mt-4{margin-top:1.5rem!important}.hu-mt-5{margin-top:3rem!important}.hu-mt-auto{margin-top:auto!important}.hu-mr-0{margin-right:0!important}.hu-mr-1{margin-right:.25rem!important}.hu-mr-2{margin-right:.5rem!important}.hu-mr-3{margin-right:1rem!important}.hu-mr-4{margin-right:1.5rem!important}.hu-mr-5{margin-right:3rem!important}.hu-mr-auto{margin-right:auto!important}.hu-mb-0{margin-bottom:0!important}.hu-mb-1{margin-bottom:.25rem!important}.hu-mb-2{margin-bottom:.5rem!important}.hu-mb-3{margin-bottom:1rem!important}.hu-mb-4{margin-bottom:1.5rem!important}.hu-mb-5{margin-bottom:3rem!important}.hu-mb-auto{margin-bottom:auto!important}.hu-ml-0{margin-left:0!important}.hu-ml-1{margin-left:.25rem!important}.hu-ml-2{margin-left:.5rem!important}.hu-ml-3{margin-left:1rem!important}.hu-ml-4{margin-left:1.5rem!important}.hu-ml-5{margin-left:3rem!important}.hu-ml-auto{margin-left:auto!important}.hu-input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.hu-input-group>.form-control,.hu-input-group>.form-file,.hu-input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.hu-input-group>.form-control:focus,.hu-input-group>.form-file .form-file-input:focus~.form-file-label,.hu-input-group>.form-select:focus{z-index:3}.hu-input-group>.form-file>.form-file-input:focus{z-index:4}.hu-input-group>.form-file:not(:last-child)>.form-file-label{border-top-right-radius:0;border-bottom-right-radius:0}.hu-input-group>.form-file:not(:first-child)>.form-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.hu-input-group .btn{position:relative;z-index:2}.hu-input-group .btn:focus{z-index:3}.hu-input-group-text{display:flex;align-items:center;padding:6px;font-size:12px;font-weight:400;line-height:1.5;background-color:#fff;color:rgba(var(--dark));text-align:center;white-space:nowrap;border:1px solid rgba(121,127,167,.3);box-shadow:0 1px 1px rgba(20,50,80,.1);border-radius:5px}.hu-input-group>.dropdown-toggle:nth-last-child(n+3),.hu-input-group>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.hu-input-group>:not(:first-child):not(.dropdown-menu){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.hu-narrow-input .form-control,.hu-subgroup .hu-input-group>.form-control{padding-left:8px;padding-right:8px}.hu-sr-only{visibility:hidden}.hu-d-none{display:none}.hu-d-flex{display:flex!important}.hu-d-inline-flex{display:inline-flex!important}.hu-align-items-start{align-items:flex-start!important}.hu-align-items-end{align-items:flex-end!important}.hu-align-items-center{align-items:center!important}.hu-justify-content-start{justify-content:flex-start!important}.hu-justify-content-end{justify-content:flex-end!important}.hu-justify-content-center{justify-content:center!important}.hu-justify-content-between{justify-content:space-between!important}.hu-justify-content-around{justify-content:space-around!important}.hu-justify-content-evenly{justify-content:space-evenly!important}:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#868e96;--gray-dark:#343a40;--primary:51,102,255;--secondary:#868e96;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:2,17,83;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,'Liberation Mono','Courier New',monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body,html{height:100%}body{padding-top:40px}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex='-1']:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:10px}p{margin-top:0;margin-bottom:16px}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input:not([type=range]),label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:5px;padding-left:5px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.hu-btn{display:inline-block;font-size:.875rem;font-weight:500;line-height:1.2;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:0;padding:.5rem 1.25rem;position:relative;border-radius:.5rem;overflow:hidden;z-index:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.hu-btn:hover{text-decoration:none;color:#212529}.hu-btn-primary,.hu-btn-primary:hover{color:#fff;transition:color .4s}.hu-btn-primary:after,.hu-btn-primary:before{content:' ';position:absolute;top:0;left:0;right:0;bottom:0;border-radius:.5rem;z-index:-1}.hu-btn-primary:before{background:linear-gradient(180deg,#7497ff -46.87%,#688cfd -7.92%,#567dfa 49.16%,#3e69f6 127.08%);box-shadow:0 2px 4px rgba(97,135,252,.3)}.hu-btn-primary:after{background:linear-gradient(180deg,#9ab3fe -22.41%,#7998fb 49.16%,#416bf6 127.08%);box-shadow:0 4px 8px rgba(97,135,252,.35);opacity:0;transition:opacity .4s}.hu-btn-primary:not([disabled]):not(.disabled):hover:after{opacity:1}.hu-btn-primary.disabled,.hu-btn-primary:disabled{opacity:.6}.hu-btn-secondary{color:rgb(var(--primary));background-color:rgba(var(--primary),.15)}.hu-btn-secondary:hover{color:#fff;background:rgb(var(--primary));box-shadow:0 2px 4px rgba(97,135,252,.3)}.hu-btn-secondary.disabled,.hu-btn-secondary:disabled{opacity:.6}.hu-btn-danger{color:#fff;background-color:#f53d62}.hu-btn-danger:hover{color:#fff;background-color:#f20d3b;box-shadow:0 4px 4px rgba(97,5,24,.15)}.hu-btn-danger.focus,.hu-btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.hu-btn-danger.disabled,.hu-btn-danger:disabled{background-color:#dc3545;border-color:#dc3545}.hu-btn-default{color:#fff;background-color:rgba(var(--dark),.4)}.hu-btn-default:hover{color:rgb(var(--dark));background-color:rgba(var(--dark),.3)}.hu-btn-default.disabled,.hu-btn-default:disabled{background-color:rgba(var(--dark),.1)}.hu-btn-reset{color:rgb(var(--dark));background:rgba(var(--dark),.1)!important}.hu-btn-reset:hover{color:rgb(var(--dark));background-color:rgba(var(--dark),.3)}.hu-btn-link{color:rgb(var(--primary));background-color:transparent}.hu-btn-link:hover{color:rgb(var(--primary));text-decoration:underline;background-color:transparent}.hu-btn-link.focus,.hu-btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.hu-btn-link.disabled,.hu-btn-link:disabled{color:#868e96}.hu-btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.hu-btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.hu-btn-block{display:block;width:100%}input[type=button].hu-btn-block,input[type=reset].hu-btn-block,input[type=submit].hu-btn-block{width:100%}.hu-inline-group{display:inline-block;text-align:center}.hu-switcher-style-tab.hu-align-center{text-align:center}.hu-switcher-style-tab.hu-align-center .hu-action-group{display:inline-block}.hu-switcher-style-tab .hu-action-group{padding:2px;background:#f1f6fc;box-shadow:inset -6px -6px 10px #fff,inset 6px 6px 10px #d3d9e7;border:1px solid #eef2f8;border-radius:5px}.hu-switcher-style-tab .hu-switcher-action{display:inline-block;font-size:.875rem;font-weight:500;line-height:1.2;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:0;padding:6px 20px;position:relative;border-radius:.5rem;overflow:hidden;z-index:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.hu-switcher-style-tab .hu-switcher-action{color:rgba(var(--dark),.5)}.hu-switcher-style-tab .hu-switcher-action svg{fill:rgba(var(--dark),.5)}.hu-switcher-style-tab-sm .hu-switcher-action{padding:5px 7px;min-width:20px}.hu-switcher-style-tab.hu-switcher-inline{display:inline-block}.hu-switcher-style-tab .hu-switcher-action.active{color:rgb(var(--primary));background:#eff4fb;box-shadow:0 1px 2px rgba(2,11,83,.5);border-radius:5px;outline:0}.hu-switcher-style-tab .hu-switcher-action.active svg{fill:rgb(var(--primary))}.hu-switcher-style-simple .hu-action-group{display:flex;justify-content:space-between;align-items:flex-end;margin-top:10px}.hu-switcher-style-simple .hu-switcher-action-content{display:block;padding:6px 10px;background:rgba(51,102,255,.1);border:1px solid rgba(51,102,255,.14);border-radius:3px;cursor:pointer;transition:border-color .4s,box-shadow .4s,background-color .4s}.hu-switcher-style-simple .hu-switcher-action.active .hu-switcher-action-content,.hu-switcher-style-simple .hu-switcher-action:hover .hu-switcher-action-content{border:1px solid rgb(var(--primary));box-shadow:0 1px 3px rgba(0,119,255,.20531)}.hu-switcher-style-simple .hu-switcher-action.active .hu-switcher-action-content{background:#fff}.hu-switcher-style-simple .hu-switcher-label{font-size:12px;text-align:center;color:rgba(var(--dark),.6);display:block;margin-top:10px;transition:color .4s}.hu-switcher-style-simple .hu-switcher-action.active .hu-switcher-label{font-weight:500;color:rgb(var(--primary))}.hu-switcher-style-simple .hu-switcher-action svg{display:inline-block;vertical-align:middle}.hu-switcher-action:active,.hu-switcher-action:focus{outline:0}.fade{opacity:0;transition:opacity .15s linear}.fade.show{opacity:1}.clearfix::after{display:block;clear:both;content:''}.pull-left{float:left}.pull-right{float:right}.uneditable-input,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{display:block;width:100%;padding:6px 12px;font-size:12px;line-height:1.5;color:rgba(var(--dark));background-color:#fff;background-clip:padding-box;border:1px solid rgba(121,127,167,.3);box-shadow:0 1px 1px rgba(20,50,80,.1);border-radius:5px;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right 10px center;background-size:16px 12px;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{outline:0;box-shadow:0 0 0 1px rgb(var(--primary))}select:not([multiple]){height:34px}select:focus::-ms-value{color:#495057;background-color:#fff}.control-group{margin-bottom:15px}.hu-field-separator{margin-bottom:15px;border-bottom:1px solid rgba(var(--dark),.2)}.hu-no-group-wrap{padding:20px 15px 0}.control-group label{display:block;font-size:13px;color:rgba(var(--dark),.7);margin:0 0 5px 0}.hu-field-list>div:first-child{margin-top:0;padding-top:0;border-top:0}.hu-control-help{font-size:12px;line-height:1.4;font-weight:400;color:rgba(var(--dark),.6);margin-bottom:15px;margin-top:5px;border-radius:5px;display:none}.control-group.control-group-checkbox .control-label,.control-group.control-group-checkbox .control-label label{margin-bottom:0;display:flex;align-items:center}.control-group:not(.control-group-checkbox) .control-label{margin-bottom:10px;display:flex;align-items:center}.hu-inline-group{display:flex;align-items:center;margin-bottom:20px}.hu-inline-group .control-label{margin-bottom:0!important}.hu-inline-group .controls{margin-left:auto}.control-group.control-group-checkbox .control-help{padding-top:10px;margin-bottom:5px;width:100%}.hu-help-icon{color:rgba(var(--dark),.6);cursor:pointer;transition:color .4s}.hu-help-icon.active,.hu-help-icon:hover{color:rgb(var(--primary))}.control-group:hover .hu-help-icon{opacity:1}.controls>.minicolors,.hu-options-modal .minicolors{display:block;width:100%}.controls .minicolors-theme-bootstrap .minicolors-input,.hu-options-modal .minicolors-theme-bootstrap .minicolors-input{width:100%;height:32px;padding-left:30px;font-size:12px}.controls .minicolors-theme-bootstrap .minicolors-swatch,.hu-options-modal .minicolors-theme-bootstrap .minicolors-swatch{left:10px;top:8px;width:16px;height:16px;border-radius:100px}.minicolors-theme-bootstrap .minicolors-panel{top:auto!important;left:0!important;margin-top:10px;box-sizing:initial}.reload-preview-iframe img{filter:invert(56%) sepia(0) saturate(0) hue-rotate(208deg) brightness(84%) contrast(88%)}.reload-preview-iframe{background:0 0;outline:0!important}.reload-preview-iframe.spin{animation:spin 2s infinite cubic-bezier(.66,.15,.57,1.08);transform-origin:50% 48%}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.action-reset-drafts,.hu-done-msg,.hu-loading-msg{display:none}.action-reset-drafts{background:0 0;opacity:1;transition:opacity .3s ease;margin-right:0!important;outline:0!important}.action-reset-drafts.hide{opacity:.3}.hu-logo{margin-left:20px;display:inline-flex}.hu-logo .hu-version{align-self:flex-end;font-size:8px;font-weight:700;color:rgb(var(--primary));margin:0 0 2px 5px}#helix-ultimate{width:100%;height:100%;position:relative}#helix-ultimate .hu-container{width:100%;height:100%;position:relative;display:flex;z-index:1}.hu-btn-round{width:32px;height:32px;line-height:1;padding:0;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;background:rgb(255,255,255,.5);transition:background-color .4s}.hu-btn-round svg{fill:#797fa7;transition:fill .4s}.hu-btn-round:hover{background-color:rgba(var(--primary))}.hu-btn-round:hover svg{fill:#fff}.hu-btn-round-sm{width:22px;height:22px}.hu-topbar{display:flex;justify-content:space-between;align-items:stretch;height:40px;position:fixed;top:0;left:0;z-index:2;width:100%;background:#eff4fb;box-shadow:0 1px 2px rgba(2,11,83,.25)}.hu-topbar .topbar-left{display:flex;align-items:center}.hu-topbar .topbar-middle{display:flex;align-items:center;text-align:center;justify-content:center;transition:all .3s ease}.hu-topbar .hu-response{margin:0 10px;color:#333}.hu-devices{height:100%;display:flex;align-items:center}.hu-device{outline:0;border:none;background:0 0;cursor:pointer;height:40px;width:50px;display:flex;justify-content:center;align-items:center;box-shadow:none;border-bottom:2px solid transparent}.hu-device svg{fill:#9097b8;transition:.2s ease-in}.hu-device.active svg,.hu-device:hover svg{fill:rgb(var(--dark))}.hu-device.active{border-bottom-color:rgb(var(--dark))}.hu-device:active,.hu-device:focus{box-shadow:none;outline:0}.hu-topbar .topbar-right{display:flex;align-items:center;position:relative;justify-content:flex-end;max-width:450px;border-left:1px solid #f1f1f1;margin-right:20px}.hu-topbar .topbar-right .hu-btn:not(:last-child){margin-right:12px}.hu-topbar .topbar-middle .hu-display-variants{display:flex}.hu-topbar .topbar-middle .hu-display-variants button.hu-device{border:none;background:0 0;cursor:pointer;height:100%;width:50px;display:flex;justify-content:center;align-items:center}.hu-topbar .topbar-middle .hu-display-variants button.hu-device:focus{outline:0;box-shadow:none}.hu-topbar .topbar-middle .hu-display-variants button.hu-devices.active{background:#deeeff;border-bottom:1px solid rgb(var(--primary))}.hu-topbar .topbar-middle .hu-display-variants button.hu-device.active svg path{fill:rgb(var(--primary))}.hu-edit-panel{background:#eff4fb;width:420px;height:100%;box-shadow:6px 10px 40px rgba(1,3,18,.15),0 3px 6px rgba(0,0,0,.25);border-radius:10px;overflow:hidden;display:none}.hu-edit-panel.layout-panel{width:420px}.hu-edit-panel.menu-panel{width:420px}.hu-edit-panel .hu-groups-container{height:525px;overflow-y:auto}.hu-edit-panel.active-panel{display:block}.hu-panel-header{background-color:rgba(var(--primary),.1);padding:8px 12px;color:rgb(var(--primary));font-size:16px;font-weight:500;display:flex;justify-content:space-between;align-items:center;border-radius:10px 10px 0 0;border-bottom:1px solid rgba(var(--primary),.15)}.hu-panel-close{background:rgb(255,255,255,.5);display:inline-flex;align-items:center;width:25px;height:25px;line-height:25px;text-align:center;justify-content:center;border:none;color:#787fa7;outline:0;cursor:pointer;border-radius:100%}.hu-panel-close svg{display:inline-block}.hu-preview{width:100%;position:relative;text-align:center;z-index:1}.hu-options-wrap{-ms-overflow-style:none;scrollbar-width:none}.hu-options-wrap::-webkit-scrollbar{display:none}#hu-options-panel{position:absolute;top:0;left:0;width:100px;background-color:#eff4fb;border-radius:10px;box-shadow:20px 20px 20px rgba(0,0,0,.15),inset -4px -4px 4px #d3d9e7,inset 4px 4px 4px #fcfdfe;backdrop-filter:blur(4px);text-align:center}.hu-options-core{position:fixed;top:100px;left:40px;z-index:999;display:none}.hu-panel-handle{text-align:center;padding:5px 0;cursor:move}.hu-panel-handle svg{width:16px}.hu-fieldset-header .hu-option-icon{height:16px;display:inline-block;filter:invert(64%) sepia(18%) saturate(397%) hue-rotate(197deg) brightness(88%) contrast(89%)}.hu-fieldset-header .hu-option-title{display:block;margin-top:8px;font-size:12px;font-weight:500;line-height:14px;color:rgba(2,11,83,.7)}.hu-fieldset-header.active{background:rgba(51,102,255,.1)}.hu-fieldset-header.active .hu-option-title{color:rgb(var(--primary))}.hu-fieldset-header.active img{filter:invert(25%) sepia(66%) saturate(2223%) hue-rotate(215deg) brightness(120%) contrast(101%)}.hu-groups-container{-ms-overflow-style:none;scrollbar-width:none}.hu-groups-container::-webkit-scrollbar{display:none}.hu-options-container{position:relative}.hu-fieldset-contents{position:absolute;top:0;z-index:999}.hu-panel-position-left .hu-fieldset-contents{right:20px}.hu-panel-position-right .hu-fieldset-contents{left:120px}.action-hu-exit{display:block;position:absolute;color:#fff;font-size:18px;top:25px;right:20px;width:30px;height:30px;line-height:28px;text-align:center;background:0 0;border:1px solid #fff;border-radius:30px;cursor:pointer}.action-hu-exit:active,.action-hu-exit:focus,.action-hu-exit:hover{color:#fff;background:rgba(0,0,0,.3);border-color:transparent}.hu-options-wrap{position:absolute;width:100%;top:2px;bottom:60px;overflow-y:auto}.hu-footer{position:absolute;bottom:0;left:0;height:50px;width:100%;padding:0 10px}.hu-copyright{margin-top:8px;font-size:12px;line-height:16px;color:#8f95a0;float:left}.hu-action{float:right}#hu-template-preview{width:100%;height:100%;border:0;box-shadow:0 15px #6e6d6d75}.hu-fieldset-header{padding:12px 0;font-size:14px;display:block;cursor:pointer;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#hu-options>div:not(:last-child)>.hu-fieldset-header:after{content:' ';position:absolute;height:1px;width:100%;bottom:0;left:0;background:linear-gradient(90deg,#eff4fb 0,#7983a7 55.01%,#eff4fb 101.56%);opacity:.4}#hu-options>div:last-child>.hu-fieldset-header{border-radius:0 0 7px 7px}.hu-group-header-box{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.hu-fieldset-toggle-icon,.hu-group-list{display:none}.active-hu-fieldset .hu-fieldset:not(.active){display:none}.active-hu-fieldset .hu-fieldset.active .hu-fieldset-toggle-icon{position:absolute;top:0;left:0;height:60px;width:60px;border-right:1px solid #e8eef3;z-index:1;display:block;text-align:center}.active-hu-fieldset .hu-fieldset.active .hu-fieldset-toggle-icon i{font-size:20px;color:#c1c6cf;vertical-align:middle}.active-hu-fieldset .hu-fieldset.active .hu-fieldset-toggle-icon:hover i{color:#1d84e9}.hu-fieldset.active .hu-fieldset-header-inner{margin-left:60px}.active-hu-fieldset .hu-group-list{position:absolute;display:block}.hu-field-list{display:none;background:#eff4fb;padding:20px 15px 5px;box-shadow:0 1px 1px rgba(0,0,0,.15) inset}.hu-group-toggle-icon{font-size:18px!important}.hu-group-wrap{background:#fff;border-bottom:1px solid rgba(121,127,167,.3)}.hu-group-header-box{font-size:14px;color:rgba(var(--dark),.6);display:flex;justify-content:space-between;align-items:center;padding:10px 15px;cursor:pointer;transition:color .4s}.hu-group-toggle-icon{color:rgba(var(--dark),.3);transition:transform .4s}.active .hu-group-header-box{color:rgba(var(--dark),.8);transition:color .4s}.active .hu-group-header-box .hu-group-toggle-icon{color:rgba(var(--dark));transform:rotate(90deg)}.hu-group-list .hu-group-wrap:last-child{margin-bottom:0}.active-group .hu-field-list{display:block}.hidden{display:none!important}.master-label-group~.hu-subgroup .control-group{margin-top:0}.hu-style-switcher .control-group-inner{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.hu-style-switcher input[type=checkbox]{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:0;width:26px;height:12px;background:rgba(var(--dark),.3);box-shadow:inset -1px -1px 3px rgba(0,0,0,.1);border-radius:100px;position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;cursor:pointer}.hu-style-switcher input[type=checkbox]:after{content:' ';position:absolute;top:-2px;left:-2px;width:16px;height:16px;background:#73779b;border-radius:100px;transition:left .1s cubic-bezier(.785,.135,.15,.86)}.hu-style-switcher>div.control-label label{margin-bottom:0}.hu-style-switcher input[type=checkbox]:checked{background:rgba(var(--primary),.3)}.hu-style-switcher input[type=checkbox]:checked:after{background:rgb(var(--primary));left:12px}.hu-style-switcher input[type=checkbox]:focus:not(:checked):not(:disabled):after,.hu-style-switcher input[type=checkbox]:hover:not(:checked):not(:disabled):after{left:-2px}.hu-style-switcher input[type=checkbox]:focus:checked:not(:disabled):after,.hu-style-switcher input[type=checkbox]:hover:checked:not(:disabled):after{left:12px}.hu-style-switcher input[type=checkbox]:disabled{opacity:.5}.hu-style-switcher input[type=checkbox]:focus{outline:0}.hu-style-checkbox .control-label{display:flex;align-items:center}.hu-style-checkbox .control-label label{margin:0 0 0 8px}.hu-style-checkbox input[type=checkbox]{width:16px;height:16px;margin-top:3px;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(var(--dark),.3);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;border-radius:4px;box-sizing:border-box;box-shadow:0 1px 1px rgba(0,0,0,.1),inset 0 .5px 1.5px rgba(20,50,80,.38);transition:background-color .15s ease-in-out,background-position .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.hu-style-checkbox input[type=checkbox]:checked{background-color:rgb(var(--primary));background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e");border-color:rgb(var(--primary))}.hu-style-checkbox input[type=checkbox]:active{-webkit-filter:brightness(90%);filter:brightness(90%)}.hu-style-checkbox input[type=checkbox]:focus{border-color:#8bbafe;outline:0;box-shadow:0 0 0 .2rem rgba(13,110,253,.25)}.hu-style-checkbox input[type=checkbox]:disabled{pointer-events:none;-webkit-filter:none;filter:none;opacity:.5}.control-group.uneditable{opacity:.5}.layout-panel .control-group-inner{margin:-20px -15px;padding-top:15px}#hu-layout-builder{padding-bottom:50px}#hu-layout-builder .ui-state-highlight{background:rgba(255,255,255,.6);border-radius:5px;margin:10px 10px 20px;border:1px dashed rgba(2,11,83,.2)}.hu-layout-section{padding:0 10px}#hu-layout-builder>.hu-layout-section:not(.ui-sortable-helper){border-bottom:1px solid rgba(var(--dark),.2);padding-bottom:15px;margin-bottom:15px}#hu-layout-builder>.hu-layout-section:last-child{border-bottom-color:transparent}.hu-layout-section-inner{background:#fff;box-shadow:0 2px 4px rgba(20,50,80,.2);border-radius:5px;position:relative}.hu-add-row{position:absolute;bottom:0;left:50%;margin-left:-12px;margin-bottom:-28px;padding:0;width:24px;height:24px;line-height:24px;border-radius:20px;z-index:-1;opacity:0;transition:opacity .4s}.hu-layout-section:not(.ui-sortable-helper):hover .hu-add-row{opacity:1;z-index:9}.hu-add-row:active,.hu-add-row:focus,.hu-add-row:hover{background:#0069d9;color:#fff}.hu-section-settings{padding:10px 10px 0}.hu-section-title{font-size:12px;font-weight:400;color:rgba(var(--dark),.7)}.hu-move-row{display:inline-block;color:#fff;width:18px;height:18px;line-height:18px;text-align:center;font-size:12px;border-radius:2px;cursor:move;text-decoration:none;margin-right:8px}.hu-layout-builder-action svg{fill:rgba(var(--dark),.4);transition:fill .4s}.hu-layout-builder-action:hover svg{fill:rgb(var(--primary))}.hu-row-container{padding:10px}.hu-layout-row{margin-left:-2.5px;margin-right:-2.5px;position:relative}.hu-layout-row .hu-layout-column{padding-left:2.5px;padding-right:2.5px}.hu-layout-column.ui-state-highlight{color:rgba(var(--dark),0,6);background:rgba(51,102,255,.1);border:1px dashed rgba(2,11,83,.2);margin:0!important;border-radius:2px}.hu-column{font-size:12px;color:rgba(var(--dark),.6);font-weight:500;padding:0 5px;height:26px;line-height:26px;background:rgba(51,102,255,.1);border:1px dashed rgba(2,11,83,.2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:2px;cursor:move;position:relative}.hu-layout-column.ui-sortable-helper .hu-column{background:#ebf0ff;color:rgb(var(--primary));border:1px dashed rgba(51,102,255,.15);box-shadow:0 4px 4px rgba(115,119,155,.3)}.hu-layout-column.ui-sortable-helper .hu-column-options{display:none}.hu-column-component{color:rgb(var(--primary))}.hu-column-options{width:20px;height:20px;background-color:#cfdbff;position:absolute;top:2px;right:2px;z-index:8;border-radius:2px;display:flex;align-items:center;justify-content:center;opacity:0;transition:background-color .4s,opacity .4s}.hu-column:hover .hu-column-options{opacity:1}.hu-row-option-list{list-style:none;padding:0;margin:0;height:100%}.hu-row-option-list>li{display:inline-block;margin:0 0 0 5px;padding:0;position:inherit;height:100%}.hu-row-option-list .hu-column-list{display:none;position:absolute;top:30px;left:0;right:0;z-index:9993;padding:20px 20px 10px;background:rgba(255,255,255,.72);box-shadow:0 4px 4px rgba(115,119,155,.3);backdrop-filter:blur(6px);border-radius:10px}.hu-row-option-list .hu-column-layout{color:rgb(var(--dark));display:block;text-decoration:none;margin-bottom:10px;transition:color .4s}.hu-row-option-list .hu-column-layout.active,.hu-row-option-list .hu-column-layout:hover{color:rgb(var(--primary));text-decoration:none}.hu-row-option-list .hu-column-layout-preview{display:flex;align-items:center;justify-content:center;height:46px;background:rgba(2,11,83,.2);border:1px solid transparent;border-radius:7px;transition:background-color .4s,border-color .4s,box-shadow .4s}.hu-row-option-list .hu-column-layout.active .hu-column-layout-preview,.hu-row-option-list .hu-column-layout:hover .hu-column-layout-preview{background:rgba(51,102,255,.1);border:1px solid rgba(51,102,255,.14)}.hu-row-option-list .hu-column-layout:hover .hu-column-layout-preview{box-shadow:0 4px 4px rgba(115,119,155,.3)}.hu-row-option-list .hu-column-layout svg{fill:rgb(var(--dark));transition:fill .4s}.hu-row-option-list .hu-column-layout.active svg,.hu-row-option-list .hu-column-layout:hover svg{fill:rgb(var(--primary))}.hu-row-option-list .hu-column-layout-name{font-size:12px;display:block;margin-top:5px;text-align:center;color:rgba(var(--dark),.7);transition:color .4s}.hu-row-option-list .hu-column-layout.active .hu-column-layout-name,.hu-row-option-list .hu-column-layout:hover .hu-column-layout-name{color:rgb(var(--primary))}.hu-option-group .hu-option-group-list{border-bottom:1px solid #e8eef3}.hu-option-group:not(.active) .hu-option-group-list{display:none}.hu-option-group-list{padding:20px}.hu-option-group-list>.control-group:first-child{border-top:0;padding-top:0;margin-top:0}.hu-option-group{background:#fff}.hu-option-group-title{padding:0 20px;height:40px;line-height:40px;color:#6f737a;font-size:14px;display:block;cursor:pointer;border-bottom:1px solid #e8eef3;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.hu-option-group.active .hu-option-group-title{color:#007bff}.hu-option-group-title .fa-angle-right{position:absolute;right:20px;top:50%;transform:translateY(-50%);-webkit-transform:translateY(-50%);transition:transform .3s ease}.hu-option-group.active .hu-option-group-title .fa-angle-right{transform:translateY(-50%) rotate(90deg);-webkit-transform:translateY(-50%) rotate(90deg)}.hu-options-modal .control-group label{margin-bottom:10px}.control-group.control-group-checkbox .control-label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}.hu-options-modal .control-group.control-group-checkbox .control-label{display:flex;justify-content:space-between;align-items:center;margin:0}.hu-options-modal .control-group-checkbox input[type=checkbox]{margin-left:auto}.hu-group-headers{position:relative}.control-group.group-style-headers{margin-top:0;padding-top:0;border-top:0}.hu-group-headers .hu-field-list>.control-group-checkbox .controls{position:absolute;top:7px;right:15px}.hu-header-list,.hu-offcanvas-list{list-style:none;padding:0;margin:-10px;text-align:center}.hu-header-list>li,.hu-offcanvas-list>li{margin:10px;display:block;float:left}.hu-header-list,.hu-offcanvas-list{list-style:none;padding:0;margin:0;display:flex;flex-wrap:wrap}.hu-header-list>li,.hu-offcanvas-list>li{margin:0;padding:5px;border-radius:1px;display:block;cursor:pointer;position:relative;flex:0 0 33.333%}.hu-header-list>li img,.hu-offcanvas-list>li img{max-width:100%}.hu-header-list>li>span,.hu-offcanvas-list>li>span{display:inline-block;position:relative}.hu-header-list>li>.hu-predefined-headers-title,.hu-offcanvas-list>li>.hu-predefined-offcanvas-title{display:block;margin-top:5px;margin-bottom:5px}.hu-header-list>li>.img-wrap:after,.hu-offcanvas-list>li>.img-wrap:after{content:'';position:absolute;top:0;bottom:0;left:0;right:0;border:1.5px solid #36f;box-shadow:0 2px 4px rgba(20,50,80,.2);border-radius:3px;opacity:0;transition:.3s}.hu-offcanvas-list>li>.img-wrap:after{top:0;bottom:0;left:0;right:0}.hu-header-list>li.active>.img-wrap:after,.hu-header-list>li:hover>.img-wrap:after{opacity:1}.hu-offcanvas-list>li.active>.img-wrap:after,.hu-offcanvas-list>li:hover>.img-wrap:after{opacity:1}.hu-edit-preset{position:absolute;color:#fff;top:0;right:0;background:#fff;width:20px;height:20px;display:flex;justify-content:center;align-items:center;display:none;box-shadow:-2px 1px 0 1px #aeaeae;border-bottom-left-radius:3px;transition:all .3s ease}.hu-preset:hover .hu-edit-preset{display:flex}.hu-presets{margin:-5px}.hu-presets>div{margin:5px}.hu-presets>div{display:block;padding:5px;width:90px;height:70px;float:left;position:relative;cursor:pointer;border-radius:3px}.hu-presets .hu-preset-title{position:absolute;left:0;bottom:0;font-size:12px;line-height:1;background:0 0;padding:5px;color:#fff;text-transform:capitalize}.hu-presets>div.active{-webkit-box-shadow:inset 0 0 0 5px rgba(0,0,0,.4);box-shadow:inset 0 0 0 5px rgba(0,0,0,.4)}.hu-presets>div.active .hu-preset-title{background:rgba(0,0,0,.4);color:#fff;padding:5px 5px 0 0;left:5px;bottom:5px;border-radius:0 3px 0 0}.hu-options-modal .hu-preset-container{padding:20px 15px 0}.hu-options-modal .hu-preset-container label{margin-bottom:0}.hu-webfont-size{position:relative}#header_height-lbl,#logo_height-lbl,.hu-webfont-size>label{display:flex;align-items:center}#header_height-lbl:after,#logo_height-lbl:after,.hu-webfont-size>label:after{content:'';background-image:url(../../images/icon-res.svg);width:16px;height:16px;display:inline-block;margin-left:10px}.hu-webfont-unit{display:none}.hu-webfont-unit.active{display:flex}.hu-webfont-size .hu-webfont-size-input,.hu-webfont-size .hu-webfont-size-input-sm,.hu-webfont-size .hu-webfont-size-input-xs{display:none}.hu-webfont-size .hu-webfont-size-input-sm.active,.hu-webfont-size .hu-webfont-size-input-xs.active,.hu-webfont-size .hu-webfont-size-input.active{display:block}.font-update-failed,.font-update-success{margin-top:10px;font-weight:700}.font-update-success{color:#51a351}.font-update-failed{color:#bd362f}.chzn-select,.chzn-select-deselect{width:100%}.chzn-container.chzn-container-single .chzn-single{display:block;width:100%;padding:6px 12px;font-size:12px;font-weight:500;line-height:1.5;height:32px;color:rgba(var(--dark));background-image:none;background-clip:padding-box;background:linear-gradient(180deg,#fff 0,#eaedef 100%);border:1px solid rgba(121,127,167,.3);box-shadow:0 1px 1px rgba(20,50,80,.1);border-radius:5px;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.chzn-container.chzn-container-single .chzn-single div{width:30px;background:0 0}.chzn-container.chzn-container-single .chzn-single div>b{background:0 0;position:relative}.chzn-container.chzn-container-single .chzn-single abbr{top:9px}.chzn-container.chzn-container-single .chzn-single div>b:after{content:'\f0dc';font-family:'Font Awesome 5 Free';font-size:.875rem;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);color:#7a8391}.chzn-container.chzn-container-single.chzn-container-active.chzn-with-drop .chzn-single{border-radius:.25rem .25rem 0 0}.chzn-container.chzn-container-single.chzn-container-active.chzn-with-drop div>b:after{color:rgb(var(--dark))}.chzn-container.chzn-container-single .chzn-search{padding:.625rem}.chzn-container.chzn-container-single .chzn-search input[type=text]{display:block;width:100%;padding:6px;font-size:12px;line-height:1.2;height:28px;color:rgba(var(--dark));background-color:#fff;background-image:none;background-clip:padding-box;border:1px solid rgba(121,127,167,.3);box-shadow:0 1px 1px rgba(20,50,80,.1);border-radius:5px;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.chzn-container.chzn-container-single .chzn-search input[type=text]:focus{border-color:rgb(var(--primary));box-shadow:0 2px 4px rgba(20,50,80,.2)}.chzn-container.chzn-container-single .chzn-search:after{content:'\f002';font-family:'Font Awesome 5 Free';font-weight:900;font-size:.875rem;color:rgba(0,0,0,.2);position:absolute;top:50%;right:20px;transform:translateY(-50%);-webkit-transform:translateY(-50%)}.chzn-container.chzn-container-single .chzn-drop{border-color:rgba(0,0,0,.15);border-radius:0 0 .25rem .25rem;box-shadow:none;-webkit-box-shadow:none}.chzn-container.chzn-container-single .chzn-results li.highlighted{background-image:none!important}.chzn-container.chzn-container-multi .chzn-choices{display:block;width:100%;padding:0 .75rem;min-height:calc(2.25rem + 2px);line-height:1.25;background-color:#fff;background-image:none;background-clip:padding-box;border:1px solid rgba(121,127,167,.3);box-shadow:0 1px 1px rgba(20,50,80,.1);border-radius:5px;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.chzn-container.chzn-container-multi .chzn-choices li.search-field input[type=text]{font-size:.875rem;font-weight:400;line-height:1.25;height:calc(2rem + 2px);background-color:#fff}.chzn-container.chzn-container-multi .chzn-choices li.search-choice{margin:5.5px 5px 0 0;color:rgb(var(--primary));padding:5px 20px 5px 8px;background:rgba(51,102,255,.1);border:1px solid rgba(51,102,255,.14);border-radius:20px}.chzn-container.chzn-container-multi .chzn-choices li.search-choice .search-choice-close{top:5px;color:rgba(var(--dark),.5);background:0 0}.chzn-container.chzn-container-multi .chzn-choices li.search-choice .search-choice-close:hover{color:rgba(0,0,0,.5)}.chzn-container.chzn-container-multi .chzn-choices li.search-choice .search-choice-close:after{content:'\f057';font-family:'Font Awesome 5 Free';font-weight:900;font-size:.875rem;position:absolute;top:0;right:0}.chzn-container.chzn-container-multi.chzn-with-drop.chzn-container-active .chzn-choices{border-radius:.25rem}.chzn-container.chzn-container-multi.chzn-with-drop .chzn-drop{margin-top:-4px;border:none;border-radius:0;box-shadow:none;-webkit-box-shadow:none}.chzn-container.chzn-container-multi.chzn-with-drop .chzn-drop .chzn-results:not(:empty){padding:.75rem;background:#fff;border:1px solid rgba(0,0,0,.15);border-top:0;border-radius:0 0 .25rem .25rem}.chzn-container.chzn-container-multi.chzn-with-drop .chzn-drop .chzn-results li.no-results{background:0 0}.hu-importer-wrapper{display:flex;justify-content:flex-start;align-items:center}.hu-importer-wrapper #btn-hu-import-settings{margin-left:20px}.btn-purge-hu-css span{margin-left:10px}.hu-sidebar{width:100px;position:absolute;left:60px;top:80px;z-index:2;background:#fff;border-right:1px solid #f1f1f1;box-shadow:0 0 15px 10px #22222230;border-radius:10px}.sidebar-draggable-handler{display:block;height:40px;text-align:center;padding-top:10px;cursor:grab}.sidebar-draggable-handler>span{color:#9797978a}.hu-media-clear.hide{display:none}.hu-font-color{position:relative}input[type=color]{height:30px}.hu-font-color .hu-color-preview{position:absolute;width:10px;height:10px;left:6px;bottom:6px;border-radius:3px}.hu-font-color .hu-color-code{position:absolute;left:18px;bottom:3px;border-radius:3px}.hu-typography-wrapper{background:#fff;border-radius:5px;box-shadow:0 1px 1px 0 #bfbdbd;margin-left:0;margin-right:0;margin-bottom:15px}.hu-typography-wrapper>div{padding-left:0;padding-right:0}.hu-typography-wrapper .hu-is-header{padding:10px 15px 0 15px}.hu-typography-wrapper .hu-is-header .control-group-checkbox{margin-bottom:10px}.hu-typography-wrapper .hu-field-webfont{padding:15px 15px 0 15px}.hu-webfont-preview-wrapper{margin:-10px -15px 10px;padding:15px;background:rgba(51,102,255,.15)}.hu-typography-wrapper .minicolors-theme-bootstrap .minicolors-panel{left:auto!important;right:0}.hu-badge{display:inline-block;padding:.25em .4em .13em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.hu-badge-primary{color:#fff;background-color:#007bff}.hu-badge-secondary{color:#fff;background-color:#6c757d}.hu-badge-success{color:#fff;background-color:#28a745}.hu-badge-danger{color:#fff;background-color:#dc3545}.hu-badge-warning{color:#212529;background-color:#ffc107}.hu-badge-info{color:#fff;background-color:#17a2b8}.hu-badge-light{color:#212529;background-color:#f8f9fa}.hu-badge-dark{color:#fff;background-color:#343a40}.hu-unit-group .hu-unit-field-input{border-top-left-radius:5px!important;border-bottom-left-radius:5px!important;max-width:75px}.hu-unit-group .hu-unit-select{box-shadow:none!important;background-size:8px 12px!important;background-position:right 3px center!important}.field-hidden{display:none!important}.hu-no-gutter-bottom .hu-inline-group{margin-bottom:0!important}@media (max-width:768px){.hu-topbar .topbar-left{min-width:auto}.hu-topbar .topbar-middle{display:none;min-width:auto}.hu-topbar .topbar-right{border-left:0;min-width:auto}}@media (max-width:576px){.hu-topbar .topbar-left{min-width:auto}.hu-topbar .topbar-middle{display:none;min-width:auto}.hu-topbar .topbar-right{min-width:auto}.hu-topbar .topbar-right .helix-topbar-save-text{display:none}.hu-btn svg{margin-right:0!important}.hu-topbar .topbar-right .helix-topbar-show-preview-text{display:none}#hu-options-panel{width:44px}.hu-fieldset-header .hu-option-title{display:none}.hu-panel-position-left .hu-fieldset-contents{top:12%;right:0;width:100%;position:fixed}}.choices__input{display:inline-block;vertical-align:baseline;background-color:transparent;font-size:14px;margin-bottom:5px;border:0!important;border-radius:0;max-width:100%;padding:4px 0 4px 2px;box-shadow:none!important}.choices__input:focus,.choices__input:hover{outline:0!important;border:0!important;box-shadow:none!important;background-color:transparent!important}[dir=rtl] .choices__input{padding-right:2px;padding-left:0}.choices__input::-moz-placeholder{color:#484f56;opacity:1}.choices__input::-webkit-input-placeholder{color:#484f56;opacity:1}PKBA#]�ѯ���1system/helixultimate/assets/css/admin/details.cssnu�[���.hu-options{background:#05d21f;border-radius:3px;color:#fff;padding:20px 30px;font-size:16px;font-weight:700;display:inline-block;margin-top:10px}.hu-options:active,.hu-options:focus,.hu-options:hover{text-decoration:none;color:#fff;background:#05bb1b}PKBA#]�-�x��1system/helixultimate/assets/css/admin/toaster.cssnu�[���#hu-toaster-container{position:fixed;z-index:99999}@keyframes huFadeInDown{0%{opacity:1;transform:translateY(0)}100%{opacity:0;transform:translateY(-40px)}}@keyframes huFadeInUp{0%{opacity:0;transform:translateY(40px)}100%{opacity:1;transform:translateY(0)}}#hu-toaster-container.hu-toaster-bottom-right{right:12px;bottom:12px}#hu-toaster-container.hu-toaster-top-right{right:12px;top:12px}#hu-toaster-container.hu-toaster-top-left{left:12px;top:12px}#hu-toaster-container.hu-toaster-bottom-left{left:12px;bottom:12px}#hu-toaster-container .hu-toaster{position:relative;overflow:hidden;width:400px;box-shadow:0 2px 4px rgba(20,50,80,.2);padding:15px;border-radius:5px;cursor:pointer;margin:0 0 20px;transition:all .3s ease;display:flex;font-size:14px}.hu-toaster-info-icon{margin-right:10px}.hu-toaster-close{margin-left:auto}.hu-toaster-info-icon .bi.bi-info-circle{width:25px;height:25px}.hu-toaster-close .bi.bi-x{width:25px;height:25px}.hu-toaster-title{font-weight:700;margin-top:-5px;margin-bottom:4px}.hu-toaster-message{word-break:break-word;opacity:.7;font-size:13px}#hu-toaster-container .hu-toaster.hu-toast-success{background-color:#d5e6de;color:#166c36}#hu-toaster-container .hu-toaster.hu-toast-warning{background-color:#fdf3d1;color:#6c5a27}#hu-toaster-container .hu-toaster.hu-toast-error{background-color:#f3d8da;color:#8a3035}#hu-toaster-container .hu-toaster.hu-toast-info{background-color:#dceafb;color:#1a4aaa}PKBA#]�÷ִ.�.8system/helixultimate/assets/css/admin/menu.generator.cssnu�[���.megamenu *,.megamenu ::after,.megamenu ::before{box-sizing:border-box}.hu-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.hu-no-gutters{margin-right:0;margin-left:0}.hu-no-gutters>.hu-col,.hu-no-gutters>[class*=hu-col-]{padding-right:0;padding-left:0}.col,.hu-col-1,.hu-col-10,.hu-col-11,.hu-col-12,.hu-col-2,.hu-col-3,.hu-col-4,.hu-col-5,.hu-col-6,.hu-col-7,.hu-col-8,.hu-col-9,.hu-col-auto,.hu-col-lg,.hu-col-lg-1,.hu-col-lg-10,.hu-col-lg-11,.hu-col-lg-12,.hu-col-lg-2,.hu-col-lg-3,.hu-col-lg-4,.hu-col-lg-5,.hu-col-lg-6,.hu-col-lg-7,.hu-col-lg-8,.hu-col-lg-9,.hu-col-lg-auto,.hu-col-md,.hu-col-md-1,.hu-col-md-10,.hu-col-md-11,.hu-col-md-12,.hu-col-md-2,.hu-col-md-3,.hu-col-md-4,.hu-col-md-5,.hu-col-md-6,.hu-col-md-7,.hu-col-md-8,.hu-col-md-9,.hu-col-md-auto,.hu-col-sm,.hu-col-sm-1,.hu-col-sm-10,.hu-col-sm-11,.hu-col-sm-12,.hu-col-sm-2,.hu-col-sm-3,.hu-col-sm-4,.hu-col-sm-5,.hu-col-sm-6,.hu-col-sm-7,.hu-col-sm-8,.hu-col-sm-9,.hu-col-sm-auto,.hu-col-xl,.hu-col-xl-1,.hu-col-xl-10,.hu-col-xl-11,.hu-col-xl-12,.hu-col-xl-2,.hu-col-xl-3,.hu-col-xl-4,.hu-col-xl-5,.hu-col-xl-6,.hu-col-xl-7,.hu-col-xl-8,.hu-col-xl-9,.hu-col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.hu-col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.hu-col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.hu-col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.hu-col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.hu-col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.hu-col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.hu-col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.hu-col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.hu-col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.hu-col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.hu-col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.hu-col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.hu-col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.hu-col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media (min-width:576px){.hu-col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.hu-col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.hu-col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.hu-col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.hu-col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.hu-col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.hu-col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.hu-col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.hu-col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.hu-col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.hu-col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.hu-col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.hu-col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.hu-col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media (min-width:768px){.hu-col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.hu-col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.hu-col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.hu-col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.hu-col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.hu-col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.hu-col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.hu-col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.hu-col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.hu-col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.hu-col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.hu-col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.hu-col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.hu-col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media (min-width:992px){.hu-col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.hu-col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.hu-col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.hu-col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.hu-col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.hu-col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.hu-col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.hu-col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.hu-col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.hu-col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.hu-col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.hu-col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.hu-col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.hu-col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media (min-width:1200px){.hu-col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.hu-col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.hu-col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.hu-col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.hu-col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.hu-col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.hu-col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.hu-col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.hu-col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.hu-col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.hu-col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.hu-col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.hu-col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.hu-col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.hu-megamenu-sidebar h3{height:40px;color:#000;font-size:16px;line-height:40px;margin:0 0 5px 0;padding:0}.hu-megamenu-sidebar h3 .fas{color:#1d85e9;margin-right:5px}.hu-megamenu-draggable-module{color:#656565;background:#fdfdfd;border:1px solid #f0f0f0;padding:10px;margin-bottom:10px;position:relative;cursor:move}.hu-megamenu-draggable-module .fas{margin-right:5px}.hu-megamenu-draggable-module:hover{background:#f1f1f1}.hu-megamenu-actions>div{display:inline-flex;margin-right:11px;padding-right:15px;border-right:1px solid #f0f0f0;align-items:center;margin-bottom:20px}.hu-megamenu-actions>div:last-child{margin-right:0;padding-right:0;border-right:0}.hu-megamenu-alignment a.active{background:#1d84e9;color:#fff}.hu-megamenu-actions input[type=number]{min-height:26px;width:60px}.hu-megamenu-actions input[type=text]{min-height:26px;width:160px}.hu-megamenu-actions .chzn-container-single{width:100px!important}.hu-megamenu-label{margin-right:10px;font-weight:500;color:#000}.hu-megamenu-row{background:#f5f5f5;border:1px solid #e6e6e6;padding:0 10px 10px;margin-bottom:20px}.hu-megamenu-row-actions{display:flex;color:#000;font-weight:500;padding-top:10px;padding-bottom:10px;cursor:move}.hu-action-detele-row{margin-left:auto;color:#0c0c0c;text-decoration:none}.hu-action-detele-row:hover{color:#d0021b;text-decoration:none}.hu-megamenu-column{padding:0 10px 10px;background:#fff;border:1px solid #e4e4e4}.hu-megamenu-column-actions{display:flex;color:#7d7d7d;font-weight:500;padding-top:10px;padding-bottom:10px;cursor:move}.hu-megamenu-item{position:relative;padding:10px;background:#f5f5f5;border:2px solid #e7e7e7;margin-bottom:10px}.hu-megamenu-item-list>div:last-child{margin-bottom:0}.hu-megamenu-item-list:empty{content:'Drop Module';position:relative;height:40px;line-height:40px;text-align:center;border:1px dashed #f0f0f0}.hu-megamenu-item-list:empty:after{content:'Drop Module'}.hu-megamenu-add-row{margin-top:30px;text-align:center}#hu-choose-megamenu-layout{color:#fff;background:#1d85e9;padding:10px 20px;border:0;border-radius:3px}#hu-megamenu-layout-modal{position:relative;max-width:800px;margin:20px auto 0;padding:20px 20px 10px 20px;background:#fff;box-shadow:0 2px 15px 0 #e8eef3;border-radius:3px}.hu-megamenu-layout-list{width:25%;float:left}.hu-megamenu-grids{margin-bottom:10px}.hu-megamenu-grids .hu-row{margin-left:-2.5px;margin-right:-2.5px}.hu-megamenu-grids .hu-row>div{padding-left:2.5px;padding-right:2.5px}.hu-megamenu-grids>div>div>div{background:#ccd6de;border-radius:2px;height:30px;line-height:30px;text-align:center}.hu-megamenu-remove-module{position:absolute;top:50%;right:10px;color:#626262;text-decoration:none;transform:translateY(-50%)}.hu-megamenu-remove-module:hover{color:#d0021b}input[type=checkbox].hu-checkbox{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:0;width:46px;height:26px;background-image:linear-gradient(-53deg,#ff5000 0,#d53a57 100%);box-shadow:inset 1px 1px 3px 0 rgba(0,0,0,.1),inset -3px 3px 4px 0 rgba(0,0,0,.09);border-radius:100px;position:relative;display:inline-block;overflow:hidden;vertical-align:middle;box-sizing:border-box}input[type=checkbox].hu-checkbox:focus{outline:0}input[type=checkbox].hu-checkbox:after{content:'';position:absolute;top:2px;left:2px;width:22px;height:22px;background:#fff;box-shadow:-4px 3px 5px 0 rgba(0,0,0,.13);border-radius:100px;transition:left .1s cubic-bezier(.785,.135,.15,.86)}input[type=checkbox].hu-checkbox:checked{background-image:linear-gradient(-225deg,#3ad5a7 0,#00ff4f 100%);box-shadow:inset 1px 1px 3px 0 rgba(0,0,0,.1),inset -3px 3px 4px 0 rgba(0,0,0,.09)}input[type=checkbox].hu-checkbox:checked:after{left:22px;box-shadow:4px 3px 5px 0 rgba(0,0,0,.13)}input[type=checkbox].hu-checkbox:focus:not(:checked):not(:disabled):after,input[type=checkbox].hu-checkbox:hover:not(:checked):not(:disabled):after{left:2px}input[type=checkbox].hu-checkbox:focus:checked:not(:disabled):after,input[type=checkbox].hu-checkbox:hover:checked:not(:disabled):after{left:22px}input[type=checkbox].hu-checkbox:disabled{opacity:.5}.hide-menu-builder{display:none!important}.hu-megamenu-grids{cursor:pointer}PKBA#]�T.``6system/helixultimate/assets/css/admin/blog-options.cssnu�[���.hu-image-upload-wrapper:empty{display:none}.hu-image-upload-wrapper{width:290px;display:block;margin-bottom:20px}.hu-image-upload-wrapper:not(.loading){max-height:290px;background:#f5f5f5;padding:5px;border:1px solid #e5e5e5}.hu-image-upload-wrapper img{display:block;height:100%;width:100%;max-height:270px}.hu-image-item-loader{line-height:200px;text-align:center;font-size:24px}.btn.btn-hu-image-remove,.btn.btn-hu-image-upload{display:none}.hu-image-field-empty .btn-hu-image-upload{display:inline-block}.hu-image-field-has-image .btn-hu-image-remove{display:inline-block}.btn.btn-hu-gallery-item-upload{padding:11px 19px;font-size:16.25px;border-radius:4px}.hu-gallery-items{display:none;list-style:none;padding:0;margin:-10px}.hu-gallery-items:not(:empty){margin-bottom:15px;display:block}.hu-gallery-items li{position:relative;display:inline-block;margin:10px;cursor:move;border-radius:3px;overflow:hidden}.hu-gallery-items li.loading{width:200px}.hu-gallery-items li.loading .progress{margin-bottom:0}.btn-hu-remove-gallery-image{position:absolute!important;top:10px;right:10px;padding:.375rem .75rem!important}PKBA#]���n�0�02system/helixultimate/assets/css/admin/megamenu.cssnu�[���.hu-mega-menu-builder.collapsed{width:350px}.hu-mega-menu-builder.collapsed .chzn-container,.hu-mega-menu-builder.collapsed .hu-megamenu-builder-badge_position,.hu-mega-menu-builder.collapsed .hu-megamenu-builder-dropdown{width:140px!important}.hu-mega-menu-builder .hu-modal-inner{background:#f1f4fa}.hu-megamenu-container .hu-megamenu-sidebar{width:220px;background:#fff;height:492px;box-shadow:0 2px 4px rgba(20,50,80,.2);border-radius:5px;margin-right:20px;padding:15px}.hu-megamenu-settings{display:none}.hu-megamenu-settings.show{display:block}.hu-megamenu-settings .control-group{display:flex;align-items:center;justify-content:space-between}.hu-megamenu-grid{display:none}.hu-megamenu-grid.show{display:block}.hu-megamenu-container .hu-megamenu-grid{width:725px;padding-right:10px;overflow-y:scroll;max-height:492px;position:relative}.hu-megamenu-add-row{margin-top:40px;text-align:center}.hu-megamenu-row-wrapper{background:rgba(51,102,255,.1);border-radius:5px;padding:8px 12px 12px}.hu-megamenu-row-wrapper:not(:first-child){margin-top:10px}.hu-megamenu-row-wrapper .hu-row-toolbar{display:flex;justify-content:space-between;margin-bottom:10px}.hu-megamenu-row-toolbar{display:flex;justify-content:space-between;margin-bottom:10px}.hu-megamenu-row-toolbar-right{position:relative;text-align:right}.hu-megamenu-column-contents-wrapper{background:#fff;padding:6px 8px 8px;box-shadow:0 2px 4px rgba(20,50,80,.2);border-radius:5px}.hu-megamenu-column-contents{min-height:10px}.hu-megamenu-columns-container{position:relative}.hu-megamenu-row-toolbar-left{cursor:ns-resize}.hu-megamenu-column-toolbar svg,.hu-megamenu-row-toolbar-left svg{opacity:.4}.hu-megamenu-column-toolbar span,.hu-megamenu-row-toolbar-left span{display:inline-block;color:rgba(2,11,83,.7);font-size:12px;margin-left:8px}.hu-megamenu-row-toolbar-right a{padding:0;text-decoration:none}.hu-megamenu-row-toolbar-right a svg{fill:rgba(2,11,83,.4);transition:.35s}.hu-megamenu-row-toolbar-right a:hover svg{fill:#020b53}.hu-megamenu-row-toolbar-right .hu-megamenu-columns{margin-right:10px}.hu-row-sortable-placeholder{border:1px dashed #222;min-height:40px;margin-top:10px}.hu-megamenu-column-toolbar{cursor:ew-resize}.hu-megamenu-column-dragging{flex-wrap:initial}.hu-megamenu-cell{background:#eaefff;border:1px dashed #bcc1dd;border-radius:2px;padding:3px 8px;cursor:grab;font-size:12px;color:#021153;margin-top:7px;position:relative;min-height:26px}.hu-megamenu-cell .hu-badge,.hu-megamenu-cell .hu-btn{position:absolute;top:5px;right:8px;transition:.35s}.hu-megamenu-cell .hu-btn{opacity:0;pointer-events:none;visibility:hidden}.hu-megamenu-cell:hover .hu-badge{opacity:0;pointer-events:none;visibility:hidden}.hu-megamenu-cell:hover .hu-btn{opacity:1;visibility:visible;pointer-events:all}.hu-column-sortable-placeholder{border:1px dashed #222;min-height:100px;min-width:60px;margin-right:10px}.hu-item-sortable-placeholder{border:1px dashed #222;min-height:26px;margin-top:5px}.hu-megamenu-add-new-item{width:100%;text-align:center;margin-top:8px;background:rgba(51,102,255,.1);border:1px dashed rgba(2,11,83,.2);border-radius:2px;padding:2px 0;cursor:pointer;font-size:16px;outline:0!important;transition:.35s}.hu-megamenu-add-new-item:focus,.hu-megamenu-add-new-item:hover{border-color:rgb(var(--primary));background:rgba(var(--primary),.25)}.hu-megamenu-add-new-item span{color:rgb(var(--primary))}.hu-megamenu-row-slots{background:#fff;padding:10px;border-radius:10px;position:absolute;display:none;z-index:1;box-shadow:0 0 10px 0 #22222285;width:500px;top:40px;right:10px}.hu-megamenu-row-slots.show{display:block}.hu-megamenu-settings .control-group label{flex-basis:100%}.hu-mega-menu-builder .control-group select,.hu-megamenu-builder-faicon,.hu-megamenu-builder-faicon+.chosen-container>a{height:30px;width:88px;color:#021153;font-size:12px;font-weight:500;background-position:right 3px center;background-size:16px 10px;background-color:#fff;border:1px solid rgba(121,127,167,.3);box-shadow:0 1px 1px rgba(20,50,80,.1);border-radius:5px}.hu-megamenu-builder-faicon+.chosen-container>a{line-height:30px}.hu-megamenu-builder-faicon+.chosen-container-single .chosen-single abbr{top:9px}.hu-mega-menu-builder .control-group input:not([type=checkbox]){padding:5px 12px;background:#fff;border:1px solid rgba(121,127,167,.3);box-shadow:0 1px 1px rgba(20,50,80,.1);border-radius:5px}.hu-mega-menu-builder .control-group input.hu-megamenu-builder-badge{max-width:88px}.hu-mega-menu-builder.collapsed .control-group input.hu-megamenu-builder-badge{max-width:140px!important}.hu-mega-menu-builder .control-group input::-webkit-inner-spin-button,.hu-mega-menu-builder .control-group input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.hu-mega-menu-builder .control-group input[type=number]{-moz-appearance:textfield}.hu-megamenu-settings .hu-input-group input{min-width:45px;padding:5px 0 5px 6px!important;max-width:75px}.hu-megamenu-settings .hu-input-group{justify-content:flex-end}.hu-megamenu-settings .hu-input-group select,.hu-unit-group select{max-width:40px;padding-left:4px;padding-right:0;background-position:right 0 center;display:flex;padding-top:4px}.hu-megamenu-columns-layout .hu-megamenu-custom-layout{margin-top:10px;text-align:left;display:none}.hu-megamenu-columns-layout .hu-megamenu-custom-layout input{margin-right:10px}.hu-megamenu-add-slots{background:#fff;box-shadow:0 1px 20px 0 #22222254;padding:20px;border-radius:10px;width:500px;display:none;margin:20px auto 50px;position:absolute;left:0;right:0}.hu-megamenu-container .hu-megamenu-column-layout{color:rgb(var(--dark));display:block;text-decoration:none;margin-bottom:10px;transition:color .4s}.hu-megamenu-container .hu-megamenu-column-layout.active,.hu-megamenu-container .hu-megamenu-column-layout:hover{color:rgb(var(--primary));text-decoration:none}.hu-megamenu-container .hu-megamenu-column-layout-preview{display:flex;align-items:center;justify-content:center;height:46px;background:rgba(2,11,83,.2);border:1px solid transparent;border-radius:7px;transition:background-color .4s,border-color .4s,box-shadow .4s}.hu-megamenu-container .hu-megamenu-column-layout.active .hu-megamenu-column-layout-preview,.hu-megamenu-container .hu-megamenu-column-layout:hover .hu-megamenu-column-layout-preview{background:rgba(51,102,255,.1);border:1px solid rgba(51,102,255,.14)}.hu-megamenu-container .hu-megamenu-column-layout:hover .hu-megamenu-column-layout-preview{box-shadow:0 4px 4px rgba(115,119,155,.3)}.hu-megamenu-container .hu-megamenu-column-layout svg{fill:rgb(var(--dark));transition:fill .4s}.hu-megamenu-container .hu-megamenu-column-layout.active svg,.hu-megamenu-container .hu-megamenu-column-layout:hover svg{fill:rgb(var(--primary))}.hu-megamenu-container .hu-megamenu-column-layout-name{font-size:12px;display:block;margin-top:5px;text-align:center;color:rgba(var(--dark),.7);transition:color .4s}.hu-megamenu-container .hu-megamenu-column-layout.active .hu-megamenu-column-layout-name,.hu-megamenu-container .hu-megamenu-column-layout:hover .hu-megamenu-column-layout-name{color:rgb(var(--primary))}.hu-mega-menu-builder .minicolors-theme-bootstrap .minicolors-input[type=text]{background:#fff;border:1px solid rgba(121,127,167,.3);box-sizing:border-box;box-shadow:0 1px 1px rgba(20,50,80,.1);border-radius:5px;height:30px;width:130px;padding:5px 5px 5px 65px;font-size:12px;font-weight:500}.hu-mega-menu-builder .minicolors-theme-bootstrap .minicolors-swatch{background:url(../../images/mega-menu-color-select.jpg) repeat center/cover;width:53px;height:18px;top:6px;border-radius:3px}.hu-megamenu-add-item-wrapper{position:relative}.hu-megamenu-cell-options{list-style:none;padding:0;margin:0;background:#fff;box-shadow:1px 2px 6px 0 #a1a1a1;margin-top:10px;border-radius:5px;position:absolute;width:100%;top:35px;left:10px}.hu-megamenu-cell-options li{cursor:pointer;transition:all .3s ease}.hu-megamenu-cell-options li>a{color:rgb(var(--dark));text-decoration:none;display:block;padding:5px 10px}.hu-megamenu-cell-options li:hover{background:#dfe8fb}.hu-megamenu-popover{position:absolute;top:0;left:0;width:702px;height:509px;background:#f0f4fa;box-shadow:0 24px 48px rgba(0,0,0,.14),0 9px 66px rgba(0,0,0,.12),0 11px 25px rgba(0,0,0,.2);border-radius:6px;z-index:999;display:none;right:0;margin:auto;bottom:0}.hu-megamenu-popover.show{display:block}.hu-megamenu-popover-body{min-height:200px}.hu-megamenu-popover-footer{position:absolute;bottom:0;left:0;right:0;min-height:50px;display:flex;align-items:center;justify-content:flex-end;padding:0 20px}.hu-megamenu-popover-heading{padding:0 15px;background:#126aef;border-radius:6px 6px 0 0;min-height:36px;display:flex;align-items:center;justify-content:space-between}.hu-megamenu-popover-heading .title{margin:0;font-weight:500;font-size:16px;color:#fff}.hu-megamenu-popover-heading .hu-megamenu-popover-close{outline:0;color:#fff;padding:0}.hu-megamenu-popover-heading .hu-megamenu-popover-close:hover{color:rgba(255,255,255,.8)}.hu-mega-menu-builder .control-group.hu-style-switcher label{font-size:12px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.hu-mega-menu-builder .control-group:not(.control-group-checkbox) .control-label{margin-bottom:0}.hu-mega-menu-builder .control-group.hu-style-switcher>div{width:100%}.hu-mega-menu-builder .minicolors-theme-bootstrap.minicolors-position-bottom .minicolors-panel{left:0!important;top:-175px!important}.hu-mega-menu-builder .hu-megamenu-cell-remove{font-size:12px;padding:0;color:#676d98;outline:0}.hu-mega-menu-builder .chosen-container.chosen-with-drop .chosen-drop,.hu-mega-menu-builder .chzn-container.chzn-with-drop .chzn-drop{left:auto}.hu-mega-menu-builder .chosen-container.chosen-container-single .chosen-drop,.hu-mega-menu-builder .chzn-container.chzn-container-single .chzn-drop{width:190px;right:0;top:40px;border-top:1px solid rgba(0,0,0,.15)}.hu-mega-menu-builder .chosen-container.chosen-container-single .chosen-single,.hu-mega-menu-builder .chzn-container.chzn-container-single .chzn-single{background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:16px 10px;background-position:right 3px center}.hu-mega-menu-builder .chosen-container.chosen-container-single .chosen-single div,.hu-mega-menu-builder .chzn-container.chzn-container-single .chzn-single div{display:none}.hu-mega-menu-builder .chosen-container.chosen-container-single.chosen-container-active.chosen-with-drop .chosen-single,.hu-mega-menu-builder .chzn-container.chzn-container-single.chzn-container-active.chzn-with-drop .chzn-single{border-radius:.25rem}.hu-megamenu-search-wrapper{position:relative;padding:0 15px;margin-top:15px;margin-bottom:15px}.hu-megamenu-search-wrapper span{position:absolute;font-size:12px;color:rgb(var(--primary));top:10px;left:26px}.hu-megamenu-search-wrapper input{padding:6px 12px 6px 30px;border:0;background:#fff;box-shadow:0 1px 1px rgba(20,50,80,.1);border-radius:5px}.hu-megamenu-modules-container{height:380px;overflow-y:auto;padding:0 15px}.hu-megamenu-modules-container .hu-megamenu-column{margin-bottom:20px}.hu-megamenu-module-item{background:#fff;width:100%;height:100%;box-shadow:0 1px 1px rgb(2 11 83 / 30%);margin-bottom:12px;border-radius:5px;padding:10px 15px;border:1px solid #fff;display:flex;flex-direction:column}.hu-megamenu-module-item .hu-megamenu-module-title{font-weight:500;font-size:14px;line-height:18px;color:#021153;margin-bottom:8px;display:block;width:140px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.hu-megamenu-module-item .hu-megamenu-module-desc{font-size:13px;line-height:20px;color:rgba(2,11,83,.7);margin-bottom:0}.hu-megamenu-module-item .hu-btn{border:1px solid rgba(121,127,167,.3);border-radius:4px;padding:2px 0;background:#fff;color:rgba(2,11,83,.7);font-size:12px;line-height:18px;font-weight:400;width:100%;margin-top:auto}.hu-megamenu-module-item .hu-btn:focus,.hu-megamenu-module-item .hu-btn:hover{border-color:rgb(var(--primary));color:rgb(var(--primary))}.hu-megamenu-branch-muted .hu-menu-tree-contents .hu-branch-drag-handler{display:flex;align-items:center;color:#838cae;background:#d9deeb;border-color:#d9deeb}.hu-megamenu-branch-muted .hu-branch-unpublished{margin-left:10px}.hu-megamenu-module-not-found{display:flex;align-items:center;justify-content:center;height:100%}PKBA#]z��""0system/helixultimate/assets/css/admin/helper.cssnu�[���.ui-tooltip{background:#000!important;height:auto!important;max-width:200px!important;padding:5px!important;border-radius:3px!important}.ui-tooltip .ui-tooltip-content{font-size:11px;font-weight:100;color:#fff}.hu-fade-border{height:1px;width:100%;background:linear-gradient(90deg,#eff4fb 0,#7983a7 55.01%,#eff4fb 101.56%);opacity:.4}.hu-m-0{margin:0!important}.hu-m-1{margin:.25rem!important}.hu-m-2{margin:.5rem!important}.hu-m-3{margin:1rem!important}.hu-m-4{margin:1.5rem!important}.hu-m-5{margin:3rem!important}.hu-m-auto{margin:auto!important}.hu-mx-0{margin-right:0!important;margin-left:0!important}.hu-mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.hu-mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.hu-mx-3{margin-right:1rem!important;margin-left:1rem!important}.hu-mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.hu-mx-5{margin-right:3rem!important;margin-left:3rem!important}.hu-mx-auto{margin-right:auto!important;margin-left:auto!important}.hu-my-0{margin-top:0!important;margin-bottom:0!important}.hu-my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.hu-my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.hu-my-3{margin-top:1rem!important;margin-bottom:1rem!important}.hu-my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.hu-my-5{margin-top:3rem!important;margin-bottom:3rem!important}.hu-my-auto{margin-top:auto!important;margin-bottom:auto!important}.hu-mt-0{margin-top:0!important}.hu-mt-1{margin-top:.25rem!important}.hu-mt-2{margin-top:.5rem!important}.hu-mt-3{margin-top:1rem!important}.hu-mt-4{margin-top:1.5rem!important}.hu-mt-5{margin-top:3rem!important}.hu-mt-auto{margin-top:auto!important}.hu-mr-0{margin-right:0!important}.hu-mr-1{margin-right:.25rem!important}.hu-mr-2{margin-right:.5rem!important}.hu-mr-3{margin-right:1rem!important}.hu-mr-4{margin-right:1.5rem!important}.hu-mr-5{margin-right:3rem!important}.hu-mr-auto{margin-right:auto!important}.hu-mb-0{margin-bottom:0!important}.hu-mb-1{margin-bottom:.25rem!important}.hu-mb-2{margin-bottom:.5rem!important}.hu-mb-3{margin-bottom:1rem!important}.hu-mb-4{margin-bottom:1.5rem!important}.hu-mb-5{margin-bottom:3rem!important}.hu-mb-auto{margin-bottom:auto!important}.hu-ml-0{margin-left:0!important}.hu-ml-1{margin-left:.25rem!important}.hu-ml-2{margin-left:.5rem!important}.hu-ml-3{margin-left:1rem!important}.hu-ml-4{margin-left:1.5rem!important}.hu-ml-5{margin-left:3rem!important}.hu-ml-auto{margin-left:auto!important}.hu-input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.hu-input-group>.form-control,.hu-input-group>.form-file,.hu-input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.hu-input-group>.form-control:focus,.hu-input-group>.form-file .form-file-input:focus~.form-file-label,.hu-input-group>.form-select:focus{z-index:3}.hu-input-group>.form-file>.form-file-input:focus{z-index:4}.hu-input-group>.form-file:not(:last-child)>.form-file-label{border-top-right-radius:0;border-bottom-right-radius:0}.hu-input-group>.form-file:not(:first-child)>.form-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.hu-input-group .btn{position:relative;z-index:2}.hu-input-group .btn:focus{z-index:3}.hu-input-group-text{display:flex;align-items:center;padding:6px;font-size:12px;font-weight:400;line-height:1.5;background-color:#fff;color:rgba(var(--dark));text-align:center;white-space:nowrap;border:1px solid rgba(121,127,167,.3);box-shadow:0 1px 1px rgba(20,50,80,.1);border-radius:5px}.hu-input-group>.dropdown-toggle:nth-last-child(n+3),.hu-input-group>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.hu-input-group>:not(:first-child):not(.dropdown-menu){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.hu-narrow-input .form-control,.hu-subgroup .hu-input-group>.form-control{padding-left:8px;padding-right:8px}.hu-sr-only{visibility:hidden}.hu-d-none{display:none}.hu-d-flex{display:flex!important}.hu-d-inline-flex{display:inline-flex!important}.hu-align-items-start{align-items:flex-start!important}.hu-align-items-end{align-items:flex-end!important}.hu-align-items-center{align-items:center!important}.hu-justify-content-start{justify-content:flex-start!important}.hu-justify-content-end{justify-content:flex-end!important}.hu-justify-content-center{justify-content:center!important}.hu-justify-content-between{justify-content:space-between!important}.hu-justify-content-around{justify-content:space-around!important}.hu-justify-content-evenly{justify-content:space-evenly!important}PKBA#]�9ct�:�:3system/helixultimate/assets/css/frontend-editor.cssnu�[���#attrib-helix_ultimate_blog_options #jform_attribs_helix_ultimate_article_format{position:relative;display:inline-block;vertical-align:middle;white-space:nowrap}#attrib-helix_ultimate_blog_options #jform_attribs_helix_ultimate_article_format .form-check-inline{margin:0;margin-right:-5px;padding-left:0}#attrib-helix_ultimate_blog_options #jform_attribs_helix_ultimate_article_format .form-check-inline label{display:inline-block;padding:4px 12px;margin-bottom:0;font-size:13px;line-height:18px;text-align:center;vertical-align:middle;cursor:pointer;background-color:#f3f3f3;color:#333;border-top:1px solid #b3b3b3;border-right:1px solid #b3b3b3;border-bottom:1px solid #b3b3b3;box-shadow:0 1px 2px rgba(0,0,0,.05);border-radius:0}#attrib-helix_ultimate_blog_options #jform_attribs_helix_ultimate_article_format .form-check-inline label.btn-success{background:#46a546;color:#fff}#attrib-helix_ultimate_blog_options #jform_attribs_helix_ultimate_article_format .form-check-inline label input[type=radio]{display:none!important}#attrib-helix_ultimate_blog_options #jform_attribs_helix_ultimate_article_format .form-check-inline:last-child label{border-top-right-radius:3px;border-bottom-right-radius:3px}#attrib-helix_ultimate_blog_options #jform_attribs_helix_ultimate_article_format .form-check-inline:first-child label{border-left:1px solid #b3b3b3;border-top-left-radius:3px;border-bottom-left-radius:3px}.com-contenthistory .btn-group{display:flex;justify-content:flex-end}.com-contenthistory .btn-group button{display:inline-block;padding:4px 12px;margin-bottom:0;font-size:13px;line-height:18px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);background-color:#f5f5f5;background-repeat:repeat-x;border:1px solid #bbb;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.com-contenthistory .btn-group button:hover{color:#333;background-color:#e9e9e9}#versionsModal{top:10%}#versionsModal .modal-dialog{max-width:80%}#versionsModal iframe{min-height:300px}body.com-content.view-form.layout-edit .nav-tabs .nav-link{display:block!important}.no-js img.lazyload{display:none}#system-message-container{position:fixed;bottom:0;right:15px;max-width:350px}#system-message-container .alert{font-size:13px;line-height:1.5}#system-message-container .alert>.btn-close{position:absolute;right:5px;top:5px;cursor:pointer}#system-message-container joomla-alert{font-size:13px}.com-users.view-profile #member-profile .modal-dialog,.com-users.view-profile #member-registration .modal-dialog,.com-users.view-registration #member-profile .modal-dialog,.com-users.view-registration #member-registration .modal-dialog{display:flex;align-items:center;min-height:calc(100% - 1rem)}body.com-users.view-registration>#sbox-window{overflow:hidden}body.com-users.view-registration>#sbox-window>#sbox-btn-close{top:5px;right:5px}body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset>.joomla-tabs{display:flex;padding:0;margin:0!important;overflow-x:auto;overflow-y:hidden;white-space:nowrap;list-style:outside none none;background-color:#f5f5f5;border-color:#ccc;border-style:solid solid none;border-width:1px 1px 0;border-radius:.25rem .25rem 0 0;border-image:none;box-shadow:0 1px #fff inset,0 2px 3px -3px #000}body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset>.joomla-tabs .nav-item>.nav-link{color:var(--text-color)}body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset>.joomla-tabs .nav-item>.nav-link.active{background-color:rgba(0,0,0,.03);background-image:linear-gradient(to bottom,transparent,rgba(0,0,0,.05) 100%);border-right:0 none;border-left:0 none;border-top-left-radius:0;border-top-right-radius:0}body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset>.tab-content{padding:15px;background-color:#fefefe;border:1px solid #ccc;border-radius:0 0 .25rem .25rem}body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset #editor label#jform_title-lbl{margin-bottom:15px;font-weight:700}body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset #editor .js-editor-tinymce{display:flex;flex-direction:column}body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset #attrib-helix_ultimate_blog_options>.control-group,body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset #metadata>.control-group,body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset #publishing>.control-group{display:flex;flex-direction:column}body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset #attrib-helix_ultimate_blog_options>.control-group>label,body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset #metadata>.control-group>label,body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset #publishing>.control-group>label{margin-bottom:5px;font-weight:700}body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset #attrib-helix_ultimate_blog_options>.control-group textarea,body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset #metadata>.control-group textarea,body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset #publishing>.control-group textarea{width:100%}body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset #attrib-helix_ultimate_blog_options>.control-group .calendar-container .time td select,body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset #metadata>.control-group .calendar-container .time td select,body.helix-ultimate.hu.view-form.layout-edit .edit.item-page>#adminForm>fieldset #publishing>.control-group .calendar-container .time td select{padding:4px;font-size:13px}body.contentpane.com-media.view-images .container-popup #imageForm>#messages+.well .row-fluid{display:flex;max-width:100%}body.contentpane.com-media.view-images .container-popup #imageForm>#messages+.well .row-fluid .span8{flex:auto}body.contentpane.com-media.view-images .container-popup #imageForm>#messages+.well .row-fluid .span8>.controls{margin-left:10px;display:flex;max-width:500px}body.contentpane.com-media.view-images .container-popup #imageForm>#messages+.well .row-fluid .span8>.controls #folderlist,body.contentpane.com-media.view-images .container-popup #imageForm>#messages+.well .row-fluid .span8>.controls #folderlist_chzn{flex:auto}body.contentpane.com-media.view-images .container-popup #imageForm>#messages+.well .row-fluid .span8 #upbutton{background:var(--bs-primary);color:#fff;margin:0 5px}body.contentpane.com-media.view-images .container-popup #imageForm .well>.row-fluid:not(:last-child){margin-bottom:5px}body.contentpane.com-media.view-images .container-popup #imageForm .well>.row-fluid:not(:last-child)>.control-group:not(:last-child){margin-bottom:5px}body.contentpane.com-media.view-images .container-popup #imageForm .btn.button-cancel{background:var(--bs-danger);color:#fff}body.contentpane.com-media.view-images .container-popup #imageForm .btn.button-cancel:focus,body.contentpane.com-media.view-images .container-popup #imageForm .btn.button-cancel:hover{border-color:var(--bs-danger)}body.contentpane.com-menus.view-items.layout-modal #adminForm .js-stools-container-bar{display:flex}body.contentpane.com-modules.view-modules.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar{display:flex;align-items:center;padding:10px 0}body.contentpane.com-modules.view-modules.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>label{margin-right:10px}body.contentpane.com-modules.view-modules.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>.btn-wrapper.input-append{display:flex}body.contentpane.com-modules.view-modules.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>.btn-wrapper.input-append>button[type=submit]{background:var(--bs-primary);color:#fff;margin-left:5px}body.contentpane.com-modules.view-modules.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>.btn-wrapper>button[type=button]{background:var(--bs-primary);color:#fff}body.contentpane.com-contact.view-contacts.layout-modal .container-popup #adminForm>.js-stools,body.contentpane.com-content.view-articles.layout-modal .container-popup #adminForm>.js-stools,body.contentpane.com-menus.view-items.layout-modal .container-popup #adminForm>.js-stools{padding-top:15px}body.contentpane.com-contact.view-contacts.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar,body.contentpane.com-content.view-articles.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar,body.contentpane.com-menus.view-items.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar{margin-bottom:10px}body.contentpane.com-contact.view-contacts.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>label,body.contentpane.com-content.view-articles.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>label,body.contentpane.com-menus.view-items.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>label{margin-right:10px}body.contentpane.com-contact.view-contacts.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>.btn-wrapper.input-append,body.contentpane.com-content.view-articles.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>.btn-wrapper.input-append,body.contentpane.com-menus.view-items.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>.btn-wrapper.input-append{display:flex}body.contentpane.com-contact.view-contacts.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>.btn-wrapper.input-append>button[type=submit],body.contentpane.com-content.view-articles.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>.btn-wrapper.input-append>button[type=submit],body.contentpane.com-menus.view-items.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>.btn-wrapper.input-append>button[type=submit]{background:var(--bs-primary);color:#fff;margin-left:5px}body.contentpane.com-contact.view-contacts.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>.btn-wrapper>button[type=button],body.contentpane.com-content.view-articles.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>.btn-wrapper>button[type=button],body.contentpane.com-menus.view-items.layout-modal .container-popup #adminForm>.js-stools .js-stools-container-bar>.btn-wrapper>button[type=button]{background:var(--bs-primary);color:#fff}body.contentpane.com-contact.view-contacts.layout-modal .container-popup #adminForm .js-stools-container-bar,body.contentpane.com-content.view-articles.layout-modal .container-popup #adminForm .js-stools-container-bar{display:flex;align-items:center}body.helix-ultimate.hu.view-form.layout-edit .edit.item-page.joomla4 iframe{width:100%}body.helix-ultimate.hu.view-form.layout-edit .edit.item-page.joomla4 .jviewport-height70{height:70vh}body.helix-ultimate.hu.view-form.layout-edit .edit.item-page.joomla4 [class*=jviewport-height] iframe{height:100%}body.contentpane.joomla4.layout-modal div[role=tooltip]{display:none}body.contentpane.joomla4.layout-modal .js-stools-container-bar>.btn-toolbar{align-items:center;justify-content:space-between;width:100%}body.contentpane.joomla4.layout-modal .js-stools-container-bar>.btn-toolbar>.ordering-select{display:flex}body.contentpane.joomla4.layout-modal .custom-select,body.contentpane.joomla4.layout-modal .form-select{display:block;width:100%;padding:.6rem 4rem .6rem 1rem;font-size:13px;font-weight:400;line-height:1.25;color:#22262a;vertical-align:middle;background-image:url(../images/select-bg.svg);background-repeat:no-repeat;background-position:right 1rem center;background-size:116rem;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}body.contentpane.joomla4.layout-modal .custom-select:focus,body.contentpane.joomla4.layout-modal .form-select:focus{border-color:#8894aa;outline:0;box-shadow:0 0 0 .25rem rgba(0,0,0)}body.contentpane.joomla4.layout-modal .form-select[multiple],body.contentpane.joomla4.layout-modal .form-select[size]:not([size='1']),body.contentpane.joomla4.layout-modal [multiple].custom-select,body.contentpane.joomla4.layout-modal [size].custom-select:not([size='1']){padding-right:1rem;background-image:none}body.contentpane.joomla4.layout-modal .custom-select:disabled,body.contentpane.joomla4.layout-modal .form-select:disabled{color:#6d757e;background-color:#eaedf0}body.contentpane.joomla4.layout-modal .custom-select:-moz-focusring,body.contentpane.joomla4.layout-modal .form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #22262a}body.contentpane.joomla4.layout-modal .js-stools-container-bar{padding:10px 20px}body.contentpane.joomla4.layout-modal .js-stools-container-bar .btn-toolbar{justify-content:flex-end}body.contentpane.joomla4.layout-modal .js-stools-container-bar .btn-toolbar>*{margin:4px 0;-webkit-margin-end:8px;margin-inline-end:8px}body.contentpane.joomla4.layout-modal .js-stools-container-bar .btn-toolbar .js-stools-btn-clear{background-color:#30638d;border:0}body.contentpane.joomla4.layout-modal .js-stools-container-bar .ordering-select{display:flex}body.contentpane.joomla4.layout-modal .js-stools-container-filters{display:none;padding:0 20px;margin-bottom:20px}body.contentpane.joomla4.layout-modal .js-stools-container-filters-visible{display:grid;grid-gap:8px;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));padding:10px;background-color:#fff}body.contentpane.joomla4.layout-modal .js-stools-container-filters>*{margin:4px 0;-webkit-margin-end:8px;margin-inline-end:8px}body.contentpane.joomla4.layout-modal .js-stools-field-list+.js-stools-field-list{-webkit-margin-start:8px;margin-inline-start:8px}.field-calendar>.js-calendar.hidden{display:none}.hu-content-edit .choices__button_joomla{position:relative;text-indent:-9999px;overflow:hidden;background-color:transparent;outline:0;border:none}.hu-content-edit .choices__button_joomla::before{position:absolute;top:0;right:0;bottom:0;display:block;text-align:center;text-indent:0;content:'×'}.subhead{position:sticky;top:0;right:0;left:0;z-index:1000;width:auto;min-height:43px;padding:10px 0;color:#495057;background:#fff;box-shadow:-3px -2px 22px #ddd}.subhead.noshadow{box-shadow:none}.subhead .btn{padding:0 1rem;margin:5px 0;font-size:1rem;line-height:2.45rem;color:#495057;background:#fff;border-color:#adb5bd}.subhead .btn-group,.subhead joomla-toolbar-button{-webkit-margin-start:.75rem;margin-inline-start:.75rem}.subhead .btn-group:first-child,.subhead joomla-toolbar-button:first-child{-webkit-margin-start:0;margin-inline-start:0}PKBA#]�)]V(V(+system/helixultimate/assets/css/icomoon.cssnu�[���@font-face{font-family:IcoMoon;src:url(../../../../../media/jui/fonts/IcoMoon.eot);src:url(../../../../../media/jui/fonts/IcoMoon.eot?#iefix) format('embedded-opentype'),url(../../../../../media/jui/fonts/IcoMoon.woff) format('woff'),url(../../../../../media/jui/fonts/IcoMoon.ttf) format('truetype'),url(../../../../../media/jui/fonts/IcoMoon.svg#IcoMoon) format('svg');font-weight:400;font-style:normal}[data-icon]:before{font-family:IcoMoon;content:attr(data-icon);speak:none}[class*=" icon-"],[class^=icon-]{display:inline-block;width:14px;height:14px;margin-right:.25em;line-height:14px}[class*=" icon-"]:before,[class^=icon-]:before{font-family:IcoMoon;font-style:normal;speak:none}[class*=" icon-"].disabled,[class^=icon-].disabled{font-weight:400}.icon-joomla:before{content:"\e200"}.icon-arrow-up:before,.icon-chevron-up:before,.icon-uparrow:before{content:"\e005"}.icon-arrow-right:before,.icon-chevron-right:before,.icon-rightarrow:before{content:"\e006"}.icon-arrow-down:before,.icon-chevron-down:before,.icon-downarrow:before{content:"\e007"}.icon-arrow-left:before,.icon-chevron-left:before,.icon-leftarrow:before{content:"\e008"}.icon-arrow-first:before{content:"\e003"}.icon-arrow-last:before{content:"\e004"}.icon-arrow-up-2:before{content:"\e009"}.icon-arrow-right-2:before{content:"\e00a"}.icon-arrow-down-2:before{content:"\e00b"}.icon-arrow-left-2:before{content:"\e00c"}.icon-arrow-up-3:before{content:"\e00f"}.icon-arrow-right-3:before{content:"\e010"}.icon-arrow-down-3:before{content:"\e011"}.icon-arrow-left-3:before{content:"\e012"}.icon-menu-2:before{content:"\e00e"}.icon-arrow-up-4:before{content:"\e201"}.icon-arrow-right-4:before{content:"\e202"}.icon-arrow-down-4:before{content:"\e203"}.icon-arrow-left-4:before{content:"\e204"}.icon-redo:before,.icon-share:before{content:"\27"}.icon-undo:before{content:"\28"}.icon-forward-2:before{content:"\e205"}.icon-backward-2:before,.icon-reply:before{content:"\e206"}.icon-redo-2:before,.icon-refresh:before,.icon-unblock:before{content:"\6c"}.icon-undo-2:before{content:"\e207"}.icon-move:before{content:"\7a"}.icon-expand:before{content:"\66"}.icon-contract:before{content:"\67"}.icon-expand-2:before{content:"\68"}.icon-contract-2:before{content:"\69"}.icon-play:before{content:"\e208"}.icon-pause:before{content:"\e209"}.icon-stop:before{content:"\e210"}.icon-backward:before,.icon-previous:before{content:"\7c"}.icon-forward:before,.icon-next:before{content:"\7b"}.icon-first:before{content:"\7d"}.icon-last:before{content:"\e000"}.icon-play-circle:before{content:"\e00d"}.icon-pause-circle:before{content:"\e211"}.icon-stop-circle:before{content:"\e212"}.icon-backward-circle:before{content:"\e213"}.icon-forward-circle:before{content:"\e214"}.icon-loop:before{content:"\e001"}.icon-shuffle:before{content:"\e002"}.icon-search:before{content:"\53"}.icon-zoom-in:before{content:"\64"}.icon-zoom-out:before{content:"\65"}.icon-apply:before,.icon-edit:before,.icon-pencil:before{content:"\2b"}.icon-pencil-2:before{content:"\2c"}.icon-brush:before{content:"\3b"}.icon-plus-2:before,.icon-save-new:before{content:"\5d"}.icon-minus-2:before,.icon-minus-sign:before{content:"\5e"}.icon-cancel-2:before,.icon-delete:before,.icon-remove:before{content:"\49"}.icon-checkmark:before,.icon-ok:before,.icon-publish:before,.icon-save:before{content:"\47"}.icon-new:before,.icon-plus:before{content:"\2a"}.icon-plus-circle:before{content:"\e215"}.icon-minus:before,.icon-not-ok:before{content:"\4b"}.icon-ban-circle:before,.icon-minus-circle:before{content:"\e216"}.icon-cancel:before,.icon-unpublish:before{content:"\4a"}.icon-cancel-circle:before{content:"\e217"}.icon-checkmark-2:before{content:"\e218"}.icon-checkmark-circle:before{content:"\e219"}.icon-info:before{content:"\e220"}.icon-info-2:before,.icon-info-circle:before{content:"\e221"}.icon-help:before,.icon-question-sign:before,.icon-question:before{content:"\45"}.icon-question-2:before,.icon-question-circle:before{content:"\e222"}.icon-notification:before{content:"\e223"}.icon-notification-2:before,.icon-notification-circle:before{content:"\e224"}.icon-pending:before,.icon-warning:before{content:"\48"}.icon-warning-2:before,.icon-warning-circle:before{content:"\e225"}.icon-checkbox-unchecked:before{content:"\3d"}.icon-checkbox-checked:before,.icon-checkbox:before,.icon-checkin:before{content:"\3e"}.icon-checkbox-partial:before{content:"\3f"}.icon-square:before{content:"\e226"}.icon-radio-unchecked:before{content:"\e227"}.icon-generic:before,.icon-radio-checked:before{content:"\e228"}.icon-circle:before{content:"\e229"}.icon-signup:before{content:"\e230"}.icon-grid-view:before,.icon-grid:before{content:"\58"}.icon-grid-2:before,.icon-grid-view-2:before{content:"\59"}.icon-menu:before{content:"\5a"}.icon-list-view:before,.icon-list:before{content:"\31"}.icon-list-2:before{content:"\e231"}.icon-menu-3:before{content:"\e232"}.icon-folder-open:before,.icon-folder:before{content:"\2d"}.icon-folder-2:before,.icon-folder-close:before{content:"\2e"}.icon-folder-plus:before{content:"\e234"}.icon-folder-minus:before{content:"\e235"}.icon-folder-3:before{content:"\e236"}.icon-folder-plus-2:before{content:"\e237"}.icon-folder-remove:before{content:"\e238"}.icon-file:before{content:"\e016"}.icon-file-2:before{content:"\e239"}.icon-file-add:before,.icon-file-plus:before{content:"\29"}.icon-file-minus:before{content:"\e017"}.icon-file-check:before{content:"\e240"}.icon-file-remove:before{content:"\e241"}.icon-copy:before,.icon-save-copy:before{content:"\e018"}.icon-stack:before{content:"\e242"}.icon-tree:before{content:"\e243"}.icon-tree-2:before{content:"\e244"}.icon-paragraph-left:before{content:"\e246"}.icon-paragraph-center:before{content:"\e247"}.icon-paragraph-right:before{content:"\e248"}.icon-paragraph-justify:before{content:"\e249"}.icon-screen:before{content:"\e01c"}.icon-tablet:before{content:"\e01d"}.icon-mobile:before{content:"\e01e"}.icon-box-add:before{content:"\51"}.icon-box-remove:before{content:"\52"}.icon-download:before{content:"\e021"}.icon-upload:before{content:"\e022"}.icon-home:before{content:"\21"}.icon-home-2:before{content:"\e250"}.icon-new-tab:before,.icon-out-2:before{content:"\e024"}.icon-new-tab-2:before,.icon-out-3:before{content:"\e251"}.icon-link:before{content:"\e252"}.icon-image:before,.icon-picture:before{content:"\2f"}.icon-images:before,.icon-pictures:before{content:"\30"}.icon-color-palette:before,.icon-palette:before{content:"\e014"}.icon-camera:before{content:"\55"}.icon-camera-2:before,.icon-video:before{content:"\e015"}.icon-play-2:before,.icon-video-2:before,.icon-youtube:before{content:"\56"}.icon-music:before{content:"\57"}.icon-user:before{content:"\22"}.icon-users:before{content:"\e01f"}.icon-vcard:before{content:"\6d"}.icon-address:before{content:"\70"}.icon-out:before,.icon-share-alt:before{content:"\26"}.icon-enter:before{content:"\e257"}.icon-exit:before{content:"\e258"}.icon-comment:before,.icon-comments:before{content:"\24"}.icon-comments-2:before{content:"\25"}.icon-quote:before,.icon-quotes-left:before{content:"\60"}.icon-quote-2:before,.icon-quotes-right:before{content:"\61"}.icon-bubble-quote:before,.icon-quote-3:before{content:"\e259"}.icon-phone:before{content:"\e260"}.icon-phone-2:before{content:"\e261"}.icon-envelope:before,.icon-mail:before{content:"\4d"}.icon-envelope-opened:before,.icon-mail-2:before{content:"\4e"}.icon-drawer:before,.icon-unarchive:before{content:"\4f"}.icon-archive:before,.icon-drawer-2:before{content:"\50"}.icon-briefcase:before{content:"\e020"}.icon-tag:before{content:"\e262"}.icon-tag-2:before{content:"\e263"}.icon-tags:before{content:"\e264"}.icon-tags-2:before{content:"\e265"}.icon-cog:before,.icon-options:before{content:"\38"}.icon-cogs:before{content:"\37"}.icon-screwdriver:before,.icon-tools:before{content:"\36"}.icon-wrench:before{content:"\3a"}.icon-equalizer:before{content:"\39"}.icon-dashboard:before{content:"\78"}.icon-switch:before{content:"\e266"}.icon-filter:before{content:"\54"}.icon-purge:before,.icon-trash:before{content:"\4c"}.icon-checkedout:before,.icon-lock:before,.icon-locked:before{content:"\23"}.icon-unlock:before{content:"\e267"}.icon-key:before{content:"\5f"}.icon-support:before{content:"\46"}.icon-database:before{content:"\62"}.icon-scissors:before{content:"\e268"}.icon-health:before{content:"\6a"}.icon-wand:before{content:"\6b"}.icon-eye-open:before,.icon-eye:before{content:"\3c"}.icon-eye-2:before,.icon-eye-blocked:before,.icon-eye-close:before{content:"\e269"}.icon-clock:before{content:"\6e"}.icon-compass:before{content:"\6f"}.icon-broadcast:before,.icon-connection:before,.icon-wifi:before{content:"\e01b"}.icon-book:before{content:"\e271"}.icon-flash:before,.icon-lightning:before{content:"\79"}.icon-print:before,.icon-printer:before{content:"\e013"}.icon-feed:before{content:"\71"}.icon-calendar:before{content:"\43"}.icon-calendar-2:before{content:"\44"}.icon-calendar-3:before{content:"\e273"}.icon-pie:before{content:"\77"}.icon-bars:before{content:"\76"}.icon-chart:before{content:"\75"}.icon-power-cord:before{content:"\32"}.icon-cube:before{content:"\33"}.icon-puzzle:before{content:"\34"}.icon-attachment:before,.icon-flag-2:before,.icon-paperclip:before{content:"\72"}.icon-lamp:before{content:"\74"}.icon-pin:before,.icon-pushpin:before{content:"\73"}.icon-location:before{content:"\63"}.icon-shield:before{content:"\e274"}.icon-flag:before{content:"\35"}.icon-flag-3:before{content:"\e275"}.icon-bookmark:before{content:"\e023"}.icon-bookmark-2:before{content:"\e276"}.icon-heart:before{content:"\e277"}.icon-heart-2:before{content:"\e278"}.icon-thumbs-up:before{content:"\5b"}.icon-thumbs-down:before{content:"\5c"}.icon-asterisk:before,.icon-star-empty:before,.icon-unfeatured:before{content:"\40"}.icon-star-2:before{content:"\41"}.icon-default:before,.icon-featured:before,.icon-star:before{content:"\42"}.icon-smiley-happy:before,.icon-smiley:before{content:"\e279"}.icon-smiley-2:before,.icon-smiley-happy-2:before{content:"\e280"}.icon-smiley-sad:before{content:"\e281"}.icon-smiley-sad-2:before{content:"\e282"}.icon-smiley-neutral:before{content:"\e283"}.icon-smiley-neutral-2:before{content:"\e284"}.icon-cart:before{content:"\e019"}.icon-basket:before{content:"\e01a"}.icon-credit:before{content:"\e286"}.icon-credit-2:before{content:"\e287"}.icon-expired:before{content:"\4b"}PKBA#]�d^��1system/helixultimate/assets/css/system-j3.min.cssnu�[���.com-media .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgb(0 0 0 / 5%);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgb(0 0 0 / 5%)}.com-media .row-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.com-media .row-fluid [class*=span]{position:relative;width:100%;padding-right:15px;padding-left:15px}.com-media .span12{flex-basis:100%}.com-media .span11{flex-basis:91.48936170212765%}.com-media .span10{flex-basis:82.97872340425532%}.com-media .span9{flex-basis:74.46808510638297%}.com-media .span8{flex-basis:65.95744680851064%}.com-media .span7{flex-basis:57.44680851063829%}.com-media .span6{flex-basis:48.93617021276595%}.com-media .span5{flex-basis:40.42553191489362%}.com-media .span4{flex-basis:31.914893617021278%}.com-media .span3{flex-basis:23.404255319148934%}.com-media .span2{flex-basis:14.893617021276595%}.com-media .span1{flex-basis:6.382978723404255%}.com-media .thumbnails{list-style:none;padding:0;margin:-7.5px;display:flex;flex-wrap:wrap}.com-media .thumbnails-media .thumbnail{background-color:#f4f4f4;border-radius:3px;border:0;padding:0;height:100px;width:100px;margin:7.5px;position:relative;text-align:center;overflow:hidden;margin-bottom:18px;box-shadow:0 0 0 1px rgb(0 0 0 / 5%) inset}.com-media .height-50{height:50px}.com-media .thumbnails-media .thumbnail .imgFolder span{line-height:90px;font-size:38px;margin:0;width:auto}.com-media .thumbnails-media .thumbnail .icon-folder,.com-media .thumbnails-media .thumbnail .icon-folder-2{width:30px;height:20px;display:inline-block;margin:auto;position:relative;background-color:#708090;border-radius:0 3px 3px 3px;margin-bottom:-8px;margin-top:12px}.com-media .thumbnails-media .thumbnail .icon-folder-2:before,.com-media .thumbnails-media .thumbnail .icon-folder:before{content:'';width:50%;height:.2em;border-radius:0 20px 0 0;background-color:#708090;position:absolute;top:-.2em;left:0}.com-media .thumbnails-media .thumbnail .small{margin-top:15px}PKBA#]���`�`�`1system/helixultimate/assets/css/bootstrap.min.cssnu�[���@charset "UTF-8";/*! * Bootstrap v5.0.2 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0))}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + (.5rem + 2px));padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + (1rem + 2px));padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + (.75rem + 2px))}textarea.form-control-sm{min-height:calc(1.5em + (.5rem + 2px))}textarea.form-control-lg{min-height:calc(1.5em + (1rem + 2px))}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1050;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{color:#0d6efd!important}.text-secondary{color:#6c757d!important}.text-success{color:#198754!important}.text-info{color:#0dcaf0!important}.text-warning{color:#ffc107!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark{color:#212529!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-reset{color:inherit!important}.bg-primary{background-color:#0d6efd!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:#198754!important}.bg-info{background-color:#0dcaf0!important}.bg-warning{background-color:#ffc107!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#f8f9fa!important}.bg-dark{background-color:#212529!important}.bg-body{background-color:#fff!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}PKBA#]��4�RR1system/helixultimate/assets/css/system-j4.min.cssnu�[���:root{--hue:214;--template-bg-light:#f0f4fb;--template-text-dark:#495057;--template-text-light:#fff;--template-link-color:#2a69b8;--template-special-color:#001b4c}.hidden{display:none!important}body.com-media{padding:15px}.media-breadcrumb-item::after{border-inline-start-color:#fff}.js-stools-container-bar{padding:10px 20px}.js-stools-container-bar .btn-toolbar{justify-content:flex-end}.js-stools-container-bar .btn-toolbar>*{margin:4px 0;margin-inline-end:8px}.js-stools-container-bar .btn-toolbar .js-stools-btn-clear{background-color:#1e95cc;border:0}.js-stools-container-bar .ordering-select{display:flex}.js-stools-container-filters{display:none;padding:0 20px;margin-bottom:20px}.js-stools-container-filters-visible{display:grid;grid-gap:8px;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));padding:10px;background-color:#fff}.js-stools-container-filters>*{margin:4px 0;margin-inline-end:8px}.js-stools-field-list+.js-stools-field-list{margin-inline-start:8px}[role=tooltip]:not(.show){right:5em;z-index:9999;display:none;max-width:100%;padding:.5em;margin:.5em;color:#000;text-align:start;background:#fff;border:1px solid #e5e5e5;border-radius:4px;box-shadow:0 0 .5rem rgba(0,0,0,.8)}[role=tooltip]:not(.show)[id^=editarticle-]{right:auto;margin-inline-start:-10em}[role=tooltip]:not(.show)[id^=editcontact-]{right:auto;margin-inline-start:-10em}:focus+[role=tooltip],:hover+[role=tooltip]{position:absolute;display:block}.subhead{position:sticky;top:0;right:0;left:0;z-index:1000;width:auto;min-height:43px;padding:8px 1rem;color:#0c192e;background:#fff;background-image:linear-gradient(var(--toolbar-bg),var(--template-bg-dark-3));box-shadow:0 2px 10px -8px var(--template-bg-dark-50)}.subhead .row{margin-right:0;margin-left:0}.subhead.noshadow{box-shadow:none}.subhead .btn-group,.subhead joomla-toolbar-button{margin-inline-start:.75rem}.subhead .btn-group:first-child,.subhead joomla-toolbar-button:first-child{margin-inline-start:0}.subhead joomla-toolbar-button .btn>span,.subhead joomla-toolbar-button .dropdown-item>span{margin-inline-end:.5rem;width:1.25em;text-align:center}.subhead .btn{--subhead-btn-accent:var(--template-text-dark);padding:0 1rem;margin:5px 0;font-size:1rem;line-height:2.45rem;color:var(--template-text-dark);background:#fff;border-color:#adb5bd}.subhead .btn>span{display:inline-block;color:var(--subhead-btn-accent)}.subhead .btn:not([disabled]):active,.subhead .btn:not([disabled]):focus,.subhead .btn:not([disabled]):hover{color:rgba(255,255,255,.9);background-color:var(--subhead-btn-accent);border-color:var(--subhead-btn-accent)}.subhead .btn:not([disabled]):active>span,.subhead .btn:not([disabled]):focus>span,.subhead .btn:not([disabled]):hover>span{color:rgba(255,255,255,.9)}.subhead .btn.btn-success{--subhead-btn-accent:#198754}.subhead .btn.btn-danger{--subhead-btn-accent:#dc3545}.subhead .btn.btn-primary{--subhead-btn-accent:var(--template-link-color)}.subhead .btn.btn-secondary{--subhead-btn-accent:var(--template-special-color)}.subhead .btn.btn-info{--subhead-btn-accent:var(--template-bg-dark)}.subhead .btn.btn-action{--subhead-btn-accent:var(--template-bg-dark);display:flex;align-items:center}.subhead .btn.btn-action::after{width:2.375rem;font-family:'Font Awesome 5 Free';font-weight:900;content:'\f078';border:0}.subhead .btn.dropdown-toggle[disabled],.subhead .btn[disabled]{--subhead-btn-accent:var(--template-bg-dark);background:rgba(222,226,230,.8);opacity:.5}.subhead .btn.dropdown-toggle[disabled]:active,.subhead .btn.dropdown-toggle[disabled]:focus,.subhead .btn.dropdown-toggle[disabled]:hover,.subhead .btn[disabled]:active,.subhead .btn[disabled]:focus,.subhead .btn[disabled]:hover{cursor:not-allowed}.subhead .dropdown-toggle.btn{padding-inline-end:0}.subhead .btn-group:not(:last-child)>.dropdown-toggle-split{order:1;margin-inline-start:-5px}[dir=ltr] .subhead .btn-group:not(:last-child)>.dropdown-toggle-split{border-radius:0 5px 5px 0}[dir=rtl] .subhead .btn-group:not(:last-child)>.dropdown-toggle-split{border-radius:5px 0 0 5px}.subhead .btn-group joomla-toolbar-button,.subhead .dropdown-menu joomla-toolbar-button{margin-inline-start:0}.contentpane .subhead{margin:-15px -15px 0;background-image:none;border-bottom:1px solid var(--template-bg-dark-7)}@media (min-width:576px) and (max-width:767.98px){joomla-tab[view=accordion] .col-md-3,joomla-tab[view=accordion] .col-md-9{padding:.5rem 1rem!important}#myTab{margin-top:1rem;margin-bottom:1.5rem}joomla-tab[view=accordion] ul li{width:100%}.toggler-toolbar{top:0;bottom:auto;z-index:1030;padding:7px 10px;margin:5px;background-color:var(--template-bg-dark);border-radius:30px}.toggler-toolbar .toggler-toolbar-icon::before{font:normal normal 900 28px/1 'Font Awesome 5 Free';color:var(--toggle-color);content:'\f00d'}.toggler-toolbar.collapsed .toggler-toolbar-icon::before{content:'\f085'}.subhead{padding-right:0;padding-left:0}.subhead .btn,.subhead .btn-group,.subhead joomla-toolbar-button{width:100%;margin-left:0;text-align:left}.subhead .btn-toolbar>.btn-group,.subhead .btn-toolbar>joomla-toolbar-button{margin-left:0}.subhead .btn.btn-action::after{text-align:center;margin-inline-start:auto}.subhead .dropdown-toggle-split{width:auto}}PKBA#]�1ݸ'�'*system/helixultimate/assets/css/chosen.cssnu�[���@charset "UTF-8";/*! Chosen, a Select Box Enhancer for jQuery and Prototype by Patrick Filler for Harvest, http://getharvest.com Version 1.8.7 Full source at https://github.com/harvesthq/chosen Copyright (c) 2011-2018 Harvest http://getharvest.com MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md This file is generated by `grunt build`, do not edit it by hand. */.chosen-container{vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:13px;display:inline-block;position:relative}.chosen-container *{-webkit-box-sizing:border-box;box-sizing:border-box}.chosen-container .chosen-drop{z-index:1010;clip:rect(0,0,0,0);-webkit-clip-path:inset(100%);clip-path:inset(100%);background:#fff;border:1px solid #aaa;border-top:0;width:100%;position:absolute;top:100%;-webkit-box-shadow:0 4px 5px #00000026;box-shadow:0 4px 5px #00000026}.chosen-container.chosen-with-drop .chosen-drop{clip:auto;-webkit-clip-path:none;clip-path:none}.chosen-container a{cursor:pointer}.chosen-container .chosen-single .group-name,.chosen-container .search-choice .group-name{white-space:nowrap;text-overflow:ellipsis;color:#999;margin-right:4px;font-weight:400;overflow:hidden}.chosen-container .chosen-single .group-name:after,.chosen-container .search-choice .group-name:after{content:":";vertical-align:top;padding-left:2px}.chosen-container-single .chosen-single{color:#444;white-space:nowrap;background:-webkit-gradient(linear,left top,left bottom,color-stop(.2,#fff),color-stop(.5,#f6f6f6),color-stop(.52,#eee),to(#f4f4f4));background:linear-gradient(#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%) padding-box padding-box;border:1px solid #aaa;border-radius:5px;height:25px;padding:0 0 0 8px;line-height:24px;text-decoration:none;display:block;position:relative;overflow:hidden;-webkit-box-shadow:inset 0 0 3px #fff,0 1px 1px #0000001a;box-shadow:inset 0 0 3px #fff,0 1px 1px #0000001a}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{text-overflow:ellipsis;white-space:nowrap;margin-right:26px;display:block;overflow:hidden}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{background:url(../images/chosen-sprite.png?v=8b55a8) -42px 1px no-repeat;width:12px;height:12px;font-size:1px;display:block;position:absolute;top:6px;right:26px}.chosen-container-single .chosen-single abbr:hover,.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{width:18px;height:100%;display:block;position:absolute;top:0;right:0}.chosen-container-single .chosen-single div b{background:url(../images/chosen-sprite.png?v=8b55a8) 0 2px no-repeat;width:100%;height:100%;display:block}.chosen-container-single .chosen-search{z-index:1010;white-space:nowrap;margin:0;padding:3px 4px;position:relative}.chosen-container-single .chosen-search input[type=text]{background:url(../images/chosen-sprite.png?v=8b55a8) 100% -20px no-repeat;border:1px solid #aaa;border-radius:0;outline:0;width:100%;height:auto;margin:1px 0;padding:4px 20px 4px 5px;font-family:sans-serif;font-size:1em;line-height:normal}.chosen-container-single .chosen-drop{background-clip:padding-box;border-radius:0 0 4px 4px;margin-top:-1px}.chosen-container-single.chosen-container-single-nosearch .chosen-search{clip:rect(0,0,0,0);-webkit-clip-path:inset(100%);clip-path:inset(100%);position:absolute}.chosen-container .chosen-results{color:#444;-webkit-overflow-scrolling:touch;max-height:240px;margin:0 4px 4px 0;padding:0 0 0 4px;position:relative;overflow:hidden auto}.chosen-container .chosen-results li{word-wrap:break-word;-webkit-touch-callout:none;margin:0;padding:5px 6px;line-height:15px;list-style:none;display:none}.chosen-container .chosen-results li.active-result{cursor:pointer;display:list-item}.chosen-container .chosen-results li.disabled-result{color:#ccc;cursor:default;display:list-item}.chosen-container .chosen-results li.highlighted{color:#fff;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(.2,#3875d7),color-stop(.9,#2a62bc));background-color:#3875d7;background-image:linear-gradient(#3875d7 20%,#2a62bc 90%)}.chosen-container .chosen-results li.no-results{color:#777;background:#f4f4f4;display:list-item}.chosen-container .chosen-results li.group-result{cursor:default;font-weight:700;display:list-item}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{cursor:text;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(.01,#eee),color-stop(.15,#fff));background-color:#fff;background-image:linear-gradient(#eee 1%,#fff 15%);border:1px solid #aaa;width:100%;height:auto;margin:0;padding:0 5px;position:relative;overflow:hidden}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{white-space:nowrap;margin:0;padding:0}.chosen-container-multi .chosen-choices li.search-field input[type=text]{height:25px;-webkit-box-shadow:none;box-shadow:none;color:#999;border-radius:0;outline:0;width:25px;margin:1px 0;padding:0;font-family:sans-serif;font-size:100%;line-height:normal;background:0 0!important;border:0!important}.chosen-container-multi .chosen-choices li.search-choice{color:#333;cursor:default;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(.2,#f4f4f4),color-stop(.5,#f0f0f0),color-stop(.52,#e8e8e8),to(#eee));background-color:#eee;background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-repeat:repeat-x;background-size:100% 19px;background-clip:padding-box;border:1px solid #aaa;border-radius:3px;max-width:100%;margin:3px 5px 3px 0;padding:3px 20px 3px 5px;line-height:13px;position:relative;-webkit-box-shadow:inset 0 0 2px #fff,0 1px #0000000d;box-shadow:inset 0 0 2px #fff,0 1px #0000000d}.chosen-container-multi .chosen-choices li.search-choice span{word-wrap:break-word}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{background:url(../images/chosen-sprite.png?v=8b55a8) -42px 1px no-repeat;width:12px;height:12px;font-size:1px;display:block;position:absolute;top:4px;right:3px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{background-position:-42px -10px}.chosen-container-multi .chosen-choices li.search-choice-disabled{color:#666;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(.2,#f4f4f4),color-stop(.5,#f0f0f0),color-stop(.52,#e8e8e8),to(#eee));background-color:#e4e4e4;background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);border:1px solid #ccc;padding-right:5px}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{color:#ccc;cursor:default;display:list-item}.chosen-container-active .chosen-single{border:1px solid #5897fb;-webkit-box-shadow:0 0 5px #0000004d;box-shadow:0 0 5px #0000004d}.chosen-container-active.chosen-with-drop .chosen-single{background-image:-webkit-gradient(linear,left top,left bottom,color-stop(.2,#eee),color-stop(.8,#fff));background-image:linear-gradient(#eee 20%,#fff 80%);border:1px solid #aaa;border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-box-shadow:inset 0 1px #fff;box-shadow:inset 0 1px #fff}.chosen-container-active.chosen-with-drop .chosen-single div{background:0 0;border-left:none}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;-webkit-box-shadow:0 0 5px #0000004d;box-shadow:0 0 5px #0000004d}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{cursor:default;opacity:.5!important}.chosen-disabled .chosen-choices .search-choice .search-choice-close,.chosen-disabled .chosen-single{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{padding:0 8px 0 0;overflow:visible}.chosen-rtl .chosen-single span{direction:rtl;margin-left:26px;margin-right:0}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{left:3px;right:auto}.chosen-rtl .chosen-single abbr{left:26px;right:auto}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{left:4px;right:auto}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-left:0;padding-right:15px}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:none}.chosen-rtl .chosen-search input[type=text]{direction:rtl;background:url(../images/chosen-sprite.png?v=8b55a8) -30px -20px no-repeat;padding:4px 5px 4px 20px}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}@media only screen and (-webkit-device-pixel-ratio >= 1.5),only screen and (resolution >= 144dpi),only screen and (resolution >= 1.5x){.chosen-container .chosen-results-scroll-down span,.chosen-container .chosen-results-scroll-up span,.chosen-container-multi .chosen-choices .search-choice .search-choice-close,.chosen-container-single .chosen-search input[type=text],.chosen-container-single .chosen-single abbr,.chosen-container-single .chosen-single div b,.chosen-rtl .chosen-search input[type=text]{background-image:url(../images/chosen-sprite@2x.png?v=614fad)!important;background-repeat:no-repeat!important;background-size:52px 37px!important}}PKBA#].?L4system/helixultimate/assets/images/chosen-sprite.pngnu�[����PNG IHDR4%��^�IDATH�헱kSQƯ .-����=�$�b�o�$((T�Hw��*����"nupA�@ P�Apq�J$p!P��M1��.�����;���=��\D�.Y�n0��@}�DMF���>Fb��1��� �c� !6�1r��b�%G���I��J(v��fFy�O����H4B c�1�}��^��4��5Fo��G�X�ٝv�U�n�(�R�s�p����v��*��8sP���*�c�O�TQWŬ���j1Q�H}����T��+���}��֕d�/���L�Lc�F�6�˔�7��,9ʼ1IkJ�(�dJj��Lc�^��z*"Hu�j)����,?<��._1�a�������°x� /b�}�T!�����i?O�u� oc\������eN��c:�99�\@�s� uZ���q��|yp�k�a�����6��B|���1��G����gq�u����p�+���[�*y���IEND�B`�PKBA#]����1system/helixultimate/assets/images/icons/save.svgnu�[���<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M1.80485 0.126787H8.68054C9.02633 0.126787 9.35712 0.268021 9.59627 0.517772L11.5211 2.52785C11.7471 2.76385 11.8732 3.07798 11.8732 3.40473V9.85954C11.8732 10.7825 11.1181 11.5376 10.1784 11.5376H1.80485C0.881914 11.5376 0.126787 10.7825 0.126787 9.85954V1.80485C0.126787 0.881914 0.881914 0.126787 1.80485 0.126787ZM9.41197 0.93932C9.17269 0.688332 8.84106 0.546302 8.49429 0.546302H1.80485C1.11684 0.546302 0.546302 1.11684 0.546302 1.80485V9.85954C0.546302 10.5475 1.11684 11.1181 1.80485 11.1181H10.1784C10.8832 11.1181 11.4369 10.5475 11.4369 9.85954V3.57091C11.4369 3.24513 11.3115 2.93185 11.0867 2.69606L9.41197 0.93932ZM6 6.4363C7.05718 6.4363 7.91299 7.29211 7.91299 8.34929C7.91299 9.40646 7.05718 10.2623 6 10.2623C4.94282 10.2623 4.08701 9.40646 4.08701 8.34929C4.08701 7.29211 4.94282 6.4363 6 6.4363ZM6 6.87259C5.17775 6.87259 4.50653 7.52704 4.50653 8.34929C4.50653 9.17153 5.17775 9.84276 6 9.84276C6.82225 9.84276 7.47669 9.17153 7.47669 8.34929C7.47669 7.52704 6.82225 6.87259 6 6.87259ZM7.78061 1.28465C7.95566 1.28465 8.09758 1.42656 8.09758 1.60162V3.90429C8.09758 4.07934 7.95566 4.22126 7.78061 4.22126H1.80298C1.62793 4.22126 1.48602 4.07934 1.48602 3.90429V1.60162C1.48602 1.42656 1.62793 1.28465 1.80298 1.28465H7.78061ZM7.66128 2.03791C7.66128 1.86286 7.51937 1.72094 7.34431 1.72094H2.23928C2.06422 1.72094 1.92231 1.86286 1.92231 2.03791V3.46799C1.92231 3.64305 2.06422 3.78496 2.23928 3.78496H7.34431C7.51937 3.78496 7.66128 3.64305 7.66128 3.46799V2.03791Z" fill="#000000"/> <path fill-rule="evenodd" clip-rule="evenodd" d="M1.80485 0H8.68054C9.06091 0 9.42478 0.155358 9.68785 0.430084L11.6127 2.44016C11.8612 2.69976 12 3.04531 12 3.40473V9.85954C12 10.8533 11.1873 11.6644 10.1784 11.6644H1.80485C0.811892 11.6644 0 10.8525 0 9.85954V1.80485C0 0.811892 0.811892 0 1.80485 0ZM8.49429 0.673089H1.80485C1.18687 0.673089 0.673089 1.18687 0.673089 1.80485V9.85954C0.673089 10.4775 1.18687 10.9913 1.80485 10.9913H10.1784C10.812 10.9913 11.3101 10.4786 11.3101 9.85954V3.57091C11.3101 3.27771 11.1973 2.99576 10.995 2.78354L9.3202 1.0268C9.10485 0.800916 8.80638 0.673089 8.49429 0.673089ZM6 6.30951C7.1272 6.30951 8.03978 7.22208 8.03978 8.34929C8.03978 9.47649 7.1272 10.3891 6 10.3891C4.8728 10.3891 3.96022 9.47649 3.96022 8.34929C3.96022 7.22208 4.8728 6.30951 6 6.30951ZM6 6.99938C5.2459 6.99938 4.63331 7.59892 4.63331 8.34929C4.63331 9.10151 5.24777 9.71597 6 9.71597C6.75037 9.71597 7.34991 9.10339 7.34991 8.34929C7.34991 7.59706 6.75223 6.99938 6 6.99938ZM8.22436 1.60162V3.90429C8.22436 4.14937 8.02569 4.34804 7.78061 4.34804H1.80298C1.5579 4.34804 1.35923 4.14937 1.35923 3.90429V1.60162C1.35923 1.35654 1.5579 1.15786 1.80298 1.15786H7.78061C8.02569 1.15786 8.22436 1.35654 8.22436 1.60162ZM7.34431 1.84773H2.23928C2.13425 1.84773 2.0491 1.93288 2.0491 2.03791V3.46799C2.0491 3.57303 2.13425 3.65817 2.23928 3.65817H7.34431C7.44935 3.65817 7.53449 3.57303 7.53449 3.46799V2.03791C7.53449 1.93288 7.44935 1.84773 7.34431 1.84773ZM8.68054 0.126787H1.80485C0.881914 0.126787 0.126787 0.881914 0.126787 1.80485V9.85954C0.126787 10.7825 0.881914 11.5376 1.80485 11.5376H10.1784C11.1181 11.5376 11.8732 10.7825 11.8732 9.85954V3.40473C11.8732 3.07798 11.7471 2.76385 11.5211 2.52785L9.59627 0.517772C9.35712 0.268021 9.02633 0.126787 8.68054 0.126787ZM8.49429 0.546302C8.84106 0.546302 9.17269 0.688332 9.41197 0.93932L11.0867 2.69606C11.3115 2.93185 11.4369 3.24513 11.4369 3.57091V9.85954C11.4369 10.5475 10.8832 11.1181 10.1784 11.1181H1.80485C1.11684 11.1181 0.546302 10.5475 0.546302 9.85954V1.80485C0.546302 1.11684 1.11684 0.546302 1.80485 0.546302H8.49429ZM7.91299 8.34929C7.91299 7.29211 7.05718 6.4363 6 6.4363C4.94282 6.4363 4.08701 7.29211 4.08701 8.34929C4.08701 9.40646 4.94282 10.2623 6 10.2623C7.05718 10.2623 7.91299 9.40646 7.91299 8.34929ZM4.50653 8.34929C4.50653 7.52704 5.17775 6.87259 6 6.87259C6.82225 6.87259 7.47669 7.52704 7.47669 8.34929C7.47669 9.17153 6.82225 9.84276 6 9.84276C5.17775 9.84276 4.50653 9.17153 4.50653 8.34929ZM8.09758 1.60162C8.09758 1.42656 7.95566 1.28465 7.78061 1.28465H1.80298C1.62793 1.28465 1.48602 1.42656 1.48602 1.60162V3.90429C1.48602 4.07934 1.62793 4.22126 1.80298 4.22126H7.78061C7.95566 4.22126 8.09758 4.07934 8.09758 3.90429V1.60162ZM7.34431 1.72094C7.51937 1.72094 7.66128 1.86286 7.66128 2.03791V3.46799C7.66128 3.64305 7.51937 3.78496 7.34431 3.78496H2.23928C2.06422 3.78496 1.92231 3.64305 1.92231 3.46799V2.03791C1.92231 1.86286 2.06422 1.72094 2.23928 1.72094H7.34431Z" fill="#000000"/> </svg> PKBA#]s)�@@1system/helixultimate/assets/images/icons/menu.svgnu�[���<svg width="20" height="17" viewBox="0 0 20 17" fill="none" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" clip-rule="evenodd" d="M3.70297 12.9094C3.68758 12.8283 3.61212 12.7647 3.52941 12.7647H1.20192L1.14468 12.7676C1.06359 12.783 1 12.8585 1 12.9412V15.2687L1.00292 15.3259C1.0183 15.407 1.09377 15.4706 1.17647 15.4706H3.50396L3.56121 15.4677C3.6423 15.4523 3.70588 15.3768 3.70588 15.2941V12.9666L3.70297 12.9094ZM4.69978 12.8213C4.63925 12.23 4.13603 11.7647 3.52941 11.7647H1.17647L1.05663 11.7708C0.465303 11.8313 0 12.3346 0 12.9412V15.2941L0.00610352 15.414C0.066636 16.0053 0.569853 16.4706 1.17647 16.4706H3.52941L3.64926 16.4645C4.24058 16.404 4.70588 15.9007 4.70588 15.2941V12.9412L4.69978 12.8213ZM18.9971 12.9094C18.9817 12.8283 18.9062 12.7647 18.8235 12.7647H7.08428L7.02703 12.7676C6.94594 12.783 6.88235 12.8585 6.88235 12.9412V15.2687L6.88527 15.3259C6.90065 15.407 6.97612 15.4706 7.05882 15.4706H18.7981L18.8553 15.4677C18.9364 15.4523 19 15.3768 19 15.2941V12.9666L18.9971 12.9094ZM19.9939 12.8213C19.9334 12.23 19.4301 11.7647 18.8235 11.7647H7.05882L6.93898 11.7708C6.34766 11.8313 5.88235 12.3346 5.88235 12.9412V15.2941L5.88846 15.414C5.94899 16.0053 6.45221 16.4706 7.05882 16.4706H18.8235L18.9434 16.4645C19.5347 16.404 20 15.9007 20 15.2941V12.9412L19.9939 12.8213ZM3.70297 7.02703C3.68758 6.94594 3.61212 6.88235 3.52941 6.88235H1.20192L1.14467 6.88527C1.06359 6.90065 1 6.97612 1 7.05882V9.38632L1.00292 9.44356C1.0183 9.52465 1.09377 9.58824 1.17647 9.58824H3.50396L3.5612 9.58532C3.64229 9.56994 3.70588 9.49447 3.70588 9.41177V7.08427L3.70297 7.02703ZM4.69978 6.93898C4.63925 6.34766 4.13603 5.88235 3.52941 5.88235H1.17647L1.05663 5.88846C0.465303 5.94899 0 6.45221 0 7.05882V9.41177L0.00610352 9.53161C0.066636 10.1229 0.569853 10.5882 1.17647 10.5882H3.52941L3.64926 10.5821C4.24058 10.5216 4.70588 10.0184 4.70588 9.41177V7.05882L4.69978 6.93898ZM18.9971 7.02703C18.9817 6.94594 18.9062 6.88235 18.8235 6.88235H7.08428L7.02703 6.88527C6.94594 6.90065 6.88235 6.97612 6.88235 7.05882V9.38631L6.88527 9.44356C6.90065 9.52465 6.97612 9.58824 7.05882 9.58824H18.7981L18.8553 9.58532C18.9364 9.56994 19 9.49447 19 9.41177V7.08426L18.9971 7.02703ZM19.9939 6.93898C19.9334 6.34766 19.4301 5.88235 18.8235 5.88235H7.05882L6.93898 5.88846C6.34766 5.94899 5.88235 6.45221 5.88235 7.05882V9.41177L5.88846 9.53161C5.94899 10.1229 6.45221 10.5882 7.05882 10.5882H18.8235L18.9434 10.5821C19.5347 10.5216 20 10.0184 20 9.41177V7.05882L19.9939 6.93898ZM3.52941 1H1.20192L1.14468 1.00292C1.06359 1.0183 1 1.09376 1 1.17647V3.50396L1.00292 3.5612C1.0183 3.64229 1.09376 3.70588 1.17647 3.70588H3.50396L3.5612 3.70297C3.6423 3.68758 3.70588 3.61212 3.70588 3.52941V1.20192L3.70297 1.14468C3.68758 1.06359 3.61212 1 3.52941 1ZM4.69978 1.05663C4.63925 0.465303 4.13603 0 3.52941 0H1.17647L1.05663 0.00610352C0.465303 0.066636 0 0.569853 0 1.17647V3.52941L0.00610352 3.64926C0.066636 4.24058 0.569853 4.70588 1.17647 4.70588H3.52941L3.64926 4.69978C4.24058 4.63925 4.70588 4.13603 4.70588 3.52941V1.17647L4.69978 1.05663ZM7.08427 1H18.8235C18.9062 1 18.9817 1.06359 18.9971 1.14468L19 1.2019V3.52941C19 3.61212 18.9364 3.68758 18.8553 3.70297L18.7981 3.70588H7.05882C6.97612 3.70588 6.90065 3.6423 6.88527 3.56121L6.88235 3.50396V1.17647C6.88235 1.09376 6.94594 1.0183 7.02703 1.00292L7.08427 1ZM6.93898 0.00610352L7.05882 0H18.8235C19.4301 0 19.9334 0.465303 19.9939 1.05663L20 1.17647V3.52941C20 4.13603 19.5347 4.63925 18.9434 4.69978L18.8235 4.70588H7.05882C6.45221 4.70588 5.94899 4.24058 5.88846 3.64926L5.88235 3.52941V1.17647C5.88235 0.569853 6.34766 0.066636 6.93898 0.00610352Z" fill="#000000"/> </svg> PKBA#]��Q��3system/helixultimate/assets/images/icons/layout.svgnu�[���<svg width="21" height="16" viewBox="0 0 21 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M17.9912 15.917C19.7139 15.917 20.584 15.0381 20.584 13.3506V2.5752C20.584 0.878906 19.7139 0 17.9912 0H2.59277C0.878906 0 0 0.870117 0 2.5752V13.3506C0 15.0469 0.878906 15.917 2.59277 15.917H17.9912ZM19.4941 4.99219H1.08984V2.62793C1.08984 1.61719 1.62598 1.08984 2.61035 1.08984H17.9736C18.9404 1.08984 19.4941 1.61719 19.4941 2.62793V4.99219ZM17.9736 14.8271H7.81055V5.97656H19.4941V13.2891C19.4941 14.3086 18.9404 14.8271 17.9736 14.8271ZM6.77344 14.8271H2.61035C1.62598 14.8271 1.08984 14.3086 1.08984 13.2891V5.97656H6.77344V14.8271Z" fill="#000000"/> </svg> PKBA#]�1(ۣ � 2system/helixultimate/assets/images/icons/basic.svgnu�[��� <svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 16 16"><path fill="#000000" d="M14.922 6.333h-1.195c-.182 0-.348-.106-.403-.259a5.551 5.551 0 00-.202-.486c-.066-.142-.026-.328.1-.453l.85-.852c.42-.42.42-1.103 0-1.523l-.833-.833a1.08 1.08 0 00-1.524 0l-.85.85c-.126.126-.313.168-.453.1a5.718 5.718 0 00-.488-.202c-.152-.054-.258-.22-.258-.402V1.077C9.666.483 9.183 0 8.59 0H7.41c-.594 0-1.077.483-1.077 1.077v1.196c0 .182-.106.347-.259.402-.166.06-.328.127-.486.202-.142.067-.328.026-.453-.1l-.852-.85a1.08 1.08 0 00-1.524 0l-.832.833c-.42.42-.42 1.103 0 1.523l.852.853c.124.124.165.31.098.452-.074.158-.142.32-.202.487-.054.152-.22.258-.402.258H1.077C.483 6.333 0 6.816 0 7.41V8.59c0 .594.483 1.077 1.077 1.077h1.196c.182 0 .348.106.402.259.06.166.128.328.202.486.067.142.026.328-.1.453l-.851.851a1.08 1.08 0 000 1.524l.833.834a1.08 1.08 0 001.524 0l.851-.852c.126-.125.312-.166.453-.099.158.075.32.142.487.203.152.054.258.22.258.402v1.196c0 .594.484 1.077 1.078 1.077h1.178c.594 0 1.078-.483 1.078-1.077v-1.196c0-.182.106-.347.258-.402.166-.06.329-.127.486-.202.142-.067.329-.026.454.1l.85.85a1.08 1.08 0 001.525 0l.833-.833a1.08 1.08 0 000-1.524l-.852-.852c-.125-.124-.166-.31-.1-.452a5.7 5.7 0 00.203-.487c.055-.152.22-.258.403-.258h1.195c.594 0 1.078-.483 1.078-1.077V7.41c0-.595-.483-1.078-1.077-1.078zm.41 2.256a.41.41 0 01-.41.41h-1.195c-.466 0-.88.281-1.03.7a4.66 4.66 0 01-.178.429c-.187.398-.094.883.231 1.208l.851.851c.16.16.161.422 0 .582l-.833.833c-.16.16-.42.16-.581 0l-.851-.851a1.076 1.076 0 00-1.21-.231c-.14.066-.282.125-.428.178-.418.15-.698.564-.698 1.03v1.195a.41.41 0 01-.411.41H7.41a.41.41 0 01-.41-.41v-1.196c0-.465-.28-.879-.698-1.029a5.048 5.048 0 01-.43-.178 1.006 1.006 0 00-.43-.096c-.282 0-.564.113-.778.326l-.851.851c-.16.16-.42.16-.582 0l-.833-.833a.412.412 0 010-.581l.851-.85c.326-.325.419-.811.232-1.21a4.918 4.918 0 01-.178-.428c-.151-.419-.565-.7-1.03-.7H1.077a.41.41 0 01-.41-.41V7.41a.41.41 0 01.41-.41h1.196c.465 0 .879-.28 1.029-.699a4.85 4.85 0 01.179-.43 1.073 1.073 0 00-.232-1.208l-.851-.851a.411.411 0 010-.58l.833-.834c.16-.16.42-.16.582 0l.85.851c.327.326.812.42 1.21.232.14-.066.282-.126.428-.178.418-.15.699-.565.699-1.03V1.077a.41.41 0 01.41-.41H8.59a.41.41 0 01.41.41v1.196c0 .465.281.879.699 1.029.146.053.289.113.429.179a1.07 1.07 0 001.208-.232l.852-.851c.16-.16.42-.16.581 0l.833.833c.16.16.16.42 0 .58l-.85.852c-.326.325-.42.81-.232 1.209.066.14.125.282.178.428.15.42.564.7 1.03.7h1.195a.41.41 0 01.41.41V8.59z"/><path fill="#000000" d="M8 5C6.346 5 5 6.346 5 8s1.346 3 3 3 3-1.346 3-3-1.346-3-3-3zm0 5.143A2.145 2.145 0 015.857 8c0-1.182.962-2.143 2.143-2.143 1.181 0 2.143.961 2.143 2.143A2.145 2.145 0 018 10.143z"/></svg>PKBA#]5��2system/helixultimate/assets/images/icons/close.svgnu�[���<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M11.4141 11.4111C11.6328 11.1924 11.6328 10.833 11.4141 10.6143L6.58594 5.78615L11.4141 0.958021C11.6328 0.747084 11.6328 0.379896 11.4141 0.161146C11.1953 -0.0497914 10.8359 -0.0497914 10.6172 0.161146L5.78906 4.98927L0.960938 0.161146C0.742188 -0.0497914 0.382812 -0.0576039 0.164062 0.161146C-0.0546875 0.387709 -0.0546875 0.747084 0.164062 0.958021L4.99219 5.78615L0.164062 10.6143C-0.0546875 10.833 -0.0546875 11.2002 0.164062 11.4111C0.382812 11.6299 0.742188 11.6299 0.960938 11.4111L5.78906 6.58302L10.6172 11.4111C10.8359 11.6299 11.1953 11.6377 11.4141 11.4111Z" fill="#000000"/> </svg> PKBA#]�#��bb:system/helixultimate/assets/images/icons/device-mobile.svgnu�[���<svg width="12" height="16" viewBox="0 0 12 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M9.99995 0C10.7861 0 11.3611 0.689442 11.3611 1.47778V14.0778C11.3611 14.8661 10.7861 15.5556 9.99995 15.5556H1.83328C1.0471 15.5556 0.472168 14.8661 0.472168 14.0778V1.47778C0.472168 0.689442 1.0471 0 1.83328 0H9.99995ZM9.99995 0.777778H1.83328L1.76014 0.783224C1.47262 0.826355 1.24995 1.12045 1.24995 1.47778V14.0778L1.25449 14.1657C1.29051 14.5112 1.53605 14.7778 1.83328 14.7778H9.99995L10.0731 14.7723C10.3606 14.7292 10.5833 14.4351 10.5833 14.0778V1.47778L10.5787 1.38987C10.5427 1.04439 10.2972 0.777778 9.99995 0.777778ZM5.91661 11.6667C6.34595 11.6667 6.69439 12.0143 6.69439 12.4444C6.69439 12.8746 6.34595 13.2222 5.91661 13.2222C5.48728 13.2222 5.13883 12.8746 5.13883 12.4444C5.13883 12.0143 5.48728 11.6667 5.91661 11.6667ZM7.09068 2.33333C7.3049 2.33333 7.47217 2.50744 7.47217 2.72222L7.46442 2.79879C7.42885 2.973 7.27504 3.11111 7.09068 3.11111H4.74254C4.52832 3.11111 4.36106 2.937 4.36106 2.72222L4.36881 2.64565C4.40438 2.47145 4.55819 2.33333 4.74254 2.33333H7.09068Z" fill="#000000"/> </svg> PKBA#]�11Q��7system/helixultimate/assets/images/icons/typography.svgnu�[���<svg width="22" height="16" viewBox="0 0 22 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M20.5576 5.61621C20.9092 5.61621 21.1025 5.41406 21.1025 5.07129V2.5752C21.1025 0.878906 20.2236 0 18.5098 0H3.11133C1.39746 0 0.518555 0.870117 0.518555 2.5752V5.07129C0.518555 5.41406 0.720703 5.61621 1.06348 5.61621C1.39746 5.61621 1.59961 5.41406 1.59961 5.07129V2.62793C1.59961 1.61719 2.13574 1.08984 3.12891 1.08984H18.4834C19.459 1.08984 20.0127 1.61719 20.0127 2.62793V5.07129C20.0127 5.41406 20.2148 5.61621 20.5576 5.61621ZM10.7842 11.6982C11.1357 11.6982 11.3291 11.4609 11.3291 11.0918V5.10645H13.6406C13.9043 5.10645 14.0977 4.92188 14.0977 4.64941C14.0977 4.36816 13.9043 4.19238 13.6406 4.19238H7.98047C7.7168 4.19238 7.52344 4.36816 7.52344 4.64941C7.52344 4.92188 7.7168 5.10645 7.98047 5.10645H10.2393V11.0918C10.2393 11.4521 10.4414 11.6982 10.7842 11.6982ZM1.06348 8.85059C1.64355 8.85059 2.11816 8.38477 2.11816 7.7959C2.11816 7.21582 1.64355 6.74121 1.06348 6.74121C0.483398 6.74121 0 7.21582 0 7.7959C0 8.38477 0.483398 8.85059 1.06348 8.85059ZM20.5576 8.85059C21.1289 8.85059 21.6123 8.38477 21.6123 7.7959C21.6123 7.21582 21.1289 6.74121 20.5576 6.74121C19.9688 6.74121 19.4941 7.20703 19.4941 7.7959C19.4941 8.38477 19.9688 8.85059 20.5576 8.85059ZM18.5098 15.917C20.2236 15.917 21.1025 15.0381 21.1025 13.3506V10.5645C21.1025 10.2217 20.9004 10.0195 20.5576 10.0195C20.2148 10.0195 20.0127 10.2217 20.0127 10.5645V13.2891C20.0127 14.3086 19.459 14.8271 18.4834 14.8271H3.12891C2.13574 14.8271 1.59961 14.3086 1.59961 13.2891V10.5645C1.59961 10.2217 1.39746 10.0195 1.06348 10.0195C0.720703 10.0195 0.518555 10.2217 0.518555 10.5645V13.3506C0.518555 15.0469 1.39746 15.917 3.11133 15.917H18.5098Z" fill="#000000"/> </svg> PKBA#]�\��9system/helixultimate/assets/images/icons/image-medium.svgnu�[���<svg xmlns="http://www.w3.org/2000/svg" width="40" height="29" fill="none"><path fill="#36F" fill-opacity=".1" d="M19.499 4a4 4 0 11-8 0 4 4 0 018 0z"/><path fill="#36F" fill-opacity=".15" d="M9.5 14L19 29H0l9.5-15z"/><path fill="#EFF4FB" d="M27.5 8L40 29H15L27.5 8z"/></svg>PKBA#]�Ņ�1system/helixultimate/assets/images/icons/bars.svgnu�[���<svg width="16" height="14" viewBox="0 0 16 14" fill="red" xmlns="http://www.w3.org/2000/svg"> <path d="M16 13L16 1C16 0.447715 15.5523 -1.95702e-08 15 -4.37114e-08L13 -1.31134e-07C12.4477 -1.55275e-07 12 0.447715 12 1L12 13C12 13.5523 12.4477 14 13 14L15 14C15.5523 14 16 13.5523 16 13Z" fill="#A5B1C5"/> <path d="M10 13L10 1C10 0.447715 9.55228 -1.95702e-08 9 -4.37114e-08L7 -1.31134e-07C6.44772 -1.55275e-07 6 0.447715 6 1L6 13C6 13.5523 6.44772 14 7 14L9 14C9.55228 14 10 13.5523 10 13Z" fill="#A5B1C5"/> <path d="M4 13L4 1C4 0.447715 3.55228 -1.95702e-08 3 -4.37114e-08L1 -1.31134e-07C0.447716 -1.55275e-07 6.95685e-07 0.447715 6.71544e-07 1L1.47008e-07 13C1.22867e-07 13.5523 0.447715 14 1 14L3 14C3.55228 14 4 13.5523 4 13Z" fill="#A5B1C5"/> </svg> PKBA#]�� EE:system/helixultimate/assets/images/icons/device-tablet.svgnu�[���<svg width="15" height="18" viewBox="0 0 15 18" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12.8056 0C13.7316 0 14.4722 0.761229 14.4722 1.68889V16.0889C14.4722 17.0165 13.7316 17.7778 12.8056 17.7778H1.91667C0.990595 17.7778 0.25 17.0165 0.25 16.0889V1.68889C0.25 0.761229 0.990595 0 1.91667 0H12.8056ZM12.8056 0.888889H1.91667L1.81915 0.895113C1.43579 0.944406 1.13889 1.28052 1.13889 1.68889V16.0889L1.14495 16.1894C1.19297 16.5842 1.52036 16.8889 1.91667 16.8889H12.8056L12.9031 16.8827C13.2864 16.8334 13.5833 16.4973 13.5833 16.0889V1.68889L13.5773 1.58843C13.5292 1.19359 13.2019 0.888889 12.8056 0.888889ZM7.36111 14.2222C7.85178 14.2222 8.25 14.6196 8.25 15.1111C8.25 15.6027 7.85178 16 7.36111 16C6.87044 16 6.47222 15.6027 6.47222 15.1111C6.47222 14.6196 6.87044 14.2222 7.36111 14.2222ZM12.2497 12.4444C12.4909 12.4444 12.6944 12.6434 12.6944 12.8889L12.6873 12.9669C12.6496 13.1704 12.468 13.3333 12.2497 13.3333H2.47253C2.23133 13.3333 2.02778 13.1343 2.02778 12.8889L2.03494 12.8109C2.0726 12.6073 2.25419 12.4444 2.47253 12.4444H12.2497Z" fill="#000000"/> </svg> PKBA#]�y;system/helixultimate/assets/images/icons/device-desktop.svgnu�[���<svg width="20" height="15" viewBox="0 0 20 15" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M17.4609 12.0703C18.6562 12.0703 19.25 11.4922 19.25 10.2812V1.78906C19.25 0.570312 18.6562 0 17.4609 0H1.78906C0.601562 0 0 0.570312 0 1.78906V10.2812C0 11.4922 0.601562 12.0703 1.78906 12.0703H17.4609ZM17.4375 11.0469H1.8125C1.26562 11.0469 1.02344 10.8203 1.02344 10.2578V1.80469C1.02344 1.25 1.26562 1.01562 1.8125 1.01562H17.4375C17.9844 1.01562 18.2344 1.25 18.2344 1.80469V10.2578C18.2344 10.8203 17.9844 11.0469 17.4375 11.0469ZM14.3125 14.8438C14.6641 14.8438 14.9453 14.5547 14.9453 14.1953C14.9453 13.8359 14.6641 13.5469 14.3125 13.5469H4.91406C4.5625 13.5469 4.27344 13.8359 4.27344 14.1953C4.27344 14.5547 4.5625 14.8438 4.91406 14.8438H14.3125Z" fill="#000000"/> </svg> PKBA#] UX�<system/helixultimate/assets/images/icons/image-thumbnail.svgnu�[���<svg xmlns="http://www.w3.org/2000/svg" width="36" height="26" fill="none"><path fill="#36F" fill-opacity=".1" d="M18 3.5a3.5 3.5 0 11-7 0 3.5 3.5 0 017 0z"/><path fill="#36F" fill-opacity=".15" d="M9 13l8.66 13H.34L9 13z"/><path fill="#EFF4FB" d="M25 7l11 19H14L25 7z"/></svg>PKBA#]�h/��4system/helixultimate/assets/images/icons/presets.svgnu�[���<svg width="18" height="15" viewBox="0 0 18 15" xmlns="http://www.w3.org/2000/svg"> <path fill="#000000" d="M12.0059 3.95508C12.9023 3.95508 13.6582 3.35742 13.9043 2.53125H16.8838C17.165 2.53125 17.4111 2.29395 17.4111 1.99512C17.4111 1.6875 17.165 1.4502 16.8838 1.4502H13.9043C13.6758 0.615234 12.9023 0 12.0059 0C11.1006 0 10.3359 0.615234 10.0986 1.4502H0.544922C0.237305 1.4502 0 1.6875 0 1.99512C0 2.29395 0.237305 2.53125 0.544922 2.53125H10.1074C10.3447 3.35742 11.1094 3.95508 12.0059 3.95508ZM12.0059 3.05859C11.3994 3.05859 10.9248 2.5752 10.9248 1.97754C10.9248 1.3623 11.3994 0.896484 12.0059 0.896484C12.6123 0.896484 13.0869 1.3623 13.0869 1.97754C13.0869 2.5752 12.6123 3.05859 12.0059 3.05859ZM5.625 9.35156C6.53027 9.35156 7.29492 8.73633 7.53223 7.91016H16.8662C17.165 7.91016 17.4111 7.66406 17.4111 7.36523C17.4111 7.05762 17.165 6.82031 16.8662 6.82031H7.52344C7.28613 6.00293 6.52148 5.39648 5.625 5.39648C4.72852 5.39648 3.96387 6.00293 3.72656 6.82031H0.518555C0.237305 6.82031 0 7.05762 0 7.36523C0 7.66406 0.237305 7.91016 0.518555 7.91016H3.72656C3.96387 8.73633 4.72852 9.35156 5.625 9.35156ZM5.625 8.44629C5.01855 8.44629 4.54395 7.97168 4.54395 7.36523C4.54395 6.75879 5.01855 6.28418 5.625 6.28418C6.23145 6.28418 6.70605 6.75879 6.70605 7.36523C6.70605 7.97168 6.23145 8.44629 5.625 8.44629ZM12.0059 14.7217C12.9023 14.7217 13.667 14.1064 13.9043 13.2803H16.8838C17.165 13.2803 17.4111 13.043 17.4111 12.7354C17.4111 12.4365 17.165 12.1992 16.8838 12.1992H13.9043C13.667 11.373 12.9023 10.7666 12.0059 10.7666C11.1094 10.7666 10.3447 11.373 10.1074 12.1992H0.544922C0.237305 12.1992 0 12.4365 0 12.7354C0 13.043 0.237305 13.2803 0.544922 13.2803H10.0986C10.3359 14.1064 11.1006 14.7217 12.0059 14.7217ZM12.0059 13.8252C11.3994 13.8252 10.9248 13.3418 10.9248 12.7354C10.9248 12.1289 11.3994 11.6631 12.0059 11.6631C12.6123 11.6631 13.0869 12.1289 13.0869 12.7354C13.0869 13.3418 12.6123 13.8252 12.0059 13.8252Z"/> </svg> PKBA#]��y :system/helixultimate/assets/images/icons/licenseupdate.svgnu�[���<svg height="18" width="18" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 18 18"><path fill="#000000" fill-rule="evenodd" d="M8.133 4.683l-.005.07c-.17.006-.339.023-.504.05a3.67 3.67 0 00.022-.235H5.288c-.132.483-.49.779-.939.779a.944.944 0 01-.273-.04L2.841 7.376a3.138 3.138 0 001.334.363c-.049.147-.09.297-.122.451l-.031-.003-.214.411a.185.185 0 01-.081.088c-.036.018-.08.024-.13.018-.097-.015-.152-.074-.163-.178l-.067-.45a4.067 4.067 0 01-.623-.233l-.332.304c-.07.067-.144.075-.242.028-.077-.044-.105-.119-.089-.222l.094-.446a4.24 4.24 0 01-.314-.245 2.991 2.991 0 01-.197-.186l-.41.174c-.089.043-.163.024-.237-.064-.07-.07-.074-.153-.016-.237l.238-.387a3.509 3.509 0 01-.327-.585l-.456.023c-.098.004-.164-.04-.195-.134-.03-.099-.008-.174.07-.229l.351-.289a3.654 3.654 0 01-.11-.66l-.428-.142c-.06-.02-.101-.05-.124-.095A.223.223 0 010 4.351c0-.103.047-.162.144-.198l.429-.138a3.791 3.791 0 01.11-.66L.33 3.066c-.081-.055-.105-.13-.07-.225.031-.095.097-.139.195-.134l.456.019c.094-.21.202-.399.327-.585L.998 1.75c-.051-.076-.047-.158.02-.23.073-.087.147-.106.237-.063l.409.17c.156-.158.331-.304.51-.43L2.082.753c-.01-.072-.001-.13.032-.173a.184.184 0 01.057-.05c.094-.046.172-.039.242.033l.332.292c.202-.095.413-.166.623-.225l.067-.45c.011-.104.066-.163.16-.179a.228.228 0 01.14.022.183.183 0 01.074.081l.214.411.02-.001.14-.01C4.238.503 4.295.5 4.352.5c.107 0 .212.008.32.016h.012l.21-.411c.044-.079.114-.115.215-.103.093.016.148.075.163.178l.063.45a4.475 4.475 0 01.624.226l.33-.296c.071-.072.149-.08.242-.028.082.044.11.118.09.222l-.09.442c.18.127.351.273.507.43l.413-.17c.086-.042.164-.023.238.065a.195.195 0 01.05.087c.01.047-.001.097-.035.146l-.241.387c.128.186.237.376.33.585l.453-.02c.097-.004.168.04.199.135a.216.216 0 010 .136.199.199 0 01-.07.09l-.355.288c.054.213.097.43.113.664l.429.134c.05.02.089.047.113.084a.2.2 0 01.03.114c0 .1-.05.158-.143.194l-.429.138zm-.487-.534H5.284a1.17 1.17 0 00-.242-.445.912.912 0 00-.978-.263L2.85 1.327A3.238 3.238 0 014.353.963c1.788 0 3.192 1.391 3.293 3.186zM2.47 7.154c-.86-.609-1.414-1.633-1.414-2.8 0-1.177.558-2.201 1.427-2.806l1.219 2.12a.964.964 0 00-.315.702c0 .265.113.503.327.709L2.47 7.154zM4.353 4.9a.535.535 0 01-.526-.534.527.527 0 11.868.407.525.525 0 01-.342.127z" clip-rule="evenodd"/><path fill="#000000" fill-rule="evenodd" d="M12.017 17.717c-.025.162-.105.255-.252.28-.165.018-.275-.038-.342-.168l-.331-.646c-.178.018-.35.03-.52.03a4.74 4.74 0 01-.521-.03l-.337.646c-.061.13-.171.186-.33.167-.153-.024-.24-.117-.258-.279l-.104-.708a6.459 6.459 0 01-.98-.367l-.52.479c-.11.105-.227.118-.38.043A.269.269 0 017 16.959a.468.468 0 01.002-.142l.147-.703a5.538 5.538 0 01-.802-.677l-.643.274c-.141.068-.257.037-.374-.1a.266.266 0 01-.088-.212.325.325 0 01.064-.16l.374-.61a5.595 5.595 0 01-.515-.92l-.716.038c-.153.006-.258-.062-.306-.211-.031-.098-.028-.18.009-.25a.318.318 0 01.1-.11l.552-.454a5.767 5.767 0 01-.172-1.037l-.673-.224c-.153-.05-.227-.143-.227-.304 0-.162.074-.255.227-.311l.673-.218a5.77 5.77 0 01.172-1.037l-.551-.453c-.13-.087-.166-.205-.11-.354.035-.108.099-.174.19-.2a.376.376 0 01.116-.012l.716.031a5.79 5.79 0 01.515-.92l-.38-.614c-.08-.118-.073-.249.03-.36.117-.137.233-.168.374-.1l.643.267c.245-.248.52-.478.802-.677l-.147-.696c-.024-.16.018-.28.141-.347.147-.075.27-.063.38.049l.52.46c.319-.15.65-.26.98-.354l.104-.709c.018-.161.105-.254.251-.279.166-.019.276.037.337.162l.337.646c.104-.007.204-.015.304-.02.071-.003.143-.005.216-.005.172 0 .344.012.52.025l.332-.646c.067-.125.177-.18.336-.162.147.025.233.118.258.28l.097.708c.337.093.668.21.98.354l.521-.466c.11-.112.233-.124.38-.043.082.043.129.108.145.19a.429.429 0 01-.005.157l-.14.696c.281.2.551.429.796.677l.649-.267c.135-.068.257-.037.373.1.076.081.1.174.074.266a.347.347 0 01-.05.1l-.379.609c.202.292.373.59.52.92l.711-.032a.347.347 0 01.148.023.284.284 0 01.164.189c.043.149.006.267-.11.354l-.557.453c.085.335.153.677.178 1.044l.673.21a.335.335 0 01.195.161.337.337 0 01.032.15c0 .156-.08.25-.227.305l-.673.217c-.025.361-.087.715-.178 1.044l.557.454c.116.093.16.211.11.36-.048.15-.159.217-.312.211l-.71-.037a5.628 5.628 0 01-.52.92l.379.608c.092.13.08.261-.025.373-.116.137-.238.168-.373.1l-.65-.274a5.493 5.493 0 01-.795.678l.14.702c.03.161-.012.279-.14.347-.147.075-.27.062-.38-.043l-.52-.479c-.313.15-.644.274-.98.36l-.098.715zm.018-6.877h3.71c-.158-2.82-2.363-5.007-5.174-5.007-.857 0-1.66.204-2.363.571l1.91 3.324c.184-.056.319-.075.447-.075.692 0 1.25.454 1.47 1.187zm-6.644.323c0 1.833.87 3.442 2.222 4.398L9.567 12.3c-.336-.323-.514-.696-.514-1.112 0-.41.17-.795.496-1.106l-1.917-3.33c-1.366.95-2.241 2.56-2.241 4.41zm4.354.019c0 .465.386.838.826.838a.839.839 0 00.832-.839.828.828 0 00-.832-.826.834.834 0 00-.826.827zm-1.55 4.727a5.058 5.058 0 002.376.578c2.805 0 5.01-2.187 5.175-4.988H12.04c-.208.758-.771 1.223-1.476 1.223-.122 0-.257-.012-.428-.062l-1.942 3.25z" clip-rule="evenodd"/></svg>PKBA#]��y 4system/helixultimate/assets/images/icons/advance.svgnu�[���<svg height="18" width="18" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 18 18"><path fill="#000000" fill-rule="evenodd" d="M8.133 4.683l-.005.07c-.17.006-.339.023-.504.05a3.67 3.67 0 00.022-.235H5.288c-.132.483-.49.779-.939.779a.944.944 0 01-.273-.04L2.841 7.376a3.138 3.138 0 001.334.363c-.049.147-.09.297-.122.451l-.031-.003-.214.411a.185.185 0 01-.081.088c-.036.018-.08.024-.13.018-.097-.015-.152-.074-.163-.178l-.067-.45a4.067 4.067 0 01-.623-.233l-.332.304c-.07.067-.144.075-.242.028-.077-.044-.105-.119-.089-.222l.094-.446a4.24 4.24 0 01-.314-.245 2.991 2.991 0 01-.197-.186l-.41.174c-.089.043-.163.024-.237-.064-.07-.07-.074-.153-.016-.237l.238-.387a3.509 3.509 0 01-.327-.585l-.456.023c-.098.004-.164-.04-.195-.134-.03-.099-.008-.174.07-.229l.351-.289a3.654 3.654 0 01-.11-.66l-.428-.142c-.06-.02-.101-.05-.124-.095A.223.223 0 010 4.351c0-.103.047-.162.144-.198l.429-.138a3.791 3.791 0 01.11-.66L.33 3.066c-.081-.055-.105-.13-.07-.225.031-.095.097-.139.195-.134l.456.019c.094-.21.202-.399.327-.585L.998 1.75c-.051-.076-.047-.158.02-.23.073-.087.147-.106.237-.063l.409.17c.156-.158.331-.304.51-.43L2.082.753c-.01-.072-.001-.13.032-.173a.184.184 0 01.057-.05c.094-.046.172-.039.242.033l.332.292c.202-.095.413-.166.623-.225l.067-.45c.011-.104.066-.163.16-.179a.228.228 0 01.14.022.183.183 0 01.074.081l.214.411.02-.001.14-.01C4.238.503 4.295.5 4.352.5c.107 0 .212.008.32.016h.012l.21-.411c.044-.079.114-.115.215-.103.093.016.148.075.163.178l.063.45a4.475 4.475 0 01.624.226l.33-.296c.071-.072.149-.08.242-.028.082.044.11.118.09.222l-.09.442c.18.127.351.273.507.43l.413-.17c.086-.042.164-.023.238.065a.195.195 0 01.05.087c.01.047-.001.097-.035.146l-.241.387c.128.186.237.376.33.585l.453-.02c.097-.004.168.04.199.135a.216.216 0 010 .136.199.199 0 01-.07.09l-.355.288c.054.213.097.43.113.664l.429.134c.05.02.089.047.113.084a.2.2 0 01.03.114c0 .1-.05.158-.143.194l-.429.138zm-.487-.534H5.284a1.17 1.17 0 00-.242-.445.912.912 0 00-.978-.263L2.85 1.327A3.238 3.238 0 014.353.963c1.788 0 3.192 1.391 3.293 3.186zM2.47 7.154c-.86-.609-1.414-1.633-1.414-2.8 0-1.177.558-2.201 1.427-2.806l1.219 2.12a.964.964 0 00-.315.702c0 .265.113.503.327.709L2.47 7.154zM4.353 4.9a.535.535 0 01-.526-.534.527.527 0 11.868.407.525.525 0 01-.342.127z" clip-rule="evenodd"/><path fill="#000000" fill-rule="evenodd" d="M12.017 17.717c-.025.162-.105.255-.252.28-.165.018-.275-.038-.342-.168l-.331-.646c-.178.018-.35.03-.52.03a4.74 4.74 0 01-.521-.03l-.337.646c-.061.13-.171.186-.33.167-.153-.024-.24-.117-.258-.279l-.104-.708a6.459 6.459 0 01-.98-.367l-.52.479c-.11.105-.227.118-.38.043A.269.269 0 017 16.959a.468.468 0 01.002-.142l.147-.703a5.538 5.538 0 01-.802-.677l-.643.274c-.141.068-.257.037-.374-.1a.266.266 0 01-.088-.212.325.325 0 01.064-.16l.374-.61a5.595 5.595 0 01-.515-.92l-.716.038c-.153.006-.258-.062-.306-.211-.031-.098-.028-.18.009-.25a.318.318 0 01.1-.11l.552-.454a5.767 5.767 0 01-.172-1.037l-.673-.224c-.153-.05-.227-.143-.227-.304 0-.162.074-.255.227-.311l.673-.218a5.77 5.77 0 01.172-1.037l-.551-.453c-.13-.087-.166-.205-.11-.354.035-.108.099-.174.19-.2a.376.376 0 01.116-.012l.716.031a5.79 5.79 0 01.515-.92l-.38-.614c-.08-.118-.073-.249.03-.36.117-.137.233-.168.374-.1l.643.267c.245-.248.52-.478.802-.677l-.147-.696c-.024-.16.018-.28.141-.347.147-.075.27-.063.38.049l.52.46c.319-.15.65-.26.98-.354l.104-.709c.018-.161.105-.254.251-.279.166-.019.276.037.337.162l.337.646c.104-.007.204-.015.304-.02.071-.003.143-.005.216-.005.172 0 .344.012.52.025l.332-.646c.067-.125.177-.18.336-.162.147.025.233.118.258.28l.097.708c.337.093.668.21.98.354l.521-.466c.11-.112.233-.124.38-.043.082.043.129.108.145.19a.429.429 0 01-.005.157l-.14.696c.281.2.551.429.796.677l.649-.267c.135-.068.257-.037.373.1.076.081.1.174.074.266a.347.347 0 01-.05.1l-.379.609c.202.292.373.59.52.92l.711-.032a.347.347 0 01.148.023.284.284 0 01.164.189c.043.149.006.267-.11.354l-.557.453c.085.335.153.677.178 1.044l.673.21a.335.335 0 01.195.161.337.337 0 01.032.15c0 .156-.08.25-.227.305l-.673.217c-.025.361-.087.715-.178 1.044l.557.454c.116.093.16.211.11.36-.048.15-.159.217-.312.211l-.71-.037a5.628 5.628 0 01-.52.92l.379.608c.092.13.08.261-.025.373-.116.137-.238.168-.373.1l-.65-.274a5.493 5.493 0 01-.795.678l.14.702c.03.161-.012.279-.14.347-.147.075-.27.062-.38-.043l-.52-.479c-.313.15-.644.274-.98.36l-.098.715zm.018-6.877h3.71c-.158-2.82-2.363-5.007-5.174-5.007-.857 0-1.66.204-2.363.571l1.91 3.324c.184-.056.319-.075.447-.075.692 0 1.25.454 1.47 1.187zm-6.644.323c0 1.833.87 3.442 2.222 4.398L9.567 12.3c-.336-.323-.514-.696-.514-1.112 0-.41.17-.795.496-1.106l-1.917-3.33c-1.366.95-2.241 2.56-2.241 4.41zm4.354.019c0 .465.386.838.826.838a.839.839 0 00.832-.839.828.828 0 00-.832-.826.834.834 0 00-.826.827zm-1.55 4.727a5.058 5.058 0 002.376.578c2.805 0 5.01-2.187 5.175-4.988H12.04c-.208.758-.771 1.223-1.476 1.223-.122 0-.257-.012-.428-.062l-1.942 3.25z" clip-rule="evenodd"/></svg>PKBA#]�+;��8system/helixultimate/assets/images/icons/custom_code.svgnu�[���<svg width="20" height="16" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M8.12025 14.888L12.2765 0.628223C12.3517 0.354785 12.2286 0.0950196 11.9689 0.0198243C11.716 -0.055371 11.4562 0.0881837 11.381 0.368457L7.22474 14.6282C7.14955 14.9017 7.27259 15.1546 7.53236 15.2366C7.78529 15.3118 8.04505 15.1683 8.12025 14.888ZM14.0675 12.762L19.3243 8.0042C19.5636 7.79228 19.5568 7.45732 19.3243 7.23857L14.0675 2.4876C13.8488 2.28936 13.5548 2.29619 13.3771 2.49443C13.1994 2.69951 13.2267 2.98662 13.4318 3.17119L18.3468 7.62139L13.4318 12.0716C13.2267 12.263 13.1994 12.5501 13.3771 12.7483C13.5548 12.9534 13.8488 12.9534 14.0675 12.762ZM6.12416 12.762C6.30189 12.5569 6.27455 12.2698 6.06947 12.0784L1.15443 7.63506L6.06947 3.18486C6.27455 2.99346 6.30189 2.70635 6.12416 2.50127C5.94642 2.30303 5.65248 2.30303 5.44056 2.49443L0.176889 7.24541C-0.0623686 7.46416 -0.0555327 7.79912 0.176889 8.01787L5.44056 12.7688C5.65248 12.9671 5.94642 12.9603 6.12416 12.762Z" fill="#000000"/> </svg> PKBA#]��4Ncc8system/helixultimate/assets/images/icons/image-large.svgnu�[���<svg xmlns="http://www.w3.org/2000/svg" width="48" height="32" fill="none"><path fill="#36F" fill-opacity=".1" d="M24.042 4.5c0 2.485-2.135 4.5-4.77 4.5-2.634 0-4.77-2.015-4.77-4.5S16.638 0 19.272 0c2.635 0 4.77 2.015 4.77 4.5z"/><path fill="#36F" fill-opacity=".15" d="M11.5 16L23 32H0l11.5-16z"/><path fill="#EFF4FB" d="M33.5 8L48 32H19L33.5 8z"/></svg>PKBA#]��x�8system/helixultimate/assets/images/icons/image-small.svgnu�[���<svg xmlns="http://www.w3.org/2000/svg" width="27" height="19" fill="none"><path fill="#36F" fill-opacity=".15" d="M6.5 9L13 19H0L6.5 9z"/><path fill="#EFF4FB" d="M18.5 5L27 19H10l8.5-14z"/><path fill="#36F" fill-opacity=".1" d="M13 2.5a2.5 2.5 0 11-5 0 2.5 2.5 0 015 0z"/></svg>PKBA#]��v�``1system/helixultimate/assets/images/icons/blog.svgnu�[���<svg width="19" height="16" viewBox="0 0 19 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M17.9233 6.75707L18.4261 6.24754C18.6675 5.99947 18.6675 5.67096 18.4328 5.44301L18.2719 5.28211C18.0574 5.06757 17.7222 5.08768 17.4942 5.31563L16.9914 5.81175L17.9233 6.75707ZM10.22 13.7028L11.5877 13.0927L17.4272 7.2599L16.4886 6.32799L10.6558 12.1608L10.0121 13.4816C9.9585 13.5955 10.0926 13.7564 10.22 13.7028Z" fill="#000000"/> <path d="M3.72412 4.24072H9.2832C9.53955 4.24072 9.72998 4.03564 9.72998 3.7793C9.72998 3.53027 9.53955 3.33984 9.2832 3.33984H3.72412C3.46045 3.33984 3.27002 3.53027 3.27002 3.7793C3.27002 4.03564 3.46045 4.24072 3.72412 4.24072ZM3.72412 6.79688H9.2832C9.53955 6.79688 9.72998 6.5918 9.72998 6.33545C9.72998 6.08643 9.53955 5.896 9.2832 5.896H3.72412C3.46045 5.896 3.27002 6.08643 3.27002 6.33545C3.27002 6.5918 3.46045 6.79688 3.72412 6.79688ZM3.72412 9.35303H6.35352C6.61719 9.35303 6.80762 9.15527 6.80762 8.90625C6.80762 8.6499 6.61719 8.45215 6.35352 8.45215H3.72412C3.46045 8.45215 3.27002 8.6499 3.27002 8.90625C3.27002 9.15527 3.46045 9.35303 3.72412 9.35303Z" fill="#000000"/> <path d="M11.0488 15.7031H2.27051C0.754395 15.7031 0 14.9414 0 13.4106V2.2998C0 0.776367 0.761719 0 2.27051 0H11.0488C12.5649 0 13.3193 0.776367 13.3193 2.2998V7.63232L12.1597 8.75809L12.1401 2.32178C12.1401 1.58936 11.752 1.1792 10.9902 1.1792H2.3291C1.56738 1.1792 1.1792 1.59668 1.1792 2.32178V13.3887C1.1792 14.1211 1.56738 14.5239 2.32178 14.5239H10.9976C11.752 14.5239 12.1401 14.3887 12.1401 14.3887L13.3193 13.4269V13.4106C13.3193 14.9414 12.5649 15.7031 11.0488 15.7031Z" fill="#000000"/> </svg> PKBA#]��y 5system/helixultimate/assets/images/icons/advanced.svgnu�[���<svg height="18" width="18" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 18 18"><path fill="#000000" fill-rule="evenodd" d="M8.133 4.683l-.005.07c-.17.006-.339.023-.504.05a3.67 3.67 0 00.022-.235H5.288c-.132.483-.49.779-.939.779a.944.944 0 01-.273-.04L2.841 7.376a3.138 3.138 0 001.334.363c-.049.147-.09.297-.122.451l-.031-.003-.214.411a.185.185 0 01-.081.088c-.036.018-.08.024-.13.018-.097-.015-.152-.074-.163-.178l-.067-.45a4.067 4.067 0 01-.623-.233l-.332.304c-.07.067-.144.075-.242.028-.077-.044-.105-.119-.089-.222l.094-.446a4.24 4.24 0 01-.314-.245 2.991 2.991 0 01-.197-.186l-.41.174c-.089.043-.163.024-.237-.064-.07-.07-.074-.153-.016-.237l.238-.387a3.509 3.509 0 01-.327-.585l-.456.023c-.098.004-.164-.04-.195-.134-.03-.099-.008-.174.07-.229l.351-.289a3.654 3.654 0 01-.11-.66l-.428-.142c-.06-.02-.101-.05-.124-.095A.223.223 0 010 4.351c0-.103.047-.162.144-.198l.429-.138a3.791 3.791 0 01.11-.66L.33 3.066c-.081-.055-.105-.13-.07-.225.031-.095.097-.139.195-.134l.456.019c.094-.21.202-.399.327-.585L.998 1.75c-.051-.076-.047-.158.02-.23.073-.087.147-.106.237-.063l.409.17c.156-.158.331-.304.51-.43L2.082.753c-.01-.072-.001-.13.032-.173a.184.184 0 01.057-.05c.094-.046.172-.039.242.033l.332.292c.202-.095.413-.166.623-.225l.067-.45c.011-.104.066-.163.16-.179a.228.228 0 01.14.022.183.183 0 01.074.081l.214.411.02-.001.14-.01C4.238.503 4.295.5 4.352.5c.107 0 .212.008.32.016h.012l.21-.411c.044-.079.114-.115.215-.103.093.016.148.075.163.178l.063.45a4.475 4.475 0 01.624.226l.33-.296c.071-.072.149-.08.242-.028.082.044.11.118.09.222l-.09.442c.18.127.351.273.507.43l.413-.17c.086-.042.164-.023.238.065a.195.195 0 01.05.087c.01.047-.001.097-.035.146l-.241.387c.128.186.237.376.33.585l.453-.02c.097-.004.168.04.199.135a.216.216 0 010 .136.199.199 0 01-.07.09l-.355.288c.054.213.097.43.113.664l.429.134c.05.02.089.047.113.084a.2.2 0 01.03.114c0 .1-.05.158-.143.194l-.429.138zm-.487-.534H5.284a1.17 1.17 0 00-.242-.445.912.912 0 00-.978-.263L2.85 1.327A3.238 3.238 0 014.353.963c1.788 0 3.192 1.391 3.293 3.186zM2.47 7.154c-.86-.609-1.414-1.633-1.414-2.8 0-1.177.558-2.201 1.427-2.806l1.219 2.12a.964.964 0 00-.315.702c0 .265.113.503.327.709L2.47 7.154zM4.353 4.9a.535.535 0 01-.526-.534.527.527 0 11.868.407.525.525 0 01-.342.127z" clip-rule="evenodd"/><path fill="#000000" fill-rule="evenodd" d="M12.017 17.717c-.025.162-.105.255-.252.28-.165.018-.275-.038-.342-.168l-.331-.646c-.178.018-.35.03-.52.03a4.74 4.74 0 01-.521-.03l-.337.646c-.061.13-.171.186-.33.167-.153-.024-.24-.117-.258-.279l-.104-.708a6.459 6.459 0 01-.98-.367l-.52.479c-.11.105-.227.118-.38.043A.269.269 0 017 16.959a.468.468 0 01.002-.142l.147-.703a5.538 5.538 0 01-.802-.677l-.643.274c-.141.068-.257.037-.374-.1a.266.266 0 01-.088-.212.325.325 0 01.064-.16l.374-.61a5.595 5.595 0 01-.515-.92l-.716.038c-.153.006-.258-.062-.306-.211-.031-.098-.028-.18.009-.25a.318.318 0 01.1-.11l.552-.454a5.767 5.767 0 01-.172-1.037l-.673-.224c-.153-.05-.227-.143-.227-.304 0-.162.074-.255.227-.311l.673-.218a5.77 5.77 0 01.172-1.037l-.551-.453c-.13-.087-.166-.205-.11-.354.035-.108.099-.174.19-.2a.376.376 0 01.116-.012l.716.031a5.79 5.79 0 01.515-.92l-.38-.614c-.08-.118-.073-.249.03-.36.117-.137.233-.168.374-.1l.643.267c.245-.248.52-.478.802-.677l-.147-.696c-.024-.16.018-.28.141-.347.147-.075.27-.063.38.049l.52.46c.319-.15.65-.26.98-.354l.104-.709c.018-.161.105-.254.251-.279.166-.019.276.037.337.162l.337.646c.104-.007.204-.015.304-.02.071-.003.143-.005.216-.005.172 0 .344.012.52.025l.332-.646c.067-.125.177-.18.336-.162.147.025.233.118.258.28l.097.708c.337.093.668.21.98.354l.521-.466c.11-.112.233-.124.38-.043.082.043.129.108.145.19a.429.429 0 01-.005.157l-.14.696c.281.2.551.429.796.677l.649-.267c.135-.068.257-.037.373.1.076.081.1.174.074.266a.347.347 0 01-.05.1l-.379.609c.202.292.373.59.52.92l.711-.032a.347.347 0 01.148.023.284.284 0 01.164.189c.043.149.006.267-.11.354l-.557.453c.085.335.153.677.178 1.044l.673.21a.335.335 0 01.195.161.337.337 0 01.032.15c0 .156-.08.25-.227.305l-.673.217c-.025.361-.087.715-.178 1.044l.557.454c.116.093.16.211.11.36-.048.15-.159.217-.312.211l-.71-.037a5.628 5.628 0 01-.52.92l.379.608c.092.13.08.261-.025.373-.116.137-.238.168-.373.1l-.65-.274a5.493 5.493 0 01-.795.678l.14.702c.03.161-.012.279-.14.347-.147.075-.27.062-.38-.043l-.52-.479c-.313.15-.644.274-.98.36l-.098.715zm.018-6.877h3.71c-.158-2.82-2.363-5.007-5.174-5.007-.857 0-1.66.204-2.363.571l1.91 3.324c.184-.056.319-.075.447-.075.692 0 1.25.454 1.47 1.187zm-6.644.323c0 1.833.87 3.442 2.222 4.398L9.567 12.3c-.336-.323-.514-.696-.514-1.112 0-.41.17-.795.496-1.106l-1.917-3.33c-1.366.95-2.241 2.56-2.241 4.41zm4.354.019c0 .465.386.838.826.838a.839.839 0 00.832-.839.828.828 0 00-.832-.826.834.834 0 00-.826.827zm-1.55 4.727a5.058 5.058 0 002.376.578c2.805 0 5.01-2.187 5.175-4.988H12.04c-.208.758-.771 1.223-1.476 1.223-.122 0-.257-.012-.428-.062l-1.942 3.25z" clip-rule="evenodd"/></svg>PKBA#]" ����.system/helixultimate/assets/images/favicon.iconu�[����PNG IHDR�asRGB��� pHYs��$iTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0"> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:tiff="http://ns.adobe.com/tiff/1.0/" xmlns:exif="http://ns.adobe.com/exif/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmp="http://ns.adobe.com/xap/1.0/"> <tiff:ResolutionUnit>2</tiff:ResolutionUnit> <tiff:Compression>5</tiff:Compression> <tiff:XResolution>72</tiff:XResolution> <tiff:Orientation>1</tiff:Orientation> <tiff:YResolution>72</tiff:YResolution> <exif:PixelXDimension>16</exif:PixelXDimension> <exif:ColorSpace>1</exif:ColorSpace> <exif:PixelYDimension>16</exif:PixelYDimension> <dc:subject> <rdf:Seq/> </dc:subject> <xmp:ModifyDate>2015:03:15 13:03:46</xmp:ModifyDate> <xmp:CreatorTool>Pixelmator 3.3.1</xmp:CreatorTool> </rdf:Description> </rdf:RDF> </x:xmpmeta> >Iv]XIDAT8}�]h\E�ϙ�{wﺻI]m�XClK4�RE�w-E��(->�f|)y�~(Z�"ȢA�R�h�Z�B46M��-$ӆ6&-k41����c�xn��S��\����s��g;^��t}�Pc{���յ�� �uQ��{VJ�5"I"�:�����X���7���O))����:L;�j8�lQ�P ��%!��럒|2��qye��4��m�m<3�@�!��$�+c粒���J�ۤ-S�R��Hk�A8$��k��� )��[�O�/�ov,�6�˔�}�O0|� ��n�����N�ҀF�{Ӂ�{ǽLK�)��{�|�G�� ʭ�"W���?��X-����Y�W�~Rn�2�˰o.� x�*S߇�Kê: �4`DF�oԝ.(Y�&pKq��ѵX�n���9�bbn��|��cc�N��ݛZĴ�&��ܖۑ�t�B���Trj]ޱ*�Sxqd�w?�� p�|���n�)3^E8Y��⑷g"rU`Wn�A�O�5���?�H�lpY[��Q8��+��]��r�q�oޱe��t����j Z�G�O\}�����r���7�wَ�C����V6t�b70j�#Ū�!��_WH+��R����F&/������Ϗ��j.9W���xZA!�/�W> `[�X;���GP���w6�V���R�{4w�e��WD�0�Α�h�������Lȣ��%J�Л��z����=i ZϰŠ��Q����^"���O:58՛�k��~h���l`M��ǽS�qV1DZ���m���hb��w�yu�K����o��;�������DS(IEND�B`�PKBA#]d^:system/helixultimate/assets/images/helix-ultimate-logo.svgnu�[���<svg width="112" height="29" viewBox="0 0 112 29" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M103.249 9H98.5908V8.35059L101.052 5.61621C101.416 5.2028 101.667 4.86751 101.804 4.61035C101.944 4.34993 102.014 4.08138 102.014 3.80469C102.014 3.43359 101.901 3.12923 101.677 2.8916C101.452 2.65397 101.153 2.53516 100.778 2.53516C100.329 2.53516 99.9792 2.66374 99.7285 2.9209C99.4811 3.1748 99.3574 3.52962 99.3574 3.98535H98.4541C98.4541 3.33105 98.6641 2.80208 99.084 2.39844C99.5072 1.99479 100.072 1.79297 100.778 1.79297C101.439 1.79297 101.962 1.96712 102.346 2.31543C102.73 2.66048 102.922 3.12109 102.922 3.69727C102.922 4.39714 102.476 5.23047 101.584 6.19727L99.6797 8.2627H103.249V9ZM104.318 8.52637C104.318 8.37012 104.364 8.23991 104.455 8.13574C104.549 8.03158 104.689 7.97949 104.875 7.97949C105.061 7.97949 105.201 8.03158 105.295 8.13574C105.393 8.23991 105.441 8.37012 105.441 8.52637C105.441 8.67611 105.393 8.80143 105.295 8.90234C105.201 9.00326 105.061 9.05371 104.875 9.05371C104.689 9.05371 104.549 9.00326 104.455 8.90234C104.364 8.80143 104.318 8.67611 104.318 8.52637ZM111.301 5.96777C111.301 7.02572 111.12 7.81185 110.759 8.32617C110.397 8.84049 109.833 9.09766 109.064 9.09766C108.306 9.09766 107.744 8.84701 107.38 8.3457C107.015 7.84115 106.826 7.08919 106.813 6.08984V4.88379C106.813 3.83887 106.994 3.0625 107.355 2.55469C107.717 2.04688 108.283 1.79297 109.055 1.79297C109.82 1.79297 110.383 2.03874 110.744 2.53027C111.105 3.01855 111.291 3.77376 111.301 4.7959V5.96777ZM110.397 4.73242C110.397 3.96745 110.29 3.41081 110.075 3.0625C109.86 2.71094 109.52 2.53516 109.055 2.53516C108.592 2.53516 108.256 2.70931 108.044 3.05762C107.832 3.40592 107.723 3.94141 107.717 4.66406V6.10938C107.717 6.8776 107.827 7.44564 108.049 7.81348C108.273 8.17806 108.612 8.36035 109.064 8.36035C109.51 8.36035 109.841 8.18783 110.056 7.84277C110.274 7.49772 110.388 6.9541 110.397 6.21191V4.73242Z" fill="#3A3A19"/> <path fill-rule="evenodd" clip-rule="evenodd" d="M6.97765 19.45C6.93863 18.636 7.21068 15.8819 11.7099 13.6707C16.2091 11.4607 16.6741 9.67554 16.6741 9.67554C16.2091 12.1197 15.433 12.8188 11.1669 15.1058C7.10012 17.2877 6.97765 19.45 6.97765 19.45Z" fill="#2A98FE"/> <path fill-rule="evenodd" clip-rule="evenodd" d="M6.97765 24.1431C6.97765 24.1431 7.10012 21.9808 11.1669 19.7989C15.433 17.5108 16.2091 16.8117 16.6741 14.3687C16.6741 14.3687 16.2091 16.1538 11.7099 18.3638C7.21068 20.575 6.93863 23.328 6.97765 24.1431Z" fill="#2A98FE"/> <mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="0" y="4" width="25" height="24"> <path d="M0 4H24.0015V28H0V4Z" fill="white"/> </mask> <g mask="url(#mask0)"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12.0008 27.9998C5.38365 27.9998 0 22.6173 0 16.0012C0 9.38304 5.38365 3.99939 12.0008 3.99939C18.6179 3.99939 24.0015 9.38304 24.0015 16.0012C24.0015 22.6173 18.6179 27.9998 12.0008 27.9998ZM12.0008 5.21767C6.05566 5.21767 1.21829 10.054 1.21829 16.0012C1.21829 21.9452 6.05566 26.7826 12.0008 26.7826C17.9459 26.7826 22.7832 21.9452 22.7832 16.0012C22.7832 10.054 17.9459 5.21767 12.0008 5.21767Z" fill="#2A98FF"/> </g> <path fill-rule="evenodd" clip-rule="evenodd" d="M45.5397 16.266V10.7253H39.6306V16.266H36V2.0007H39.6306V7.86968H45.5397V2.0007H49.1612V16.266H45.5397Z" fill="#2A98FF"/> <path fill-rule="evenodd" clip-rule="evenodd" d="M54.6184 4.85471V7.69027H61.4228V10.545H54.6184V13.4106H62.3783V16.2663H50.9877V2H62.1595V4.85471H54.6184Z" fill="#2A98FF"/> <path fill-rule="evenodd" clip-rule="evenodd" d="M73.3776 13.2315V16.2658H63.6974V2.00046H67.329V13.2315H73.3776Z" fill="#2A98FF"/> <path fill-rule="evenodd" clip-rule="evenodd" d="M74.6783 16.2656H78.309V2.00024H74.6783V16.2656Z" fill="#2A98FF"/> <path fill-rule="evenodd" clip-rule="evenodd" d="M94.1245 16.266H89.7872L86.7028 11.7191L83.6283 16.266H79.4105L84.5045 8.97382L79.7388 2.0007H83.9575L86.7028 6.15831L89.4581 2.0007H93.716L89.0113 8.80423L94.1245 16.266Z" fill="#2A98FF"/> <path d="M40.7774 21.4986V25.9896C40.7744 26.4324 40.6765 26.8179 40.4838 27.1463C40.291 27.4746 40.0184 27.7276 39.666 27.9053C39.3166 28.08 38.9145 28.1674 38.4596 28.1674C37.7669 28.1674 37.2111 27.9791 36.7925 27.6026C36.3768 27.2231 36.1614 26.699 36.1464 26.0303V21.4986H36.6976V25.949C36.6976 26.5032 36.8557 26.9339 37.172 27.2411C37.4882 27.5454 37.9175 27.6975 38.4596 27.6975C39.0018 27.6975 39.4295 27.5439 39.7428 27.2366C40.0591 26.9294 40.2172 26.5017 40.2172 25.9535V21.4986H40.7774Z" fill="black"/> <path d="M45.4783 27.6071H48.7268V28.077H44.918V21.4986H45.4783V27.6071Z" fill="black"/> <path d="M55.6054 21.973H53.3509V28.077H52.7951V21.973H50.5451V21.4986H55.6054V21.973Z" fill="black"/> <path d="M59.9403 28.077H59.3846V21.4986H59.9403V28.077Z" fill="black"/> <path d="M65.0568 21.4986L67.4831 27.3044L69.9183 21.4986H70.6593V28.077H70.1036V25.2125L70.1488 22.2757L67.6999 28.077H67.2707L64.8309 22.2983L64.8761 25.1944V28.077H64.3204V21.4986H65.0568Z" fill="black"/> <path d="M78.55 26.2336H75.5635L74.8857 28.077H74.3029L76.7924 21.4986H77.321L79.8105 28.077H79.2322L78.55 26.2336ZM75.7352 25.7592H78.3737L77.0545 22.1763L75.7352 25.7592Z" fill="black"/> <path d="M87.2493 21.973H84.9948V28.077H84.4391V21.973H82.189V21.4986H87.2493V21.973Z" fill="black"/> <path d="M94.5391 24.9233H91.4622V27.6071H94.9999V28.077H90.9065V21.4986H94.9773V21.973H91.4622V24.4535H94.5391V24.9233Z" fill="black"/> </svg> PKBA#]�5����7system/helixultimate/assets/images/chosen-sprite@2x.pngnu�[����PNG IHDRhJ�q��IDATh�횿o�@�#�P � �����?!d�ԅ�sft⇿'R�J0�#[���Ɉ��+��������P����{R�W%����ދ��1�e,�J4�h��'�Y�2�Ny�H%?��/�4�� L�j�[�� -�85H�q���H�����qȱ�s���6�C+�%0��`QW�X����O�5�� �]:ڿ��h���Ig���7�oi���� 1n� ���f���Hn�' �!-�� hjh؝l�n��zH���A��oj��Q�FEæ�����hH '��wԲt�c �8�H۪�/�4�� L�j��`$�8�� q�iD�S %N��9 �J�1Sp̶�;X�k}\kN[�[�t���������k�%��s�F<Uk��}dvǢ�W���b��?�O/n&� �0p)/��Pyf'��~�|��|+a�C�˒�bKq��SB>��p��3�K�X��R~����C�gY�Ƭ��,�9���A%w;8Q�h�H�,�]n�p��Y��>�$�c ��)�ƒ�K�hw~��S�ʼn�q��P�*�w�Ҷ�����X�y{$���u�%�&�Z����'������(�8���֜�b��ҍ၊�5R6�emP�0�<�F�-F�� i��#� ��z�H�|��Y��JZ�\N��IEND�B`�PKBA#]��PU >system/helixultimate/assets/images/helix-ultimate-logo-alt.svgnu�[���<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" clip-rule="evenodd" d="M6.97765 15.4498C6.93863 14.6358 7.21068 11.8816 11.7099 9.67049C16.2091 7.46045 16.6741 5.67529 16.6741 5.67529C16.2091 8.11945 15.433 8.81856 11.1669 11.1055C7.10012 13.2874 6.97765 15.4498 6.97765 15.4498Z" fill="#2A98FE"/> <path fill-rule="evenodd" clip-rule="evenodd" d="M6.97765 20.1431C6.97765 20.1431 7.10012 17.9808 11.1669 15.7989C15.433 13.5108 16.2091 12.8117 16.6741 10.3687C16.6741 10.3687 16.2091 12.1538 11.7099 14.3638C7.21068 16.575 6.93863 19.328 6.97765 20.1431Z" fill="#2A98FE"/> <mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="25" height="24"> <path d="M0 0H24.0015V24H0V0Z" fill="white"/> </mask> <g mask="url(#mask0)"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12.0008 23.9999C5.38365 23.9999 0 18.6174 0 12.0014C0 5.38316 5.38365 -0.000488281 12.0008 -0.000488281C18.6179 -0.000488281 24.0015 5.38316 24.0015 12.0014C24.0015 18.6174 18.6179 23.9999 12.0008 23.9999ZM12.0008 1.2178C6.05566 1.2178 1.21829 6.05408 1.21829 12.0014C1.21829 17.9454 6.05566 22.7827 12.0008 22.7827C17.9459 22.7827 22.7832 17.9454 22.7832 12.0014C22.7832 6.05408 17.9459 1.2178 12.0008 1.2178Z" fill="#2A98FF"/> </g> </svg> PKBA#]�}��=system/helixultimate/assets/images/mega-menu-color-select.jpgnu�[������JFIF��� &""&0-0>>T &""&0-0>>T��.�"�� �����K5T�֮��������UI=j�;u��WN�јO�Cb�>�����T���s��h��Q#+`�יN|��M�2���3M$(�k�[�#ٌ�4�B��=u�Uӆ��f�Pػ����p�6�κ����T�3 ��l]��_U]8j�\�����4&Fu� �GMM �������/4Ts�!��5D���"1Q ��?�3ˣ�!�v�n�Ȋe1S9�J@��"��2��5u�=I5�2����s �<��qrg�G`E.Tڷ!�7��@���y�/ϳ+o��㋑�X��~R��S����.���X�3pB qH����d'1�E��em�I�4�Y2*��L�F��ɞ]���I��"��P�)@�)E��em�&ytv9n܍�9L�*g0 H ��_�fV�1F����&��Q3Z�a1G���.L����ʛV�;b&���Q��9E��em�@�qr"��|O�S��s�\����rg�G`T��D�UP�f���j�<"Z���U�q��-T'�!���c�����7'����4=�#W���W�����c�m�N���,_��p�8�F���/�ڮ�+�ڪo��t�L�m�I�[smbuUM�b�Π�����5\M�~N��_e��0ճ���s��JEcJ 3�_Y���T�3Q4T"�̈Q�a�ϔ\_e��1D�Fnu�)S,��ؾ��#�"�߀ �V�nׇ�Jr��r����(�&չ���A5��D$�q}g�GxE$����)�D�fG!D�R�(���-�a���n��e1S!Dp��b��0�����r��NtT)H�c Ds��<�;����j&��UCY� 6�2���(�(�ι"�bc�����y�w�R�{�� �-��)N_�NQq}�[`��Ym�S���UBy������j���}W�ޮ!�H�P�X���j}�s�~����h�����\G�KW�\3�>��� Ɖ���<�H��xD�{U�>���W㋤Z�O,C��5>�9�?Uopn4O�U �h{�F�#�%�ڮ�_z��� 1��?��N�LLLj������P��?��PKBA#].��N� � /system/helixultimate/assets/images/icon-res.svgnu�[���<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M1.27529 13.4267H5.07118V14.8768H3.72817C3.64578 14.8768 3.56676 14.9096 3.5085 14.968C3.45024 15.0265 3.41751 15.1057 3.41751 15.1884C3.41751 15.271 3.45024 15.3503 3.5085 15.4087C3.56676 15.4672 3.64578 15.5 3.72817 15.5H8.60628C8.62976 15.4981 8.65293 15.4934 8.67531 15.486C8.7209 15.4935 8.76691 15.4982 8.81306 15.5H12.2234C12.2619 15.4995 12.2999 15.4918 12.3355 15.4773C12.4093 15.4913 12.4842 15.4989 12.5593 15.5H14.6853C15.0338 15.4996 15.368 15.3605 15.6145 15.1133C15.861 14.8661 15.9996 14.5309 16 14.1812V10.1004C15.9993 9.83238 15.9171 9.57095 15.7644 9.35099C15.6118 9.13102 15.3959 8.96298 15.1456 8.86928V5.91345C15.1448 5.70036 15.0852 5.49164 14.9733 5.31051C14.8614 5.12937 14.7016 4.98291 14.5117 4.88742V2.02911C14.5113 1.68997 14.3769 1.36484 14.1378 1.12504C13.8987 0.885244 13.5746 0.750367 13.2365 0.75H1.27529C0.937193 0.750364 0.613048 0.88524 0.373967 1.12504C0.134886 1.36484 0.000394711 1.68997 0 2.02912V12.1474C0.000344042 12.4866 0.134811 12.8117 0.373896 13.0516C0.612981 13.2914 0.937156 13.4264 1.27529 13.4267V13.4267ZM5.6925 14.8768V13.4267H7.6618V14.3453C7.6631 14.5309 7.70955 14.7133 7.79711 14.8768L5.6925 14.8768ZM15.3787 10.1004V14.1812C15.3785 14.3656 15.3053 14.5424 15.1754 14.6728C15.0454 14.8032 14.8691 14.8765 14.6853 14.8768H12.5593C12.3755 14.8765 12.1993 14.8032 12.0693 14.6728C11.9393 14.5424 11.8662 14.3656 11.8659 14.1812V10.1004C11.8661 9.91596 11.9392 9.73912 12.0692 9.60867C12.1992 9.47823 12.3755 9.40484 12.5593 9.40461H14.6853C14.8692 9.40484 15.0454 9.47823 15.1754 9.60867C15.3054 9.73912 15.3785 9.91596 15.3787 10.1004V10.1004ZM14.5242 5.91345V8.78136H12.5593C12.2107 8.7818 11.8765 8.92093 11.6301 9.1682C11.3836 9.41548 11.245 9.75072 11.2446 10.1004V14.1812C11.2454 14.4276 11.3155 14.6687 11.4471 14.8768H8.81306C8.67257 14.8766 8.53787 14.8206 8.43852 14.721C8.33917 14.6213 8.28328 14.4862 8.28312 14.3453V5.91345C8.28327 5.7725 8.33915 5.63737 8.4385 5.53769C8.53785 5.43801 8.67255 5.38193 8.81306 5.38174H13.9943C14.1348 5.38193 14.2695 5.43801 14.3689 5.53769C14.4682 5.63737 14.5241 5.7725 14.5242 5.91345H14.5242ZM0.621325 2.02911C0.621567 1.85522 0.690548 1.68852 0.813141 1.56557C0.935734 1.44262 1.10193 1.37346 1.27529 1.37325H13.2365C13.4098 1.37346 13.576 1.44262 13.6986 1.56557C13.8212 1.68852 13.8902 1.85522 13.8904 2.02912V4.75849H8.81306C8.50782 4.75885 8.21518 4.88066 7.99935 5.09718C7.78352 5.3137 7.66212 5.60726 7.6618 5.91345V9.68677H0.621325V2.02911ZM0.621325 10.31H7.6618V12.8035H1.27529C1.10189 12.8033 0.935666 12.7341 0.813068 12.6111C0.690471 12.4881 0.621513 12.3213 0.621322 12.1474L0.621325 10.31Z" fill="black"/> </svg> PKBA#]�{���0system/helixultimate/assets/images/select-bg.svgnu�[���<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1854.54 295" preserveAspectRatio="xMinYMid" width="1854.54" height="295"><path d="M1825.1,145.7l6.9,6.9c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3-0.1l6.9-6.9c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3l-0.7-0.7c-0.1-0.1-0.2-0.1-0.3-0.1s-0.2,0-0.3,0.1l-5.8,5.8l-5.8-5.8c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.2,0-0.3,0.1l-0.7,0.7c-0.1,0.1-0.1,0.2-0.1,0.3C1824.9,145.5,1825,145.6,1825.1,145.7z" fill="#000"/><rect width="1810" height="295" fill="#fff"/></svg> PKBA#]K��Z��4system/helixultimate/assets/images/select-bg-rtl.svgnu�[���<svg xmlns="http://www.w3.org/2000/svg" width="1854.539" height="295" preserveAspectRatio="xMinYMin meet"><path d="M13.573 145.7l6.9 6.9c.1.1.2.1.3.1s.2 0 .3-.1l6.9-6.9c.1-.1.1-.2.1-.3s0-.2-.1-.3l-.7-.7c-.1-.1-.2-.1-.3-.1s-.2 0-.3.1l-5.8 5.8-5.8-5.8c-.1-.1-.2-.1-.3-.1s-.2 0-.3.1l-.7.7c-.1.1-.1.2-.1.3-.296.1-.195.2-.096.3h-.002z"/><path fill="#fff" d="M44.54 0h1810v295h-1810z"/></svg> PKBA#]�+<��9system/helixultimate/html/layouts/form/field/media_j3.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('JPATH_BASE') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; extract($displayData); // Load the modal behavior script. HTMLHelper::_('behavior.modal'); // Include jQuery HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'media/mediafield-mootools.min.js', array('version' => 'auto', 'relative' => true, 'framework' => true)); // Tooltip for INPUT showing whole image path $options = array( 'onShow' => 'jMediaRefreshImgpathTip', ); HTMLHelper::_('behavior.tooltip', '.hasTipImgpath', $options); if (!empty($class)) { $class .= ' form-control hasTipImgpath'; } else { $class = 'form-control hasTipImgpath'; } $attr = ''; $attr .= ' title="' . htmlspecialchars('<span id="TipImgpath"></span>', ENT_COMPAT, 'UTF-8') . '"'; // Initialize some field attributes. $attr .= !empty($class) ? ' class="input-small field-media-input ' . $class . '"' : ' class="input-small"'; $attr .= !empty($size) ? ' size="' . $size . '"' : ''; // Initialize JavaScript field attributes. $attr .= !empty($onchange) ? ' onchange="' . $onchange . '"' : ''; // The text field. echo '<div class="input-group">'; // The Preview. $showPreview = true; $showAsTooltip = false; switch ($preview) { case 'no': // Deprecated parameter value case 'false': case 'none': $showPreview = false; break; case 'yes': // Deprecated parameter value case 'true': case 'show': break; case 'tooltip': default: $showAsTooltip = true; $options = array( 'onShow' => 'jMediaRefreshPreviewTip', ); HTMLHelper::_('behavior.tooltip', '.hasTipPreview', $options); break; } // Pre fill the contents of the popover if ($showPreview) { if ($value && file_exists(JPATH_ROOT . '/' . $value)) { $src = Uri::root() . $value; } else { $src = ''; } $width = $previewWidth; $height = $previewHeight; $style = ''; $style .= ($width > 0) ? 'max-width:' . $width . 'px;' : ''; $style .= ($height > 0) ? 'max-height:' . $height . 'px;' : ''; $imgattr = array( 'id' => $id . '_preview', 'class' => 'media-preview', 'style' => $style, ); $img = HTMLHelper::_('image', $src, Text::_('JLIB_FORM_MEDIA_PREVIEW_ALT'), $imgattr); $previewImg = '<div id="' . $id . '_preview_img"' . ($src ? '' : ' style="display:none"') . '>' . $img . '</div>'; $previewImgEmpty = '<div id="' . $id . '_preview_empty"' . ($src ? ' style="display:none"' : '') . '>' . Text::_('JLIB_FORM_MEDIA_PREVIEW_EMPTY') . '</div>'; if ($showAsTooltip) { echo '<div class="media-preview input-group-text">'; $tooltip = $previewImgEmpty . $previewImg; $options = array( 'title' => Text::_('JLIB_FORM_MEDIA_PREVIEW_SELECTED_IMAGE'), 'text' => '<span class="icon-eye" aria-hidden="true"></span>', 'class' => 'input-group-text hasTipPreview' ); echo HTMLHelper::_('tooltip', $tooltip, $options); echo '</div>'; } else { echo '<div class="media-preview input-group-text" style="height:auto">'; echo ' ' . $previewImgEmpty; echo ' ' . $previewImg; echo '</div>'; } } echo ' <input type="text" name="' . $name . '" id="' . $id . '" value="' . htmlspecialchars($value ?? "", ENT_COMPAT, 'UTF-8') . '" readonly="readonly"' . $attr . ' data-basepath="' . Uri::root() . '"/>'; ?> <?php $modalLink = ''; if(!$readonly) { if(!$link) { $modalLink .= 'index.php?option=com_media&view=images&tmpl=component&asset=' . $asset . '&author=' . $authorField; } else { $modalLink .= $link; } $modalLink .= '&fieldid=' . $id . '&folder=' . $folder; } ?> <?php /** * Close the modal on selecting image * and clicking insert button */ Factory::getDocument()->addScriptDeclaration( " jQuery(function($) { window.parent.jModalClose = function(e) { let bsModal = $('.modal.show'); let mtModal = $('#sbox-window'); let frameContents = $('#sbox-content iframe').contents(); let isMediaModal = frameContents.find('body.com-media.view-images').length > 0; if (bsModal.length) { if (isMediaModal) { if ($('.img-preview.selected').length) { bsModal.modal('hide'); } } } else if (mtModal.length) { if (isMediaModal) { let imageListFrame = frameContents.find('iframe').contents().find('body.com-media.view-imagesList'); if (imageListFrame.find('.img-preview.selected').length) { SqueezeBox.close(); } } } } }); " ); ?> <div class="input-group-text bg-transparent border-0 ps-2"> <a class="modal modal-btn btn btn-primary me-2" title="<?php echo Text::_('JLIB_FORM_BUTTON_SELECT'); ?>" href="<?php echo $modalLink; ?>" rel="{handler: 'iframe', size: {x: 800, y: 500}}" style="display: block;"> <?php echo Text::_('JLIB_FORM_BUTTON_SELECT'); ?> </a> <a class="btn btn-secondary" title="<?php echo Text::_('JLIB_FORM_BUTTON_CLEAR'); ?>" href="#" onclick="jInsertFieldValue('', '<?php echo $id; ?>'); return false;" > <span class="fas fa-times" aria-hidden="true"></span> </a> </div> </div>PKBA#]��ee6system/helixultimate/html/layouts/form/field/media.phpnu�[���<?php /** * @package Joomla.Admin * @subpackage Layout * * @copyright (C) 2015 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\Helper\MediaHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; extract($displayData); /** * Layout variables * ----------------- * @var string $asset The asset text * @var string $authorField The label text * @var integer $authorId The author id * @var string $class The class text * @var boolean $disabled True if field is disabled * @var string $folder The folder text * @var string $id The label text * @var string $link The link text * @var string $name The name text * @var string $preview The preview image relative path * @var integer $previewHeight The image preview height * @var integer $previewWidth The image preview width * @var string $onchange The onchange text * @var boolean $readonly True if field is readonly * @var integer $size The size text * @var string $value The value text * @var string $src The path and filename of the image * @var array $mediaTypes The supported media types for the Media Manager * @var array $imagesExt The supported extensions for images * @var array $audiosExt The supported extensions for audios * @var array $videosExt The supported extensions for videos * @var array $documentsExt The supported extensions for documents * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-* */ $attr = ''; // Initialize some field attributes. $attr .= !empty($class) ? ' class="form-control field-media-input ' . $class . '"' : ' class="form-control field-media-input"'; $attr .= !empty($size) ? ' size="' . $size . '"' : ''; $attr .= $dataAttribute; // Initialize JavaScript field attributes. $attr .= !empty($onchange) ? ' onchange="' . $onchange . '"' : ''; switch ($preview) { case 'no': // Deprecated parameter value case 'false': case 'none': $showPreview = false; break; case 'yes': // Deprecated parameter value case 'true': case 'show': case 'tooltip': default: $showPreview = true; break; } // Pre fill the contents of the popover if ($showPreview) { $cleanValue = MediaHelper::getCleanMediaFieldValue($value); if ($cleanValue && file_exists(JPATH_ROOT . '/' . $cleanValue)) { $src = Uri::root() . $value; } else { $src = ''; } $width = $previewWidth; $height = $previewHeight; $style = ''; $style .= ($width > 0) ? 'max-width:' . $width . 'px;' : ''; $style .= ($height > 0) ? 'max-height:' . $height . 'px;' : ''; $imgattr = array( 'id' => $id . '_preview', 'class' => 'media-preview', 'style' => $style, ); $img = HTMLHelper::_('image', $src, Text::_('JLIB_FORM_MEDIA_PREVIEW_ALT'), $imgattr); $previewImg = '<div id="' . $id . '_preview_img">' . $img . '</div>'; $previewImgEmpty = '<div id="' . $id . '_preview_empty"' . ($src ? ' class="hidden"' : '') . '>' . Text::_('JLIB_FORM_MEDIA_PREVIEW_EMPTY') . '</div>'; $showPreview = 'static'; } // The url for the modal $url = ($readonly ? '' : ($link ?: 'index.php?option=com_media&view=media&tmpl=component&mediatypes=' . $mediaTypes . '&asset=' . $asset . '&author=' . $authorId) . '&fieldid={field-media-id}&path=' . $folder); // Correctly route the url to ensure it's correctly using sef modes and subfolders $url = Route::_($url); $doc = Factory::getDocument(); $wam = $doc->getWebAssetManager(); $wam->useScript('webcomponent.media-select'); Text::script('JFIELD_MEDIA_LAZY_LABEL'); Text::script('JFIELD_MEDIA_ALT_LABEL'); Text::script('JFIELD_MEDIA_ALT_CHECK_LABEL'); Text::script('JFIELD_MEDIA_ALT_CHECK_DESC_LABEL'); Text::script('JFIELD_MEDIA_CLASS_LABEL'); Text::script('JFIELD_MEDIA_FIGURE_CLASS_LABEL'); Text::script('JFIELD_MEDIA_FIGURE_CAPTION_LABEL'); Text::script('JFIELD_MEDIA_LAZY_LABEL'); Text::script('JFIELD_MEDIA_SUMMARY_LABEL'); Text::script('JFIELD_MEDIA_EMBED_CHECK_DESC_LABEL'); Text::script('JFIELD_MEDIA_DOWNLOAD_CHECK_DESC_LABEL'); Text::script('JFIELD_MEDIA_DOWNLOAD_CHECK_LABEL'); Text::script('JFIELD_MEDIA_EMBED_CHECK_LABEL'); Text::script('JFIELD_MEDIA_WIDTH_LABEL'); Text::script('JFIELD_MEDIA_TITLE_LABEL'); Text::script('JFIELD_MEDIA_HEIGHT_LABEL'); Text::script('JFIELD_MEDIA_UNSUPPORTED'); Text::script('JFIELD_MEDIA_DOWNLOAD_FILE'); Text::script('JLIB_APPLICATION_ERROR_SERVER'); Text::script('JLIB_FORM_MEDIA_PREVIEW_EMPTY', true); $modalHTML = HTMLHelper::_( 'bootstrap.renderModal', 'imageModal_' . $id, [ 'url' => $url, 'title' => Text::_('JLIB_FORM_CHANGE_IMAGE'), 'closeButton' => true, 'height' => '100%', 'width' => '100%', 'modalWidth' => '80', 'bodyHeight' => '60', 'footer' => '<button type="button" class="btn btn-success button-save-selected">' . Text::_('JSELECT') . '</button>' . '<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">' . Text::_('JCANCEL') . '</button>', ] ); $wam->useStyle('webcomponent.field-media') ->useScript('webcomponent.field-media'); if (count($doc->getScriptOptions('media-picker')) === 0) { $doc->addScriptOptions('media-picker', [ 'images' => $imagesExt, 'audios' => $audiosExt, 'videos' => $videosExt, 'documents' => $documentsExt, ]); } ?> <joomla-field-media class="field-media-wrapper hu-media-modal" type="image" <?php // @TODO add this attribute to the field in order to use it for all media types ?> base-path="<?php echo Uri::root(); ?>" root-folder="<?php echo ComponentHelper::getParams('com_media')->get('file_path', 'images'); ?>" url="<?php echo $url; ?>" modal-container=".modal" modal-width="100%" modal-height="400px" input=".field-media-input" button-select=".button-select" button-clear=".button-clear" button-save-selected=".button-save-selected" preview="static" preview-container=".field-media-preview" preview-width="<?php echo $previewWidth; ?>" preview-height="<?php echo $previewHeight; ?>" supported-extensions="<?php echo str_replace('"', '"', json_encode(['images' => $imagesAllowedExt, 'audios' => $audiosAllowedExt, 'videos' => $videosAllowedExt, 'documents' => $documentsAllowedExt])); ?> "> <?php echo $modalHTML; ?> <?php if ($showPreview) : ?> <div class="field-media-preview"> <?php echo ' ' . $previewImgEmpty; ?> <?php echo ' ' . $previewImg; ?> </div> <?php endif; ?> <div class="input-group hu-j4-media"> <input type="text" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars($value ?? "", ENT_COMPAT, 'UTF-8'); ?>" readonly="readonly" <?php echo $attr; ?>> <?php if ($disabled != true) : ?> <button type="button" class="btn btn-success button-select"><?php echo Text::_('JLIB_FORM_BUTTON_SELECT'); ?></button> <button type="button" class="btn btn-danger button-clear"><span class="icon-times" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('JLIB_FORM_BUTTON_CLEAR'); ?></span></button> <?php endif; ?> </div> </joomla-field-media> PKBA#]XU�&�Z�ZBsystem/helixultimate/html/layouts/libraries/cms/html/bootstrap.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Layout\LayoutHelper; /** * Utility class for Bootstrap elements. * * @since 3.0 */ abstract class HelixBootstrap { /** * @var array Array containing information for loaded files * @since 3.0 */ protected static $loaded = array(); /** * Add javascript support for Bootstrap alerts * * @param string $selector Common class for the alerts * * @return void * * @since 3.0 */ public static function alert($selector = 'alert') { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.alert', array($selector => '')); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap buttons * * @param string $selector Common class for the buttons * * @return void * * @since 3.1 */ public static function button($selector = 'button') { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.button', array($selector)); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap carousels * * @param string $selector Common class for the carousels. * @param array $params An array of options for the carousel. * Options for the carousel can be: * - interval number The amount of time to delay between automatically cycling an item. * If false, carousel will not automatically cycle. * - pause string Pauses the cycling of the carousel on mouseenter and resumes the cycling * of the carousel on mouseleave. * * @return void * * @since 3.0 */ public static function carousel($selector = 'carousel', $params = array()) { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['interval'] = isset($params['interval']) ? (int) $params['interval'] : 5000; $opt['pause'] = isset($params['pause']) ? $params['pause'] : 'hover'; Factory::getDocument()->addScriptOptions('bootstrap.carousel', array($selector => $opt)); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap dropdowns * * @param string $selector Common class for the dropdowns * * @return void * * @since 3.0 */ public static function dropdown($selector = 'dropdown-toggle') { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.dropdown', array($selector)); static::$loaded[__METHOD__][$selector] = true; } /** * Method to load the Bootstrap JavaScript framework into the document head * * If debugging mode is on an uncompressed version of Bootstrap is included for easier debugging. * * @param mixed $debug Is debugging mode on? [optional] * * @return void * * @since 3.0 */ public static function framework($debug = null) { // Only load once if (!empty(static::$loaded[__METHOD__])) { return; } $debug = (isset($debug) && $debug != JDEBUG) ? $debug : JDEBUG; // Load the needed scripts HTMLHelper::_('behavior.core'); HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'vendor/tether/tether.min.js', array('version' => 'auto', 'relative' => true, 'detectDebug' => $debug)); HTMLHelper::_('script', 'vendor/bootstrap/bootstrap.min.js', array('version' => 'auto', 'relative' => true, 'detectDebug' => $debug)); HTMLHelper::_('script', 'system/bootstrap-init.min.js', array('version' => 'auto', 'relative' => true, 'detectDebug' => $debug)); static::$loaded[__METHOD__] = true; } /** * Method to render a Bootstrap modal * * @param string $selector The ID selector for the modal. * @param array $params An array of options for the modal. * Options for the modal can be: * - title string The modal title * - backdrop mixed A boolean select if a modal-backdrop element should be included (default = true) * The string 'static' includes a backdrop which doesn't close the modal on click. * - keyboard boolean Closes the modal when escape key is pressed (default = true) * - closeButton boolean Display modal close button (default = true) * - animation boolean Fade in from the top of the page (default = true) * - footer string Optional markup for the modal footer * - url string URL of a resource to be inserted as an `<iframe>` inside the modal body * - height string height of the `<iframe>` containing the remote resource * - width string width of the `<iframe>` containing the remote resource * @param string $body Markup for the modal body. Appended after the `<iframe>` if the URL option is set * * @return string HTML markup for a modal * * @since 3.0 */ public static function renderModal($selector = 'modal', $params = array(), $body = '') { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); $layoutData = array( 'selector' => $selector, 'params' => $params, 'body' => $body, ); static::$loaded[__METHOD__][$selector] = true; return LayoutHelper::render('joomla.modal.main', $layoutData); } /** * Add javascript support for Bootstrap popovers * * Use element's Title as popover content * * @param string $selector Selector for the popover * @param array $params An array of options for the popover. * Options for the popover can be: * animation boolean apply a css fade transition to the popover * container string|boolean Appends the popover to a specific element: { container: 'body' } * content string|function default content value if `data-content` attribute isn't present * delay number|object delay showing and hiding the popover (ms) - does not apply to manual trigger type * If a number is supplied, delay is applied to both hide/show * Object structure is: delay: { show: 500, hide: 100 } * html boolean Insert HTML into the popover. If false, jQuery's text method will be used to insert * content into the dom. * placement string|function how to position the popover - top | bottom | left | right * selector string If a selector is provided, popover objects will be delegated to the specified targets. * template string Base HTML to use when creating the popover. * title string|function default title value if `title` tag isn't present * trigger string how popover is triggered - hover | focus | manual * constraints array An array of constraints - passed through to Tether. * offset string Offset of the popover relative to its target. * * @return void * * @since 3.0 */ public static function popover($selector = '.hasPopover', $params = array()) { // Only load once if (isset(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); $opt['animation'] = isset($params['animation']) ? $params['animation'] : null; $opt['container'] = isset($params['container']) ? $params['container'] : 'body'; $opt['content'] = isset($params['content']) ? $params['content'] : null; $opt['delay'] = isset($params['delay']) ? $params['delay'] : null; $opt['html'] = isset($params['html']) ? $params['html'] : true; $opt['placement'] = isset($params['placement']) ? $params['placement'] : null; $opt['selector'] = isset($params['selector']) ? $params['selector'] : null; $opt['template'] = isset($params['template']) ? $params['template'] : null; $opt['title'] = isset($params['title']) ? $params['title'] : null; $opt['trigger'] = isset($params['trigger']) ? $params['trigger'] : 'hover focus'; $opt['constraints'] = isset($params['constraints']) ? $params['constraints'] : ['to' => 'scrollParent', 'attachment' => 'together', 'pin' => true]; $opt['offset'] = isset($params['offset']) ? $params['offset'] : '0 0'; $opt = (object) array_filter((array) $opt); // Factory::getDocument()->addScriptOptions('bootstrap.popover', array($selector => $opt)); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap ScrollSpy * * @param string $selector The ID selector for the ScrollSpy element. * @param array $params An array of options for the ScrollSpy. * Options for the ScrollSpy can be: * - offset number Pixels to offset from top when calculating position of scroll. * * @return void * * @since 3.0 */ public static function scrollspy($selector = 'navbar', $params = array()) { // Only load once if (isset(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.scrollspy', array($selector => $params)); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap tooltips * * Add a title attribute to any element in the form * title="title::text" * * @param string $selector The ID selector for the tooltip. * @param array $params An array of options for the tooltip. * Options for the tooltip can be: * animation boolean apply a css fade transition to the popover * container string|boolean Appends the popover to a specific element: { container: 'body' } * delay number|object delay showing and hiding the popover (ms) - does not apply to manual trigger type * If a number is supplied, delay is applied to both hide/show * Object structure is: delay: { show: 500, hide: 100 } * html boolean Insert HTML into the popover. If false, jQuery's text method will be used to insert * content into the dom. * placement string|function how to position the popover - top | bottom | left | right * selector string If a selector is provided, popover objects will be * delegated to the specified targets. * template string Base HTML to use when creating the popover. * title string|function default title value if `title` tag isn't present * trigger string how popover is triggered - hover | focus | manual * constraints array An array of constraints - passed through to Tether. * offset string Offset of the popover relative to its target. * * @return void * * @since 3.0 */ public static function tooltip($selector = '.hasTooltip', $params = array()) { if (!isset(static::$loaded[__METHOD__][$selector])) { // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['animation'] = isset($params['animation']) ? (bool) $params['animation'] : null; $opt['html'] = isset($params['html']) ? (bool) $params['html'] : true; $opt['placement'] = isset($params['placement']) ? (string) $params['placement'] : null; $opt['selector'] = isset($params['selector']) ? (string) $params['selector'] : null; $opt['title'] = isset($params['title']) ? (string) $params['title'] : null; $opt['trigger'] = isset($params['trigger']) ? (string) $params['trigger'] : null; $opt['delay'] = isset($params['delay']) ? (is_array($params['delay']) ? $params['delay'] : (int) $params['delay']) : null; $opt['container'] = isset($params['container']) ? $params['container'] : 'body'; $opt['template'] = isset($params['template']) ? (string) $params['template'] : null; $onShow = isset($params['onShow']) ? (string) $params['onShow'] : null; $onShown = isset($params['onShown']) ? (string) $params['onShown'] : null; $onHide = isset($params['onHide']) ? (string) $params['onHide'] : null; $onHidden = isset($params['onHidden']) ? (string) $params['onHidden'] : null; $options = json_encode($opt); // Build the script. $script = array('$(container).find(' . json_encode($selector) . ').tooltip(' . $options . ')'); if ($onShow) { $script[] = 'on("show.bs.tooltip", ' . $onShow . ')'; } if ($onShown) { $script[] = 'on("shown.bs.tooltip", ' . $onShown . ')'; } if ($onHide) { $script[] = 'on("hide.bs.tooltip", ' . $onHide . ')'; } if ($onHidden) { $script[] = 'on("hidden.bs.tooltip", ' . $onHidden . ')'; } // Set static array static::$loaded[__METHOD__][$selector] = true; } return; } /** * Loads js and css files needed by Bootstrap Tooltip Extended plugin * * @param boolean $extended If true, bootstrap-tooltip-extended.js and .css files are loaded * * @return void * * @since 3.6 * * @deprecated 4.0 No replacement, use Bootstrap tooltips. */ public static function tooltipExtended($extended = true) { if ($extended) { HTMLHelper::_('script', 'jui/bootstrap-tooltip-extended.min.js', array('version' => 'auto', 'relative' => true)); HTMLHelper::_('stylesheet', 'jui/bootstrap-tooltip-extended.css', array('version' => 'auto', 'relative' => true)); } } /** * Add javascript support for Bootstrap accordians and insert the accordian * * @param string $selector The ID selector for the tooltip. * @param array $params An array of options for the tooltip. * Options for the tooltip can be: * - parent selector If selector then all collapsible elements under the specified parent will be closed when this * collapsible item is shown. (similar to traditional accordion behavior) * - toggle boolean Toggles the collapsible element on invocation * - active string Sets the active slide during load * * - onShow function This event fires immediately when the show instance method is called. * - onShown function This event is fired when a collapse element has been made visible to the user * (will wait for css transitions to complete). * - onHide function This event is fired immediately when the hide method has been called. * - onHidden function This event is fired when a collapse element has been hidden from the user * (will wait for css transitions to complete). * * @return string HTML for the accordian * * @since 3.0 */ public static function startAccordion($selector = 'myAccordian', $params = array()) { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['parent'] = isset($params['parent']) ? ($params['parent'] == true ? '#' . $selector : $params['parent']) : ''; $opt['toggle'] = isset($params['toggle']) ? (bool) $params['toggle'] : !($opt['parent'] === false || isset($params['active'])); $opt['onShow'] = isset($params['onShow']) ? (string) $params['onShow'] : null; $opt['onShown'] = isset($params['onShown']) ? (string) $params['onShown'] : null; $opt['onHide'] = isset($params['onHide']) ? (string) $params['onHide'] : null; $opt['onHidden'] = isset($params['onHidden']) ? (string) $params['onHidden'] : null; Factory::getDocument()->addScriptOptions('bootstrap.accordion', array($selector => $opt)); static::$loaded[__METHOD__][$selector] = true; return '<div id="' . $selector . '" class="accordion" role="tablist">'; } /** * Close the current accordion * * @return string HTML to close the accordian * * @since 3.0 */ public static function endAccordion() { return '</div>'; } /** * Begins the display of a new accordion slide. * * @param string $selector Identifier of the accordion group. * @param string $text Text to display. * @param string $id Identifier of the slide. * @param string $class Class of the accordion group. * * @return string HTML to add the slide * * @since 3.0 */ public static function addSlide($selector, $text, $id, $class = '') { $in = (static::$loaded[__CLASS__ . '::startAccordion'][$selector]['active'] == $id) ? ' in' : ''; $collapsed = (static::$loaded[__CLASS__ . '::startAccordion'][$selector]['active'] == $id) ? '' : ' collapsed'; $parent = static::$loaded[__CLASS__ . '::startAccordion'][$selector]['parent'] ? ' data-parent="' . static::$loaded[__CLASS__ . '::startAccordion'][$selector]['parent'] . '"' : ''; $class = (!empty($class)) ? ' ' . $class : ''; $html = '<div class="card mb-2' . $class . '">' . '<a href="#' . $id . '" data-bs-toggle="collapse"' . $parent . ' class="card-header' . $collapsed . '" role="tab">' . $text . '</a>' . '<div class="collapse' . $in . '" id="' . $id . '" role="tabpanel">' . '<div class="card-block">'; return $html; } /** * Close the current slide * * @return string HTML to close the slide * * @since 3.0 */ public static function endSlide() { return '</div></div></div>'; } /** * Creates a tab pane * * @param string $selector The pane identifier. * @param array $params The parameters for the pane * * @return string * * @since 3.1 */ public static function startTabSet($selector = 'myTab', $params = array()) { $sig = md5(serialize(array($selector, $params))); if (!isset(static::$loaded[__METHOD__][$sig])) { // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['active'] = (isset($params['active']) && ($params['active'])) ? (string) $params['active'] : ''; Factory::getDocument()->addScriptOptions('bootstrap.tabs', array($selector => $opt)); // Set static array static::$loaded[__METHOD__][$sig] = true; static::$loaded[__METHOD__][$selector]['active'] = $opt['active']; } return LayoutHelper::render('libraries.cms.html.bootstrap.starttabset', array('selector' => $selector)); } /** * Close the current tab pane * * @return string HTML to close the pane * * @since 3.1 */ public static function endTabSet() { return LayoutHelper::render('libraries.cms.html.bootstrap.endtabset'); } /** * Begins the display of a new tab content panel. * * @param string $selector Identifier of the panel. * @param string $id The ID of the div element * @param string $title The title text for the new UL tab * * @return string HTML to start a new panel * * @since 3.1 */ public static function addTab($selector, $id, $title) { static $tabScriptLayout = null; static $tabLayout = null; $tabScriptLayout = $tabScriptLayout === null ? new FileLayout('libraries.cms.html.bootstrap.addtabscript') : $tabScriptLayout; $tabLayout = $tabLayout === null ? new FileLayout('libraries.cms.html.bootstrap.addtab') : $tabLayout; $active = (static::$loaded['HTMLHelperBootstrap::startTabSet'][$selector]['active'] == $id) ? ' active' : ''; // Inject tab into UL Factory::getDocument() ->addScriptDeclaration($tabScriptLayout->render(array('selector' => $selector, 'id' => $id, 'active' => $active, 'title' => $title))); return $tabLayout->render(array('id' => $id, 'active' => $active, 'title' => $title)); } /** * Close the current tab content panel * * @return string HTML to close the pane * * @since 3.1 */ public static function endTab() { return LayoutHelper::render('libraries.cms.html.bootstrap.endtab'); } /** * Loads CSS files needed by Bootstrap * * @param boolean $includeMainCss If true, main bootstrap.css files are loaded * @param string $direction rtl or ltr direction. If empty, ltr is assumed * @param array $attribs Optional array of attributes to be passed to HTMLHelper::_('stylesheet') * * @return void * * @since 3.0 */ public static function loadCss($includeMainCss = true, $direction = 'ltr', $attribs = array()) { // Load Bootstrap main CSS if ($includeMainCss) { HTMLHelper::_('stylesheet', 'vendor/bootstrap/bootstrap.min.css', array('version' => 'auto', 'relative' => true), $attribs); } /** * BOOTSTRAP RTL - WILL SORT OUT LATER DOWN THE LINE * Load Bootstrap RTL CSS * if ($direction === 'rtl') * { * HTMLHelper::_('stylesheet', 'jui/bootstrap-rtl.css', array('version' => 'auto', 'relative' => true), $attribs); * } */ } } PKBA#]��q8��7system/helixultimate/layouts/frontend/conponentarea.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; $doc = Factory::getDocument(); $data = $displayData; ?> <div id="sp-component" class="<?php echo $data->settings->className; ?>"> <div class="sp-column <?php echo $data->settings->custom_class; ?>"> <jdoc:include type="message" /> <?php if ($doc->countModules('content-top')): ?> <div class="sp-module-content-top clearfix"> <jdoc:include type="modules" name="content-top" style="sp_xhtml" /> </div> <?php endif ?> <jdoc:include type="component" /> <?php if ($doc->countModules('content-bottom')): ?> <div class="sp-module-content-bottom clearfix"> <jdoc:include type="modules" name="content-bottom" style="sp_xhtml" /> </div> <?php endif ?> </div> </div> PKBA#]V��Ƣ�Csystem/helixultimate/layouts/frontend/headerlist/style-2/header.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); $data = $displayData; $feature_folder_path = JPATH_THEMES . '/' . $data->template->template . '/features/'; include_once $feature_folder_path.'logo.php'; include_once $feature_folder_path.'menu.php'; $output = ''; $output .= '<header id="sp-header">'; $output .= '<div class="container">'; $output .= '<div class="container-inner">'; $output .= '<div class="row">'; $output .= '<div id="sp-logo" class="col-8 col-lg-4">'; $output .= '<div class="sp-column">'; $logo = new HelixUltimateFeatureLogo($data->params); $output .= $logo->renderFeature(); $output .= '</div>'; $output .= '</div>'; $output .= '<div id="sp-menu" class="col-4 col-lg-8">'; $output .= '<div class="sp-column">'; $menu = new HelixUltimateFeatureMenu($data->params); $output .= $menu->renderFeature(); $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '</header>'; echo $output;PKBA#]�7����Bsystem/helixultimate/layouts/frontend/headerlist/style-2/thumb.jpgnu�[������JFIF��C %# , #&')*)-0-(0%()(��C (((((((((((((((((((((((((((((((((((((((((((((((((((��X"����2!1AQ"2aq#R���$Bbr�����1!��?���5�ĕ(2G��.w��;N�Ѳ�}��o�j�_)���1��f�Ҙ�#�ա�c�,��ژ���/��Uc�$�q������q۾4��'��[����/���`�e�%2��-3���A_NqX�e˴�rc�:r/�z���#�}�(T��s ��,��f��B#x~Ǡ��[�X�D}K�4nd�Z�+��^q��t�\u���I���d���p��������^�6Q�[�Y�k^H�$<�C� ����V^���sé����vFВ�h�6�&`�����|��?�����;T$ �#Y�V��h?S��7�W�S�-�Q��Bz�K�����O�}T��S/L�e ��Ի<�F��A�H�3�tG���S�#?�Cf1����|�w�=�c˃��tGˏ�z*;�.d)䡗$��ߙ�5� d$�8h�Xu��y�k���e&m�O�#��c�/����7�:��P^a�*C��=��(Ƿ��f@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@D\�o�|Ĕ��HC.٦�hH��\t�N/�@o}��.�H�M��訨����v�:C�_7q�\9�����7z~�V�ꊝUBk�!�,��3��1�C��v#�`���z�����"[�E1l��7n���>`�tŤ�~ދ�h��3��j��㤀�v�t�s�<D�z�#aLo��%g�b� y��DZ6�yh胠t�����ζ��>/"���D9����⃡,$�oC�;#J�=>?�:��M[�G^�v#�$�w8���,���#�k�ApEϪ���M��KS;Ȉ@�p�~���5��������]�:Γ��H�Y'�k$�\��'� M-q�@�N�Y�w�:����1HL�G�}l����S��u����|�ֱ�b0��M���;;O��݁��_�s��GdvY�ɪ9��,���%�#a�h�w����,�2�VL}���2'�k���B�f�����\�D��fO �b�(��l����%����7�DoJZ" """ (9ZrZ�7V�Cj���[��{� NE���vjţ%�crͅ��Q�NG�_`��4�����x��+-�����,��X��g�-q���H��O���&ў�NQY��;�|7鮤�����;��3���I1�H'�k,�=�v���eg�g�I2�#[��y~�װ+�"��?�^��,O�����6kr�$�&��q����[�GFa11梥Y쭗��-W2���;�s���S�^��+ ���X-y�[�%� WKbw=�����~�Cd�)0a�mfCbŻa�2v�ļ���5�cz[4Aت���&7�3l��gu�U^��IZ*߃�:����=��.?=�V�@���u�xG(���[����u�� e�����VJ�#}yKIa��w���m�:��̒^ ��nw�O�Ȉ����������������������������������ψ�X�H��ԑ���д�����9bf=�,�cY�8�m�j���-��Y�R�F7��hk��29�04Ru�"���2�@��%���ƾ7��5�a���>�R��>:���*��C!�s������-n�p8�M�_�B_;D�w?�d��EaDiՂ�h�ӆ8+�4��hkZ?@dD�2�BHz�{/���t�����7��?���4�^���Z�ZP��������� ����X�5���h�"�Z6���h%;�n�r�*�ۉ����5�kO���{�u.�����A���2 +�Q�}�v�u�D�����P�' ��P��ݾ�;Y(Ч��GF��00hzv���J """ ""��PKBA#]t�p��Csystem/helixultimate/layouts/frontend/headerlist/style-1/header.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); $data = $displayData; $feature_folder_path = JPATH_THEMES . '/' . $data->template->template . '/features/'; include_once $feature_folder_path.'logo.php'; include_once $feature_folder_path.'social.php'; include_once $feature_folder_path.'contact.php'; include_once $feature_folder_path.'menu.php'; $output = ''; $output .= '<div id="sp-top-bar">'; $output .= '<div class="container">'; $output .= '<div class="container-inner">'; $output .= '<div class="row">'; $output .= '<div id="sp-top1" class="col-lg-6">'; $output .= '<div class="sp-column text-center text-lg-start">'; $social = new HelixUltimateFeatureSocial($data->params); $output .= $social->renderFeature(); $output .= '</div>'; $output .= '</div>'; $output .= '<div id="sp-top2" class="col-lg-6">'; $output .= '<div class="sp-column text-center text-lg-end">'; $contact = new HelixUltimateFeatureContact($data->params); $output .= $contact->renderFeature(); $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '<header id="sp-header">'; $output .= '<div class="container">'; $output .= '<div class="container-inner">'; $output .= '<div class="row">'; $output .= '<div id="sp-logo" class="col-8 col-lg-4">'; $output .= '<div class="sp-column">'; $logo = new HelixUltimateFeatureLogo($data->params); $output .= $logo->renderFeature(); $output .= '</div>'; $output .= '</div>'; $output .= '<div id="sp-menu" class="col-4 col-lg-8">'; $output .= '<div class="sp-column">'; $menu = new HelixUltimateFeatureMenu($data->params); $output .= $menu->renderFeature(); $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '</header>'; echo $output;PKBA#]/.4Bsystem/helixultimate/layouts/frontend/headerlist/style-1/thumb.jpgnu�[������JFIF��C %# , #&')*)-0-(0%()(��C (((((((((((((((((((((((((((((((((((((((((((((((((((��/X"����8!1AU��Q�"2Raq�#3Br�$b������ 1!2Q��?��qa�,�[1�6�}j����]��?�p�\���T�YʥF^FJ�}YP �H�J� �1� M�-^^�. �d��,�8 �5������)��%���"�6�cu�eY�)�Ǥ�ڕ�q,��)Z�!:�nᦱ�!JJ��S�U�-z�ğS �,�V����6�94�$&�n��$�G��ː�����Kt���a)BR.�)D�)�1�y��en�ՕE���� �ǭ6t�:�v���eR�8JC�� � RA�8�6��ꊦPU��}-!r������u+RJ���M���M~^H)�2����J8�(����}�� �KM�6�@6͘x(��G���-���hu7�q $i�(����Q�Sr�PTӍ%���m���ܝTuQ$�I�O(/4�z�P��$/��)���Z<�P���l2��.�9��h ԝ��b���ۧ�M��aL��hٸH#2�I<�<��F�]*�-8�iul�����m�W���� *�#0�� n=E�jJNvu+T��:�2�頿"���ѷ�q�u &i��d��E��e B�_�FK��Ǖ*��=�4�6TUl� R�U�����T�YA.m�d���o�23���}jB�Iʢ�s[[~����5}�&U2� yNmTm�U���: ���T�d�5�%��M�s�}�<����M=�����@�$|D\���Y��4�V�q y%M��bG�A�C��F3�x?��Z��+2H)#��B�[��Kʳ4���{��NPI7 �`��T7\��Ia.�Ӂ�)s o�"�:����JM=-2T�쬶�J�Ub/�;���ݓ����[�ԗ�Z 3$%Iyqj�J��g&�BR��T�51�>����$��9�V-(P]�2� �G�d��Ny�9]�|� ���I�71�^6�?CU*m�Y�¥�yIR^q$$V ����U� d���i�R�� ̜�N� �B �����=��4 C�����ZM�t�t����S P�����[�d Y�OU���JHK5"ܣ2{B��T�QY�A`4�9��% �K�̢C�9 �"� pt �"D�Ԩ�JZT #�1�j�֯x:����p�qj+Q�$���\��� ��Z��@g�s�W�6�}j��!��ϭ^�ڹ���0�{W>�{�j�֯x��\��� ��Z��@g�s�W�6�}j��!��ϭ^�ڹ���0�{W>�{�j�֯x��\��� ��Z��@g�s�W�6�}j��!��ϭ^�ڹ���0�{W>�{dzMM�/2�)ulK%*}`��QʒS�kF�:u�VR�/��r?,�J�y�Uc�� ��L���f\8�PBP��Q���'�>��)���%5u(�p�<����x3Xu��0�io�� �r@$��[ٰ~`�u�߭��#��횒h:��/,�«|��Y<��[�h1#R�h:����h,���qN�X�O�N:G��*��o��m[F~j�t���6X��Ԋ%L����h�@د1Xom}�x�j��AR�4�Ě��uWsl�g�hV}yXk@b� ���I��2�&��.��� H��e��K/�)���RS�_�;���$�����>������&�����}�S�LTڔD�%�d�,��p,4����<e���L��}�\���n0�njb`0�Z�$�'0O�8��Ǥa(�x��tL6��)���(��jn�Z�i�v�i�yy�N6�� C��<�I��kx�5t�J�B��t�9m��Z�C�K��s 0�ﭷ������>�ӫHlBmĶқʵ(m�fS���I��Ѐd���t�D2�2IPe�r����,@(��ǔ��6���\��L�� e�]Nm`;��#�g�KJi�����)� P��y�6��n�NH��J�˙F�(o�q �?�Jԕ}ca8���҂�<���X[W�i� �w��:&Y ���[K���ھU��c�BV�Q|�Nbfm�� �A#���eV�LUf~p5�CId��d �$ /���8b��I���"iJd���A$�RuZVzN�N},T%f�R6�m����ޚc�eť-�akV\�JI�����הH*����L�LK~Y`>△�8YsE^�p#N��}EK Cm7�b��y��sp� ��&c6\����ʫ�lޗ��u��ï9/2��%.)I#!����GY�W6�t2�f�Ci� p(���_�x(�c��Ն3�&�>�-d����؛�'Cq�p��JfM���m�i��a��ïdt4ճ�Ze��{��{�i�_Qq� �eŨ+[�Z�^���<j8���['�%�yP�(����O+�������?�|���ߗ�(����e�P} O���ų��ZXh-eG1u�X�|F������ժ�5M��9��PJ�H9t$���0{W>�{�j�֯x�̸��wZ��s��1c�����@~�W�R��Rn��7!�:r�Y0���!�:r�7!�:r�Y1�V�vY 5(��8��4��$ir�}�����fӨM����л�|��л�|�N�* ��JU��`����C#�*#T�Ry�Ʈ&��S��R�����d�I )�^O���I�w�5�����ε?��-�`�ܻ� �`�ܻ�_��N�uJ������Sġ;�Ι��$�-b5�{�~$�u�-6��*T���ے��ec�o:�Jt���xnCt.��(nCt.��(ʯ��N�Uk2���)F����N')D�^M���@t'���ǒ���jR�6�K3_���YH��]l_�О6��nCt.��(nCt.��(�V+ ��8����$~���\�L�D����i��CW�%T�����л�|��л�|�MQ�-SPU9(�Cs,�>P����Y���S���L�H�:[qn����݈�b 6��/r�w.�Cr�w.�D��R&� �'T��-����6%.��*����>�M��6�W��T�B��P2�[q9�H��0B�]��0B�]�]kq���{7�T���O��Ǥm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ʉm�л�|��л�|�Ɏ(��m��T�HZ\y����L�\�"�$��*���1�&b<����w����w�'?Ʃ{v�%%�s.F��̬�-���/Xٔ���B�)0��J����m�zBkh��7�w!�:r�7!�:r�Y1�50Ԥ��3a�)Ŭ�j@�>�%�w�л�|��л�|�]H�Tj�Zut�&�`]�P��.��$+�x�n�Ju ������V�)3!A1���� �л�|��л�|��f~M�t>�ܻ�-ĸ�RP8���x��!�:r�7!�:r�Y1ɮb*m �V�O��̓�ͩ@@*Q��"��Xf�0B�]��0B�]#��,_�#*��}a�jCd�)AV)�s�vP���� ��PpX��~�����!�:r�7!�:r�Y0���!�:r�7!�:r�O�Zp�3����%���Z� 8p?h�n�Iu,)����T��fC�O�S��s#�r�w.�Cr�w.�D��z%����, )�B�n�(|��V��Hؒ�Sg]u�I�]-��RU𝠺,� �+܆�]˾P܆�]˾Qc��Nfԕ��]&������܆�]˾P܆�]˾Qd��O�J��Pn?���!�!�ea!r���)��(����hP���Ƅv�t�[s;M��i���K���/��+6�] )%$�$������6<���%G�~Y �S�Aĕ!`,�m�k�ȼX0��N�P�.'s?��/~���������-ɩ�)��VT��B��3o�J��7I��T��\#Ou��49�VIU���"�d�Kn�O*���z�Z�sr�ỤmKa�eSMܜ����!�*4,+Q�OTۘ���U!e�.�l�m˛($���M-?�Zj�W��eʓ�M�I�,�l��X��ly8\�c}�*����'�(���4��T��� �@761ڄn����q�K�2�V�I��-)'���s�y� ̭Ie���n�:������������� "�a=��r�8�A�\��}e�Z�r[Х\� �fz��X�ΉIEJ���ms��N��"���@xɥ�J2���n% 4IB~��i�G�!�!�!�!�!�!�!�!�!�!�!�!�!�!�!�!�!�L���&je����N;2���!Y�R@7OĔ�&�7���#Ly��wI�mH��@��.�5��eJ�Fs�6�;�r�OKp��(���-%���JH)kC�� �W$r�SE��e�^mmÕ�Z��רʦz�5(└L4����@������h%G�ґ2�=�u9.̒�.WUk�V͛@ ��9���ւ��Ͳ�Bci�-K�d3\'*T,�A����a��T��ԺuA�� �+3.?�\��mk���n��IaF�n�ij��:�� �JMI� ���P�Ē�S�բʝ��+�(=,&��6����ɺ�J@�n�u��n���LR�,T��������|���#�}BM� ��Ja�!ĸa�B�br~q2.I�R�Y@*���x�">���{��3?4�ԅL�hک �l�7 �W;Ń\���1��y���g\�|L�&��)G�y}�j���T�ԇQ��G�J�HI6* ��X���M���%P�֦��S$X��eK2��m<���O30�����PKBA#]C���2system/helixultimate/layouts/frontend/generate.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\Factory; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Uri\Uri; defined('_JEXEC') or die(); $layout_path = JPATH_ROOT .'/plugins/system/helixultimate/layouts'; $data = $displayData; $doc = Factory::getDocument(); $plg_path = Uri::root(true) . '/plugins/system/helixultimate'; $app = Factory::getApplication(); $template = $app->getTemplate(true); $layout = []; $rightSticky = false; $leftSticky = false; // Check if position 'right' or 'left' is sticky from layout if (!empty($template->params->get('layout'))) { $layout = json_decode($template->params->get('layout')); foreach ($layout as $row) { if (!empty($row->attr)) { foreach ($row->attr as $attr) { if (!empty($attr->settings) && !empty($attr->settings->name)) { if ($attr->settings->name == 'right' && !empty($attr->settings->sticky_position)) { if ($attr->settings->sticky_position) { $rightSticky = true; } } if ($attr->settings->name == 'left' && !empty($attr->settings->sticky_position)) { if ($attr->settings->sticky_position) { $leftSticky = true; } } } } } } } extract($displayData); ?> <<?php echo $sematic; ?> id="<?php echo $id ?>" <?php echo $row_class ?>> <?php if ($componentArea): ?> <?php if (!$pagebuilder): ?> <?php if (!$fluidrow): ?> <div class="container"> <div class="container-inner"> <?php endif ?> <?php endif ?> <?php else: ?> <?php if (!$fluidrow): ?> <div class="container"> <div class="container-inner"> <?php endif ?> <?php endif ?> <?php echo (new FileLayout('frontend.rows', $layout_path))->render($data); ?> <?php if ($componentArea): ?> <?php if (!$pagebuilder): ?> <?php if (!$fluidrow): ?> </div> </div> <?php endif ?> <?php endif ?> <?php else: ?> <?php if (!$fluidrow): ?> </div> </div> <?php endif ?> <?php endif ?> <?php if ($rightSticky || $leftSticky) :?> <?php $doc->addScript($plg_path . '/assets/js/sticky-sidebar.js'); ?> <script> window.addEventListener('DOMContentLoaded', () => { <?php if ($rightSticky) :?> var isRight = document.querySelector('#sp-right .sp-column'); if (isRight) { const rightSidebar = new StickySidebar('#sp-right .sp-column', { containerSelector: '#sp-main-body .row', topSpacing: 15, minWidth:320 }); } <?php endif; ?> <?php if ($leftSticky) :?> var isLeft = document.querySelector('#sp-left .sp-column'); if (isLeft) { const leftSidebar = new StickySidebar('#sp-left .sp-column', { containerSelector: '#sp-main-body .row', topSpacing: 15, minWidth:320 }); } <?php endif; ?> }) </script> <?php endif; ?> </<?php echo $sematic; ?>> PKBA#];�D 1system/helixultimate/layouts/frontend/modules.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Filter\OutputFilter; use Joomla\CMS\Language\Text; $data = $displayData; $options = $data->settings; $params = Helper::loadTemplateData()->params; $isHeader = !empty($data->section_sematic) && $data->section_sematic === 'header'; $menuType = $params->get('menu_type', ''); $hasOffcanvas = in_array($menuType, ['mega_offcanvas', 'offcanvas']); $offcanvasPosition = $params->get('offcanvas_position', 'right'); $columnClass = $isHeader ? ' d-flex align-items-center' : ''; $columnClass .= $isHeader && $options->name === 'menu' ? ' justify-content-end' : ''; $output =''; $output .= '<'.$data->sematic.' id="sp-' . OutputFilter::stringURLSafe($options->name) . '" class="'. $options->className .'">'; $output .= '<div class="sp-column ' . ($options->custom_class) . $columnClass . '">'; $features = (isset($data->hasFeature[$options->name]) && $data->hasFeature[$options->name])? $data->hasFeature[$options->name] : array(); foreach ($features as $key => $feature) { if (isset($feature['feature']) && $feature['load_pos'] == 'before' ) { $output .= $feature['feature']; } } $output .= '<jdoc:include type="modules" name="' . $options->name . '" style="sp_xhtml" />'; foreach ($features as $key => $feature) { if (isset($feature['feature']) && $feature['load_pos'] != 'before' ) { $output .= $feature['feature']; } } if ($isHeader && $hasOffcanvas && $options->name === 'menu') { if ($offcanvasPosition === 'right') { if ($menuType !== 'offcanvas') { $output .= '<a id="offcanvas-toggler" aria-label="'. Text::_('HELIX_ULTIMATE_NAVIGATION') . '" title="'. Text::_('HELIX_ULTIMATE_NAVIGATION') . '" class="offcanvas-toggler-secondary offcanvas-toggler-right d-flex align-items-center" href="#">'; $output .= '<div class="burger-icon" aria-hidden="true"><span></span><span></span><span></span></div>'; $output .= '</a>'; } } } $output .= '</div>'; $output .= '</'.$data->sematic.'>'; echo $output; PKBA#]d��77.system/helixultimate/layouts/frontend/rows.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Layout\FileLayout; $layout_path_carea = JPATH_ROOT .'/plugins/system/helixultimate/layouts'; $layout_path_module = JPATH_ROOT .'/plugins/system/helixultimate/layouts'; $data = $displayData; $section_sematic = $data['sematic']; extract($displayData); ?> <div class="row"> <?php foreach ($rowColumns as $key => $column) { if (isset($componentArea) && $componentArea) { $column->sematic = 'aside'; } else { $column->sematic = 'div'; } $column->hasFeature = $loadFeature; $column->section_sematic = $section_sematic; if ($column->settings->column_type) { echo (new FileLayout('frontend.conponentarea', $layout_path_carea))->render($column); } else { echo (new FileLayout('frontend.modules', $layout_path_module))->render($column); } } ?> </div>PKBA#]�E���/system/helixultimate/layouts/preview/iframe.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; defined('_JEXEC') or die(); $version = new Version(); $JoomlaVersion = $version->getShortVersion(); if (version_compare($JoomlaVersion, '5.0.0', '<')) { $doc = Factory::getDocument(); $doc->addStyleSheet(Uri::root(true) . '/media/system/css/joomla-fontawesome.min.css', ['relative' => false, 'version' => 'auto']); } extract($displayData); $style = ''; if (empty($width)) { $width = '100%'; } if (empty($height)) { $height = '100%'; } $style .= "width: {$width}; height: {$height}; box-shadow: rgba(139, 139, 143, 0.56) 3px 0px 10px;"; ?> <iframe id="hu-template-preview" src="<?php echo $url; ?>" frameborder="0" style="<?php echo $style; ?>"> </iframe>PKBA#];.����/system/helixultimate/layouts/backend/column.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); $settings = $displayData; $colSettings = 'data-grid_size="12" data-column_type="0" data-name="none"'; if(isset($settings->grid_size) && $settings->grid_size){ $colSettings = RowColumnSettings::getSettings($settings); } $output = '<div class="hu-layout-column col-' . ((isset($settings->grid_size) && $settings->grid_size)? $settings->grid_size :12) .'" ' . $colSettings .'>'; $output .= '<div class="hu-column' . ((isset($settings->column_type) && $settings->column_type) ? ' hu-column-component' : '') . '">'; if (isset($settings->column_type) && $settings->column_type) { $output .= '<span class="hu-column-title">Component</span>'; } else { if (isset($settings->name)) { $output .= '<span class="hu-column-title">'. $settings->name .'</span>'; } else { $output .= '<span class="hu-column-title">None</span>'; } } $output .= '<a class="hu-column-options" href="#"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="3" fill="none"><path fill="#020B53" fill-rule="evenodd" d="M3 1.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm6 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM13.5 3a1.5 1.5 0 100-3 1.5 1.5 0 000 3z" clip-rule="evenodd" opacity=".4"/></svg></a>'; $output .= '</div>'; $output .= '</div>'; echo $output;PKBA#]��]�**0system/helixultimate/layouts/backend/section.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\Utilities\ArrayHelper; $grids = array( array( '12', '<svg xmlns="http://www.w3.org/2000/svg" width="51" height="17" fill="none"><rect width="50.78" height="16.927" fill-opacity=".3" rx="2"/></svg>' ), array( '6+6', '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="23.79" height="16.221" fill-opacity=".3" rx="2"/><rect width="23.79" height="16.221" fill-opacity=".7" rx="2"/><rect width="23.79" height="16.221" x="25.681" fill-opacity=".3" rx="2"/></svg>' ), array( '4+4+4', '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="15.139" height="16.221" fill-opacity=".3" rx="2"/><rect width="15.139" height="16.221" x="17.302" fill-opacity=".3" rx="2"/><rect width="15.139" height="16.221" x="17.302" fill-opacity=".7" rx="2"/><rect width="15.139" height="16.221" x="34.605" fill-opacity=".3" rx="2"/></svg>' ), array( '3+3+3+3', '<svg xmlns="http://www.w3.org/2000/svg" width="51" height="17" fill="none"><rect width="10.814" height="16.221" fill-opacity=".3" rx="2"/><rect width="10.814" height="16.221" x="12.974" fill-opacity=".3" rx="2"/><rect width="10.814" height="16.221" x="12.974" fill-opacity=".7" rx="2"/><rect width="10.814" height="16.221" x="25.95" fill-opacity=".3" rx="2"/><rect width="11.354" height="16.221" x="38.929" fill-opacity=".3" rx="2"/><rect width="11.354" height="16.221" x="38.929" fill-opacity=".7" rx="2"/></svg>' ), array( '4+8', '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="15.139" height="16.221" fill-opacity=".3" rx="2"/><rect width="33" height="16" x="17" fill-opacity=".3" rx="2"/><rect width="33" height="16" x="17" fill-opacity=".7" rx="2"/></svg>' ), array( '3+9', '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="10.814" height="16.221" fill-opacity=".7" rx="2"/><rect width="37" height="16" x="13" fill-opacity=".3" rx="2"/></svg>' ), array( '3+6+3', '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="10.543" height="16.221" fill-opacity=".3" rx="2"/><rect width="11.084" height="16.221" x="38.659" fill-opacity=".3" rx="2"/><rect width="23.79" height="16.221" x="12.704" fill-opacity=".7" rx="2"/></svg>' ), array( '2+6+4', '<svg xmlns="http://www.w3.org/2000/svg" width="51" height="17" fill="none"><rect width="6.488" height="16.221" x=".143" fill-opacity=".7" rx="2"/><rect width="23.79" height="16.221" x="9" fill-opacity=".3" rx="2"/><rect width="15.139" height="16.221" x="35" fill-opacity=".7" rx="2"/></svg>' ), array( '2+10', '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="6.488" height="16.221" x=".143" fill-opacity=".3" rx="2"/><rect width="41" height="16" x="9" fill-opacity=".7" rx="2"/></svg>' ), array( '5+7', '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="28.927" height="16.221" x="20.653" fill-opacity=".7" rx="2"/><rect width="18.654" height="16.221" fill-opacity=".3" rx="2"/></svg>' ), array( '2+3+7', '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="6.488" height="16.221" x=".143" fill-opacity=".7" rx="2"/><rect width="10" height="16.221" x="8.7" fill-opacity=".3" rx="2"/><rect width="28.927" height="16.221" x="20.653" fill-opacity=".7" rx="2"/></svg>' ) ); $row = $displayData; $rowSettings = ''; if(isset($row->settings)) { $rowSettings = RowColumnSettings::getSettings($row->settings); } $name = Text::_('HELIX_ULTIMATE_SECTION_TITLE'); if (isset($row->settings->name)) { $name = $row->settings->name; } $layout_path = JPATH_ROOT .'/plugins/system/helixultimate/layouts'; $layout_column = new FileLayout('backend.column', $layout_path ); $output = ''; $output .= '<div '.((isset($row->sectionID) && $row->sectionID)?'id="hu-layout-section"':'').' class="hu-layout-section" ' . $rowSettings .'>'; $output .= '<div class="hu-layout-section-inner">'; $output .= '<div class="hu-section-settings hu-d-flex hu-justify-content-between hu-align-items-center">'; $output .= '<div>'; $output .= '<a class="hu-move-row hu-layout-builder-action" href="#"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="8" fill="none"><path fill-rule="evenodd" d="M1.5 3a1.5 1.5 0 100-3 1.5 1.5 0 000 3zm0 5a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM9 1.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM7.5 8a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM15 1.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM13.5 8a1.5 1.5 0 100-3 1.5 1.5 0 000 3z" clip-rule="evenodd"/></svg></a>'; $output .= '<strong class="hu-section-title">' . $name . '</strong>'; $output .= '</div>'; $output .= '<div>'; $output .= '<ul class="hu-row-option-list">'; $output .= '<li class="hu-mr-1">'; $output .= '<a class="hu-add-columns hu-layout-builder-action" href="#"><svg xmlns="http://www.w3.org/2000/svg" width="13" height="11" fill="none"><path d="M.996 4.805h3.926c.662 0 1.002-.323 1.002-1.014V1.02C5.924.322 5.584 0 4.922 0H.996C.34 0 0 .322 0 1.02V3.79c0 .691.34 1.014.996 1.014zm6.932 0h3.926c.662 0 1.002-.323 1.002-1.014V1.02c0-.698-.34-1.02-1.002-1.02H7.928c-.657 0-.996.322-.996 1.02V3.79c0 .691.34 1.014.996 1.014zm-6.92-.65c-.252 0-.363-.112-.363-.376V1.02c0-.251.11-.369.363-.369H4.91c.252 0 .363.118.363.37v2.76c0 .263-.11.374-.363.374H1.008zm6.937 0c-.258 0-.369-.112-.369-.376V1.02c0-.251.112-.369.37-.369h3.896c.252 0 .363.118.363.37v2.76c0 .263-.111.374-.363.374H7.945zM.996 10.61h3.926c.662 0 1.002-.322 1.002-1.013V6.826c0-.691-.34-1.013-1.002-1.013H.996C.34 5.813 0 6.135 0 6.825v2.772c0 .691.34 1.013.996 1.013zm6.932 0h3.926c.662 0 1.002-.322 1.002-1.013V6.826c0-.691-.34-1.013-1.002-1.013H7.928c-.657 0-.996.322-.996 1.013v2.772c0 .691.34 1.013.996 1.013zm-6.92-.644c-.252 0-.363-.117-.363-.375v-2.76c0-.258.11-.375.363-.375H4.91c.252 0 .363.117.363.375v2.76c0 .258-.11.375-.363.375H1.008zm6.937 0c-.258 0-.369-.117-.369-.375v-2.76c0-.258.112-.375.37-.375h3.896c.252 0 .363.117.363.375v2.76c0 .258-.111.375-.363.375H7.945z"/></svg></a>'; $output .= '<div class="hu-column-list">'; $output .= '<div class="row">'; if(!isset($row->layout)){ $row->layout = 12; } $custom = true; foreach ($grids as $grid) { $output .= '<div class="col-3">'; $output .= '<a href="#" class="hu-column-layout '.(($grid[0] == $row->layout)? 'active' : '' ).'" data-layout="'. $grid[0] .'">'; $output .= '<div class="hu-column-layout-preview">' . $grid[1] . '</div>'; $output .= '<span class="hu-column-layout-name">' . $grid[0] . '</span>'; $output .= '</a>'; $output .= '</div>'; if($grid[0] == $row->layout) { $custom = false; } } $output .= '<div class="col-3">'; $output .= '<a href="#" class="hu-column-layout hu-layout-custom-btn ' . ((isset($row->layout) && $custom) ? 'active' : '' ) .'" data-layout="'. $grid[0] .'" data-layout="'. $row->layout .'" data-type="custom" title="Custom Layout">'; $output .= '<div class="hu-column-layout-preview">Custom</div>'; $output .= '<span class="hu-column-layout-name hu-sr-only">Custom</span>'; $output .= '</a>'; $output .= '</div>'; $output .= '</div>'; $output .= '<div class="hu-layout-custom mb-2" style="display: none;">'; $output .= ' <label>' . Text::_('HELIX_ULTIMATE_CUSTOM_LAYOUT_LABEL') . '</label>'; $output .= ' <div class="hu-d-flex hu-justify-content-between">'; $output .= ' <input type="text" class="hu-layout-custom-field me-2" value="6+3+3">'; $output .= ' <button class="hu-btn hu-btn-primary hu-layout-custom-apply">' . Text::_('HELIX_ULTIMATE_MEGAMENU_APPLY_TEXT') . '</button>'; $output .= ' </div>'; $output .= '</div>'; $output .= '</div>'; $output .= '</li>'; $output .= '<li class="hu-mr-1"><a class="hu-row-options hu-layout-builder-action" href="#"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="12" fill="none"><path d="M9.786 3.224c.731 0 1.347-.487 1.548-1.16h2.428c.23 0 .43-.194.43-.438 0-.25-.2-.444-.43-.444h-2.428A1.614 1.614 0 009.786 0c-.738 0-1.36.501-1.554 1.182H.444A.437.437 0 000 1.626c0 .244.193.437.444.437H8.24a1.61 1.61 0 001.547 1.16zm0-.73a.876.876 0 01-.88-.882c0-.502.386-.881.88-.881.495 0 .882.38.882.88a.876.876 0 01-.882.882zm-5.2 5.129c.737 0 1.36-.502 1.554-1.175h7.608c.244 0 .444-.2.444-.444 0-.251-.2-.445-.444-.445H6.133A1.618 1.618 0 004.585 4.4c-.73 0-1.354.494-1.547 1.16H.423A.433.433 0 000 6.004c0 .243.193.444.423.444h2.615a1.622 1.622 0 001.547 1.175zm0-.738a.872.872 0 01-.882-.881c0-.495.387-.882.881-.882s.881.387.881.882a.872.872 0 01-.88.88zM9.785 12c.731 0 1.354-.502 1.548-1.175h2.428c.23 0 .43-.193.43-.444 0-.244-.2-.437-.43-.437h-2.428a1.616 1.616 0 00-1.548-1.168c-.73 0-1.354.494-1.547 1.168H.444A.436.436 0 000 10.38c0 .25.193.444.444.444h7.788A1.625 1.625 0 009.786 12zm0-.73a.878.878 0 01-.88-.89c0-.493.386-.873.88-.873.495 0 .882.38.882.874a.878.878 0 01-.882.888z"/></svg></a></li>'; $output .= '<li><a class="hu-remove-row hu-layout-builder-action" href="#"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13" fill="none"><path d="M9.592 11.648l.433-8.748h.844a.335.335 0 00.334-.34.335.335 0 00-.334-.34H8.098V1.3c0-.773-.545-1.3-1.389-1.3h-2.22c-.844 0-1.384.527-1.384 1.3v.92H.34a.348.348 0 00-.34.34c0 .188.158.34.34.34h.844l.433 8.748c.041.75.569 1.266 1.33 1.266h5.315c.756 0 1.295-.516 1.33-1.266zM3.826 1.336c0-.38.281-.662.71-.662h2.132c.422 0 .715.281.715.662v.885H3.826v-.885zm-.82 10.898a.68.68 0 01-.68-.662L1.893 2.9h7.412l-.416 8.672a.682.682 0 01-.686.662H3.006zm4.348-1.148c.158 0 .275-.123.28-.293l.188-6.404c.006-.17-.111-.305-.275-.305-.147 0-.27.135-.27.299l-.193 6.398c0 .17.111.305.27.305zm-3.499 0c.159 0 .276-.135.27-.305l-.193-6.398c0-.164-.13-.299-.276-.299-.158 0-.275.129-.27.305l.194 6.404c.006.17.117.293.275.293zm1.752 0c.153 0 .282-.135.282-.299V4.39c0-.17-.13-.305-.282-.305-.152 0-.28.135-.28.305v6.398c0 .164.128.299.28.299z"/></svg></a></li>'; $output .= '</ul>'; $output .= '</div>'; $output .= '</div>'; $output .= '<div class="hu-row-container">'; $output .= '<div class="row hu-layout-row" data-hu-layout-row>'; if(isset($row->attr) && $row->attr) { foreach ($row->attr as $column) { $output .= $layout_column->render($column->settings); } } else { $output .= $layout_column->render(new stdClass); } $output .= '</div>'; $output .= '</div>'; $output .= '<a class="hu-add-row hu-btn hu-btn-primary" href="#"><i class="fas fa-plus" aria-hidden="true"></i></a>'; $output .= '</div>'; $output .= '</div>'; echo $output;PKBA#]<�S���Esystem/helixultimate/layouts/cpanel/control-board/fieldset/groups.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; extract($displayData); ?> <?php foreach ($groups as $key => $group): ?> <?php if ($key !== 'no-group'): ?> <div class="hu-group-wrap hu-group-<?php echo $key; ?> <?php echo $group['isActive'] ? 'active' : ''; ?>" <?php echo !empty($group['dependent']) ? 'data-dependon="' . $group['dependent'] . '"' : ''; ?>> <div class="hu-group-header-box"> <span class="hu-group-title"><?php echo Text::_('HELIX_ULTIMATE_GROUP_' . strtoupper($key)); ?></span> <span class="hu-group-toggle-icon fas fa-angle-right"></span> </div> <div class="hu-field-list <?php echo $group['isActive'] ? 'active-group' : ''; ?>" data-uid="<?php echo $fieldset_name . '-'. $key; ?>" <?php echo $group['isActive'] ? 'style="display:block;"' : ''; ?>> <?php echo LayoutHelper::render('cpanel.control-board.fieldset.fields', ['group' => $key, 'groupData' => $group], HELIX_LAYOUTS_PATH); ?> </div> </div> <?php else: ?> <div class="hu-no-group-wrap"> <?php echo LayoutHelper::render('cpanel.control-board.fieldset.fields', ['group' => $key, 'groupData' => $group], HELIX_LAYOUTS_PATH); ?> </div> <?php endif ?> <?php endforeach; ?> PKBA#]lIDsystem/helixultimate/layouts/cpanel/control-board/fieldset/panel.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Layout\LayoutHelper; extract($displayData); $fields = $form->getFieldset($key); $activeGroup = isset($fieldset->activegroup) ? $fieldset->activegroup : ''; if (!empty($fields)) { $index = 0; foreach ($fields as $i => $field) { $subgroup = $field->getAttribute('helixsubgroup'); $group = $field->getAttribute('helixgroup') ? $field->getAttribute('helixgroup') : 'no-group'; if (isset($subgroup)) { $groups[$group]['subgroup-' . $subgroup][] = $field; } else { $groups[$group][] = $field; } $groups[$group]['isActive'] = false; $groups[$group]['dependent'] = $field->getAttribute('dependant', ''); if ($activeGroup === $group) { $groups[$group]['isActive'] = true; } } } $headerTitle = implode(' ', explode('_', $fieldset->name)); $panelHeadings = ['advance' => 'advanced']; $headerTitle = isset($panelHeadings[$headerTitle]) ? ucwords($panelHeadings[$headerTitle]) : ucwords($headerTitle); ?> <div class="hu-edit-panel <?php echo strtolower($fieldset->name); ?>-panel"> <div class="hu-panel-header"> <span><?php echo $headerTitle; ?></span> <button type="button" role="button" class="hu-btn hu-btn-round hu-btn-round-sm hu-panel-close" data-sidebarclass="<?php echo 'hu-fieldset-' . $fieldset->name; ?>"> <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" fill="none"><path d="M9.708.292a.999.999 0 00-1.413 0l-3.289 3.29L1.717.291A.999.999 0 00.305 1.705l3.289 3.289-3.29 3.289a.999.999 0 101.413 1.412l3.29-3.289 3.288 3.29a.999.999 0 001.413-1.413l-3.29-3.29 3.29-3.288a.999.999 0 000-1.413z"/></svg> </button> </div> <div class="hu-groups-container"> <?php echo LayoutHelper::render('cpanel.control-board.fieldset.groups', ['groups' => $groups, 'fieldset_name' => $fieldset->name], HELIX_LAYOUTS_PATH); ?> </div> </div>PKBA#]L����Esystem/helixultimate/layouts/cpanel/control-board/fieldset/fields.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; extract($displayData); ?> <?php foreach ($groupData as $key => $data): ?> <?php if (\is_numeric($key)): ?> <?php echo LayoutHelper::render('cpanel.control-board.fieldset.field', ['field' => $data, 'group' => $group], HELIX_LAYOUTS_PATH); ?> <?php elseif (preg_match("#^subgroup-.+$#", $key)): ?> <?php $masterLabel = $data[0]->getAttribute('masterlabel'); $masterLabel = isset($masterLabel) ? Text::_($masterLabel) : ''; $masterDescription = $data[0]->getAttribute('masterdesc'); $masterDescription = isset($masterDescription) ? Text::_($masterDescription) : ''; $masterClass = $data[0]->getAttribute('masterclass'); $masterClass = isset($masterClass) ? $masterClass : 'row hu-align-items-center'; $masterHasSeparator = $data[0]->getAttribute('masterseparator'); $masterHasSeparator = isset($masterHasSeparator) && ($masterHasSeparator === 'true' || $masterHasSeparator === 'on') ? ' hu-field-separator': ''; ?> <!-- if master label provider for the subgroup --> <?php if (!empty($masterLabel)): ?> <div class="control-group master-label-group"> <div class="control-label"> <label for=""><?php echo $masterLabel; ?></label> <?php if (!empty($masterDescription)): ?> <span class="hu-help-icon hu-ml-2 fas fa-info-circle"></span> <p class="hu-control-help"><?php echo $masterDescription; ?></p> <?php endif ?> </div> </div> <?php endif ?> <div class="hu-subgroup <?php echo $masterClass . $masterHasSeparator; ?>"> <?php foreach ($data as $subgroup => $field): ?> <?php $classes = $field->getAttribute('subclasses'); $classes = isset($classes) ? $classes : 'col'; ?> <div class="<?php echo $classes; ?>"> <?php echo LayoutHelper::render('cpanel.control-board.fieldset.field', ['field' => $field, 'group' => $group], HELIX_LAYOUTS_PATH); ?> </div> <?php endforeach ?> </div> <?php endif ?> <?php endforeach ?>PKBA#]��lQ��Csystem/helixultimate/layouts/cpanel/control-board/fieldset/icon.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Uri\Uri; extract($displayData); $iconsrc = Uri::root() . "plugins/system/helixultimate/assets/images/icons/{$fieldset->name}.svg"; ?> <div class="hu-fieldset hu-fieldset-<?php echo $fieldset->name; ?>"> <div class="hu-fieldset-header" data-fieldset="<?php echo strtolower($fieldset->name); ?>"> <div class="hu-fieldset-header-inner"> <img class="hu-option-icon" src="<?php echo $iconsrc; ?>" alt="<?php echo $fieldset->name; ?>" alt="<?php echo Text::_($fieldset->label); ?>" /> <span class="hu-option-title"><?php echo Text::_($fieldset->label); ?></span> </div> </div> </div>PKBA#]�:j�!!Dsystem/helixultimate/layouts/cpanel/control-board/fieldset/field.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2026 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use HelixUltimate\Framework\Platform\Settings; use HelixUltimate\Framework\System\JoomlaBridge; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Factory; extract($displayData); ?> <?php /** * Apply chosen for the multiple select field for J3! * @TODO: apply chosen for J4 multiple select. */ if (JoomlaBridge::getVersion('major') < 4) { HTMLHelper::_('formbehavior.chosen', 'select[multiple]'); } else { $multiple = $field->getAttribute('multiple'); if ($multiple === 'true' || $multiple === 'on') { /** @var \Joomla\CMS\Document\HtmlDocument $doc */ $doc = Factory::getDocument(); $doc->addStyleSheet(Uri::root() . 'media/vendor/choicesjs/css/choices.min.css'); $doc->addStyleSheet(Uri::root() . 'plugins/system/helixultimate/assets/css/choices.css'); $doc->addScript(Uri::root() . 'media/vendor/choicesjs/js/choices.min.js'); $doc->addScriptDeclaration(" document.addEventListener('DOMContentLoaded', function() { if (document.getElementById('" . $field->id . "')) { const choices = new Choices('#" . $field->id . "', { removeItemButton: true, itemSelectText: '', }); } }); "); } } $showon = $field->getAttribute('showon'); $attribs = ''; if ($showon) { $attribs .= ' data-showon=\'' . json_encode(Settings::parseShowOnConditions($showon)) . '\''; } $setvalue = ''; if (\is_array($field->value) || \is_object($field->value)) { $setvalue = json_encode($field->value); } else { $setvalue = $field->value; } $track = $field->getAttribute('track'); $hasTrack = true; if (!empty($track)) { $hasTrack = !($track === 'false' || $track === 'off'); } $hideLabel = $field->getAttribute('hideLabel', false); $description = Text::_($field->getAttribute('description', '')); $type = $field->getAttribute('type', 'text'); $multiple = $field->getAttribute('multiple'); $multiple = isset($multiple) && ($multiple === 'true' || $multiple === 'on'); $separator = $field->getAttribute('separator'); $separator = isset($separator) && ($separator === 'true' || $separator === 'on') ? true : false; // Enable disable on $enableOn = $field->getAttribute('enableon', ''); if ($enableOn) { $attribs .= ' data-enableon="' . $enableOn . '"'; } $checkboxStyle = $field->getAttribute('style', 'switch'); $className = $field->getAttribute('className', ''); // Group Class $group_class = (($group) ? 'group-style-' . $group : ''); if ($type === 'checkbox') { $group_class .= ($checkboxStyle === 'plain') ? ' hu-style-checkbox': ' hu-style-switcher'; } $group_class .= $separator ? ' hu-field-separator': ''; $group_class .= !empty($className) ? ' ' . $className : ''; $listStyle = $field->getAttribute('style'); $display = $field->getAttribute('display', ''); $invalidDataFields = ['before_head', 'after_body', 'before_body', 'custom_css', 'custom_js', 'copyright', 'comingsoon_content']; $isValidDataField = !\in_array($field->name, $invalidDataFields); ?> <div class="<?php echo $group_class; ?>" <?php echo $attribs; ?>> <div class="control-group"> <div class="control-group-inner<?php echo $display === 'inline' ? ' hu-inline-group' : ''; ?>"> <?php if ($type === 'checkbox' && $checkboxStyle === 'plain'): ?> <label class="control-label"> <div class="controls <?php echo $hasTrack ? 'trackable' : ''; ?>" data-safepoint='<?php echo $isValidDataField ? $setvalue : ''; ?>' data-currpoint='<?php echo $isValidDataField ? $setvalue : ''; ?>' data-selector="#<?php echo $field->id; ?>"> <?php echo $field->input; ?> </div> <?php if (!$field->getAttribute('hideLabel', false)): ?> <?php echo Text::_(Helper::CheckNull($field->getAttribute('label'))); ?> <!-- if description exists then show the help icon --> <?php if (!empty($description)): ?> <span class="hu-help-icon hu-ml-2 fas fa-info-circle"></span> <?php endif ?> <?php endif; ?> </label> <?php else: ?> <?php if (!$field->getAttribute('hideLabel', false)): ?> <label class="control-label"> <?php echo Text::_(Helper::CheckNull($field->getAttribute('label'))); ?> <!-- if description exists then show the help icon --> <?php if (!empty($description)): ?> <span class="hu-help-icon hu-ml-2 fas fa-info-circle"></span> <?php endif ?> </label> <!-- if description exists and type is not the checkbox then show the help text above of the input field. --> <?php if (!empty($description) && $type !== 'checkbox' && $display !== 'inline'): ?> <div class="hu-control-help"><?php echo $description; ?></div> <?php endif; ?> <?php endif; ?> <div class="controls <?php echo $hasTrack ? 'trackable' : ''; ?>" data-safepoint='<?php echo $isValidDataField ? $setvalue : ''; ?>' data-currpoint='<?php echo $isValidDataField ? $setvalue : ''; ?>' data-selector="#<?php echo $field->id; ?>"> <?php echo $field->input; ?> </div> <?php endif; ?> </div> <!-- if description exists and type is checkbox then show the help text next to the input field. --> <?php if (!empty($description) && ($type === 'checkbox' || $display === 'inline')): ?> <p class="hu-control-help"><?php echo $description; ?></p> <?php endif; ?> </div> </div>PKBA#]N��]>>>system/helixultimate/layouts/cpanel/control-board/settings.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Layout\LayoutHelper; extract($displayData); ?> <div id="hu-options"> <?php foreach ($fieldsets as $key => $fieldset): ?> <?php echo LayoutHelper::render('cpanel.control-board.fieldset.icon', ['fieldset' => $fieldset, 'key' => $key, 'form' => $form], HELIX_LAYOUTS_PATH); ?> <?php endforeach; ?> </div>PKBA#]�:�#�#5system/helixultimate/layouts/cpanel/editor/topbar.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Settings; use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; extract($displayData); $app = Factory::getApplication(); // Gets the FrontEnd Main page Uri $frontEndUri = Uri::getInstance(Uri::root()); $frontEndUri->setScheme(((int) $app->get('force_ssl', 0) === 2) ? 'https' : 'http'); $mainPageUri = $frontEndUri->toString(); $sidebar = new Settings; ?> <div class="hu-topbar"> <div class="topbar-left"> <div class="hu-logo"> <div> <svg xmlns="http://www.w3.org/2000/svg" class="hu-logo" width="82" height="24" fill="none"><path fill="#0345BF" fill-rule="evenodd" d="M6.976 15.448c-.039-.814.233-3.568 4.732-5.779 4.5-2.21 4.965-3.995 4.965-3.995-.465 2.444-1.241 3.143-5.508 5.43-4.066 2.182-4.189 4.344-4.189 4.344zM6.976 20.144s.123-2.162 4.19-4.344c4.266-2.288 5.042-2.987 5.507-5.43 0 0-.465 1.785-4.965 3.995-4.499 2.21-4.77 4.964-4.732 5.78z" clip-rule="evenodd"/><mask id="a" width="25" height="24" x="0" y="0" maskUnits="userSpaceOnUse"><path fill="#fff" d="M0 0h24.002v24H0V0z"/></mask><g mask="url(#a)"><path fill="#0345BF" fill-rule="evenodd" d="M12 23.999C5.385 23.999 0 18.616 0 12 0 5.382 5.384 0 12 0c6.618 0 12.002 5.383 12.002 12.001C24.002 18.616 18.617 24 12 24zm0-22.782C6.057 1.217 1.219 6.053 1.219 12c0 5.944 4.838 10.782 10.783 10.782 5.945 0 10.782-4.838 10.782-10.782 0-5.947-4.837-10.783-10.782-10.783z" clip-rule="evenodd"/></g><path fill="#000" fill-rule="evenodd" d="M40.96 13.988V9.403h-4.89v4.585h-3.004V2.182h3.005V7.04h4.89V2.182h2.997v11.806h-2.997zM48.475 4.544v2.347h5.631v2.362h-5.631v2.372h6.422v2.363H45.47V2.182h9.246v2.362h-6.241zM64 11.476v2.511h-8.01V2.183h3.005v9.294H64zM65.075 13.988h3.004V2.182h-3.004v11.806zM81.168 13.988h-3.59l-2.552-3.763-2.544 3.763h-3.49l4.215-6.035-3.944-5.771h3.491l2.272 3.44 2.28-3.44h3.524l-3.893 5.63 4.231 6.176z" clip-rule="evenodd"/><path fill="#525252" d="M37.02 18.318v3.717a1.883 1.883 0 01-.242.957c-.16.272-.386.481-.677.628-.29.145-.622.217-.999.217-.573 0-1.033-.155-1.38-.467-.343-.314-.522-.748-.534-1.301v-3.75h.456V22c0 .46.131.816.393 1.07.261.252.617.377 1.065.377.45 0 .803-.127 1.062-.38.262-.255.393-.61.393-1.063v-3.687h.464zM40.911 23.374h2.688v.389h-3.152v-5.445h.464v5.056zM49.292 18.711h-1.866v5.052h-.46V18.71h-1.862v-.393h4.188v.393zM52.88 23.763h-.46v-5.445h.46v5.445zM57.114 18.318l2.008 4.805 2.015-4.805h.614v5.445h-.46v-2.371l.037-2.43-2.027 4.8h-.355l-2.019-4.782.038 2.397v2.386h-.46v-5.445h.609zM68.28 22.237h-2.47l-.562 1.526h-.482l2.06-5.445h.438l2.06 5.445h-.478l-.565-1.526zm-2.329-.393h2.184l-1.092-2.965-1.092 2.965zM75.48 18.711h-1.865v5.052h-.46V18.71h-1.862v-.393h4.187v.393zM81.513 21.153h-2.546v2.22h2.928v.39h-3.388v-5.445h3.369v.393h-2.91v2.053h2.547v.389z"/></svg> </div> <span class="hu-version"><?php echo Helper::getVersion(); ?></span> </div> </div> <div class="topbar-middle"> <div class="hu-devices"> <button class="hu-device active" data-device="desktop" title="Desktop"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="15" fill="none"><path fill="#020B53" d="M17.46 12.07c1.196 0 1.79-.578 1.79-1.789V1.79C19.25.57 18.656 0 17.46 0H1.79C.601 0 0 .57 0 1.79v8.491c0 1.211.602 1.79 1.79 1.79h15.67zm-.023-1.023H1.813c-.546 0-.789-.227-.789-.79V1.806c0-.555.243-.79.79-.79h15.624c.547 0 .797.235.797.79v8.453c0 .562-.25.789-.797.789zm-3.125 3.797c.352 0 .633-.29.633-.649a.639.639 0 00-.633-.648H4.915a.645.645 0 00-.64.648c0 .36.288.649.64.649h9.399z"/></svg> </button> <button class="hu-device" data-device="tablet" title="Tablet"> <svg width="15" height="18" viewBox="0 0 15 18" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12.8056 0C13.7316 0 14.4722 0.761229 14.4722 1.68889V16.0889C14.4722 17.0165 13.7316 17.7778 12.8056 17.7778H1.91667C0.990595 17.7778 0.25 17.0165 0.25 16.0889V1.68889C0.25 0.761229 0.990595 0 1.91667 0H12.8056ZM12.8056 0.888889H1.91667L1.81915 0.895113C1.43579 0.944406 1.13889 1.28052 1.13889 1.68889V16.0889L1.14495 16.1894C1.19297 16.5842 1.52036 16.8889 1.91667 16.8889H12.8056L12.9031 16.8827C13.2864 16.8334 13.5833 16.4973 13.5833 16.0889V1.68889L13.5773 1.58843C13.5292 1.19359 13.2019 0.888889 12.8056 0.888889ZM7.36111 14.2222C7.85178 14.2222 8.25 14.6196 8.25 15.1111C8.25 15.6027 7.85178 16 7.36111 16C6.87044 16 6.47222 15.6027 6.47222 15.1111C6.47222 14.6196 6.87044 14.2222 7.36111 14.2222ZM12.2497 12.4444C12.4909 12.4444 12.6944 12.6434 12.6944 12.8889L12.6873 12.9669C12.6496 13.1704 12.468 13.3333 12.2497 13.3333H2.47253C2.23133 13.3333 2.02778 13.1343 2.02778 12.8889L2.03494 12.8109C2.0726 12.6073 2.25419 12.4444 2.47253 12.4444H12.2497Z"/> </svg> </button> <button class="hu-device" data-device="mobile" title="Mobile"> <svg width="12" height="16" viewBox="0 0 12 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M9.99995 0C10.7861 0 11.3611 0.689442 11.3611 1.47778V14.0778C11.3611 14.8661 10.7861 15.5556 9.99995 15.5556H1.83328C1.0471 15.5556 0.472168 14.8661 0.472168 14.0778V1.47778C0.472168 0.689442 1.0471 0 1.83328 0H9.99995ZM9.99995 0.777778H1.83328L1.76014 0.783224C1.47262 0.826355 1.24995 1.12045 1.24995 1.47778V14.0778L1.25449 14.1657C1.29051 14.5112 1.53605 14.7778 1.83328 14.7778H9.99995L10.0731 14.7723C10.3606 14.7292 10.5833 14.4351 10.5833 14.0778V1.47778L10.5787 1.38987C10.5427 1.04439 10.2972 0.777778 9.99995 0.777778ZM5.91661 11.6667C6.34595 11.6667 6.69439 12.0143 6.69439 12.4444C6.69439 12.8746 6.34595 13.2222 5.91661 13.2222C5.48728 13.2222 5.13883 12.8746 5.13883 12.4444C5.13883 12.0143 5.48728 11.6667 5.91661 11.6667ZM7.09068 2.33333C7.3049 2.33333 7.47217 2.50744 7.47217 2.72222L7.46442 2.79879C7.42885 2.973 7.27504 3.11111 7.09068 3.11111H4.74254C4.52832 3.11111 4.36106 2.937 4.36106 2.72222L4.36881 2.64565C4.40438 2.47145 4.55819 2.33333 4.74254 2.33333H7.09068Z"/> </svg> </button> </div> </div> <div class="topbar-right"> <div class="hu-response"> <div class="hu-loading-msg"> <div class="spinner-border spinner-border-sm" role="status"> <span class="visually-hidden">Drafting...</span> </div> <span class="hu-response-msg"><?php echo Text::_('HELIX_ULTIMATE_TOPBAR_MSG_DRAFTING'); ?></span> </div> <div class="hu-done-msg"> <span class="fas fa-check-circle" aria-hidden="true" style="color: green;"></span> <span class="hu-response-msg"><span class="hu-msg"><?php echo Text::_('HELIX_ULTIMATE_TOPBAR_MSG_DRAFTED'); ?></span></span> </div> <button type="button" role="button" class="hu-btn hu-btn-reset action-reset-drafts"> <span class="fas fa-history" aria-hidden="true"></span> <?php echo Text::_('HELIX_ULTIMATE_TOPBAR_MSG_RESET_DRAFT'); ?> </button> </div> <button class="hu-btn hu-btn-primary action-save-template" data-id="<?php echo $id; ?>" data-view="<?php echo $view; ?>"> <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M1.05 1.30792e-06C0.476083 1.30792e-06 0 0.476085 0 1.05V10.95C0 11.5239 0.476083 12 1.05 12H10.95C11.5239 12 12 11.5239 12 10.95V2.85C12.0001 2.79085 11.9886 2.73225 11.9661 2.67756C11.9436 2.62287 11.9105 2.57315 11.8687 2.53125L9.46875 0.131251C9.42685 0.0895008 9.37713 0.0564192 9.32244 0.0338983C9.26774 0.0113773 9.20914 -0.000141288 9.15 1.30792e-06H1.05ZM1.05 0.900001H2.25V4.65C2.25001 4.76934 2.29743 4.88379 2.38181 4.96818C2.4662 5.05257 2.58066 5.09999 2.7 5.1H8.7C8.81934 5.09999 8.93379 5.05257 9.01818 4.96818C9.10257 4.88379 9.14998 4.76934 9.15 4.65V1.0875L11.1 3.0375V10.95C11.1 11.0409 11.0409 11.1 10.95 11.1H1.05C0.959116 11.1 0.9 11.0409 0.9 10.95V1.05C0.9 0.959117 0.959116 0.900001 1.05 0.900001ZM3.15 0.900001H8.25V4.2H3.15V0.900001ZM6 6.15C4.92837 6.15 4.05 7.02837 4.05 8.1C4.05 9.17161 4.92837 10.05 6 10.05C7.07162 10.05 7.95 9.17161 7.95 8.1C7.95 7.02837 7.07162 6.15 6 6.15ZM6 7.05C6.58523 7.05 7.05 7.51477 7.05 8.1C7.05 8.68522 6.58523 9.15 6 9.15C5.41477 9.15 4.95 8.68522 4.95 8.1C4.95 7.51477 5.41477 7.05 6 7.05Z" fill="white"/> </svg> <span class="helix-topbar-save-text hu-ml-1"> <div class="hu-topbar-save-spinner hidden spinner-border spinner-border-sm" role="status"> <span class="visually-hidden">Saving...</span> </div> <?php echo Text::_('HELIX_ULTIMATE_SAVE_CHANGES'); ?> </span> </button> <a class="hu-btn hu-btn-round" href="<?php echo Route::_('index.php?option=com_templates'); ?>"> <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none"><path d="M11.414 11.411a.566.566 0 000-.797L6.586 5.786 11.414.958a.566.566 0 000-.797.58.58 0 00-.797 0L5.79 4.99.961.161a.573.573 0 00-.797 0 .566.566 0 000 .797l4.828 4.828-4.828 4.828a.566.566 0 000 .797.566.566 0 00.797 0l4.828-4.828 4.828 4.828a.559.559 0 00.797 0z"/></svg> </a> </div> </div>PKBA#]m����7system/helixultimate/layouts/cpanel/editor/controls.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Settings; extract($displayData); $sidebar = new Settings; ?> <div id="hu-options-panel"> <div class="hu-panel-handle"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 15 7"><path fill="#020B53" fill-rule="evenodd" d="M1.5 3a1.5 1.5 0 100-3 1.5 1.5 0 000 3zm0 4a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM9 1.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM7.5 7a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM15 1.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM13.5 7a1.5 1.5 0 100-3 1.5 1.5 0 000 3z" clip-rule="evenodd" opacity=".2"/></svg> </div> <div class="hu-fade-border"></div> <?php echo $sidebar->renderBuilderControlBoard(); ?> </div>PKBA#]s��`��1system/helixultimate/layouts/form/field/media.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; defined('JPATH_BASE') or die; extract($displayData); // Load the modal behavior script. HTMLHelper::_('behavior.modal'); // Include jQuery HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'media/mediafield-mootools.min.js', array('version' => 'auto', 'relative' => true, 'framework' => true)); // Tooltip for INPUT showing whole image path $options = array( 'onShow' => 'jMediaRefreshImgpathTip', ); HTMLHelper::_('behavior.tooltip', '.hasTipImgpath', $options); if (!empty($class)) { $class .= ' hasTipImgpath'; } else { $class = 'hasTipImgpath'; } $attr = ''; $attr .= ' title="' . htmlspecialchars('<span id="TipImgpath"></span>', ENT_COMPAT, 'UTF-8') . '"'; // Initialize some field attributes. $attr .= !empty($class) ? ' class="input-small field-media-input ' . $class . '"' : ' class="input-small"'; $attr .= !empty($size) ? ' size="' . $size . '"' : ''; // Initialize JavaScript field attributes. $attr .= !empty($onchange) ? ' onchange="' . $onchange . '"' : ''; // The text field. echo '<div class="input-prepend input-append">'; // The Preview. $showPreview = true; $showAsTooltip = false; switch ($preview) { case 'no': // Deprecated parameter value case 'false': case 'none': $showPreview = false; break; case 'yes': // Deprecated parameter value case 'true': case 'show': break; case 'tooltip': default: $showAsTooltip = true; $options = array( 'onShow' => 'jMediaRefreshPreviewTip', ); HTMLHelper::_('behavior.tooltip', '.hasTipPreview', $options); break; } // Pre fill the contents of the popover if ($showPreview) { if ($value && file_exists(JPATH_ROOT . '/' . $value)) { $src = Uri::root() . $value; } else { $src = ''; } $width = $previewWidth; $height = $previewHeight; $style = ''; $style .= ($width > 0) ? 'max-width:' . $width . 'px;' : ''; $style .= ($height > 0) ? 'max-height:' . $height . 'px;' : ''; $imgattr = array( 'id' => $id . '_preview', 'class' => 'media-preview', 'style' => $style, ); $img = HTMLHelper::_('image', $src, Text::_('JLIB_FORM_MEDIA_PREVIEW_ALT'), $imgattr); $previewImg = '<div id="' . $id . '_preview_img"' . ($src ? '' : ' style="display:none"') . '>' . $img . '</div>'; $previewImgEmpty = '<div id="' . $id . '_preview_empty"' . ($src ? ' style="display:none"' : '') . '>' . Text::_('JLIB_FORM_MEDIA_PREVIEW_EMPTY') . '</div>'; if ($showAsTooltip) { echo '<div class="media-preview add-on">'; $tooltip = $previewImgEmpty . $previewImg; $options = array( 'title' => Text::_('JLIB_FORM_MEDIA_PREVIEW_SELECTED_IMAGE'), 'text' => '<span class="icon-eye" aria-hidden="true"></span>', 'class' => 'hasTipPreview' ); echo HTMLHelper::_('tooltip', $tooltip, $options); echo '</div>'; } else { echo '<div class="media-preview add-on" style="height:auto">'; echo ' ' . $previewImgEmpty; echo ' ' . $previewImg; echo '</div>'; } } echo ' <input type="text" name="' . $name . '" id="' . $id . '" value="' . htmlspecialchars($value ?? "", ENT_COMPAT, 'UTF-8') . '" readonly="readonly"' . $attr . ' data-basepath="' . Uri::root() . '"/>'; ?> <a class="modal btn" title="<?php echo Text::_('JLIB_FORM_BUTTON_SELECT'); ?>" href=" <?php echo ($readonly ? '' : ($link ?: 'index.php?option=com_media&view=images&tmpl=component&asset=' . $asset . '&author=' . $authorField) . '&fieldid=' . $id . '&folder=' . $folder) . '"' . ' rel="{handler: \'iframe\', size: {x: 800, y: 500}}"'; ?>> <?php echo Text::_('JLIB_FORM_BUTTON_SELECT'); ?></a><a class="btn hasTooltip" title="<?php echo Text::_('JLIB_FORM_BUTTON_CLEAR'); ?>" href="#" onclick="jInsertFieldValue('', '<?php echo $id; ?>'); return false;"> <span class="icon-remove" aria-hidden="true"></span></a> </div>PKBA#]*6��(system/helixultimate/layouts/display.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Settings; use Joomla\CMS\Factory; use Joomla\CMS\Layout\LayoutHelper; extract($displayData); $app = Factory::getApplication(); $sidebar = new Settings; ?> <div id="helix-ultimate"> <?php echo LayoutHelper::render('cpanel.editor.topbar', ['id' => $id, 'view' => $view], HELIX_LAYOUTS_PATH); ?> <div class="hu-options-core"> <div class="hu-options-container"> <?php echo LayoutHelper::render('cpanel.editor.controls', ['id' => $id, 'view' => $view], HELIX_LAYOUTS_PATH); ?> <div class="hu-fieldset-contents"> <form id="hu-style-form" action="index.php"> <?php echo $sidebar->renderFieldsetContents(); ?> <!-- meta hidden values --> <input type="hidden" name="id" value="<?php echo $style->id; ?>"> <input type="hidden" name="template" value="<?php echo $style->template; ?>"> <input type="hidden" name="client_id" value="<?php echo $style->client_id; ?>"> <input type="hidden" name="home" value="<?php echo $style->home; ?>"> <input type="hidden" name="title" value="<?php echo $style->title; ?>"> </form> </div> </div> </div> <div class="hu-container"> <div class="hu-preview"> <?php echo LayoutHelper::render('preview.iframe', $iframe, HELIX_LAYOUTS_PATH); ?> </div> </div> </div>PKBA#]�O�Ã�1system/helixultimate/layouts/masonry/bloglist.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Associations; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; $item = $displayData[0]; $counter = $displayData[1]; // Create a shortcut for params. $params = $item->params; $attribs = json_decode($item->attribs ?? ""); HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers/html'); $canEdit = $item->params->get('access-edit'); $info = $params->get('info_block_position', 0); $article_format = (isset($attribs->helix_ultimate_article_format) && $attribs->helix_ultimate_article_format) ? $attribs->helix_ultimate_article_format : 'standard'; $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $tmpl_params = $template->params; // Check if associations are implemented. If they are, define the parameter. $assocParam = (Associations::isEnabled() && $params->get('show_associations')); $currentDate = Factory::getDate()->format('Y-m-d H:i:s'); $isUnpublished = JVERSION < 4 ? ($item->state == 0 || strtotime($item->publish_up) > strtotime(Factory::getDate()) || ((strtotime($item->publish_down) < strtotime(Factory::getDate())) && $item->publish_down != Factory::getDbo()->getNullDate())) : ($item->state == Joomla\Component\Content\Administrator\Extension\ContentComponent::CONDITION_UNPUBLISHED || $item->publish_up > $currentDate) || ($item->publish_down < $currentDate && $item->publish_down !== null); $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <?php if($article_format == 'gallery') : ?> <?php echo LayoutHelper::render('joomla.content.blog.gallery', array('attribs' => $attribs, 'id'=>$item->id)); ?> <?php elseif($article_format == 'video') : ?> <?php echo LayoutHelper::render('joomla.content.blog.video', array('attribs' => $attribs)); ?> <?php elseif($article_format == 'audio') : ?> <?php echo LayoutHelper::render('joomla.content.blog.audio', array('attribs' => $attribs)); ?> <?php else: ?> <?php echo LayoutHelper::render('joomla.content.intro_image', $item); ?> <?php endif; ?> <?php if ($item->featured) :?> <!-- Featured Tag --> <span class="badge bg-danger featured-article-badge"><?php echo Text::_('HELIX_ULTIMATE_FEATURED'); ?></span> <?php endif; ?> <div class="article-body"> <?php if ($isUnpublished) : ?> <div class="system-unpublished"> <?php endif; ?> <?php echo LayoutHelper::render('joomla.content.blog_style_default_item_title', $item); ?> <?php // Todo Not that elegant would be nice to group the params ?> <?php $useDefList = ($params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date') || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam); ?> <?php if ($useDefList && ($info == 0 || $info == 2)) : ?> <?php echo LayoutHelper::render('joomla.content.info_block', array('item' => $item, 'params' => $params, 'position' => 'above', 'intro' => true)); ?> <?php endif; ?> <?php if ($params->get('show_tags', 1) && !$tmpl_params->get('show_list_tags',0) && !empty($item->tags->itemTags)) : ?> <?php $item->tagLayout = new FileLayout('joomla.content.tags'); ?> <?php echo $item->tagLayout->render($item->tags->itemTags); ?> <?php endif; ?> <?php if (!$params->get('show_intro')) : ?> <?php // Content is generated by content plugin event "onContentAfterTitle" ?> <?php echo $item->event->afterDisplayTitle; ?> <?php endif; ?> <?php // Content is generated by content plugin event "onContentBeforeDisplay" ?> <?php echo $item->event->beforeDisplayContent; ?> <div class="article-introtext"> <?php echo $item->introtext; ?> <?php if ($useDefList && ($info == 1)) : ?> <?php echo LayoutHelper::render('joomla.content.info_block', array('item' => $item, 'params' => $params, 'position' => 'below', 'intro' => true)); ?> <?php endif; ?> <?php if ($params->get('show_readmore') && $item->readmore) : if ($params->get('access-view')) : $link = Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language) : ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)); else : $menu = Factory::getApplication()->getMenu(); $active = $menu->getActive(); $itemId = $active->id; $link = new Uri(Route::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); $link->setVar('return', base64_encode(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language) : ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language))); endif; ?> <?php echo LayoutHelper::render('joomla.content.readmore', array('item' => $item, 'params' => $params, 'link' => $link)); ?> <?php endif; ?> </div> <?php if ($isUnpublished) : ?> </div> <?php endif; ?> </div> <?php // Content is generated by content plugin event "onContentAfterDisplay" ?> <?php echo $item->event->afterDisplayContent; ?> PKBA#]�i�n�n&system/helixultimate/helixultimate.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <joomshaper@js.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); /** * Bootstrap php file. * This is responsible for auto-loading php classes. * * @since 2.0.0 */ require_once __DIR__ . '/bootstrap.php'; use HelixUltimate\Framework\Core\HelixUltimate; use HelixUltimate\Framework\Platform\Blog; use HelixUltimate\Framework\Platform\Helper; use HelixUltimate\Framework\Platform\Media; use HelixUltimate\Framework\Platform\Platform; use HelixUltimate\Framework\System\JoomlaBridge; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\Form\Form; use Joomla\CMS\Helper\MediaHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Response\JsonResponse; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\Database\DatabaseInterface; use Joomla\Registry\Registry; use Joomla\CMS\Table\Table; // Constant definition define('HELIX_LAYOUTS_PATH', JPATH_PLUGINS . '/system/helixultimate/layouts'); define('HELIX_LAYOUT_PATH', JPATH_PLUGINS . '/system/helixultimate/layout'); /** * Class for System Plugin HelixUltimate. * * @since 1.0.0 */ class PlgSystemHelixultimate extends CMSPlugin { /** * Is autoload language. * * @var boolean $autoloadLanguage * @since 1.0.0 */ protected $autoloadLanguage = true; /** * Joomla! app instance. * * @var CMSApplication $app The CMS application instance. * @since 1.0.0 */ protected $app; /** * The application initialization event. * * @return void * @since 4.0.7 */ public function onAfterInitialise() { if (JVERSION < 4) { $this->registerBootstrap(); } } /** * Register the missing bootstrap methods tooltip and popover. * * @return void * @since 2.0.6 */ private function registerBootstrap() { $bootstrapPath = JPATH_ROOT . '/plugins/system/helixultimate/html/layouts/libraries/cms/html/bootstrap.php'; if ($this->app->isClient('site') && \file_exists($bootstrapPath)) { if (!class_exists('HelixBootstrap')) { require_once $bootstrapPath; } HTMLHelper::register('bootstrap.tooltip', ['HelixBootstrap', 'tooltip']); HTMLHelper::register('bootstrap.popover', ['HelixBootstrap', 'popover']); } } /** * The form event. Load additional parameters when available into the field form. * Only when the type of the form is of interest. * * @param Form $form The form. * @param stdClass $data The data. * * @return void * @since 1.0.0 */ public function onContentPrepareForm(Form $form, $data) { $app = \Joomla\CMS\Factory::getApplication(); if ($app->isClient('api') || $app->isClient('console') || !method_exists($app, 'getTemplate')) { return true; } $doc = Factory::getDocument(); $plgPath = Uri::root(true) . '/plugins/system/helixultimate'; Form::addFormPath(JPATH_PLUGINS . '/system/helixultimate/params'); $template = Factory::getApplication()->getTemplate(true); $tmplUrl = Uri::root(true) . '/templates/' . $template->template; $tmplPath = JPATH_ROOT . '/templates/' . $template->template; // Add Font Awesome from template or plugin if (is_file($tmplPath . '/css/font-awesome.min.css')) { $doc->addStyleSheet($tmplUrl . '/css/font-awesome.min.css', ['version' => 'auto', 'relative' => false]); } elseif (is_file(JPATH_PLUGINS . '/system/helixultimate/assets/css/font-awesome.min.css')) { $doc->addStyleSheet($plgPath . '/assets/css/font-awesome.min.css', ['version' => 'auto', 'relative' => false]); } // For menu item form if ($form->getName() === 'com_menus.item') { HTMLHelper::_('jquery.framework'); $doc->addScript($plgPath . '/assets/js/admin/jquery-ui.min.js', ['relative' => false, 'version' => 'auto']); $doc->addStyleSheet($plgPath . '/assets/css/admin/modal.css', ['relative' => false, 'version' => 'auto']); $doc->addScript($plgPath . '/assets/js/admin/modal.js', ['relative' => false, 'version' => 'auto']); $form->loadFile('megamenu', false); } // For article form if ($form->getName() === 'com_content.article') { HTMLHelper::_('jquery.framework'); HTMLHelper::_('jquery.token'); Text::script('JGLOBAL_CONFIRM_DELETE'); Text::script('HELIX_ULTIMATE_UPLOAD_IMAGE_FAILED'); Text::script('HELIX_ULTIMATE_REMOVE_IMAGE_FAILED'); Text::script('HELIX_ULTIMATE_UPLOAD_GALLERY_IMAGE_FAILED'); Text::script('HELIX_ULTIMATE_REMOVE_GALLERY_IMAGE_FAILED'); Text::script('HELIX_ULTIMATE_UPLOAD_PROGRESS_NOT_SUPPORTED'); $doc->addStyleSheet($plgPath . '/assets/css/admin/blog-options.css', ['relative' => false, 'version' => 'auto']); $doc->addScript($plgPath . '/assets/js/admin/blog-options.js', ['relative' => false, 'version' => 'auto']); if (is_file($tmplPath . '/blog-options.xml')) { Form::addFormPath($tmplPath); } $form->loadFile('blog-options', false); } } /** * The content before save event. * * @param string $typeAlias Form type alias. * @param Table $table Table object. * @param bool $isNew True if new. * @param array $data Data array. * * @return bool * @since 2.2.2 */ public function onContentBeforeSave(string $typeAlias, $table, bool $isNew, $data = []) { //Only handle com_content form type if ($typeAlias !== 'com_content.form') { return true; } // Only update existing articles if ($isNew || empty($table->id)) { return true; } // Only when saving from the frontend $app = Factory::getApplication(); if (!$app->isClient('site')) { return true; } $old = Table::getInstance('content'); $old->load($table->id); $oldAttribs = json_decode($old->attribs ?: '{}', true); if (!is_array($oldAttribs)) { $oldAttribs = []; } // Decode new attribs coming from the frontend form $newAttribs = json_decode($table->attribs ?: '{}', true); if (!is_array($newAttribs)) { $newAttribs = []; } $merged = $oldAttribs; foreach ($newAttribs as $key => $value) { if (in_array($key, Helper::getHelixAttribKeys(), true)) { $merged[$key] = $value; } } $table->attribs = json_encode($merged); return true; } /** * On Saving extensions logging method * Method is called when an extension is being saved * * @param string $context The extension * @param JTable $table DataBase Table object * @param boolean $isNew If the extension is new or not * * @throws \Exception * @since 2.2.2 */ public function onExtensionBeforeSave($context, $table, $isNew) { // Only handle template styles if ($context !== 'com_templates.style') { return true; } // Check if this template uses Helix Ultimate framework if (!$this->isHelixTemplate($table->template)) { return true; } $data = new Registry($table->params); if (!empty($table->id)) { $params = $this->getTemplateStyleParams($table->id); $table->params = $params; return true; } if ($isNew) { $app = Factory::getApplication(); $id = $app->input->get('id', 0); if (!$id) { return true; } $params = $this->getTemplateStyleParams($id); $table->params = $params; } } /** * Check if template uses the Helix Ultimate framework * * @param string $templateName The template name * * @return bool True if the template uses Helix Ultimate, false otherwise * @since 2.2.2 */ private function isHelixTemplate($templateName) { if (empty($templateName)) { return false; } $templatePath = JPATH_SITE . '/templates/' . $templateName; // Check if the template has an options.json file (Helix Ultimate indicator) if (file_exists($templatePath . '/options.json')) { return true; } // Check if the template's index.php includes the Helix Ultimate bootstrap $indexPath = $templatePath . '/index.php'; if (file_exists($indexPath)) { $content = @file_get_contents($indexPath); if ($content !== false && strpos($content, 'helixultimate/bootstrap.php') !== false) { return true; } } return false; } /** * On Saving extensions logging method * Method is called when an extension is being saved * * @param string $context The extension * @param JTable $table DataBase Table object * @param boolean $isNew If the extension is new or not * * @return void * @since 1.0.0 */ public function onExtensionAfterSave($context, $table, $isNew) { if ($context === 'com_templates.style' && !empty($table->id)) { $params = new Registry; $params->loadString($table->params); $email = $params->get('joomshaper_email'); $license_key = $params->get('joomshaper_license_key'); $template = trim($table->template); if (!empty($email) && !empty($license_key)) { $extra_query = 'joomshaper_email=' . urlencode($email); $extra_query .= '&joomshaper_license_key=' . urlencode($license_key); $db = Factory::getContainer()->get(DatabaseInterface::class); $fields = array( $db->quoteName('extra_query') . ' = ' . $db->quote($extra_query), $db->quoteName('last_check_timestamp') . ' = 0' ); $query = $db->getQuery(true) ->update($db->quoteName('#__update_sites')) ->set($fields) ->where($db->quoteName('name') . ' = ' . $db->quote($template)); $db->setQuery($query); $db->execute(); } } } /** * Get the template style params * * @param int $id The template style id * * @return string The template style params * @since 2.2.2 */ public function getTemplateStyleParams($id) { $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); $query->select($db->quoteName('params')) ->from($db->quoteName('#__template_styles')) //->where($db->quoteName('client_id') . ' = 0') ->where($db->quoteName('id') . ' = ' . $db->quote($id)); $db->setQuery($query); $tparams = $db->loadResult(); return $tparams; } /** * Attach the joomla web asset JSON file to the registry. * From Joomla!4, the new web asset manager comes into the account. * The templates might contains a joomla.asset.json file for managing * the web assets. * * @return void * @since 2.0.5 */ private function attachWebAsset() { $activeMenu = $this->app->getMenu()->getActive(); $template = !empty($activeMenu) && $activeMenu->template_style_id > 0 ? Helper::getTemplateStyle($activeMenu->template_style_id) : Helper::loadTemplateData(); $webAssetUri = '/templates/' . $template->template . '/joomla.asset.json'; if(JVERSION >= 4 && \file_exists(JPATH_ROOT . $webAssetUri)) { Factory::getDocument()->getWebAssetManager()->getRegistry()->addRegistryFile($webAssetUri); } } /** * After route. * * @return void * * @since 1.0.0 */ public function onAfterRoute() { $option = $this->app->input->get('option', '', 'STRING'); $helix = $this->app->input->get('helix', '', 'STRING'); $view = $this->app->input->get('view', '', 'STRING'); $task = $this->app->input->get('task', '', 'STRING'); $request = $this->app->input->get('request', '', 'STRING'); $action = $this->app->input->get('action', '', 'STRING'); $id = $this->app->input->get('id', 0, 'INT'); $tmpl = $this->app->input->get('tmpl', '', 'STRING'); $helixReturn= $this->app->input->get('helixreturn', '', 'STRING'); $this->attachWebAsset(); // Legacy framework identifier consumed by downstream Helix scripts. $this->app->input->set('helix_id', 9); if ($this->app->isClient('administrator') && $option === 'com_ajax' && $helix === 'ultimate' && !empty($id)) { $this->app->input->set('tmpl', 'component'); if ($this->app->input->get('format', '', 'STRING') !== 'html') { $this->app->input->set('format', 'html'); } } if ($this->app->isClient('administrator') && $option === 'com_ajax' && $helix === 'ultimate' && !Factory::getApplication()->getIdentity()->id) { // Redirect to the login page $return = urlencode(base64_encode('index.php?option=com_ajax&helix=ultimate&id=' . $id)); $this->app->redirect(Route::_('index.php?helixreturn=' . $return, false)); } /** If `helixreturn` query exists in the url then redirect to the return url. */ if (Factory::getApplication()->getIdentity()->id && !empty($helixReturn)) { $redirectUrl = Helper::validateInternalRedirect($helixReturn); if ($redirectUrl !== null) { $this->app->redirect($redirectUrl); } } if ($this->app->isClient('administrator')) { if ($option === 'com_ajax' && $helix === 'ultimate') { Helper::flushSettingsDataToJs(); if ($task === 'export' && !empty($id)) { $user = Factory::getApplication()->getIdentity(); if (!$user->authorise('core.edit', 'com_templates')) { throw new \Exception(Text::_('JERROR_ALERTNOAUTHOR'), 403); } $template = $this->getTemplateName($id); header('Content-Description: File Transfer'); header('Content-type: application/txt'); header('Content-Disposition: attachment; filename="' . $template->template . '_settings_' . date('d-m-Y') . '.json"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); echo $template->params; exit(); } /** * Trigger the onAfterRespond event in every ajax route hit. */ if (!empty($request)) { if (JoomlaBridge::getVersion('major') > 4) { $this->app->getDispatcher()->dispatch('onAfterRespond'); } else { $this->app->triggerEvent('onAfterRespond'); } } } } if ($this->app->isClient('site')) { $option = $this->app->input->get('option', '', 'STRING'); $helix = $this->app->input->get('helix', '', 'STRING'); $request = $this->app->input->get('request', '', 'STRING'); $action = $this->app->input->get('action', '', 'STRING'); if ($option === 'com_ajax' && $helix === 'ultimate' && $request === 'task' && $action !== '') { Helper::guardAjaxRequest($action); switch ($action) { case 'upload-blog-image': Blog::upload_image(); break; case 'remove-blog-image': Blog::remove_image(); break; case 'view-media': Media::getFolders(); break; case 'delete-media': Media::deleteMedia(); break; case 'upload-media': Media::uploadMedia(); break; } } } } /** * Event on after respond. * On this event initialize the platform. * * @return void * @since 1.0.0 */ public function onAfterRespond() { $request = $this->app->input->get('request', '', 'STRING'); if ($this->app->isClient('administrator') && !empty($request)) { /** * On every ajax request handle the request from here. */ (new Platform)->handleRequests(); } } /** * Method to catch the onAfterDispatch event. * This event is responsible for rendering the framework settings. * * @return void * @since 1.0.0 */ public function onAfterDispatch() { $this->registerBootstrap(); $option = $this->app->input->get('option', '', 'STRING'); $helix = $this->app->input->get('helix', '', 'STRING'); $view = $this->app->input->get('view', '', 'STRING'); $task = $this->app->input->get('task', '', 'STRING'); $request = $this->app->input->get('request', '', 'STRING'); $action = $this->app->input->get('action', '', 'STRING'); $id = $this->app->input->get('id', 0, 'INT'); if ($this->app->isClient('administrator') && $option === 'com_ajax' && $helix === 'ultimate' && !empty($id) && empty($request)) { Platform::loadFrameworkSystem(); } } public function onBeforeCompileHead() { $template = Helper::loadTemplateData(); $params = $template->params; if ($this->app->isClient('administrator') && $this->app->input->get('option') === 'com_ajax' && $this->app->input->get('helix') === 'ultimate') { // Generating method `sanitizeAssetsForJ3` or `sanitizeAssetsForJ4` according to the Joomla major version. $sanitizeMethod = 'sanitizeAssetsForJ' . JoomlaBridge::getVersion('major'); $this->$sanitizeMethod(); } if ($this->app->isClient('site')) { $theme = new HelixUltimate; if ($params->get('compress_css')) { $theme->compress_css($params->get('exclude_css')); } if ($params->get('compress_js')) { $theme->compress_js($params->get('exclude_js')); } if ($params->get('image_lazy_loading', 0)) { $theme->add_js('lazysizes.min.js'); } /** * Adding custom directory for the assets. * If anyone put any file inside the `templates/{template}/css/custom` * or `templates/{template}/js/custom` directory then the files * would be added to the site. */ $theme->addCustomCSS(); $theme->addCustomSCSS(); $theme->addCustomJS(); } } /** * Sanitize the assets i.e. scripts and stylesheets before adding to the head. * This function is applicable for Joomla 3. * @note This method is using dynamically. * * @return void * @since 2.0.0 */ private function sanitizeAssetsForJ3() { $headData = Factory::getDocument()->getHeadData(); $styles = $headData['styleSheets']; $scripts = $headData['scripts']; if (!empty($styles)) { foreach ($styles as $url => $style) { $paths = explode('/', $url); if ($paths[count($paths) - 1] === 'template.css') { unset($styles[$url]); } } } if (!empty($scripts)) { foreach ($scripts as $url => $script) { $paths = explode('/', $url); if ($paths[count($paths) - 1] === 'template.js') { unset($scripts[$url]); } } } $headData['styleSheets'] = $styles; $headData['scripts'] = $scripts; Factory::getDocument()->setHeadData($headData); } /** * Sanitize the assets i.e. scripts and stylesheets before adding to the head. * This function is applicable for Joomla 4. * @note This method is using dynamically. * * @return void * @since 2.0.0 */ private function sanitizeAssetsForJ4() { $doc = Factory::getDocument(); $wa = $doc->getWebAssetManager(); /** * Disable the atum specific styles and scripts. */ $assets = [ 'style' => ['template.atum.base', 'template.atum', 'template.active', 'template.active.language', 'template.user', 'template.atum.ltr', 'template.atum.rtl'], 'script' => ['choicesjs', 'dragula'] ]; foreach ($assets as $type => $names) { foreach ($names as $name) { if ($wa->assetExists($type, $name)) { $methodName = 'disable' . ucfirst($type); $wa->$methodName($name); } } } } /** * Sanitize the assets i.e. scripts and stylesheets before adding to the head. * This function is applicable for Joomla 4. * @note This method is using dynamically. * * @return void * @since 2.0.17 */ private function sanitizeAssetsForJ5() { $doc = Factory::getDocument(); $wa = $doc->getWebAssetManager(); /** * Disable the atum specific styles and scripts. */ $assets = [ 'style' => ['template.atum.base', 'template.atum', 'template.active', 'template.active.language', 'template.user', 'template.atum.ltr', 'template.atum.rtl'], 'script' => ['choicesjs', 'dragula'] ]; foreach ($assets as $type => $names) { foreach ($names as $name) { if ($wa->assetExists($type, $name)) { $methodName = 'disable' . ucfirst($type); $wa->$methodName($name); } } } } /** * Sanitize the assets i.e. scripts and stylesheets before adding to the head. * This function is applicable for Joomla 4. * @note This method is using dynamically. * * @return void * @since 2.2.0 */ private function sanitizeAssetsForJ6() { $doc = Factory::getDocument(); $wa = $doc->getWebAssetManager(); /** * Disable the atum specific styles and scripts. */ $assets = [ 'style' => ['template.atum.base', 'template.atum', 'template.active', 'template.active.language', 'template.user', 'template.atum.ltr', 'template.atum.rtl'], 'script' => ['choicesjs', 'dragula'] ]; if (JVERSION >= 6) { $doc->addScript(Uri::root(true) . '/plugins/system/helixultimate/assets/js/chosen.jquery.js'); $doc->addStyleSheet(Uri::root(true) . '/plugins/system/helixultimate/assets/css/chosen.css'); } foreach ($assets as $type => $names) { foreach ($names as $name) { if ($wa->assetExists($type, $name)) { $methodName = 'disable' . ucfirst($type); $wa->$methodName($name); } } } } public function onBeforeRender() { $option = $this->app->input->get('option', '', 'STRING'); $helix = $this->app->input->get('helix', '', 'STRING'); $id = $this->app->input->get('id', 0, 'INT'); if ($option === 'com_ajax' && $helix === 'ultimate' && $id) { if ($this->app->isClient('site')) { $template = Helper::loadTemplateData(); $this->app->setTemplate($template->template, $template->params); } } } public function onAfterRender() { $template = Helper::loadTemplateData(); $params = $template->params; $excludeComponents = ['com_spsimpleportfolio']; $option = $this->app->input->getCmd('option', ''); if ($this->app->isClient('site') && $params->get('image_lazy_loading', 0)) { if(\in_array($option, $excludeComponents)) { return; } // Check for Page Builder lazy load, if finds it will skip Helix lazy load $pagebuilder = false; $sp_pb_lazyload = 0; if ($option === 'com_sppagebuilder') { $pagebuilder = true; } if ($pagebuilder) { $config = ComponentHelper::getParams('com_sppagebuilder'); $sp_pb_lazyload = $config->get('lazyloadimg', '0'); } if ($sp_pb_lazyload != 0) { return; } $srcRegex = "@<img[^>]*src=[\"\']([^\"\']*)[\"\'][^>]*>@"; $classRegex = "@<img[^>]*class=[\"\']([^\"\']*)[\"\'][^>]*>@"; $body = $content = $this->app->getBody(); $find = []; /** Get all the images tags. */ preg_match_all($srcRegex, $body, $matches); if (!empty($matches)) { /** * Update the relative path (starts with (/)images/../) * by absolute path i.e. path `images/headers/raindrops.jpg` * with `/path/to/the/project/images/headers/raindrops.jpg` */ foreach ($matches[1] as $key => $match) { $find[] = $matches[0][$key]; /** Cleanup the image src. */ $_match = JVERSION >= 4 ? MediaHelper::getCleanMediaFieldValue($match) : $match; if (preg_match("@(^images\/|^\/+images\/).*$@", $match)) { $update = Uri::base() . $_match; $regex = "@" . \preg_quote($match, '/') . "@"; $matches[0][$key] = preg_replace($regex, $update, $matches[0][$key]); } else { if ($match !== $_match) { $regex = "@" . \preg_quote($match, '/') . "@"; $matches[0][$key] = preg_replace($regex, $_match, $matches[0][$key]); } } } /** Loop through the full matches. */ foreach ($matches[0] as $key => $match) { $imageElement = $match; /** * If there has a src attributes * then replace them with data-src. */ if (preg_match("@src=[\"\']([^\"\']*)[\"\']@", $imageElement)) { $imageElement = preg_replace("@src(?=\=[\"\']([^\"\']*)[\"\'])@", "data-src", $imageElement); } /** * If srcset exists in the img element then * replace the srcset with the data-srcset and add a new * data-size='auto' attribute value for maintaining size */ if (preg_match("@srcset=[\"\']([^\"\']*)[\"\']@", $imageElement)) { $imageElement = preg_replace("@srcset(?=\=[\"\']([^\"\']*)[\"\'])@", "data-srcset", $imageElement); $dataSize = 'data-size="auto" />'; $imageElement = preg_replace("@(<img[^>]*?)(\/?>)@", "$1 " . $dataSize, $imageElement); } /** Check if there is any class attribute at the image element. */ if (preg_match($classRegex, $imageElement, $classMatches)) { /** * If there is a class attribute then take the class * names and append a class 'lazyload' with the existing * classes and replace the previous class attribute with * updating one. */ if (!empty($classMatches)) { $sp_pb_lazy_found = false; // Test if string contains 'sppb-element-lazy' if(strpos($classMatches[1], 'sppb-element-lazy') !== false) { $sp_pb_lazy_found = true; } else { $sp_pb_lazy_found = false; } if($sp_pb_lazy_found) { $newClass = 'class="' . $classMatches[1] . '"'; $imageElement = preg_replace("@class=[\"\']([^\"\']*)[\"\']@", $newClass, $imageElement); } else { $newClass = 'class="' . $classMatches[1] . ' lazyload"'; $imageElement = preg_replace("@class=[\"\']([^\"\']*)[\"\']@", $newClass, $imageElement); } } } else { /** If no class attribute exists then add a class attribute. */ $newClass = 'class="lazyload" />'; $imageElement = preg_replace("@(<img[^>]*?)(\/?>)@", "$1 " . $newClass, $imageElement); } /** Update the content with updated images. */ $content = str_replace($find[$key], $imageElement, $content); } } /** * Set the body content with updated images */ $this->app->setBody($content); } } /** * Get template object by it's ID. * * @param int $id The template ID. * * @return object Template object. * @since 1.0.0 */ private function getTemplateName($id = 0) { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select('*'); $query->from($db->quoteName('#__template_styles')); $query->where($db->quoteName('client_id') . ' = 0'); if (empty($id)) { $query->where($db->quoteName('home') . ' = ' . $db->quote('1', false)); } else { $query->where($db->quoteName('id') . ' = ' . (int) $id); } $db->setQuery($query); return $db->loadObject(); } public function onAjaxHelixultimate() { $app = Factory::getApplication(); $input = $app->input; $task = $input->get('task', '', 'STRING'); // If no task provided to the request then it close with a 403 bad request error. if (empty($task)) { $app->setHeader('status', 403, true); $app->sendHeaders(); echo new JsonResponse('You missed to pass task at your requested URL.'); $app->close(); } // Destructing the Class and method from the task $namespace = "HelixUltimate\\Framework\\HttpResponse\\"; $class = "Response"; $method = ''; $classMethod = explode('.', $task); if (count($classMethod) === 1) { $method = $classMethod[0]; } elseif (count($classMethod) === 2) { $class = ucfirst($classMethod[0]); $method = $classMethod[1]; } else { $app->setHeader('status', 500, true); $app->sendHeaders(); echo new JsonResponse('task is not in a proper format. Use "className.method" or only "method" format without quote.'); $app->close(); } $class = $namespace . $class; // Check if the class is exists or not if (!\class_exists($class)) { $app->setHeader('status', 500, true); $app->sendHeaders(); echo new JsonResponse('The class "' . $class . '" does not exist!'); $app->close(); } // Check if the method exists if (!\method_exists($class, $method)) { $app->setHeader('status', 500, true); $app->sendHeaders(); echo new JsonResponse('Method "' . $method . '" inside the class "' . $class . '" does not exist!'); $app->close(); } Helper::guardAjaxRequest($method); // $instance = new $class(); $response = $class::$method(); $app->setHeader('status', 200, true); $app->sendHeaders(); echo new JsonResponse($response); $app->close(); } } PKBA#]�@�G"system/helixultimate/bootstrap.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ require_once __DIR__ . '/vendor/autoload.php'; PKBA#]�I���Asystem/helixultimate/overrides_legacy/mod_breadcrumbs/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\WebAsset\WebAssetManager; ?> <nav class="mod-breadcrumbs__wrapper" aria-label="<?php echo htmlspecialchars($module->title, ENT_QUOTES, 'UTF-8'); ?>"> <ol class="mod-breadcrumbs breadcrumb px-3 py-2"> <?php if ($params->get('showHere', 1)) : ?> <li class="mod-breadcrumbs__here float-start"> <?php echo Text::_('MOD_BREADCRUMBS_HERE'); ?>  </li> <?php else : ?> <li class="mod-breadcrumbs__divider float-start"> <span class="divider icon-location icon-fw" aria-hidden="true"></span> </li> <?php endif; ?> <?php // Get rid of duplicated entries on trail including home page when using multilanguage for ($i = 0; $i < $count; $i++) { if ($i === 1 && !empty($list[$i]->link) && !empty($list[$i - 1]->link) && $list[$i]->link === $list[$i - 1]->link) { unset($list[$i]); } } // Find last and penultimate items in breadcrumbs list end($list); $last_item_key = key($list); prev($list); $penult_item_key = key($list); // Make a link if not the last item in the breadcrumbs $show_last = $params->get('showLast', 1); $class = null; // Generate the trail foreach ($list as $key => $item) : if ($key !== $last_item_key) : if (!empty($item->link)) : $breadcrumbItem = HTMLHelper::_('link', Route::_($item->link), '<span>' . $item->name . '</span>', ['class' => 'pathway']); else : $breadcrumbItem = '<span>' . $item->name . '</span>'; endif; echo '<li class="mod-breadcrumbs__item breadcrumb-item' . $class . '">' . $breadcrumbItem . '</li>'; elseif ($show_last) : // Render last item if required. $breadcrumbItem = '<span>' . $item->name . '</span>'; $class = ' active'; echo '<li class="mod-breadcrumbs__item breadcrumb-item' . $class . '">' . $breadcrumbItem . '</li>'; endif; endforeach; ?> </ol> <?php // Structured data as JSON $data = [ '@context' => 'https://schema.org', '@type' => 'BreadcrumbList', '@id' => Uri::root() . '#/schema/BreadcrumbList/' . (int) $module->id, 'itemListElement' => [] ]; // Use an independent counter for positions. E.g. if Heading items in pathway. $itemsCounter = 0; // If showHome is disabled use the fallback $homeCrumb for startpage at first position. if (isset($homeCrumb)) { $data['itemListElement'][] = [ '@type' => 'ListItem', 'position' => ++$itemsCounter, 'item' => [ '@id' => Route::_($homeCrumb->link, true, Route::TLS_IGNORE, true), 'name' => $homeCrumb->name, ], ]; } foreach ($list as $key => $item) { // Only add item to JSON if it has a valid link, otherwise skip it. if (!empty($item->link)) { $data['itemListElement'][] = [ '@type' => 'ListItem', 'position' => ++$itemsCounter, 'item' => [ '@id' => Route::_($item->link, true, Route::TLS_IGNORE, true), 'name' => $item->name, ], ]; } elseif ($key === $last_item_key) { // Add the last item (current page) to JSON, but without a link. // Google accepts items without a URL only as the current page. $data['itemListElement'][] = [ '@type' => 'ListItem', 'position' => ++$itemsCounter, 'item' => [ 'name' => $item->name, ], ]; } } if ($itemsCounter) { $prettyPrint = defined('JDEBUG') && JDEBUG ? JSON_PRETTY_PRINT : 0; $json = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | $prettyPrint); if (version_compare(JVERSION, '4.0', '>=')) { // Joomla 4+ /** @var WebAssetManager $wa */ $wa = $app->getDocument()->getWebAssetManager(); $wa->addInline('script', $json, [], ['type' => 'application/ld+json']); } else { // Joomla 3 fallback using addCustomTag method $app->getDocument()->addCustomTag( '<script type="application/ld+json">' . "\n" . $json . "\n" . '</script>' ); } } ?> </nav>PKBA#]����Bsystem/helixultimate/overrides_legacy/com_users/remind/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Settings; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; HTMLHelper::_('behavior.keepalive'); HTMLHelper::_('behavior.formvalidator'); ?> <div class="remind<?php echo $this->pageclass_sfx; ?>"> <div class="row justify-content-center"> <div class="col-lg-4"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <form id="user-registration" action="<?php echo Route::_('index.php?option=com_users&task=remind.remind'); ?>" method="post" class="form-validate"> <?php foreach ($this->form->getFieldsets() as $fieldset) : ?> <fieldset> <p><?php echo Text::_($fieldset->label); ?></p> <?php foreach ($this->form->getFieldset($fieldset->name) as $name => $field) : ?> <?php $showon = $field->getAttribute('showon'); $attribs = ''; if ($showon) { $attribs .= ' data-showon=\'' . json_encode(Settings::parseShowOnConditions($showon, $field->formControl)) . '\''; } // Enable disable on $enableOn = $field->getAttribute('enableon', ''); if ($enableOn) { $attribs .= ' data-enableon="' . $enableOn . '"'; } ?> <div class="mb-3" <?php echo $attribs; ?>> <?php echo $field->label; ?> <?php echo $field->input; ?> </div> <?php endforeach; ?> </fieldset> <?php endforeach; ?> <div> <button type="submit" class="btn btn-primary validate"><?php echo Text::_('JSUBMIT'); ?></button> </div> <?php echo HTMLHelper::_('form.token'); ?> </form> </div> </div> </div> PKBA#]D�&���Asystem/helixultimate/overrides_legacy/com_users/reset/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Settings; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; HTMLHelper::_('behavior.keepalive'); HTMLHelper::_('behavior.formvalidator'); ?> <div class="reset<?php echo $this->pageclass_sfx; ?>"> <div class="row justify-content-center"> <div class="col-lg-4"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <form id="user-registration" action="<?php echo Route::_('index.php?option=com_users&task=reset.request'); ?>" method="post" class="form-validate"> <?php foreach ($this->form->getFieldsets() as $fieldset) : ?> <div> <p><?php echo Text::_($fieldset->label); ?></p> <?php foreach ($this->form->getFieldset($fieldset->name) as $name => $field) : ?> <?php $showon = $field->getAttribute('showon'); $attribs = ''; if ($showon) { $attribs .= ' data-showon=\'' . json_encode(Settings::parseShowOnConditions($showon, $field->formControl)) . '\''; } // Enable disable on $enableOn = $field->getAttribute('enableon', ''); if ($enableOn) { $attribs .= ' data-enableon="' . $enableOn . '"'; } ?> <div class="mb-3" <?php echo $attribs; ?>> <?php echo $field->label; ?> <?php echo $field->input; ?> </div> <?php endforeach; ?> </div> <?php endforeach; ?> <div> <button type="submit" class="btn btn-primary validate"><?php echo Text::_('JSUBMIT'); ?></button> </div> <?php echo HTMLHelper::_('form.token'); ?> </form> </div> </div> </div> PKBA#]�gAsystem/helixultimate/overrides_legacy/com_users/reset/confirm.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Settings; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; HTMLHelper::_('behavior.keepalive'); HTMLHelper::_('behavior.formvalidator'); ?> <div class="reset-confirm<?php echo $this->pageclass_sfx; ?>"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <form action="<?php echo Route::_('index.php?option=com_users&task=reset.confirm'); ?>" method="post" class="form-validate form-horizontal well"> <?php foreach ($this->form->getFieldsets() as $fieldset) : ?> <fieldset> <p><?php echo Text::_($fieldset->label); ?></p> <?php foreach ($this->form->getFieldset($fieldset->name) as $name => $field) : ?> <?php $showon = $field->getAttribute('showon'); $attribs = ''; if ($showon) { $attribs .= ' data-showon=\'' . json_encode(Settings::parseShowOnConditions($showon, $field->formControl)) . '\''; } // Enable disable on $enableOn = $field->getAttribute('enableon', ''); if ($enableOn) { $attribs .= ' data-enableon="' . $enableOn . '"'; } ?> <div class="control-group" <?php echo $attribs; ?>> <div class="control-label"> <?php echo $field->label; ?> </div> <div class="controls"> <?php echo $field->input; ?> </div> </div> <?php endforeach; ?> </fieldset> <?php endforeach; ?> <div class="control-group"> <div class="controls"> <button type="submit" class="btn btn-primary validate"><?php echo Text::_('JSUBMIT'); ?></button> </div> </div> <?php echo HTMLHelper::_('form.token'); ?> </form> </div> PKBA#]S��?Bsystem/helixultimate/overrides_legacy/com_users/reset/complete.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Settings; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; HTMLHelper::_('behavior.keepalive'); HTMLHelper::_('behavior.formvalidator'); ?> <div class="reset-complete<?php echo $this->pageclass_sfx; ?>"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <form action="<?php echo Route::_('index.php?option=com_users&task=reset.complete'); ?>" method="post" class="form-validate form-horizontal well"> <?php foreach ($this->form->getFieldsets() as $fieldset) : ?> <fieldset> <p><?php echo Text::_($fieldset->label); ?></p> <?php foreach ($this->form->getFieldset($fieldset->name) as $name => $field) : ?> <?php $showon = $field->getAttribute('showon'); $attribs = ''; if ($showon) { $attribs .= ' data-showon=\'' . json_encode(Settings::parseShowOnConditions($showon, $field->formControl)) . '\''; } // Enable disable on $enableOn = $field->getAttribute('enableon', ''); if ($enableOn) { $attribs .= ' data-enableon="' . $enableOn . '"'; } ?> <div class="control-group" <?php echo $attribs; ?>> <div class="control-label"> <?php echo $field->label; ?> </div> <div class="controls"> <?php echo $field->input; ?> </div> </div> <?php endforeach; ?> </fieldset> <?php endforeach; ?> <div class="control-group"> <div class="controls"> <button type="submit" class="btn btn-primary validate"><?php echo Text::_('JSUBMIT'); ?></button> </div> </div> <?php echo HTMLHelper::_('form.token'); ?> </form> </div> PKBA#]\gi���Isystem/helixultimate/overrides_legacy/com_users/registration/complete.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); ?> <div class="registration-complete<?php echo $this->pageclass_sfx; ?>"> <?php if ($this->params->get('show_page_heading')) : ?> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> <?php endif; ?> </div> PKBA#]��7 Hsystem/helixultimate/overrides_legacy/com_users/registration/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; if (version_compare(JVERSION, 4, '<')) { HTMLHelper::_('behavior.keepalive'); HTMLHelper::_('behavior.formvalidator'); } else { /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('keepalive') ->useScript('form.validate'); } ?> <div class="com-users-registration registration<?php echo $this->pageclass_sfx; ?>"> <div class="row justify-content-center"> <div class="col-lg-9 col-xl-6"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1><?php echo $this->escape($this->params->get('page_heading')); ?></h1> </div> <?php endif; ?> <form id="member-registration" action="<?php echo Route::_('index.php?option=com_users&task=registration.register'); ?>" method="post" class="com-users-registration__form form-validate" enctype="multipart/form-data"> <?php // Iterate through the form fieldsets and display each one. ?> <?php foreach ($this->form->getFieldsets() as $fieldset) : ?> <?php if ($fieldset->name === 'captcha' && $this->captchaEnabled) : ?> <?php continue; ?> <?php endif; ?> <?php $fields = $this->form->getFieldset($fieldset->name); ?> <?php if (count($fields)) : ?> <fieldset> <?php // If the fieldset has a label set, display it as the legend. ?> <?php if (isset($fieldset->label)) : ?> <legend><?php echo Text::_($fieldset->label); ?></legend> <?php endif; ?> <?php echo $this->form->renderFieldset($fieldset->name); ?> </fieldset> <?php endif; ?> <?php endforeach; ?> <?php if (isset($this->captchaEnabled) && $this->captchaEnabled) : ?> <?php echo $this->form->renderFieldset('captcha'); ?> <?php endif; ?> <div class="com-users-registration__submit control-group"> <div class="controls"> <button type="submit" class="com-users-registration__register btn btn-primary validate"> <?php echo Text::_('JREGISTER'); ?> </button> <input type="hidden" name="option" value="com_users"> <input type="hidden" name="task" value="registration.register"> </div> </div> <?php echo HTMLHelper::_('form.token'); ?> </form> </div> </div> </div> PKBA#]�D�Asystem/helixultimate/overrides_legacy/com_users/login/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); $cookieLogin = $this->user->get('cookieLogin'); if (!empty($cookieLogin) || $this->user->get('guest')) { // The user is not logged in or needs to provide a password. echo $this->loadTemplate('login'); } else { // The user is already logged in. echo $this->loadTemplate('logout'); } PKBA#]=+"'��Gsystem/helixultimate/overrides_legacy/com_users/login/default_login.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use HelixUltimate\Framework\Platform\Helper; use HelixUltimate\Framework\Platform\Settings; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Router\Route; HTMLHelper::_('behavior.keepalive'); HTMLHelper::_('behavior.formvalidator'); $usersConfig = ComponentHelper::getParams('com_users'); ?> <div class="login<?php echo $this->pageclass_sfx; ?>"> <div class="row justify-content-center"> <div class="col-lg-4"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <?php if (($this->params->get('logindescription_show') == 1 && str_replace(' ', '', Helper::CheckNull($this->params->get('login_description'))) != '') || $this->params->get('login_image') != '') : ?> <div class="login-description"> <?php endif; ?> <?php if ($this->params->get('logindescription_show') == 1) : ?> <?php echo $this->params->get('login_description'); ?> <?php endif; ?> <?php if ($this->params->get('login_image') != '') : ?> <img src="<?php echo $this->escape($this->params->get('login_image')); ?>" class="login-image" alt="<?php echo Text::_('COM_USERS_LOGIN_IMAGE_ALT'); ?>"> <?php endif; ?> <?php if (($this->params->get('logindescription_show') == 1 && str_replace(' ', '', Helper::CheckNull($this->params->get('login_description'))) != '') || $this->params->get('login_image') != '') : ?> </div> <?php endif; ?> <form action="<?php echo Route::_('index.php?option=com_users&task=user.login'); ?>" method="post" class="form-validate" id="com-users-login__form"> <?php foreach ($this->form->getFieldset('credentials') as $field) : ?> <?php $showon = $field->getAttribute('showon'); $attribs = ''; if ($showon) { $attribs .= ' data-showon=\'' . json_encode(Settings::parseShowOnConditions($showon, $field->formControl)) . '\''; } // Enable disable on $enableOn = $field->getAttribute('enableon', ''); if ($enableOn) { $attribs .= ' data-enableon="' . $enableOn . '"'; } ?> <?php if (!$field->hidden) : ?> <div class="mb-3" <?php echo $attribs; ?>> <?php echo $field->label; ?> <?php echo $field->input; ?> </div> <?php endif; ?> <?php endforeach; ?> <?php if ($this->tfa) : ?> <div class="mb-3"> <?php echo $this->form->getField('secretkey')->label; ?> <?php echo $this->form->getField('secretkey')->input; ?> </div> <?php endif; ?> <?php if (PluginHelper::isEnabled('system', 'remember')) : ?> <div class="form-check mb-3"> <label class="form-check-label"> <input class="form-check-input" type="checkbox" name="remember" id="remember" class="inputbox" value="yes"> <?php echo Text::_('COM_USERS_LOGIN_REMEMBER_ME') ?> </label> </div> <?php endif; ?> <?php if (isset($this->extraButtons)) :?> <?php foreach ($this->extraButtons as $button) : $dataAttributeKeys = array_filter(array_keys($button), function ($key) { return substr($key, 0, 5) == 'data-'; }); ?> <div class="com-users-login__submit control-group"> <div class="controls"> <button type="button" class="btn btn-dark w-100 <?php echo $button['class'] ?? '' ?>" <?php foreach ($dataAttributeKeys as $key) : ?> <?php echo $key ?>="<?php echo $button[$key] ?>" <?php endforeach; ?> <?php if ($button['onclick']) : ?> onclick="<?php echo $button['onclick'] ?>" <?php endif; ?> title="<?php echo Text::_($button['label']) ?>" id="<?php echo $button['id'] ?>" > <?php if (!empty($button['icon'])) : ?> <span class="<?php echo $button['icon'] ?>"></span> <?php elseif (!empty($button['image'])) : ?> <?php echo HTMLHelper::_('image', $button['image'], Text::_($button['tooltip'] ?? ''), [ 'class' => 'icon', ], true) ?> <?php elseif (!empty($button['svg'])) : ?> <?php echo $button['svg']; ?> <?php endif; ?> <?php echo Text::_($button['label']) ?> </button> </div> </div> <?php endforeach; ?> <?php endif; ?> <div class="mb-3"> <button type="submit" class="btn btn-primary btn-lg w-100"> <?php echo Text::_('JLOGIN'); ?> </button> </div> <?php $return = $this->form->getValue('return', '', $this->params->get('login_redirect_url', $this->params->get('login_redirect_menuitem'))); ?> <input type="hidden" name="return" value="<?php echo base64_encode(Helper::CheckNull($return)); ?>"> <?php echo HTMLHelper::_('form.token'); ?> </form> <div> <div class="list-group"> <a class="list-group-item" href="<?php echo Route::_('index.php?option=com_users&view=reset'); ?>"> <?php echo Text::_('COM_USERS_LOGIN_RESET'); ?> </a> <a class="list-group-item" href="<?php echo Route::_('index.php?option=com_users&view=remind'); ?>"> <?php echo Text::_('COM_USERS_LOGIN_REMIND'); ?> </a> <?php if ($usersConfig->get('allowUserRegistration')) : ?> <a class="list-group-item" href="<?php echo Route::_('index.php?option=com_users&view=registration'); ?>"> <?php echo Text::_('COM_USERS_LOGIN_REGISTER'); ?> </a> <?php endif; ?> </div> </div> </div> </div> </div> PKBA#]���BM M Hsystem/helixultimate/overrides_legacy/com_users/login/default_logout.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; ?> <div class="logout<?php echo $this->pageclass_sfx; ?>"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <?php if (($this->params->get('logoutdescription_show') == 1 && str_replace(' ', '', Helper::CheckNull($this->params->get('logout_description'))) != '')|| $this->params->get('logout_image') != '') : ?> <div class="logout-description"> <?php endif; ?> <?php if ($this->params->get('logoutdescription_show') == 1) : ?> <?php echo $this->params->get('logout_description'); ?> <?php endif; ?> <?php if ($this->params->get('logout_image') != '') : ?> <img src="<?php echo $this->escape($this->params->get('logout_image')); ?>" class="thumbnail float-end logout-image" alt="<?php echo Text::_('COM_USER_LOGOUT_IMAGE_ALT'); ?>"> <?php endif; ?> <?php if (($this->params->get('logoutdescription_show') == 1 && str_replace(' ', '', Helper::CheckNull($this->params->get('logout_description'))) != '')|| $this->params->get('logout_image') != '') : ?> </div> <?php endif; ?> <form action="<?php echo Route::_('index.php?option=com_users&task=user.logout'); ?>" method="post" class="form-horizontal well"> <div class="control-group"> <div class="controls"> <button type="submit" class="btn btn-primary"><span class="icon-arrow-left icon-white"></span> <?php echo Text::_('JLOGOUT'); ?></button> </div> </div> <?php if ($this->params->get('logout_redirect_url')) : ?> <input type="hidden" name="return" value="<?php echo base64_encode(Helper::CheckNull($this->params->get('logout_redirect_url', $this->form->getValue('return')))); ?>"> <?php else : ?> <input type="hidden" name="return" value="<?php echo base64_encode(Helper::CheckNull($this->params->get('logout_redirect_menuitem', $this->form->getValue('return')))); ?>"> <?php endif; ?> <?php echo HTMLHelper::_('form.token'); ?> </form> </div> PKBA#]�W$�..Hsystem/helixultimate/overrides_legacy/com_users/profile/default_core.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; ?> <div id="users-profile-core"> <div class="d-flex mb-3"> <div class="me-auto"> <strong><?php echo Text::_('COM_USERS_PROFILE_CORE_LEGEND'); ?></strong> </div> <div> <?php if (Factory::getUser()->id == $this->data->id): ?> <a href="<?php echo Route::_('index.php?option=com_users&task=profile.edit&user_id=' . (int) $this->data->id); ?>"> <span class="fas fa-user-edit" aria-hidden="true"></span> <?php echo Text::_('COM_USERS_EDIT_PROFILE'); ?> </a> <?php endif;?> </div> </div> <ul class="list-group"> <li class="list-group-item"> <strong><?php echo Text::_('COM_USERS_PROFILE_NAME_LABEL'); ?></strong>: <?php echo $this->data->name; ?> </li> <li class="list-group-item"> <strong><?php echo Text::_('COM_USERS_PROFILE_USERNAME_LABEL'); ?></strong>: <?php echo htmlspecialchars($this->data->username ?? "", ENT_COMPAT, 'UTF-8'); ?> </li> <li class="list-group-item"> <strong><?php echo Text::_('COM_USERS_PROFILE_REGISTERED_DATE_LABEL'); ?></strong>: <?php echo HTMLHelper::_('date', $this->data->registerDate); ?> </li> <li class="list-group-item"> <strong><?php echo Text::_('COM_USERS_PROFILE_LAST_VISITED_DATE_LABEL'); ?></strong>: <?php if ($this->data->lastvisitDate != $this->db->getNullDate()): ?> <?php echo HTMLHelper::_('date', $this->data->lastvisitDate); ?> <?php else: ?> <?php echo Text::_('COM_USERS_PROFILE_NEVER_VISITED'); ?> <?php endif;?> </li> </ul> </div> PKBA#]��a Jsystem/helixultimate/overrides_legacy/com_users/profile/default_custom.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; // HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers/html'); // HTMLHelper::register('users.spacer', array('JHtmlUsers', 'spacer')); $fieldsets = $this->form->getFieldsets(); if (isset($fieldsets['core'])) { unset($fieldsets['core']); } if (isset($fieldsets['params'])) { unset($fieldsets['params']); } $tmp = isset($this->data->jcfields) ? $this->data->jcfields : array(); $customFields = array(); foreach ($tmp as $customField) { $customFields[$customField->name] = $customField; } ?> <?php foreach ($fieldsets as $group => $fieldset) : ?> <?php $fields = $this->form->getFieldset($group); ?> <?php if (count($fields)) : ?> <div class="users-profile-custom-<?php echo $group; ?>" id="users-profile-custom-<?php echo $group; ?>"> <div class="mb-3"> <?php if (isset($fieldset->label) && ($legend = trim(Text::_($fieldset->label))) !== '') : ?> <strong><?php echo $legend; ?></strong> <?php endif; ?> <?php if (isset($fieldset->description) && trim($fieldset->description)) : ?> <div><?php echo $this->escape(Text::_($fieldset->description)); ?></span> <?php endif; ?> </div> <ul class="list-group"> <?php foreach ($fields as $field) : ?> <?php if (!$field->hidden && $field->type !== 'Spacer') : ?> <li class="list-group-item"> <strong><?php echo $field->title; ?></strong>: <?php if (key_exists($field->fieldname, $customFields)) : ?> <?php echo $customFields[$field->fieldname]->value ?: Text::_('COM_USERS_PROFILE_VALUE_NOT_FOUND'); ?> <?php elseif (HTMLHelper::isRegistered('users.' . $field->id)) : ?> <?php echo HTMLHelper::_('users.' . $field->id, $field->value); ?> <?php elseif (HTMLHelper::isRegistered('users.' . $field->fieldname)) : ?> <?php echo HTMLHelper::_('users.' . $field->fieldname, $field->value); ?> <?php elseif (HTMLHelper::isRegistered('users.' . $field->type)) : ?> <?php echo HTMLHelper::_('users.' . $field->type, $field->value); ?> <?php else : ?> <?php echo HTMLHelper::_('users.value', $field->value); ?> <?php endif; ?> </li> <?php endif; ?> <?php endforeach; ?> </ul> </div> <?php endif; ?> <?php endforeach; ?> PKBA#]N'����Jsystem/helixultimate/overrides_legacy/com_users/profile/default_params.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers/html'); ?> <?php $fields = $this->form->getFieldset('params'); ?> <?php if (count($fields)) : ?> <div id="users-profile-params"> <div class="mb-3"> <strong><?php echo Text::_('COM_USERS_SETTINGS_FIELDSET_LABEL'); ?></strong> </div> <ul class="list-group"> <?php foreach ($fields as $field) : ?> <?php if (!$field->hidden) : ?> <li class="list-group-item"> <strong><?php echo $field->title; ?></strong>: <?php if (HTMLHelper::isRegistered('users.' . $field->id)) : ?> <?php echo HTMLHelper::_('users.' . $field->id, $field->value); ?> <?php elseif (HTMLHelper::isRegistered('users.' . $field->fieldname)) : ?> <?php echo HTMLHelper::_('users.' . $field->fieldname, $field->value); ?> <?php elseif (HTMLHelper::isRegistered('users.' . $field->type)) : ?> <?php echo HTMLHelper::_('users.' . $field->type, $field->value); ?> <?php else : ?> <?php echo HTMLHelper::_('users.value', $field->value); ?> <?php endif; ?> </li> <?php endif; ?> <?php endforeach; ?> </ul> </div> <?php endif; ?> PKBA#]+~$M��Csystem/helixultimate/overrides_legacy/com_users/profile/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); ?> <div class="profile<?php echo $this->pageclass_sfx; ?>"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <?php echo $this->loadTemplate('core'); ?> <?php echo $this->loadTemplate('params'); ?> <?php echo $this->loadTemplate('custom'); ?> </div> PKBA#]���i��@system/helixultimate/overrides_legacy/com_users/profile/edit.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Settings; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; HTMLHelper::_('behavior.keepalive'); HTMLHelper::_('behavior.formvalidator'); // Load user_profile plugin language $lang = Factory::getLanguage(); $lang->load('plg_user_profile', JPATH_ADMINISTRATOR); ?> <div class="profile-edit<?php echo $this->pageclass_sfx; ?>"> <div class="row justify-content-center"> <div class="col-lg-10 col-xl-7"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1><?php echo $this->escape($this->params->get('page_heading')); ?></h1> </div> <?php endif; ?> <script type="text/javascript"> Joomla.twoFactorMethodChange = function(e) { var selectedPane = 'com_users_twofactor_' + jQuery('#jform_twofactor_method').val(); jQuery.each(jQuery('#com_users_twofactor_forms_container>div'), function(i, el) { if (el.id != selectedPane) { jQuery('#' + el.id).hide(0); } else { jQuery('#' + el.id).show(0); } }); } </script> <form id="member-profile" action="<?php echo Route::_('index.php?option=com_users&task=profile.save'); ?>" method="post" class="form-validate" enctype="multipart/form-data"> <?php // Iterate through the form fieldsets and display each one. ?> <?php foreach ($this->form->getFieldsets() as $group => $fieldset) : ?> <?php $fields = $this->form->getFieldset($group); ?> <?php if (count($fields)) : ?> <fieldset> <?php if (isset($fieldset->label)) : ?> <legend> <?php echo Text::_($fieldset->label); ?> </legend> <?php endif; ?> <?php if (isset($fieldset->description) && trim($fieldset->description)) : ?> <?php echo '<p>' . $this->escape(Text::_($fieldset->description)) . '</p>'; ?> <?php endif; ?> <?php // Iterate through the fields in the set and display them. ?> <div class="row mb-3"> <?php foreach ($fields as $field) : ?> <?php // If the field is hidden, just display the input. ?> <?php $showon = $field->getAttribute('showon'); $attribs = ''; if ($showon) { $attribs .= ' data-showon=\'' . json_encode(Settings::parseShowOnConditions($showon, $field->formControl)) . '\''; } // Enable disable on $enableOn = $field->getAttribute('enableon', ''); if ($enableOn) { $attribs .= ' data-enableon="' . $enableOn . '"'; } ?> <?php if ($field->hidden) : ?> <?php echo $field->input; ?> <?php else : ?> <?php if(($field->fieldname == 'name') || ($field->fieldname == 'username')) : ?> <div class="col-lg-12" <?php echo $attribs; ?>> <?php else: ?> <div class="col-lg-6" <?php echo $attribs; ?>> <?php endif; ?> <div class="mb-3"> <?php echo $field->label; ?> <?php if ($field->fieldname === 'password1') : ?> <input type="password" style="display:none"> <?php endif; ?> <?php echo $field->input; ?> </div> </div> <?php endif; ?> <?php endforeach; ?> </div> </fieldset> <?php endif; ?> <?php endforeach; ?> <?php if(version_compare(JVERSION, '4.2.0', '<')) : ?> <?php if (count($this->twofactormethods) > 1) : ?> <fieldset> <legend><?php echo Text::_('COM_USERS_PROFILE_TWO_FACTOR_AUTH'); ?></legend> <div class="mb-3"> <label id="jform_twofactor_method-lbl" for="jform_twofactor_method" class="hasTooltip" title="<?php echo '<strong>' . Text::_('COM_USERS_PROFILE_TWOFACTOR_LABEL') . '</strong><br>' . Text::_('COM_USERS_PROFILE_TWOFACTOR_DESC'); ?>"> <?php echo Text::_('COM_USERS_PROFILE_TWOFACTOR_LABEL'); ?> </label> <?php echo HTMLHelper::_('select.genericlist', $this->twofactormethods, 'jform[twofactor][method]', array('onchange' => 'Joomla.twoFactorMethodChange()'), 'value', 'text', $this->otpConfig->method, 'jform_twofactor_method', false); ?> </div> <div id="com_users_twofactor_forms_container"> <?php foreach ($this->twofactorform as $form) : ?> <?php $style = $form['method'] == $this->otpConfig->method ? 'display: block' : 'display: none'; ?> <div id="com_users_twofactor_<?php echo $form['method']; ?>" style="<?php echo $style; ?>"> <?php echo $form['form']; ?> </div> <?php endforeach; ?> </div> </fieldset> <fieldset> <legend> <?php echo Text::_('COM_USERS_PROFILE_OTEPS'); ?> </legend> <div class="alert alert-info"> <?php echo Text::_('COM_USERS_PROFILE_OTEPS_DESC'); ?> </div> <?php if (empty($this->otpConfig->otep)) : ?> <div class="alert alert-warning"> <?php echo Text::_('COM_USERS_PROFILE_OTEPS_WAIT_DESC'); ?> </div> <?php else : ?> <?php foreach ($this->otpConfig->otep as $otep) : ?> <span class="col-lg-3"> <?php echo substr($otep, 0, 4); ?>-<?php echo substr($otep, 4, 4); ?>-<?php echo substr($otep, 8, 4); ?>-<?php echo substr($otep, 12, 4); ?> </span> <?php endforeach; ?> <div class="clearfix"></div> <?php endif; ?> </fieldset> <?php endif; ?> <?php endif; ?> <div class="mb-3"> <button type="submit" class="btn btn-primary validate"><span><?php echo Text::_('JSUBMIT'); ?></span></button> <a class="btn btn-secondary" href="<?php echo Route::_('index.php?option=com_users&view=profile'); ?>" title="<?php echo Text::_('JCANCEL'); ?>"><?php echo Text::_('JCANCEL'); ?></a> <input type="hidden" name="option" value="com_users"> <input type="hidden" name="task" value="profile.save"> </div> <?php echo HTMLHelper::_('form.token'); ?> </form> </div> </div> </div> PKBA#]SỂ+�+<system/helixultimate/overrides_legacy/layouts/comingsoon.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later */ defined('_JEXEC') or die('Restricted access'); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; use HelixUltimate\Framework\Core\HelixUltimate; use Joomla\CMS\Helper\AuthenticationHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Router\Route; extract($displayData); // Initialize $app = Factory::getApplication(); $doc = Factory::getDocument(); $isOffline = $isOffline ?? false; $site_title = $site_title ?? $app->get('sitename'); $twofactormethods = []; if (version_compare(JVERSION, '4.2.0', '<')) { $twofactormethods = AuthenticationHelper::getTwoFactorMethods(); } /** * Load the bootstrap file for enabling the HelixUltimate\Framework namespacing. * * @since 2.0.0 */ $bootstrap_path = JPATH_PLUGINS . '/system/helixultimate/bootstrap.php'; if (file_exists($bootstrap_path)) { require_once $bootstrap_path; } else { die('Install and activate <a target="_blank" rel="noopener noreferrer" href="https://www.joomshaper.com/helix">Helix Ultimate Framework</a>.'); } $theme = new HelixUltimate; ?> <!doctype html> <html class="coming-soon" lang="<?php echo $language; ?>" dir="<?php echo $direction; ?>"> <head> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <?php $theme->head(); $theme->add_js('jquery.countdown.min.js'); $theme->add_js('custom.js'); $theme->add_css('font-awesome.min.css'); $theme->add_css('template.css'); $theme->add_css('presets/' . $params->get('preset', 'preset1') . '.css'); $theme->add_css('custom.css'); //Custom CSS if ($custom_css = $params->get('custom_css')) { $doc->addStyledeclaration($custom_css); } //Custom JS if ($custom_js = $params->get('custom_js')) { $doc->addScriptdeclaration($custom_js); } ?> </head> <body class="<?php echo $isOffline ? 'offline-mode' : 'coming-soon-mode'; ?>"> <div class="container"> <jdoc:include type="message" /> <?php if ($isOffline) : ?> <!-- OFFLINE CONTENT --> <?php if ($app->get('offline_image')) : ?> <style> body { background-image: url('<?php echo Uri::base(true) . '/' . ltrim($app->get('offline_image'), '/'); ?>'); background-size: cover; background-position: center !important; } </style> <?php endif; ?> <?php if ($app->get('display_offline_message', 0) == 1 && str_replace(' ', '', $app->get('offline_message')) != '') : ?> <div class="offline-message"> <?php echo $app->get('offline_message'); ?> </div> <?php elseif ($app->get('display_offline_message', 0) == 2) : ?> <div class="offline-message"> <?php echo Text::_('JOFFLINE_MESSAGE'); ?> </div> <?php endif; ?> <?php if (isset($login) && $login) : ?> <?php echo $login_form; ?> <?php endif; ?> <?php else : ?> <!-- COMING SOON CONTENT --> <?php if ($params->get('comingsoon_logo')) : ?> <img class="coming-soon-logo" src="<?php echo $params->get('comingsoon_logo'); ?>" alt="<?php echo htmlspecialchars($site_title ?? ''); ?>"> <?php endif; ?> <?php if ($params->get('comingsoon_bg_image')) : ?> <style> body { background-image: url('<?php echo Uri::base(true) . '/' . ltrim($params->get('comingsoon_bg_image'), '/'); ?>'); background-size: cover; background-position: center !important; } </style> <?php endif; ?> <?php if ($params->get('comingsoon_title_status',0)) : ?> <h1 class="coming-soon-title"> <?php echo htmlspecialchars($params->get('comingsoon_title', $site_title)); ?> </h1> <?php endif; ?> <?php if ($params->get('comingsoon_content_status',0) && $params->get('comingsoon_content')) : ?> <div class="row justify-content-center"> <div class="col-lg-8"> <div class="coming-soon-content"> <?php echo $params->get('comingsoon_content'); ?> </div> </div> </div> <?php endif; ?> <?php if ($params->get('comingsoon_countdown', 0) && $params->get('comingsoon_date')) : ?> <?php $comingsoon_date = explode('-', $params->get('comingsoon_date')); ?> <div id="coming-soon-countdown" class="clearfix"></div> <script type="text/javascript"> jQuery(function($) { $('#coming-soon-countdown').countdown('<?php echo trim($comingsoon_date[0]); ?>/<?php echo trim($comingsoon_date[1]); ?>/<?php echo trim($comingsoon_date[2]); ?>', function(event) { $(this).html(event.strftime('<div class="coming-soon-days"><span class="coming-soon-number">%-D</span><span class="coming-soon-string">%!D:<?php echo Text::_("HELIX_ULTIMATE_DAY"); ?>,<?php echo Text::_("HELIX_ULTIMATE_DAYS"); ?>;</span></div><div class="coming-soon-hours"><span class="coming-soon-number">%H</span><span class="coming-soon-string">%!H:<?php echo Text::_("HELIX_ULTIMATE_HOUR"); ?>,<?php echo Text::_("HELIX_ULTIMATE_HOURS"); ?>;</span></div><div class="coming-soon-minutes"><span class="coming-soon-number">%M</span><span class="coming-soon-string">%!M:<?php echo Text::_("HELIX_ULTIMATE_MINUTE"); ?>,<?php echo Text::_("HELIX_ULTIMATE_MINUTES"); ?>;</span></div><div class="coming-soon-seconds"><span class="coming-soon-number">%S</span><span class="coming-soon-string">%!S:<?php echo Text::_("HELIX_ULTIMATE_SECOND"); ?>,<?php echo Text::_("HELIX_ULTIMATE_SECONDS"); ?>;</span></div>')); }); }); </script> <?php endif; ?> <?php if ($theme->count_modules('comingsoon')) : ?> <div class="coming-soon-position"> <jdoc:include type="modules" name="comingsoon" style="sp_xhtml" /> </div> <?php endif; ?> <?php $facebook = $params->get('facebook'); $instagram = $params->get('instagram'); $twitter = $params->get('twitter'); $pinterest = $params->get('pinterest'); $youtube = $params->get('youtube'); $linkedin = $params->get('linkedin'); $dribbble = $params->get('dribbble'); $behance = $params->get('behance'); $flickr = $params->get('flickr'); $vk = $params->get('vk'); $whatsappInput = $params->get('whatsapp'); $whatsapp = !empty($whatsappInput) ? 'https://wa.me/' . $whatsappInput . '?text=Hi' : ''; if ($params->get('comingsoon_social_icons') && ($facebook || $instagram || $twitter || $pinterest || $youtube || $linkedin || $dribbble || $behance || $flickr || $vk || $whatsapp)) { $social_output = '<ul class="social-icons">'; if ($facebook) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $facebook . '"><i class="fab fa-facebook" aria-hidden="true"></i></a></li>'; } if ($instagram) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $instagram . '"><i class="fab fa-instagram" aria-hidden="true"></i></a></li>'; } if ($twitter) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $twitter . '"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" style="width: 13.56px;position: relative;top: -1.5px;"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/></svg></a></li>'; } if ($pinterest) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $pinterest . '"><i class="fab fa-pinterest" aria-hidden="true"></i></a></li>'; } if ($youtube) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $youtube . '"><i class="fab fa-youtube" aria-hidden="true"></i></a></li>'; } if ($linkedin) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $linkedin . '"><i class="fab fa-linkedin" aria-hidden="true"></i></a></li>'; } if ($dribbble) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $dribbble . '"><i class="fab fa-dribbble" aria-hidden="true"></i></a></li>'; } if ($behance) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $behance . '"><i class="fab fa-behance" aria-hidden="true"></i></a></li>'; } if ($flickr) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $flickr . '"><i class="fab fa-flickr" aria-hidden="true"></i></a></li>'; } if ($whatsapp) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $whatsapp . '"><i class="fab fa-whatsapp" aria-hidden="true"></i></a></li>'; } if ($vk) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $vk . '"><i class="fab fa-vk" aria-hidden="true"></i></a></li>'; } $social_output .= '</ul>'; echo $social_output; } ?> <?php if (($params->get('comingsoon_enable_login', 0))) : ?> <div class="coming-soon-login"> <form action="<?php echo Route::_('index.php', true); ?>" method="post" id="form-login" class="mt-5"> <div class="row gx-3 align-items-center"> <div class="col-auto"> <label class="visually-hidden" for="username"><?php echo Text::_('JGLOBAL_USERNAME'); ?></label> <div class="input-group mb-2"> <div class="input-group-text"><span class="fas fa-user" aria-hidden="true"></span></div> <input name="username" type="text" class="form-control" id="username" placeholder="<?php echo Text::_('JGLOBAL_USERNAME'); ?>"> </div> </div> <div class="col-auto"> <label class="visually-hidden" for="password"><?php echo Text::_('JGLOBAL_PASSWORD'); ?></label> <div class="input-group mb-2"> <div class="input-group-text"><span class="fas fa-key" aria-hidden="true"></span></div> <input name="password" type="password" class="form-control" id="password" placeholder="<?php echo Text::_('JGLOBAL_PASSWORD'); ?>"> </div> </div> <?php if (count($twofactormethods) > 1) : ?> <div class="col-auto"> <label class="visually-hidden" for="secretkey"><?php echo Text::_('JGLOBAL_SECRETKEY'); ?></label> <div class="input-group mb-2"> <div class="input-group-text"><span class="fas fa-user-secret" aria-hidden="true"></span></div> <input name="secretkey" type="text" class="form-control" id="secretkey" placeholder="<?php echo Text::_('JGLOBAL_SECRETKEY'); ?>"> </div> </div> <?php endif; ?> <div class="col-auto"> <input type="submit" name="Submit" class="btn btn-success mb-2 login" value="<?php echo Text::_('JLOGIN'); ?>" /> <input type="hidden" name="option" value="com_users" /> <input type="hidden" name="task" value="user.login" /> <input type="hidden" name="return" value="<?php echo base64_encode(Uri::base()); ?>" /> <?php echo HTMLHelper::_('form.token'); ?> </div> </div> </form> </div> <?php endif; ?> <?php endif; ?> <?php $theme->after_body(); ?> </div> </body> </html>PKBA#]��yD��Bsystem/helixultimate/overrides_legacy/layouts/chromes/sp_xhtml.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use HelixUltimate\Framework\Platform\Helper; defined('_JEXEC') or die; $module = $displayData['module']; $params = $displayData['params']; $attribs = $displayData['attribs']; if ($module->content === null || $module->content === '') { return; } $moduleTag = htmlspecialchars($params->get('module_tag', 'div') ?? "", ENT_QUOTES, 'UTF-8'); $bootstrapSize = (int) $params->get('bootstrap_size', 0); $moduleClass = $bootstrapSize !== 0 ? ' span' . $bootstrapSize : ''; $headerTag = htmlspecialchars($params->get('header_tag', 'h3') ?? "", ENT_QUOTES, 'UTF-8'); $headerClass = htmlspecialchars($params->get('header_class', 'sp-module-title') ?? "", ENT_COMPAT, 'UTF-8'); $moduleClassSfx = Helper::CheckNull($params->get('moduleclass_sfx')); $encodedModuleClassSfx = is_string($moduleClassSfx) ? htmlspecialchars($moduleClassSfx, ENT_COMPAT, 'UTF-8') : ''; if ($module->content) { echo '<' . $moduleTag . ' class="sp-module ' . $encodedModuleClassSfx . $moduleClass . '">'; if ($module->showtitle) { echo '<' . $headerTag . ' class="' . $headerClass . '">' . $module->title . '</' . $headerTag . '>'; } echo '<div class="sp-module-content">'; echo $module->content; echo '</div>'; echo '</' . $moduleTag . '>'; } PKBA#]W���""^system/helixultimate/overrides_legacy/layouts/plugins/editors/tinymce/field/tinymcebuilder.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var array $value Value of the field. * * @var array $menus List of the menu items * @var array $menubarSource Menu items for builder * @var array $buttons List of the buttons * @var array $buttonsSource Buttons by group, for the builder * @var array $toolbarPreset Toolbar presset (default values) * @var int $setsAmount Amount of sets * @var array $setsNames List of Sets names * @var JForm[] $setsForms Form with extra options for an each set * @var string $languageFile TinyMCE language file to translate the buttons * * @var FileLayout $this Context */ HTMLHelper::_('behavior.core'); $helix_plg_url = Uri::root(true) . '/plugins/system/helixultimate'; Factory::getDocument()->addScript($helix_plg_url . '/assets/js/admin/jquery-ui.min.js'); HTMLHelper::_('stylesheet', 'media/vendor/tinymce/skins/lightgray/skin.min.css', array('version' => 'auto', 'relative' => false)); HTMLHelper::_('stylesheet', 'editors/tinymce/tinymce-builder.css', array('version' => 'auto', 'relative' => true)); HTMLHelper::_('script', 'editors/tinymce/tinymce-builder.js', array('version' => 'auto', 'relative' => true)); if ($languageFile) { HTMLHelper::_('script', $languageFile, array('version' => 'auto', 'relative' => false)); } Factory::getDocument()->addScriptOptions('plg_editors_tinymce_builder', array( 'menus' => $menus, 'buttons' => $buttons, 'toolbarPreset' => $toolbarPreset, 'formControl' => $name . '[toolbars]', ) ); ?> <div id="joomla-tinymce-builder"> <p><?php echo Text::_('PLG_TINY_SET_SOURCE_PANEL_DESCRIPTION'); ?></p> <div class="mce-tinymce mce-container mce-panel"> <div class="mce-container-body mce-stack-layout"> <div class="mce-container mce-menubar mce-toolbar mce-stack-layout-item"> <div class="mce-container-body mce-flow-layout timymce-builder-menu source" data-group="menu" data-value="<?php echo $this->escape(json_encode($menubarSource)); ?>"> </div> </div> <div class="mce-toolbar-grp mce-container mce-panel mce-stack-layout-item"> <div class="mce-container-body mce-flow-layout timymce-builder-toolbar source" data-group="toolbar" data-value="<?php echo $this->escape(json_encode($buttonsSource)); ?>"> </div> </div> </div> </div> <hr> <p><?php echo Text::_('PLG_TINY_SET_TARGET_PANEL_DESCRIPTION'); ?></p> <?php // Render tabs for each set ?> <ul class="nav nav-tabs" id="set-tabs"> <?php foreach ($setsNames as $num => $title) : $isActive = $num === $setsAmount - 1; ?> <li class="nav-item"> <a href="#set-<?php echo $num; ?>" class="nav-link <?php echo $isActive ? 'active' : ''; ?>"> <?php echo $title; ?></a> </li> <?php endforeach; ?> </ul> <?php // Render tab content for each set ?> <div class="tab-content"> <?php $presetButtonClases = array( 'simple' => 'btn-success', 'medium' => 'btn-info', 'advanced' => 'btn-warning', ); foreach ($setsNames as $num => $title) : // Check whether the values exists, and if empty then use from preset if (empty($value['toolbars'][$num]['menu']) && empty($value['toolbars'][$num]['toolbar1']) && empty($value['toolbars'][$num]['toolbar2'])) { // Take the preset for default value switch ($num) { case 0: $preset = $toolbarPreset['advanced']; break; case 1: $preset = $toolbarPreset['medium']; break; default: $preset = $toolbarPreset['simple']; } $value['toolbars'][$num] = $preset; } // Take existing values $valMenu = empty($value['toolbars'][$num]['menu']) ? array() : $value['toolbars'][$num]['menu']; $valBar1 = empty($value['toolbars'][$num]['toolbar1']) ? array() : $value['toolbars'][$num]['toolbar1']; $valBar2 = empty($value['toolbars'][$num]['toolbar2']) ? array() : $value['toolbars'][$num]['toolbar2']; ?> <div class="tab-pane <?php echo $num === $setsAmount - 1 ? 'active' : ''; ?>" id="set-<?php echo $num; ?>"> <div class="btn-toolbar float-end"> <div class="btn-group btn-group-sm"> <?php foreach(array_keys($toolbarPreset) as $presetName) : $btnClass = empty($presetButtonClases[$presetName]) ? 'btn-primary' : $presetButtonClases[$presetName]; ?> <button type="button" class="btn <?php echo $btnClass; ?> button-action" data-action="setPreset" data-preset="<?php echo $presetName; ?>" data-set="<?php echo $num; ?>"> <?php echo Text::_('PLG_TINY_SET_PRESET_BUTTON_' . $presetName); ?> </button> <?php endforeach; ?> <button type="button" class="btn btn-danger button-action" data-action="clearPane" data-set="<?php echo $num; ?>"> <?php echo Text::_('JCLEAR'); ?></button> </div> </div> <div class="mce-tinymce mce-container mce-panel"> <div class="mce-container-body mce-stack-layout"> <div class="mce-container mce-menubar mce-toolbar timymce-builder-menu target" data-group="menu" data-set="<?php echo $num; ?>" data-value="<?php echo $this->escape(json_encode($valMenu)); ?>"> </div> <div class="mce-toolbar-grp mce-container mce-panel timymce-builder-toolbar target" data-group="toolbar1" data-set="<?php echo $num; ?>" data-value="<?php echo $this->escape(json_encode($valBar1)); ?>"> </div> <div class="mce-toolbar-grp mce-container mce-panel timymce-builder-toolbar target" data-group="toolbar2" data-set="<?php echo $num; ?>" data-value="<?php echo $this->escape(json_encode($valBar2)); ?>"> </div> </div> </div> <?php // Render the form for extra options ?> <?php echo $this->sublayout('setoptions', array('form' => $setsForms[$num])); ?> </div> <?php endforeach; ?> </div> </div> PKBA#]�s�ARRisystem/helixultimate/overrides_legacy/layouts/plugins/editors/tinymce/field/tinymcebuilder/setoptions.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); extract($displayData); /** * Layout variables * ----------------- * @var JForm $form Form with extra options for the set * @var FileLayout $this Context */ ?> <div class="setoptions-form-wrapper"> <?php foreach ($form->getGroup(null) as $field) : ?> <?php echo $field->renderField(); ?> <?php endforeach; ?> </div> PKBA#]�[�..Qsystem/helixultimate/overrides_legacy/layouts/plugins/user/profile/fields/dob.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); extract($displayData); echo $text . '<br />'; ?> PKBA#]�ys�33Usystem/helixultimate/overrides_legacy/layouts/libraries/html/bootstrap/modal/main.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2015 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Layout\LayoutHelper; use Joomla\Utilities\ArrayHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $selector Unique DOM identifier for the modal. CSS id without # * @var array $params Modal parameters. Default supported parameters: * - title string The modal title * - backdrop mixed A boolean select if a modal-backdrop element should be included (default = true) * The string 'static' includes a backdrop which doesn't close the modal on click. * - keyboard boolean Closes the modal when escape key is pressed (default = true) * - closeButton boolean Display modal close button (default = true) * - animation boolean Fade in from the top of the page (default = true) * - url string URL of a resource to be inserted as an <iframe> inside the modal body * - height string height of the <iframe> containing the remote resource * - width string width of the <iframe> containing the remote resource * - bodyHeight int Optional height of the modal body in viewport units (vh) * - modalWidth int Optional width of the modal in viewport units (vh) * - footer string Optional markup for the modal footer * @var string $body Markup for the modal body. Appended after the <iframe> if the URL option is set */ $modalClasses = array('modal'); if (!isset($params['animation']) || $params['animation']) { $modalClasses[] = 'fade'; } $modalWidth = isset($params['modalWidth']) ? round((int) $params['modalWidth'], -1) : ''; $modalDialogClass = ''; if ($modalWidth && $modalWidth > 0 && $modalWidth <= 100) { $modalDialogClass = ' jviewport-width' . $modalWidth; } $modalAttributes = array( 'tabindex' => '-1', 'class' => 'joomla-modal ' .implode(' ', $modalClasses) ); if (isset($params['backdrop'])) { $modalAttributes['data-backdrop'] = (is_bool($params['backdrop']) ? ($params['backdrop'] ? 'true' : 'false') : $params['backdrop']); } if (isset($params['keyboard'])) { $modalAttributes['data-keyboard'] = (is_bool($params['keyboard']) ? ($params['keyboard'] ? 'true' : 'false') : 'true'); } if (isset($params['url'])) { $url = 'data-url="' . $params['url'] . '"'; $iframeHtml = htmlspecialchars(LayoutHelper::render('libraries.html.bootstrap.modal.iframe' ?? "", $displayData), ENT_COMPAT, 'UTF-8'); } ?> <div id="<?php echo $selector; ?>" role="dialog" <?php echo ArrayHelper::toString($modalAttributes); ?> <?php echo $url ?? ''; ?> <?php echo isset($url) ? 'data-iframe="'.trim($iframeHtml).'"' : ''; ?>> <?php $modalSize = "modal-lg"; if (JVERSION >= 4) { $modalSize = 'modal-xl'; } ?> <div class="modal-dialog <?php echo $modalSize . ' ' . $modalDialogClass; ?>"> <div class="modal-content"> <?php // Header if (!isset($params['closeButton']) || isset($params['title']) || $params['closeButton']) { echo LayoutHelper::render('libraries.html.bootstrap.modal.header', $displayData); } // Body echo LayoutHelper::render('libraries.html.bootstrap.modal.body', $displayData); // Footer if (isset($params['footer'])) { echo LayoutHelper::render('libraries.html.bootstrap.modal.footer', $displayData); } ?> </div> </div> </div> PKBA#]XU�&�Z�ZNsystem/helixultimate/overrides_legacy/layouts/libraries/cms/html/bootstrap.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Layout\LayoutHelper; /** * Utility class for Bootstrap elements. * * @since 3.0 */ abstract class HelixBootstrap { /** * @var array Array containing information for loaded files * @since 3.0 */ protected static $loaded = array(); /** * Add javascript support for Bootstrap alerts * * @param string $selector Common class for the alerts * * @return void * * @since 3.0 */ public static function alert($selector = 'alert') { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.alert', array($selector => '')); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap buttons * * @param string $selector Common class for the buttons * * @return void * * @since 3.1 */ public static function button($selector = 'button') { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.button', array($selector)); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap carousels * * @param string $selector Common class for the carousels. * @param array $params An array of options for the carousel. * Options for the carousel can be: * - interval number The amount of time to delay between automatically cycling an item. * If false, carousel will not automatically cycle. * - pause string Pauses the cycling of the carousel on mouseenter and resumes the cycling * of the carousel on mouseleave. * * @return void * * @since 3.0 */ public static function carousel($selector = 'carousel', $params = array()) { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['interval'] = isset($params['interval']) ? (int) $params['interval'] : 5000; $opt['pause'] = isset($params['pause']) ? $params['pause'] : 'hover'; Factory::getDocument()->addScriptOptions('bootstrap.carousel', array($selector => $opt)); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap dropdowns * * @param string $selector Common class for the dropdowns * * @return void * * @since 3.0 */ public static function dropdown($selector = 'dropdown-toggle') { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.dropdown', array($selector)); static::$loaded[__METHOD__][$selector] = true; } /** * Method to load the Bootstrap JavaScript framework into the document head * * If debugging mode is on an uncompressed version of Bootstrap is included for easier debugging. * * @param mixed $debug Is debugging mode on? [optional] * * @return void * * @since 3.0 */ public static function framework($debug = null) { // Only load once if (!empty(static::$loaded[__METHOD__])) { return; } $debug = (isset($debug) && $debug != JDEBUG) ? $debug : JDEBUG; // Load the needed scripts HTMLHelper::_('behavior.core'); HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'vendor/tether/tether.min.js', array('version' => 'auto', 'relative' => true, 'detectDebug' => $debug)); HTMLHelper::_('script', 'vendor/bootstrap/bootstrap.min.js', array('version' => 'auto', 'relative' => true, 'detectDebug' => $debug)); HTMLHelper::_('script', 'system/bootstrap-init.min.js', array('version' => 'auto', 'relative' => true, 'detectDebug' => $debug)); static::$loaded[__METHOD__] = true; } /** * Method to render a Bootstrap modal * * @param string $selector The ID selector for the modal. * @param array $params An array of options for the modal. * Options for the modal can be: * - title string The modal title * - backdrop mixed A boolean select if a modal-backdrop element should be included (default = true) * The string 'static' includes a backdrop which doesn't close the modal on click. * - keyboard boolean Closes the modal when escape key is pressed (default = true) * - closeButton boolean Display modal close button (default = true) * - animation boolean Fade in from the top of the page (default = true) * - footer string Optional markup for the modal footer * - url string URL of a resource to be inserted as an `<iframe>` inside the modal body * - height string height of the `<iframe>` containing the remote resource * - width string width of the `<iframe>` containing the remote resource * @param string $body Markup for the modal body. Appended after the `<iframe>` if the URL option is set * * @return string HTML markup for a modal * * @since 3.0 */ public static function renderModal($selector = 'modal', $params = array(), $body = '') { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); $layoutData = array( 'selector' => $selector, 'params' => $params, 'body' => $body, ); static::$loaded[__METHOD__][$selector] = true; return LayoutHelper::render('joomla.modal.main', $layoutData); } /** * Add javascript support for Bootstrap popovers * * Use element's Title as popover content * * @param string $selector Selector for the popover * @param array $params An array of options for the popover. * Options for the popover can be: * animation boolean apply a css fade transition to the popover * container string|boolean Appends the popover to a specific element: { container: 'body' } * content string|function default content value if `data-content` attribute isn't present * delay number|object delay showing and hiding the popover (ms) - does not apply to manual trigger type * If a number is supplied, delay is applied to both hide/show * Object structure is: delay: { show: 500, hide: 100 } * html boolean Insert HTML into the popover. If false, jQuery's text method will be used to insert * content into the dom. * placement string|function how to position the popover - top | bottom | left | right * selector string If a selector is provided, popover objects will be delegated to the specified targets. * template string Base HTML to use when creating the popover. * title string|function default title value if `title` tag isn't present * trigger string how popover is triggered - hover | focus | manual * constraints array An array of constraints - passed through to Tether. * offset string Offset of the popover relative to its target. * * @return void * * @since 3.0 */ public static function popover($selector = '.hasPopover', $params = array()) { // Only load once if (isset(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); $opt['animation'] = isset($params['animation']) ? $params['animation'] : null; $opt['container'] = isset($params['container']) ? $params['container'] : 'body'; $opt['content'] = isset($params['content']) ? $params['content'] : null; $opt['delay'] = isset($params['delay']) ? $params['delay'] : null; $opt['html'] = isset($params['html']) ? $params['html'] : true; $opt['placement'] = isset($params['placement']) ? $params['placement'] : null; $opt['selector'] = isset($params['selector']) ? $params['selector'] : null; $opt['template'] = isset($params['template']) ? $params['template'] : null; $opt['title'] = isset($params['title']) ? $params['title'] : null; $opt['trigger'] = isset($params['trigger']) ? $params['trigger'] : 'hover focus'; $opt['constraints'] = isset($params['constraints']) ? $params['constraints'] : ['to' => 'scrollParent', 'attachment' => 'together', 'pin' => true]; $opt['offset'] = isset($params['offset']) ? $params['offset'] : '0 0'; $opt = (object) array_filter((array) $opt); // Factory::getDocument()->addScriptOptions('bootstrap.popover', array($selector => $opt)); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap ScrollSpy * * @param string $selector The ID selector for the ScrollSpy element. * @param array $params An array of options for the ScrollSpy. * Options for the ScrollSpy can be: * - offset number Pixels to offset from top when calculating position of scroll. * * @return void * * @since 3.0 */ public static function scrollspy($selector = 'navbar', $params = array()) { // Only load once if (isset(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.scrollspy', array($selector => $params)); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap tooltips * * Add a title attribute to any element in the form * title="title::text" * * @param string $selector The ID selector for the tooltip. * @param array $params An array of options for the tooltip. * Options for the tooltip can be: * animation boolean apply a css fade transition to the popover * container string|boolean Appends the popover to a specific element: { container: 'body' } * delay number|object delay showing and hiding the popover (ms) - does not apply to manual trigger type * If a number is supplied, delay is applied to both hide/show * Object structure is: delay: { show: 500, hide: 100 } * html boolean Insert HTML into the popover. If false, jQuery's text method will be used to insert * content into the dom. * placement string|function how to position the popover - top | bottom | left | right * selector string If a selector is provided, popover objects will be * delegated to the specified targets. * template string Base HTML to use when creating the popover. * title string|function default title value if `title` tag isn't present * trigger string how popover is triggered - hover | focus | manual * constraints array An array of constraints - passed through to Tether. * offset string Offset of the popover relative to its target. * * @return void * * @since 3.0 */ public static function tooltip($selector = '.hasTooltip', $params = array()) { if (!isset(static::$loaded[__METHOD__][$selector])) { // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['animation'] = isset($params['animation']) ? (bool) $params['animation'] : null; $opt['html'] = isset($params['html']) ? (bool) $params['html'] : true; $opt['placement'] = isset($params['placement']) ? (string) $params['placement'] : null; $opt['selector'] = isset($params['selector']) ? (string) $params['selector'] : null; $opt['title'] = isset($params['title']) ? (string) $params['title'] : null; $opt['trigger'] = isset($params['trigger']) ? (string) $params['trigger'] : null; $opt['delay'] = isset($params['delay']) ? (is_array($params['delay']) ? $params['delay'] : (int) $params['delay']) : null; $opt['container'] = isset($params['container']) ? $params['container'] : 'body'; $opt['template'] = isset($params['template']) ? (string) $params['template'] : null; $onShow = isset($params['onShow']) ? (string) $params['onShow'] : null; $onShown = isset($params['onShown']) ? (string) $params['onShown'] : null; $onHide = isset($params['onHide']) ? (string) $params['onHide'] : null; $onHidden = isset($params['onHidden']) ? (string) $params['onHidden'] : null; $options = json_encode($opt); // Build the script. $script = array('$(container).find(' . json_encode($selector) . ').tooltip(' . $options . ')'); if ($onShow) { $script[] = 'on("show.bs.tooltip", ' . $onShow . ')'; } if ($onShown) { $script[] = 'on("shown.bs.tooltip", ' . $onShown . ')'; } if ($onHide) { $script[] = 'on("hide.bs.tooltip", ' . $onHide . ')'; } if ($onHidden) { $script[] = 'on("hidden.bs.tooltip", ' . $onHidden . ')'; } // Set static array static::$loaded[__METHOD__][$selector] = true; } return; } /** * Loads js and css files needed by Bootstrap Tooltip Extended plugin * * @param boolean $extended If true, bootstrap-tooltip-extended.js and .css files are loaded * * @return void * * @since 3.6 * * @deprecated 4.0 No replacement, use Bootstrap tooltips. */ public static function tooltipExtended($extended = true) { if ($extended) { HTMLHelper::_('script', 'jui/bootstrap-tooltip-extended.min.js', array('version' => 'auto', 'relative' => true)); HTMLHelper::_('stylesheet', 'jui/bootstrap-tooltip-extended.css', array('version' => 'auto', 'relative' => true)); } } /** * Add javascript support for Bootstrap accordians and insert the accordian * * @param string $selector The ID selector for the tooltip. * @param array $params An array of options for the tooltip. * Options for the tooltip can be: * - parent selector If selector then all collapsible elements under the specified parent will be closed when this * collapsible item is shown. (similar to traditional accordion behavior) * - toggle boolean Toggles the collapsible element on invocation * - active string Sets the active slide during load * * - onShow function This event fires immediately when the show instance method is called. * - onShown function This event is fired when a collapse element has been made visible to the user * (will wait for css transitions to complete). * - onHide function This event is fired immediately when the hide method has been called. * - onHidden function This event is fired when a collapse element has been hidden from the user * (will wait for css transitions to complete). * * @return string HTML for the accordian * * @since 3.0 */ public static function startAccordion($selector = 'myAccordian', $params = array()) { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['parent'] = isset($params['parent']) ? ($params['parent'] == true ? '#' . $selector : $params['parent']) : ''; $opt['toggle'] = isset($params['toggle']) ? (bool) $params['toggle'] : !($opt['parent'] === false || isset($params['active'])); $opt['onShow'] = isset($params['onShow']) ? (string) $params['onShow'] : null; $opt['onShown'] = isset($params['onShown']) ? (string) $params['onShown'] : null; $opt['onHide'] = isset($params['onHide']) ? (string) $params['onHide'] : null; $opt['onHidden'] = isset($params['onHidden']) ? (string) $params['onHidden'] : null; Factory::getDocument()->addScriptOptions('bootstrap.accordion', array($selector => $opt)); static::$loaded[__METHOD__][$selector] = true; return '<div id="' . $selector . '" class="accordion" role="tablist">'; } /** * Close the current accordion * * @return string HTML to close the accordian * * @since 3.0 */ public static function endAccordion() { return '</div>'; } /** * Begins the display of a new accordion slide. * * @param string $selector Identifier of the accordion group. * @param string $text Text to display. * @param string $id Identifier of the slide. * @param string $class Class of the accordion group. * * @return string HTML to add the slide * * @since 3.0 */ public static function addSlide($selector, $text, $id, $class = '') { $in = (static::$loaded[__CLASS__ . '::startAccordion'][$selector]['active'] == $id) ? ' in' : ''; $collapsed = (static::$loaded[__CLASS__ . '::startAccordion'][$selector]['active'] == $id) ? '' : ' collapsed'; $parent = static::$loaded[__CLASS__ . '::startAccordion'][$selector]['parent'] ? ' data-parent="' . static::$loaded[__CLASS__ . '::startAccordion'][$selector]['parent'] . '"' : ''; $class = (!empty($class)) ? ' ' . $class : ''; $html = '<div class="card mb-2' . $class . '">' . '<a href="#' . $id . '" data-bs-toggle="collapse"' . $parent . ' class="card-header' . $collapsed . '" role="tab">' . $text . '</a>' . '<div class="collapse' . $in . '" id="' . $id . '" role="tabpanel">' . '<div class="card-block">'; return $html; } /** * Close the current slide * * @return string HTML to close the slide * * @since 3.0 */ public static function endSlide() { return '</div></div></div>'; } /** * Creates a tab pane * * @param string $selector The pane identifier. * @param array $params The parameters for the pane * * @return string * * @since 3.1 */ public static function startTabSet($selector = 'myTab', $params = array()) { $sig = md5(serialize(array($selector, $params))); if (!isset(static::$loaded[__METHOD__][$sig])) { // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['active'] = (isset($params['active']) && ($params['active'])) ? (string) $params['active'] : ''; Factory::getDocument()->addScriptOptions('bootstrap.tabs', array($selector => $opt)); // Set static array static::$loaded[__METHOD__][$sig] = true; static::$loaded[__METHOD__][$selector]['active'] = $opt['active']; } return LayoutHelper::render('libraries.cms.html.bootstrap.starttabset', array('selector' => $selector)); } /** * Close the current tab pane * * @return string HTML to close the pane * * @since 3.1 */ public static function endTabSet() { return LayoutHelper::render('libraries.cms.html.bootstrap.endtabset'); } /** * Begins the display of a new tab content panel. * * @param string $selector Identifier of the panel. * @param string $id The ID of the div element * @param string $title The title text for the new UL tab * * @return string HTML to start a new panel * * @since 3.1 */ public static function addTab($selector, $id, $title) { static $tabScriptLayout = null; static $tabLayout = null; $tabScriptLayout = $tabScriptLayout === null ? new FileLayout('libraries.cms.html.bootstrap.addtabscript') : $tabScriptLayout; $tabLayout = $tabLayout === null ? new FileLayout('libraries.cms.html.bootstrap.addtab') : $tabLayout; $active = (static::$loaded['HTMLHelperBootstrap::startTabSet'][$selector]['active'] == $id) ? ' active' : ''; // Inject tab into UL Factory::getDocument() ->addScriptDeclaration($tabScriptLayout->render(array('selector' => $selector, 'id' => $id, 'active' => $active, 'title' => $title))); return $tabLayout->render(array('id' => $id, 'active' => $active, 'title' => $title)); } /** * Close the current tab content panel * * @return string HTML to close the pane * * @since 3.1 */ public static function endTab() { return LayoutHelper::render('libraries.cms.html.bootstrap.endtab'); } /** * Loads CSS files needed by Bootstrap * * @param boolean $includeMainCss If true, main bootstrap.css files are loaded * @param string $direction rtl or ltr direction. If empty, ltr is assumed * @param array $attribs Optional array of attributes to be passed to HTMLHelper::_('stylesheet') * * @return void * * @since 3.0 */ public static function loadCss($includeMainCss = true, $direction = 'ltr', $attribs = array()) { // Load Bootstrap main CSS if ($includeMainCss) { HTMLHelper::_('stylesheet', 'vendor/bootstrap/bootstrap.min.css', array('version' => 'auto', 'relative' => true), $attribs); } /** * BOOTSTRAP RTL - WILL SORT OUT LATER DOWN THE LINE * Load Bootstrap RTL CSS * if ($direction === 'rtl') * { * HTMLHelper::_('stylesheet', 'jui/bootstrap-rtl.css', array('version' => 'auto', 'relative' => true), $attribs); * } */ } } PKBA#]���Zsystem/helixultimate/overrides_legacy/layouts/libraries/cms/html/bootstrap/starttabset.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $selector = empty($displayData['selector']) ? '' : $displayData['selector']; ?> <ul class="joomla-tabs nav nav-tabs mb-3" id="<?php echo $selector; ?>Tabs"></ul> <div class="tab-content" id="<?php echo $selector; ?>Content"> PKBA#]1��E[system/helixultimate/overrides_legacy/layouts/libraries/cms/html/bootstrap/addtabscript.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $selector = empty($displayData['selector']) ? '' : $displayData['selector']; $id = empty($displayData['id']) ? '' : $displayData['id']; $active = empty($displayData['active']) ? '' : $displayData['active']; $title = empty($displayData['title']) ? '' : $displayData['title']; $li = '<li class="nav-item"><a class="nav-link' . $active . '" href="#' . $id . '" data-bs-toggle="tab">' . $title . '</a></li>'; echo 'jQuery(function($){ $(', json_encode('#' . $selector . 'Tabs'), ').append($(', json_encode($li), ')); });'; PKBA#]q�;�%%Usystem/helixultimate/overrides_legacy/layouts/libraries/cms/html/bootstrap/addtab.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $id = empty($displayData['id']) ? '' : $displayData['id']; $active = empty($displayData['active']) ? '' : $displayData['active']; $selector = empty($displayData['selector']) ? '' : $displayData['selector']; $title = empty($displayData['title']) ? '' : $displayData['title']; ?> <div id="<?php echo $id; ?>" class="tab-pane<?php echo $active; ?>" data-node="<?php echo htmlspecialchars($active ?? "", ENT_COMPAT, 'UTF-8') .'['. htmlspecialchars($id ?? "", ENT_COMPAT, 'UTF-8') .'['. htmlspecialchars($title ?? "", ENT_COMPAT, 'UTF-8'); ?>"> PKBA#]���Usystem/helixultimate/overrides_legacy/layouts/libraries/cms/html/bootstrap/endtab.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; ?> </div>PKBA#]l#�Xsystem/helixultimate/overrides_legacy/layouts/libraries/cms/html/bootstrap/endtabset.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; ?> </div>PKBA#]����Usystem/helixultimate/overrides_legacy/layouts/com_contact/joomla/form/renderfield.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; extract($displayData); if (!empty($options['showonEnabled'])) { if (JVERSION < 4) { HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'system/cms.min.js', array('version' => 'auto', 'relative' => true)); } else { /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('showon'); } } $name = $name ?? ''; $class = empty($options['class']) ? '' : ' ' . $options['class']; $rel = empty($options['rel']) ? '' : ' ' . $options['rel']; $id = $name . '-desc'; $hideLabel = !empty($options['hiddenLabel']); $hideDescription = empty($options['hiddenDescription']) ? false : $options['hiddenDescription']; if (!empty($parentclass)) { $class .= ' ' . $parentclass; } ?> <div class="control-group<?php echo $class; ?>"<?php echo $rel; ?>> <?php if ($hideLabel) : ?> <div class="visually-hidden"><?php echo $label; ?></div> <?php else : ?> <?php echo $label; ?> <?php endif; ?> <?php echo $input; ?> <?php if (!$hideDescription && !empty($description)) : ?> <div id="<?php echo $id; ?>"> <small class="form-text"> <?php echo $description; ?> </small> </div> <?php endif; ?> </div> PKBA#]v;��JJGsystem/helixultimate/overrides_legacy/layouts/joomla/system/message.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Application\CMSApplication; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; if(JVERSION >= 4) { /* @var $displayData array */ $msgList = $displayData['msgList']; $document = Factory::getDocument(); $msgOutput = ''; $alert = [ CMSApplication::MSG_EMERGENCY => 'danger', CMSApplication::MSG_ALERT => 'danger', CMSApplication::MSG_CRITICAL => 'danger', CMSApplication::MSG_ERROR => 'danger', CMSApplication::MSG_WARNING => 'warning', CMSApplication::MSG_NOTICE => 'info', CMSApplication::MSG_INFO => 'info', CMSApplication::MSG_DEBUG => 'info', 'message' => 'success' ]; // Load JavaScript message titles Text::script('ERROR'); Text::script('MESSAGE'); Text::script('NOTICE'); Text::script('WARNING'); // Load other Javascript message strings Text::script('JCLOSE'); Text::script('JOK'); Text::script('JOPEN'); // Alerts progressive enhancement $document->getWebAssetManager() ->useStyle('webcomponent.joomla-alert') ->useScript('messages'); if (is_array($msgList) && !empty($msgList)) { $messages = []; foreach ($msgList as $type => $msgs) { // JS loaded messages $messages[] = [$alert[$type] ?? $type => $msgs]; // Noscript fallback if (!empty($msgs)) { $msgOutput .= '<div class="alert alert-' . ($alert[$type] ?? $type) . '">'; foreach ($msgs as $msg) : $msgOutput .= $msg; endforeach; $msgOutput .= '</div>'; } } if ($msgOutput !== '') { $msgOutput = '<noscript>' . $msgOutput . '</noscript>'; } $document->addScriptOptions('joomla.messages', $messages); } } else { $msgList = $displayData['msgList']; $alert = [ 'message' => 'alert-primary', 'error' => 'alert-danger', 'warning' => 'alert-warning', 'notice' => 'alert-info', 'info' => 'alert-info', 'debug' => 'alert-warning', 'success' => 'alert-success' ]; } ?> <div id="system-message-container" aria-live="polite"> <?php if (JVERSION >= 4){ echo $msgOutput; } else { ?> <?php if (is_array($msgList) && !empty($msgList)) : ?> <div id="system-message"> <?php foreach ($msgList as $type => $msgs) : ?> <?php $type = \in_array($type, array_keys($alert)) ? $type : 'message'; ?> <div class="alert <?php echo isset($alert[$type]) ? $alert[$type] : 'alert-' . $type; ?>"> <?php // This requires JS so we should add it trough JS. Progressive enhancement and stuff. ?> <a class="btn-close" data-bs-dismiss="alert" aria-label="<?php Text::_('JLIB_HTML_BEHAVIOR_CLOSE'); ?>"></a> <?php if (!empty($msgs)) : ?> <h4 class="alert-heading"><?php echo Text::_($type); ?></h4> <div> <?php foreach ($msgs as $msg) : ?> <div><?php echo $msg; ?></div> <?php endforeach; ?> </div> <?php endif; ?> </div> <?php endforeach; ?> </div> <?php endif; ?> <?php } ?> </div> PKBA#]�"l��Jsystem/helixultimate/overrides_legacy/layouts/joomla/edit/associations.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $form = $displayData->getForm(); $options = array( 'formControl' => $form->getFormControl(), 'hidden' => (int) ($form->getValue('language', null, '*') === '*'), ); HTMLHelper::_('behavior.core'); HTMLHelper::_('jquery.framework'); Text::script('JGLOBAL_ASSOC_NOT_POSSIBLE'); Text::script('JGLOBAL_ASSOCIATIONS_RESET_WARNING'); Factory::getDocument()->addScriptOptions('system.associations.edit', $options); HTMLHelper::_('script', 'system/associations-edit.min.js', array('version' => 'auto', 'relative' => true)); // JLayout for standard handling of associations fields in the administrator items edit screens. echo $form->renderFieldset('item_associations'); PKBA#]>1Ɨ��Lsystem/helixultimate/overrides_legacy/layouts/joomla/edit/publishingdata.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; $app = Factory::getApplication(); $form = $displayData->getForm(); $fields = $displayData->get('fields') ?: array( 'publish_up', 'publish_down', array('created', 'created_time'), array('created_by', 'created_user_id'), 'created_by_alias', array('modified', 'modified_time'), array('modified_by', 'modified_user_id'), 'version', 'hits', 'id' ); $hiddenFields = $displayData->get('hidden_fields') ?: array(); foreach ($fields as $field) { foreach ((array) $field as $f) { if ($form->getField($f)) { if (in_array($f, $hiddenFields)) { $form->setFieldAttribute($f, 'type', 'hidden'); } echo $form->renderField($f); break; } } } PKBA#]e�R��Fsystem/helixultimate/overrides_legacy/layouts/joomla/edit/fieldset.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; $app = Factory::getApplication(); $form = $displayData->getForm(); $name = $displayData->get('fieldset'); $fieldSet = $form->getFieldset($name); if (empty($fieldSet)) { return; } $ignoreFields = $displayData->get('ignore_fields') ? : array(); $extraFields = $displayData->get('extra_fields') ? : array(); if (!empty($displayData->showOptions) || $displayData->get('show_options', 1)) { if (isset($extraFields[$name])) { foreach ($extraFields[$name] as $f) { if (in_array($f, $ignoreFields)) { continue; } if ($form->getField($f)) { $fieldSet[] = $form->getField($f); } } } $html = array(); foreach ($fieldSet as $field) { $html[] = $field->renderField(); } echo implode('', $html); } else { $html = array(); $html[] = '<div style="display:none;">'; foreach ($fieldSet as $field) { $html[] = $field->input; } $html[] = '</div>'; echo implode('', $html); } PKBA#]�Kɰ__Dsystem/helixultimate/overrides_legacy/layouts/joomla/edit/params.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; $app = Factory::getApplication(); $form = $displayData->getForm(); $fieldSets = $form->getFieldsets(); if (empty($fieldSets)) { return; } $ignoreFieldsets = $displayData->get('ignore_fieldsets') ?: array(); $ignoreFields = $displayData->get('ignore_fields') ?: array(); $extraFields = $displayData->get('extra_fields') ?: array(); $tabName = $displayData->get('tab_name') ?: 'myTab'; if (!empty($displayData->hiddenFieldsets)) { // These are required to preserve data on save when fields are not displayed. $hiddenFieldsets = $displayData->hiddenFieldsets ?: array(); } if (!empty($displayData->configFieldsets)) { // These are required to configure showing and hiding fields in the editor. $configFieldsets = $displayData->configFieldsets ?: array(); } // Handle the hidden fieldsets when show_options is set false if (!$displayData->get('show_options', 1)) { // The HTML buffer $html = array(); // Hide the whole buffer $html[] = '<div style="display:none;">'; // Loop over the fieldsets foreach ($fieldSets as $name => $fieldSet) { // Check if the fieldset should be ignored if (in_array($name, $ignoreFieldsets, true)) { continue; } // If it is a hidden fieldset, render the inputs if (in_array($name, $hiddenFieldsets)) { // Loop over the fields foreach ($form->getFieldset($name) as $field) { // Add only the input on the buffer $html[] = $field->input; } // Make sure the fieldset is not rendered twice $ignoreFieldsets[] = $name; } // Check if it is the correct fieldset to ignore if (strpos($name, 'basic') === 0) { // Ignore only the fieldsets which are defined by the options not the custom fields ones $ignoreFieldsets[] = $name; } } // Close the container $html[] = '</div>'; // Echo the hidden fieldsets echo implode('', $html); } // Loop again over the fieldsets foreach ($fieldSets as $name => $fieldSet) { // Ensure any fieldsets we don't want to show are skipped (including repeating formfield fieldsets) if ((isset($fieldSet->repeat) && $fieldSet->repeat === true) || in_array($name, $ignoreFieldsets) || (!empty($configFieldsets) && in_array($name, $configFieldsets, true)) || (!empty($hiddenFieldsets) && in_array($name, $hiddenFieldsets, true)) ) { continue; } // Determine the label if (!empty($fieldSet->label)) { $label = Text::_($fieldSet->label); } else { $label = strtoupper('JGLOBAL_FIELDSET_' . $name); if (Text::_($label) === $label) { $label = strtoupper($app->input->get('option') . '_' . $name . '_FIELDSET_LABEL'); } $label = Text::_($label); } // Start the tab echo HTMLHelper::_((JVERSION < 4 ? 'bootstrap' : 'uitab') . '.addTab', $tabName, 'attrib-' . $name, $label); // Include the description when available if (isset($fieldSet->description) && trim($fieldSet->description)) { echo '<p class="alert alert-info">' . $this->escape(Text::_($fieldSet->description)) . '</p>'; } // The name of the fieldset to render $displayData->fieldset = $name; // Force to show the options $displayData->showOptions = true; // Render the fieldset echo LayoutHelper::render('joomla.edit.fieldset', $displayData); // End the tab echo HTMLHelper::_((JVERSION < 4 ? 'bootstrap' : 'uitab') . '.endTab'); } PKBA#]q*--Rsystem/helixultimate/overrides_legacy/layouts/joomla/edit/frontediting_modules.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; // JLayout for standard handling of the edit modules: $moduleHtml = &$displayData['moduleHtml']; $mod = $displayData['module']; $position = $displayData['position']; $menusEditing = $displayData['menusediting']; $parameters = ComponentHelper::getParams('com_modules'); $redirectUri = '&return=' . urlencode(base64_encode(Uri::getInstance()->toString())); $target = '_blank'; $itemid = Factory::getApplication()->input->get('Itemid', '0', 'int'); if (preg_match('/<(?:div|span|nav|ul|ol|h\d) [^>]*class="[^"]* jmoddiv"/', $moduleHtml)) { // Module has already module edit button: return; } // Add css class jmoddiv and data attributes for module-editing URL and for the tooltip: $editUrl = Uri::base() . 'administrator/index.php?option=com_modules&task=module.edit&id=' . (int) $mod->id; if ($parameters->get('redirect_edit', 'site') === 'site') { $editUrl = JVERSION < 4 ? Uri::base() . 'index.php?option=com_config&controller=config.display.modules&id=' . (int) $mod->id . $redirectUri : Uri::base() . 'index.php?option=com_config&view=modules&id=' . (int) $mod->id . '&Itemid=' . $itemid . $redirectUri; $target = '_self'; } // Add class, editing URL and tooltip, and if module of type menu, also the tooltip for editing the menu item: $count = 0; $moduleHtml = preg_replace( // Replace first tag of module with a class '/^(\s*<(?:div|span|nav|ul|ol|h\d|section|aside|nav|address|article) [^>]*class="[^"]*)"/', // By itself, adding class jmoddiv and data attributes for the URL and tooltip: '\\1 jmoddiv" data-jmodediturl="' . $editUrl . '" data-target="' . $target . '" data-jmodtip="' . HTMLHelper::_('tooltipText', Text::_('JLIB_HTML_EDIT_MODULE'), htmlspecialchars($mod->title ?? "", ENT_COMPAT, 'UTF-8') . '<br />' . sprintf(Text::_('JLIB_HTML_EDIT_MODULE_IN_POSITION'), htmlspecialchars($position ?? "", ENT_COMPAT, 'UTF-8')), 0 ) . '"' // And if menu editing is enabled and allowed and it's a menu module, add data attributes for menu editing: . ($menusEditing && $mod->module === 'mod_menu' ? '" data-jmenuedittip="' . HTMLHelper::_('tooltipText', 'JLIB_HTML_EDIT_MENU_ITEM', 'JLIB_HTML_EDIT_MENU_ITEM_ID') . '"' : '' ), $moduleHtml, 1, $count ); if ($count) { HTMLHelper::_('stylesheet', 'frontend-edit.css', array('version' => 'auto', 'relative' => true)); HTMLHelper::_('script', 'system/frontediting.js', array('version' => 'auto', 'relative' => true)); } PKBA#]T����Dsystem/helixultimate/overrides_legacy/layouts/joomla/edit/global.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; $app = Factory::getApplication(); $form = $displayData->getForm(); $input = $app->input; $component = $input->getCmd('option', 'com_content'); if ($component === 'com_categories') { $extension = $input->getCmd('extension', 'com_content'); $parts = explode('.', $extension); $component = $parts[0]; } $saveHistory = ComponentHelper::getParams($component)->get('save_history', 0); $fields = $displayData->get('fields') ?: array( array('parent', 'parent_id'), array('published', 'state', 'enabled'), array('category', 'catid'), 'featured', 'sticky', 'access', 'language', 'tags', 'note', 'version_note', ); $hiddenFields = $displayData->get('hidden_fields') ?: array(); if (!$saveHistory) { $hiddenFields[] = 'version_note'; } $html = array(); $html[] = '<fieldset class="form-vertical form-no-margin">'; foreach ($fields as $field) { foreach ((array) $field as $f) { if ($form->getField($f)) { if (in_array($f, $hiddenFields)) { $form->setFieldAttribute($f, 'type', 'hidden'); } $html[] = $form->renderField($f); break; } } } $html[] = '</fieldset>'; echo implode('', $html); PKBA#]B����Esystem/helixultimate/overrides_legacy/layouts/joomla/edit/details.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Multilanguage; use Joomla\CMS\Language\Text; $app = Factory::getApplication(); // JLayout for standard handling of the details sidebar in administrator edit screens. $title = $displayData->getForm()->getValue('title'); $published = $displayData->getForm()->getField('published'); $saveHistory = $displayData->get('state')->get('params')->get('save_history', 0); ?> <div class="col-lg-2"> <h4><?php echo Text::_('JDETAILS'); ?></h4> <hr> <fieldset class="form-vertical"> <?php if (empty($title)) : ?> <div class="control-group"> <div class="controls"> <?php echo $displayData->getForm()->getValue('name'); ?> </div> </div> <?php else : ?> <div class="control-group"> <div class="controls"> <?php echo $displayData->getForm()->getValue('title'); ?> </div> </div> <?php endif; ?> <?php if ($published) : ?> <?php echo $displayData->getForm()->renderField('published'); ?> <?php else : ?> <?php echo $displayData->getForm()->renderField('state'); ?> <?php endif; ?> <?php echo $displayData->getForm()->renderField('access'); ?> <?php echo $displayData->getForm()->renderField('featured'); ?> <?php if (Multilanguage::isEnabled()) : ?> <?php echo $displayData->getForm()->renderField('language'); ?> <?php else : ?> <input type="hidden" id="jform_language" name="jform[language]" value="<?php echo $displayData->getForm()->getValue('language'); ?>"> <?php endif; ?> <?php echo $displayData->getForm()->renderField('tags'); ?> <?php if ($saveHistory) : ?> <?php echo $displayData->getForm()->renderField('version_note'); ?> <?php endif; ?> </fieldset> </div> PKBA#]�ݩq��Hsystem/helixultimate/overrides_legacy/layouts/joomla/edit/item_title.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); $title = $displayData->getForm()->getValue('title'); $name = $displayData->getForm()->getValue('name'); ?> <?php if ($title) : ?> <h4><?php echo $title; ?></h4> <?php endif; ?> <?php if ($name) : ?> <h4><?php echo $name; ?></h4> <?php endif; PKBA#]�v;;Fsystem/helixultimate/overrides_legacy/layouts/joomla/edit/metadata.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; $form = $displayData->getForm(); // JLayout for standard handling of metadata fields in the administrator content edit screens. $fieldSets = $form->getFieldsets('metadata'); ?> <?php foreach ($fieldSets as $name => $fieldSet) : ?> <?php if (isset($fieldSet->description) && trim($fieldSet->description)) : ?> <p class="alert alert-info"><?php echo $this->escape(Text::_($fieldSet->description)); ?></p> <?php endif; ?> <?php // Include the real fields in this panel. if ($name === 'jmetadata') { echo $form->renderField('metadesc'); echo $form->renderField('metakey'); echo $form->renderField('xreference'); } foreach ($form->getFieldset($name) as $field) { if ($field->name !== 'jform[metadata][tags][]') { echo $field->renderField(); } } ?> <?php endforeach; ?> PKBA#]���Isystem/helixultimate/overrides_legacy/layouts/joomla/edit/title_alias.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); $form = $displayData->getForm(); $title = $form->getField('title') ? 'title' : ($form->getField('name') ? 'name' : ''); ?> <div class="m-t-2 m-b-3"> <?php echo $title ? $form->renderField($title) : ''; echo $form->renderField('alias'); ?> </div> PKBA#]A��<<Psystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/group/groupopen.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $btnClass = $displayData['class']; ?> <div class="btn-group"> PKBA#]�?�ROsystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/group/groupmid.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $btnClass = $displayData['class']; ?> <button type="button" class="btn btn-sm <?php echo $btnClass; ?> dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" data-bs-auto-close="true" aria-haspopup="true" aria-expanded="false"></button> <div class="dropdown-menu"> PKBA#]|�)�Qsystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/group/groupclose.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; ?> </div> </div> PKBA#]Q�R``Isystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/versions.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Session\Session; extract($displayData); echo HTMLHelper::_( 'bootstrap.renderModal', 'versionsModal', array( 'url' => "index.php?option=com_contenthistory&view=history&layout=modal&tmpl=component&item_id=" . (int) $displayData['itemId']. "&type_id=" . $displayData['typeId'] . "&type_alias=" . $displayData['typeAlias'] . "&" . Session::getFormToken() . "=1", 'title' => $displayData['title'], 'height' => '100%', 'width' => '100%', 'modalWidth' => '80', 'bodyHeight' => '60', 'footer' => '<a type="button" class="btn btn-secondary" data-dismiss="modal" aria-hidden="true">' . Text::_("JLIB_HTML_BEHAVIOR_CLOSE") . '</a>' ) ); $id = isset($displayData['id']) ? $displayData['id'] : ''; ?> <button id="<?php echo $id; ?>" onclick="jQuery('#versionsModal').modal('show')" class="btn btn-sm btn-outline-primary" data-bs-toggle="modal" title="<?php echo $displayData['title']; ?>"> <span class="icon-archive" aria-hidden="true"></span><?php echo $displayData['title']; ?> </button> PKBA#] ���''Esystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/base.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; ?> <?php echo $displayData['action']; ?> PKBA#]%f��%%Esystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/link.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $id = isset($displayData['id']) ? $displayData['id'] : ''; $doTask = isset($displayData['onclick']) ? $displayData['onclick'] : $displayData['doTask']; $class = $displayData['class']; $text = $displayData['text']; $margin = (strpos($doTask, 'index.php?option=com_config') === false) ? '' : ' ms-auto'; ?> <button id="<?php echo $id; ?>" class="btn btn-outline-danger btn-sm<?php echo $margin; ?>" onclick="location.href='<?php echo $doTask; ?>';"> <span class="<?php echo $class; ?>" aria-hidden="true"></span> <?php echo $text; ?> </button> PKBA#]�����Fsystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/modal.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $selector = $displayData['selector']; $id = isset($displayData['id']) ? $displayData['id'] : ''; $class = isset($displayData['class']) ? $displayData['class'] : 'btn btn-secondary btn-sm'; $icon = isset($displayData['icon']) ? $displayData['icon'] : 'fas fa-download'; $text = isset($displayData['text']) ? $displayData['text'] : ''; // Render the modal echo HTMLHelper::_('bootstrap.renderModal', 'modal_'. $selector, array( 'url' => $displayData['doTask'], 'title' => $text, 'height' => '100%', 'width' => '100%', 'modalWidth' => 80, 'bodyHeight' => 60, 'closeButton' => true, 'footer' => '<a class="btn btn-secondary" data-bs-dismiss="modal" type="button"' . ' onclick="window.parent.jQuery(\'#modal_downloadModal\').modal(\'hide\');">' . Text::_("COM_BANNERS_CANCEL") . '</a>' . '<button class="btn btn-success" type="button"' . ' onclick="jQuery(\'#modal_downloadModal iframe\').contents().find(\'#exportBtn\').click();">' . Text::_("COM_BANNERS_TRACKS_EXPORT") . '</button>', ) ); ?> <button id="<?php echo $id; ?>" onclick="jQuery('#modal_<?php echo $selector; ?>').modal('show')" class="<?php echo $class; ?>" data-bs-toggle="modal" title="<?php echo $text; ?>"> <span class="icon-<?php echo $icon; ?>" aria-hidden="true"></span><?php echo $text; ?> </button> PKBA#]�I#���Nsystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/containeropen.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Language\Text; ?> <div class="btn-toolbar d-flex" role="toolbar" aria-label="<?php echo Text::_('JTOOLBAR'); ?>" id="<?php echo $displayData['id']; ?>"> PKBA#]��E��Hsystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/confirm.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\HTML\HTMLHelper; HTMLHelper::_('behavior.core'); $id = isset($displayData['id']) ? $displayData['id'] : ''; $doTask = isset($displayData['onclick']) ? $displayData['onclick'] : $displayData['doTask']; $class = $displayData['class']; $text = $displayData['text']; ?> <button id="<?php echo $id; ?>" onclick="<?php echo $doTask; ?>" class="btn btn-sm btn-outline-danger"> <span class="<?php echo $class; ?>" aria-hidden="true"></span> <?php echo $text; ?> </button> PKBA#]Ȗf�LLFsystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/popup.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\HTML\HTMLHelper; HTMLHelper::_('behavior.core'); $id = isset($displayData['id']) ? $displayData['id'] : ''; $doTask = isset($displayData['onclick']) ? $displayData['onclick'] : $displayData['doTask']; $class = $displayData['class']; $text = $displayData['text']; $name = $displayData['name']; ?> <button id="<?php echo $id; ?>" value="<?php echo $doTask; ?>" class="btn btn-sm btn-outline-primary" data-bs-toggle="modal" data-bs-target="#modal-<?php echo $name; ?>"> <span class="<?php echo $class; ?>" aria-hidden="true"></span> <?php echo $text; ?> </button> PKBA#]%?keeFsystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/apply.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; HTMLHelper::_('behavior.core'); if (preg_match('/Joomla.submitbutton/', $displayData['doTask'])) { $ctrls = str_replace("Joomla.submitbutton('", '', $displayData['doTask']); $ctrls = str_replace("')", '', $ctrls); $ctrls = str_replace(";", '', $ctrls); $options = array('task' => $ctrls); Factory::getDocument()->addScriptOptions('keySave', $options); } $id = isset($displayData['id']) ? $displayData['id'] : ''; $doTask = isset($displayData['onclick']) ? $displayData['onclick'] : $displayData['doTask']; $class = $displayData['class']; $text = $displayData['text']; $btnClass = $displayData['btnClass']; ?> <button id="<?php echo $id; ?>" onclick="<?php echo $doTask; ?>" class="<?php echo $btnClass; ?>"> <span class="<?php echo trim($class); ?>"></span> <?php echo $text; ?> </button> PKBA#]��*��Fsystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/title.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $icon = empty($displayData['icon']) ? 'generic' : preg_replace('#\.[^ .]*$#', '', $displayData['icon']); ?> <h1 class="page-title"> <span class="icon-<?php echo $icon; ?>" aria-hidden="true"></span> <?php echo $displayData['title']; ?> </h1> PKBA#]nr6�ggIsystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/standard.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\HTML\HTMLHelper; HTMLHelper::_('behavior.core'); $id = isset($displayData['id']) ? $displayData['id'] : ''; $doTask = isset($displayData['onclick']) ? $displayData['onclick'] : $displayData['doTask']; $class = $displayData['class']; $text = $displayData['text']; $btnClass = isset($displayData['btnClass']) ? $displayData['btnClass'] : ''; $group = isset($displayData['group']) ? $displayData['group'] : ''; ?> <?php if ($group) : ?> <a id="<?php echo $id; ?>" href="#" onclick="<?php echo $doTask; ?>" class="dropdown-item"> <span class="<?php echo trim($class); ?>"></span> <?php echo $text; ?> </a> <?php else : ?> <button id="<?php echo $id; ?>" onclick="<?php echo $doTask; ?>" class="<?php echo $btnClass; ?>"> <span class="<?php echo trim($class); ?>" aria-hidden="true"></span> <?php echo $text; ?> </button> <?php endif; ?> PKBA#]Ɣ�(Fsystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/batch.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; HTMLHelper::_('behavior.core'); $id = isset($displayData['id']) ? $displayData['id'] : ''; $title = $displayData['title']; Text::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'); Text::script('ERROR'); $message = "{'error': [Joomla.JText._('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST')]}"; $alert = "Joomla.renderMessages(" . $message . ")"; ?> <button id="<?php echo $id; ?>" data-bs-toggle="modal" onclick="if (document.adminForm.boxchecked.value==0){<?php echo $alert; ?>}else{jQuery( '#collapseModal' ).modal('show'); return true;}" class="btn btn-outline-primary btn-sm"> <span class="icon-checkbox-partial" aria-hidden="true" title="<?php echo $title; ?>"></span> <?php echo $title; ?> </button> PKBA#]����Osystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/containerclose.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; ?> </div> PKBA#]�qj,��Esystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/help.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\HTML\HTMLHelper; HTMLHelper::_('behavior.core'); $id = isset($displayData['id']) ? $displayData['id'] : ''; $doTask = isset($displayData['onclick']) ? $displayData['onclick'] : $displayData['doTask']; $text = $displayData['text']; ?> <button id="<?php echo $id; ?>" onclick="<?php echo $doTask; ?>" rel="help" class="btn btn-outline-info btn-sm"> <span class="icon-question-sign" aria-hidden="true"></span> <?php echo $text; ?> </button> PKBA#]��I���Jsystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/separator.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; PKBA#]Z�))Jsystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/iconclass.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; ?> icon-<?php echo $displayData['icon']; ?> PKBA#]��*���Gsystem/helixultimate/overrides_legacy/layouts/joomla/toolbar/slider.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\HTML\HTMLHelper; HTMLHelper::_('behavior.core'); $id = isset($displayData['id']) ? $displayData['id'] : ''; $doTask = isset($displayData['onclick']) ? $displayData['onclick'] : $displayData['doTask']; $class = $displayData['class']; $text = $displayData['text']; $name = $displayData['name']; $onClose = $displayData['onClose']; ?> <button id="<?php echo $id; ?>" onclick="<?php echo $doTask; ?>" class="btn btn-sm btn-secondary" data-bs-toggle="collapse" data-bs-target="#collapse-<?php echo $name; ?>"<?php echo $onClose; ?>> <span class="icon-cog" aria-hidden="true"></span> <?php echo $text; ?> </button> PKBA#]!%TIsystem/helixultimate/overrides_legacy/layouts/joomla/links/groupsopen.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; ?> <div class="j-links-groups">PKBA#]!�пIsystem/helixultimate/overrides_legacy/layouts/joomla/links/groupclose.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; ?> </ul> PKBA#]����Jsystem/helixultimate/overrides_legacy/layouts/joomla/links/groupsclose.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; ?> </div> PKBA#]~&'A��Hsystem/helixultimate/overrides_legacy/layouts/joomla/links/groupopen.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Filter\OutputFilter; use Joomla\CMS\Language\Text; ?> <h2 class="nav-header"><?php echo OutputFilter::ampReplace(Text::_($displayData)); ?></h2> <ul class="j-links-group nav nav-list"> PKBA#]���&&Msystem/helixultimate/overrides_legacy/layouts/joomla/links/groupseparator.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; ?> <div class="j-links-separator"></div> PKBA#]�V�RCsystem/helixultimate/overrides_legacy/layouts/joomla/links/link.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Filter\OutputFilter; $id = empty($displayData['id']) ? '' : (' id="' . $displayData['id'] . '"'); $target = empty($displayData['target']) ? '' : (' target="' . $displayData['target'] . '"'); $onclick = empty($displayData['onclick']) ? '' : (' onclick="' . $displayData['onclick'] . '"'); $title = empty($displayData['title']) ? '' : (' title="' . $this->escape($displayData['title']) . '"'); $text = empty($displayData['text']) ? '' : ('<span class="j-links-link">' . $displayData['text'] . '</span>') ?> <li<?php echo $id; ?>> <a href="<?php echo OutputFilter::ampReplace($displayData['link']); ?>"<?php echo $target . $onclick . $title; ?>> <span class="icon-<?php echo $displayData['image']; ?>" aria-hidden="true"></span> <?php echo $text; ?> </a> </li> PKBA#]��Vu u Isystem/helixultimate/overrides_legacy/layouts/joomla/pagination/links.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; use Joomla\Registry\Registry; $list = $displayData['list']; $pages = $list['pages']; $options = new Registry($displayData['options']); $showLimitBox = $options->get('showLimitBox', true); $showPagesLinks = $options->get('showPagesLinks', true); $showLimitStart = $options->get('showLimitStart', true); // Calculate to display range of pages $currentPage = 1; $range = 1; $step = 5; if (!empty($pages['pages'])) { foreach ($pages['pages'] as $k => $page) { if (!$page['active']) { $currentPage = $k; } } } if ($currentPage >= $step) { if ($currentPage % $step === 0) { $range = ceil($currentPage / $step) + 1; } else { $range = ceil($currentPage / $step); } } ?> <div class="pagination pagination-toolbar clearfix" style="text-align: center;"> <?php if ($showLimitBox) : ?> <div class="limit float-end"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM') . $list['limitfield']; ?> </div> <?php endif; ?> <?php if ($showPagesLinks && (!empty($pages))) : ?> <ul class="pagination-list d-flex list-unstyled ms-2"> <?php echo LayoutHelper::render('joomla.pagination.link', $pages['start']); echo LayoutHelper::render('joomla.pagination.link', $pages['previous']); ?> <?php foreach ($pages['pages'] as $k => $page) : ?> <?php $output = LayoutHelper::render('joomla.pagination.link', $page); ?> <?php if (in_array($k, range($range * $step - ($step + 1), $range * $step), true)) : ?> <?php if (($k % $step === 0 || $k === $range * $step - ($step + 1)) && $k !== $currentPage && $k !== $range * $step - $step) : ?> <?php $output = preg_replace('#(<a.*?>).*?(</a>)#', '$1...$2', $output); ?> <?php endif; ?> <?php endif; ?> <?php echo $output; ?> <?php endforeach; ?> <?php echo LayoutHelper::render('joomla.pagination.link', $pages['next']); echo LayoutHelper::render('joomla.pagination.link', $pages['end']); ?> </ul> <?php endif; ?> <?php if ($showLimitStart) : ?> <input type="hidden" name="<?php echo $list['prefix']; ?>limitstart" value="<?php echo $list['limitstart']; ?>"> <?php endif; ?> </div> PKBA#]���vEEHsystem/helixultimate/overrides_legacy/layouts/joomla/pagination/list.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $list = $displayData['list']; $startDisabled = $list['start']['active'] ? '' : ' disabled'; $prevDisabled = $list['previous']['active'] ? '' : ' disabled'; $nextDisabled = $list['next']['active'] ? '' : ' disabled'; $endDisabled = $list['end']['active'] ? '' : ' disabled'; ?> <ul class="pagination ms-0 mb-4"> <?php echo $list['start']['data']; ?> <?php echo $list['previous']['data']; ?> <?php foreach ($list['pages'] as $page) : ?> <?php echo $page['data']; ?> <?php endforeach; ?> <?php echo $list['next']['data']; ?> <?php echo $list['end']['data']; ?> </ul>PKBA#]P�d�� � Hsystem/helixultimate/overrides_legacy/layouts/joomla/pagination/link.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; $item = $displayData['data']; $display = $item->text; $app = Factory::getApplication(); switch ((string) $item->text) { // Check for "Start" item case Text::_('JLIB_HTML_START') : $icon = $app->getLanguage()->isRtl() ? 'fas fa-angle-double-right' : 'fas fa-angle-double-left'; $aria = Text::sprintf('JLIB_HTML_GOTO_POSITION', strtolower($item->text)); break; // Check for "Prev" item case $item->text === Text::_('JPREV') : $item->text = Text::_('JPREVIOUS'); $icon = $app->getLanguage()->isRtl() ? 'fas fa-angle-right' : 'fas fa-angle-left'; $aria =Text::sprintf('JLIB_HTML_GOTO_POSITION', strtolower($item->text)); break; // Check for "Next" item case Text::_('JNEXT') : $icon = $app->getLanguage()->isRtl() ? 'fas fa-angle-left' : 'fas fa-angle-right'; $aria = Text::sprintf('JLIB_HTML_GOTO_POSITION', strtolower($item->text)); break; // Check for "End" item case Text::_('JLIB_HTML_END') : $icon = $app->getLanguage()->isRtl() ? 'fas fa-angle-double-left' : 'fas fa-angle-double-right'; $aria = Text::sprintf('JLIB_HTML_GOTO_POSITION', strtolower($item->text)); break; default: $icon = null; $aria = Text::sprintf('JLIB_HTML_GOTO_PAGE', strtolower($item->text)); break; } if ($icon !== null) { $display = '<span class="' . $icon . '" aria-hidden="true"></span>'; } if ($displayData['active']) { if ($item->base > 0) { $limit = 'limitstart.value=' . $item->base; } else { $limit = 'limitstart.value=0'; } $class = 'active'; if ($app->isClient('administrator')) { $link = 'href="#" onclick="document.adminForm.' . $item->prefix . $limit . '; Joomla.submitform();return false;"'; } elseif ($app->isClient('site')) { $link = 'href="' . $item->link . '"'; } } else { $class = (property_exists($item, 'active') && $item->active) ? 'active' : 'disabled'; } ?> <?php if ($displayData['active']) : ?> <li class="page-item"> <a aria-label="<?php echo $aria; ?>" <?php echo $link; ?> class="page-link"> <?php echo $display; ?> </a> </li> <?php elseif (isset($item->active) && $item->active) : ?> <?php $aria = Text::sprintf('JLIB_HTML_PAGE_CURRENT', strtolower($item->text)); ?> <li class="<?php echo $class; ?> page-item"> <span aria-current="true" aria-label="<?php echo $aria; ?>" class="page-link"><?php echo $display; ?></span> </li> <?php else : ?> <li class="<?php echo $class; ?> page-item"> <span class="page-link" aria-hidden="true"><?php echo $display; ?></span> </li> <?php endif; ?> PKBA#]@��~� � Csystem/helixultimate/overrides_legacy/layouts/joomla/modal/main.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Layout\LayoutHelper; use Joomla\Utilities\ArrayHelper; /** * This modal/main.php file is not exists at Joomla 4. * So for Joomla 4 don't proceed. */ if (JVERSION >= 4) { return; } // Load bootstrap-tooltip-extended plugin for additional tooltip positions in modal HTMLHelper::_('bootstrap.tooltipExtended'); extract($displayData); /** * Layout variables * ------------------ * @param string $selector Unique DOM identifier for the modal. CSS id without # * @param array $params Modal parameters. Default supported parameters: * - title string The modal title * - backdrop mixed A boolean select if a modal-backdrop element should be included (default = true) * The string 'static' includes a backdrop which doesn't close the modal on click. * - keyboard boolean Closes the modal when escape key is pressed (default = true) * - closeButton boolean Display modal close button (default = true) * - animation boolean Fade in from the top of the page (default = true) * - url string URL of a resource to be inserted as an <iframe> inside the modal body * - height string height of the <iframe> containing the remote resource * - width string width of the <iframe> containing the remote resource * - bodyHeight int Optional height of the modal body in viewport units (vh) * - modalWidth int Optional width of the modal in viewport units (vh) * - footer string Optional markup for the modal footer * @param string $body Markup for the modal body. Appended after the <iframe> if the URL option is set * */ $modalClasses = array('modal', 'hide'); if (!isset($params['animation']) || $params['animation']) { $modalClasses[] = 'fade'; } $modalWidth = isset($params['modalWidth']) ? round((int) $params['modalWidth'], -1) : ''; if ($modalWidth && $modalWidth > 0 && $modalWidth <= 100) { $modalClasses[] = 'jviewport-width' . $modalWidth; } $modalAttributes = array( 'tabindex' => '-1', 'class' => implode(' ', $modalClasses) ); if (isset($params['backdrop'])) { $modalAttributes['data-backdrop'] = (is_bool($params['backdrop']) ? ($params['backdrop'] ? 'true' : 'false') : $params['backdrop']); } if (isset($params['keyboard'])) { $modalAttributes['data-keyboard'] = (is_bool($params['keyboard']) ? ($params['keyboard'] ? 'true' : 'false') : 'true'); } /** * These lines below are for disabling scrolling of parent window. * $('body').addClass('modal-open'); * $('body').removeClass('modal-open') * * Scrolling inside bootstrap modals on small screens (adapt to window viewport and avoid modal off screen). * - max-height .modal-body Max-height for the modal body * When height of the modal is too high for the window viewport height. * - max-height .iframe Max-height for the iframe (Deducting the padding of the modal-body) * When URL option is set and height of the iframe is higher than max-height of the modal body. * * Fix iOS scrolling inside bootstrap modals * - overflow-y .modal-body When max-height is set for modal-body * * Specific hack for Bootstrap 2.3.x */ $script[] = "jQuery(document).ready(function($) {"; $script[] = " $('#" . $selector . "').on('show.bs.modal', function() {"; $script[] = " if ($('#{$selector}').hasClass('hide')) {"; $script[] = " $('#{$selector}').removeClass('hide');"; $script[] = " }"; $script[] = " $('body').addClass('modal-open');"; if (isset($params['url'])) { $iframeHtml = LayoutHelper::render('joomla.modal.iframe', $displayData); // Script for destroying and reloading the iframe $script[] = " var modalBody = $(this).find('.modal-body');"; $script[] = " modalBody.find('iframe').remove();"; $script[] = " modalBody.prepend('" . trim($iframeHtml) . "');"; } else { // Set modalTooltip container to modal ID (selector), and placement to top-left if no data attribute (bootstrap-tooltip-extended.js) $script[] = " $('.modalTooltip').each(function(){;"; $script[] = " var attr = $(this).attr('data-placement');"; $script[] = " if ( attr === undefined || attr === false ) $(this).attr('data-placement', 'auto-dir top-left')"; $script[] = " });"; $script[] = " $('.modalTooltip').tooltip({'html': true, 'container': '#" . $selector . "'});"; } // Adapt modal body max-height to window viewport if needed, when the modal has been made visible to the user. $script[] = " }).on('shown.bs.modal', function() {"; // Get height of the modal elements. $script[] = " var modalHeight = $('div.modal:visible').outerHeight(true),"; $script[] = " modalHeaderHeight = $('div.modal-header:visible').outerHeight(true),"; $script[] = " modalBodyHeightOuter = $('div.modal-body:visible').outerHeight(true),"; $script[] = " modalBodyHeight = $('div.modal-body:visible').height(),"; $script[] = " modalFooterHeight = $('div.modal-footer:visible').outerHeight(true),"; // Get padding top (jQuery position().top not working on iOS devices and webkit browsers, so use of Javascript instead) $script[] = " padding = document.getElementById('" . $selector . "').offsetTop,"; // Calculate max-height of the modal, adapted to window viewport height. $script[] = " maxModalHeight = ($(window).height()-(padding*2)),"; // Calculate max-height for modal-body. $script[] = " modalBodyPadding = (modalBodyHeightOuter-modalBodyHeight),"; $script[] = " maxModalBodyHeight = maxModalHeight-(modalHeaderHeight+modalFooterHeight+modalBodyPadding);"; if (isset($params['url'])) { // Set max-height for iframe if needed, to adapt to viewport height. $script[] = " var iframeHeight = $('.iframe').height();"; $script[] = " if (iframeHeight > maxModalBodyHeight){;"; $script[] = " $('.modal-body').css({'max-height': maxModalBodyHeight, 'overflow-y': 'auto'});"; $script[] = " $('.iframe').css('max-height', maxModalBodyHeight-modalBodyPadding);"; $script[] = " }"; } else { // Set max-height for modal-body if needed, to adapt to viewport height. $script[] = " if (modalHeight > maxModalHeight){;"; $script[] = " $('.modal-body').css({'max-height': maxModalBodyHeight, 'overflow-y': 'auto'});"; $script[] = " }"; } $script[] = " }).on('hide.bs.modal', function () {"; $script[] = " if (!$('#{$selector}').hasClass('hide')) {"; $script[] = " $('#{$selector}').addClass('hide');"; $script[] = " }"; $script[] = " $('body').removeClass('modal-open');"; $script[] = " $('.modal-body').css({'max-height': 'initial', 'overflow-y': 'initial'});"; $script[] = " $('.modalTooltip').tooltip('destroy');"; $script[] = " });"; $script[] = "});"; Factory::getDocument()->addScriptDeclaration(implode("\n", $script)); ?> <div id="<?php echo $selector; ?>" <?php echo ArrayHelper::toString($modalAttributes); ?>> <div class="modal-dialog" role="document" style="max-width: <?php echo $params['width']; ?>; max-height: <?php echo $params['height']; ?>;"> <div class="modal-content"> <?php // Header if (!isset($params['closeButton']) || isset($params['title']) || $params['closeButton']) { echo LayoutHelper::render('joomla.modal.header', $displayData); } // Body echo LayoutHelper::render('joomla.modal.body', $displayData); // Footer if (isset($params['footer'])) { echo LayoutHelper::render('joomla.modal.footer', $displayData); } ?> </div> </div> </div> PKBA#]���y��Hsystem/helixultimate/overrides_legacy/layouts/joomla/editors/buttons.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; $buttons = $displayData; ?> <div id="editor-xtd-buttons" role="toolbar" aria-label="<?php echo Text::_('JTOOLBAR'); ?>"> <?php if ($buttons) : ?> <?php foreach ($buttons as $button) : ?> <?php echo $this->sublayout('button', $button); ?> <?php endforeach; ?> <?php foreach ($buttons as $button) : ?> <?php echo LayoutHelper::render('joomla.editors.buttons.modal', $button); ?> <?php endforeach; ?> <?php endif; ?> </div> PKBA#]e�У� � Osystem/helixultimate/overrides_legacy/layouts/joomla/editors/buttons/button.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; /** @var \Joomla\CMS\Editor\Button\Button $button */ $button = $displayData; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $btnAsset = 'editor-button.' . $button->getButtonName(); // Enable the button assets if any if ($wa->assetExists('style', $btnAsset)) { $wa->useStyle($btnAsset); } if ($wa->assetExists('script', $btnAsset)) { $wa->useScript($btnAsset); } $class = 'btn btn-secondary'; $class .= $button->get('class') ? ' ' . $button->get('class') : null; $class .= $button->get('modal') ? ' modal-button' : null; $href = '#' . $button->get('editor') . '_' . strtolower($button->get('name', '')) . '_modal'; $link = $button->get('link'); $onclick = $button->get('onclick') ? ' onclick="' . $button->get('onclick') . '"' : ''; $title = $button->get('title') ? $button->get('title') : $button->get('text', ''); $icon = $button->get('icon'); $action = $button->get('action', ''); $options = (array) $button->get('options'); // Correct the link, check for legacy with & in it, and prepend a base Uri if ($link && $link[0] !== '#') { $link = str_contains($link, '&') ? htmlspecialchars_decode($link) : $link; $link = Uri::base(true) . '/' . $link; $options['src'] = $options['src'] ?? $link; } // Detect a legacy BS modal, and set action to "modal" for legacy buttons, when possible $legacyModal = $button->get('modal'); // Prepare default values for modal if ($action === 'modal') { $wa->useScript('joomla.dialog'); $legacyModal = false; $options['popupType'] = $options['popupType'] ?? 'iframe'; $options['textHeader'] = $options['textHeader'] ?? $title; $options['iconHeader'] = $options['iconHeader'] ?? 'icon-' . $icon; } $optStr = $options && $action ? json_encode($options, JSON_UNESCAPED_SLASHES) : ''; ?> <button type="button" data-joomla-editor-button-action="<?php echo $this->escape($action); ?>" data-joomla-editor-button-options="<?php echo $this->escape($optStr); ?>" class="xtd-button btn btn-secondary <?php echo $class; ?>" title="<?php echo $this->escape($title); ?>" <?php echo $onclick; ?> <?php echo $legacyModal ? 'data-bs-toggle="modal" data-bs-target="' . $href . '"' : '' ?>> <?php if ($icon) : ?> <span class="icon-<?php echo $icon; ?>" aria-hidden="true"></span> <?php endif; ?> <?php echo $button->get('text'); ?> </button> PKBA#]G��AANsystem/helixultimate/overrides_legacy/layouts/joomla/editors/buttons/modal.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; $button = $displayData; if (!$button->get('modal')) { return; } $class = ($button->get('class')) ? $button->get('class') : null; $class .= ($button->get('modal')) ? ' modal-button' : null; $href = '#' . str_replace(' ', '', $button->get('text')) . 'Modal'; $link = ($button->get('link')) ? Uri::base() . $button->get('link') : null; $onclick = ($button->get('onclick')) ? ' onclick="' . $button->get('onclick') . '"' : ''; $title = ($button->get('title')) ? $button->get('title') : $button->get('text'); $options = is_array($button->get('options')) ? $button->get('options') : array(); $confirm = ''; if (is_array($button->get('options')) && isset($options['confirmText']) && isset($options['confirmCallback'])) { $confirm = '<button type="button" class="btn btn-success" data-bs-dismiss="modal" onclick="' . $options['confirmCallback'] . '">' . $options['confirmText'] . ' </button>'; } if (null !== $button->get('id')) { $id = str_replace(' ', '', $button->get('id')); } else { $id = str_replace(' ', '', $button->get('text')) . 'Modal'; } // Create the modal echo HTMLHelper::_( 'bootstrap.renderModal', $id, array( 'url' => $link, 'title' => $title, 'height' => array_key_exists('height', $options) ? $options['height'] : '400px', 'width' => array_key_exists('width', $options) ? $options['width'] : '800px', 'bodyHeight' => array_key_exists('bodyHeight', $options) ? $options['bodyHeight'] : '70', 'modalWidth' => array_key_exists('modalWidth', $options) ? $options['modalWidth'] : '80', 'footer' => $confirm . '<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">' . Text::_("JLIB_HTML_BEHAVIOR_CLOSE") . '</button>' ) ); PKBA#]�!A�kkHsystem/helixultimate/overrides_legacy/layouts/joomla/quickicons/icon.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $id = empty($displayData['id']) ? '' : (' id="' . $displayData['id'] . '"'); $target = empty($displayData['target']) ? '' : (' target="' . $displayData['target'] . '"'); $onclick = empty($displayData['onclick']) ? '' : (' onclick="' . $displayData['onclick'] . '"'); $title = empty($displayData['title']) ? '' : (' title="' . $this->escape($displayData['title']) . '"'); $text = empty($displayData['text']) ? '' : ('<span class="j-links-link">' . $displayData['text'] . '</span>'); $pulse = ''; if ($id !== '') { $pulse = ($displayData['id'] === 'plg_quickicon_joomlaupdate' || $displayData['id'] === 'plg_quickicon_extensionupdate') ? ' pulse' : ''; } ?> <div class="col-4 col-lg-3"<?php echo $id; ?>> <a href="<?php echo $displayData['link']; ?>" class="d-flex align-items-stretch<?php echo $pulse; ?>"<?php echo $target . $onclick . $title; ?>> <span class="icon-<?php echo $displayData['image']; ?> text-center" aria-hidden="true"></span> <span class="d-flex align-items-center hidden-xs-down"><?php echo $text; ?></span> </a> <span class="hidden-sm-up quickicon-text-xs"><?php echo $text; ?></span> </div> PKBA#]��Ќ��Isystem/helixultimate/overrides_legacy/layouts/joomla/form/renderlabel.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; extract($displayData); $classes = array_filter((array) $classes); $id = $for . '-lbl'; if ($required) { $classes[] = 'required'; } $classes[] = 'form-label'; ?> <label id="<?php echo $id; ?>" for="<?php echo $for; ?>"<?php if (!empty($classes)) { echo ' class="' . implode(' ', $classes) . '"';} ?>> <?php echo $text; ?><?php if ($required) : ?><span class="star" aria-hidden="true"> *</span><?php endif; ?> </label>PKBA#]���O��Lsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/textarea.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use HelixUltimate\Framework\Platform\Helper; defined ('JPATH_BASE') or die(); extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. */ // Initialize some field attributes. $autocomplete = !$autocomplete ? 'autocomplete="off"' : 'autocomplete="' . $autocomplete . '"'; $autocomplete = $autocomplete == 'autocomplete="on"' ? '' : $autocomplete; $attributes = array( $columns ?: '', $rows ?: '', !empty($class) ? 'class="form-control ' . $class . '"' : 'class="form-control"', strlen(Helper::CheckNull($hint)) ? 'placeholder="' . htmlspecialchars(Helper::CheckNull($hint), ENT_COMPAT, 'UTF-8') . '"' : '', $disabled ? 'disabled' : '', $readonly ? 'readonly' : '', $onchange ? 'onchange="' . $onchange . '"' : '', $onclick ? 'onclick="' . $onclick . '"' : '', $required ? 'required aria-required="true"' : '', $autocomplete, $autofocus ? 'autofocus' : '', $spellcheck ? '' : 'spellcheck="false"', $maxlength ? $maxlength: '' ); ?> <textarea name="<?php echo $name; ?>" id="<?php echo $id; ?>" <?php echo implode(' ', $attributes); ?> ><?php echo htmlspecialchars($value ?? "", ENT_COMPAT, 'UTF-8'); ?></textarea> PKBA#]y�rSNsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/checkboxes.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. */ /** * The format of the input tag to be filled in using sprintf. * %1 - id * %2 - name * %3 - value * %4 = any other attributes */ $format = '<input type="checkbox" id="%1$s" name="%2$s" value="%3$s" %4$s>'; // The alt option for Text::alt $alt = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $name); ?> <fieldset id="<?php echo $id; ?>" class="<?php echo trim($class . ' checkboxes'); ?>" <?php echo $required ? 'required aria-required="true"' : ''; ?> <?php echo $autofocus ? 'autofocus' : ''; ?>> <?php foreach ($options as $i => $option) : ?> <?php // Initialize some option attributes. $checked = in_array((string) $option->value, $checkedOptions, true) ? 'checked' : ''; // In case there is no stored value, use the option's default state. $checked = (!$hasValue && $option->checked) ? 'checked' : $checked; $optionClass = !empty($option->class) ? 'class="form-check-input ' . $option->class . '"' : ' class="form-check-input"'; $optionDisabled = !empty($option->disable) || $disabled ? 'disabled' : ''; // Initialize some JavaScript option attributes. $onclick = !empty($option->onclick) ? 'onclick="' . $option->onclick . '"' : ''; $onchange = !empty($option->onchange) ? 'onchange="' . $option->onchange . '"' : ''; $oid = $id . $i; $value = htmlspecialchars($option->value ?? "", ENT_COMPAT, 'UTF-8'); $attributes = array_filter(array($checked, $optionClass, $optionDisabled, $onchange, $onclick)); ?> <div class="form-check form-check-inline"> <label for="<?php echo $oid; ?>" class="form-check-label"> <?php echo sprintf($format, $oid, $name, $value, implode(' ', $attributes)); ?> <?php echo $option->text; ?> </label> </div> <?php endforeach; ?> </fieldset> PKBA#]����Hsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/text.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use HelixUltimate\Framework\Platform\Helper; defined ('JPATH_BASE') or die(); extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. */ $list = ''; if ($options) { $list = 'list="' . $id . '_datalist"'; } $autocomplete = !$autocomplete ? ' autocomplete="off"' : ' autocomplete="' . $autocomplete . '"'; $autocomplete = $autocomplete === ' autocomplete="on"' ? '' : $autocomplete; $attributes = array( !empty($class) ? 'class="form-control ' . $class . '"' : 'class="form-control"', !empty($size) ? 'size="' . $size . '"' : '', !empty($description) ? 'title="' . $description . '"' : '', $disabled ? 'disabled' : '', $readonly ? 'readonly' : '', $list, strlen(Helper::CheckNull($hint)) ? 'placeholder="' . htmlspecialchars(Helper::CheckNull($hint), ENT_COMPAT, 'UTF-8') . '"' : '', $onchange ? ' onchange="' . $onchange . '"' : '', !empty($maxLength) ? $maxLength : '', $required ? 'required aria-required="true"' : '', $autocomplete, $autofocus ? ' autofocus' : '', $spellcheck ? '' : 'spellcheck="false"', !empty($inputmode) ? 'inputmode="' . $inputmode . '"' : '', !empty($pattern) ? 'pattern="' . $pattern . '"' : '', // @TODO add a proper string here!!! !empty($validationtext) ? 'data-validation-text="' . $validationtext . '"' : '', ); if(isset($addonBefore) && $addonBefore) { $addonBeforeHtml = '<span class="input-group-addon">' . $addonBefore . '</span>'; } if(isset($addonBefore) && $addonBefore) { $addonAfterHtml = '<span class="input-group-addon">' . $addonAfter . '</span>'; } ?> <?php if (!empty($addonBefore) || !empty($addonAfter)) : ?> <div class="input-group"> <?php endif; ?> <?php if (!empty($addonBefore)) : ?> <?php echo $addonBeforeHtml; ?> <?php endif; ?> <input type="text" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars(Helper::CheckNull($value), ENT_COMPAT, 'UTF-8'); ?>" <?php echo $dirname; ?> <?php echo implode(' ', $attributes); ?>> <?php if (!empty($addonAfter)) : ?> <?php echo $addonAfterHtml; ?> <?php endif; ?> <?php if (!empty($addonBefore) || !empty($addonAfter)) : ?> </div> <?php endif; ?> <?php if ($options) : ?> <datalist id="<?php echo $id; ?>_datalist"> <?php foreach ($options as $option) : ?> <?php if (!$option->value) : ?> <?php continue; ?> <?php endif; ?> <option value="<?php echo $option->value; ?>"><?php echo $option->text; ?></option> <?php endforeach; ?> </datalist> <?php endif; ?> PKBA#]��K77Hsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/file.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Utility\Utility; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var array $spellcheck Options available for this field. * @var string $accept File types that are accepted. */ $maxSize = HTMLHelper::_('number.bytes', Utility::getMaxUploadSize()); ?> <input type="file" name="<?php echo $name; ?>" id="<?php echo $id; ?>" <?php echo !empty($size) ? ' size="' . $size . '"' : ''; ?> <?php echo !empty($accept) ? ' accept="' . $accept . '"' : ''; ?> <?php echo !empty($class) ? ' class="form-control ' . $class . '"' : ' class="form-control"'; ?> <?php echo !empty($multiple) ? ' multiple' : ''; ?> <?php echo $disabled ? ' disabled' : ''; ?> <?php echo $autofocus ? ' autofocus' : ''; ?> <?php echo !empty($onchange) ? ' onchange="' . $onchange . '"' : ''; ?> <?php echo $required ? ' required aria-required="true"' : ''; ?>><br> <?php echo Text::sprintf('JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT', $maxSize); ?> PKBA#]�Y&E��Gsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/url.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\String\PunycodeHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. */ $autocomplete = !$autocomplete ? ' autocomplete="off"' : ' autocomplete="' . $autocomplete . '"'; $autocomplete = $autocomplete === ' autocomplete="on"' ? '' : $autocomplete; $attributes = array( !empty($size) ? ' size="' . $size . '"' : '', $disabled ? ' disabled' : '', $readonly ? ' readonly' : '', strlen(Helper::CheckNull($hint)) ? ' placeholder="' . htmlspecialchars(Helper::CheckNull($hint), ENT_COMPAT, 'UTF-8') . '"' : '', $autocomplete, $autofocus ? ' autofocus' : '', $spellcheck ? '' : ' spellcheck="false"', $onchange ? ' onchange="' . $onchange . '"' : '', !empty($maxLength) ? $maxLength : '', $required ? ' required aria-required="true"' : '', ); ?> <input <?php echo $inputType; ?> name="<?php echo $name; ?>" <?php echo !empty($class) ? ' class="form-control ' . $class . '"' : 'class="form-control"'; ?> id="<?php echo $id; ?>" value="<?php echo htmlspecialchars(Helper::CheckNull(PunycodeHelper::urlToUTF8($value)), ENT_COMPAT, 'UTF-8'); ?>" <?php echo implode(' ', $attributes); ?>> PKBA#]�<'�zzLsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/calendar.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\Utilities\ArrayHelper; extract($displayData); // Get some system objects. $document = Factory::getDocument(); $lang = Factory::getApplication()->getLanguage(); $inputvalue = ''; // Build the attributes array. $attributes = array(); empty($size) ? null : $attributes['size'] = $size; empty($maxlength) ? null : $attributes['maxlength'] = $maxLength; empty($class) ? $attributes['class'] = 'form-control' : $attributes['class'] = 'form-control ' . $class; !$readonly ? null : $attributes['readonly'] = 'readonly'; !$disabled ? null : $attributes['disabled'] = 'disabled'; empty($onchange) ? null : $attributes['onchange'] = $onchange; if ($required) { $attributes['required'] = ''; $attributes['aria-required'] = 'true'; } // Handle the special case for "now". if (strtoupper($value) == 'NOW') { $value = Factory::getDate()->format('Y-m-d H:i:s'); } $readonly = isset($attributes['readonly']) && $attributes['readonly'] == 'readonly'; $disabled = isset($attributes['disabled']) && $attributes['disabled'] == 'disabled'; if (is_array($attributes)) { $attributes = ArrayHelper::toString($attributes); } $cssFileExt = ($direction === 'rtl') ? '-rtl.css' : '.css'; $localesPath = $localesPath ?? ''; $helperPath = $helperPath ?? ''; // Add language strings $strings = [ // Days 'SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', // Short days 'SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', // Months 'JANUARY', 'FEBRUARY', 'MARCH', 'APRIL', 'MAY', 'JUNE', 'JULY', 'AUGUST', 'SEPTEMBER', 'OCTOBER', 'NOVEMBER', 'DECEMBER', // Short months 'JANUARY_SHORT', 'FEBRUARY_SHORT', 'MARCH_SHORT', 'APRIL_SHORT', 'MAY_SHORT', 'JUNE_SHORT', 'JULY_SHORT', 'AUGUST_SHORT', 'SEPTEMBER_SHORT', 'OCTOBER_SHORT', 'NOVEMBER_SHORT', 'DECEMBER_SHORT', // Buttons 'JCLOSE', 'JCLEAR', 'JLIB_HTML_BEHAVIOR_TODAY', // Miscellaneous 'JLIB_HTML_BEHAVIOR_WK', ]; foreach ($strings as $c) { Text::script($c); } // These are new strings. Make sure they exist. Can be generalised at later time: eg in 4.1 version. if ($lang->hasKey('JLIB_HTML_BEHAVIOR_AM')) { Text::script('JLIB_HTML_BEHAVIOR_AM'); } if ($lang->hasKey('JLIB_HTML_BEHAVIOR_PM')) { Text::script('JLIB_HTML_BEHAVIOR_PM'); } if (JVERSION < 4) { // The static assets for the calendar HTMLHelper::_('script', Helper::CheckNull($localesPath), false, true, false, false, true); HTMLHelper::_('script', Helper::CheckNull($helperPath), false, true, false, false, true); HTMLHelper::_('script', 'system/fields/calendar.min.js', false, true, false, false, true); HTMLHelper::_('stylesheet', 'system/fields/calendar' . Helper::CheckNull($cssFileExt), array(), true); } // Redefine locale/helper assets to use correct path, and load calendar assets if (JVERSION >= 4) { $document->getWebAssetManager() ->registerAndUseScript('field.calendar.locale', $localesPath, [], ['defer' => true]) ->registerAndUseScript('field.calendar.helper', $helperPath, [], ['defer' => true]) ->useStyle('field.calendar' . ($direction === 'rtl' ? '-rtl' : '')) ->useScript('field.calendar'); } ?> <div class="field-calendar"> <?php if (!$readonly && !$disabled) : ?> <div class="input-group"> <?php endif; ?> <input type="text" id="<?php echo $id; ?>" name="<?php echo $name; ?>" value="<?php echo htmlspecialchars(($value !== '0000-00-00 00:00:00') ? $value : '', ENT_COMPAT, 'UTF-8'); ?>" <?php echo $attributes; ?> <?php echo !empty($hint) ? 'placeholder="' . htmlspecialchars($hint ?? "", ENT_COMPAT, 'UTF-8') . '"' : ''; ?> data-alt-value="<?php echo htmlspecialchars($value ?? "", ENT_COMPAT, 'UTF-8'); ?>" autocomplete="off"> <span class="input-group-text"> <button type="button" class="<?php echo ($readonly || $disabled) ? 'hidden ' : ''; ?>btn btn-secondary" id="<?php echo $id; ?>_btn" data-inputfield="<?php echo $id; ?>" data-dayformat="<?php echo $format; ?>" data-date-format="<?php echo $format; ?>" data-button="<?php echo $id; ?>_btn" data-firstday="<?php echo Factory::getLanguage()->getFirstDay(); ?>" data-weekend="<?php echo Factory::getLanguage()->getWeekEnd(); ?>" data-today-btn="<?php echo $todaybutton; ?>" data-week-numbers="<?php echo $weeknumbers; ?>" data-show-time="<?php echo $showtime; ?>" data-show-others="<?php echo $filltable; ?>" data-time-24="<?php echo $timeformat; ?>" data-only-months-nav="<?php echo $singleheader; ?>" <?php echo !empty($minYear) ? 'data-min-year="' . $minYear . '"' : ''; ?> <?php echo !empty($maxYear) ? 'data-max-year="' . $maxYear . '"' : ''; ?> ><span class="fas fa-calendar" aria-hidden="true"></span></button> </span> <?php if (!$readonly && !$disabled) : ?> </div> <?php endif; ?> </div> PKBA#]I&=?��Isystem/helixultimate/overrides_legacy/layouts/joomla/form/field/media.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); if (JVERSION < 4) { require \JPATH_ROOT . '/plugins/system/helixultimate/html/layouts/form/field/media_j3.php'; } else { require \JPATH_ROOT . '/plugins/system/helixultimate/html/layouts/form/field/media.php'; } PKBA#]��3?``Nsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/radiobasic.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $options Options available for this field. */ // Including fallback code for HTML5 non supported browsers. HTMLHelper::_('jquery.framework'); /** * The format of the input tag to be filled in using sprintf. * %1 - id * %2 - name * %3 - value * %4 = any other attributes */ $format = '<input type="radio" id="%1$s" name="%2$s" value="%3$s" %4$s>'; $alt = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $name); ?> <fieldset id="<?php echo $id; ?>" class="<?php echo trim($class . ' radio'); ?>" <?php echo $disabled ? 'disabled' : ''; ?> <?php echo $required ? 'required aria-required="true"' : ''; ?> <?php echo $autofocus ? 'autofocus' : ''; ?>> <?php if (!empty($options)) : ?> <?php foreach ($options as $i => $option) : ?> <?php // Initialize some option attributes. $checked = ((string) $option->value == $value) ? 'checked="checked"' : ''; $optionClass = !empty($option->class) ? 'class="' . $option->class . '"' : ''; $disabled = !empty($option->disable) || ($disabled && !$checked) ? 'disabled' : ''; // Initialize some JavaScript option attributes. $onclick = !empty($option->onclick) ? 'onclick="' . $option->onclick . '"' : ''; $onchange = !empty($option->onchange) ? 'onchange="' . $option->onchange . '"' : ''; $oid = $id . $i; $ovalue = htmlspecialchars(Helper::CheckNull($option->value), ENT_COMPAT, 'UTF-8'); $attributes = array_filter(array($checked, $optionClass, $disabled, $onchange, $onclick)); ?> <?php if ($required) : ?> <?php $attributes[] = 'required aria-required="true"'; ?> <?php endif; ?> <div class="radio m-b-0"> <label for="<?php echo $oid; ?>" <?php echo $optionClass; ?>> <?php echo sprintf($format, $oid, $name, $ovalue, implode(' ', $attributes)); ?> <?php echo Text::alt($option->text, $alt); ?> </label> </div> <?php endforeach; ?> <?php endif; ?> </fieldset> PKBA#]U���� � Jsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/number.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use HelixUltimate\Framework\Platform\Helper; defined ('JPATH_BASE') or die(); extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var array $spellcheck Options available for this field. * @var string $accept File types that are accepted. */ $autocomplete = !$autocomplete ? ' autocomplete="off"' : ' autocomplete="' . $autocomplete . '"'; $autocomplete = $autocomplete == ' autocomplete="on"' ? '' : $autocomplete; $attributes = array( !empty($class) ? 'class="form-control ' . $class . '"' : 'class="form-control"', !empty($size) ? 'size="' . $size . '"' : '', $disabled ? 'disabled' : '', $readonly ? 'readonly' : '', strlen(Helper::CheckNull($hint)) ? 'placeholder="' . htmlspecialchars(Helper::CheckNull($hint), ENT_COMPAT, 'UTF-8') . '"' : '', !empty($onchange) ? 'onchange="' . $onchange . '"' : '', isset($max) ? 'max="' . $max . '"' : '', !empty($step) ? 'step="' . $step . '"' : '', isset($min) ? 'min="' . $min . '"' : '', $required ? 'required aria-required="true"' : '', $autocomplete, $autofocus ? 'autofocus' : '' ); if (is_numeric($value)) { $value = (float) $value; } else { $value = ''; $value = ($required && isset($min)) ? $min : $value; } ?> <input type="number" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars(Helper::CheckNull($value), ENT_COMPAT, 'UTF-8'); ?>" <?php echo implode(' ', $attributes); ?>> PKBA#]ȵq���Osystem/helixultimate/overrides_legacy/layouts/joomla/form/field/moduleorder.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var array $spellcheck Options available for this field. * @var string $accept File types that are accepted. */ $attr = ''; // Initialize some field attributes. $attr .= !empty($class) ? ' class="module-ajax-ordering ' . $class . '"' : 'class="module-ajax-ordering"'; $attr .= $disabled ? ' disabled' : ''; $attr .= !empty($size) ? ' size="' . $size . '"' : ''; // Initialize JavaScript field attributes. $attr .= !empty($onchange) ? ' onchange="' . $onchange . '"' : ''; HTMLHelper::_('script', 'system/fields/moduleorder.js', array('version' => 'auto', 'relative' => true)); ?> <div id="parent_<?php echo $id; ?>" <?php echo $attr; ?> data-url="<?php echo 'index.php?option=com_modules&task=module.orderPosition&' . $token; ?>" data-element="<?php echo 'parent_' . $id; ?>" data-ordering="<?php echo $ordering; ?>" data-position-element="<?php echo $element; ?>" data-client-id="<?php echo $clientId; ?>" data-name="<?php echo $name; ?>" data-attr="<?php echo $attr; ?>"> </div> PKBA#]�M{���Isystem/helixultimate/overrides_legacy/layouts/joomla/form/field/range.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use HelixUltimate\Framework\Platform\Helper; defined ('JPATH_BASE') or die(); extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. */ // Initialize some field attributes. $attributes = array( $class ? 'class="form-control ' . $class . '"' : 'class="form-control"', $disabled ? 'disabled' : '', $readonly ? 'readonly' : '', !empty($onchange) ? 'onchange="' . $onchange . '"' : '', !empty($max) ? 'max="' . $max . '"' : '', !empty($step) ? 'step="' . $step . '"' : '', !empty($min) ? 'min="' . $min . '"' : '', $autofocus ? 'autofocus' : '', ); $value = (float) $value; $value = empty($value) ? $min : $value; ?> <input type="range" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars(Helper::CheckNull($value), ENT_COMPAT, 'UTF-8'); ?>" <?php echo implode(' ', $attributes); ?>> PKBA#]��hQ��Rsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/contenthistory.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * * @var string $link The link for the content history page * @var string $label The label text */ extract($displayData); ?> <div class="modal fade" id="versionsModal" tabindex="-1" > <div class="modal-dialog" role="dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="exampleModalLabel"><?php echo $label; ?></h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"> </button> </div> <div class="modal-body"> <iframe height="100%" width="100%" src="<?php echo $link ?>" frameborder="0"></iframe> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> </div> </div> </div> </div> <div data-bs-target="#versionsModal" class="btn btn-secondary ms-2" data-bs-toggle="modal" title="<?php echo $label; ?>"> <span class="fas fa-code-branch" aria-hidden="true"></span> <?php echo $label; ?> </div> PKBA#]�gz�''Rsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/color/advanced.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellchec Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $checked Is this field checked? * @var array $position Is this field checked? * @var array $control Is this field checked? */ if ($validate !== 'color' && in_array($format, array('rgb', 'rgba'), true)) { $alpha = ($format === 'rgba'); $placeholder = $alpha ? 'rgba(0, 0, 0, 0.5)' : 'rgb(0, 0, 0)'; } else { $placeholder = '#rrggbb'; } $inputclass = ($keywords && ! in_array($format, array('rgb', 'rgba'), true)) ? ' keywords' : ' ' . $format; $class = ' class="form-control ' . trim('minicolors ' . $class) . ($validate === 'color' ? 'form-control ' : $inputclass) . '"'; $control = $control ? ' data-control="' . $control . '"' : ''; $format = $format ? ' data-format="' . $format . '"' : ''; $keywords = $keywords ? ' data-keywords="' . $keywords . '"' : ''; $validate = $validate ? ' data-validate="' . $validate . '"' : ''; $disabled = $disabled ? ' disabled' : ''; $readonly = $readonly ? ' readonly' : ''; $hint = strlen($hint) ? ' placeholder="' . htmlspecialchars($hint ?? "", ENT_COMPAT, 'UTF-8') . '"' : ' placeholder="' . $placeholder . '"'; $autocomplete = ! $autocomplete ? ' autocomplete="off"' : ''; // Force LTR input value in RTL, due to display issues with rgba/hex colors $direction = $lang->isRtl() ? ' dir="ltr" style="text-align:right"' : ''; HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'vendor/minicolors/jquery.minicolors.min.js', array('version' => 'auto', 'relative' => true)); HTMLHelper::_('stylesheet', 'vendor/minicolors/jquery.minicolors.css', array('version' => 'auto', 'relative' => true)); HTMLHelper::_('script', 'system/fields/color-field-adv-init.min.js', array('version' => 'auto', 'relative' => true)); ?> <input type="text" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars($color ?? "", ENT_COMPAT, 'UTF-8'); ?>" <?php echo $hint; ?> <?php echo $class; ?> <?php echo $position; ?> <?php echo $control; ?> <?php echo $readonly; ?> <?php echo $disabled; ?> <?php echo $required; ?> <?php echo $onchange; ?> <?php echo $autocomplete; ?> <?php echo $autofocus; ?> <?php echo $format; ?> <?php echo $keywords; ?> <?php echo $direction; ?> <?php echo $validate; ?>> PKBA#] �2�C C Psystem/helixultimate/overrides_legacy/layouts/joomla/form/field/color/simple.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellchec Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $checked Is this field checked? * @var array $position Is this field checked? * @var array $control Is this field checked? */ $class = ' class="form-select ' . trim('simplecolors chzn-done ' . $class) . '"'; $disabled = $disabled ? ' disabled' : ''; $readonly = $readonly ? ' readonly' : ''; // Include jQuery HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'system/fields/simplecolors.min.js', array('version' => 'auto', 'relative' => true)); HTMLHelper::_('stylesheet', 'system/simplecolors.css', array('version' => 'auto', 'relative' => true)); HTMLHelper::_('script', 'system/fields/color-field-init.min.js', array('version' => 'auto', 'relative' => true)); ?> <select data-chosen="true" name="<?php echo $name; ?>" id="<?php echo $id; ?>"<?php echo $disabled; ?><?php echo $readonly; ?><?php echo $required; ?><?php echo $class; ?><?php echo $position; ?><?php echo $onchange; ?><?php echo $autofocus; ?> style="visibility:hidden;width:22px;height:1px"> <?php foreach ($colors as $i => $c) : ?> <option<?php echo ($c == $color ? ' selected="selected"' : ''); ?>><?php echo $c; ?></option> <?php if (($i + 1) % $split == 0) : ?> <option>-</option> <?php endif; ?> <?php endforeach; ?> </select> PKBA#]�J%�g g Isystem/helixultimate/overrides_legacy/layouts/joomla/form/field/email.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\String\PunycodeHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var array $spellcheck Options available for this field. * @var string $accept File types that are accepted. */ $autocomplete = !$autocomplete ? 'autocomplete="off"' : 'autocomplete="' . $autocomplete . '"'; $autocomplete = $autocomplete == 'autocomplete="on"' ? '' : $autocomplete; $attributes = array( $spellcheck ? '' : 'spellcheck="false"', !empty($size) ? 'size="' . $size . '"' : '', $disabled ? 'disabled' : '', $readonly ? 'readonly' : '', $onchange ? 'onchange="' . $onchange . '"' : '', $autocomplete, $multiple ? 'multiple' : '', !empty($maxLength) ? 'maxlength="' . $maxLength . '"' : '', strlen($hint ?? "") ? 'placeholder="' . htmlspecialchars($hint ?? "", ENT_COMPAT, 'UTF-8') . '"' : '', $required ? 'required aria-required="true"' : '', $autofocus ? 'autofocus' : '', ); ?> <input type="email" name="<?php echo $name; ?>" <?php echo !empty($class) ? ' class="form-control validate-email ' . $class . '"' : ' class="form-control validate-email"'; ?> id="<?php echo $id; ?>" value="<?php echo htmlspecialchars(Helper::CheckNull(PunycodeHelper::emailToUTF8($value)), ENT_COMPAT, 'UTF-8'); ?>" <?php echo implode(' ', $attributes); ?>> PKBA#]�?gIsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/radio.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $options Options available for this field. */ // Including fallback code for HTML5 non supported browsers. HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'system/html5fallback.js', array('version' => 'auto', 'relative' => true)); /** * The format of the input tag to be filled in using sprintf. * %1 - id * %2 - name * %3 - value * %4 = any other attributes */ $format = '<input type="radio" id="%1$s" name="%2$s" value="%3$s" %4$s />'; $alt = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $name); ?> <div id="<?php echo $id; ?>" class="<?php echo trim($class . ' radio'); ?>" <?php echo $disabled ? 'disabled' : ''; ?> <?php echo $required ? 'required aria-required="true"' : ''; ?> <?php echo $autofocus ? 'autofocus' : ''; ?>> <?php if (!empty($options)) : ?> <?php foreach ($options as $i => $option) : ?> <?php // Initialize some option attributes. $checked = ((string) $option->value === $value) ? 'checked="checked"' : ''; $optionClass = !empty($option->class) ? 'class="form-check-input ' . $option->class . '"' : 'class="form-check-input"'; $labelClass = !empty($option->class) ? 'class="form-check-label ' . $option->class . '"' : 'class="form-check-label btn"'; $disabled = !empty($option->disable) || ($disabled && !$checked) ? 'disabled' : ''; // Initialize some JavaScript option attributes. $onclick = !empty($option->onclick) ? 'onclick="' . $option->onclick . '"' : ''; $onchange = !empty($option->onchange) ? 'onchange="' . $option->onchange . '"' : ''; $oid = $id . $i; $ovalue = htmlspecialchars($option->value ?? "", ENT_COMPAT, 'UTF-8'); $attributes = array_filter(array($checked, $optionClass, $disabled, $onchange, $onclick)); ?> <?php if ($required) : ?> <?php $attributes[] = 'required aria-required="true"'; ?> <?php endif; ?> <div class="form-check form-check-inline"> <label for="<?php echo $oid; ?>" <?php echo $labelClass; ?>> <?php echo sprintf($format, $oid, $name, $ovalue, implode(' ', $attributes)); ?> <?php echo $option->text; ?> </label> </div> <?php endforeach; ?> <?php endif; ?> </div> PKBA#]?Wu���Isystem/helixultimate/overrides_legacy/layouts/joomla/form/field/meter.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. * @var string $animated Is it animated. * @var string $active Is it active. * @var string $max The maximum value. */ // Initialize some field attributes. $class = 'progress-bar ' . $class; $class .= $animated ? ' progress-bar-striped progress-bar-animated' : ''; $class .= $active ? ' active' : ''; $class = 'class="' . $class . '"'; $value = (float) $value; $value = $value < $min ? $min : $value; $value = $value > $max ? $max : $value; $data = ''; $data .= 'aria-valuemax="' . $max . '"'; $data .= ' aria-valuemin="' . $min . '"'; $data .= ' aria-valuenow="' . $value . '"'; $attributes = array( $class, !empty($width) ? ' style="width:' . $width . ';"' : '', $data ); $value = ((float) ($value - $min) * 100) / ($max - $min); ?> <div class="progress"> <div role="progressbar" <?php echo implode(' ', $attributes); ?> style="width:<?php echo (string) $value; ?>%;<?php echo !empty($color) ? ' background-color:' . $color . ';' : ''; ?>"></div> </div> PKBA#]�\R�: : Jsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/hidden.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use HelixUltimate\Framework\Platform\Helper; defined ('JPATH_BASE') or die(); extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. */ // Initialize some field attributes. $class = !empty($class) ? ' class="' . $class . '"' : ''; $disabled = $disabled ? ' disabled' : ''; $onchange = $onchange ? ' onchange="' . $onchange . '"' : ''; ?> <input type="hidden" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars(Helper::CheckNull($value), ENT_COMPAT, 'UTF-8'); ?>" <?php echo $class, $disabled, $onchange; ?>> PKBA#]���Hsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/user.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; use Joomla\Utilities\ArrayHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var string $userName The user name * @var mixed $groups The filtering groups (null means no filtering) * @var mixed $excluded The users to exclude from the list of users * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. */ if (JVERSION >= 4) { $modalHTML = ''; $uri = new Uri('index.php?option=com_users&view=users&layout=modal&tmpl=component&required=0'); $uri->setVar('field', $this->escape($id)); if ($required) { $uri->setVar('required', 1); } if (!empty($groups)) { $uri->setVar('groups', base64_encode(json_encode($groups))); } if (!empty($excluded)) { $uri->setVar('excluded', base64_encode(json_encode($excluded))); } // Invalidate the input value if no user selected if ($this->escape($userName) === Text::_('JLIB_FORM_SELECT_USER')) { $userName = ''; } $inputAttributes = array( 'type' => 'text', 'id' => $id, 'class' => 'form-control field-user-input-name', 'value' => $this->escape($userName) ); if ($class) { $inputAttributes['class'] .= ' ' . $class; } if ($size) { $inputAttributes['size'] = (int) $size; } if ($required) { $inputAttributes['required'] = 'required'; } if (!$readonly) { $inputAttributes['placeholder'] = Text::_('JLIB_FORM_SELECT_USER'); } if (!$readonly) { $modalHTML = HTMLHelper::_( 'bootstrap.renderModal', 'userModal_' . $id, array( 'url' => $uri, 'title' => Text::_('JLIB_FORM_CHANGE_USER'), 'closeButton' => true, 'height' => '100%', 'width' => '100%', 'modalWidth' => 80, 'bodyHeight' => 60, 'footer' => '<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">' . Text::_('JCANCEL') . '</button>', ) ); Factory::getDocument()->getWebAssetManager() ->useScript('webcomponent.field-user'); } ?> <?php // Create a dummy text field with the user name. ?> <joomla-field-user class="field-user-wrapper" url="<?php echo (string) $uri; ?>" modal=".modal" modal-width="100%" modal-height="400px" input=".field-user-input" input-name=".field-user-input-name" button-select=".button-select"> <div class="input-group"> <input <?php echo ArrayHelper::toString($inputAttributes), $dataAttribute; ?> readonly> <?php if (!$readonly) : ?> <button type="button" class="btn btn-primary button-select" title="<?php echo Text::_('JLIB_FORM_CHANGE_USER'); ?>"> <span class="icon-user icon-white" aria-hidden="true"></span> <span class="visually-hidden"><?php echo Text::_('JLIB_FORM_CHANGE_USER'); ?></span> </button> <?php endif; ?> </div> <?php // Create the real field, hidden, that stored the user id. ?> <?php if (!$readonly) : ?> <input type="hidden" id="<?php echo $id; ?>_id" name="<?php echo $name; ?>" value="<?php echo $this->escape($value); ?>" class="field-user-input <?php echo $class ? (string) $class : ''?>" data-onchange="<?php echo $this->escape($onchange); ?>"> <?php echo $modalHTML; ?> <?php endif; ?> </joomla-field-user> <?php } else { if (!$readonly) { HTMLHelper::_('behavior.modal', 'a.modal_' . $id); HTMLHelper::_('script', 'jui/fielduser.min.js', array('version' => 'auto', 'relative' => true)); } $uri = new Uri('index.php?option=com_users&view=users&layout=modal&tmpl=component&required=0'); $uri->setVar('field', $this->escape($id)); if ($required) { $uri->setVar('required', 1); } if (!empty($groups)) { $uri->setVar('groups', base64_encode(json_encode($groups))); } if (!empty($excluded)) { $uri->setVar('excluded', base64_encode(json_encode($excluded))); } // Invalidate the input value if no user selected if ($this->escape($userName) === Text::_('JLIB_FORM_SELECT_USER')) { $userName = ''; } $inputAttributes = array( 'type' => 'text', 'id' => $id, 'value' => $this->escape($userName) ); if ($size) { $inputAttributes['size'] = (int) $size; } if ($required) { $inputAttributes['required'] = 'required'; } if (!$readonly) { $inputAttributes['placeholder'] = Text::_('JLIB_FORM_SELECT_USER'); } $anchorAttributes = array( 'class' => 'btn btn-primary modal_' . $id, 'title' => Text::_('JLIB_FORM_CHANGE_USER'), 'rel' => '{handler: \'iframe\', size: {x: 800, y: 500}}' ); ?> <div class="input-group"> <input class="form-control field-user-input-name" <?php echo ArrayHelper::toString($inputAttributes); ?> readonly /> <?php if (!$readonly) : ?> <?php echo HTMLHelper::_('link', (string) $uri, '<span class="fa fa-user"></span>', $anchorAttributes); ?> <?php endif; ?> </div> <?php if (!$readonly) : ?> <input type="hidden" id="<?php echo $id; ?>_id" name="<?php echo $name; ?>" value="<?php echo (int) $value; ?>" data-onchange="<?php echo $this->escape($onchange); ?>" /> <?php endif; }PKBA#]L;��� � Lsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/password.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; extract($displayData); if ($meter) { HTMLHelper::_('behavior.formvalidator'); HTMLHelper::_('script', 'system/fields/passwordstrength.min.js', array('version' => 'auto', 'relative' => true)); $class = 'js-password-strength ' . $class; if ($forcePassword) { $class = $class . ' meteredPassword'; } } HTMLHelper::_('script', 'system/fields/passwordview.min.js', array('version' => 'auto', 'relative' => true)); Text::script('JFIELD_PASSWORD_INDICATE_INCOMPLETE'); Text::script('JFIELD_PASSWORD_INDICATE_COMPLETE'); Text::script('JSHOW'); Text::script('JHIDE'); $attributes = array( strlen(Helper::CheckNull($hint)) ? 'placeholder="' . htmlspecialchars(Helper::CheckNull($hint), ENT_COMPAT, 'UTF-8') . '"' : '', !empty($autocomplete) ? 'autocomplete="off"' : '', !empty($class) ? 'class="form-control ' . $class . '"' : 'class="form-control"', $readonly ? 'readonly' : '', $disabled ? 'disabled' : '', !empty($size) ? 'size="' . $size . '"' : '', !empty($maxLength) ? 'maxlength="' . $maxLength . '"' : '', $required ? 'required aria-required="true"' : '', $autofocus ? 'autofocus' : '', !empty($minLength) ? 'data-min-length="' . $minLength . '"' : '', !empty($minIntegers) ? 'data-min-integers="' . $minIntegers . '"' : '', !empty($minSymbols) ? 'data-min-symbols="' . $minSymbols . '"' : '', !empty($minUppercase) ? 'data-min-uppercase="' . $minUppercase . '"' : '', !empty($minLowercase) ? 'data-min-lowercase="' . $minLowercase . '"' : '', !empty($forcePassword) ? 'data-min-force="' . $forcePassword . '"' : '', ); if (isset($rules) && $rules) { $requirements = []; if ($minLength) { $requirements[] = Text::sprintf('JFIELD_PASSWORD_RULES_CHARACTERS', $minLength); } if ($minIntegers) { $requirements[] = Text::sprintf('JFIELD_PASSWORD_RULES_DIGITS', $minIntegers); } if ($minSymbols) { $requirements[] = Text::sprintf('JFIELD_PASSWORD_RULES_SYMBOLS', $minSymbols); } if ($minUppercase) { $requirements[] = Text::sprintf('JFIELD_PASSWORD_RULES_UPPERCASE', $minUppercase); } if ($minLowercase) { $requirements[] = Text::sprintf('JFIELD_PASSWORD_RULES_LOWERCASE', $minLowercase); } } ?> <div class="password-group"> <div class="input-group"> <span class="input-group-text"> <span class="fas fa-key" aria-hidden="true"></span> <span class="visually-hidden"><?php echo Text::_('JSHOW'); ?></span> </span> <input type="password" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars(Helper::CheckNull($value), ENT_COMPAT, 'UTF-8'); ?>" <?php echo implode(' ', $attributes); ?>> <?php if (JVERSION >= 4) :?> <button type="button" class="btn btn-secondary input-password-toggle"> <span class="icon-eye icon-fw" aria-hidden="true"></span> <span class="visually-hidden"><?php echo Text::_('JSHOWPASSWORD'); ?></span> </button> <?php endif; ?> </div> </div> <?php if (isset($rules) && $rules) : ?> <div id="<?php echo $name . '-rules'; ?>" class="small text-muted"> <?php echo Text::sprintf('JFIELD_PASSWORD_RULES_MINIMUM_REQUIREMENTS', implode(', ', $requirements)); ?> </div> <?php endif; ?>PKBA#]��� � Gsystem/helixultimate/overrides_legacy/layouts/joomla/form/field/tel.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\HTML\HTMLHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. * @var integer $maxLength The maximum length that the field shall accept. */ // Including fallback code for HTML5 non supported browsers. HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'system/html5fallback.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9')); $autocomplete = !$autocomplete ? ' autocomplete="off"' : ' autocomplete="' . $autocomplete . '"'; $autocomplete = $autocomplete == ' autocomplete="on"' ? '' : $autocomplete; $attributes = array( !empty($size) ? 'size="' . $size . '"' : '', $disabled ? 'disabled' : '', $readonly ? 'readonly' : '', strlen(Helper::CheckNull($hint)) ? 'placeholder="' . htmlspecialchars(Helper::CheckNull($hint), ENT_COMPAT, 'UTF-8') . '"' : '', $autocomplete, $autofocus ? ' autofocus' : '', $spellcheck ? '' : 'spellcheck="false"', $onchange ? ' onchange="' . $onchange . '"' : '', !empty($maxLength) ? $maxLength : '', $required ? 'required aria-required="true"' : '', ); ?> <input type="tel" name="<?php echo $name; ?>" <?php echo !empty($class) ? ' class="form-control ' . $class . '"' : 'class="form-control"'; ?> id="<?php echo $id; ?>" value="<?php echo htmlspecialchars(Helper::CheckNull($value), ENT_COMPAT, 'UTF-8'); ?>" <?php echo implode(' ', $attributes); ?>> PKBA#]�2�Isystem/helixultimate/overrides_legacy/layouts/joomla/form/renderfield.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; extract($displayData); if (!empty($options['showonEnabled'])) { if (JVERSION < 4) { HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'jui/cms.js', array('version' => 'auto', 'relative' => true)); } else { /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('showon'); } } $name = $name ?? ''; $class = empty($options['class']) ? '' : ' ' . $options['class']; $rel = empty($options['rel']) ? '' : ' ' . $options['rel']; $id = $name . '-desc'; $hideLabel = !empty($options['hiddenLabel']); $hideDescription = empty($options['hiddenDescription']) ? false : $options['hiddenDescription']; if (!empty($parentclass)) { $class .= ' ' . $parentclass; } ?> <div class="control-group<?php echo $class; ?>"<?php echo $rel; ?>> <?php if ($hideLabel) : ?> <div class="visually-hidden"><?php echo $label; ?></div> <?php else : ?> <?php echo $label; ?> <?php endif; ?> <?php echo $input; ?> <?php if (!$hideDescription && !empty($description)) : ?> <div id="<?php echo $id; ?>"> <small class="form-text"> <?php echo $description; ?> </small> </div> <?php endif; ?> </div> PKBA#]�u��aaMsystem/helixultimate/overrides_legacy/layouts/joomla/tinymce/togglebutton.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Language\Text; if (JVERSION >= 4) { ?> <div class="toggle-editor btn-toolbar float-end clearfix mt-3"> <div class="btn-group"> <button type="button" disabled class="btn btn-secondary js-tiny-toggler-button"> <span class="icon-eye" aria-hidden="true"></span> <?php echo Text::_('PLG_TINY_BUTTON_TOGGLE_EDITOR'); ?> </button> </div> </div> <?php } else { $name = $displayData; ?> <div class="toggle-editor btn-toolbar pull-right clearfix"> <div class="btn-group"> <a class="btn btn-secondary" href="#" onclick="tinyMCE.execCommand('mceToggleEditor', false, '<?php echo $name; ?>');return false;" title="<?php echo Text::_('PLG_TINY_BUTTON_TOGGLE_EDITOR'); ?>" > <span class="icon-eye" aria-hidden="true"></span> <?php echo Text::_('PLG_TINY_BUTTON_TOGGLE_EDITOR'); ?> </a> </div> </div> <?php } ?> PKBA#]�;�ooIsystem/helixultimate/overrides_legacy/layouts/joomla/tinymce/textarea.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; $data = $displayData; if (JVERSION < 4) { $doc = Factory::getDocument(); $doc->addStylesheet(Uri::root(true) . '/plugins/system/helixultimate/assets/css/icomoon.css'); } else { $wa = Factory::getDocument()->getWebAssetManager(); if (!$wa->assetExists('script', 'tinymce')) { $wa->registerScript('tinymce', 'media/vendor/tinymce/tinymce.min.js', [], ['defer' => true]); } if (!$wa->assetExists('script', 'plg_editors_tinymce')) { $wa->registerScript('plg_editors_tinymce', 'plg_editors_tinymce/tinymce.min.js', [], ['defer' => true], ['core', 'tinymce']); } $wa->useScript('tinymce')->useScript('plg_editors_tinymce'); } ?> <textarea name="<?php echo $data->name; ?>" id="<?php echo $data->id; ?>" cols="<?php echo $data->cols; ?>" rows="<?php echo $data->rows; ?>" style="width: <?php echo $data->width; ?>; height: <?php echo $data->height; ?>;" class="<?php echo empty($data->class) ? 'mce_editable form-control' : 'form-control ' . $data->class; ?>" <?php echo $data->readonly ? ' readonly disabled' : ''; ?> > <?php echo $data->content; ?> </textarea> PKBA#]�_�CmmOsystem/helixultimate/overrides_legacy/layouts/joomla/tinymce/buttons/button.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Layout\LayoutHelper; echo LayoutHelper::render('joomla.editors.buttons.button', $displayData); PKBA#]D����Psystem/helixultimate/overrides_legacy/layouts/joomla/content/options_default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Form\FormHelper; ?> <fieldset class="<?php echo !empty($displayData->formclass) ? $displayData->formclass : ''; ?>"> <legend><?php echo $displayData->name; ?></legend> <?php if (!empty($displayData->description)) : ?> <p><?php echo $displayData->description; ?></p> <?php endif; ?> <?php $fieldsnames = explode(',', $displayData->fieldsname); ?> <?php foreach ($fieldsnames as $fieldname) : ?> <?php foreach ($displayData->form->getFieldset($fieldname) as $field) : ?> <?php $datashowon = ''; ?> <?php $groupClass = $field->type === 'Spacer' ? ' field-spacer' : ''; ?> <?php if ($field->showon) : ?> <?php HTMLHelper::_('jquery.framework'); ?> <?php HTMLHelper::_('script', 'system/cms.min.js', array('version' => 'auto', 'relative' => true)); ?> <?php $datashowon = ' data-showon=\'' . json_encode(FormHelper::parseShowOnConditions($field->showon, $field->formControl, $field->group)) . '\''; ?> <?php endif; ?> <div class="control-group<?php echo $groupClass; ?>"<?php echo $datashowon; ?>> <?php if (!isset($displayData->showlabel) || $displayData->showlabel) : ?> <div class="control-label"><?php echo $field->label; ?></div> <?php endif; ?> <div class="controls"><?php echo $field->input; ?></div> </div> <?php endforeach; ?> <?php endforeach; ?> </fieldset> PKBA#]1a��Psystem/helixultimate/overrides_legacy/layouts/joomla/content/related_article.phpnu�[���<?php use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $item = $displayData; $item->enableOpenGraph = false; $params = $item->params; $info = $params->get('info_block_position', 0); $attribs = json_decode($item->attribs ?? ""); HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers/html'); $article_format = (isset($attribs->helix_ultimate_article_format) && $attribs->helix_ultimate_article_format) ? $attribs->helix_ultimate_article_format : 'standard'; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <div class="article"> <?php if($article_format === 'gallery') : ?> <?php echo LayoutHelper::render('joomla.content.blog.gallery', array('attribs' => $attribs, 'id' => $item->id)); ?> <?php elseif($article_format === 'video') : ?> <?php echo LayoutHelper::render('joomla.content.blog.video', array('attribs' => $attribs)); ?> <?php elseif($article_format === 'audio') : ?> <?php echo LayoutHelper::render('joomla.content.blog.audio', array('attribs' => $attribs)); ?> <?php else: ?> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language) : ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)); ?>"> <?php echo LayoutHelper::render('joomla.content.full_image', $item); ?> </a> <?php endif; ?> <?php echo LayoutHelper::render('joomla.content.blog_style_default_item_title', $item); ?> <div class="article-info"> <?php if ($params->get('show_author') && !empty($item->author )) : ?> <?php echo LayoutHelper::render('joomla.content.info_block.author', array('item' => $item, 'params' => $params,'articleView'=>'intro')); ?> <?php endif; ?> <?php if ($params->get('show_publish_date')) : ?> <?php echo LayoutHelper::render('joomla.content.info_block.publish_date', array('item' => $item, 'params' => $params,'articleView'=>'intro')); ?> <?php endif; ?> </div> </div>PKBA#]�q�;GGQsystem/helixultimate/overrides_legacy/layouts/joomla/content/category_default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; /** * Note that this layout opens a div with the page class suffix. If you do not use the category children * layout you need to close this div either by overriding this file or in your main layout. */ $params = $displayData->params; $category = $displayData->get('category'); $extension = $category->extension; $canEdit = $params->get('access-edit'); $className = substr($extension, 4); $app = Factory::getApplication(); $category->text = $category->description; $app->triggerEvent('onContentPrepare', array($extension . '.categories', &$category, &$params, 0)); $category->description = $category->text; $results = $app->triggerEvent('onContentAfterTitle', array($extension . '.categories', &$category, &$params, 0)); $afterDisplayTitle = trim(implode("\n", $results)); $results = $app->triggerEvent('onContentBeforeDisplay', array($extension . '.categories', &$category, &$params, 0)); $beforeDisplayContent = trim(implode("\n", $results)); $results = $app->triggerEvent('onContentAfterDisplay', array($extension . '.categories', &$category, &$params, 0)); $afterDisplayContent = trim(implode("\n", $results)); /** * This will work for the core components but not necessarily for other components * that may have different pluralisation rules. */ if (substr($className, -1) === 's') { $className = rtrim($className, 's'); } $tagsData = $category->tags->itemTags; ?> <div> <div class="<?php echo $className .'-category' . $displayData->pageclass_sfx; ?>"> <?php if ($params->get('show_page_heading')) : ?> <h1> <?php echo $displayData->escape($params->get('page_heading')); ?> </h1> <?php endif; ?> <?php if ($params->get('show_category_title', 1)) : ?> <h2> <?php echo HTMLHelper::_('content.prepare', $category->title, '', $extension . '.category.title'); ?> </h2> <?php endif; ?> <?php echo $afterDisplayTitle; ?> <?php if ($params->get('show_cat_tags', 1)) : ?> <?php echo LayoutHelper::render('joomla.content.tags', $tagsData); ?> <?php endif; ?> <?php if ($beforeDisplayContent || $afterDisplayContent || $params->get('show_description', 1) || $params->def('show_description_image', 1)) : ?> <div class="category-desc"> <?php if ($params->get('show_description_image') && $category->getParams()->get('image')) : ?> <img src="<?php echo $category->getParams()->get('image'); ?>" alt="<?php echo htmlspecialchars($category->getParams()->get('image_alt') ?? "", ENT_COMPAT, 'UTF-8'); ?>"> <?php endif; ?> <?php echo $beforeDisplayContent; ?> <?php if ($params->get('show_description') && $category->description) : ?> <?php echo HTMLHelper::_('content.prepare', $category->description, '', $extension . '.category.description'); ?> <?php endif; ?> <?php echo $afterDisplayContent; ?> </div> <?php endif; ?> <?php echo $displayData->loadTemplate($displayData->subtemplatename); ?> <?php if ($displayData->maxLevel != 0 && $displayData->get('children')) : ?> <div class="cat-children"> <?php if ($params->get('show_category_heading_title_text', 1) == 1) : ?> <h3> <?php echo Text::_('JGLOBAL_SUBCATEGORIES'); ?> </h3> <?php endif; ?> <?php echo $displayData->loadTemplate('children'); ?> </div> <?php endif; ?> </div> </div> PKBA#]���Msystem/helixultimate/overrides_legacy/layouts/joomla/content/social_share.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license https://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); $url = Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($displayData->id . ':' . $displayData->alias, $displayData->catid, $displayData->language) : ContentHelperRoute::getArticleRoute($displayData->id . ':' . $displayData->alias, $displayData->catid, $displayData->language)); $root = Uri::base(); $root = new Uri($root); $url = $root->getScheme() . '://' . $root->getHost() . $url; $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $params = $template->params; $tmpl_params = $template->params; $socialShares = $tmpl_params->get("social_share_lists"); if( is_array($socialShares) && $params->get('social_share') ) : ?> <div class="article-social-share"> <div class="social-share-icon"> <ul> <?php foreach( $socialShares as $socialSite ): ?> <?php if( $socialSite == 'facebook'): ?> <li> <a class="facebook" onClick="window.open('https://www.facebook.com/sharer.php?u=<?php echo $url; ?>','Facebook','width=600,height=300,left='+(screen.availWidth/2-300)+',top='+(screen.availHeight/2-150)+''); return false;" href="https://www.facebook.com/sharer.php?u=<?php echo $url; ?>" title="<?php echo Text::_('HELIX_ULTIMATE_SHARE_FACEBOOK'); ?>"> <span class="fab fa-facebook" aria-hidden="true"></span> </a> </li> <?php endif; ?> <?php if( $socialSite == 'twitter'): ?> <li> <a class="twitter" title="<?php echo Text::_('HELIX_ULTIMATE_SHARE_TWITTER'); ?>" onClick="window.open('https://twitter.com/share?url=<?php echo $url; ?>&text=<?php echo str_replace(" ", "%20", $displayData->title); ?>','Twitter share','width=600,height=300,left='+(screen.availWidth/2-300)+',top='+(screen.availHeight/2-150)+''); return false;" href="https://twitter.com/share?url=<?php echo $url; ?>&text=<?php echo str_replace(" ", "%20", $displayData->title); ?>"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" style="width: 13.56px;position: relative;top: -1.5px;"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/></svg> </a> </li> <?php endif; ?> <?php if( $socialSite == 'linkedin'): ?> <li> <a class="linkedin" title="<?php echo Text::_('HELIX_ULTIMATE_SHARE_LINKEDIN'); ?>" onClick="window.open('https://www.linkedin.com/shareArticle?mini=true&url=<?php echo $url; ?>','Linkedin','width=585,height=666,left='+(screen.availWidth/2-292)+',top='+(screen.availHeight/2-333)+''); return false;" href="https://www.linkedin.com/shareArticle?mini=true&url=<?php echo $url; ?>" > <span class="fab fa-linkedin" aria-hidden="true"></span> </a> </li> <?php endif; ?> <?php endforeach; ?> </ul> </div> </div> <?php endif; ?> PKBA#]>N���Ksystem/helixultimate/overrides_legacy/layouts/joomla/content/open_graph.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Uri\Uri; extract($displayData); $doc = Factory::getDocument(); $config = Factory::getConfig(); $sitename = $config->get('sitename'); // Facebook $doc->addCustomTag('<meta property="og:type" content="article" />'); $doc->addCustomTag('<meta property="og:url" content="'. Uri::current() . '" />'); $doc->addCustomTag('<meta property="og:title" content="'. htmlspecialchars($title ?? "") .'" />'); $doc->addCustomTag('<meta property="og:description" content="'. HTMLHelper::_('string.truncate', (strip_tags($content)), 150) .'" />'); if(isset($image) && $image) { $doc->addCustomTag('<meta property="og:image" content="'. Uri::root().ltrim($image, '/') .'" />'); } if(isset($fb_app_id) && $fb_app_id) { $doc->addCustomTag('<meta property="fb:app_id" content="'. (int) $fb_app_id . '" />'); } $doc->addCustomTag('<meta property="og:site_name" content="'. htmlspecialchars($sitename ?? "") .'" />'); // Twitter $doc->addCustomTag('<meta name="twitter:description" content="'. HTMLHelper::_('string.truncate', (strip_tags($content)), 150) .'" />'); if(isset($image) && $image) { $doc->addCustomTag('<meta name="twitter:image:src" content="'. Uri::root().ltrim($image, '/') .'" />'); } if(isset($twitter_site) && $twitter_site) { $doc->addCustomTag('<meta name="twitter:site" content="@'. htmlspecialchars($twitter_site ?? "") .'" />'); } $doc->addCustomTag('<meta name="twitter:card" content="summary_large_image" />');PKBA#]cQ 9��Qsystem/helixultimate/overrides_legacy/layouts/joomla/content/intro_info_block.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); $blockPosition = $displayData['params']->get('info_block_position', 0); ?> <dl class="article-info text-muted"> <?php if ($displayData['position'] === 'above' && ($blockPosition == 0 || $blockPosition == 2) || $displayData['position'] === 'below' && ($blockPosition == 1) ) : ?> <?php if ($displayData['params']->get('show_author') && !empty($displayData['item']->author )) : ?> <?php echo $this->sublayout('author', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_parent_category') && !empty($displayData['item']->parent_slug)) : ?> <?php echo $this->sublayout('parent_category', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_category')) : ?> <?php echo $this->sublayout('category', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_associations')) : ?> <?php echo $this->sublayout('associations', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_publish_date')) : ?> <?php echo $this->sublayout('publish_date', $displayData); ?> <?php endif; ?> <?php endif; ?> <?php if ($displayData['position'] === 'above' && ($blockPosition == 0) || $displayData['position'] === 'below' && ($blockPosition == 1 || $blockPosition == 2) ) : ?> <?php if ($displayData['params']->get('show_create_date')) : ?> <?php echo $this->sublayout('create_date', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_modify_date')) : ?> <?php echo $this->sublayout('modify_date', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_hits')) : ?> <?php echo $this->sublayout('hits', $displayData); ?> <?php endif; ?> <?php endif; ?> </dl> PKBA#]��FZKKGsystem/helixultimate/overrides_legacy/layouts/joomla/content/rating.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; $rating = (int) $displayData['item']->rating; $rating_count = $displayData['item']->rating_count; if($rating_count == '') { $rating_count = 0; } ?> <div class="article-ratings" data-id="<?php echo (int) $displayData['item']->id; ?>"> <span class="ratings-label"><?php echo Text::_('HELIX_ULTIMATE_ARTICLE_RATINGS'); ?></span> <div class="rating-symbol"> <?php $j = 0; for($i = $rating; $i < 5; $i++) { echo '<span class="rating-star" data-number="' . (5 - $j) . '"></span>'; $j++; } for ($i = 0; $i < $rating; $i++) { echo '<span class="rating-star active" data-number="'.($rating - $i).'"></span>'; } ?> </div> <span class="fas fa-circle-notch fa-spin" aria-hidden="true" style="display: none;"></span> <span class="ratings-count">(<?php echo $rating_count; ?>)</span> </div> PKBA#]�L �44Wsystem/helixultimate/overrides_legacy/layouts/joomla/content/info_block/create_date.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $articleView = $displayData['articleView']; ?> <span class="create" title="<?php echo Text::sprintf('COM_CONTENT_CREATED_DATE_ON', HTMLHelper::_('date', $displayData['item']->created, Text::_('DATE_FORMAT_LC3'))); ?>"> <time datetime="<?php echo HTMLHelper::_('date', $displayData['item']->created, 'c'); ?>"<?php echo ($articleView == 'details') ? ' itemprop="dateCreated"' : ''; ?>> <?php echo HTMLHelper::_('date', $displayData['item']->created, Text::_('DATE_FORMAT_LC3')); ?> </time> </span> PKBA#]|�z�ooWsystem/helixultimate/overrides_legacy/layouts/joomla/content/info_block/modify_date.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; ?> <span class="modified"> <time datetime="<?php echo HTMLHelper::_('date', $displayData['item']->modified, 'c'); ?>" itemprop="dateModified"> <?php echo Text::sprintf('COM_CONTENT_LAST_UPDATED', HTMLHelper::_('date', $displayData['item']->modified, Text::_('DATE_FORMAT_LC3'))); ?> </time> </span> PKBA#]��||[system/helixultimate/overrides_legacy/layouts/joomla/content/info_block/parent_category.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <span class="parent-category-name"> <?php $title = $this->escape($displayData['item']->parent_title); ?> <?php if ($displayData['params']->get('link_parent_category') && !empty($displayData['item']->parent_slug)) : ?> <?php $url = '<a href="' . Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getCategoryRoute($displayData['item']->parent_slug) : ContentHelperRoute::getCategoryRoute($displayData['item']->parent_slug)) . '" itemprop="genre">' . $title . '</a>'; ?> <?php echo Text::sprintf('COM_CONTENT_PARENT', $url); ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_PARENT', '<span itemprop="genre">' . $title . '</span>'); ?> <?php endif; ?> </span> PKBA#]jf99Rsystem/helixultimate/overrides_legacy/layouts/joomla/content/info_block/author.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; $articleView = $displayData['articleView']; $author = ($displayData['item']->created_by_alias ?: $displayData['item']->author); ?> <span class="createdby"<?php echo ($articleView != 'intro') ? ' itemprop="author" itemscope itemtype="https://schema.org/Person"' : ''; ?> title="<?php echo Text::sprintf('COM_CONTENT_WRITTEN_BY', $author); ?>"> <?php $author = '<span itemprop="name">' . $author . '</span>'; ?> <?php if (!empty($displayData['item']->contact_link ) && $displayData['params']->get('link_author') == true) : ?> <a href="<?php echo Route::_($displayData['item']->contact_link); ?>"<?php echo ($articleView != 'intro') ? ' itemprop="url"' : ''; ?>> <?php echo $author; ?> </a> <?php else : ?> <?php echo $author; ?> <?php endif; ?> </span> PKBA#]��ID33Xsystem/helixultimate/overrides_legacy/layouts/joomla/content/info_block/associations.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; ?> <?php if (!empty($displayData['item']->associations)) : ?> <?php $associations = $displayData['item']->associations; ?> <span class="association"> <?php echo Text::_('JASSOCIATIONS'); ?> <?php foreach ($associations as $association) : ?> <?php if ($displayData['item']->params->get('flags', 1) && $association['language']->image) : ?> <?php $flag = HTMLHelper::_('image', 'mod_languages/' . $association['language']->image . '.gif', $association['language']->title_native, array('title' => $association['language']->title_native), true); ?> <a href="<?php echo Route::_($association['item']); ?>"><?php echo $flag; ?></a> <?php else : ?> <?php $class = 'badge bg-secondary label-' . $association['language']->sef; ?> <a class="' . <?php echo $class; ?> . '" href="<?php echo Route::_($association['item']); ?>"><?php echo strtoupper($association['language']->sef); ?></a> <?php endif; ?> <?php endforeach; ?> </span> <?php endif; ?> PKBA#])/m���Xsystem/helixultimate/overrides_legacy/layouts/joomla/content/info_block/reading_time.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use HelixUltimate\Framework\Platform\Helper; defined ('JPATH_BASE') or die(); $fullText = $displayData->fulltext; $readTime = Helper::getReadTime($fullText); ?> <span class="read-time" title="read time"><?php echo $readTime; ?></span> PKBA#]Ur����Tsystem/helixultimate/overrides_legacy/layouts/joomla/content/info_block/category.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $title = $this->escape($displayData['item']->category_title); if (!isset($displayData['item']->catslug)) { $displayData['item']->catslug = $displayData['item']->catid . ':' . $displayData['item']->category_alias; } $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <span class="category-name" title="<?php echo Text::sprintf('COM_CONTENT_CATEGORY', $title); ?>"> <?php if ($displayData['params']->get('link_category') && $displayData['item']->catslug) : ?> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getCategoryRoute($displayData['item']->catslug) : ContentHelperRoute::getCategoryRoute($displayData['item']->catslug)); ?>"><?php echo $title; ?></a> <?php else : ?> <?php echo $title; ?> <?php endif; ?> </span> PKBA#]�S�5DDXsystem/helixultimate/overrides_legacy/layouts/joomla/content/info_block/publish_date.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $articleView = $displayData['articleView']; ?> <span class="published" title="<?php echo Text::sprintf('COM_CONTENT_PUBLISHED_DATE_ON', HTMLHelper::_('date', $displayData['item']->publish_up, Text::_('DATE_FORMAT_LC3'))); ?>"> <time datetime="<?php echo HTMLHelper::_('date', $displayData['item']->publish_up, 'c'); ?>"<?php echo ($articleView == 'details') ? ' itemprop="datePublished"' : ''; ?>> <?php echo HTMLHelper::_('date', $displayData['item']->publish_up, Text::_('DATE_FORMAT_LC3')); ?> </time> </span> PKBA#]�#$��Psystem/helixultimate/overrides_legacy/layouts/joomla/content/info_block/hits.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; ?> <span class="hits"> <meta itemprop="interactionCount" content="UserPageVisits:<?php echo $displayData['item']->hits; ?>"> <?php echo Text::sprintf('COM_CONTENT_ARTICLE_HITS', $displayData['item']->hits); ?> </span> PKBA#]���MMPsystem/helixultimate/overrides_legacy/layouts/joomla/content/icons/edit_lock.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $tooltip = $displayData['tooltip']; $legacy = $displayData['legacy']; ?> <?php if ($legacy) : ?> <span class="hasTooltip" title="<?php echo HTMLHelper::tooltipText($tooltip . '', 0); ?>"> <?php echo HTMLHelper::_('image', 'system/checked_out.png', null, null, true); ?> </span> <?php echo Text::_('JLIB_HTML_CHECKED_OUT'); ?> <?php else : ?> <span class="hasTooltip fas fa-lock" title="<?php echo HTMLHelper::tooltipText($tooltip . '', 0); ?>"></span> <?php echo Text::_('JLIB_HTML_CHECKED_OUT'); ?> <?php endif; ?> PKBA#]4���Rsystem/helixultimate/overrides_legacy/layouts/joomla/content/icons/print_popup.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; ?> <span class="btn btn-outline-secondary btn-sm"> <span class="fas fa-print" aria-hidden="true"></span> <?php echo Text::_('JGLOBAL_PRINT'); ?> </span> PKBA#]Ɩ����Msystem/helixultimate/overrides_legacy/layouts/joomla/content/icons/create.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $params = $displayData['params']; $legacy = $displayData['legacy']; ?> <?php if ($params->get('show_icons')) : ?> <?php if ($legacy) : ?> <?php echo HTMLHelper::_('image', 'system/new.png', Text::_('JNEW'), null, true); ?> <?php else : ?> <span class="fas fa-plus" aria-hidden="true"></span> <?php echo Text::_('JNEW'); ?> <?php endif; ?> <?php else : ?> <?php echo Text::_('JNEW') . ' '; ?> <?php endif; ?> PKBA#]tz�v��Lsystem/helixultimate/overrides_legacy/layouts/joomla/content/icons/email.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; ?> <span class="btn btn-outline-secondary btn-sm"> <span class="fas fa-envelope" aria-hidden="true"></span> <?php echo Text::_('JGLOBAL_EMAIL'); ?> </span>PKBA#]4���Ssystem/helixultimate/overrides_legacy/layouts/joomla/content/icons/print_screen.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; ?> <span class="btn btn-outline-secondary btn-sm"> <span class="fas fa-print" aria-hidden="true"></span> <?php echo Text::_('JGLOBAL_PRINT'); ?> </span> PKBA#]TOIi��Ksystem/helixultimate/overrides_legacy/layouts/joomla/content/icons/edit.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $article = $displayData['article']; $tooltip = JVERSION < 4 ? $displayData['overlib'] : $displayData['tooltip']; $icon = $article->state ? 'edit' : 'eye-slash'; $currentDate = Factory::getDate()->format('Y-m-d H:i:s'); $isUnpublished = JVERSION < 4 ? strtotime($article->publish_up) > strtotime(Factory::getDate()) || ((strtotime($article->publish_down) < strtotime(Factory::getDate())) && $article->publish_down != Factory::getDbo()->getNullDate()) : ($article->publish_up > $currentDate) || !is_null($article->publish_down) && ($article->publish_down < $currentDate); if ($isUnpublished) { $icon = 'eye-slash'; } ?> <SPAN class="link-edit-article"> <span class="hasTooltip fas fa-<?php echo $icon; ?>" title="<?php echo HTMLHelper::tooltipText(Text::_('COM_CONTENT_EDIT_ITEM'), $tooltip, 0, 0); ?>"></span> <?php echo Text::_('JGLOBAL_EDIT'); ?> </SPAN> PKBA#]�̥�Msystem/helixultimate/overrides_legacy/layouts/joomla/content/text_filters.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use HelixUltimate\Framework\Platform\Settings; defined ('JPATH_BASE') or die(); ?> <fieldset class="<?php echo !empty($displayData->formclass) ? $displayData->formclass : 'form-horizontal'; ?>"> <legend><?php echo $displayData->name; ?></legend> <?php if (!empty($displayData->description)) : ?> <p><?php echo $displayData->description; ?></p> <?php endif; ?> <?php $fieldsnames = explode(',', $displayData->fieldsname); ?> <?php foreach ($fieldsnames as $fieldname) : ?> <?php foreach ($displayData->form->getFieldset($fieldname) as $field) : ?> <?php $showon = $field->getAttribute('showon'); $attribs = ''; if ($showon) { $attribs .= ' data-showon=\'' . json_encode(Settings::parseShowOnConditions($showon, $field->formControl)) . '\''; } // Enable disable on $enableOn = $field->getAttribute('enableon', ''); if ($enableOn) { $attribs .= ' data-enableon="' . $enableOn . '"'; } ?> <div <?php echo $attribs; ?>><?php echo $field->input; ?></div> <?php endforeach; ?> <?php endforeach; ?> </fieldset> PKBA#]�]7R� � ^system/helixultimate/overrides_legacy/layouts/joomla/content/blog_style_default_item_title.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Language\Text; use Joomla\CMS\Version; // Create a shortcut for params. $params = $displayData->params; $canEdit = $displayData->params->get('access-edit'); $currentDate = Factory::getDate()->format('Y-m-d H:i:s'); HTMLHelper::addIncludePath(JPATH_COMPONENT.'/helpers/html'); $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <?php if ($displayData->state == 0 || $params->get('show_title') || ($params->get('show_author') && !empty($displayData->author ))) : ?> <div class="article-header"> <?php if ($params->get('show_title')) : ?> <h2> <?php if ($params->get('link_titles') && ($params->get('access-view') || $params->get('show_noauth', '0') == '1')) : ?> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($displayData->slug, $displayData->catid, $displayData->language) : ContentHelperRoute::getArticleRoute($displayData->slug, $displayData->catid, $displayData->language)); ?>"> <?php echo $this->escape($displayData->title); ?> </a> <?php else : ?> <?php echo $this->escape($displayData->title); ?> <?php endif; ?> </h2> <?php endif; ?> <?php if ($displayData->state == 0) : ?> <span class="badge bg-warning"><?php echo Text::_('JUNPUBLISHED'); ?></span> <?php endif; ?> <?php if (strtotime($displayData->publish_up) > strtotime(Factory::getDate())) : ?> <span class="badge bg-warning"><?php echo Text::_('JNOTPUBLISHEDYET'); ?></span> <?php endif; ?> <?php if (JVERSION < 4): ?> <?php if ($displayData->publish_down != Factory::getDbo()->getNullDate() && (strtotime($displayData->publish_down) < strtotime(Factory::getDate()))) : ?> <span class="badge bg-warning"><?php echo Text::_('JEXPIRED'); ?></span> <?php endif; ?> <?php else : ?> <?php if ($displayData->publish_down !== null && $displayData->publish_down < $currentDate) : ?> <span class="badge bg-warning"><?php echo Text::_('JEXPIRED'); ?></span> <?php endif; ?> <?php endif ?> </div> <?php endif; ?> PKBA#]}y����Qsystem/helixultimate/overrides_legacy/layouts/joomla/content/related_articles.phpnu�[��� <?php defined ('JPATH_BASE') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\Layout\LayoutHelper; $articles = $displayData['articles']; $mainItem = $displayData['item']; $template = Helper::loadTemplateData(); $tmpl_params = $template->params; ?> <div class="related-article-list-container"> <h3 class="related-article-title"> <?php echo $tmpl_params->get('related_article_title'); ?> </h3> <?php if( $tmpl_params->get('related_article_view_type') === 'thumb' ): ?> <div class="article-list related-article-list"> <div class="row"> <?php foreach( $articles as $item ): ?> <?php if (strtotime($item->publish_up) > strtotime(Factory::getDate())) { continue; } ?> <div class="col-lg-<?php echo round(12 / Helper::SetColumn($tmpl_params->get('related_article_column'))); ?>"> <?php echo LayoutHelper::render('joomla.content.related_article', $item); ?> </div> <?php endforeach; ?> </div> </div> <?php endif; ?> <?php if( $tmpl_params->get('related_article_view_type') === 'list' ): ?> <ul class="article-list related-article-list"> <?php foreach( $articles as $item ): ?> <li class="related-article-list-item"> <?php echo LayoutHelper::render('joomla.content.blog_style_default_item_title', $item); ?> <?php echo LayoutHelper::render('joomla.content.info_block.publish_date', array('item' => $item, 'params' => $item->params,'articleView'=>'intro')); ?> </li> <?php endforeach; ?> </ul> <?php endif; ?> <?php if( $tmpl_params->get('related_article_view_type') === 'large' ): ?> <div class="article-list related-article-list"> <?php foreach( $articles as $item ): ?> <div class="row"> <div class="col-12"> <?php echo LayoutHelper::render('joomla.content.related_article_large', $item); ?> </div> </div> <?php endforeach; ?> </div> <?php endif; ?> </div>PKBA#]���pZ Z Vsystem/helixultimate/overrides_legacy/layouts/joomla/content/related_article_large.phpnu�[���<?php use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $item = $displayData; $params = $item->params; $info = $params->get('info_block_position', 0); $attribs = json_decode($item->attribs ?? ""); HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers/html'); $article_format = (isset($attribs->helix_ultimate_article_format) && $attribs->helix_ultimate_article_format) ? $attribs->helix_ultimate_article_format : 'standard'; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <div class="article related-article-large d-flex"> <div class="article-image"> <?php if($article_format === 'gallery') : ?> <?php echo LayoutHelper::render('joomla.content.blog.gallery', array('attribs' => $attribs, 'id' => $item->id)); ?> <?php elseif($article_format === 'video') : ?> <?php echo LayoutHelper::render('joomla.content.blog.video', array('attribs' => $attribs)); ?> <?php elseif($article_format === 'audio') : ?> <?php echo LayoutHelper::render('joomla.content.blog.audio', array('attribs' => $attribs)); ?> <?php else: ?> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language) : ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)); ?>"> <?php echo LayoutHelper::render('joomla.content.full_image', $item); ?> </a> <?php endif; ?> </div> <div class="article-information"> <?php echo LayoutHelper::render('joomla.content.blog_style_default_item_title', $item); ?> <?php if ($params->get('show_author') && !empty($item->author )) : ?> <?php echo LayoutHelper::render('joomla.content.info_block.author', array('item' => $item, 'params' => $params,'articleView'=>'intro')); ?> <?php endif; ?> <?php if ($params->get('show_publish_date')) : ?> <?php echo LayoutHelper::render('joomla.content.info_block.publish_date', array('item' => $item, 'params' => $params,'articleView'=>'intro')); ?> <?php endif; ?> <?php if ($item->introtext): ?> <div class="intro-text"> <?php echo $item->introtext; ?> </div> <?php endif ?> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language) : ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)); ?>" class="btn btn-outline-secondary btn-sm"><?php echo Text::_('HELIX_ULTIMATE_READ_MORE') ?></a> </div> </div>PKBA#]ʽ���Isystem/helixultimate/overrides_legacy/layouts/joomla/content/readmore.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $params = $displayData['params']; $item = $displayData['item']; $direction = Factory::getLanguage()->isRtl() ? 'left' : 'right'; ?> <div class="readmore"> <?php if (!$params->get('access-view')) : ?> <a href="<?php echo $displayData['link']; ?>" itemprop="url" aria-label="<?php echo Text::_('COM_CONTENT_REGISTER_TO_READ_MORE'); ?> <?php echo htmlspecialchars($item->title ?? "", ENT_QUOTES, 'UTF-8'); ?>"> <?php echo Text::_('COM_CONTENT_REGISTER_TO_READ_MORE'); ?> </a> <?php elseif ($readmore = $item->alternative_readmore) : ?> <a href="<?php echo $displayData['link']; ?>" itemprop="url" aria-label="<?php echo htmlspecialchars($item->title ?? "", ENT_QUOTES, 'UTF-8'); ?>"> <?php echo $readmore; ?> <?php if ($params->get('show_readmore_title', 0) != 0) : ?> <?php echo HTMLHelper::_('string.truncate', $item->title, $params->get('readmore_limit')); ?> <?php endif; ?> </a> <?php elseif ($params->get('show_readmore_title', 0) == 0) : ?> <a href="<?php echo $displayData['link']; ?>" itemprop="url" aria-label="<?php echo Text::_('COM_CONTENT_READ_MORE'); ?> <?php echo htmlspecialchars($item->title ?? "", ENT_QUOTES, 'UTF-8'); ?>"> <?php echo JVERSION < 4 ? Text::sprintf('COM_CONTENT_READ_MORE_TITLE') : Text::_('JGLOBAL_READ_MORE'); ?> </a> <?php else : ?> <a href="<?php echo $displayData['link']; ?>" itemprop="url" aria-label="<?php echo Text::_('COM_CONTENT_READ_MORE'); ?> <?php echo htmlspecialchars($item->title ?? "", ENT_QUOTES, 'UTF-8'); ?>"> <?php echo Text::sprintf('JGLOBAL_READ_MORE_TITLE', HTMLHelper::_('string.truncate', $item->title, $params->get('readmore_limit'))); ?> </a> <?php endif; ?> </div> PKBA#]S��� � Ksystem/helixultimate/overrides_legacy/layouts/joomla/content/info_block.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Layout\LayoutHelper; $intro = (isset($displayData['intro']) && $displayData['intro']) ? $displayData['intro'] : false; $displayData['articleView'] = ($intro) ? 'intro' : 'details'; $blockPosition = $displayData['params']->get('info_block_position', 0); $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $blogReadTime = $template->params->get('blog_read_time'); ?> <div class="article-info"> <?php if ($displayData['position'] === 'above' && ($blockPosition == 0 || $blockPosition == 2) || $displayData['position'] === 'below' && ($blockPosition == 1) ) : ?> <?php if ($displayData['params']->get('show_author') && !empty($displayData['item']->author )) : ?> <?php echo $this->sublayout('author', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_parent_category') && !empty($displayData['item']->parent_slug) && $intro == false) : ?> <?php echo $this->sublayout('parent_category', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_category')) : ?> <?php echo $this->sublayout('category', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_associations') && $intro == false) : ?> <?php echo $this->sublayout('associations', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_publish_date')) : ?> <?php echo $this->sublayout('publish_date', $displayData); ?> <?php endif; ?> <?php if ($intro) : ?> <?php echo LayoutHelper::render('joomla.content.blog.comments.count', $displayData); ?> <?php endif; ?> <?php endif; ?> <?php if ($displayData['position'] === 'above' && ($blockPosition == 0) || $displayData['position'] === 'below' && ($blockPosition == 1 || $blockPosition == 2) ) : ?> <?php if ($displayData['params']->get('show_create_date') && $intro == false) : ?> <?php echo $this->sublayout('create_date', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_modify_date') && $intro == false) : ?> <?php echo $this->sublayout('modify_date', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_hits') && $intro == false) : ?> <?php echo $this->sublayout('hits', $displayData); ?> <?php endif; ?> <?php if ($blogReadTime) :?> <?php echo $this->sublayout('reading_time', $displayData['item']); ?> <?php endif; ?> <?php endif; ?> </div> PKBA#]����Ksystem/helixultimate/overrides_legacy/layouts/joomla/content/full_image.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Filesystem\File; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Uri\Uri; $params = $displayData->params; $attribs = json_decode($displayData->attribs ?? ""); $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $tplParams = $template->params; $og = isset($displayData->enableOpenGraph) ? $displayData->enableOpenGraph : $tplParams->get('og', 0); $blog_image = $tplParams->get('blog_details_image', 'large'); $full_image = ''; if (isset($attribs->helix_ultimate_image) && $attribs->helix_ultimate_image != '') { if ($blog_image == 'default') { $full_image = $attribs->helix_ultimate_image; } else { $full_image = $attribs->helix_ultimate_image; $basename = basename($full_image); $details_image = JPATH_ROOT . '/' . dirname($full_image) . '/' . File::stripExt($basename) . '_' . $blog_image . '.' . Helper::getExt($basename); if (\file_exists($details_image)) { $full_image = Uri::root(true) . '/' . dirname($full_image) . '/' . File::stripExt($basename) . '_' . $blog_image . '.' . Helper::getExt($basename); } } } ?> <?php if ($full_image): ?> <div class="article-full-image"> <?php if (JVERSION >= 4) { $layoutAttr = [ 'src' => $full_image, 'itemprop' => 'image', 'alt' => htmlspecialchars(! empty($attribs->helix_ultimate_image_alt_txt) ? $attribs->helix_ultimate_image_alt_txt : $displayData->title, ENT_COMPAT, 'UTF-8'), ]; echo LayoutHelper::render('joomla.html.image', $layoutAttr); } else { ?> <img src="<?php echo $full_image; ?>" alt="<?php echo htmlspecialchars(! empty($attribs->helix_ultimate_image_alt_txt) ? $attribs->helix_ultimate_image_alt_txt : $displayData->title, ENT_COMPAT, 'UTF-8'); ?>" itemprop="image"> <?php } ?> </div> <?php else: ?> <?php $images = json_decode($displayData->images ?? ""); ?> <?php if (isset($images->image_fulltext) && ! empty($images->image_fulltext)): ?> <?php $imgfloat = empty($images->float_fulltext) ? $params->get('float_fulltext') : $images->float_fulltext; ?> <div class="article-full-image float-<?php echo htmlspecialchars($imgfloat); ?>"> <?php if (JVERSION >= 4) { $layoutAttr = [ 'src' => htmlspecialchars($images->image_fulltext ?? ""), 'itemprop' => 'image', 'alt' => empty($images->image_fulltext_alt) && empty($images->image_fulltext_alt_empty) ? $displayData->title : $images->image_fulltext_alt, ]; if (isset($images->image_fulltext_caption) && $images->image_fulltext_caption !== '') { $layoutAttr['class'] = 'caption'; $layoutAttr['title'] = htmlspecialchars($images->image_fulltext_caption ?? ""); } echo LayoutHelper::render('joomla.html.image', $layoutAttr); // Image Caption if (isset($images->image_fulltext_caption) && $images->image_fulltext_caption !== '') {?> <figcaption class="caption"><?php echo $this->escape($images->image_fulltext_caption); ?></figcaption> <?php } } else { ?> <img <?php if ($images->image_fulltext_caption): echo 'class="caption"' . ' title="' . htmlspecialchars($images->image_fulltext_caption ?? "") . '"'; endif; ?> src="<?php echo htmlspecialchars($images->image_fulltext ?? ""); ?>" alt="<?php echo empty($images->image_fulltext_alt) && empty($images->image_fulltext_alt_empty) ? $displayData->title : $images->image_fulltext_alt; ?>" itemprop="image"> <?php // Image Caption if (isset($images->image_fulltext_caption) && $images->image_fulltext_caption !== '') {?> <figcaption class="caption"><?php echo $this->escape($images->image_fulltext_caption); ?></figcaption> <?php } } ?> </div> <?php endif; ?> <?php endif; ?> <?php if ($og): ?> <?php if (empty($full_image)) { $full_image = $images->image_fulltext ?? $images->image_intro; } ?> <?php echo LayoutHelper::render('joomla.content.open_graph', ['image' => $full_image, 'title' => $displayData->title, 'fb_app_id' => $tplParams->get('og_fb_id'), 'twitter_site' => $tplParams->get('og_twitter_site'), 'content' => $displayData->introtext]); ?> <?php endif; ?> PKBA#]�g\�__Ysystem/helixultimate/overrides_legacy/layouts/joomla/content/blog_style_default_links.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <ol class="nav nav-tabs nav-stacked"> <?php foreach ($displayData->get('link_items') as $item) : ?> <li> <?php echo HTMLHelper::_('link', Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language) : ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)), $item->title); ?> </li> <?php endforeach; ?> </ol> PKBA#]�,S��Qsystem/helixultimate/overrides_legacy/layouts/joomla/content/blog/author_info.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\User\UserHelper; $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $params = $template->params; ?> <?php if($params->get('author_info', 0)) : ?> <div class="article-author-information"> <?php $author = Factory::getUser( (int) $displayData->created_by ); $profile = UserHelper::getProfile( (int) $displayData->created_by ); ?> <div class="d-flex"> <div class="flex-shrink-0"> <img class="me-3" src="https://www.gravatar.com/avatar/<?php echo md5($author->get('email')); ?>?s=64&d=identicon&r=PG" alt="<?php echo $author->name; ?>"> </div> <div class="flex-grow-1 ms-3"> <h5 class="mt-0"><?php echo $author->name; ?></h5> <?php if(isset($profile->profile['aboutme']) && $profile->profile['aboutme']) : ?> <div class="author-bio"> <?php echo $profile->profile['aboutme']; ?> <?php if(isset($profile->profile['website']) && $profile->profile['website']) : ?> <div class="author-website mt-2"> <strong><?php echo Text::_('HELIX_ULTIMATE_BLOG_AUTHOR_WEBSITE'); ?>:</strong> <a target="_blank" rel="noopener noreferrer" href="<?php echo strip_tags($profile->profile['website'], ''); ?>"><?php echo strip_tags($profile->profile['website'], ''); ?></a> </div> <?php endif; ?> </div> <?php endif; ?> </div> </div> </div> <?php endif; ?> PKBA#]�1ټ�Ksystem/helixultimate/overrides_legacy/layouts/joomla/content/blog/video.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die(); use HelixUltimate\Framework\Platform\Helper; extract($displayData); if (isset($attribs->helix_ultimate_video) && $attribs->helix_ultimate_video) { $video_url = trim($attribs->helix_ultimate_video); $video_src = ''; $embed_code = ''; $video = parse_url($video_url); $host = isset($video['host']) ? strtolower($video['host']) : ''; $ext = strtolower(pathinfo($video_url, PATHINFO_EXTENSION)); switch ($host) { case 'youtu.be': $video_id = trim($video['path'], '/'); $video_src = '//www.youtube.com/embed/' . $video_id; break; case 'www.youtube.com': case 'youtube.com': case 'www.youtube-nocookie.com': case 'youtube-nocookie.com': if (strpos($video['path'], '/embed/') === 0) { // Already an embed URL $video_src = '//www.youtube.com' . $video['path']; if (!empty($video['query'])) { $video_src .= '?' . $video['query']; } } else { // Handle standard YouTube watch URL parse_str($video['query'], $query); if (isset($query['v'])) { $video_id = $query['v']; $video_src = '//www.youtube.com/embed/' . $video_id; } } break; case 'vimeo.com': case 'www.vimeo.com': case 'player.vimeo.com': $path = trim($video['path'], '/'); if (strpos($path, 'video/') === 0) { $path = substr($path, 6); } $video_id = explode('?', $path)[0]; $video_src = '//player.vimeo.com/video/' . $video_id; break; case 'dailymotion.com': case 'www.dailymotion.com': $path = trim($video['path'], '/'); if (strpos($path, 'video/') === 0) { $path = substr($path, 6); } $video_id = explode('_', $path)[0]; $video_src = '//www.dailymotion.com/embed/video/' . $video_id; break; case 'dai.ly': $path = trim($video['path'], '/'); if ($path) { $video_id = $path; $video_src = '//www.dailymotion.com/embed/video/' . $video_id; } break; default: if ($ext === 'mp4') { $embed_code = ' <video controls width="100%"> <source src="' . htmlspecialchars($video_url, ENT_QUOTES) . '" type="video/mp4"> Your browser does not support the video tag. </video>'; } else { $embed_code = Helper::sanitizeEmbed( '<iframe src="' . htmlspecialchars($video_url, ENT_QUOTES) . '" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen style="width:100%; height:400px;"></iframe>' ); } break; } // If we have a video source, create the embed code if (!$embed_code && $video_src) { $embed_code = '<iframe src="' . $video_src . '" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen style="width:100%; height:400px;"></iframe>'; } // Final Output if ($embed_code) { echo '<div class="article-featured-video">'; echo $embed_code; echo '</div>'; } } PKBA#]�<aaMsystem/helixultimate/overrides_legacy/layouts/joomla/content/blog/gallery.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); extract($displayData); ?> <?php if(isset($attribs->helix_ultimate_gallery) && $attribs->helix_ultimate_gallery) : ?> <?php $gallery = json_decode($attribs->helix_ultimate_gallery ?? ""); ?> <?php $images = (isset($gallery->helix_ultimate_gallery_images) && $gallery->helix_ultimate_gallery_images) ? $gallery->helix_ultimate_gallery_images : array(); ?> <?php if(count((array)$images)) : ?> <div class="article-feature-gallery"> <div id="article-feature-gallery-<?php echo $id; ?>" class="carousel slide" data-bs-ride="carousel"> <div class="carousel-inner" role="listbox"> <?php foreach ( $images as $key => $image ) : ?> <div class="carousel-item<?php echo ($key===0) ? ' active': ''; ?>"> <img src="<?php echo htmlspecialchars((string) $image, ENT_QUOTES, 'UTF-8'); ?>"<?php echo !empty($attribs->helix_ultimate_image_alt_txt) ? ' alt="' . htmlspecialchars((string) $attribs->helix_ultimate_image_alt_txt, ENT_QUOTES, 'UTF-8') . '"' : ''; ?>> </div> <?php endforeach; ?> </div> <button class="carousel-control-prev" data-bs-target="#article-feature-gallery-<?php echo $id; ?>" type="button" data-bs-slide="prev"> <span class="carousel-control-prev-icon" aria-hidden="true"></span> <span class="visually-hidden">Previous</span> </button> <button class="carousel-control-next" data-bs-target="#article-feature-gallery-<?php echo $id; ?>" type="button" data-bs-slide="next"> <span class="carousel-control-next-icon" aria-hidden="true"></span> <span class="visually-hidden">Next</span> </button> </div> </div> <?php endif; ?> <?php endif; ?> PKBA#]/j &&bsystem/helixultimate/overrides_legacy/layouts/joomla/content/blog/comments/count/intensedebate.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); ?> <?php if( $displayData['params']->get('comment_intensedebate_acc') != '' ) : ?> <span class="comments-anchor"> <script type="text/javascript"> var idcomments_acct = '<?php echo $displayData["params"]->get("comment_intensedebate_acc"); ?>'; var idcomments_post_id = '<?php echo md5( $displayData["url"] )?>'; var idcomments_post_url = encodeURIComponent("<?php echo $displayData['url'];?>"); </script> <script type="text/javascript" src="https://www.intensedebate.com/js/genericLinkWrapperV2.js"></script> </span> <?php endif; ?> PKBA#]��/��[system/helixultimate/overrides_legacy/layouts/joomla/content/blog/comments/count/disqus.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; if( $displayData['params']->get('comment_disqus_subdomain') != '' ) { $doc = Factory::getDocument(); if(!defined('HELIX_ULTIMATE_COMMENTS_DISQUS_COUNT')) { ob_start(); $devmode = $displayData['params']->get('comment_disqus_devmode'); if ($devmode) { echo 'var disqus_developer = 1;'; } ?> var disqus_shortname = '<?php echo $displayData['params']->get("comment_disqus_subdomain"); ?>'; (function() { var d = document, s = d.createElement('script'); s.src = 'https://' + disqus_shortname + '.disqus.com/count.js'; s.setAttribute('data-timestamp', +new Date()); (d.head || d.body).appendChild(s); })(); <?php $output = ob_get_clean(); $doc->addScriptdeclaration( $output ); define('HELIX_ULTIMATE_COMMENTS_DISQUS_COUNT', 1); } ?> <a href="<?php echo $displayData['url']; ?>#article-comments"> <span class="disqus-comment-count" data-disqus-url="<?php echo $displayData['url']; ?>"></span> </a> <?php } PKBA#]=�I���]system/helixultimate/overrides_legacy/layouts/joomla/content/blog/comments/count/facebook.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; if( $displayData['params']->get('comment_facebook_app_id') != '' ) { $doc = Factory::getDocument(); if(!defined('HELIX_ULTIMATE_COMMENTS_FACEBOOK_COUNT')) { $doc->addScript( 'https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.11&appId=' . $displayData['params']->get('comment_facebook_app_id') . '&autoLogAppEvents=1' ); define('HELIX_ULTIMATE_COMMENTS_FACEBOOK_COUNT', 1); } ?> <a href="<?php echo $displayData['url']; ?>#comments"> <?php echo Text::_('HELIX_ULTIMATE_COMMENTS'); ?> (<span class="fb-comments-count" data-href="<?php echo $displayData['url']; ?>"></span>) </a> <?php }PKBA#]@�-p��`system/helixultimate/overrides_legacy/layouts/joomla/content/blog/comments/comments/facebook.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); $width = ($displayData['params']->get('comment_facebook_width') == 100 ) ? '100%' : (int) $displayData['params']->get('comment_facebook_width'); ?> <?php if( $displayData['params']->get('comment_facebook_app_id') != '' ) : ?> <div id="fb-root"></div> <script>(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = 'https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.11&appId=<?php echo $displayData['params']->get('comment_facebook_app_id'); ?>&autoLogAppEvents=1'; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));</script> <div class="fb-comments" data-href="<?php echo $displayData['url']; ?>" data-numposts="<?php echo (int) $displayData['params']->get('comment_facebook_number'); ?>" data-width="<?php echo $width; ?>" data-colorscheme="light"></div> <?php endif; ?>PKBA#]w�����^system/helixultimate/overrides_legacy/layouts/joomla/content/blog/comments/comments/disqus.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); if( $displayData['params']->get('comment_disqus_subdomain') != '' ) { ?> <div id="disqus_thread"></div> <script> <?php $devmode = $displayData['params']->get('comment_disqus_devmode'); if ($devmode) { echo 'var disqus_developer = 1;'; } ?> var disqus_shortname = '<?php echo htmlspecialchars($displayData["params"]->get("comment_disqus_subdomain") ?? ""); ?>'; var disqus_config = function () { this.page.url = "<?php echo $displayData['url']; ?>"; }; (function() { var d = document, s = d.createElement('script'); s.src = 'https://' + disqus_shortname + '.disqus.com/embed.js'; s.setAttribute('data-timestamp', +new Date()); (d.head || d.body).appendChild(s); })(); </script> <noscript> Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow"> comments powered by Disqus. </a> </noscript> <?php } PKBA#]>ʿ�esystem/helixultimate/overrides_legacy/layouts/joomla/content/blog/comments/comments/intensedebate.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); ?> <?php if( $displayData['params']->get('comment_intensedebate_acc') != '' ) : ?> <script> var idcomments_acct = '<?php echo $displayData["params"]->get("comment_intensedebate_acc"); ?>'; var idcomments_post_id = '<?php echo md5( $displayData["url"] ); ?>'; var idcomments_post_url = '<?php echo $displayData["url"]; ?>'; </script> <span id="IDCommentsPostTitle" style="display:none"></span> <script type='text/javascript' src='https://www.intensedebate.com/js/genericCommentWrapperV2.js'></script> <?php endif; ?>PKBA#]i�����Wsystem/helixultimate/overrides_legacy/layouts/joomla/content/blog/comments/comments.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $params = $template->params; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); if( $params->get('comment') != 'disabled' ) { $comment_categories = $params->get('comment_categories'); if(is_array($comment_categories) && count($comment_categories)) { if(in_array($displayData->catid, $comment_categories)) { $url = Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($displayData->id . ':' . $displayData->alias, $displayData->catid, $displayData->language) : ContentHelperRoute::getArticleRoute($displayData->id . ':' . $displayData->alias, $displayData->catid, $displayData->language)); $root = Uri::base(); $root = new Uri($root); $url = $root->getScheme() . '://' . $root->getHost() . $url; echo '<div id="article-comments">'; echo LayoutHelper::render( 'joomla.content.blog.comments.comments.' . $params->get('comment'), array( 'item'=>$displayData, 'params'=>$params, 'url'=>$url ) ); echo '</div>'; } } } PKBA#]8�V HHTsystem/helixultimate/overrides_legacy/layouts/joomla/content/blog/comments/count.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $params = $template->params; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); if( ( $params->get('comment') != 'disabled' ) && ( $params->get('comments_count') ) ) { $comment_categories = $params->get('comment_categories'); if(is_array($comment_categories) && count($comment_categories)) { if(in_array($displayData['item']->catid, $comment_categories)) { $url = Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($displayData['item']->id . ':' . $displayData['item']->alias, $displayData['item']->catid, $displayData['item']->language) : ContentHelperRoute::getArticleRoute($displayData['item']->id . ':' . $displayData['item']->alias, $displayData['item']->catid, $displayData['item']->language)); $root = Uri::base(); $root = new Uri($root); $url = $root->getScheme() . '://' . $root->getHost() . $url; ?> <span class="comments-count"> <?php echo LayoutHelper::render('joomla.content.blog.comments.count.' . $params->get('comment'), array( 'item' => $displayData, 'params' => $params, 'url' => $url)); ?> </span> <?php } } } PKBA#]�`iQQKsystem/helixultimate/overrides_legacy/layouts/joomla/content/blog/audio.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use HelixUltimate\Framework\Platform\Helper; extract($displayData); ?> <?php if(isset($attribs->helix_ultimate_audio) && $attribs->helix_ultimate_audio) : ?> <div class="article-featured-audio"> <div class="ratio ratio-16x9"> <?php echo Helper::sanitizeEmbed($attribs->helix_ultimate_audio); ?> </div> </div> <?php endif; ?> PKBA#]l��Esystem/helixultimate/overrides_legacy/layouts/joomla/content/tags.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Router\Route; use Joomla\Registry\Registry; if (JVERSION < 4) { JLoader::register('TagsHelperRoute', JPATH_BASE . '/components/com_tags/helpers/route.php'); } $authorised = Factory::getUser()->getAuthorisedViewLevels(); ?> <?php if (!empty($displayData)) : ?> <ul class="tags mb-4"> <?php foreach ($displayData as $i => $tag) : ?> <?php if (in_array($tag->access, $authorised)) : ?> <?php $tagParams = new Registry($tag->params); ?> <?php $link_class = $tagParams->get('tag_link_class', ''); ?> <li class="tag-<?php echo $tag->tag_id; ?> tag-list<?php echo $i; ?>" itemprop="keywords"> <a href="<?php echo Route::_(JVERSION < 4 ? TagsHelperRoute::getTagRoute($tag->tag_id . ':' . $tag->alias) : Joomla\Component\Tags\Site\Helper\RouteHelper::getTagRoute($tag->tag_id . ':' . $tag->alias)); ?>" class="<?php echo $link_class; ?>"> <?php echo $this->escape($tag->title); ?> </a> </li> <?php endif; ?> <?php endforeach; ?> </ul> <?php endif; ?> PKBA#]s_�Msystem/helixultimate/overrides_legacy/layouts/joomla/content/associations.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); $items = $displayData; if (!empty($items)) : ?> <ul class="item-associations"> <?php foreach ($items as $id => $item) : ?> <li> <?php echo is_array($item) ? $item['link'] : $item->link; ?> </li> <?php endforeach; ?> </ul> <?php endif; ?> PKBA#]�� ���Ssystem/helixultimate/overrides_legacy/layouts/joomla/content/categories_default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; ?> <?php if ($displayData->params->get('show_page_heading')) : ?> <h1> <?php echo $displayData->escape($displayData->params->get('page_heading')); ?> </h1> <?php endif; ?> <?php if ($displayData->params->get('show_base_description')) : ?> <?php // If there is a description in the menu parameters use that; ?> <?php if ($displayData->params->get('categories_description')) : ?> <div class="category-desc base-desc"> <?php echo HTMLHelper::_('content.prepare', $displayData->params->get('categories_description'), '', $displayData->get('extension') . '.categories'); ?> </div> <?php else : ?> <?php // Otherwise get one from the database if it exists. ?> <?php if ($displayData->parent->description) : ?> <div class="category-desc base-desc"> <?php echo HTMLHelper::_('content.prepare', $displayData->parent->description, '', $displayData->parent->extension . '.categories'); ?> </div> <?php endif; ?> <?php endif; ?> <?php endif; ?> PKBA#]�^8��Isystem/helixultimate/overrides_legacy/layouts/joomla/content/language.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $item = $displayData; if ($item->language === '*') { echo Text::alt('JALL', 'language'); } elseif ($item->language_image) { echo HTMLHelper::_('image', 'mod_languages/' . $item->language_image . '.gif', '', null, true) . ' ' . htmlspecialchars($item->language_title ?? "", ENT_COMPAT, 'UTF-8'); } elseif ($item->language_title) { echo htmlspecialchars($item->language_title, ENT_COMPAT, 'UTF-8'); } else { echo Text::_('JUNDEFINED'); } PKBA#]ڙKI��Lsystem/helixultimate/overrides_legacy/layouts/joomla/content/intro_image.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Filesystem\File; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; $params = $displayData->params; $attribs = json_decode($displayData->attribs ?? ""); $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $tplParams = $template->params; $leading = (isset($displayData->leading) && $displayData->leading) ? 1 : 0; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); if ($leading) { $blog_list_image = $tplParams->get('leading_blog_list_image', 'large'); } else { $blog_list_image = $tplParams->get('blog_list_image', 'thumbnail'); } $intro_image = ''; if (isset($attribs->helix_ultimate_image) && $attribs->helix_ultimate_image != '') { if ($blog_list_image == 'default') { $intro_image = $attribs->helix_ultimate_image; } else { $intro_image = $attribs->helix_ultimate_image; $basename = basename($intro_image); $list_image = JPATH_ROOT . '/' . dirname($intro_image) . '/' . File::stripExt($basename) . '_' . $blog_list_image . '.' . Helper::getExt($basename); if (\file_exists($list_image)) { $intro_image = Uri::root(true) . '/' . dirname($intro_image) . '/' . File::stripExt($basename) . '_' . $blog_list_image . '.' . Helper::getExt($basename); } } } ?> <?php if ($intro_image): ?> <?php if ($params->get('link_titles') && $params->get('access-view')): ?> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($displayData->slug, $displayData->catid, $displayData->language) : ContentHelperRoute::getArticleRoute($displayData->slug, $displayData->catid, $displayData->language)); ?>"> <?php endif; ?> <div class="article-intro-image"> <?php if (JVERSION >= 4) { $layoutAttr = [ 'src' => $intro_image, 'alt' => empty($displayData->title) ? false : htmlspecialchars($displayData->title ?? "", ENT_COMPAT, 'UTF-8'), ]; echo LayoutHelper::render('joomla.html.image', array_merge($layoutAttr, ['itemprop' => 'thumbnailUrl'])); } else { ?> <img src="<?php echo $intro_image; ?>" alt="<?php echo htmlspecialchars($displayData->title ?? "", ENT_COMPAT, 'UTF-8'); ?>"> <?php } ?> </div> <?php if ($params->get('link_titles') && $params->get('access-view')): ?> </a> <?php endif; ?> <?php else: ?> <?php $images = json_decode($displayData->images ?? ""); ?> <?php if (isset($images->image_intro) && ! empty($images->image_intro)): ?> <?php $imgfloat = empty($images->float_intro) ? $params->get('float_intro') : $images->float_intro; ?> <div class="article-intro-image float-<?php echo htmlspecialchars($imgfloat, ENT_COMPAT, 'UTF-8'); ?>"> <?php if ($params->get('link_titles') && $params->get('access-view')): ?> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($displayData->slug, $displayData->catid, $displayData->language) : ContentHelperRoute::getArticleRoute($displayData->slug, $displayData->catid, $displayData->language)); ?>"> <?php if (JVERSION >= 4) { $layoutAttr = [ 'src' => htmlspecialchars($images->image_intro, ENT_COMPAT, 'UTF-8'), 'alt' => empty($images->image_intro_alt) ? false : htmlspecialchars($images->image_intro_alt ?? "", ENT_COMPAT, 'UTF-8'), ]; if (isset($images->image_intro_caption) && $images->image_intro_caption !== '') { $layoutAttr['class'] = 'caption'; $layoutAttr['title'] = htmlspecialchars($images->image_intro_caption ?? ""); } echo LayoutHelper::render('joomla.html.image', array_merge($layoutAttr, ['itemprop' => 'thumbnailUrl'])); // Image Caption if (isset($images->image_intro_caption) && $images->image_intro_caption !== '') {?> <figcaption class="caption text-dark"><?php echo $this->escape($images->image_intro_caption); ?></figcaption> <?php } } else { ?> <img <?php if ($images->image_intro_caption): ?> <?php echo 'class="caption"' . ' title="' . htmlspecialchars($images->image_intro_caption ?? "") . '"'; ?> <?php endif; ?> src="<?php echo htmlspecialchars($images->image_intro, ENT_COMPAT, 'UTF-8'); ?>" alt="<?php echo htmlspecialchars($images->image_intro_alt ?? "", ENT_COMPAT, 'UTF-8'); ?>"> <?php // Image Caption if (isset($images->image_intro_caption) && $images->image_intro_caption !== '') {?> <figcaption class="caption text-dark"><?php echo $this->escape($images->image_intro_caption); ?></figcaption> <?php } } ?> </a> <?php else: ?> <?php if (JVERSION >= 4) { $layoutAttr = [ 'src' => htmlspecialchars($images->image_intro ?? "", ENT_COMPAT, 'UTF-8'), 'alt' => empty($images->image_intro_alt) ? false : htmlspecialchars($images->image_intro_alt, ENT_COMPAT, 'UTF-8'), ]; if (isset($images->image_intro_caption) && $images->image_intro_caption !== '') { $layoutAttr['class'] = 'caption'; $layoutAttr['title'] = htmlspecialchars($images->image_intro_caption ?? "", ENT_COMPAT, 'UTF-8'); } echo LayoutHelper::render('joomla.html.image', array_merge($layoutAttr, ['itemprop' => 'thumbnailUrl'])); // Image Caption if (isset($images->image_intro_caption) && $images->image_intro_caption !== '') {?> <figcaption class="caption text-dark"><?php echo $this->escape($images->image_intro_caption); ?></figcaption> <?php } } else { ?> <img <?php if ($images->image_intro_caption): ?> <?php echo 'class="caption"' . ' title="' . htmlspecialchars($images->image_intro_caption, ENT_COMPAT, 'UTF-8') . '"'; ?> <?php endif; ?> src="<?php echo htmlspecialchars($images->image_intro, ENT_COMPAT, 'UTF-8'); ?>" alt="<?php echo htmlspecialchars($images->image_intro_alt ?? "", ENT_COMPAT, 'UTF-8'); ?>"> <?php // Image Caption if (isset($images->image_intro_caption) && $images->image_intro_caption !== '') {?> <figcaption class="caption text-dark"><?php echo $this->escape($images->image_intro_caption); ?></figcaption> <?php } } ?> <?php endif; ?> </div> <?php endif; ?> <?php endif; ?>PKBA#]:�F��Ysystem/helixultimate/overrides_legacy/layouts/joomla/content/categories_default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); $class = ' class="first"'; $item = $displayData->item; $items = $displayData->get('items'); $params = $displayData->params; $extension = $displayData->get('extension'); $className = substr($extension, 4); // This will work for the core components but not necessarily for other components // that may have different pluralisation rules. if (substr($className, -1) === 's') { $className = rtrim($className, 's'); } PKBA#]�L���Csystem/helixultimate/overrides_legacy/com_finder/search/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; if (JVERSION < 4) { HTMLHelper::_('behavior.core'); HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers/html'); HTMLHelper::_('stylesheet', 'com_finder/finder.css', array('version' => 'auto', 'relative' => true)); HTMLHelper::_('stylesheet', 'vendor/awesomplete/awesomplete.css', array('version' => 'auto', 'relative' => true)); Text::script('MOD_FINDER_SEARCH_VALUE', true); HTMLHelper::_('script', 'com_finder/finder.js', array('version' => 'auto', 'relative' => true)); } else { $this->document->getWebAssetManager() ->useStyle('com_finder.finder') ->useScript('com_finder.finder'); } ?> <div class="finder"> <?php if ($this->params->get('show_page_heading')) : ?> <h1> <?php if ($this->escape($this->params->get('page_heading'))) : ?> <?php echo $this->escape($this->params->get('page_heading')); ?> <?php else : ?> <?php echo $this->escape($this->params->get('page_title')); ?> <?php endif; ?> </h1> <?php endif; ?> <?php if ($this->params->get('show_search_form', 1)) : ?> <div id="search-form"> <?php echo $this->loadTemplate('form'); ?> </div> <?php endif; ?> <?php // Load the search results layout if we are performing a search. ?> <?php if ($this->query->search === true) : ?> <div id="search-results"> <?php echo $this->loadTemplate('results'); ?> </div> <?php endif; ?> </div> PKBA#]��މ��Jsystem/helixultimate/overrides_legacy/com_finder/search/default_result.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Router\Route; use Joomla\String\StringHelper; // Get the mime type class. $mime = !empty($this->result->mime) ? 'mime-' . $this->result->mime : null; $show_description = $this->params->get('show_description', 1); if ($show_description) { // Calculate number of characters to display around the result $term_length = StringHelper::strlen($this->query->input); $desc_length = $this->params->get('description_length', 255); $pad_length = $term_length < $desc_length ? (int) floor(($desc_length - $term_length) / 2) : 0; // Find the position of the search term $pos = $term_length ? StringHelper::strpos(StringHelper::strtolower($this->result->description), StringHelper::strtolower($this->query->input)) : false; // Find a potential start point $start = ($pos && $pos > $pad_length) ? $pos - $pad_length : 0; // Find a space between $start and $pos, start right after it. $space = StringHelper::strpos($this->result->description, ' ', $start > 0 ? $start - 1 : 0); $start = ($space && $space < $pos) ? $space + 1 : $start; $description = HTMLHelper::_('string.truncate', StringHelper::substr($this->result->description, $start), $desc_length, true); } $route = $this->result->route; $showImage = $this->params->get('show_image', 0); $imageClass = $this->params->get('image_class', ''); $extraAttr = []; if ($showImage && !empty($this->result->imageUrl) && $imageClass !== '') { $extraAttr['class'] = $imageClass; } // Get the route with highlighting information. if (!empty($this->query->highlight) && empty($this->result->mime) && $this->params->get('highlight_terms', 1) && PluginHelper::isEnabled('system', 'highlight')) { $route .= '&highlight=' . base64_encode(json_encode($this->query->highlight)); } ?> <li> <?php if ($showImage && isset($this->result->imageUrl)) : ?> <?php $imageUrl = $this->result->imageUrl; $imageAlt = $this->result->imageAlt; if (!empty($this->result->params->get('helix_ultimate_image'))) { $imageUrl = $this->result->params->get('helix_ultimate_image'); $imageAlt = $this->result->title; } ?> <figure class="<?php echo htmlspecialchars($imageClass ?? "", ENT_COMPAT, 'UTF-8'); ?> result__image"> <?php if ($this->params->get('link_image') && $this->result->route) : ?> <a href="<?php echo Route::_($this->result->route); ?>"> <?php echo HTMLHelper::_('image', $imageUrl, $imageAlt, $extraAttr); ?> </a> <?php else : ?> <?php echo HTMLHelper::_('image', $imageUrl, $imageAlt, $extraAttr); ?> <?php endif; ?> </figure> <?php endif; ?> <h4 class="result-title <?php echo $mime; ?>"> <a href="<?php echo Route::_($route); ?>"> <?php echo $this->result->title; ?> </a> </h4> <?php if ($show_description && $description !== '') : ?> <p class="result-text"> <?php echo $description; ?> </p> <?php endif; ?> </li> PKBA#]�݁ffKsystem/helixultimate/overrides_legacy/com_finder/search/default_results.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; ?> <?php // Display the suggested search if it is different from the current search. ?> <?php if (($this->suggested && $this->params->get('show_suggested_query', 1)) || ($this->explained && $this->params->get('show_explained_query', 1))) : ?> <div id="search-query-explained" class="com-finder__explained"> <?php // Display the suggested search query. ?> <?php if ($this->suggested && $this->params->get('show_suggested_query', 1)) : ?> <?php // Replace the base query string with the suggested query string. ?> <?php $uri = Uri::getInstance($this->query->toUri()); ?> <?php $uri->setVar('q', $this->suggested); ?> <?php // Compile the suggested query link. ?> <?php $linkUrl = Route::_($uri->toString(array('path', 'query'))); ?> <?php $link = '<a href="' . $linkUrl . '">' . $this->escape($this->suggested) . '</a>'; ?> <?php echo Text::sprintf('COM_FINDER_SEARCH_SIMILAR', $link); ?> <?php elseif ($this->explained && $this->params->get('show_explained_query', 1)) : ?> <?php // Display the explained search query. ?> <?php echo $this->explained; ?> <?php endif; ?> </div> <?php endif; ?> <?php // Display the 'no results' message and exit the template. ?> <?php if (($this->total === 0) || ($this->total === null)) : ?> <div id="search-result-empty"> <h2><?php echo Text::_('COM_FINDER_SEARCH_NO_RESULTS_HEADING'); ?></h2> <?php $multilang = Factory::getApplication()->getLanguageFilter() ? '_MULTILANG' : ''; ?> <p><?php echo Text::sprintf('COM_FINDER_SEARCH_NO_RESULTS_BODY' . $multilang, $this->escape($this->query->input)); ?></p> </div> <?php // Exit this template. ?> <?php return; ?> <?php endif; ?> <?php // Activate the highlighter if enabled. ?> <?php if (!empty($this->query->highlight) && $this->params->get('highlight_terms', 1)) : ?> <?php if (JVERSION < 4) { HTMLHelper::_('behavior.highlighter', $this->query->highlight); } else { $this->document->getWebAssetManager()->useScript('highlight'); $this->document->addScriptOptions( 'highlight', [[ 'class' => 'js-highlight', 'highLight' => $this->query->highlight, ]] ); } ?> <?php endif; ?> <?php // Display a list of results ?> <br id="highlighter-start" /> <ul id="search-result-list" class="search-results list-striped js-highlight com-finder__results-list"> <?php $this->baseUrl = Uri::getInstance()->toString(array('scheme', 'host', 'port')); ?> <?php foreach ($this->results as $result) : ?> <?php $this->result = &$result; ?> <?php $layout = $this->getLayoutFile($this->result->layout); ?> <?php echo $this->loadTemplate($layout); ?> <?php endforeach; ?> </ul> <br id="highlighter-end" /> <?php // Display the pagination ?> <div class="search-pagination"> <div class="w-100"> <?php echo $this->pagination->getPagesLinks(); ?> </div> <div class="search-pages-counter"> <?php // Prepare the pagination string. Results X - Y of Z ?> <?php $start = (int) $this->pagination->limitstart + 1; ?> <?php $total = (int) $this->pagination->total; ?> <?php $limit = (int) $this->pagination->limit * $this->pagination->pagesCurrent; ?> <?php $limit = (int) ($limit > $total ? $total : $limit); ?> <?php echo Text::sprintf('COM_FINDER_SEARCH_RESULTS_OF', $start, $limit, $total); ?> </div> </div> PKBA#]��Q�``Hsystem/helixultimate/overrides_legacy/com_finder/search/default_form.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; if (JVERSION < 4) { if ($this->params->get('show_advanced', 1) || $this->params->get('show_autosuggest', 1)) { HTMLHelper::_('jquery.framework'); $script = " jQuery(function() {"; if ($this->params->get('show_advanced', 1)) { /* * This segment of code disables select boxes that have no value when the * form is submitted so that the URL doesn't get blown up with null values. */ $script .= " jQuery('#finder-search').on('submit', function(e){ e.stopPropagation(); // Disable select boxes with no value selected. jQuery('#advancedSearch').find('select').each(function(index, el) { var el = jQuery(el); if(!el.val()){ el.attr('disabled', 'disabled'); } }); });"; } /* * This segment of code sets up the autocompleter. */ if ($this->params->get('show_autosuggest', 1)) { HTMLHelper::_('script', 'jui/jquery.autocomplete.min.js', array('version' => 'auto', 'relative' => true)); $script .= " var suggest = jQuery('#q').autocomplete({ serviceUrl: '" . Route::_('index.php?option=com_finder&task=suggestions.suggest&format=json&tmpl=component') . "', paramName: 'q', minChars: 1, maxHeight: 400, width: 300, zIndex: 9999, deferRequestBy: 500 });"; } $script .= " });"; Factory::getDocument()->addScriptDeclaration($script); } } else { HTMLHelper::_('jquery.framework'); $script = " jQuery(function() {"; $script .= " jQuery('.ads').on('click', function(e){ if(jQuery('#advancedSearch').hasClass('hide')) { jQuery('#advancedSearch').removeClass('hide'); jQuery('#advancedSearch').slideDown(300); } else { jQuery('#advancedSearch').addClass('hide'); jQuery('#advancedSearch').slideUp(300); } });"; $script .= " });"; Factory::getDocument()->addScriptDeclaration($script); if ($this->params->get('show_autosuggest', 1)) { $this->document->getWebAssetManager()->usePreset('awesomplete'); $this->document->addScriptOptions('finder-search', array('url' => Route::_('index.php?option=com_finder&task=suggestions.suggest&format=json&tmpl=component'))); } } ?> <form action="<?php echo Route::_($this->query->toUri()); ?>" id="finder-search" method="get" class="js-finder-searchform"> <?php echo $this->getFields(); ?> <?php //DISABLED UNTIL WEIRD VALUES CAN BE TRACKED DOWN. ?> <?php if (false && $this->state->get('list.ordering') !== 'relevance_dsc') : ?> <input type="hidden" name="o" value="<?php echo $this->escape($this->state->get('list.ordering')); ?>"> <?php endif; ?> <fieldset class="word mb-3"> <label for="q" class="form-label"> <?php echo Text::_('COM_FINDER_SEARCH_TERMS'); ?> </label> <div class="input-group"> <input type="text" id="q" name="q" class="js-finder-search-query form-control" value="<?php echo $this->escape($this->query->input); ?>"> <?php if ($this->escape($this->query->input) != '' || $this->params->get('allow_empty_query')) : ?> <button name="Search" type="submit" class="btn btn-primary"> <span class="fas fa-search icon-white" aria-hidden="true"></span> <?php echo Text::_('JSEARCH_FILTER_SUBMIT'); ?> </button> <?php else : ?> <button name="Search" type="submit" class="btn btn-primary disabled"> <span class="fas fa-search icon-white" aria-hidden="true"></span> <?php echo Text::_('JSEARCH_FILTER_SUBMIT'); ?> </button> <?php endif; ?> <?php if ($this->params->get('show_advanced', 1)) : ?> <?php if (JVERSION < 4) : ?> <a class="btn btn-secondary ads" data-bs-toggle="collapse" href="#advancedSearch" role="button" aria-expanded="false" aria-controls="advancedSearch"> <span class="fas fa-search-plus" aria-hidden="true"></span> <?php echo Text::_('COM_FINDER_ADVANCED_SEARCH_TOGGLE'); ?> </a> <?php else : ?> <a class="btn btn-secondary ads" role="button"> <span class="fas fa-search-plus" aria-hidden="true"></span> <?php echo Text::_('COM_FINDER_ADVANCED_SEARCH_TOGGLE'); ?> </a> <?php endif; ?> <?php endif; ?> </div> </fieldset> <?php if ($this->params->get('show_advanced', 1)) : ?> <?php if (JVERSION < 4) : ?> <div id="advancedSearch" class="js-finder-advanced collapse<?php if ($this->params->get('expand_advanced', 0)) echo ' show'; ?>"> <?php if ($this->params->get('show_advanced_tips', 1)) : ?> <div class="card card-outline-secondary mb-3"> <div class="card-body"> <?php echo Text::_('COM_FINDER_ADVANCED_TIPS'); ?> </div> </div> <?php endif; ?> <div id="finder-filter-window"> <?php echo HTMLHelper::_('filter.select', $this->query, $this->params); ?> </div> </div> <?php else : ?> <div id="advancedSearch" class="js-finder-advanced<?php echo ($this->params->get('expand_advanced', 0)) ? '' : ' hide'; ?>" style="<?php if(!$this->params->get('expand_advanced', 0)) { echo 'display:none'; }?>"> <?php if ($this->params->get('show_advanced_tips', 1)) : ?> <div class="card card-outline-secondary mb-3"> <div class="card-body"> <?php echo Text::_('COM_FINDER_ADVANCED_TIPS'); ?> </div> </div> <?php endif; ?> <div id="finder-filter-window"> <?php echo HTMLHelper::_('filter.select', $this->query, $this->params); ?> </div> </div> <?php endif; ?> <?php endif; ?> </form>PKBA#]u�KEEKsystem/helixultimate/overrides_legacy/com_search/search/default_results.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; ?> <dl class="search-results"> <?php foreach ($this->results as $result) : ?> <dt class="result-title"> <?php echo $this->pagination->limitstart + $result->count . '. '; ?> <?php if ($result->href) : ?> <a rel="noopener noreferrer" href="<?php echo Route::_($result->href); ?>"<?php if (isset($result->browsernav) && $result->browsernav == 1) : ?> target="_blank"<?php endif; ?>> <?php // $result->title should not be escaped in this case, as it may ?> <?php // contain span HTML tags wrapping the searched terms, if present ?> <?php // in the title. ?> <?php echo $result->title; ?> </a> <?php else : ?> <?php // see above comment: do not escape $result->title ?> <?php echo $result->title; ?> <?php endif; ?> </dt> <?php if (!empty($result->section)) : ?> <dd class="result-category"> <span class="small"> (<?php echo $this->escape($result->section); ?>) </span> </dd> <?php endif; ?> <dd class="result-text"> <?php echo $result->text; ?> </dd> <?php if ($this->params->get('show_date')) : ?> <dd class="result-created"> <?php echo Text::sprintf('JGLOBAL_CREATED_DATE_ON', $result->created); ?> </dd> <?php endif; ?> <?php endforeach; ?> </dl> <div class="w-100"> <?php echo $this->pagination->getPagesLinks(); ?> </div> PKBA#],M�kwwIsystem/helixultimate/overrides_legacy/com_search/search/default_error.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); ?> <?php if ($this->error) : ?> <div class="error"> <?php echo $this->escape($this->error); ?> </div> <?php endif; ?> PKBA#]��ݬ�Hsystem/helixultimate/overrides_legacy/com_search/search/default_form.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; $lang = Factory::getLanguage(); $upper_limit = $lang->getUpperLimitSearchWord(); ?> <form id="searchForm" action="<?php echo Route::_('index.php?option=com_search'); ?>" method="post"> <div class="mb-3"> <div class="input-group"> <input type="text" name="searchword" placeholder="<?php echo Text::_('COM_SEARCH_SEARCH_KEYWORD'); ?>" id="search-searchword" maxlength="<?php echo $upper_limit; ?>" value="<?php echo $this->escape($this->origkeyword); ?>" class="form-control"> <div class="input-group-text"> <button name="Search" onclick="this.form.submit()" class="btn btn-secondary"> <span class="fas fa-search" aria-hidden="true"></span> <?php echo Text::_('JSEARCH_FILTER_SUBMIT'); ?> </button> </div> </div> <input type="hidden" name="task" value="search"> </div> <div class="mb-3 searchintro<?php echo $this->params->get('pageclass_sfx'); ?>"> <?php if (!empty($this->searchword)) : ?> <p> <?php echo Text::plural('COM_SEARCH_SEARCH_KEYWORD_N_RESULTS', '<span class="badge badge-info">' . $this->total . '</span>'); ?> </p> <?php endif; ?> </div> <?php if ($this->params->get('search_phrases', 1)) : ?> <fieldset> <legend> <?php echo Text::_('COM_SEARCH_FOR'); ?> </legend> <div class="mb-3"> <?php echo $this->lists['searchphrase']; ?> </div> <div class="mb-3"> <label for="ordering" class="me-2"> <?php echo Text::_('COM_SEARCH_ORDERING'); ?> </label> <?php echo $this->lists['ordering']; ?> </div> </fieldset> <hr> <?php endif; ?> <?php if ($this->params->get('search_areas', 1)) : ?> <div class="mb-3"> <fieldset> <legend> <?php echo Text::_('COM_SEARCH_SEARCH_ONLY'); ?> </legend> <?php foreach ($this->searchareas['search'] as $val => $txt) : ?> <div class="form-check form-check-inline"> <?php $checked = is_array($this->searchareas['active']) && in_array($val, $this->searchareas['active']) ? 'checked="checked"' : ''; ?> <input type="checkbox" class="form-check-input" name="areas[]" value="<?php echo $val; ?>" id="area-<?php echo $val; ?>" <?php echo $checked; ?>> <label for="area-<?php echo $val; ?>" class="form-check-label"><?php echo Text::_($txt); ?></label> </div> <?php endforeach; ?> </fieldset> </div> <hr> <?php endif; ?> <?php if ($this->total > 0) : ?> <div class="mb-3"> <div class="d-flex"> <label for="limit" class="me-2"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM'); ?> </label> <?php echo $this->pagination->getLimitBox(); ?> </div> </div> <p><?php echo $this->pagination->getPagesCounter(); ?></p> <?php endif; ?> </form> PKBA#]� �SjjCsystem/helixultimate/overrides_legacy/com_search/search/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); ?> <div class="search"> <?php if ($this->params->get('show_page_heading')) : ?> <h1 class="page-title"> <?php if ($this->escape($this->params->get('page_heading'))) : ?> <?php echo $this->escape($this->params->get('page_heading')); ?> <?php else : ?> <?php echo $this->escape($this->params->get('page_title')); ?> <?php endif; ?> </h1> <?php endif; ?> <?php echo $this->loadTemplate('form'); ?> <?php if ($this->error == null && count($this->results) > 0) : ?> <?php echo $this->loadTemplate('results'); ?> <?php else : ?> <?php echo $this->loadTemplate('error'); ?> <?php endif; ?> </div> PKBA#]���$��?system/helixultimate/overrides_legacy/com_tags/tags/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; // Note that there are certain parts of this layout used only when there is exactly one tag. HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); $description = $this->params->get('all_tags_description'); $descriptionImage = $this->params->get('all_tags_description_image'); ?> <div class="tag-category<?php echo $this->pageclass_sfx; ?>"> <?php if ($this->params->get('show_page_heading')) : ?> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> <?php endif; ?> <?php if ($this->params->get('all_tags_show_description_image') && !empty($descriptionImage)) : ?> <?php $alt = empty($this->params->get('all_tags_description_image_alt')) && empty($this->params->get('all_tags_description_image_alt_empty')) ? '' : 'alt="' . htmlspecialchars($this->params->get('all_tags_description_image_alt') ?? "", ENT_COMPAT, 'UTF-8') . '"'; ?> <div> <img src="<?php echo htmlspecialchars($descriptionImage ?? "", ENT_QUOTES, 'UTF-8'); ?>" <?php echo $alt; ?>> </div> <?php endif; ?> <?php if (!empty($description)) : ?> <div> <?php echo $description; ?> </div> <?php endif; ?> <?php echo $this->loadTemplate('items'); ?> </div> PKBA#]L�j���Esystem/helixultimate/overrides_legacy/com_tags/tags/default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; if (JVERSION < 4) { HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); HTMLHelper::_('behavior.core'); JLoader::register('TagsHelperRoute', JPATH_BASE . '/components/com_tags/helpers/route.php'); } else { $wa = $this->document->getWebAssetManager(); $wa->useScript('com_tags.tag-default'); } // Get the user object. $user = Factory::getUser(); // Check if user is allowed to add/edit based on tags permissions. $canEdit = $user->authorise('core.edit', 'com_tags'); $canCreate = $user->authorise('core.create', 'com_tags'); $canEditState = $user->authorise('core.edit.state', 'com_tags'); $columns = $this->params->get('tag_columns', 1); // Avoid division by 0 and negative columns. if ($columns < 1) { $columns = 1; } $bsspans = floor(12 / $columns); if ($bsspans < 1) { $bsspans = 1; } $bscolumns = min($columns, floor(12 / $bsspans)); $n = count($this->items); Factory::getDocument()->addScriptDeclaration(" var resetFilter = function() { document.getElementById('filter-search').value = ''; } "); ?> <div class="mb-4"> <form action="<?php echo htmlspecialchars(Uri::getInstance()->toString() ?? ""); ?>" method="post" name="adminForm" id="adminForm"> <?php if ($this->params->get('filter_field') || $this->params->get('show_pagination_limit')) : ?> <fieldset class="filters d-flex justify-content-between mb-3"> <?php if ($this->params->get('filter_field')) : ?> <div class="btn-group"> <label class="filter-search-lbl visually-hidden" for="filter-search"> <?php echo Text::_('COM_TAGS_TITLE_FILTER_LABEL'); ?> </label> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->state->get('list.filter')); ?>" class="inputbox" onchange="document.adminForm.submit();" placeholder="<?php echo Text::_('COM_TAGS_TITLE_FILTER_LABEL'); ?>" > <button type="submit" name="filter-search-button" class="btn btn-primary"><?php echo Text::_('JGLOBAL_FILTER_BUTTON'); ?></button> <button type="reset" name="filter-clear-button" class="btn btn-secondary"><?php echo Text::_('JSEARCH_FILTER_CLEAR'); ?></button> </div> <?php endif; ?> <?php if ($this->params->get('show_pagination_limit')) : ?> <div class="btn-group float-end"> <label for="limit" class="visually-hidden"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM'); ?> </label> <?php echo $this->pagination->getLimitBox(); ?> </div> <?php endif; ?> <input type="hidden" name="filter_order" value=""> <input type="hidden" name="filter_order_Dir" value=""> <input type="hidden" name="limitstart" value=""> <input type="hidden" name="task" value=""> </fieldset> <?php endif; ?> </form> </div> <?php if ($this->items == false || $n === 0) : ?> <p><?php echo Text::_('COM_TAGS_NO_TAGS'); ?></p> <?php else : ?> <?php foreach ($this->items as $i => $item) : ?> <?php if ($n === 1 || $i === 0 || $bscolumns === 1 || $i % $bscolumns === 0) : ?> <ul class="category list-group"> <?php endif; ?> <li class="list-group-item list-group-item-action"> <?php if ((!empty($item->access)) && in_array($item->access, $this->user->getAuthorisedViewLevels())) : ?> <h3 class="mb-0"> <a href="<?php echo Route::_(JVERSION < 4 ? TagsHelperRoute::getTagRoute($item->id . ':' . $item->alias) : Joomla\Component\Tags\Site\Helper\RouteHelper::getTagRoute($item->id . ':' . $item->alias)); ?>"> <?php echo $this->escape($item->title); ?> </a> </h3> <?php endif; ?> <?php if ($this->params->get('all_tags_show_tag_image') && !empty($item->images)) : ?> <?php $images = json_decode($item->images ?? ""); ?> <span class="tag-body"> <?php if (!empty($images->image_intro)) : ?> <?php $imgfloat = empty($images->float_intro) ? $this->params->get('float_intro') : $images->float_intro; ?> <div class="float-<?php echo htmlspecialchars($imgfloat ?? ""); ?> item-image"> <img <?php if ($images->image_intro_caption) : ?> <?php echo 'class="caption"' . ' title="' . htmlspecialchars($images->image_intro_caption ?? "") . '"'; ?> <?php endif; ?> src="<?php echo $images->image_intro; ?>" alt="<?php echo htmlspecialchars($images->image_intro_alt ?? ""); ?>"> </div> <?php endif; ?> </span> <?php endif; ?> <div class="caption"> <?php if ($this->params->get('all_tags_show_tag_description', 1)) : ?> <span class="tag-body"> <?php echo HTMLHelper::_('string.truncate', $item->description, $this->params->get('all_tags_tag_maximum_characters')); ?> </span> <?php endif; ?> <?php if ($this->params->get('all_tags_show_tag_hits')) : ?> <span class="list-hits badge bg-primary"> <?php echo Text::sprintf('JGLOBAL_HITS_COUNT', $item->hits); ?> </span> <?php endif; ?> </div> </li> <?php if (($i === 0 && $n === 1) || $i === $n - 1 || $bscolumns === 1 || (($i + 1) % $bscolumns === 0)) : ?> </ul> <?php endif; ?> <?php endforeach; ?> <?php endif; ?> <?php // Add pagination links ?> <?php if (!empty($this->items)) : ?> <?php if (($this->params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> <nav class="pagination-wrapper d-lg-flex justify-content-between w-100"> <?php echo $this->pagination->getPagesLinks(); ?> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <div class="pagination-counter text-muted mb-4"> <?php echo $this->pagination->getPagesCounter(); ?> </div> <?php endif; ?> </nav> <?php endif; ?> <?php endif; ?> PKBA#]?o�r��Dsystem/helixultimate/overrides_legacy/com_tags/tag/default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); HTMLHelper::_('behavior.core'); // Get the user object. $user = Factory::getUser(); // Check if user is allowed to add/edit based on tags permissions. // Do we really have to make it so people can see unpublished tags??? $canEdit = $user->authorise('core.edit', 'com_tags'); $canCreate = $user->authorise('core.create', 'com_tags'); $canEditState = $user->authorise('core.edit.state', 'com_tags'); $items = $this->items; $n = count($this->items); Factory::getDocument()->addScriptDeclaration(" var resetFilter = function() { document.getElementById('filter-search').value = ''; } "); ?> <div class="mb-4"> <form action="<?php echo htmlspecialchars(Uri::getInstance()->toString() ?? ""); ?>" method="post" name="adminForm" id="adminForm"> <?php if ($this->params->get('filter_field') || $this->params->get('show_pagination_limit')) : ?> <?php if ($this->params->get('filter_field')) : ?> <div class="btn-group"> <label class="filter-search-lbl visually-hidden" for="filter-search"> <?php echo Text::_('COM_TAGS_TITLE_FILTER_LABEL'); ?> </label> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->state->get('list.filter')); ?>" class="inputbox" onchange="document.adminForm.submit();" placeholder="<?php echo Text::_('COM_TAGS_TITLE_FILTER_LABEL'); ?>" > <button type="submit" name="filter_submit" class="btn btn-primary"><?php echo Text::_('JGLOBAL_FILTER_BUTTON'); ?></button> <button type="reset" name="filter-clear-button" class="btn btn-secondary"><?php echo Text::_('JSEARCH_FILTER_CLEAR'); ?></button> </div> <?php endif; ?> <?php if ($this->params->get('show_pagination_limit')) : ?> <div class="btn-group float-end"> <label for="limit" class="visually-hidden"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM'); ?> </label> <?php echo $this->pagination->getLimitBox(); ?> </div> <?php endif; ?> <input type="hidden" name="limitstart" value=""> <input type="hidden" name="task" value=""> <?php endif; ?> </form> </div> <?php if (empty($this->items)) : ?> <div class="alert alert-info"> <span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span> <?php echo Text::_('COM_TAGS_NO_ITEMS'); ?> </div> <?php else : ?> <ul class="list-group"> <?php foreach ($this->items as $i => $item) : ?> <?php if ($item->core_state == 0) : ?> <li class="list-group-item-danger"> <?php else : ?> <li class="list-group-item list-group-item-action"> <?php endif; ?> <?php if (($item->type_alias === 'com_users.category') || ($item->type_alias === 'com_banners.category')) : ?> <?php echo $this->escape($item->core_title); ?> <?php else : ?> <a href="<?php echo Route::_($item->link); ?>"> <?php echo $this->escape($item->core_title); ?> </a> <?php endif; ?> <?php // Content is generated by content plugin event "onContentAfterTitle" ?> <?php echo $item->event->afterDisplayTitle; ?> <?php $images = json_decode($item->core_images ?? ""); ?> <?php if ($this->params->get('tag_list_show_item_image', 1) == 1 && !empty($images->image_intro)) : ?> <a href="<?php echo Route::_($item->link); ?>"> <img src="<?php echo htmlspecialchars($images->image_intro ?? ""); ?>" alt="<?php echo htmlspecialchars($images->image_intro_alt ?? ""); ?>"> </a> <?php endif; ?> <?php if ($this->params->get('tag_list_show_item_description', 1)) : ?> <?php // Content is generated by content plugin event "onContentBeforeDisplay" ?> <?php echo $item->event->beforeDisplayContent; ?> <span class="tag-body"> <?php echo HTMLHelper::_('string.truncate', $item->core_body, $this->params->get('tag_list_item_maximum_characters')); ?> </span> <?php // Content is generated by content plugin event "onContentAfterDisplay" ?> <?php echo $item->event->afterDisplayContent; ?> <?php endif; ?> </li> <?php endforeach; ?> </ul> <?php endif; ?>PKBA#]�s<���Asystem/helixultimate/overrides_legacy/com_tags/tag/list_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; HTMLHelper::_('behavior.core'); $n = count($this->items); $listOrder = $this->escape($this->state->get('list.ordering')); $listDirn = $this->escape($this->state->get('list.direction')); Factory::getDocument()->addScriptDeclaration(" var resetFilter = function() { document.getElementById('filter-search').value = ''; } "); ?> <div class="mb-4"> <form action="<?php echo htmlspecialchars(Uri::getInstance()->toString() ?? ""); ?>" method="post" name="adminForm" id="adminForm"> <?php if ($this->params->get('filter_field') || $this->params->get('show_pagination_limit')) : ?> <fieldset class="filters d-flex justify-content-between mb-3"> <?php if ($this->params->get('filter_field')) : ?> <div class="btn-group"> <label class="filter-search-lbl visually-hidden" for="filter-search"> <?php echo Text::_('COM_TAGS_TITLE_FILTER_LABEL'); ?> </label> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->state->get('list.filter')); ?>" onchange="document.adminForm.submit();" placeholder="<?php echo Text::_('COM_TAGS_TITLE_FILTER_LABEL'); ?>" > <button type="submit" name="filter_submit" class="btn btn-primary"><?php echo Text::_('JGLOBAL_FILTER_BUTTON'); ?></button> <button type="reset" name="filter-clear-button" class="btn btn-secondary" onclick="resetFilter(); document.adminForm.submit();"><?php echo Text::_('JSEARCH_FILTER_CLEAR'); ?></button> </div> <?php endif; ?> <?php if ($this->params->get('show_pagination_limit')) : ?> <div class="btn-group float-end"> <label for="limit" class="visually-hidden"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM'); ?> </label> <?php echo $this->pagination->getLimitBox(); ?> </div> <?php endif; ?> <input type="hidden" name="filter_order" value=""> <input type="hidden" name="filter_order_Dir" value=""> <input type="hidden" name="limitstart" value=""> <input type="hidden" name="task" value=""> </fieldset> <?php endif; ?> </form> </div> <?php if ($this->items === false || $n === 0) : ?> <p><?php echo Text::_('COM_TAGS_NO_ITEMS'); ?></p> <?php else : ?> <table class="category table table-striped table-bordered table-hover"> <?php if ($this->params->get('show_headings')) : ?> <thead> <tr> <th id="categorylist_header_title"> <?php echo HTMLHelper::_('grid.sort', 'JGLOBAL_TITLE', 'c.core_title', $listDirn, $listOrder); ?> </th> <?php if ($date = $this->params->get('tag_list_show_date')) : ?> <th id="categorylist_header_date"> <?php if ($date === 'created') : ?> <?php echo HTMLHelper::_('grid.sort', 'COM_TAGS_' . $date . '_DATE', 'c.core_created_time', $listDirn, $listOrder); ?> <?php elseif ($date === 'modified') : ?> <?php echo HTMLHelper::_('grid.sort', 'COM_TAGS_' . $date . '_DATE', 'c.core_modified_time', $listDirn, $listOrder); ?> <?php elseif ($date === 'published') : ?> <?php echo HTMLHelper::_('grid.sort', 'COM_TAGS_' . $date . '_DATE', 'c.core_publish_up', $listDirn, $listOrder); ?> <?php endif; ?> </th> <?php endif; ?> </tr> </thead> <?php endif; ?> <tbody> <?php foreach ($this->items as $i => $item) : ?> <?php if ($this->items[$i]->core_state == 0) : ?> <tr class="table-danger"> <?php else : ?> <tr> <?php endif; ?> <td <?php if ($this->params->get('show_headings')) echo "headers=\"categorylist_header_title\""; ?> class="list-title"> <a href="<?php echo Route::_($item->link); ?>"> <?php echo $this->escape($item->core_title); ?> </a> <?php if ($item->core_state == 0) : ?> <span class="list-published badge bg-warning"> <?php echo Text::_('JUNPUBLISHED'); ?> </span> <?php endif; ?> </td> <?php if ($this->params->get('tag_list_show_date')) : ?> <td headers="categorylist_header_date" class="list-date small"> <?php echo HTMLHelper::_( 'date', $item->displayDate, $this->escape($this->params->get('date_format', Text::_('DATE_FORMAT_LC3'))) ); ?> </td> <?php endif; ?> </tr> <?php endforeach; ?> </tbody> </table> <?php endif; ?> <?php // Add pagination links ?> <?php if (!empty($this->items)) : ?> <?php if (($this->params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> <nav class="pagination-wrapper d-lg-flex justify-content-between w-100"> <?php echo $this->pagination->getPagesLinks(); ?> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <div class="pagination-counter text-muted mb-4"> <?php echo $this->pagination->getPagesCounter(); ?> </div> <?php endif; ?> </nav> <?php endif; ?> <?php endif; ?> PKBA#]�BVV>system/helixultimate/overrides_legacy/com_tags/tag/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; // Note that there are certain parts of this layout used only when there is exactly one tag. HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); $isSingleTag = count($this->item) === 1; ?> <div class="tag-category<?php echo $this->pageclass_sfx; ?>"> <?php if ($this->params->get('show_page_heading')) : ?> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> <?php endif; ?> <?php if ($this->params->get('show_tag_title', 1)) : ?> <h2> <?php echo HTMLHelper::_('content.prepare', $this->tags_title, '', 'com_tag.tag'); ?> </h2> <?php endif; ?> <?php // We only show a tag description if there is a single tag. ?> <?php if (count($this->item) === 1 && ($this->params->get('tag_list_show_tag_image', 1) || $this->params->get('tag_list_show_tag_description', 1))) : ?> <div class="category-desc"> <?php $images = json_decode($this->item[0]->images ?? ""); ?> <?php if ($this->params->get('tag_list_show_tag_image', 1) == 1 && !empty($images->image_fulltext)) : ?> <img src="<?php echo htmlspecialchars($images->image_fulltext ?? "", ENT_COMPAT, 'UTF-8'); ?>" alt="<?php echo htmlspecialchars($images->image_fulltext_alt ?? ""); ?>"> <?php endif; ?> <?php if ($this->params->get('tag_list_show_tag_description') == 1 && $this->item[0]->description) : ?> <?php echo HTMLHelper::_('content.prepare', $this->item[0]->description, '', 'com_tags.tag'); ?> <?php endif; ?> </div> <?php endif; ?> <?php // If there are multiple tags and a description or image has been supplied use that. ?> <?php if ($this->params->get('tag_list_show_tag_description', 1) || $this->params->get('show_description_image', 1)) : ?> <?php if ($this->params->get('show_description_image', 1) == 1 && $this->params->get('tag_list_image')) : ?> <img src="<?php echo $this->params->get('tag_list_image'); ?>" /> <?php endif; ?> <?php if ($this->params->get('tag_list_description', '') > '') : ?> <?php echo HTMLHelper::_('content.prepare', $this->params->get('tag_list_description'), '', 'com_tags.tag'); ?> <?php endif; ?> <?php endif; ?> <?php echo $this->loadTemplate('items'); ?> <?php if (($this->params->def('show_pagination', 1) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> <div class="w-100"> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <p class="counter float-end pt-3 pe-2"> <?php echo $this->pagination->getPagesCounter(); ?> </p> <?php endif; ?> <?php echo $this->pagination->getPagesLinks(); ?> </div> <?php endif; ?> </div> PKBA#]J���2 2 ;system/helixultimate/overrides_legacy/com_tags/tag/list.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; // Note that there are certain parts of this layout used only when there is exactly one tag. HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); $n = count($this->items); ?> <div class="tag-category<?php echo $this->pageclass_sfx; ?>"> <?php if ($this->params->get('show_page_heading')) : ?> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> <?php endif; ?> <?php if ($this->params->get('show_tag_title', 1)) : ?> <h2> <?php echo HTMLHelper::_('content.prepare', $this->tags_title, '', 'com_tag.tag'); ?> </h2> <?php endif; ?> <?php // We only show a tag description if there is a single tag. ?> <?php if (count($this->item) === 1 && ($this->params->get('tag_list_show_tag_image', 1) || $this->params->get('tag_list_show_tag_description', 1))) : ?> <div class="category-desc"> <?php $images = json_decode($this->item[0]->images ?? ""); ?> <?php if ($this->params->get('tag_list_show_tag_image', 1) == 1 && !empty($images->image_fulltext)) : ?> <img src="<?php echo htmlspecialchars($images->image_fulltext ?? "", ENT_COMPAT, 'UTF-8'); ?>"> <?php endif; ?> <?php if ($this->params->get('tag_list_show_tag_description') == 1 && $this->item[0]->description) : ?> <?php echo HTMLHelper::_('content.prepare', $this->item[0]->description, '', 'com_tags.tag'); ?> <?php endif; ?> </div> <?php endif; ?> <?php // If there are multiple tags and a description or image has been supplied use that. ?> <?php if ($this->params->get('tag_list_show_tag_description', 1) || $this->params->get('show_description_image', 1)) : ?> <?php if ($this->params->get('show_description_image', 1) == 1 && $this->params->get('tag_list_image')) : ?> <img src="<?php echo $this->params->get('tag_list_image'); ?>"> <?php endif; ?> <?php if ($this->params->get('tag_list_description', '') > '') : ?> <?php echo HTMLHelper::_('content.prepare', $this->params->get('tag_list_description'), '', 'com_tags.tag'); ?> <?php endif; ?> <?php endif; ?> <?php echo $this->loadTemplate('items'); ?> </div> PKBA#]�Ҿm��<system/helixultimate/overrides_legacy/mod_search/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Router\Route; ?> <div class="search"> <form action="<?php echo Route::_('index.php'); ?>" method="post"> <?php $output = '<label for="mod-search-searchword' . $module->id . '" class="hide-label">' . $label . '</label> '; $input = '<input name="searchword" id="mod-search-searchword' . $module->id . '" class="form-control" type="search" placeholder="' . $text . '">'; $output .= ''; if ($button) : if ($imagebutton) : $btn_output = '<input type="image" alt="' . $button_text . '" class="btn btn-primary" src="' . $img . '" onclick="this.form.searchword.focus();">'; else : $btn_output = '<button class="btn btn-primary" onclick="this.form.searchword.focus();">' . $button_text . '</button>'; endif; $output .= '<div class="input-group">'; $output .= $input; $output .= '<span class="input-group-btn">'; $output .= $btn_output; $output .= '</span>'; $output .= '</div>'; else : $output .= $input; endif; echo $output; ?> <input type="hidden" name="task" value="search"> <input type="hidden" name="option" value="com_search"> <input type="hidden" name="Itemid" value="<?php echo $mitemid; ?>"> </form> </div> PKBA#]��Y@��Asystem/helixultimate/overrides_legacy/plg_content_vote/rating.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); PKBA#]��Y@��?system/helixultimate/overrides_legacy/plg_content_vote/vote.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); PKBA#]|��Dsystem/helixultimate/overrides_legacy/mod_menu/default_component.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Filter\OutputFilter; use Joomla\CMS\HTML\HTMLHelper; $attributes = array(); $isOffcanvasMenu = $params->get('hu_offcanvas', 0, 'INT') === 1; $maxLevel = $params->get('endLevel', 0, 'INT'); $showToggler = $maxLevel === 0 || $item->level < $maxLevel; if ($item->anchor_title) { $attributes['title'] = $item->anchor_title; } if ($item->anchor_css) { $attributes['class'] = $item->anchor_css; } if ($item->anchor_rel) { $attributes['rel'] = $item->anchor_rel; } $linktype = $item->title; if ($item->menu_icon) { if ($item->getParams()->get('menu_text', 1)) { $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span>' . $item->title; } else { $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span><span class="visually-hidden">' . $item->title . '</span>'; } } else if ($item->menu_image) { // The link is an image, maybe with its own class $image_attributes = []; if ($item->menu_image_css) { $image_attributes['class'] = $item->menu_image_css; } $linktype = HTMLHelper::_('image', $item->menu_image, $item->title, $image_attributes); if ($item->getParams()->get('menu_text', 1)) { $linktype .= '<span class="image-title">' . $item->title . '</span>'; } } if ($item->parent && $showToggler) { $linktype .= '<span class="menu-toggler"></span>'; } if ($item->browserNav == 1) { $attributes['target'] = '_blank'; } elseif ($item->browserNav == 2) { $options = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes'; $attributes['onclick'] = "window.open(this.href, 'targetWindow', '" . $options . "'); return false;"; } echo HTMLHelper::_('link', OutputFilter::ampReplace(htmlspecialchars($item->flink ?? "", ENT_COMPAT, 'UTF-8', false)), $linktype, $attributes); PKBA#]�7��{{Dsystem/helixultimate/overrides_legacy/mod_menu/default_separator.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; $title = $item->anchor_title ? ' title="' . $item->anchor_title . '"' : ''; $anchor_css = $item->anchor_css ?: ''; $rel = $item->anchor_rel ? ' rel="' . $item->anchor_rel . '" ' : ''; $isOffcanvasMenu = $params->get('hu_offcanvas', 0, 'INT') === 1; $maxLevel = $params->get('endLevel', 0, 'INT'); $showToggler = $maxLevel === 0 || $item->level < $maxLevel; $linktype = $item->title; if ($item->menu_icon) { $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span>' . $item->title; } else if ($item->menu_image) { if ($item->menu_image_css) { $image_attributes['class'] = $item->menu_image_css; $linktype = HTMLHelper::_('image', $item->menu_image, $item->title, $image_attributes); } else { $linktype = HTMLHelper::_('image', $item->menu_image, $item->title); } $linktype .= '<span class="menu-image-title">' . $item->title . '</span>'; } if ($item->parent && $showToggler) { $linktype .= '<span class="menu-toggler"></span>'; } ?> <span class="menu-separator <?php echo $anchor_css; ?>"<?php echo $title; ?><?php echo $rel; ?>><?php echo $linktype; ?></span> PKBA#]��?k :system/helixultimate/overrides_legacy/mod_menu/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Helper\ModuleHelper; use Joomla\Registry\Registry; $id = ''; if ($tagId = $params->get('tag_id', '')) { $id = ' id="' . $tagId . '"'; } // The menu class is deprecated. Use nav instead ?> <ul class="menu<?php echo $class_sfx; ?>"<?php echo $id; ?>> <?php foreach ($list as $i => &$item) { $layout = \json_decode($item->getParams()->get('helixultimatemenulayout', '') ?? ""); if (\json_last_error() !== JSON_ERROR_NONE) { $layout = ''; } $helixMenuLayout = new Registry($layout); $customClass = $helixMenuLayout->get('customclass', ''); $class = 'item-' . $item->id; if ($item->id == $default_id) { $class .= ' default'; } if ($item->id == $active_id || ($item->type === 'alias' && $item->getParams()->get('aliasoptions') == $active_id)) { $class .= ' current'; } if (in_array($item->id, $path)) { $class .= ' active'; } elseif ($item->type === 'alias') { $aliasToId = $item->getParams()->get('aliasoptions'); if (count($path) > 0 && $aliasToId == $path[count($path) - 1]) { $class .= ' active'; } elseif (in_array($aliasToId, $path)) { $class .= ' alias-parent-active'; } } if ($item->type === 'separator') { $class .= ' menu-divider'; } if ($item->deeper) { $class .= ' menu-deeper'; } if ($item->parent) { $class .= ' menu-parent'; } if ($customClass) { $class .= ' ' . $customClass; } echo '<li class="' . htmlspecialchars($class, ENT_QUOTES, 'UTF-8') . '">'; switch ($item->type) : case 'separator': case 'component': case 'heading': case 'url': require ModuleHelper::getLayoutPath('mod_menu', 'default_' . $item->type); break; default: require ModuleHelper::getLayoutPath('mod_menu', 'default_url'); break; endswitch; // The next item is deeper. if ($item->deeper) { echo '<ul class="menu-child">'; } // The next item is shallower. elseif ($item->shallower) { echo '</li>'; echo str_repeat('</ul></li>', $item->level_diff); } // The next item is on the same level. else { echo '</li>'; } } ?></ul> PKBA#]5QOO>system/helixultimate/overrides_legacy/mod_menu/default_url.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Filter\OutputFilter; use Joomla\CMS\HTML\HTMLHelper; $attributes = array(); $isOffcanvasMenu = $params->get('hu_offcanvas', 0, 'INT') === 1; $maxLevel = $params->get('endLevel', 0, 'INT'); $showToggler = $maxLevel === 0 || $item->level < $maxLevel; if ($item->anchor_title) { $attributes['title'] = $item->anchor_title; } if ($item->anchor_css) { $attributes['class'] = $item->anchor_css; } if ($item->anchor_rel) { $attributes['rel'] = $item->anchor_rel; } $linktype = $item->title; if ($item->menu_icon) { if ($item->getParams()->get('menu_text', 1)) { $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span>' . $item->title; } else { $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span><span class="visually-hidden">' . $item->title . '</span>'; } } else if ($item->menu_image) { if ($item->menu_image_css) { $image_attributes['class'] = $item->menu_image_css; $linktype = HTMLHelper::_('image', $item->menu_image, $item->title, $image_attributes); } else { $linktype = HTMLHelper::_('image', $item->menu_image, $item->title); } if ($item->getParams()->get('menu_text', 1)) { $linktype .= '<span class="image-title">' . $item->title . '</span>'; } } if ($item->parent && $showToggler) { $linktype .= '<span class="menu-toggler"></span>'; } if ($item->browserNav == 1) { $attributes['target'] = '_blank'; $attributes['rel'] = 'noopener noreferrer'; } elseif ($item->browserNav == 2) { $options = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,' . $params->get('window_open'); $attributes['onclick'] = "window.open(this.href, 'targetWindow', '" . $options . "'); return false;"; } echo HTMLHelper::_('link', OutputFilter::ampReplace(htmlspecialchars($item->flink ?? "", ENT_COMPAT, 'UTF-8', false)), $linktype, $attributes); PKBA#]kJ�wttBsystem/helixultimate/overrides_legacy/mod_menu/default_heading.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; $title = $item->anchor_title ? ' title="' . $item->anchor_title . '"' : ''; $anchor_css = $item->anchor_css ?: ''; $rel = $item->anchor_rel ? ' rel="' . $item->anchor_rel . '" ' : ''; $linktype = $item->title; $isOffcanvasMenu = $params->get('hu_offcanvas', 0, 'INT') === 1; $maxLevel = $params->get('endLevel', 0, 'INT'); $showToggler = $maxLevel === 0 || $item->level < $maxLevel; if ($item->menu_icon) { if ($item->params->get('menu_text', 1)) { $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span>' . $item->title; } else { $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span><span class="visually-hidden">' . $item->title . '</span>'; } } else if ($item->menu_image) { if ($item->menu_image_css) { $image_attributes['class'] = $item->menu_image_css; $linktype = HTMLHelper::_('image', $item->menu_image, $item->title, $image_attributes); } else { $linktype = HTMLHelper::_('image', $item->menu_image, $item->title); } if ($item->params->get('menu_text', 1)) { $linktype .= '<span class="menu-image-title">' . $item->title . '</span>'; } } if ($item->parent && $showToggler) { $linktype .= '<span class="menu-toggler"></span>'; } ?> <span class="nav-header <?php echo $anchor_css; ?>"<?php echo $title; ?><?php echo $rel; ?>><?php echo $linktype; ?></span> PKBA#]i�̩�1system/helixultimate/overrides_legacy/modules.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); function modChrome_sp_xhtml($module, $params, $attribs) { $moduleTag = htmlspecialchars($params->get('module_tag', 'div') ?? "", ENT_QUOTES, 'UTF-8'); $bootstrapSize = (int) $params->get('bootstrap_size', 0); $moduleClass = $bootstrapSize !== 0 ? ' span' . $bootstrapSize : ''; $headerTag = htmlspecialchars($params->get('header_tag', 'h3') ?? "", ENT_QUOTES, 'UTF-8'); $headerClass = htmlspecialchars($params->get('header_class', 'sp-module-title') ?? "", ENT_COMPAT, 'UTF-8'); if ($module->content) { echo '<' . $moduleTag . ' class="sp-module ' . htmlspecialchars($params->get('moduleclass_sfx') ?? "", ENT_COMPAT, 'UTF-8') . $moduleClass . '">'; if ($module->showtitle) { echo '<' . $headerTag . ' class="' . $headerClass . '">' . $module->title . '</' . $headerTag . '>'; } echo '<div class="sp-module-content">'; echo $module->content; echo '</div>'; echo '</' . $moduleTag . '>'; } }PKBA#]����hhEsystem/helixultimate/overrides_legacy/mod_articles_latest/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; if (!$list) { return; } ?> <ul class="latestnews <?php echo $moduleclass_sfx ?? ''; ?>"> <?php foreach ($list as $item) : ?> <li> <a href="<?php echo $item->link; ?>"> <?php echo $item->title; ?> <span><?php echo HTMLHelper::_('date', $item->created, 'DATE_FORMAT_LC3'); ?></span> </a> </li> <?php endforeach; ?> </ul> PKBA#]i��<��4system/helixultimate/overrides_legacy/pagination.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\Language\Text; defined ('_JEXEC') or die(); function pagination_list_render($list) { // Initialize variables $html = '<ul class="pagination ms-0 mb-4">'; if ($list['start']['active']==1) $html .= $list['start']['data']; if ($list['previous']['active']==1) $html .= $list['previous']['data']; foreach ($list['pages'] as $page) { $html .= $page['data']; } if ($list['next']['active']==1) $html .= $list['next']['data']; if ($list['end']['active']==1) $html .= $list['end']['data']; $html .= '</ul>'; return $html; } function pagination_item_active(&$item) { $cls = ''; if ($item->text == Text::_('Next')) { $item->text = '»'; $cls = "next";} if ($item->text == Text::_('Prev')) { $item->text = '«'; $cls = "previous";} if ($item->text == Text::_('First')) { $cls = "first";} if ($item->text == Text::_('Last')) { $cls = "last";} return '<li class="page-item"><a class="page-link ' . $cls . '" href="' . $item->link . '" title="' . $item->text . '">' . $item->text . '</a></li>'; } function pagination_item_inactive( &$item ) { $cls = (int)$item->text > 0 ? 'active': 'disabled'; return '<li class="page-item ' . $cls . '"><a class="page-link">' . $item->text . '</a></li>'; } PKBA#]�����Nsystem/helixultimate/overrides_legacy/com_contact/categories/default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; $lang = Factory::getLanguage(); if ($this->maxLevelcat != 0 && count($this->items[$this->parent->id]) > 0) : ?> <?php foreach ($this->items[$this->parent->id] as $id => $item) : ?> <?php if ($this->params->get('show_empty_categories_cat') || $item->numitems || count($item->getChildren())) : ?> <div class="list-group-item"> <div style="padding-<?php echo $lang->isRtl() ? 'right' : 'left' ?>: <?php echo (int) $this->level * 16; ?>px"> <div class="d-flex justify-content-between align-items-center"> <h5 class="m-0"> <a href="<?php echo Route::_(JVERSION < 4 ? ContactHelperRoute::getCategoryRoute($item->id, $item->language) : Joomla\Component\Contact\Site\Helper\RouteHelper::getCategoryRoute($item->id, $item->language)); ?>"> <?php echo $this->escape($item->title); ?> </a> </h5> <?php if ($this->params->get('show_cat_num_articles_cat') == 1) :?> <span class="badge bg-primary rounded-pill"> <?php echo Text::_('COM_CONTENT_NUM_ITEMS'); ?> <?php echo $item->numitems; ?> </span> <?php endif; ?> </div> <?php if ($this->params->get('show_subcat_desc_cat') == 1) : ?> <?php if ($item->description) : ?> <div class="mt-2"> <?php echo HTMLHelper::_('content.prepare', $item->description, '', 'com_contact.categories'); ?> </div> <?php endif; ?> <?php endif; ?> </div> </div> <?php if (count($item->getChildren()) > 0 && $this->maxLevelcat > 1) : ?> <?php $this->items[$item->id] = $item->getChildren(); $this->parent = $item; $this->maxLevelcat--; $this->level++; echo $this->loadTemplate('items'); $this->parent = $item->getParent(); $this->maxLevelcat++; ?> <?php endif; ?> <?php endif; ?> <?php endforeach; ?> <?php endif; ?>PKBA#]۟T� Hsystem/helixultimate/overrides_legacy/com_contact/categories/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; ?> <div class="categories-list<?php echo $this->pageclass_sfx; ?> list-group"> <?php echo LayoutHelper::render('joomla.content.categories_default', $this); echo $this->loadTemplate('items'); ?> </div>PKBA#]3Ʊ��Ksystem/helixultimate/overrides_legacy/com_contact/contact/default_links.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; ?> <div class="contact-links"> <?php echo '<h3>' . Text::_('COM_CONTACT_LINKS') . '</h3>'; ?> <ul class="list-unstyled"> <?php // Letters 'a' to 'e' foreach (range('a', 'e') as $char) : $link = $this->item->params->get('link' . $char); $label = $this->item->params->get('link' . $char . '_name'); if (!$link) : continue; endif; // Add 'http://' if not present $link = (0 === strpos($link, 'http')) ? $link : 'http://' . $link; // If no label is present, take the link $label = $label ?: $link; ?> <li> <a href="<?php echo $link; ?>" itemprop="url" rel="noopener noreferrer"> <?php echo $label; ?> </a> </li> <?php endforeach; ?> </ul> </div> PKBA#]G����Nsystem/helixultimate/overrides_legacy/com_contact/contact/default_articles.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <?php if ($this->params->get('show_articles')) : ?> <div class="contact-articles"> <ul class="list-unstyled"> <?php foreach ($this->item->articles as $article) : ?> <li> <?php echo HTMLHelper::_('link', Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($article->slug, $article->catid, $article->language) : ContentHelperRoute::getArticleRoute($article->slug, $article->catid, $article->language)), htmlspecialchars($article->title ?? "", ENT_COMPAT, 'UTF-8')); ?> </li> <?php endforeach; ?> </ul> </div> <?php endif; ?> PKBA#]�F @@Esystem/helixultimate/overrides_legacy/com_contact/contact/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Helper\ContentHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Component\ComponentHelper; $cparams = ComponentHelper::getParams('com_media'); $tparams = $this->item->params; $canDo = ContentHelper::getActions('com_contact', 'category', $this->item->catid); $canEdit = $canDo->get('core.edit') || ($canDo->get('core.edit.own') && $this->item->created_by === Factory::getUser()->id); $htag = $tparams->get('show_page_heading') ? 'h2' : 'h1'; ?> <!-- for joomla3 --> <?php if(JVERSION < 4) : ?> <div class="contact" itemscope itemtype="https://schema.org/Person"> <?php if ($tparams->get('show_page_heading')) : ?> <h1> <?php echo $this->escape($tparams->get('page_heading')); ?> </h1> <?php endif; ?> <?php if ($this->contact->name && $tparams->get('show_name')) : ?> <div class="page-header"> <h2> <?php if ($this->item->published == 0) : ?> <span class="label label-warning"><?php echo Text::_('JUNPUBLISHED'); ?></span> <?php endif; ?> <span class="contact-name" itemprop="name"><?php echo $this->contact->name; ?></span> </h2> </div> <?php endif; ?> <?php $show_contact_category = $tparams->get('show_contact_category'); ?> <?php if ($show_contact_category === 'show_no_link') : ?> <h3> <span class="contact-category"><?php echo $this->contact->category_title; ?></span> </h3> <?php elseif ($show_contact_category === 'show_with_link') : ?> <?php $contactLink = ContactHelperRoute::getCategoryRoute($this->contact->catid); ?> <h3> <span class="contact-category"><a href="<?php echo $contactLink; ?>"> <?php echo $this->escape($this->contact->category_title); ?></a> </span> </h3> <?php endif; ?> <?php echo $this->item->event->afterDisplayTitle; ?> <?php if ($tparams->get('show_contact_list') && count($this->contacts) > 1) : ?> <form action="#" method="get" name="selectForm" id="selectForm"> <label for="select_contact"><?php echo Text::_('COM_CONTACT_SELECT_CONTACT'); ?></label> <?php echo HTMLHelper::_('select.genericlist', $this->contacts, 'select_contact', 'class="inputbox" onchange="document.location.href = this.value"', 'link', 'name', $this->contact->link); ?> </form> <?php endif; ?> <?php if ($tparams->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> <?php $this->item->tagLayout = new FileLayout('joomla.content.tags'); ?> <?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?> <?php endif; ?> <?php echo $this->item->event->beforeDisplayContent; ?> <?php $presentation_style = $tparams->get('presentation_style'); ?> <?php $accordionStarted = false; ?> <?php $tabSetStarted = false; ?> <?php if ($this->params->get('show_info', 1)) : ?> <?php if ($presentation_style === 'sliders') : ?> <?php echo HTMLHelper::_('bootstrap.startAccordion', 'slide-contact', array('active' => 'basic-details')); ?> <?php $accordionStarted = true; ?> <?php echo HTMLHelper::_('bootstrap.addSlide', 'slide-contact', Text::_('COM_CONTACT_DETAILS'), 'basic-details'); ?> <?php elseif ($presentation_style === 'tabs') : ?> <?php echo HTMLHelper::_('bootstrap.startTabSet', 'myTab', array('active' => 'basic-details')); ?> <?php $tabSetStarted = true; ?> <?php echo HTMLHelper::_('bootstrap.addTab', 'myTab', 'basic-details', Text::_('COM_CONTACT_DETAILS')); ?> <?php endif; ?> <?php if ($this->contact->image && $tparams->get('show_image')) : ?> <div class="thumbnail float-end"> <?php echo HTMLHelper::_('image', $this->contact->image, $this->contact->name, array('itemprop' => 'image')); ?> </div> <?php endif; ?> <?php if ($this->contact->con_position && $tparams->get('show_position')) : ?> <dl class="contact-position dl-horizontal"> <dt><?php echo Text::_('COM_CONTACT_POSITION'); ?>:</dt> <dd itemprop="jobTitle"> <?php echo $this->contact->con_position; ?> </dd> </dl> <?php endif; ?> <?php echo $this->loadTemplate('address'); ?> <?php if ($tparams->get('allow_vcard')) : ?> <?php echo Text::_('COM_CONTACT_DOWNLOAD_INFORMATION_AS'); ?> <a href="<?php echo Route::_('index.php?option=com_contact&view=contact&id=' . $this->contact->id . '&format=vcf'); ?>"> <?php echo Text::_('COM_CONTACT_VCARD'); ?></a> <?php endif; ?> <?php if ($presentation_style === 'sliders') : ?> <?php echo HTMLHelper::_('bootstrap.endSlide'); ?> <?php elseif ($presentation_style === 'tabs') : ?> <?php echo HTMLHelper::_('bootstrap.endTab'); ?> <?php endif; ?> <?php endif; ?> <?php if ($tparams->get('show_email_form') && ($this->contact->email_to || $this->contact->user_id)) : ?> <?php if ($presentation_style === 'sliders') : ?> <?php if (!$accordionStarted) { echo HTMLHelper::_('bootstrap.startAccordion', 'slide-contact', array('active' => 'display-form')); $accordionStarted = true; } ?> <?php echo HTMLHelper::_('bootstrap.addSlide', 'slide-contact', Text::_('COM_CONTACT_EMAIL_FORM'), 'display-form'); ?> <?php elseif ($presentation_style === 'tabs') : ?> <?php if (!$tabSetStarted) { echo HTMLHelper::_('bootstrap.startTabSet', 'myTab', array('active' => 'display-form')); $tabSetStarted = true; } ?> <?php echo HTMLHelper::_('bootstrap.addTab', 'myTab', 'display-form', Text::_('COM_CONTACT_EMAIL_FORM')); ?> <?php endif; ?> <?php echo $this->loadTemplate('form'); ?> <?php if ($presentation_style === 'sliders') : ?> <?php echo HTMLHelper::_('bootstrap.endSlide'); ?> <?php elseif ($presentation_style === 'tabs') : ?> <?php echo HTMLHelper::_('bootstrap.endTab'); ?> <?php endif; ?> <?php endif; ?> <?php if ($tparams->get('show_links')) : ?> <?php echo $this->loadTemplate('links'); ?> <?php endif; ?> <?php if ($tparams->get('show_articles') && $this->contact->user_id && $this->contact->articles) : ?> <?php if ($presentation_style === 'sliders') : ?> <?php if (!$accordionStarted) { echo HTMLHelper::_('bootstrap.startAccordion', 'slide-contact', array('active' => 'display-articles')); $accordionStarted = true; } ?> <?php echo HTMLHelper::_('bootstrap.addSlide', 'slide-contact', Text::_('JGLOBAL_ARTICLES'), 'display-articles'); ?> <?php elseif ($presentation_style === 'tabs') : ?> <?php if (!$tabSetStarted) { echo HTMLHelper::_('bootstrap.startTabSet', 'myTab', array('active' => 'display-articles')); $tabSetStarted = true; } ?> <?php echo HTMLHelper::_('bootstrap.addTab', 'myTab', 'display-articles', Text::_('JGLOBAL_ARTICLES')); ?> <?php elseif ($presentation_style === 'plain') : ?> <?php echo '<h3>' . Text::_('JGLOBAL_ARTICLES') . '</h3>'; ?> <?php endif; ?> <?php echo $this->loadTemplate('articles'); ?> <?php if ($presentation_style === 'sliders') : ?> <?php echo HTMLHelper::_('bootstrap.endSlide'); ?> <?php elseif ($presentation_style === 'tabs') : ?> <?php echo HTMLHelper::_('bootstrap.endTab'); ?> <?php endif; ?> <?php endif; ?> <?php if ($tparams->get('show_profile') && $this->contact->user_id && PluginHelper::isEnabled('user', 'profile')) : ?> <?php if ($presentation_style === 'sliders') : ?> <?php if (!$accordionStarted) { echo HTMLHelper::_('bootstrap.startAccordion', 'slide-contact', array('active' => 'display-profile')); $accordionStarted = true; } ?> <?php echo HTMLHelper::_('bootstrap.addSlide', 'slide-contact', Text::_('COM_CONTACT_PROFILE'), 'display-profile'); ?> <?php elseif ($presentation_style === 'tabs') : ?> <?php if (!$tabSetStarted) { echo HTMLHelper::_('bootstrap.startTabSet', 'myTab', array('active' => 'display-profile')); $tabSetStarted = true; } ?> <?php echo HTMLHelper::_('bootstrap.addTab', 'myTab', 'display-profile', Text::_('COM_CONTACT_PROFILE')); ?> <?php elseif ($presentation_style === 'plain') : ?> <?php echo '<h3>' . Text::_('COM_CONTACT_PROFILE') . '</h3>'; ?> <?php endif; ?> <?php echo $this->loadTemplate('profile'); ?> <?php if ($presentation_style === 'sliders') : ?> <?php echo HTMLHelper::_('bootstrap.endSlide'); ?> <?php elseif ($presentation_style === 'tabs') : ?> <?php echo HTMLHelper::_('bootstrap.endTab'); ?> <?php endif; ?> <?php endif; ?> <?php if ($tparams->get('show_user_custom_fields') && $this->contactUser) : ?> <?php echo $this->loadTemplate('user_custom_fields'); ?> <?php endif; ?> <?php if ($this->contact->misc && $tparams->get('show_misc')) : ?> <?php if ($presentation_style === 'sliders') : ?> <?php if (!$accordionStarted) { echo HTMLHelper::_('bootstrap.startAccordion', 'slide-contact', array('active' => 'display-misc')); $accordionStarted = true; } ?> <?php echo HTMLHelper::_('bootstrap.addSlide', 'slide-contact', Text::_('COM_CONTACT_OTHER_INFORMATION'), 'display-misc'); ?> <?php elseif ($presentation_style === 'tabs') : ?> <?php if (!$tabSetStarted) { echo HTMLHelper::_('bootstrap.startTabSet', 'myTab', array('active' => 'display-misc')); $tabSetStarted = true; } ?> <?php echo HTMLHelper::_('bootstrap.addTab', 'myTab', 'display-misc', Text::_('COM_CONTACT_OTHER_INFORMATION')); ?> <?php elseif ($presentation_style === 'plain') : ?> <?php echo '<h3>' . Text::_('COM_CONTACT_OTHER_INFORMATION') . '</h3>'; ?> <?php endif; ?> <div class="contact-miscinfo"> <dl class="dl-horizontal"> <dt> <span class="<?php echo $tparams->get('marker_class'); ?>"> <?php echo $tparams->get('marker_misc'); ?> </span> </dt> <dd> <span class="contact-misc"> <?php echo $this->contact->misc; ?> </span> </dd> </dl> </div> <?php if ($presentation_style === 'sliders') : ?> <?php echo HTMLHelper::_('bootstrap.endSlide'); ?> <?php elseif ($presentation_style === 'tabs') : ?> <?php echo HTMLHelper::_('bootstrap.endTab'); ?> <?php endif; ?> <?php endif; ?> <?php if ($accordionStarted) : ?> <?php echo HTMLHelper::_('bootstrap.endAccordion'); ?> <?php elseif ($tabSetStarted) : ?> <?php echo HTMLHelper::_('bootstrap.endTabSet'); ?> <?php endif; ?> <?php echo $this->item->event->afterDisplayContent; ?> </div> <?php endif; ?> <!-- for joomla4 --> <?php if(JVERSION >= 4) : ?> <div class="com-contact contact" itemscope itemtype="https://schema.org/Person"> <?php if ($tparams->get('show_page_heading')) : ?> <h1> <?php echo $this->escape($tparams->get('page_heading')); ?> </h1> <?php endif; ?> <?php if ($this->item->name && $tparams->get('show_name')) : ?> <div class="page-header"> <<?php echo $htag; ?>> <?php if ($this->item->published == 0) : ?> <span class="badge bg-warning text-light"><?php echo Text::_('JUNPUBLISHED'); ?></span> <?php endif; ?> <span class="contact-name" itemprop="name"><?php echo $this->item->name; ?></span> </<?php echo $htag; ?>> </div> <?php endif; ?> <?php if ($canEdit) : ?> <?php echo HTMLHelper::_('contacticon.edit', $this->item, $tparams); ?> <?php endif; ?> <?php $show_contact_category = $tparams->get('show_contact_category'); ?> <?php if ($show_contact_category === 'show_no_link') : ?> <h3> <span class="contact-category"><?php echo $this->item->category_title; ?></span> </h3> <?php elseif ($show_contact_category === 'show_with_link') : ?> <?php $contactLink = Route::_(JVERSION < 4 ? ContactHelperRoute::getCategoryRoute($this->item) : Joomla\Component\Contact\Site\Helper\RouteHelper::getCategoryRoute($this->item->catid, $this->item->language)); ?> <h3> <span class="contact-category"><a href="<?php echo $contactLink; ?>"> <?php echo $this->escape($this->item->category_title); ?></a> </span> </h3> <?php endif; ?> <?php echo $this->item->event->afterDisplayTitle; ?> <?php if ($tparams->get('show_contact_list') && count($this->contacts) > 1) : ?> <form action="#" method="get" name="selectForm" id="selectForm" class="mb-4"> <label for="select_contact" class="form-label"><?php echo Text::_('COM_CONTACT_SELECT_CONTACT'); ?></label> <?php echo HTMLHelper::_( 'select.genericlist', $this->contacts, 'select_contact', 'class="form-select" onchange="document.location.href = this.value"', 'link', 'name', $this->item->link); ?> </form> <?php endif; ?> <?php if ($tparams->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> <div class="com-contact__tags"> <?php $this->item->tagLayout = new FileLayout('joomla.content.tags'); ?> <?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?> </div> <?php endif; ?> <?php echo $this->item->event->beforeDisplayContent; ?> <?php if ($this->params->get('show_info', 1)) : ?> <div class="row"> <?php //echo '<h3>' . Text::_('COM_CONTACT_DETAILS') . '</h3>'; ?> <div class="col"> <?php if ($this->item->con_position && $tparams->get('show_position')) : ?> <div class="contact-position d-flex mb-3"> <div class="me-2"> <strong><?php echo Text::_('COM_CONTACT_POSITION'); ?>:</strong> </div> <div itemprop="jobTitle"> <?php echo $this->item->con_position; ?> </div> </div> <?php endif; ?> <div class="contact-info"> <?php echo $this->loadTemplate('address'); ?> <?php if ($tparams->get('allow_vcard')) : ?> <div class="mb-4"> <?php echo Text::_('COM_CONTACT_DOWNLOAD_INFORMATION_AS'); ?> <a href="<?php echo Route::_('index.php?option=com_contact&view=contact&id=' . $this->item->id . '&format=vcf'); ?>"> <?php echo Text::_('COM_CONTACT_VCARD'); ?> </a> </div> <?php endif; ?> </div> </div> <?php if ($this->item->image && $tparams->get('show_image')) : ?> <div class="col-lg-auto"> <?php echo HTMLHelper::_( 'image', $this->item->image, htmlspecialchars($this->item->name ?? "", ENT_QUOTES, 'UTF-8'), array('itemprop' => 'image') ); ?> </div> <?php endif; ?> </div> <?php endif; ?> <?php if ($tparams->get('show_email_form') && ($this->item->email_to || $this->item->user_id)) : ?> <?php echo '<h3>' . Text::_('COM_CONTACT_EMAIL_FORM') . '</h3>'; ?> <?php echo $this->loadTemplate('form'); ?> <?php endif; ?> <?php if ($tparams->get('show_links')) : ?> <?php echo $this->loadTemplate('links'); ?> <?php endif; ?> <?php if ($tparams->get('show_articles') && $this->item->user_id && $this->item->articles) : ?> <?php echo '<h3>' . Text::_('JGLOBAL_ARTICLES') . '</h3>'; ?> <?php echo $this->loadTemplate('articles'); ?> <?php endif; ?> <?php if ($tparams->get('show_profile') && $this->item->user_id && PluginHelper::isEnabled('user', 'profile')) : ?> <?php echo '<h3>' . Text::_('COM_CONTACT_PROFILE') . '</h3>'; ?> <?php echo $this->loadTemplate('profile'); ?> <?php endif; ?> <?php if ($tparams->get('show_user_custom_fields') && $this->contactUser) : ?> <?php echo $this->loadTemplate('user_custom_fields'); ?> <?php endif; ?> <?php if ($this->item->misc && $tparams->get('show_misc')) : ?> <div class="contact-miscinfo"> <?php echo '<h3>' . Text::_('COM_CONTACT_OTHER_INFORMATION') . '</h3>'; ?> <div class="d-flex"> <div class="me-2"> <?php if (!$this->params->get('marker_misc')) : ?> <span class="fas fa-info-circle" aria-hidden="true"></span> <span class="visually-hidden"><?php echo Text::_('COM_CONTACT_OTHER_INFORMATION'); ?></span> <?php else : ?> <span class="<?php echo $this->params->get('marker_class'); ?>"> <?php echo $this->params->get('marker_misc'); ?> </span> <?php endif; ?> </div> <div class="contact-misc"> <?php echo $this->item->misc; ?> </div> </div> </div> <?php endif; ?> <?php echo $this->item->event->afterDisplayContent; ?> </div> <?php endif; ?> PKBA#]���E��Jsystem/helixultimate/overrides_legacy/com_contact/contact/default_form.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; HTMLHelper::_('behavior.keepalive'); HTMLHelper::_('behavior.formvalidator'); ?> <div class="contact-form"> <form id="contact-form" action="<?php echo Route::_('index.php'); ?>" method="post" class="form-validate"> <?php foreach ($this->form->getFieldsets() as $fieldset) : ?> <?php if ($fieldset->name === 'captcha' && !$this->captchaEnabled) : ?> <?php continue; ?> <?php endif; ?> <?php $fields = $this->form->getFieldset($fieldset->name); ?> <?php if (count($fields)) : ?> <fieldset> <?php foreach ($fields as $field) : ?> <?php echo $field->renderField(); ?> <?php endforeach; ?> </fieldset> <?php endif; ?> <?php endforeach; ?> <div class="control-group"> <div class="controls"> <button class="btn btn-primary validate" type="submit"><?php echo Text::_('COM_CONTACT_CONTACT_SEND'); ?></button> <input type="hidden" name="option" value="com_contact"> <input type="hidden" name="task" value="contact.submit"> <input type="hidden" name="return" value="<?php echo $this->return_page; ?>"> <?php if(JVERSION >= 4) { ?> <input type="hidden" name="id" value="<?php echo $this->item->slug; ?>"> <?php } else { ?> <input type="hidden" name="id" value="<?php echo $this->contact->slug; ?>"> <?php } ?> <?php echo HTMLHelper::_('form.token'); ?> </div> </div> </form> </div> PKBA#]����Msystem/helixultimate/overrides_legacy/com_contact/contact/default_address.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\String\PunycodeHelper; ?> <div class="contact-address mb-4" itemprop="address" itemscope itemtype="https://schema.org/PostalAddress"> <?php if (($this->params->get('address_check') > 0) && ($this->item->address || $this->item->suburb || $this->item->state || $this->item->country || $this->item->postcode)) : ?> <div class="d-flex"> <div class="me-2"> <?php if (!$this->params->get('marker_address')) : ?> <span class="fas fa-address-book fa-fw" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('COM_CONTACT_ADDRESS'); ?></span> <?php else : ?> <span class="<?php echo $this->params->get('marker_class'); ?>"> <?php echo $this->params->get('marker_address'); ?> </span> <?php endif; ?> </div> <div> <?php if ($this->item->address && $this->params->get('show_street_address')) : ?> <div class="contact-street" itemprop="streetAddress"> <?php echo nl2br($this->item->address, false); ?> </div> <?php endif; ?> <?php if ($this->item->suburb && $this->params->get('show_suburb')) : ?> <div class="contact-suburb" itemprop="addressLocality"> <?php echo $this->item->suburb; ?> </div> <?php endif; ?> <?php if ($this->item->state && $this->params->get('show_state')) : ?> <div class="contact-state" itemprop="addressRegion"> <?php echo $this->item->state; ?> </div> <?php endif; ?> <?php if ($this->item->postcode && $this->params->get('show_postcode')) : ?> <div class="contact-postcode" itemprop="postalCode"> <?php echo $this->item->postcode; ?> </div> <?php endif; ?> <?php if ($this->item->country && $this->params->get('show_country')) : ?> <div class="contact-country" itemprop="addressCountry"> <?php echo $this->item->country; ?> </div> <?php endif; ?> </div> </div> <?php endif; ?> <?php if ($this->item->email_to && $this->params->get('show_email')) : ?> <div class="d-flex mt-2"> <div class="me-2"> <?php if (!$this->params->get('marker_email')) : ?> <span class="fas fa-envelope fa-fw" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('COM_CONTACT_EMAIL'); ?></span> <?php else : ?> <span class="<?php echo $this->params->get('marker_class'); ?>"> <?php echo $this->params->get('marker_email'); ?> </span> <?php endif; ?> </div> <div class="contact-emailto"> <?php echo $this->item->email_to; ?> </div> </div> <?php endif; ?> <?php if ($this->item->telephone && $this->params->get('show_telephone')) : ?> <div class="d-flex mt-2"> <div class="me-2"> <?php if (!$this->params->get('marker_telephone')) : ?> <span class="fas fa-phone fa-fw" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('COM_CONTACT_TELEPHONE'); ?></span> <?php else : ?> <span class="<?php echo $this->params->get('marker_class'); ?>"> <?php echo $this->params->get('marker_telephone'); ?> </span> <?php endif; ?> </div> <div class="contact-telephone" itemprop="telephone"> <?php echo $this->item->telephone; ?> </div> </div> <?php endif; ?> <?php if ($this->item->fax && $this->params->get('show_fax')) : ?> <div class="d-flex mt-2"> <div class="me-2"> <?php if (!$this->params->get('marker_fax')) : ?> <span class="fas fa-fax fa-fw" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('COM_CONTACT_FAX'); ?></span> <?php else : ?> <span class="<?php echo $this->params->get('marker_class'); ?>"> <?php echo $this->params->get('marker_fax'); ?> </span> <?php endif; ?> </div> <div class="contact-fax" itemprop="faxNumber"> <?php echo $this->item->fax; ?> </div> </div> <?php endif; ?> <?php if ($this->item->mobile && $this->params->get('show_mobile')) : ?> <div class="d-flex mt-2"> <div class="me-2"> <?php if (!$this->params->get('marker_mobile')) : ?> <span class="fas fa-mobile fa-fw" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('COM_CONTACT_MOBILE'); ?></span> <?php else : ?> <span class="<?php echo $this->params->get('marker_class'); ?>"> <?php echo $this->params->get('marker_mobile'); ?> </span> <?php endif; ?> </div> <div class="contact-mobile" itemprop="telephone"> <?php echo $this->item->mobile; ?> </div> </div> <?php endif; ?> <?php if ($this->item->webpage && $this->params->get('show_webpage')) : ?> <div class="d-flex mt-2"> <div class="me-2"> <?php if (!$this->params->get('marker_webpage')) : ?> <span class="fas fa-globe fa-fw" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('COM_CONTACT_WEBPAGE'); ?></span> <?php else : ?> <span class="<?php echo $this->params->get('marker_class'); ?>"> <?php echo $this->params->get('marker_webpage'); ?> </span> <?php endif; ?> </div> <div class="contact-webpage"> <a href="<?php echo $this->item->webpage; ?>" target="_blank" rel="noopener noreferrer" itemprop="url"> <?php echo PunycodeHelper::urlToUTF8($this->item->webpage); ?> </a> </div> </div> <?php endif; ?> </div>PKBA#]1i6.� � Gsystem/helixultimate/overrides_legacy/com_media/media/default_texts.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; $translationStrings = [ 'COM_MEDIA_ACTIONS_TOOLBAR_LABEL', 'COM_MEDIA_ACTION_DELETE', 'COM_MEDIA_ACTION_DOWNLOAD', 'COM_MEDIA_ACTION_EDIT', 'COM_MEDIA_ACTION_PREVIEW', 'COM_MEDIA_ACTION_RENAME', 'COM_MEDIA_ACTION_SHARE', 'COM_MEDIA_BREADCRUMB_LABEL', 'COM_MEDIA_BROWSER_TABLE_CAPTION', 'COM_MEDIA_CHANGE_ORDERING', 'COM_MEDIA_CONFIRM_DELETE_MODAL', 'COM_MEDIA_CONFIRM_DELETE_MODAL_HEADING', 'COM_MEDIA_CREATE_NEW_FOLDER', 'COM_MEDIA_CREATE_NEW_FOLDER_ERROR', 'COM_MEDIA_CREATE_NEW_FOLDER_SUCCESS', 'COM_MEDIA_DECREASE_GRID', 'COM_MEDIA_DELETE_ERROR', 'COM_MEDIA_DELETE_SUCCESS', 'COM_MEDIA_DROP_FILE', 'COM_MEDIA_ERROR', 'COM_MEDIA_ERROR_NOT_AUTHENTICATED', 'COM_MEDIA_ERROR_NOT_AUTHORIZED', 'COM_MEDIA_ERROR_NOT_FOUND', 'COM_MEDIA_ERROR_WARNFILETOOLARGE', 'COM_MEDIA_FILE', 'COM_MEDIA_FILE_EXISTS_AND_OVERRIDE', 'COM_MEDIA_FOLDER', 'COM_MEDIA_FOLDER_NAME', 'COM_MEDIA_INCREASE_GRID', 'COM_MEDIA_MANAGE_ITEM', 'COM_MEDIA_MEDIA_DATE_CREATED', 'COM_MEDIA_MEDIA_DATE_MODIFIED', 'COM_MEDIA_MEDIA_DIMENSION', 'COM_MEDIA_MEDIA_EXTENSION', 'COM_MEDIA_MEDIA_MIME_TYPE', 'COM_MEDIA_MEDIA_NAME', 'COM_MEDIA_MEDIA_SIZE', 'COM_MEDIA_MEDIA_TYPE', 'COM_MEDIA_NAME', 'COM_MEDIA_OPEN_ITEM_ACTIONS', 'COM_MEDIA_ORDER_ASC', 'COM_MEDIA_ORDER_BY', 'COM_MEDIA_ORDER_DESC', 'COM_MEDIA_ORDER_DIRECTION', 'COM_MEDIA_PLEASE_SELECT_ITEM', 'COM_MEDIA_RENAME', 'COM_MEDIA_RENAME_ERROR', 'COM_MEDIA_RENAME_SUCCESS', 'COM_MEDIA_SEARCH', 'COM_MEDIA_SELECT_ALL', 'COM_MEDIA_SERVER_ERROR', 'COM_MEDIA_SHARE', 'COM_MEDIA_SHARE_COPY', 'COM_MEDIA_SHARE_COPY_FAILED_ERROR', 'COM_MEDIA_SHARE_DESC', 'COM_MEDIA_TOGGLE_INFO', 'COM_MEDIA_TOGGLE_LIST_VIEW', 'COM_MEDIA_TOGGLE_SELECT_ITEM', 'COM_MEDIA_TOOLBAR_LABEL', 'COM_MEDIA_UPLOAD_SUCCESS', 'ERROR', 'JACTION_CREATE', 'JAPPLY', 'JCANCEL', 'JGLOBAL_CONFIRM_DELETE', 'JGLOBAL_NO_MATCHING_RESULTS', 'JLIB_FORM_FIELD_REQUIRED_VALUE', 'MESSAGE', ]; foreach ($translationStrings as $string) { Text::script($string); } PKBA#]��#��Asystem/helixultimate/overrides_legacy/com_media/media/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\Session\Session; use Joomla\CMS\Toolbar\Toolbar; use Joomla\CMS\Uri\Uri; $app = Factory::getApplication(); $params = ComponentHelper::getParams('com_media'); $input = $app->getInput(); $user = $app->getIdentity(); /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('keepalive') ->useStyle('com_media.mediamanager') ->useScript('com_media.mediamanager') ->useStyle('webcomponent.joomla-alert') ->useScript('messages'); // Populate the language $this->loadTemplate('texts'); $tmpl = $input->getCmd('tmpl'); // Load the toolbar when we are in an iframe if ($tmpl === 'component') { echo '<div class="subhead noshadow">'; echo Toolbar::getInstance('toolbar')->render(); echo '</div>'; } $mediaTypes = '&mediatypes=' . $input->getString('mediatypes', '0,1,2,3'); // Populate the media config $config = [ 'apiBaseUrl' => Uri::base() . 'index.php?option=com_media&format=json' . $mediaTypes, 'csrfToken' => Session::getFormToken(), 'filePath' => $params->get('file_path', 'images'), 'fileBaseUrl' => Uri::root() . $params->get('file_path', 'images'), 'fileBaseRelativeUrl' => $params->get('file_path', 'images'), 'editViewUrl' => Uri::base() . 'index.php?option=com_media&view=file' . ($tmpl ? '&tmpl=' . $tmpl : '') . $mediaTypes, 'imagesExtensions' => array_map('trim', explode(',', $params->get('image_extensions', 'bmp,gif,jpg,jpeg,png,webp'))), 'audioExtensions' => array_map('trim', explode(',', $params->get('audio_extensions', 'mp3,m4a,mp4a,ogg'))), 'videoExtensions' => array_map('trim', explode(',', $params->get('video_extensions', 'mp4,mp4v,mpeg,mov,webm'))), 'documentExtensions' => array_map('trim', explode(',', $params->get('doc_extensions', 'doc,odg,odp,ods,odt,pdf,ppt,txt,xcf,xls,csv'))), 'maxUploadSizeMb' => $params->get('upload_maxsize', 10), 'providers' => (array) $this->providers, 'currentPath' => $this->currentPath, 'isModal' => $tmpl === 'component', 'canCreate' => $user->authorise('core.create', 'com_media'), 'canEdit' => $user->authorise('core.edit', 'com_media'), 'canDelete' => $user->authorise('core.delete', 'com_media'), ]; $this->document->addScriptOptions('com_media', $config); $this->document->addScriptDeclaration( " jQuery(function($) { let element = '<div id=\"system-message-container\" aria-live=\"polite\"></div>'; $( document ).ready(function() { $('body.com-media').prepend(element); }); }); " ); ?> <div id="com-media"></div> PKBA#]}�P�22?system/helixultimate/overrides_legacy/mod_languages/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Uri\Uri; HTMLHelper::_('stylesheet', 'mod_languages/template.css', array('version' => 'auto', 'relative' => true)); if ($params->get('dropdown', 1) && !$params->get('dropdownimage', 0)) { HTMLHelper::_('formbehavior.chosen'); } ?> <div class="mod-languages"> <?php if ($headerText) : ?> <div class="pretext"><p><?php echo $headerText; ?></p></div> <?php endif; ?> <?php if ($params->get('dropdown', 1) && !$params->get('dropdownimage', 0)) : ?> <form name="lang" method="post" action="<?php echo htmlspecialchars(Uri::current() ?? "", ENT_COMPAT, 'UTF-8'); ?>"> <select class="inputbox advancedSelect" onchange="document.location.replace(this.value);" > <?php foreach ($list as $language) : ?> <option dir=<?php echo $language->rtl ? '"rtl"' : '"ltr"'; ?> value="<?php echo $language->link; ?>" <?php echo $language->active ? 'selected="selected"' : ''; ?>> <?php echo $language->title_native; ?></option> <?php endforeach; ?> </select> </form> <?php elseif ($params->get('dropdown', 1) && $params->get('dropdownimage', 0)) : ?> <div class="btn-group"> <?php foreach ($list as $language) : ?> <?php if ($language->active) : ?> <a href="#" data-bs-toggle="dropdown" data-bs-auto-close="true" class="btn dropdown-toggle"> <span class="caret"></span> <?php if ($language->image) : ?> <?php echo HTMLHelper::_('image', 'mod_languages/' . $language->image . '.gif', '', null, true); ?> <?php endif; ?> <?php echo $language->title_native; ?> </a> <?php endif; ?> <?php endforeach; ?> <ul class="<?php echo $params->get('lineheight', 1) ? 'lang-block' : 'lang-inline'; ?> dropdown-menu" dir="<?php echo Factory::getLanguage()->isRtl() ? 'rtl' : 'ltr'; ?>"> <?php foreach ($list as $language) : ?> <?php if (!$language->active || $params->get('show_active', 0)) : ?> <li<?php echo $language->active ? ' class="lang-active"' : ''; ?>> <a href="<?php echo $language->link; ?>"> <?php if ($language->image) : ?> <?php echo HTMLHelper::_('image', 'mod_languages/' . $language->image . '.gif', '', null, true); ?> <?php endif; ?> <?php echo $language->title_native; ?> </a> </li> <?php endif; ?> <?php endforeach; ?> </ul> </div> <?php else : ?> <ul class="<?php echo $params->get('inline', 1) ? 'lang-inline' : 'lang-block'; ?>"> <?php foreach ($list as $language) : ?> <?php if (!$language->active || $params->get('show_active', 0)) : ?> <li<?php echo $language->active ? ' class="lang-active"' : ''; ?> dir="<?php echo $language->rtl ? 'rtl' : 'ltr'; ?>"> <a href="<?php echo $language->link; ?>"> <?php if ($params->get('image', 1)) : ?> <?php if ($language->image) : ?> <?php echo HTMLHelper::_('image', 'mod_languages/' . $language->image . '.gif', $language->title_native, array('title' => $language->title_native), true); ?> <?php else : ?> <span class="label"><?php echo strtoupper($language->sef); ?></span> <?php endif; ?> <?php else : ?> <?php echo $params->get('full_name', 1) ? $language->title_native : strtoupper($language->sef); ?> <?php endif; ?> </a> </li> <?php endif; ?> <?php endforeach; ?> </ul> <?php endif; ?> <?php if ($footerText) : ?> <div class="posttext"><p><?php echo $footerText; ?></p></div> <?php endif; ?> </div> PKBA#]�K�:uu;system/helixultimate/overrides_legacy/mod_login/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Router\Route; JLoader::register('UsersHelperRoute', JPATH_SITE . '/components/com_users/helpers/route.php'); HTMLHelper::_('behavior.keepalive'); HTMLHelper::_('bootstrap.tooltip'); ?> <form action="<?php echo Route::_('index.php', true, $params->get('usesecure')); ?>" method="post" id="login-form"> <?php if ($params->get('pretext')) : ?> <div class="pretext mb-2"> <?php echo $params->get('pretext'); ?> </div> <?php endif; ?> <div id="form-login-username" class="mb-3"> <?php if (!$params->get('usetext')) : ?> <div class="input-group"> <span class="input-group-text" aria-label="<?php echo Text::_('MOD_LOGIN_VALUE_USERNAME'); ?>"><span class="fas fa-user"></span></span> <input id="modlgn-username" type="text" name="username" class="form-control" tabindex="0" size="18" placeholder="<?php echo Text::_('MOD_LOGIN_VALUE_USERNAME'); ?>" /> </div> <?php else : ?> <label for="modlgn-username"><?php echo Text::_('MOD_LOGIN_VALUE_USERNAME'); ?></label> <input id="modlgn-username" type="text" name="username" class="form-control" tabindex="0" size="18" placeholder="<?php echo Text::_('MOD_LOGIN_VALUE_USERNAME'); ?>" /> <?php endif; ?> </div> <div id="form-login-password" class="mb-3"> <?php if (!$params->get('usetext')) : ?> <div class="input-group"> <span class="input-group-text" aria-label="<?php echo Text::_('JGLOBAL_PASSWORD'); ?>"><span class="fas fa-lock" aria-hidden="true"></span></span> <input id="modlgn-passwd" type="password" name="password" class="form-control" tabindex="0" size="18" placeholder="<?php echo Text::_('JGLOBAL_PASSWORD'); ?>" /> </div> <?php else : ?> <label for="modlgn-passwd"><?php echo Text::_('JGLOBAL_PASSWORD'); ?></label> <input id="modlgn-passwd" type="password" name="password" class="form-control" tabindex="0" size="18" placeholder="<?php echo Text::_('JGLOBAL_PASSWORD'); ?>" /> <?php endif; ?> </div> <?php if(version_compare(JVERSION, '4.2.0', '<')) : ?> <?php if (empty($twofactormethods) > 1) : ?> <div id="form-login-secretkey" class="mb-3"> <?php if (!$params->get('usetext')) : ?> <div class="input-group"> <span class="input-group-text" aria-label="<?php echo Text::_('JGLOBAL_SECRETKEY'); ?>"><span class="fas fa-star" aria-hidden="true"></span></span> <input id="modlgn-secretkey" autocomplete="off" type="text" name="secretkey" class="form-control" tabindex="0" size="18" placeholder="<?php echo Text::_('JGLOBAL_SECRETKEY'); ?>" /> <button class="btn btn-secondary hasTooltip" type="button" title="<?php echo Text::_('JGLOBAL_SECRETKEY_HELP'); ?>"> <span class="fas fa-headset" aria-hidden="true"></span> </button> </div> <?php else : ?> <label for="modlgn-secretkey"><?php echo Text::_('JGLOBAL_SECRETKEY'); ?></label> <input id="modlgn-secretkey" autocomplete="off" type="text" name="secretkey" class="form-control" tabindex="0" size="18" placeholder="<?php echo Text::_('JGLOBAL_SECRETKEY'); ?>" /> <small class="d-block text-muted"><span class="fas fa-asterisk" aria-hidden="true"></span> <?php echo Text::_('JGLOBAL_SECRETKEY_HELP'); ?></small> <?php endif; ?> </div> <?php endif; ?> <?php endif; ?> <?php if (PluginHelper::isEnabled('system', 'remember')) : ?> <div id="form-login-remember" class="mb-3 form-check"> <input id="modlgn-remember" type="checkbox" name="remember" class="form-check-input" value="yes"/> <label for="modlgn-remember" class="control-label"><?php echo Text::_('MOD_LOGIN_REMEMBER_ME'); ?></label> </div> <?php endif; ?> <div id="form-login-submit" class="mb-3"> <button type="submit" tabindex="0" name="Submit" class="btn btn-primary login-button"><?php echo Text::_('JLOGIN'); ?></button> </div> <?php $usersConfig = ComponentHelper::getParams('com_users'); ?> <ul class="unstyled"> <?php if ($usersConfig->get('allowUserRegistration')) : ?> <li> <a href="<?php echo Route::_('index.php?option=com_users&view=registration'); ?>"> <?php echo Text::_('MOD_LOGIN_REGISTER'); ?> <span class="icon-arrow-right"></span></a> </li> <?php endif; ?> <li> <a href="<?php echo Route::_('index.php?option=com_users&view=remind'); ?>"> <?php echo Text::_('MOD_LOGIN_FORGOT_YOUR_USERNAME'); ?></a> </li> <li> <a href="<?php echo Route::_('index.php?option=com_users&view=reset'); ?>"> <?php echo Text::_('MOD_LOGIN_FORGOT_YOUR_PASSWORD'); ?></a> </li> </ul> <input type="hidden" name="option" value="com_users" /> <input type="hidden" name="task" value="user.login" /> <input type="hidden" name="return" value="<?php echo $return; ?>" /> <?php echo HTMLHelper::_('form.token'); ?> <?php if ($params->get('posttext')) : ?> <div class="posttext mt-2"> <?php echo $params->get('posttext'); ?> </div> <?php endif; ?> </form> PKBA#]p�h��%�%Ksystem/helixultimate/overrides_legacy/com_content/archive/default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); $params = $this->params; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <div id="archive-items"> <?php foreach ($this->items as $i => $item) : ?> <?php $info = $item->params->get('info_block_position', 0); ?> <div class="row<?php echo $i % 2; ?>" itemscope itemtype="https://schema.org/Article"> <div class="page-header"> <h2 itemprop="headline"> <?php if ($params->get('link_titles')) : ?> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language) : ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)); ?>" itemprop="url"> <?php echo $this->escape($item->title); ?> </a> <?php else : ?> <?php echo $this->escape($item->title); ?> <?php endif; ?> </h2> <?php // Content is generated by content plugin event "onContentAfterTitle" ?> <?php echo $item->event->afterDisplayTitle; ?> <?php if ($params->get('show_author') && !empty($item->author )) : ?> <div class="createdby" itemprop="author" itemscope itemtype="https://schema.org/Person"> <?php $author = $item->created_by_alias ?: $item->author; ?> <?php $author = '<span itemprop="name">' . $author . '</span>'; ?> <?php if (!empty($item->contact_link) && $params->get('link_author') == true) : ?> <?php echo Text::sprintf('COM_CONTENT_WRITTEN_BY', HTMLHelper::_('link', $this->item->contact_link, $author, array('itemprop' => 'url'))); ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_WRITTEN_BY', $author); ?> <?php endif; ?> </div> <?php endif; ?> </div> <?php $useDefList = ($params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date') || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category')); ?> <?php if ($useDefList && ($info == 0 || $info == 2)) : ?> <div class="article-info"> <?php if ($params->get('show_parent_category') && !empty($item->parent_slug)) : ?> <span class="parent-category-name"> <?php $title = $this->escape($item->parent_title); ?> <?php if ($params->get('link_parent_category') && !empty($item->parent_slug)) : ?> <?php $url = '<a href="' . Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getCategoryRoute($item->parent_slug) : ContentHelperRoute::getCategoryRoute($item->parent_slug)) . '" itemprop="genre">' . $title . '</a>'; ?> <?php echo Text::sprintf('COM_CONTENT_PARENT', $url); ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_PARENT', '<span itemprop="genre">' . $title . '</span>'); ?> <?php endif; ?> </span> <?php endif; ?> <?php if ($params->get('show_category')) : ?> <span class="category-name"> <?php $title = $this->escape($item->category_title); ?> <?php if ($params->get('link_category') && $item->catslug) : ?> <?php $url = '<a href="' . Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getCategoryRoute($item->catslug) : ContentHelperRoute::getCategoryRoute($item->catslug)) . '" itemprop="genre">' . $title . '</a>'; ?> <?php echo Text::sprintf('COM_CONTENT_CATEGORY', $url); ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_CATEGORY', '<span itemprop="genre">' . $title . '</span>'); ?> <?php endif; ?> </span> <?php endif; ?> <?php if ($params->get('show_publish_date')) : ?> <span class="published"> <time datetime="<?php echo HTMLHelper::_('date', $item->publish_up, 'c'); ?>" itemprop="datePublished"> <?php echo Text::sprintf('COM_CONTENT_PUBLISHED_DATE_ON', HTMLHelper::_('date', $item->publish_up, Text::_('DATE_FORMAT_LC3'))); ?> </time> </span> <?php endif; ?> <?php if ($info == 0) : ?> <?php if ($params->get('show_modify_date')) : ?> <span class="modified"> <time datetime="<?php echo HTMLHelper::_('date', $item->modified, 'c'); ?>" itemprop="dateModified"> <?php echo Text::sprintf('COM_CONTENT_LAST_UPDATED', HTMLHelper::_('date', $item->modified, Text::_('DATE_FORMAT_LC3'))); ?> </time> </span> <?php endif; ?> <?php if ($params->get('show_create_date')) : ?> <span class="create"> <time datetime="<?php echo HTMLHelper::_('date', $item->created, 'c'); ?>" itemprop="dateCreated"> <?php echo Text::sprintf('COM_CONTENT_CREATED_DATE_ON', HTMLHelper::_('date', $item->created, Text::_('DATE_FORMAT_LC3'))); ?> </time> </span> <?php endif; ?> <?php if ($params->get('show_hits')) : ?> <span class="hits"> <meta itemprop="interactionCount" content="UserPageVisits:<?php echo $item->hits; ?>"> <?php echo Text::sprintf('COM_CONTENT_ARTICLE_HITS', $item->hits); ?> </span> <?php endif; ?> <?php endif; ?> </div> <?php endif; ?> <?php // Content is generated by content plugin event "onContentBeforeDisplay" ?> <?php echo $item->event->beforeDisplayContent; ?> <?php if ($params->get('show_intro')) : ?> <div class="intro" itemprop="articleBody"> <?php echo HTMLHelper::_('string.truncateComplex', $item->introtext, $params->get('introtext_limit')); ?> </div> <?php endif; ?> <?php if ($useDefList && ($info == 1 || $info == 2)) : ?> <div class="article-info"> <?php if ($info == 1) : ?> <?php if ($params->get('show_parent_category') && !empty($item->parent_slug)) : ?> <span class="parent-category-name"> <?php $title = $this->escape($item->parent_title); ?> <?php if ($params->get('link_parent_category') && $item->parent_slug) : ?> <?php $url = '<a href="' . Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getCategoryRoute($item->parent_slug) : ContentHelperRoute::getCategoryRoute($item->parent_slug)) . '" itemprop="genre">' . $title . '</a>'; ?> <?php echo Text::sprintf('COM_CONTENT_PARENT', $url); ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_PARENT', '<span itemprop="genre">' . $title . '</span>'); ?> <?php endif; ?> </span> <?php endif; ?> <?php if ($params->get('show_category')) : ?> <span class="category-name"> <?php $title = $this->escape($item->category_title); ?> <?php if ($params->get('link_category') && $item->catslug) : ?> <?php $url = '<a href="' . Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getCategoryRoute($item->catslug) : ContentHelperRoute::getCategoryRoute($item->catslug)) . '" itemprop="genre">' . $title . '</a>'; ?> <?php echo Text::sprintf('COM_CONTENT_CATEGORY', $url); ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_CATEGORY', '<span itemprop="genre">' . $title . '</span>'); ?> <?php endif; ?> </span> <?php endif; ?> <?php if ($params->get('show_publish_date')) : ?> <span class="published"> <time datetime="<?php echo HTMLHelper::_('date', $item->publish_up, 'c'); ?>" itemprop="datePublished"> <?php echo Text::sprintf('COM_CONTENT_PUBLISHED_DATE_ON', HTMLHelper::_('date', $item->publish_up, Text::_('DATE_FORMAT_LC3'))); ?> </time> </span> <?php endif; ?> <?php endif; ?> <?php if ($params->get('show_create_date')) : ?> <span class="create"> <time datetime="<?php echo HTMLHelper::_('date', $item->created, 'c'); ?>" itemprop="dateCreated"> <?php echo Text::sprintf('COM_CONTENT_CREATED_DATE_ON', HTMLHelper::_('date', $item->modified, Text::_('DATE_FORMAT_LC3'))); ?> </time> </span> <?php endif; ?> <?php if ($params->get('show_modify_date')) : ?> <span class="modified"> <time datetime="<?php echo HTMLHelper::_('date', $item->modified, 'c'); ?>" itemprop="dateModified"> <?php echo Text::sprintf('COM_CONTENT_LAST_UPDATED', HTMLHelper::_('date', $item->modified, Text::_('DATE_FORMAT_LC3'))); ?> </time> </span> <?php endif; ?> <?php if ($params->get('show_hits')) : ?> <span class="hits"> <meta content="UserPageVisits:<?php echo $item->hits; ?>" itemprop="interactionCount"> <?php echo Text::sprintf('COM_CONTENT_ARTICLE_HITS', $item->hits); ?> </span> <?php endif; ?> </div> <?php endif; ?> <?php // Content is generated by content plugin event "onContentAfterDisplay" ?> <?php echo $item->event->afterDisplayContent; ?> </div> <?php endforeach; ?> </div> <?php if (($this->params->def('show_pagination', 1) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> <nav class="pagination-wrapper d-lg-flex justify-content-between w-100"> <?php echo $this->pagination->getPagesLinks(); ?> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <div class="pagination-counter text-muted mb-4"> <?php echo $this->pagination->getPagesCounter(); ?> </div> <?php endif; ?> </nav> <?php endif; ?> PKBA#]*|K��Esystem/helixultimate/overrides_legacy/com_content/archive/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); ?> <div class="archive<?php echo $this->pageclass_sfx; ?>"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <form id="adminForm" action="<?php echo Route::_('index.php'); ?>" method="post"> <fieldset class="filters"> <div class="filter-search row g-3 align-items-center mb-4"> <?php if ($this->params->get('filter_field') !== 'hide') : ?> <div class="col-auto"> <label class="filter-search-lbl visually-hidden" for="filter-search"><?php echo Text::_('COM_CONTENT_TITLE_FILTER_LABEL') . ' '; ?></label> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->filter); ?>" class="inputbox col-lg-2" onchange="document.getElementById('adminForm').submit();" placeholder="<?php echo Text::_('COM_CONTENT_TITLE_FILTER_LABEL'); ?>"> </div> <?php endif; ?> <div class="col-auto"> <?php echo $this->form->monthField; ?> </div> <div class="col-auto"> <?php echo $this->form->yearField; ?> </div> <div class="col-auto"> <?php echo $this->form->limitField; ?> </div> <div class="col-auto"> <button type="submit" class="btn btn-primary"><?php echo Text::_('JGLOBAL_FILTER_BUTTON'); ?></button> </div> <input type="hidden" name="view" value="archive"> <input type="hidden" name="option" value="com_content"> <input type="hidden" name="limitstart" value="0"> </div> </fieldset> <?php echo $this->loadTemplate('items'); ?> </form> </div> PKBA#]Y�- Nsystem/helixultimate/overrides_legacy/com_content/categories/default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $lang = Factory::getLanguage(); $version = new Version(); $JoomlaVersion = $version->getShortVersion(); if ($this->maxLevelcat != 0 && count($this->items[$this->parent->id]) > 0) : ?> <?php foreach ($this->items[$this->parent->id] as $id => $item) : ?> <?php if ($this->params->get('show_empty_categories_cat') || $item->numitems || count($item->getChildren())) : ?> <div class="list-group-item"> <div style="padding-<?php echo $lang->isRtl() ? 'right' : 'left' ?>: <?php echo (int) $this->level * 16; ?>px"> <div class="d-flex justify-content-between align-items-center"> <h5 class="m-0"> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getCategoryRoute($item->id, $item->language) : ContentHelperRoute::getCategoryRoute($item->id, $item->language)); ?>"> <?php echo $this->escape($item->title); ?> </a> </h5> <?php if ($this->params->get('show_cat_num_articles_cat') == 1) :?> <span class="badge bg-primary rounded-pill"> <?php echo Text::_('COM_CONTENT_NUM_ITEMS'); ?> <?php echo $item->numitems; ?> </span> <?php endif; ?> </div> <?php if ($this->params->get('show_subcat_desc_cat') == 1) : ?> <?php if ($item->description) : ?> <div class="mt-2"> <?php echo HTMLHelper::_('content.prepare', $item->description, '', 'com_content.categories'); ?> </div> <?php endif; ?> <?php endif; ?> </div> </div> <?php if (count($item->getChildren()) > 0 && $this->maxLevelcat > 1) : ?> <?php $this->items[$item->id] = $item->getChildren(); $this->parent = $item; $this->maxLevelcat--; $this->level++; echo $this->loadTemplate('items'); $this->parent = $item->getParent(); $this->maxLevelcat++; ?> <?php endif; ?> <?php endif; ?> <?php endforeach; ?> <?php endif; ?>PKBA#]����Hsystem/helixultimate/overrides_legacy/com_content/categories/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Layout\LayoutHelper; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); // HTMLHelper::_('behavior.caption'); Factory::getDocument()->addScriptDeclaration(" jQuery(function($) { $('.categories-list').find('[id^=category-btn-]').each(function(index, btn) { var btn = $(btn); btn.on('click', function() { btn.find('span').toggleClass('icon-plus'); btn.find('span').toggleClass('icon-minus'); }); }); });"); ?> <div class="categories-list<?php echo $this->pageclass_sfx; ?> list-group"> <?php echo LayoutHelper::render('joomla.content.categories_default', $this); echo $this->loadTemplate('items'); ?> </div> PKBA#]�'��Y Y Ksystem/helixultimate/overrides_legacy/com_content/article/default_links.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; // Create shortcut $urls = json_decode($this->item->urls ?? ""); // Create shortcuts to some parameters. $params = $this->item->params; if ($urls && (!empty($urls->urla) || !empty($urls->urlb) || !empty($urls->urlc))) : ?> <div class="content-links"> <ul class="nav nav-tabs nav-stacked"> <?php $urlarray = array( array($urls->urla, $urls->urlatext, $urls->targeta, 'a'), array($urls->urlb, $urls->urlbtext, $urls->targetb, 'b'), array($urls->urlc, $urls->urlctext, $urls->targetc, 'c') ); foreach ($urlarray as $url) : $link = $url[0]; $label = $url[1]; $target = $url[2]; $id = $url[3]; if ( ! $link) : continue; endif; // If no label is present, take the link $label = $label ?: $link; // If no target is present, use the default $target = $target ?: $params->get('target' . $id); ?> <li class="content-links-<?php echo $id; ?>"> <?php // Compute the correct link switch ($target) { case 1: // Open in a new window echo '<a href="' . htmlspecialchars($link ?? "", ENT_COMPAT, 'UTF-8') . '" target="_blank" rel="nofollow noopener noreferrer">' . htmlspecialchars($label ?? "", ENT_COMPAT, 'UTF-8') . '</a>'; break; case 2: // Open in a popup window $attribs = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=600,height=600'; echo "<a href=\"" . htmlspecialchars($link ?? "", ENT_COMPAT, 'UTF-8') . "\" onclick=\"window.open(this.href, 'targetWindow', '" . $attribs . "'); return false;\" rel=\"noopener noreferrer\">" . htmlspecialchars($label ?? "", ENT_COMPAT, 'UTF-8') . '</a>'; break; case 3: // Open in a modal window HTMLHelper::_('behavior.modal', 'a.modal'); echo '<a class="modal" href="' . htmlspecialchars($link ?? "", ENT_COMPAT, 'UTF-8') . '" rel="{handler: \'iframe\', size: {x:600, y:600}} noopener noreferrer">' . htmlspecialchars($label ?? "", ENT_COMPAT, 'UTF-8') . ' </a>'; break; default: // Open in parent window echo '<a href="' . htmlspecialchars($link ?? "", ENT_COMPAT, 'UTF-8') . '" rel="nofollow">' . htmlspecialchars($label ?? "", ENT_COMPAT, 'UTF-8') . ' </a>'; break; } ?> </li> <?php endforeach; ?> </ul> </div> <?php endif; ?> PKBA#]d2a�=(=(Esystem/helixultimate/overrides_legacy/com_content/article/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Associations; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $tmpl_params = $template->params; $relatedArticles = []; if ($tmpl_params->get('related_article')) { $args['catId'] = $this->item->catid; $args['maximum'] = $tmpl_params->get('related_article_limit'); $args['itemTags'] = $this->item->tags->itemTags; $args['item_id'] = $this->item->id; $relatedArticles = HelixUltimate\Framework\Core\HelixUltimate::getRelatedArticles($args); } // Create shortcuts to some parameters. $params = $this->item->params; $images = json_decode($this->item->images ?? ""); $urls = json_decode($this->item->urls ?? ""); $canEdit = $params->get('access-edit'); $currentDate = Factory::getDate()->format('Y-m-d H:i:s'); $user = Factory::getUser(); $info = $params->get('info_block_position', 0); $page_header_tag = 'h1'; $attribs = json_decode($this->item->attribs ?? ""); $article_format = (isset($attribs->helix_ultimate_article_format) && $attribs->helix_ultimate_article_format) ? $attribs->helix_ultimate_article_format : 'standard'; // Check if associations are implemented. If they are, define the parameter. $assocParam = (Associations::isEnabled() && $params->get('show_associations')); $isExpired = JVERSION < 4 ? (strtotime($this->item->publish_down) < strtotime(Factory::getDate())) && $this->item->publish_down != Factory::getDbo()->getNullDate() : !is_null($this->item->publish_down) && $this->item->publish_down < $currentDate; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <div class="article-details <?php echo $this->pageclass_sfx; ?>" itemscope itemtype="https://schema.org/Article"> <meta itemprop="inLanguage" content="<?php echo ($this->item->language === '*') ? Factory::getConfig()->get('language') : $this->item->language; ?>"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1><?php echo $this->escape($this->params->get('page_heading')); ?></h1> </div> <?php $page_header_tag = 'h2'; ?> <?php endif; ?> <?php if (!empty($this->item->pagination) && $this->item->pagination && !$this->item->paginationposition && $this->item->paginationrelative) { echo $this->item->pagination; } ?> <?php if($article_format == 'gallery') : ?> <?php echo LayoutHelper::render('joomla.content.blog.gallery', array('attribs' => $attribs, 'id'=>$this->item->id)); ?> <?php elseif($article_format == 'video') : ?> <?php echo LayoutHelper::render('joomla.content.blog.video', array('attribs' => $attribs)); ?> <?php elseif($article_format == 'audio') : ?> <?php echo LayoutHelper::render('joomla.content.blog.audio', array('attribs' => $attribs)); ?> <?php else: ?> <?php echo LayoutHelper::render('joomla.content.full_image', $this->item); ?> <?php endif; ?> <?php if ($this->item->featured) :?> <!-- Featured Tag --> <span class="badge bg-danger featured-article-badge"><?php echo Text::_('HELIX_ULTIMATE_FEATURED'); ?></span> <?php endif; ?> <?php // Todo Not that elegant would be nice to group the params ?> <?php $useDefList = ($params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date') || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam); ?> <?php if ($params->get('show_title') || $params->get('show_author')) : ?> <div class="article-header"> <?php if ($params->get('show_title')) : ?> <<?php echo $page_header_tag; ?> itemprop="headline"> <?php echo $this->escape($this->item->title); ?> </<?php echo $page_header_tag; ?>> <?php endif; ?> <?php if ($this->item->state == 0) : ?> <span class="badge bg-warning text-dark"><?php echo Text::_('JUNPUBLISHED'); ?></span> <?php endif; ?> <?php if (strtotime($this->item->publish_up) > strtotime(Factory::getDate())) : ?> <span class="badge bg-warning text-dark"><?php echo Text::_('JNOTPUBLISHEDYET'); ?></span> <?php endif; ?> <?php if ($isExpired) : ?> <span class="badge bg-warning text-dark mb-2"><?php echo Text::_('JEXPIRED'); ?></span> <?php endif; ?> </div> <?php endif; ?> <div class="article-can-edit d-flex flex-wrap justify-content-between"> <?php // Content is generated by content plugin event "onContentAfterTitle" ?> <?php echo $this->item->event->afterDisplayTitle; ?> <?php if($canEdit && !$this->print) : ?> <?php echo HTMLHelper::_('icon.edit', $this->item, $params); ?> <?php endif; ?> </div> <?php if (JVERSION >= 4) :?> <?php if ($useDefList && ($info == 0 || $info == 2)) : ?> <?php echo LayoutHelper::render('joomla.content.info_block', array('item' => $this->item, 'params' => $params, 'position' => 'above')); ?> <?php endif; ?> <?php else : ?> <?php if ($useDefList && ($info == 0 || $info == 2)) : ?> <?php echo LayoutHelper::render('joomla.content.info_block.block', array('item' => $this->item, 'params' => $params, 'position' => 'above')); ?> <?php endif; ?> <?php endif; ?> <?php // Content is generated by content plugin event "onContentBeforeDisplay" ?> <?php echo $this->item->event->beforeDisplayContent; ?> <?php if (isset($urls) && ((!empty($urls->urls_position) && ($urls->urls_position == '0')) || ($params->get('urls_position') == '0' && empty($urls->urls_position))) || (empty($urls->urls_position) && (!$params->get('urls_position')))) : ?> <?php echo $this->loadTemplate('links'); ?> <?php endif; ?> <?php if ($params->get('access-view')) : ?> <?php if (!empty($this->item->pagination) && $this->item->pagination && !$this->item->paginationposition && !$this->item->paginationrelative) : echo $this->item->pagination; endif; ?> <?php if (isset ($this->item->toc)) : echo $this->item->toc; endif; ?> <?php if( ($tmpl_params->get('social_share') || $params->get('show_vote')) && !$this->print) : ?> <div class="article-ratings-social-share d-flex justify-content-end"> <div class="me-auto align-self-center"> <?php if($params->get('show_vote')): ?> <?php HTMLHelper::_('jquery.token'); ?> <?php echo LayoutHelper::render('joomla.content.rating', array('item' => $this->item, 'params' => $params)) ?> <?php endif; ?> </div> <div class="social-share-block"> <?php echo LayoutHelper::render('joomla.content.social_share', $this->item); ?> </div> </div> <?php endif; ?> <div itemprop="articleBody"> <?php echo $this->item->text; ?> </div> <?php if ($info == 1 || $info == 2) : ?> <?php if ($useDefList) : ?> <?php echo LayoutHelper::render('joomla.content.info_block', array('item' => $this->item, 'params' => $params, 'position' => 'below')); ?> <?php endif; ?> <?php endif; ?> <?php if ($info == 0 && $params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> <?php $this->item->tagLayout = new FileLayout('joomla.content.tags'); ?> <?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?> <?php endif; ?> <?php if (isset($urls) && ((!empty($urls->urls_position) && ($urls->urls_position == '1')) || ($params->get('urls_position') == '1'))) : ?> <?php echo $this->loadTemplate('links'); ?> <?php endif; ?> <?php // Optional teaser intro text for guests ?> <?php elseif ($params->get('show_noauth') == true && $user->get('guest')) : ?> <?php echo LayoutHelper::render('joomla.content.intro_image', $this->item); ?> <?php echo HTMLHelper::_('content.prepare', $this->item->introtext); ?> <?php // Optional link to let them register to see the whole article. ?> <?php if ($params->get('show_readmore') && $this->item->fulltext != null) : ?> <?php $menu = Factory::getApplication()->getMenu(); ?> <?php $active = $menu->getActive(); ?> <?php $itemId = $active->id; ?> <?php $link = new Uri(Route::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); ?> <?php $link->setVar('return', base64_encode(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language) : ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language))); ?> <p class="readmore"> <a href="<?php echo $link; ?>" class="register"> <?php $attribs = json_decode($this->item->attribs ?? ""); ?> <?php if ($attribs->alternative_readmore == null) : echo Text::_('COM_CONTENT_REGISTER_TO_READ_MORE'); elseif ($readmore = $attribs->alternative_readmore) : echo $readmore; if ($params->get('show_readmore_title', 0) != 0) : echo HTMLHelper::_('string.truncate', $this->item->title, $params->get('readmore_limit')); endif; elseif ($params->get('show_readmore_title', 0) == 0) : echo Text::sprintf('COM_CONTENT_READ_MORE_TITLE'); else : echo Text::_('COM_CONTENT_READ_MORE'); echo HTMLHelper::_('string.truncate', $this->item->title, $params->get('readmore_limit')); endif; ?> </a> </p> <?php endif; ?> <?php endif; ?> <?php // Content is generated by content plugin event "onContentAfterDisplay" ?> <?php echo $this->item->event->afterDisplayContent; ?> <?php echo LayoutHelper::render('joomla.content.blog.author_info', $this->item); ?> <?php if (!empty($this->item->pagination) && $this->item->pagination && $this->item->paginationposition) : echo $this->item->pagination; ?> <?php endif; ?> <?php if (!$this->print) : ?> <?php echo LayoutHelper::render('joomla.content.blog.comments.comments', $this->item); ?> <?php endif; ?> </div> <?php if($tmpl_params->get('related_article') && count($relatedArticles) > 0 ): ?> <?php echo LayoutHelper::render('joomla.content.related_articles', ['articles'=>$relatedArticles, 'item'=>$this->item]); ?> <?php endif; ?> PKBA#]�+��Ksystem/helixultimate/overrides_legacy/com_content/featured/default_item.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Associations; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; // Create a shortcut for params. $params = &$this->item->params; $images = json_decode($this->item->images ?? ""); $canEdit = $this->item->params->get('access-edit'); $info = $this->item->params->get('info_block_position', 0); $article_format = (isset($attribs->helix_ultimate_article_format) && $attribs->helix_ultimate_article_format) ? $attribs->helix_ultimate_article_format : 'standard'; // Check if associations are implemented. If they are, define the parameter. $assocParam = (Associations::isEnabled() && $params->get('show_associations')); $currentDate = Factory::getDate()->format('Y-m-d H:i:s'); $isNotPublishedYet = $this->item->publish_up > $currentDate; $isUnpublished = JVERSION < 4 ? ($this->item->state == 0 || strtotime($this->item->publish_up) > strtotime(Factory::getDate()) || ((strtotime($this->item->publish_down) < strtotime(Factory::getDate())) && $this->item->publish_down != Factory::getDbo()->getNullDate())) : ($this->item->state == Joomla\Component\Content\Administrator\Extension\ContentComponent::CONDITION_UNPUBLISHED || $isNotPublishedYet) || ($this->item->publish_down < $currentDate && $this->item->publish_down !== null); $isExpired = JVERSION < 4 ? $this->item->publish_down < $currentDate && $this->item->publish_down !== Factory::getDbo()->getNullDate() : !is_null($this->item->publish_down) && $this->item->publish_down < $currentDate; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <?php if($article_format == 'gallery') : ?> <?php echo LayoutHelper::render('joomla.content.blog.gallery', array('attribs' => $attribs, 'id'=>$this->item->id)); ?> <?php elseif($article_format == 'video') : ?> <?php echo LayoutHelper::render('joomla.content.blog.video', array('attribs' => $attribs)); ?> <?php elseif($article_format == 'audio') : ?> <?php echo LayoutHelper::render('joomla.content.blog.audio', array('attribs' => $attribs)); ?> <?php else: ?> <?php echo LayoutHelper::render('joomla.content.intro_image', $this->item); ?> <?php endif; ?> <?php if ($this->item->featured) :?> <!-- Featured Tag --> <span class="badge bg-danger featured-article-badge"><?php echo Text::_('HELIX_ULTIMATE_FEATURED'); ?></span> <?php endif; ?> <div class="articleBody"> <?php if ($isUnpublished) : ?> <div class="system-unpublished"> <?php endif; ?> <?php echo LayoutHelper::render('joomla.content.blog_style_default_item_title', $this->item); ?> <?php // Content is generated by content plugin event "onContentAfterTitle" ?> <?php echo $this->item->event->afterDisplayTitle; ?> <?php // Todo Not that elegant would be nice to group the params ?> <?php $useDefList = ($params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date') || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam); ?> <?php if ($useDefList && ($info == 0 || $info == 2)) : ?> <?php if(JVERSION >= 4 ) : ?> <?php echo LayoutHelper::render('joomla.content.info_block', array('item' => $this->item, 'params' => $params, 'position' => 'above')); ?> <?php else : ?> <?php echo LayoutHelper::render('joomla.content.info_block.block', array('item' => $this->item, 'params' => $params, 'position' => 'above')); ?> <?php endif; ?> <?php if ($info == 0 && $params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> <?php echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?> <?php endif; ?> <?php endif; ?> <?php // Content is generated by content plugin event "onContentBeforeDisplay" ?> <?php echo $this->item->event->beforeDisplayContent; ?> <?php echo $this->item->introtext; ?> <?php if ($useDefList && ($info == 1 || $info == 2)) : ?> <?php // Todo: for Joomla4 joomla.content.info_block.block can be changed to joomla.content.info_block ?> <?php echo LayoutHelper::render('joomla.content.info_block.block', array('item' => $this->item, 'params' => $params, 'position' => 'below')); ?> <?php if ($params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> <?php echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?> <?php endif; ?> <?php endif; ?> <?php if ($params->get('show_readmore') && $this->item->readmore) : if ($params->get('access-view')) : $link = Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language) : ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language)); else : $menu = Factory::getApplication()->getMenu(); $active = $menu->getActive(); $itemId = $active->id; $link = new Uri(Route::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); $link->setVar('return', base64_encode(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language) : ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language))); endif; ?> <?php echo LayoutHelper::render('joomla.content.readmore', array('item' => $this->item, 'params' => $params, 'link' => $link)); ?> <?php endif; ?> <?php if ($isUnpublished) : ?> </div> <?php endif; ?> </div> <?php // Content is generated by content plugin event "onContentAfterDisplay" ?> <?php echo $this->item->event->afterDisplayContent; ?> PKBA#]z �k77Lsystem/helixultimate/overrides_legacy/com_content/featured/default_links.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <ol class="nav nav-tabs nav-stacked"> <?php foreach ($this->link_items as &$item) : ?> <li> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language) : ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)); ?>"> <?php echo $item->title; ?></a> </li> <?php endforeach; ?> </ol> PKBA#]s�.���Fsystem/helixultimate/overrides_legacy/com_content/featured/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\HTML\HTMLHelper; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); // HTMLHelper::_('behavior.caption'); // If the page class is defined, add to class as suffix. // It will be a separate class if the user starts it with a space ?> <div class="container-fluid blog-featured<?php echo $this->pageclass_sfx; ?>" itemscope itemtype="https://schema.org/Blog"> <?php if ($this->params->get('show_page_heading') != 0) : ?> <div class="page-header"> <h1><?php echo $this->escape($this->params->get('page_heading')); ?></h1> </div> <?php endif; ?> <?php $leadingcount = 0; ?> <?php if (!empty($this->lead_items)) : ?> <div class="article-list"> <div class="items-leading"> <?php foreach ($this->lead_items as &$item) : ?> <div class="leading-<?php echo $leadingcount; ?>"> <div class="article" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting"> <?php $this->item = &$item; $this->item->leading = true; echo $this->loadTemplate('item'); ?> </div> </div> <?php $leadingcount++; ?> <?php endforeach; ?> </div> </div> <?php endif; ?> <?php $introcount = count($this->intro_items); $counter = 0; $this->columns = $this->columns ?? 1; ?> <?php if (!empty($this->intro_items)) : ?> <?php $blogClass = $this->params->get('blog_class', ''); ?> <?php if ((int) $this->params->get('num_columns') > 1) : ?> <?php $blogClass .= 'cols-' . (int) $this->params->get('num_columns'); ?> <?php endif; ?> <div class="article-list"> <div class="row row-<?php echo $counter + 1; ?> <?php echo $blogClass; ?>"> <?php foreach ($this->intro_items as $key => &$item) : ?> <div class="col-lg-<?php echo round(12 / Helper::SetColumn($this->params->get('num_columns'), 3)); ?>"> <div class="article" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting"> <?php $this->item = &$item; echo $this->loadTemplate('item'); ?> </div> </div> <?php $counter++; ?> <?php endforeach; ?> </div> </div> <?php endif; ?> <?php if (!empty($this->link_items)) : ?> <div class="articles-more mb-4"> <?php echo $this->loadTemplate('links'); ?> </div> <?php endif; ?> <?php if ($this->params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2 && $this->pagination->pagesTotal > 1)) : ?> <nav class="pagination-wrapper d-lg-flex justify-content-between w-100"> <?php echo $this->pagination->getPagesLinks(); ?> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <div class="pagination-counter text-muted mb-4"> <?php echo $this->pagination->getPagesCounter(); ?> </div> <?php endif; ?> </nav> <?php endif; ?> </div> PKBA#]�EXY�#�#?system/helixultimate/overrides_legacy/com_content/form/edit.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Multilanguage; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; $doc = Factory::getDocument(); $cssPath = Uri::base() . '/plugins/system/helixultimate/assets/css/frontend-editor.css'; $doc->addStylesheet($cssPath); HTMLHelper::_('behavior.keepalive'); HTMLHelper::_('behavior.formvalidator'); if (JVERSION >= 4) { $doc->getWebAssetManager()->useScript('bootstrap.modal'); } if (JVERSION < 4) { HTMLHelper::_('formbehavior.chosen', '#jform_catid', null, array('disable_search_threshold' => 0)); } $this->tab_name = 'com-content-form'; $this->ignore_fieldsets = array('image-intro', 'image-full', 'jmetadata', 'item_associations'); // Create shortcut to parameters. $params = $this->state->get('params'); //Blog Options $attribs = json_decode($this->item->attribs ?? ""); $this->form->setValue('helix_ultimate_image', 'attribs', !empty($attribs->helix_ultimate_image) ? $attribs->helix_ultimate_image : ''); $this->form->setValue('helix_ultimate_image_alt_txt', 'attribs', !empty($attribs->helix_ultimate_image_alt_txt) ? $attribs->helix_ultimate_image_alt_txt : ''); $this->form->setValue('helix_ultimate_article_format', 'attribs', !empty($attribs->helix_ultimate_article_format) ? $attribs->helix_ultimate_article_format : 'standard'); $this->form->setValue('helix_ultimate_audio', 'attribs', !empty($attribs->helix_ultimate_audio) ? $attribs->helix_ultimate_audio : ''); $this->form->setValue('helix_ultimate_gallery', 'attribs', !empty($attribs->helix_ultimate_gallery) ? $attribs->helix_ultimate_gallery : ''); $this->form->setValue('helix_ultimate_video', 'attribs', !empty($attribs->helix_ultimate_video) ? $attribs->helix_ultimate_video : ''); // This checks if the editor config options have ever been saved. If they haven't they will fall back to the original settings. if (!$params->exists('show_publishing_options')) { $params->set('show_urls_images_frontend', '0'); } $jversion = ""; if (JVERSION >= 4) { $jversion = 'joomla4'; } ?> <div class="hu-content-edit edit item-page<?php echo $this->pageclass_sfx . ' ' . $jversion ; ?>"> <?php if ($params->get('show_page_heading')): ?> <div class="page-header"> <h1> <?php echo $this->escape($params->get('page_heading')); ?> </h1> </div> <?php endif ?> <form action="<?php echo Route::_('index.php?option=com_content&a_id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="adminForm" class="form-validate form-vertical com-content-adminForm"> <fieldset> <?php echo HTMLHelper::_((JVERSION < 4 ? 'bootstrap' : 'uitab') . '.startTabSet', $this->tab_name, array('active' => 'editor')); ?> <?php echo HTMLHelper::_((JVERSION < 4 ? 'bootstrap' : 'uitab') . '.addTab', $this->tab_name, 'editor', Text::_('COM_CONTENT_ARTICLE_CONTENT')); ?> <?php echo $this->form->renderField('title'); ?> <?php if (is_null($this->item->id)) : ?> <?php echo $this->form->renderField('alias'); ?> <?php endif; ?> <?php echo $this->form->getInput('articletext'); ?> <?php if ($this->captchaEnabled) : ?> <?php echo $this->form->renderField('captcha'); ?> <?php endif; ?> <?php echo HTMLHelper::_((JVERSION < 4 ? 'bootstrap' : 'uitab') . '.endTab'); ?> <?php if ($params->get('show_urls_images_frontend')) : ?> <?php echo HTMLHelper::_((JVERSION < 4 ? 'bootstrap' : 'uitab') . '.addTab', $this->tab_name, 'images', Text::_('COM_CONTENT_IMAGES_AND_URLS')); ?> <div class="row"> <div class="col-sm-6 mb-3"> <?php echo $this->form->renderField('image_intro', 'images'); ?> <?php echo $this->form->renderField('image_intro_alt', 'images'); ?> <?php echo $this->form->renderField('image_intro_caption', 'images'); ?> <?php echo $this->form->renderField('float_intro', 'images'); ?> </div> <div class="col-sm-6"> <?php echo $this->form->renderField('image_fulltext', 'images'); ?> <?php echo $this->form->renderField('image_fulltext_alt', 'images'); ?> <?php echo $this->form->renderField('image_fulltext_caption', 'images'); ?> <?php echo $this->form->renderField('float_fulltext', 'images'); ?> </div> </div> <hr> <div class="row"> <div class="col-sm-4 mb-3"> <?php echo $this->form->renderField('urla', 'urls'); ?> <?php echo $this->form->renderField('urlatext', 'urls'); ?> <div class="control-group"> <div class="controls"> <?php echo $this->form->getInput('targeta', 'urls'); ?> </div> </div> </div> <div class="col-sm-4 mb-3"> <?php echo $this->form->renderField('urlb', 'urls'); ?> <?php echo $this->form->renderField('urlbtext', 'urls'); ?> <div class="control-group"> <div class="controls"> <?php echo $this->form->getInput('targetb', 'urls'); ?> </div> </div> </div> <div class="col-sm-4 mb-3"> <?php echo $this->form->renderField('urlc', 'urls'); ?> <?php echo $this->form->renderField('urlctext', 'urls'); ?> <div class="control-group"> <div class="controls"> <?php echo $this->form->getInput('targetc', 'urls'); ?> </div> </div> </div> </div> <?php echo HTMLHelper::_((JVERSION < 4 ? 'bootstrap' : 'uitab') . '.endTab'); ?> <?php endif; ?> <?php echo LayoutHelper::render('joomla.edit.params', $this); ?> <?php echo HTMLHelper::_((JVERSION < 4 ? 'bootstrap' : 'uitab') . '.addTab', $this->tab_name, 'publishing', Text::_('COM_CONTENT_PUBLISHING')); ?> <?php echo $this->form->renderField('catid'); ?> <?php echo $this->form->renderField('tags'); ?> <?php if ($params->get('save_history', 0)) : ?> <?php echo $this->form->renderField('version_note'); ?> <?php endif; ?> <?php if ($params->get('show_publishing_options', 1) == 1) : ?> <?php echo $this->form->renderField('created_by_alias'); ?> <?php endif; ?> <?php if ($this->item->params->get('access-change')) : ?> <?php echo $this->form->renderField('state'); ?> <?php echo $this->form->renderField('featured'); ?> <?php if ($params->get('show_publishing_options', 1) == 1) : ?> <?php echo $this->form->renderField('publish_up'); ?> <?php echo $this->form->renderField('publish_down'); ?> <?php endif; ?> <?php endif; ?> <?php echo $this->form->renderField('access'); ?> <?php if (is_null($this->item->id)) : ?> <div class="control-group"> <div class="control-label"> </div> <div class="controls"> <?php echo Text::_('COM_CONTENT_ORDERING'); ?> </div> </div> <?php endif; ?> <?php echo HTMLHelper::_((JVERSION < 4 ? 'bootstrap' : 'uitab') . '.endTab'); ?> <?php if (JVERSION < 4): ?> <?php echo HTMLHelper::_('bootstrap.addTab', $this->tab_name, 'language', Text::_('JFIELD_LANGUAGE_LABEL')); ?> <?php echo $this->form->renderField('language'); ?> <?php echo HTMLHelper::_('bootstrap.endTab'); ?> <?php else: ?> <?php if (Multilanguage::isEnabled()) : ?> <?php echo HTMLHelper::_('uitab.addTab', $this->tab_name, 'language', Text::_('JFIELD_LANGUAGE_LABEL')); ?> <?php echo $this->form->renderField('language'); ?> <?php echo HTMLHelper::_('uitab.endTab'); ?> <?php else: ?> <?php echo $this->form->renderField('language'); ?> <?php endif; ?> <?php endif ?> <?php if ($params->get('show_publishing_options', 1) == 1) : ?> <?php echo HTMLHelper::_((JVERSION < 4 ? 'bootstrap' : 'uitab') . '.addTab', $this->tab_name, 'metadata', Text::_('COM_CONTENT_METADATA')); ?> <?php echo $this->form->renderField('metadesc'); ?> <?php echo $this->form->renderField('metakey'); ?> <?php echo HTMLHelper::_((JVERSION < 4 ? 'bootstrap' : 'uitab') . '.endTab'); ?> <?php endif; ?> <?php echo HTMLHelper::_((JVERSION < 4 ? 'bootstrap' : 'uitab') . '.endTabSet'); ?> <input type="hidden" name="task" value=""> <input type="hidden" name="return" value="<?php echo $this->return_page; ?>"> <?php echo HTMLHelper::_('form.token'); ?> </fieldset> <div class="btn-toolbar mt-2"> <button type="button" class="btn btn-primary" onclick="Joomla.submitbutton('article.save')"> <span class="fas fa-check" aria-hidden="true"></span> <?php echo Text::_('JSAVE') ?> </button> <button type="button" class="btn btn-secondary ms-2" onclick="Joomla.submitbutton('article.cancel')"> <span class="fas fa-times" aria-hidden="true"></span> <?php echo Text::_('JCANCEL') ?> </button> <?php if ($params->get('save_history', 0) && $this->item->id) : ?> <?php echo $this->form->getInput('contenthistory'); ?> <?php endif; ?> </div> </form> </div> PKBA#]A�e77Hsystem/helixultimate/overrides_legacy/com_content/category/blog_item.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Associations; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; // Create a shortcut for params. $params = $this->item->params; $attribs = json_decode($this->item->attribs ?? ""); HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers/html'); $canEdit = $this->item->params->get('access-edit'); $info = $params->get('info_block_position', 0); $article_format = (isset($attribs->helix_ultimate_article_format) && $attribs->helix_ultimate_article_format) ? $attribs->helix_ultimate_article_format : 'standard'; $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $tmpl_params = $template->params; // Check if associations are implemented. If they are, define the parameter. $assocParam = (Associations::isEnabled() && $params->get('show_associations')); $currentDate = Factory::getDate()->format('Y-m-d H:i:s'); $isUnpublished = JVERSION < 4 ? ($this->item->state == 0 || strtotime($this->item->publish_up) > strtotime(Factory::getDate()) || ((strtotime($this->item->publish_down) < strtotime(Factory::getDate())) && $this->item->publish_down != Factory::getDbo()->getNullDate())) : ($this->item->state == Joomla\Component\Content\Administrator\Extension\ContentComponent::CONDITION_UNPUBLISHED || $this->item->publish_up > $currentDate) || ($this->item->publish_down < $currentDate && $this->item->publish_down !== null); $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <?php if($article_format == 'gallery') : ?> <?php echo LayoutHelper::render('joomla.content.blog.gallery', array('attribs' => $attribs, 'id'=>$this->item->id)); ?> <?php elseif($article_format == 'video') : ?> <?php echo LayoutHelper::render('joomla.content.blog.video', array('attribs' => $attribs)); ?> <?php elseif($article_format == 'audio') : ?> <?php echo LayoutHelper::render('joomla.content.blog.audio', array('attribs' => $attribs)); ?> <?php else: ?> <?php echo LayoutHelper::render('joomla.content.intro_image', $this->item); ?> <?php endif; ?> <?php if ($this->item->featured) :?> <!-- Featured Tag --> <span class="badge bg-danger featured-article-badge"><?php echo Text::_('HELIX_ULTIMATE_FEATURED'); ?></span> <?php endif; ?> <div class="article-body"> <?php if ($isUnpublished) : ?> <div class="system-unpublished"> <?php endif; ?> <?php echo LayoutHelper::render('joomla.content.blog_style_default_item_title', $this->item); ?> <?php // Todo Not that elegant would be nice to group the params ?> <?php $useDefList = ($params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date') || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam); ?> <?php if ($useDefList && ($info == 0 || $info == 2)) : ?> <?php echo LayoutHelper::render('joomla.content.info_block', array('item' => $this->item, 'params' => $params, 'position' => 'above', 'intro' => true)); ?> <?php endif; ?> <?php if ($params->get('show_tags', 1) && !$tmpl_params->get('show_list_tags',0) && !empty($this->item->tags->itemTags)) : ?> <?php $this->item->tagLayout = new FileLayout('joomla.content.tags'); ?> <?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?> <?php endif; ?> <?php if (!$params->get('show_intro')) : ?> <?php // Content is generated by content plugin event "onContentAfterTitle" ?> <?php echo $this->item->event->afterDisplayTitle; ?> <?php endif; ?> <?php // Content is generated by content plugin event "onContentBeforeDisplay" ?> <?php echo $this->item->event->beforeDisplayContent; ?> <div class="article-introtext"> <?php echo $this->item->introtext; ?> <?php if ($useDefList && ($info == 1)) : ?> <?php echo LayoutHelper::render('joomla.content.info_block', array('item' => $this->item, 'params' => $params, 'position' => 'below', 'intro' => true)); ?> <?php endif; ?> <?php if ($params->get('show_readmore') && $this->item->readmore) : if ($params->get('access-view')) : $link = Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language) : ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language)); else : $menu = Factory::getApplication()->getMenu(); $active = $menu->getActive(); $itemId = $active->id; $link = new Uri(Route::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); $link->setVar('return', base64_encode(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language) : ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language))); endif; ?> <?php echo LayoutHelper::render('joomla.content.readmore', array('item' => $this->item, 'params' => $params, 'link' => $link)); ?> <?php endif; ?> </div> <?php if ($isUnpublished) : ?> </div> <?php endif; ?> </div> <?php // Content is generated by content plugin event "onContentAfterDisplay" ?> <?php echo $this->item->event->afterDisplayContent; ?> PKBA#]p�S!xxOsystem/helixultimate/overrides_legacy/com_content/category/default_children.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $class = ' class="first"'; $lang = Factory::getLanguage(); $user = Factory::getUser(); $groups = $user->getAuthorisedViewLevels(); $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <?php if (count($this->children[$this->category->id]) > 0) : ?> <?php foreach ($this->children[$this->category->id] as $id => $child) : ?> <?php // Check whether category access level allows access to subcategories. ?> <?php if (in_array($child->access, $groups)) : ?> <?php if ($this->params->get('show_empty_categories') || $child->getNumItems(true) || count($child->getChildren())) : if (!isset($this->children[$this->category->id][$id + 1])) : $class = ' class="last"'; endif; ?> <div<?php echo $class; ?>> <?php $class = ''; ?> <?php if ($lang->isRtl()) : ?> <h3 class="page-header item-title"> <?php if ( $this->params->get('show_cat_num_articles', 1)) : ?> <span class="badge bg-info tip hasTooltip" title="<?php echo HTMLHelper::_('tooltipText', 'COM_CONTENT_NUM_ITEMS_TIP'); ?>"> <?php echo $child->getNumItems(true); ?> </span> <?php endif; ?> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getCategoryRoute($child->id) : ContentHelperRoute::getCategoryRoute($child->id)); ?>"> <?php echo $this->escape($child->title); ?></a> <?php if (count($child->getChildren()) > 0 && $this->maxLevel > 1) : ?> <a href="#category-<?php echo $child->id; ?>" data-bs-toggle="collapse" data-bs-toggle="button" class="btn btn-xs float-end" aria-label="<?php echo Text::_('JGLOBAL_EXPAND_CATEGORIES'); ?>"><span class="icon-plus" aria-hidden="true"></span></a> <?php endif; ?> </h3> <?php else : ?> <h3 class="page-header item-title"><a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getCategoryRoute($child->id) : ContentHelperRoute::getCategoryRoute($child->id)); ?>"> <?php echo $this->escape($child->title); ?></a> <?php if ( $this->params->get('show_cat_num_articles', 1)) : ?> <span class="badge bg-info tip hasTooltip" title="<?php echo HTMLHelper::_('tooltipText', 'COM_CONTENT_NUM_ITEMS_TIP'); ?>"> <?php echo $child->getNumItems(true); ?> </span> <?php endif; ?> <?php if (count($child->getChildren()) > 0 && $this->maxLevel > 1) : ?> <a href="#category-<?php echo $child->id; ?>" data-bs-toggle="collapse" data-bs-toggle="button" class="btn btn-xs float-end" aria-label="<?php echo Text::_('JGLOBAL_EXPAND_CATEGORIES'); ?>"><span class="icon-plus" aria-hidden="true"></span></a> <?php endif; ?> </h3> <?php endif; ?> <?php if ($this->params->get('show_subcat_desc') == 1) : ?> <?php if ($child->description) : ?> <div class="category-desc"> <?php echo HTMLHelper::_('content.prepare', $child->description, '', 'com_content.category'); ?> </div> <?php endif; ?> <?php endif; ?> <?php if (count($child->getChildren()) > 0 && $this->maxLevel > 1) : ?> <div class="collapse fade" id="category-<?php echo $child->id; ?>"> <?php $this->children[$child->id] = $child->getChildren(); $this->category = $child; $this->maxLevel--; echo $this->loadTemplate('children'); $this->category = $child->getParent(); $this->maxLevel++; ?> </div> <?php endif; ?> </div> <?php endif; ?> <?php endif; ?> <?php endforeach; ?> <?php endif; ?> PKBA#]��e$HHIsystem/helixultimate/overrides_legacy/com_content/category/blog_links.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <ul class="list-group"> <?php foreach ($this->link_items as &$item) : ?> <li class="list-group-item"> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language) : ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)); ?>"> <?php echo $item->title; ?></a> </li> <?php endforeach; ?> </ul> PKBA#]ؽ��g:g:Osystem/helixultimate/overrides_legacy/com_content/category/default_articles.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Associations; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers/html'); // Include the content helper for associations in Joomla 3 if (version_compare(JVERSION, '4.0.0', '<')) { require_once JPATH_SITE . '/components/com_content/helpers/association.php'; } // Create some shortcuts. $n = count($this->items); $listOrder = $this->escape($this->state->get('list.ordering')); $listDirn = $this->escape($this->state->get('list.direction')); // Check for at least one editable article $isEditable = false; if (!empty($this->items)) { foreach ($this->items as $article) { if ($article->params->get('access-edit')) { $isEditable = true; break; } } } $currentDate = Factory::getDate()->format('Y-m-d H:i:s'); $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <form action="<?php echo htmlspecialchars(Uri::getInstance()->toString() ?? ""); ?>" method="post" name="adminForm" id="adminForm"> <?php if ($this->params->get('filter_field') !== 'hide' || $this->params->get('show_pagination_limit')) : ?> <div class="d-flex justify-content-between align-items-centerd-flex mb-4"> <div class="me-auto align-self-center"> <strong><?php echo Text::_('COM_CONTENT_FORM_FILTER_LEGEND'); ?></strong> </div> <div> <div class="filters row gx-3"> <?php if ($this->params->get('filter_field') !== 'hide') : ?> <?php if ($this->params->get('filter_field') !== 'tag') : ?> <div class="col"> <label class="filter-search-lbl visually-hidden" for="filter-search"> <?php echo Text::_('COM_CONTENT_' . $this->params->get('filter_field') . '_FILTER_LABEL') . ' '; ?> </label> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->state->get('list.filter')); ?>" class="form-control" onchange="document.adminForm.submit();" title="<?php echo Text::_('COM_CONTENT_FILTER_SEARCH_DESC'); ?>" placeholder="<?php echo Text::_('COM_CONTENT_' . $this->params->get('filter_field') . '_FILTER_LABEL'); ?>"> </div> <?php else : ?> <div class="col"> <select name="filter_tag" id="filter_tag" onchange="document.adminForm.submit();" > <option value=""><?php echo Text::_('JOPTION_SELECT_TAG'); ?></option> <?php echo HTMLHelper::_('select.options', HTMLHelper::_('tag.options', true, true), 'value', 'text', $this->state->get('filter.tag')); ?> </select> </div> <?php endif; ?> <?php endif; ?> <?php if ($this->params->get('show_pagination_limit')) : ?> <div class="col"> <label for="limit" class="visually-hidden"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM'); ?> </label> <?php echo $this->pagination->getLimitBox(); ?> </div> <?php endif; ?> <div class="col-auto"> <input type="hidden" name="filter_order" value=""> <input type="hidden" name="filter_order_Dir" value=""> <input type="hidden" name="limitstart" value=""> <input type="hidden" name="task" value=""> <button type="submit" name="filter_submit" class="btn btn-secondary"><?php echo Text::_('COM_CONTENT_FORM_FILTER_SUBMIT'); ?></button> </div> </div> </div> </div> <?php endif; ?> <?php if (empty($this->items)) : ?> <?php if ($this->params->get('show_no_articles', 1)) : ?> <p><?php echo Text::_('COM_CONTENT_NO_ARTICLES'); ?></p> <?php endif; ?> <?php else : ?> <table class="category table table-bordered"> <?php $headerTitle = ''; $headerDate = ''; $headerAuthor = ''; $headerHits = ''; $headerVotes = ''; $headerRatings = ''; $headerEdit = ''; ?> <?php if ($this->params->get('show_headings')) : ?> <?php $headerTitle = 'headers="categorylist_header_title"'; $headerDate = 'headers="categorylist_header_date"'; $headerAuthor = 'headers="categorylist_header_author"'; $headerHits = 'headers="categorylist_header_hits"'; $headerVotes = 'headers="categorylist_header_votes"'; $headerRatings = 'headers="categorylist_header_ratings"'; $headerEdit = 'headers="categorylist_header_edit"'; ?> <thead> <tr> <th scope="col" id="categorylist_header_title"> <?php echo HTMLHelper::_('grid.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder, null, 'asc', '', 'adminForm'); ?> </th> <?php if ($date = $this->params->get('list_show_date')) : ?> <th scope="col" id="categorylist_header_date"> <?php if ($date === 'created') : ?> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTENT_' . $date . '_DATE', 'a.created', $listDirn, $listOrder); ?> <?php elseif ($date === 'modified') : ?> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTENT_' . $date . '_DATE', 'a.modified', $listDirn, $listOrder); ?> <?php elseif ($date === 'published') : ?> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTENT_' . $date . '_DATE', 'a.publish_up', $listDirn, $listOrder); ?> <?php endif; ?> </th> <?php endif; ?> <?php if ($this->params->get('list_show_author')) : ?> <th scope="col" id="categorylist_header_author"> <?php echo HTMLHelper::_('grid.sort', 'JAUTHOR', 'author', $listDirn, $listOrder); ?> </th> <?php endif; ?> <?php if ($this->params->get('list_show_hits')) : ?> <th scope="col" id="categorylist_header_hits"> <?php echo HTMLHelper::_('grid.sort', 'JGLOBAL_HITS', 'a.hits', $listDirn, $listOrder); ?> </th> <?php endif; ?> <?php if ($this->params->get('list_show_votes', 0) && $this->vote) : ?> <th scope="col" id="categorylist_header_votes"> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTENT_VOTES', 'rating_count', $listDirn, $listOrder); ?> </th> <?php endif; ?> <?php if ($this->params->get('list_show_ratings', 0) && $this->vote) : ?> <th scope="col" id="categorylist_header_ratings"> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTENT_RATINGS', 'rating', $listDirn, $listOrder); ?> </th> <?php endif; ?> <?php if ($isEditable) : ?> <th scope="col" id="categorylist_header_edit"><?php echo Text::_('COM_CONTENT_EDIT_ITEM'); ?></th> <?php endif; ?> </tr> </thead> <?php endif; ?> <tbody> <?php foreach ($this->items as $i => $article) : ?> <?php if ($this->items[$i]->state == 0) : ?> <tr class="system-unpublished cat-list-row<?php echo $i % 2; ?>"> <?php else : ?> <tr class="cat-list-row<?php echo $i % 2; ?>" > <?php endif; ?> <td headers="categorylist_header_title" class="list-title"> <?php if (in_array($article->access, $this->user->getAuthorisedViewLevels())) : ?> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($article->slug, $article->catid, $article->language) : ContentHelperRoute::getArticleRoute($article->slug, $article->catid, $article->language)); ?>"> <?php echo $this->escape($article->title); ?> </a> <?php if (Associations::isEnabled() && $this->params->get('show_associations')) : ?> <?php if (version_compare($JoomlaVersion, '4.0.0', '>=')) { $associations = \Joomla\Component\Content\Site\Helper\AssociationHelper::displayAssociations($article->id); } else { $associations = ContentHelperAssociation::displayAssociations($article->id); } ?> <?php foreach ($associations as $association) : ?> <?php if ($this->params->get('flags', 1)) : ?> <?php $flag = HTMLHelper::_('image', 'mod_languages/' . $association['language']->image . '.gif', $association['language']->title_native, array('title' => $association['language']->title_native), true); ?> <a href="<?php echo Route::_($association['item']); ?>"><?php echo $flag; ?></a> <?php else : ?> <?php $class = 'label label-association label-' . $association['language']->sef; ?> <a class="' . <?php echo $class; ?> . '" href="<?php echo Route::_($association['item']); ?>"><?php echo strtoupper($association['language']->sef); ?></a> <?php endif; ?> <?php endforeach; ?> <?php endif; ?> <?php else : ?> <?php echo $this->escape($article->title) . ' : '; $itemId = Factory::getApplication()->getMenu()->getActive()->id; $link = new Uri(Route::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); $link->setVar('return', base64_encode(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($article->slug, $article->catid, $article->language) : ContentHelperRoute::getArticleRoute($article->slug, $article->catid, $article->language))); ?> <a href="<?php echo $link; ?>" class="register"> <?php echo Text::_('COM_CONTENT_REGISTER_TO_READ_MORE'); ?> </a> <?php if (Associations::isEnabled() && $this->params->get('show_associations')) : ?> <?php if (version_compare($JoomlaVersion, '4.0.0', '>=')) { $associations = \Joomla\Component\Content\Site\Helper\AssociationHelper::displayAssociations($article->id); } else { $associations = ContentHelperAssociation::displayAssociations($article->id); } ?> <?php foreach ($associations as $association) : ?> <?php if ($this->params->get('flags', 1)) : ?> <?php $flag = HTMLHelper::_('image', 'mod_languages/' . $association['language']->image . '.gif', $association['language']->title_native, array('title' => $association['language']->title_native), true); ?> <a href="<?php echo Route::_($association['item']); ?>"><?php echo $flag; ?></a> <?php else : ?> <?php $class = 'label label-association label-' . $association['language']->sef; ?> <a class="' . <?php echo $class; ?> . '" href="<?php echo Route::_($association['item']); ?>"><?php echo strtoupper($association['language']->sef); ?></a> <?php endif; ?> <?php endforeach; ?> <?php endif; ?> <?php endif; ?> <!-- check for the Joomla version --> <?php if (JVERSION < 4): ?> <?php if ($article->state == 0) : ?> <span class="list-published badge bg-warning text-dark"> <?php echo Text::_('JUNPUBLISHED'); ?> </span> <?php endif; ?> <?php if (strtotime($article->publish_up) > strtotime(Factory::getDate())) : ?> <span class="list-published badge bg-warning text-dark"> <?php echo Text::_('JNOTPUBLISHEDYET'); ?> </span> <?php endif; ?> <?php if ((strtotime($article->publish_down) < strtotime(Factory::getDate())) && $article->publish_down != Factory::getDbo()->getNullDate()) : ?> <span class="list-published badge bg-warning text-dark"> <?php echo Text::_('JEXPIRED'); ?> </span> <?php endif; ?> <?php else: ?> <?php if ($article->state == Joomla\Component\Content\Administrator\Extension\ContentComponent::CONDITION_UNPUBLISHED) : ?> <div> <span class="list-published badge bg-warning text-dark"> <?php echo Text::_('JUNPUBLISHED'); ?> </span> </div> <?php endif; ?> <?php if ($article->publish_up > $currentDate) : ?> <div> <span class="list-published badge bg-warning text-dark"> <?php echo Text::_('JNOTPUBLISHEDYET'); ?> </span> </div> <?php endif; ?> <?php if (!is_null($article->publish_down) && $article->publish_down < $currentDate) : ?> <div> <span class="list-published badge bg-warning text-dark"> <?php echo Text::_('JEXPIRED'); ?> </span> </div> <?php endif; ?> <?php endif ?> </td> <?php if ($this->params->get('list_show_date')) : ?> <td headers="categorylist_header_date" class="list-date small"> <?php echo HTMLHelper::_( 'date', $article->displayDate, $this->escape($this->params->get('date_format', Text::_('DATE_FORMAT_LC3'))) ); ?> </td> <?php endif; ?> <?php if ($this->params->get('list_show_author', 1)) : ?> <td headers="categorylist_header_author" class="list-author"> <?php if (!empty($article->author) || !empty($article->created_by_alias)) : ?> <?php $author = $article->author ?> <?php $author = $article->created_by_alias ?: $author; ?> <?php if (!empty($article->contact_link) && $this->params->get('link_author') == true) : ?> <?php echo Text::sprintf('COM_CONTENT_WRITTEN_BY', HTMLHelper::_('link', $article->contact_link, $author)); ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_WRITTEN_BY', $author); ?> <?php endif; ?> <?php endif; ?> </td> <?php endif; ?> <?php if ($this->params->get('list_show_hits', 1)) : ?> <td headers="categorylist_header_hits" class="list-hits"> <span class="badge bg-primary"> <?php echo Text::sprintf('JGLOBAL_HITS_COUNT', $article->hits); ?> </span> </td> <?php endif; ?> <?php if ($this->params->get('list_show_votes', 0) && $this->vote) : ?> <td headers="categorylist_header_votes" class="list-votes"> <span class="badge bg-success"> <?php echo Text::sprintf('COM_CONTENT_VOTES_COUNT', $article->rating_count); ?> </span> </td> <?php endif; ?> <?php if ($this->params->get('list_show_ratings', 0) && $this->vote) : ?> <td headers="categorylist_header_ratings" class="list-ratings"> <span class="badge bg-warning"> <?php echo Text::sprintf('COM_CONTENT_RATINGS_COUNT', $article->rating); ?> </span> </td> <?php endif; ?> <?php if ($isEditable) : ?> <td headers="categorylist_header_edit" class="list-edit"> <?php if ($article->params->get('access-edit')) : ?> <?php echo HTMLHelper::_('icon.edit', $article, $article->params); ?> <?php endif; ?> </td> <?php endif; ?> </tr> <?php endforeach; ?> </tbody> </table> <?php endif; ?> <?php if (!empty($this->items)) : ?> <?php if (($this->params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> <nav class="d-flex pagination-wrapper"> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <div class="me-auto"> <?php echo $this->pagination->getPagesLinks(); ?> </div> <div class="pagination-counter"> <?php echo $this->pagination->getPagesCounter(); ?> </div> <?php endif; ?> </nav> <?php endif; ?> <?php endif; ?> </form> PKBA#]��F�� � Lsystem/helixultimate/overrides_legacy/com_content/category/blog_children.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $class = ' class="first"'; $lang = Factory::getLanguage(); $version = new Version(); $JoomlaVersion = $version->getShortVersion(); if ($this->maxLevel != 0 && count($this->children[$this->category->id]) > 0) : ?> <?php foreach ($this->children[$this->category->id] as $id => $child) : ?> <?php if ($this->params->get('show_empty_categories') || $child->numitems || count($child->getChildren())) : if (!isset($this->children[$this->category->id][$id + 1])) : $class = ' class="last"'; endif; ?> <div<?php echo $class; ?>> <?php $class = ''; ?> <?php if ($lang->isRtl()) : ?> <h3 class="page-header item-title"> <?php if ( $this->params->get('show_cat_num_articles', 1)) : ?> <span class="badge bg-info tip hasTooltip" title="<?php echo HTMLHelper::_('tooltipText', 'COM_CONTENT_NUM_ITEMS_TIP'); ?>"> <?php echo $child->getNumItems(true); ?> </span> <?php endif; ?> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getCategoryRoute($child->id) : ContentHelperRoute::getCategoryRoute($child->id)); ?>"> <?php echo $this->escape($child->title); ?></a> <?php if ($this->maxLevel > 1 && count($child->getChildren()) > 0) : ?> <a href="#category-<?php echo $child->id; ?>" data-bs-toggle="collapse" data-bs-toggle="button" class="btn btn-xs float-end"><span class="icon-plus"></span></a> <?php endif; ?> </h3> <?php else : ?> <h3 class="page-header item-title"><a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getCategoryRoute($child->id) : ContentHelperRoute::getCategoryRoute($child->id)); ?>"> <?php echo $this->escape($child->title); ?></a> <?php if ( $this->params->get('show_cat_num_articles', 1)) : ?> <span class="badge bg-info tip hasTooltip" title="<?php echo HTMLHelper::_('tooltipText', 'COM_CONTENT_NUM_ITEMS_TIP'); ?>"> <?php echo Text::_('COM_CONTENT_NUM_ITEMS'); ?> <?php echo $child->getNumItems(true); ?> </span> <?php endif; ?> <?php if ($this->maxLevel > 1 && count($child->getChildren()) > 0) : ?> <a href="#category-<?php echo $child->id; ?>" data-bs-toggle="collapse" data-bs-toggle="button" class="btn btn-xs float-end"><span class="icon-plus"></span></a> <?php endif; ?> </h3> <?php endif; ?> <?php if ($this->params->get('show_subcat_desc') == 1) : ?> <?php if ($child->description) : ?> <div class="category-desc"> <?php echo HTMLHelper::_('content.prepare', $child->description, '', 'com_content.category'); ?> </div> <?php endif; ?> <?php endif; ?> <?php if ($this->maxLevel > 1 && count($child->getChildren()) > 0) : ?> <div class="collapse fade" id="category-<?php echo $child->id; ?>"> <?php $this->children[$child->id] = $child->getChildren(); $this->category = $child; $this->maxLevel--; echo $this->loadTemplate('children'); $this->category = $child->getParent(); $this->maxLevel++; ?> </div> <?php endif; ?> </div> <?php endif; ?> <?php endforeach; ?> <?php endif;PKBA#]���wwFsystem/helixultimate/overrides_legacy/com_content/category/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Layout\LayoutHelper; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); // HTMLHelper::_('behavior.caption'); ?> <div class="category-list<?php echo $this->pageclass_sfx; ?>"> <?php $this->subtemplatename = 'articles'; echo LayoutHelper::render('joomla.content.category_default', $this); ?> </div> PKBA#]]gJP��Csystem/helixultimate/overrides_legacy/com_content/category/blog.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Layout\LayoutHelper; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); $app = Factory::getApplication(); $this->category->text = $this->category->description; $app->triggerEvent('onContentPrepare', array($this->category->extension . '.categories', &$this->category, &$this->params, 0)); $this->category->description = $this->category->text; $results = $app->triggerEvent('onContentAfterTitle', array($this->category->extension . '.categories', &$this->category, &$this->params, 0)); $afterDisplayTitle = trim(implode("\n", $results)); $results = $app->triggerEvent('onContentBeforeDisplay', array($this->category->extension . '.categories', &$this->category, &$this->params, 0)); $beforeDisplayContent = trim(implode("\n", $results)); $results = $app->triggerEvent('onContentAfterDisplay', array($this->category->extension . '.categories', &$this->category, &$this->params, 0)); $afterDisplayContent = trim(implode("\n", $results)); $columns = !empty((int) $this->params->get('num_columns')) ? (int) $this->params->get('num_columns') : 3; $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $blogListType = $template->params->get('blog_list_type') ?? 'default'; ?> <style>.article-list.grid {--columns: <?php echo $columns; ?>;}</style> <div class="blog<?php echo $this->pageclass_sfx; ?>"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1><?php echo $this->escape($this->params->get('page_heading')); ?></h1> </div> <?php endif; ?> <?php if ($this->params->get('show_category_title', 1) or $this->params->get('page_subheading')) : ?> <h2> <?php echo $this->escape($this->params->get('page_subheading')); ?> <?php if ($this->params->get('show_category_title')) : ?> <span class="subheading-category"><?php echo $this->category->title; ?></span> <?php endif; ?> </h2> <?php endif; ?> <?php echo $afterDisplayTitle; ?> <?php if ($this->params->get('show_cat_tags', 1) && !empty($this->category->tags->itemTags)) : ?> <?php $this->category->tagLayout = new FileLayout('joomla.content.tags'); ?> <?php echo $this->category->tagLayout->render($this->category->tags->itemTags); ?> <?php endif; ?> <?php if ($beforeDisplayContent || $afterDisplayContent || $this->params->get('show_description', 1) || $this->params->def('show_description_image', 1)) : ?> <div class="category-desc clearfix"> <?php if ($this->params->get('show_description_image') && $this->category->getParams()->get('image')) : ?> <img src="<?php echo $this->category->getParams()->get('image'); ?>" alt="<?php echo htmlspecialchars($this->category->getParams()->get('image_alt') ?? "", ENT_COMPAT, 'UTF-8'); ?>"> <?php endif; ?> <?php echo $beforeDisplayContent; ?> <?php if ($this->params->get('show_description') && $this->category->description) : ?> <?php echo HTMLHelper::_('content.prepare', $this->category->description, '', 'com_content.category'); ?> <?php endif; ?> <?php echo $afterDisplayContent; ?> </div> <?php endif; ?> <?php if (empty($this->lead_items) && empty($this->link_items) && empty($this->intro_items)) : ?> <?php if ($this->params->get('show_no_articles', 1)) : ?> <p><?php echo Text::_('COM_CONTENT_NO_ARTICLES'); ?></p> <?php endif; ?> <?php endif; ?> <?php $leadingcount = 0; ?> <?php if (!empty($this->lead_items)) : ?> <div class="article-list articles-leading<?php echo $this->params->get('blog_class_leading'); ?>"> <?php foreach ($this->lead_items as &$item) : ?> <div class="article<?php echo $item->state == 0 ? ' system-unpublished' : null; ?>" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting"> <?php $this->item = & $item; $this->item->leading = true; echo $this->loadTemplate('item'); ?> </div> <?php $leadingcount++; ?> <?php endforeach; ?> </div> <?php endif; ?> <?php $introcount = count($this->intro_items); ?> <?php if (!empty($this->intro_items)) : ?> <?php $blogClass = $this->params->get('blog_class', ''); ?> <?php if ((int) $this->params->get('num_columns') > 1) : ?> <?php $blogClass .= ' cols-' . (int) $this->params->get('num_columns'); ?> <?php endif; ?> <?php if ($blogListType === 'masonry') : ?> <?php $numCols = (int) $this->params->get('num_columns', 1); $orderDown = (int) $this->params->get('multi_column_order', 1); // 1 = down → across, 0 = across → down $introcount = count($this->intro_items); $numRows = (int) ceil($introcount / max(1, $numCols)); ?> <div class="article-list grid <?php echo $blogClass; ?>"> <?php for ($row = 0; $row < $numRows; $row++) : ?> <?php for ($col = 0; $col < $numCols; $col++) : // Index calc (fixed) for masonry style $index = $orderDown ? ($row + $col * $numRows) : ($row * $numCols + $col); if ($index >= $introcount) { continue; } $item = &$this->intro_items[$index]; ?> <div class="article flow" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting"> <?php $this->item = &$item; // Render a custom layout for masonry cards if you have one; falls back otherwise echo LayoutHelper::render('masonry.bloglist', array($item, ($index + 1)), defined('HELIX_LAYOUTS_PATH') ? HELIX_LAYOUTS_PATH : null); ?> </div> <?php endfor; ?> <?php endfor; ?> </div> <?php else : ?> <div class="article-list <?php echo $blogClass; ?>"> <?php $numCols = (int) $this->params->get('num_columns', 1); $orderDown = (int) $this->params->get('multi_column_order', 1); // 1 = down → across, 0 = across → down $introcount = count($this->intro_items); $numRows = (int) ceil($introcount / max(1, $numCols)); $columnClass = 'col-lg-' . max(1, (12 / max(1, $numCols))); for ($row = 0; $row < $numRows; $row++) : ?> <div class="row"> <?php for ($col = 0; $col < $numCols; $col++) : // Index calc (fixed) for grid style $index = $orderDown ? ($row * $numCols + $col) : ($row + $col * $numRows); if ($index >= $introcount) { continue; } $item = &$this->intro_items[$index]; ?> <div class="<?php echo $columnClass; ?>"> <div class="article" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting"> <?php $this->item = &$item; echo $this->loadTemplate('item'); ?> </div> </div> <?php endfor; ?> </div> <?php endfor; ?> </div> <?php endif; ?> <?php endif; ?> <?php if (!empty($this->link_items)) : ?> <div class="articles-more mb-4"> <?php echo $this->loadTemplate('links'); ?> </div> <?php endif; ?> <?php if ($this->maxLevel != 0 && !empty($this->children[$this->category->id])) : ?> <div class="cat-children mb-4"> <?php if ($this->params->get('show_category_heading_title_text', 1) == 1) : ?> <h3> <?php echo Text::_('JGLOBAL_SUBCATEGORIES'); ?> </h3> <?php endif; ?> <?php echo $this->loadTemplate('children'); ?> </div> <?php endif; ?> <?php if (($this->params->def('show_pagination', 1) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> <nav class="pagination-wrapper d-lg-flex justify-content-between w-100"> <?php echo $this->pagination->getPagesLinks(); ?> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <div class="pagination-counter text-muted mb-4"> <?php echo $this->pagination->getPagesCounter(); ?> </div> <?php endif; ?> </nav> <?php endif; ?> </div> PKBA#]����,system/helixultimate/params/blog-options.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fields name="attribs" addfieldpath="/plugins/system/helixultimate/src/fields"> <fieldset name="helix_ultimate_blog_options" label="HELIX_ULTIMATE_BLOG_OPTIONS"> <field name="helix_ultimate_image" type="heliximage" label="HELIX_ULTIMATE_BLOG_FEATURED_IMAGE" /> <field name="helix_ultimate_image_alt_txt" type="text" label="HELIX_ULTIMATE_BLOG_IMAGE_ALT_TEXT" description="HELIX_ULTIMATE_BLOG_IMAGE_ALT_TEXT_DESCRIPTION"/> <field name="helix_ultimate_article_format" type="radio" label="HELIX_ULTIMATE_BLOG_ARTICLE_FORMAT" default="standard" class="btn-group"> <option value="standard">HELIX_ULTIMATE_BLOG_POST_FORMAT_STANDARD</option> <option value="video">HELIX_ULTIMATE_BLOG_POST_FORMAT_VIDEO</option> <option value="gallery">HELIX_ULTIMATE_BLOG_POST_FORMAT_GALLERY</option> <option value="audio">HELIX_ULTIMATE_BLOG_POST_FORMAT_AUDIO</option> </field> <field name="helix_ultimate_audio" type="textarea" rows="5" label="HELIX_ULTIMATE_BLOG_POST_FORMAT_AUDIO_LABEL" description="HELIX_ULTIMATE_BLOG_POST_FORMAT_AUDIO_DESCRIPTION" class="input-xxlarge" filter="raw" showon="helix_ultimate_article_format:audio" /> <field name="helix_ultimate_gallery" type="helixgallery" label="HELIX_ULTIMATE_BLOG_POST_FORMAT_GALLERY_LABEL" description="HELIX_ULTIMATE_BLOG_POST_FORMAT_GALLERY_DESCRIPTION" showon="helix_ultimate_article_format:gallery" /> <field name="helix_ultimate_video" type="url" label="HELIX_ULTIMATE_BLOG_POST_FORMAT_VIDEO_LABEL" description="HELIX_ULTIMATE_BLOG_POST_FORMAT_VIDEO_DESCRIPTION" showon="helix_ultimate_article_format:video" /> </fieldset> </fields> </form> PKBA#]-ڜܠ�(system/helixultimate/params/megamenu.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form> <fields name="params" addfieldpath="/plugins/system/helixultimate/src/fields"> <!-- <fieldset name="helixultimatemegamenu" label="HELIX_ULTIMATE_MENU"> <field name="helixultimatemenulayout" type="helixmegamenu" /> </fieldset> --> <fieldset name="helixultimatepagetitle" label="HELIX_ULTIMATE_PAGE_TITLE"> <field name="helixultimatemenulayout" type="hidden" /> <field name="helixultimate_enable_page_title" type="radio" class="btn-group" default="0" label="HELIX_ULTIMATE_ENABLE_PAGE_TITLE" description="HELIX_ULTIMATE_ENABLE_PAGE_TITLE_DESC"> <option value="1">HELIX_ULTIMATE_YES</option> <option value="0">HELIX_ULTIMATE_NO</option> </field> <field name="helixultimate_page_title_alt" type="text" default="" label="HELIX_ULTIMATE_PAGE_TITLE_ALT" description="HELIX_ULTIMATE_PAGE_TITLE_ALT_DESC" /> <field name="helixultimate_page_subtitle" type="text" default="" label="HELIX_ULTIMATE_PAGE_SUBTITLE" description="HELIX_ULTIMATE_PAGE_SUBTITLE_DESC" /> <field name="helixultimate_page_title_heading" type="radio" class="btn-group" default="h2" label="HELIX_ULTIMATE_PAGE_TITLE_HEADING" description="HELIX_ULTIMATE_PAGE_TITLE_HEADING_DESC"> <option value="h1">H1</option> <option value="h2">H2</option> </field> <field name="helixultimate_page_title_bg_color" type="color" label="HELIX_ULTIMATE_PAGE_TITLE_BACKGROUND_COLOR" description="HELIX_ULTIMATE_PAGE_TITLE_BACKGROUND_COLOR_DESC" /> <field name="helixultimate_page_title_bg_image" type="media" label="HELIX_ULTIMATE_PAGE_TITLE_BACKGROUND_IMAGE" description="HELIX_ULTIMATE_PAGE_TITLE_BACKGROUND_IMAGE_DESC" /> </fieldset> </fields> </form> PKBA#]���&system/helixultimate/helixultimate.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <extension version="3.9" type="plugin" group="system" method="upgrade"> <name>System - Helix Ultimate Framework</name> <author>JoomShaper.com</author> <creationDate>Feb 2018</creationDate> <copyright>Copyright (C) 2010 - 2025 JoomShaper. All rights reserved.</copyright> <license>http://www.gnu.org/licenses/gpl-2.0.html GPLv2 or later</license> <authorEmail>support@joomshaper.com</authorEmail> <authorUrl>www.joomshaper.com</authorUrl> <version>2.2.9</version> <description>Helix Ultimate Framework - Joomla Template Framework by JoomShaper</description> <updateservers> <server type="extension" priority="1" name="System - Helix Ultimate Framework">https://www.joomshaper.com/updates/plg-system-helixultimate.xml</server> </updateservers> <languages> <language tag="en-GB">language/en-GB.plg_system_helixultimate.ini</language> </languages> <files> <filename plugin="helixultimate">bootstrap.php</filename> <filename plugin="helixultimate">composer.json</filename> <filename plugin="helixultimate">helixultimate.php</filename> <folder plugin="helixultimate">assets</folder> <folder plugin="helixultimate">core</folder> <folder plugin="helixultimate">fields</folder> <folder plugin="helixultimate">html</folder> <folder plugin="helixultimate">language</folder> <folder plugin="helixultimate">layout</folder> <folder plugin="helixultimate">layouts</folder> <folder plugin="helixultimate">overrides</folder> <folder plugin="helixultimate">overrides_legacy</folder> <folder plugin="helixultimate">params</folder> <folder plugin="helixultimate">src</folder> <folder plugin="helixultimate">vendor</folder> </files> </extension> PKBA#]9���5�5+system/helixultimate/src/Platform/Media.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Platform; defined('_JEXEC') or die(); use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\Helper\MediaHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Session\Session; use Joomla\CMS\Uri\Uri; use Joomla\Filesystem\File; use Joomla\Filesystem\Folder; /** * Media helper class. * * @since 1.0.0 */ class Media { /** * Get Folders. * * @return void * @since 1.0.0 */ public static function getFolders() { $media = []; $media['status'] = false; $media['output'] = Text::_('JINVALID_TOKEN'); Session::checkToken() or die(json_encode($media)); $input = Factory::getApplication()->input; $path = $input->post->get('path', '/images', 'PATH'); $absolutePath = Helper::resolveMediaPath($path); if ($absolutePath === null || ! is_dir($absolutePath)) { $media['message'] = 'Invalid media path'; die(json_encode($media)); } $images = Folder::files($absolutePath, '.png|.jpg|.jpeg|.gif|.svg|.ico|.webp', false, true); $folders = Folder::folders($absolutePath, '.', false, false, ['.svn', 'CVS', '.DS_Store', '__MACOSX', '_spmedia_thumbs']); $crumbs = explode('/', ltrim($path, '/')); $crumb_url = ''; $breadcrumb = '<ul class="hu-media-breadcrumb">'; foreach ($crumbs as $key => $crumb) { $crumb_url .= '/' . $crumb; if (count($crumbs) === ($key + 1)) { $breadcrumb .= '<li class="hu-media-breadcrumb-item active" data-path="' . $crumb_url . '">' . preg_replace('/[-_]+/', ' ', $crumb) . '</li>'; } else { $breadcrumb .= '<li class="hu-media-breadcrumb-item" data-path="' . $crumb_url . '"><a href="#" data-path="' . $crumb_url . '">' . preg_replace('/[-_]+/', ' ', $crumb) . '</a></li>'; } } $breadcrumb .= '</ul>'; $media['breadcrumbs'] = $breadcrumb; $media['path'] = $path; $files = []; $media['images'] = $images; $media['folders'] = $folders; $output = '<div id="hu-media-manager">'; $output .= '<ul class="hu-media clearfix">'; if (! empty($folders)) { foreach ($folders as $folder) { $files[$folder] = [ 'type' => 'folder', 'folder' => $path . '/' . $folder, 'name' => $folder, ]; } } if (! empty($images)) { foreach ($images as $image) { $image = str_replace('\\', '/', $image); $root_path = str_replace('\\', '/', JPATH_ROOT); $path = str_replace($root_path . '/', '', $image); $files[basename($path)] = [ 'type' => 'image', 'path' => $path, 'name' => basename($path), 'preview' => Uri::root() . $path, ]; } } if (! empty($files)) { ksort($files); foreach ($files as $key => $file) { if ($file['type'] === 'folder') { $output .= '<li class="hu-media-folder" data-path="' . $file['folder'] . '">'; $output .= '<div class="hu-media-thumb">'; $output .= '<svg width="160" height="160" viewBox="0 0 160 160"><g fill="none" fill-rule="evenodd"><path d="M77.955 53h50.04A3.002 3.002 0 0 1 131 56.007v58.988a4.008 4.008 0 0 1-4.003 4.005H39.003A4.002 4.002 0 0 1 35 114.995V45.99c0-2.206 1.79-3.99 3.997-3.99h26.002c1.666 0 3.667 1.166 4.49 2.605l3.341 5.848s1.281 2.544 5.12 2.544l.005.003z" fill="#71B9F4"></path><path d="M77.955 52h50.04A3.002 3.002 0 0 1 131 55.007v58.988a4.008 4.008 0 0 1-4.003 4.005H39.003A4.002 4.002 0 0 1 35 113.995V44.99c0-2.206 1.79-3.99 3.997-3.99h26.002c1.666 0 3.667 1.166 4.49 2.605l3.341 5.848s1.281 2.544 5.12 2.544l.005.003z" fill="#92CEFF"></path></g></svg>'; $output .= '</div>'; $output .= '<span class="hu-media-select"><span class="fas fa-check" aria-hidden="true"></span></span>'; $output .= '<div class="hu-media-label">' . $file['name'] . '</div>'; $output .= '</li>'; } else { $output .= '<li class="hu-media-image" data-path="' . $file['path'] . '" data-preview="' . $file['preview'] . '">'; $output .= '<div class="hu-media-thumb">'; $output .= '<img src="' . $file['preview'] . '" alt="">'; $output .= '</div>'; $output .= '<span class="hu-media-select"><span class="fas fa-check" aria-hidden="true"></span></span>'; $output .= '<div class="hu-media-label">' . $file['name'] . '</div>'; $output .= '</li>'; } } } else { // $output .= '<li class="hu-media-folder-empty"></li>'; } $output .= '</ul>'; $output .= '</div>'; $media['status'] = true; $media['output'] = $output; die(json_encode($media)); } public static function deleteMedia() { $output = []; $output['status'] = false; $output['message'] = Text::_('JINVALID_TOKEN'); Session::checkToken() or die(json_encode($output)); $input = Factory::getApplication()->input; $path = $input->post->get('path', '/images', 'PATH'); $type = $input->post->get('type', 'file', 'STRING'); $absolutePath = Helper::resolveMediaPath($path); if ($absolutePath === null) { $output['message'] = 'Invalid media path'; die(json_encode($output)); } if ($type === 'file') { if (is_file($absolutePath) && File::delete($absolutePath)) { $output['status'] = true; } else { $output['message'] = "Unable to delete file"; $output['status'] = false; } } else { if (is_dir($absolutePath) && Folder::delete($absolutePath)) { $output['status'] = true; } else { $output['message'] = "Unable to delete folder"; $output['status'] = false; } } die(json_encode($output)); } public static function createFolder() { $output = []; $output['status'] = false; $output['message'] = Text::_('JINVALID_TOKEN'); Session::checkToken() or die(json_encode($output)); $input = Factory::getApplication()->input; $path = $input->post->get('path', '/images', 'PATH'); $folder_name = $input->post->get('folder_name', '', 'STRING'); $parentPath = Helper::resolveMediaPath($path); if ($parentPath === null || ! is_dir($parentPath)) { $output['message'] = 'Invalid media path'; die(json_encode($output)); } $safeFolderName = preg_replace('/[^A-Za-z0-9_-]+/', '-', trim($folder_name)); if ($safeFolderName === '') { $output['message'] = 'Invalid folder name'; die(json_encode($output)); } $absolute_path = $parentPath . '/' . $safeFolderName; try { \Joomla\Filesystem\Path::check($absolute_path); } catch (\Exception $e) { $output['message'] = 'Invalid folder path'; die(json_encode($output)); } if (is_dir($absolute_path)) { $output['message'] = "Folder is already exists."; $output['status'] = false; } else { if (Folder::create($absolute_path, 0755)) { $output['output'] = self::getFolders(); $output['status'] = true; } else { $output['message'] = "Unable to create folder."; $output['status'] = false; } } die(json_encode($output)); } public static function uploadMedia() { $user = Factory::getApplication()->getIdentity(); $input = Factory::getApplication()->input; $dir = $input->post->get('path', '/images', 'PATH'); $index = $input->post->get('index', '', 'STRING'); $file = $input->files->get('file'); $uploadDir = Helper::resolveMediaPath($dir); $report = []; $report['status'] = false; $report['message'] = Text::_('JERROR_ALERTNOAUTHOR'); $report['index'] = $index; if ($uploadDir === null || ! is_dir($uploadDir)) { $report['message'] = 'Invalid upload path'; die(json_encode($report)); } if ($user->authorise('core.edit', 'com_templates') !== true && ! ($user->authorise('core.create', 'com_media') && Factory::getApplication()->isClient('site'))) { die(json_encode($report)); } if (! empty($file)) { if ($file['error'] === UPLOAD_ERR_OK) { $error = false; $params = ComponentHelper::getParams('com_media'); $contentLength = (int) $_SERVER['CONTENT_LENGTH']; $mediaHelper = new MediaHelper; $postMaxSize = $mediaHelper->toBytes(ini_get('post_max_size')); $memoryLimit = $mediaHelper->toBytes(ini_get('memory_limit')); // Check for the total size of post back data. if (($postMaxSize > 0 && $contentLength > $postMaxSize) || ($memoryLimit !== -1 && $contentLength > $memoryLimit)) { $report['status'] = false; $report['message'] = Text::_('COM_SPPAGEBUILDER_MEDIA_MANAGER_MEDIA_TOTAL_SIZE_EXCEEDS'); $error = true; echo json_encode($report); die(); } $uploadMaxSize = $params->get('upload_maxsize', 0) * 1024 * 1024; $uploadMaxFileSize = $mediaHelper->toBytes(ini_get('upload_max_filesize')); if (($file['error'] === 1) || ($uploadMaxSize > 0 && $file['size'] > $uploadMaxSize) || ($uploadMaxFileSize > 0 && $file['size'] > $uploadMaxFileSize)) { $report['status'] = false; $report['message'] = Text::_('COM_SPPAGEBUILDER_MEDIA_MANAGER_MEDIA_LARGE'); $error = true; } // File formats (vector/icon types excluded to reduce stored XSS risk) $accepted_file_formats = ['jpg', 'jpeg', 'png', 'gif', 'webp']; // Upload if no error found if (! $error) { $file_ext = strtolower(Helper::getExt($file['name'])); if (in_array($file_ext, $accepted_file_formats, true)) { $name = $file['name']; $source_path = $file['tmp_name']; $folder = ltrim(str_replace(JPATH_ROOT . '/', '', $uploadDir), '/'); // Do no override existing file $media_file = preg_replace('#\s+#', "-", File::makeSafe(basename(strtolower($name)))); $i = 0; do { $base_name = File::stripExt($media_file) . ($i ? "$i" : ""); $ext = Helper::getExt($media_file); $media_name = $base_name . '.' . $ext; $i++; $dest = $uploadDir . '/' . $media_name; $src = $folder . '/' . $media_name; } while (file_exists($dest)); // End Do not override if (File::upload($source_path, $dest, false, true)) { $report['src'] = Uri::root(true) . '/' . $src; $report['status'] = true; $report['title'] = $media_name; $report['path'] = $src; $output = '<div class="hu-media-thumb">'; $output .= '<img src="' . $report['src'] . '" alt="">'; $output .= '</div>'; $output .= '<span class="hu-media-select"><span class="fas fa-check" aria-hidden="true"></span></span>'; $output .= '<div class="hu-media-label">' . $report['title'] . '</div>'; $report['output'] = $output; } else { $report['status'] = false; $report['message'] = Text::_('COM_SPPAGEBUILDER_MEDIA_MANAGER_UPLOAD_FAILED'); } } else { $report['status'] = false; $report['message'] = Text::_('COM_SPPAGEBUILDER_MEDIA_MANAGER_FILE_NOT_SUPPORTED'); } } } } else { $report['status'] = false; $report['message'] = Text::_('File not found'); } die(json_encode($report)); } } PKBA#]�3|���,system/helixultimate/src/Platform/Helper.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Platform; use HelixUltimate\Framework\System\HelixCache; use HelixUltimate\Framework\System\JoomlaBridge; use Joomla\CMS\Application\ApplicationHelper; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\Filter\InputFilter; use Joomla\CMS\Language\Multilanguage; use Joomla\CMS\Language\Text; use Joomla\CMS\Session\Session; use Joomla\CMS\Uri\Uri; use Joomla\Database\DatabaseInterface; use Joomla\Filesystem\Path; use Joomla\Registry\Registry; use Joomla\Utilities\ArrayHelper; defined('_JEXEC') or die(); /** * Helix framework helper class * * @since 1.0.0 */ class Helper { /** * Get template styles from Database. * * @param integer $id The template ID. * * @return object Template data object. * @since 1.0.0 */ public static function getTemplateStyle($id = 0) { static $cache = []; if (isset($cache[$id])) { return $cache[$id]; } $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); $query->select(['*']); $query->from($db->quoteName('#__template_styles')); $query->where($db->quoteName('client_id') . ' = 0'); $query->where($db->quoteName('id') . ' = ' . $db->quote($id)); $db->setQuery($query); $cache[$id] = $db->loadObject(); return $cache[$id]; } /** * Get template ID by template name. * * @param string $template Template name. * * @return integer Template ID. * @since 2.0.0 */ public static function getTemplateId($template): int { try { $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); $query->select('id') ->from($db->quoteName('#__template_styles')) ->where($db->quoteName('template') . ' = ' . $db->quote($template)); if (Multilanguage::isEnabled()) { $query->where($db->quoteName('home') . ' IN(' . $db->quote(Factory::getLanguage()->getTag()) . ', ' . $db->quote('1', false)); } $db->setQuery($query); return (int) $db->loadResult(); } catch (\Exception $e) { return 0; } } /** * Update Helix template styles. * * @param integer $id The helix template ID. * @param object $data The updated contents. * * @return void * @since 1.0.0 */ public static function updateTemplateStyle($id = 0, $data = null) { if (empty($data)) { return; } $keyOptions = [ 'option' => 'com_ajax', 'helix' => 'ultimate', 'status' => 'init', 'id' => $id, ]; $key = self::generateKey($keyOptions); $cache = new HelixCache($key); // If cache contains for the $key generated before if ($cache->contains()) { $cachedData = $cache->loadData(); $cachedData->params = new Registry($data); $cache->removeCache()->storeCache($cachedData); } $data = json_encode($data); $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); $fields = [$db->quoteName('params') . ' = ' . $db->quote($data)]; $conditions = [ $db->quoteName('id') . ' = ' . $db->quote($id), $db->quoteName('client_id') . ' = 0', ]; $query->update($db->quoteName('#__template_styles'))->set($fields)->where($conditions); $db->setQuery($query); return $db->execute(); } /** * Get Helix Template version. * * @return string The version number. * @since 1.0.0 */ public static function getVersion() { $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); $query->select(['*']); $query->from($db->quoteName('#__extensions')); $query->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) ->where($db->quoteName('element') . ' = ' . $db->quote('helixultimate')) ->where($db->quoteName('folder') . ' = ' . $db->quote('system')); $db->setQuery($query); $result = $db->loadObject(); $manifest_cache = json_decode($result->manifest_cache ?? ""); if (isset($manifest_cache->version)) { return $manifest_cache->version; } return; } /** * Check if the data drafted or not. * * @return boolean True if the data is drafted, false otherwise * @since 2.0.0 */ public static function isDrafted() { $app = Factory::getApplication(); $template = $app->getTemplate(true); $templateId = 0; if ($app->isClient('site')) { $templateId = $template->id; } else { if ($app->input->get('option') === 'com_ajax' && $app->input->get('helix') === 'ultimate') { $templateId = $app->input->get('id', 0, 'INT'); } } $draftKeyOptions = [ 'option' => 'com_ajax', 'helix' => 'ultimate', 'status' => 'draft', 'id' => $templateId, ]; $key = self::generateKey($draftKeyOptions); $cache = new HelixCache($key); return $cache->contains(); } /** * Generate a md5 cache key from option(s) * * @param mixed $options string or array. * * @return string Cache key. * @since 2.0.0 */ public static function generateKey($options) { if (is_array($options)) { $string = ''; foreach ($options as $key => $option) { $string .= $key . ':' . $option . ';'; } } elseif (is_string($options)) { $string = $options; } else { $string = 'helixultimate'; } return md5($string); } private static function checkTemplateStyleValidity(int $id): bool { $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); $query->select('id')->from($db->quoteName('#__template_styles')) ->where($db->quoteName('id') . ' = ' . $id); $db->setQuery($query); $result = $db->loadResult(); return isset($result); } /** * Load template data from cache or database. * * @return object Template style object * @since 2.0.0 */ public static function loadTemplateData() { $templateId = 0; $app = Factory::getApplication(); if ($app->isClient('site')) { $currentTemplate = $app->getTemplate(true); $templateId = $currentTemplate->id ?? 0; /** * If a page/menu is assigned to a specific template * then get the template ID. */ $activeMenu = $app->getMenu()->getActive(); if (! empty($activeMenu) && ! empty($activeMenu->template_style_id)) { $templateId = $activeMenu->template_style_id; } } else { if ($app->input->get('option') === 'com_ajax' && $app->input->get('helix') === 'ultimate') { $templateId = $app->input->get('id', 0, 'INT'); } } if (empty($templateId)) { $templateId = $app->input->get('helix_id', 0, 'INT'); } if ($templateId) { $template = []; $draftKeyOptions = [ 'option' => 'com_ajax', 'helix' => 'ultimate', 'status' => 'draft', 'id' => $templateId, ]; $draftKey = self::generateKey($draftKeyOptions); $cache = new HelixCache($draftKey); /** * Check the fetch destination. If it is iframe then load the settings * from draft, otherwise if it is document that means this request * comes from the original site visit. So load from saved cache. */ $requestFromIframe = $app->input->get('helixMode', '') === 'edit'; if ($cache->contains() && $requestFromIframe) { $template = $cache->loadData(); } else { $keyOptions = [ 'option' => 'com_ajax', 'helix' => 'ultimate', 'status' => 'init', 'id' => $templateId, ]; $key = self::generateKey($keyOptions); $cache->setCacheKey($key); if ($cache->contains()) { $template = $cache->loadData(); } else { $template = self::getTemplateStyle($templateId); } } if (isset($template->template) && ! empty($template->template)) { if (! empty($template->params) && \is_string($template->params)) { $template->params = new Registry($template->params); } /** * If params field is found empty in the database or cache then * read the default options.json file from the template and assign * the options as template params. */ elseif (empty($template->params)) { $filePath = JPATH_ROOT . '/templates/' . $template->template . '/' . 'options.json'; if (\file_exists($filePath)) { $defaultParams = \file_get_contents($filePath); $template->params = new Registry($defaultParams); } else { $template->params = new Registry; } } return $template; } } $template = new \stdClass; $template->template = 'system'; $template->params = new Registry; return $template; } /** * Flush settings data towards the javascript using addScriptOptions * * @return void * @since 2.0.0 */ public static function flushSettingsDataToJs() { $doc = Factory::getDocument(); $loadTemplateData = self::loadTemplateData(); $stickyOffset = $loadTemplateData->params->get('sticky_offset', '100'); $data = [ 'breakpoints' => [ 'tablet' => 991, 'mobile' => 480, ], 'header' => [ 'stickyOffset' => $stickyOffset, ], // 'topbarHeight' => 40 ]; $doc->addScriptOptions('data', $data); } public static function getModules($keyword = '') { $modules = []; if (! empty($keyword)) { $keyword = preg_replace("@\s+@", ' ', trim($keyword)); $keyword = implode('|', explode(' ', $keyword)); } try { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select('DISTINCT m.id, m.title, m.module, m.position, m.params, e.manifest_cache') ->from($db->quoteName('#__modules', 'm')) ->where($db->quoteName('m.client_id') . ' = 0'); $query->join('LEFT', $db->quoteName('#__extensions', 'e') . ' ON (' . $db->quoteName('e.element') . ' = ' . $db->quoteName('m.module') . ')'); if (! empty($keyword)) { $query->where($db->quoteName('m.title') . ' REGEXP ' . $db->quote($keyword)); } $query->order($db->quoteName('m.title') . ' ASC'); $db->setQuery($query); $modules = $db->loadObjectList(); } catch (\Exception $e) { return []; } $lang = Factory::getApplication()->getLanguage(); $client = ApplicationHelper::getClientInfo(0); if (! empty($modules)) { foreach ($modules as &$module) { $module->desc = ''; if (isset($module->manifest_cache) && \is_string($module->manifest_cache)) { // $lang->load($module->module . '.sys', $client->path, null, false, true) // || $lang->load($module->module . '.sys', $client->path . '/modules/' . $module->module, null, false, true); $module->manifest_cache = \json_decode($module->manifest_cache ?? ""); if (! empty($module->manifest_cache->description)) { // $module->desc = Text::_($module->manifest_cache->description); } else { // $module->desc = Text::_('COM_MODULES_NODESCRIPTION'); } } } unset($module); } return $modules; } /** * Get template position */ public static function getTemplatePositions() { $positions = []; $template = self::loadTemplateData(); $templateBaseDir = JPATH_SITE; $filePath = Path::clean($templateBaseDir . '/templates/' . $template->template . '/templateDetails.xml'); if (is_file($filePath)) { // Read the file to see if it's a valid component XML file $xml = simplexml_load_file($filePath); if (! $xml) { return false; } // Check for a valid XML root tag. // Extensions use 'extension' as the root tag. Languages use 'metafile' instead if ($xml->getName() != 'extension' && $xml->getName() != 'metafile') { unset($xml); return false; } $positions = (array) $xml->positions; if (isset($positions['position'])) { $positions = (array) $positions['position']; } else { $positions = []; } } return $positions; } public static function getMenuItems($parentId, &$menuItemList) { $elements = []; try { $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); $query->select('id, title, parent_id, level') ->from($db->quoteName('#__menu')) ->where($db->quoteName('parent_id') . ' = ' . (int) $parentId) ->where($db->quoteName('published') . ' = 1') ->where($db->quoteName('client_id') . ' = 0'); $db->setQuery($query); $elements = $db->loadObjectList(); } catch (\Exception $e) { return []; } if (! empty($elements)) { foreach ($elements as $element) { if (isset($menuItemList->$parentId)) { $menuItemList->$parentId->children[] = $element->id; } $elementId = $element->id; $temp = new \stdClass; $temp->id = $element->id; $temp->title = $element->title; $temp->level = $element->level; $temp->children = []; $menuItemList->$elementId = $temp; self::getMenuItems($element->id, $menuItemList); } } } /** * Get the search module for the pre-defined headers. * * @return Object The module object. * @since 2.0.0 */ public static function getSearchModule($idSuffix = '') { $version = JoomlaBridge::getVersion('major'); $name = $version < 4 ? 'mod_search' : 'mod_finder'; $module = self::createModule($name, [ 'title' => 'Search', 'params' => '{"show_label": 0, "label":"","width":20,"text":"","button":0,"button_pos":"right","imagebutton":0,"button_text":"","opensearch":1,"opensearch_title":"","set_itemid":0,"layout":"_:default","moduleclass_sfx":"","cache":1,"cache_time":900,"cachemode":"itemid","module_tag":"div","bootstrap_size":"0","header_tag":"h3","header_class":"","style":"0"}', ], $idSuffix); return $module; } /** * Create a module object which is not created or published. * * @param string $name The module name with mod_ prefixed. * @param array $options The module options. * * @return object The module object. * @since 2.0.0 */ public static function createModule($name, $options = [], $idSuffix = '0') { if (empty($name)) { throw new \Exception(\sprintf('%s method expect the module $name as first argument!', __METHOD__)); } if (! empty($options) && \is_object($options)) { $options = (array) $options; } $defaultOptions = ['id' => $idSuffix, 'title' => '', 'module' => $name, 'position' => '', 'content' => '', 'showtitle' => 0, 'control' => '', 'params' => '', 'menuid' => 0, 'style' => '']; return ArrayHelper::toObject(\array_merge($defaultOptions, $options)); } /** * Check a string ends with a needle or not. * * @param string $haystack The main string. * @param string $needle The needle to search at the end. * * @return bool True if find at the end, false otherwise. * @since 2.0.2 */ public static function endsWith(string $haystack, string $needle): bool { $isEight = \version_compare(PHP_VERSION, '8.0.0') >= 0; $length = strlen($needle); if ($isEight) { return \str_ends_with($haystack, $needle); } return ! $length ? true : substr($haystack, -$length) === $needle; } /** * Check a string starts with a needle or not. * * @param string $haystack The main string. * @param string $needle The needle to search at the beginning. * * @return bool True if find at the starting position, false otherwise. * @since 2.0.2 */ public static function startsWith(string $haystack, string $needle): bool { $isEight = \version_compare(PHP_VERSION, '8.0.0') >= 0; $length = strlen($needle); if ($isEight) { return \str_starts_with($haystack, $needle); } return substr($haystack, 0, $length) === $needle; } private static function getMenuAliasById(int $pageId) { $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); $query->select('alias') ->from($db->quoteName('#__menu')) ->where($db->quoteName('link') . ' = ' . $db->quote('index.php?option=com_sppagebuilder&view=page&id=' . $pageId)); $db->setQuery($query); try { return $db->loadResult(); } catch (\Exception $e) { Factory::getApplication()->enqueueMessage($e->getMessage()); return '404'; } return '404'; } public static function renderPage(string $code, int $pageId) { $app = Factory::getApplication(); $config = $app->getConfig(); $sef = $config->get('sef'); $sef_rewrite = $config->get('sef_rewrite'); $sef_suffix = $config->get('sef_suffix'); $redirect_url = Uri::base(); if (! $sef_rewrite) { $redirect_url .= 'index.php/'; } $redirect_url .= self::getMenuAliasById($pageId); if ($sef_suffix) { $redirect_url .= '.html'; } // If sef is turned off if (! $sef) { $redirect_url = 'index.php?option=com_sppagebuilder&view=page&id=' . $pageId; } if ($code == '404') { header('Location: ' . $redirect_url, true, 301); exit; } } /** * Function to set default column * * @param integer $num_columns * @param integer $default * @return integer */ public static function SetColumn($num_columns, $default = 3) { return empty($num_columns) ? $default : $num_columns; } /** * Function to check if Null then replace with empty string [for php 8.1 fix] * * @return string */ public static function CheckNull($value = null) { return ($value == null) ? '' : $value; } /** * Count read time buy content text * * @param string $text * @return string */ public static function getReadTime($text) { $words_per_minute = 200; $word_count = str_word_count(strip_tags($text)); $read_time = ceil($word_count / $words_per_minute); if ($read_time == 1) { //grammar conversion $label = Text::_('HELIX_ULTIMATE_BLOG_MINUTE_READ'); } else { $label = Text::_('HELIX_ULTIMATE_BLOG_MINUTES_READ'); } $totalString = $read_time . " " . $label; //adds time with minute/minutes label return $totalString; } /** * Save license data * * @param array $inputs * @return mixed */ public static function saveLicenseInfo(array $inputs) { if (empty($inputs)) { return; } $validKeys = ['template', 'joomshaper_email', 'joomshaper_license_key']; // check $validKeys are exist in $inputs and not empty if (array_diff($validKeys, array_keys($inputs))) { return; } $template = $inputs['template']; $email = $inputs['joomshaper_email'] ?? ''; $license_key = $inputs['joomshaper_license_key'] ?? ''; if (! empty($template)) { $extra_query = 'joomshaper_email=' . urlencode($email); $extra_query .= '&joomshaper_license_key=' . urlencode($license_key); $db = Factory::getContainer()->get(DatabaseInterface::class); $fields = [ $db->quoteName('extra_query') . ' = ' . $db->quote($extra_query), $db->quoteName('last_check_timestamp') . ' = 0', ]; $query = $db->getQuery(true) ->update($db->quoteName('#__update_sites')) ->set($fields) ->where($db->quoteName('name') . ' = ' . $db->quote($template)); $db->setQuery($query); $db->execute(); } } /** * Helix article attribs keys allowed to merge on frontend save. * * @return array<string> * @since 2.2.3 */ public static function getHelixAttribKeys(): array { return [ 'helix_ultimate_image', 'helix_ultimate_image_alt_txt', 'helix_ultimate_article_format', 'helix_ultimate_audio', 'helix_ultimate_gallery', 'helix_ultimate_video', ]; } /** * Map Helix AJAX actions to required Joomla permissions (administrator). * * @return array<string, array<string, string>> * @since 2.2.3 */ public static function getActionPermissions(): array { $templateActions = [ 'save-tmpl-style', 'draft-tmpl-style', 'reset-drafted-settings', 'save-layout', 'render-layout', 'remove-layout-file', 'purge-css-file', 'import-tmpl-style', 'update-font-list', 'fontVariants', 'view-media', 'delete-media', 'create-folder', 'upload-media', ]; $menuActions = [ 'getMenuItems', 'parentAdoption', 'rebuildMenu', 'generateMegaMenuBody', 'saveMegaMenuSettings', 'updateRowLayout', 'generateRow', 'generatePopoverContents', 'generateNewCell', 'getModuleList', ]; $blogActions = [ 'upload-blog-image', 'remove-blog-image', ]; $permissions = []; foreach ($templateActions as $action) { $permissions[$action] = ['com_templates' => 'core.edit']; } foreach ($menuActions as $action) { $permissions[$action] = ['com_menus' => 'core.edit']; } foreach ($blogActions as $action) { $permissions[$action] = ['com_content' => 'core.edit']; } return $permissions; } /** * Site-client permission overrides for frontend AJAX actions. * * @return array<string, array<string, string>> * @since 2.2.3 */ public static function getSiteActionPermissions(): array { return [ 'upload-blog-image' => [ 'com_content' => 'core.edit', 'com_media' => 'core.create', ], 'remove-blog-image' => [ 'com_content' => 'core.edit', 'com_media' => 'core.delete', ], 'view-media' => [ 'com_media' => 'core.create', ], 'delete-media' => [ 'com_media' => 'core.delete', ], 'upload-media' => [ 'com_media' => 'core.create', ], ]; } /** * Check whether the current user may execute a Helix AJAX action. * * @param string $action Action name. * * @return bool * @since 2.2.3 */ public static function authorizeAction(string $action): bool { $app = Factory::getApplication(); $user = $app->getIdentity(); if (! $user || ! $user->id) { return false; } $map = $app->isClient('site') ? self::getSiteActionPermissions() : self::getActionPermissions(); if (! isset($map[$action])) { return false; } foreach ($map[$action] as $asset => $permission) { if (! $user->authorise($permission, $asset)) { if ($asset === 'com_content' && $permission === 'core.edit' && $user->authorise('core.edit.own', 'com_content')) { continue; } return false; } } return true; } /** * Enforce CSRF token and ACL for a Helix AJAX action. * * @param string $action Action name. * * @return void * @since 2.2.3 */ public static function guardAjaxRequest(string $action): void { $report = [ 'status' => false, 'message' => Text::_('JINVALID_TOKEN'), 'output' => Text::_('JINVALID_TOKEN'), ]; if (! Session::checkToken()) { die(json_encode($report)); } $report['message'] = Text::_('JERROR_ALERTNOAUTHOR'); $report['output'] = Text::_('JERROR_ALERTNOAUTHOR'); if (! self::authorizeAction($action)) { die(json_encode($report)); } } /** * Sanitize a layout file name for template layout JSON storage. * * @param string $name Layout name from request data. * * @return string|null Safe filename including .json extension. * @since 2.2.3 */ public static function sanitizeLayoutName(string $name): ?string { $name = basename(str_replace('\\', '/', $name)); $name = preg_replace('/\.json$/i', '', $name); if ($name === null || ! preg_match('/^[A-Za-z0-9_-]+$/', $name)) { return null; } return $name . '.json'; } /** * Resolve and validate a media path under the configured media/image root. * * @param string $path Relative path (with or without leading slash). * * @return string|null Absolute filesystem path or null if invalid. * @since 2.2.3 */ public static function resolveMediaPath(string $path): ?string { $path = trim(str_replace('\\', '/', $path)); if ($path === '' || strpos($path, '..') !== false) { return null; } $path = ltrim($path, '/'); $params = ComponentHelper::getParams('com_media'); $mediaRoot = trim($params->get('image_path', 'images'), '/'); $allowedRoots = array_unique([$mediaRoot, 'images']); $fullPath = Path::clean(JPATH_ROOT . '/' . $path); $isAllowed = false; foreach ($allowedRoots as $root) { $allowedPath = Path::clean(JPATH_ROOT . '/' . $root); if ($fullPath === $allowedPath || strpos($fullPath, $allowedPath . '/') === 0) { $isAllowed = true; break; } } if (! $isAllowed) { return null; } try { Path::check($fullPath); } catch (\Exception $e) { return null; } return $fullPath; } /** * Check whether the current user may edit a content article. * * @param int $articleId Article ID. * * @return bool * @since 2.2.3 */ public static function canEditArticle(int $articleId): bool { $user = Factory::getApplication()->getIdentity(); if (! $user || ! $user->id || $articleId <= 0) { return false; } if ($user->authorise('core.edit', 'com_content')) { return true; } if (! $user->authorise('core.edit.own', 'com_content')) { return false; } $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true) ->select($db->quoteName('created_by')) ->from($db->quoteName('#__content')) ->where($db->quoteName('id') . ' = ' . (int) $articleId); $db->setQuery($query); return (int) $db->loadResult() === (int) $user->id; } /** * Validate a base64-encoded internal redirect URL. * * @param string $encoded Base64-encoded URL. * * @return string|null Safe internal URL or null. * @since 2.2.3 */ public static function validateInternalRedirect(string $encoded): ?string { $decoded = base64_decode($encoded, true); if ($decoded === false || $decoded === '') { return null; } if (! Uri::isInternal($decoded)) { return null; } return $decoded; } /** * Sanitize embed HTML using an allowlist of safe tags and attributes. * * @param string $html Raw embed HTML. * * @return string * @since 2.2.3 */ public static function sanitizeEmbed(string $html): string { if ($html === '') { return ''; } $filter = InputFilter::getInstance( ['iframe', 'audio', 'video', 'source', 'a', 'img'], ['src', 'href', 'type', 'controls', 'width', 'height', 'allow', 'allowfullscreen', 'frameborder', 'alt', 'class', 'style'], 1, 1 ); return $filter->clean($html, 'html'); } /** * Sanitize mega menu settings before persisting to menu item params. * * @param array $settings Raw settings from request. * * @return array * @since 2.2.7 */ public static function sanitizeMegaMenuSettings(array $settings): array { $clean = []; $clean['megamenu'] = ! empty($settings['megamenu']) ? 1 : 0; $clean['showtitle'] = ! empty($settings['showtitle']) ? 1 : 0; $clean['menualign'] = self::sanitizeMegaMenuEnum( $settings['menualign'] ?? '', ['left', 'center', 'right', 'full'], 'full' ); $clean['dropdown'] = self::sanitizeMegaMenuEnum( $settings['dropdown'] ?? '', ['left', 'right'], 'right' ); $clean['badge_position'] = self::sanitizeMegaMenuEnum( $settings['badge_position'] ?? '', ['left', 'right'], 'right' ); $clean['width'] = self::sanitizeMegaMenuWidth($settings['width'] ?? '600px'); $clean['customclass'] = self::sanitizeMegaMenuCustomClass($settings['customclass'] ?? ''); $clean['faicon'] = self::sanitizeMegaMenuFaIcon($settings['faicon'] ?? ''); $clean['badge'] = self::sanitizeMegaMenuBadge($settings['badge'] ?? ''); $clean['badge_bg_color'] = self::sanitizeMegaMenuColor($settings['badge_bg_color'] ?? ''); $clean['badge_text_color'] = self::sanitizeMegaMenuColor($settings['badge_text_color'] ?? ''); $layout = $settings['layout'] ?? []; if (! \is_array($layout)) { $layout = []; } $clean['layout'] = self::sanitizeMegaMenuLayout($layout); return $clean; } /** * Sanitize a mega menu CSS class string. * * @param mixed $value Raw custom class value. * * @return string * @since 2.2.7 */ public static function sanitizeMegaMenuCustomClass($value): string { $value = (string) $value; if (preg_match('/[<>"\'=]/', $value)) { return ''; } $value = strip_tags($value); $value = preg_replace('/[^a-zA-Z0-9_\-\s]/', '', $value) ?? ''; return trim(preg_replace('/\s+/', ' ', $value) ?? ''); } /** * Sanitize a Font Awesome icon class string. * * @param mixed $value Raw icon value. * * @return string * @since 2.2.7 */ public static function sanitizeMegaMenuFaIcon($value): string { $value = trim(strip_tags((string) $value)); if ($value === '') { return ''; } if (! preg_match('/^fa[sbr]?\s+fa-[a-z0-9-]+$/i', $value)) { return ''; } return $value; } /** * Sanitize mega menu badge text. * * @param mixed $value Raw badge value. * * @return string * @since 2.2.7 */ public static function sanitizeMegaMenuBadge($value): string { return trim(strip_tags((string) $value)); } /** * Sanitize a hex color value. * * @param mixed $value Raw color value. * * @return string * @since 2.2.7 */ public static function sanitizeMegaMenuColor($value): string { $value = trim(strip_tags((string) $value)); if ($value === '') { return ''; } if (! preg_match('/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/', $value)) { return ''; } return $value; } /** * Sanitize a mega menu width value. * * @param mixed $value Raw width value. * * @return string * @since 2.2.7 */ private static function sanitizeMegaMenuWidth($value): string { $value = trim(strip_tags((string) $value)); if (preg_match('/^[0-9]+(px|%|em|rem)$/', $value)) { return $value; } return '600px'; } /** * Sanitize a mega menu enum field. * * @param mixed $value Raw value. * @param array $allowed Allowed values. * @param string $default Default value. * * @return string * @since 2.2.7 */ private static function sanitizeMegaMenuEnum($value, array $allowed, string $default): string { $value = trim(strip_tags((string) $value)); return \in_array($value, $allowed, true) ? $value : $default; } /** * Recursively sanitize mega menu layout rows/columns/cells. * * @param array $layout Raw layout array. * * @return array * @since 2.2.7 */ private static function sanitizeMegaMenuLayout(array $layout): array { $clean = []; foreach ($layout as $row) { if (! \is_array($row) && ! \is_object($row)) { continue; } $row = (array) $row; $cleanRow = [ 'type' => 'row', 'attr' => [], ]; $columns = $row['attr'] ?? []; if (! \is_array($columns)) { $columns = []; } foreach ($columns as $column) { if (! \is_array($column) && ! \is_object($column)) { continue; } $column = (array) $column; $cleanColumn = [ 'type' => 'column', 'colGrid' => self::sanitizeMegaMenuColGrid($column['colGrid'] ?? '12'), 'menuParentId' => (string) (int) ($column['menuParentId'] ?? 0), 'moduleId' => (string) (int) ($column['moduleId'] ?? 0), 'items' => [], ]; $items = $column['items'] ?? []; if (\is_array($items)) { foreach ($items as $cell) { if (! \is_array($cell) && ! \is_object($cell)) { continue; } $cell = (array) $cell; $type = ($cell['type'] ?? '') === 'module' ? 'module' : 'menu_item'; $cellId = (string) (int) ($cell['item_id'] ?? $cell['id'] ?? 0); $cleanCell = [ 'type' => $type, 'item_id' => $cellId, ]; if ($type === 'module') { $cleanCell['moduleId'] = (string) (int) ($cell['moduleId'] ?? $cell['item_id'] ?? $cell['id'] ?? 0); } $cleanColumn['items'][] = $cleanCell; } } $cleanRow['attr'][] = $cleanColumn; } $clean[] = $cleanRow; } return $clean; } /** * Sanitize a bootstrap column grid value. * * @param mixed $value Raw column grid value. * * @return string * @since 2.2.7 */ private static function sanitizeMegaMenuColGrid($value): string { $value = trim(strip_tags((string) $value)); if (preg_match('/^[0-9]{1,2}$/', $value)) { $grid = (int) $value; if ($grid >= 1 && $grid <= 12) { return (string) $grid; } } return '12'; } /** * Gets the extension of a file name * * @param string $file The file name * * @return string The file extension * * @since 3.0.0 */ public static function getExt($file) { // String manipulation should be faster than pathinfo() on newer PHP versions. $dot = strrpos($file, '.'); if ($dot === false) { return ''; } $ext = substr($file, $dot + 1); // Extension cannot contain slashes. if (strpos($ext, '/') !== false || (DIRECTORY_SEPARATOR === '\\' && strpos($ext, '\\') !== false)) { return ''; } return $ext; } } PKBA#]��s��N�N-system/helixultimate/src/Platform/Request.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Platform; defined('_JEXEC') or die(); use DateTime; use Exception; use HelixUltimate\Framework\HttpResponse\Response; use HelixUltimate\Framework\Platform\Blog; use HelixUltimate\Framework\Platform\Helper; use HelixUltimate\Framework\Platform\Media; use HelixUltimate\Framework\System\HelixCache; use Joomla\CMS\Factory; use Joomla\Filesystem\File; use Joomla\Filesystem\Folder; use Joomla\CMS\Http\Http; use Joomla\CMS\Language\Text; use Joomla\CMS\Session\Session; use Joomla\Registry\Registry; /** * Request class where the ajax requests * take place. * * @since 1.0.0 */ class Request { /** * Joomla! app instance. * * @var CMSApplication $app * @since 1.0.0 */ protected $app; /** * ID. * * @var integer $id * @since 1.0.0 */ protected $id; /** * Request action. * * @var string $action * @since 1.0.0 */ protected $action; /** * Request data. * * @var array|object $data * @since 1.0.0 */ protected $data; /** * Layout name. * * @var string $layout_name * @since 1.0.0 */ protected $layout_name = ''; /** * Request reporting. * * @var array $report * @since 1.0.0 */ protected $report = array(); /** * Constructor function for request. * * @return void * @since 1.0.0 */ public function __construct() { $this->app = Factory::getApplication(); $input = $this->app->input; $this->id = $input->get('id', null, 'INT'); $this->action = $input->get('action', ''); $this->data = $input->get('data', array(), 'ARRAY'); $this->report = array( 'status' => false, 'message' => 'Unexpected error occurs'); } /** * Initialize the request. * * @return void * @since 1.0.0 */ public function initialize() { if (empty($this->action)) { echo json_encode($this->report); return; } Helper::guardAjaxRequest($this->action); switch ($this->action) { case 'save-tmpl-style': $this->saveTemplateStyle(); break; case 'draft-tmpl-style': $this->draftTemplateStyle(); break; case 'reset-drafted-settings': $this->resetDraftedSettings(); break; case 'save-layout': $this->copyTemplateLayout(); break; case 'render-layout': $this->renderTemplateLayout(); break; case 'remove-layout-file': $this->removeLayoutFile(); break; case 'view-media': Media::getFolders(); break; case 'delete-media': Media::deleteMedia(); break; case 'create-folder': Media::createFolder(); break; case 'upload-media': Media::uploadMedia(); break; case 'import-tmpl-style': $this->importTemplateStyle(); break; case 'update-font-list': $this->updateGoogleFontList(); break; case 'fontVariants': $this->changeFontVariants(); break; case 'upload-blog-image': Blog::upload_image(); break; case 'remove-blog-image': Blog::remove_image(); break; case 'purge-css-file': $this->purgeCssFiles(); break; case 'getMenuItems': $this->report = Response::getMenuItems(); break; case 'parentAdoption': $this->report = Response::parentAdoption(); break; case 'rebuildMenu': $this->report = Response::rebuildMenu(); break; case 'generateMegaMenuBody': $this->report = Response::generateMegaMenuBody(); break; case 'saveMegaMenuSettings': $this->report = Response::saveMegaMenuSettings(); break; case 'updateRowLayout': $this->report = Response::updateRowLayout(); break; case 'generateRow': $this->report = Response::generateRow(); break; case 'generatePopoverContents': $this->report = Response::generatePopoverContents(); break; case 'generateNewCell': $this->report = Response::generateNewCell(); break; case 'getModuleList': $this->report = Response::getModuleList(); break; } echo json_encode($this->report); } /** * Save template style. * * @return void * @since 1.0.0 */ private function saveTemplateStyle() { $inputs = $this->getPostedTemplateInputs(); $inputs['comingsoon_date'] = date('Y-m-d H:i:s', strtotime($inputs['comingsoon_date'] ?? 'now')); $dateStatus = $this->validateDate($inputs['comingsoon_date'], 'Y-m-d H:i:s'); if (!$dateStatus) { $this->report['status'] = false; $this->report['message'] = 'Coming Soon Date for Countdown is invalid'; $this->report['isDrafted'] = Helper::isDrafted(); return; } if (!$this->id || !is_int($this->id)) { return; } $update = Helper::updateTemplateStyle($this->id, $inputs); $keyOptions = [ 'option' => 'com_ajax', 'helix' => 'ultimate', 'status' => 'draft', 'id' => $this->id ]; Helper::saveLicenseInfo($inputs); $key = Helper::generateKey($keyOptions); $cache = new HelixCache($key); if ($cache->contains()) { $cache->removeCache(); } if ($update) { $this->report['status'] = true; $this->report['message'] = 'Style changed successfully'; $this->report['isDrafted'] = Helper::isDrafted(); } } private function validateDate($date, $format = 'Y-m-d') { $d = DateTime::createFromFormat($format, $date); // The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue. return $d && $d->format($format) === $date; } private function draftTemplateStyle() { $inputs = $this->getPostedTemplateInputs(); $storeData = array(); if (isset($inputs['id'])) { $storeData['id'] = (int) $inputs['id']; unset($inputs['id']); } if (isset($inputs['template'])) { $storeData['template'] = $inputs['template']; unset($inputs['template']); } if (isset($inputs['client_id'])) { $storeData['client_id'] = (int) $inputs['client_id']; unset($inputs['client_id']); } if (isset($inputs['home'])) { $storeData['home'] = (int) $inputs['home']; unset($inputs['home']); } if (isset($inputs['title'])) { $storeData['title'] = $inputs['title']; unset($inputs['title']); } $params = new Registry($inputs); $storeData['params'] = $params; if (!$this->id || !is_int($this->id)) { return; } $keyOptions = [ 'option' => 'com_ajax', 'helix' => 'ultimate', 'status' => 'draft', 'id' => $this->id ]; try { $key = Helper::generateKey($keyOptions); $cache = new HelixCache($key); if ($cache->contains()) { $cache->removeCache()->storeCache((object) $storeData); } else { $cache->storeCache((object) $storeData); } $this->report['status'] = true; $this->report['message'] = 'Style drafted successfully'; $this->report['isDrafted'] = Helper::isDrafted(); } catch (\Exception $e) { $this->report['status'] = false; $this->report['message'] = $e->getMessage(); $this->report['isDrafted'] = Helper::isDrafted(); } } private function resetDraftedSettings() { $keyOptions = [ 'option' => 'com_ajax', 'helix' => 'ultimate', 'status' => 'draft', 'id' => $this->id ]; try { $key = Helper::generateKey($keyOptions); $cache = new HelixCache($key); if ($cache->contains()) { $cache->removeCache(); } $this->report['status'] = true; $this->report['message'] = 'Draft resets successfully'; $this->report['isDrafted'] = Helper::isDrafted(); } catch (\Exception $e) { $this->report['status'] = false; $this->report['message'] = $e->getMessage(); $this->report['isDrafted'] = Helper::isDrafted(); } } /** * Template fields that must bypass Joomla's default input filter. * * @var array<int, string> * @since 2.2.8 */ private const RAW_TEMPLATE_FIELDS = [ 'before_head', 'after_body', 'before_body', 'custom_css', 'custom_js', 'copyright', 'comingsoon_content', ]; /** * Get posted template style inputs, preserving raw HTML in custom code, copyright, and coming soon content fields. * * @return array * @since 2.2.8 */ private function getPostedTemplateInputs() { $data = $this->app->input->post->getArray(); foreach (self::RAW_TEMPLATE_FIELDS as $field) { if ($this->app->input->post->exists($field)) { $data[$field] = $this->app->input->post->get($field, '', 'RAW'); } } return $this->filterInputs($data); } /** * Filter inputs. * * @param array $inputs Inputs to filter. * * @return array The filtered input * @since 1.0.0 */ private function filterInputs($inputs) { foreach ($inputs as &$input) { if (is_string($input)) { $input = trim($input); } } return $inputs; } /** * Copy template layout. * * @return void * @since 1.0.0 */ private function copyTemplateLayout() { if (!$this->setLayoutParams()) { return; } $content = ''; if (isset($this->data['content'])) { $content = $this->data['content']; } if ($this->layout_name && $content) { $file_name = $this->layout_file_path . '.json'; $file = fopen($file_name, 'wb'); fwrite($file, $content); fclose($file); $this->report['status'] = true; $this->report['message'] = 'Files copy created as you saved'; $this->report['layout'] = Folder::files($this->layouts_folder_path, '.json'); } } /** * Render template layout * * @return void * @since 1.0.0 */ private function renderTemplateLayout() { if (!$this->setLayoutParams()) { return; } if (file_exists($this->layout_file_path)) { $content = file_get_contents($this->layout_file_path); if (isset($content) && $content) { $layoutHtml = $this->generateLayoutHTML(json_decode($content ?? "")); $this->report['status'] = true; $this->report['message'] = 'Files content rendered'; $this->report['layoutHtml'] = $layoutHtml; } } } /** * Remove layout file. * * @return void * @since 1.0.0 */ private function removeLayoutFile() { if (!$this->setLayoutParams()) { return; } if (file_exists($this->layout_file_path)) { unlink($this->layout_file_path); $this->report['status'] = true; $this->report['message'] = 'File removed'; $this->report['layout'] = Folder::files($this->layouts_folder_path, '.json'); } } /** * Purge CSS files. * * @return void * @since 1.0.0 */ private function purgeCssFiles() { try { $data = $this->app->input->post->getArray(); $inputs = $this->filterInputs($data); if (!$this->id || !is_int($this->id)) { throw new Exception('Page ID required!'); } $templateStyle = Helper::getTemplateStyle($this->id); $cache_path = JPATH_SITE . '/cache/com_templates/templates/' . $templateStyle->template; if (is_dir($cache_path)) { $files = scandir($cache_path); if (count($files) > 0) { foreach ($files as $file) { $ext = explode('.', $file); $cache = count($ext) > 2 ? $ext[1] : ''; if (end($ext) === 'css' || $cache === 'scss') { File::delete($cache_path . '/' . $file); } } } } $this->report['status'] = true; $this->report['message'] = 'CSS purge success'; } catch (Exception $e) { $this->report['status'] = false; $this->report['message'] = $e->getMessage(); } } /** * Import template style. * * @return void * @since 1.0.0 */ private function importTemplateStyle() { if (!$this->id || !is_int($this->id)) { return; } $settings = $this->data['settings']; $data = json_decode($settings ?? ""); if (json_last_error() === JSON_ERROR_NONE) { $update = Helper::updateTemplateStyle($this->id, $data); if ($update) { $this->report['status'] = true; $this->report['message'] = 'Settings imported successfully'; } } } /** * Update Google font list. * * @return void * @since 1.0.0 */ private function updateGoogleFontList() { $tmpl_style = Helper::loadTemplateData(); $template = $tmpl_style->template; $template_path = JPATH_SITE . '/templates/' . $template . '/webfonts'; if (!is_dir($template_path)) { Folder::create($template_path, 0755); } $params = is_string($tmpl_style->params) ? new Registry($tmpl_style->params) : $tmpl_style->params; $apiKey = $params->get('gfont_api', ''); $url = 'https://www.googleapis.com/webfonts/v1/webfonts?key=' . $apiKey; $http = new Http; $str = $http->get($url); if ($str->code === 200) { if (File::write($template_path . '/webfonts.json', $str->body)) { $this->report['status'] = true; $this->report['message'] = '<p class="font-update-success">Google Webfonts list successfully updated! Please refresh your browser.</p>'; } else { $this->report['message'] = '<p class="font-update-failed">Google Webfonts update failed. Please make sure that your template folder is writable.</p>'; } } elseif ($str->code === 403) { $this->report['status'] = true; $decode_msg = json_decode($str->body ?? ""); if (isset(json_decode($str->body ?? "")->error->message) && $get_msg = json_decode($str->body ?? "")->error->message) { $this->report['message'] = "<p class='font-update-failed'>" . $get_msg . "</p>"; } } } /** * Change font variants. * * @return void * @since 1.0.0 */ private function changeFontVariants() { $tmpl_style = Helper::getTemplateStyle($this->id); $template = $tmpl_style->template; $font_name = $this->data['fontName']; $template_path = JPATH_SITE . '/templates/' . $template . '/webfonts/webfonts.json'; $plugin_path = JPATH_PLUGINS . '/system/helixultimate/assets/webfonts/webfonts.json'; if (\file_exists($template_path)) { // $json = File::read($template_path); $json = file_get_contents($template_path); } else { // $json = File::read($plugin_path); $json = file_get_contents($plugin_path); } $webfonts = json_decode($json ?? ""); $items = $webfonts->items; foreach ($items as $item) { if ($item->family == $font_name) { $fontVariants = ''; $fontSubsets = ''; // Variants foreach ($item->variants as $variant) { $safeVariant = htmlspecialchars((string) $variant, ENT_QUOTES, 'UTF-8'); $fontVariants .= '<option value="' . $safeVariant . '">' . $safeVariant . '</option>'; } // Subsets foreach ($item->subsets as $subset) { $safeSubset = htmlspecialchars((string) $subset, ENT_QUOTES, 'UTF-8'); $fontSubsets .= '<option value="' . $safeSubset . '">' . $safeSubset . '</option>'; } $this->report['status'] = true; $this->report['message'] = 'Font Style Changed'; $this->report['variants'] = $fontVariants; $this->report['subsets'] = $fontSubsets; break; } } } /** * Set layout params. * * @return bool * @since 1.0.0 */ private function setLayoutParams() { $tmpl_style = Helper::getTemplateStyle($this->id); $this->template = $tmpl_style->template; if (isset($this->data['layoutName'])) { $this->layout_name = Helper::sanitizeLayoutName((string) $this->data['layoutName']); } if (empty($this->layout_name)) { $this->report['status'] = false; $this->report['message'] = 'Invalid layout name'; return false; } $this->layouts_folder_path = JPATH_SITE . '/templates/' . $this->template . '/layout/'; $this->layout_file_path = $this->layouts_folder_path . $this->layout_name; try { \Joomla\Filesystem\Path::check($this->layout_file_path); } catch (\Exception $e) { $this->report['status'] = false; $this->report['message'] = 'Invalid layout path'; return false; } return true; } /** * Generate Layout HTML. * * @param object $content Layout grid rows. * * @return string Layout HTML. * @since 1.0.0 */ private function generateLayoutHTML($content = array()) { $lang = Factory::getLanguage(); $lang->load('tpl_' . $this->template, JPATH_SITE, $lang->getName(), true); $colGrid = array( '12' => '12', '66' => '6,6', '444' => '4,4,4', '3333' => '3,3,3,3', '48' => '4,8', '39' => '3,9', '363' => '3,6,3', '264' => '2,6,4', '210' => '2,10', '57' => '5,7', '237' => '2,3,7', '255' => '2,5,5', '282' => '2,8,2', '2442' => '2,4,4,2', ); $html = ''; if (!empty($content)) { foreach ($content as $row) { $rowSettings = $this->getSettings($row->settings); $name = Text::_('HELIX_SECTION_TITLE'); if (isset($row->settings->name)) { $name = $row->settings->name; } $html .= '<div class="layoutbuilder-section" ' . $rowSettings . '>'; $html .= '<div class="settings-section clearfix">'; $html .= '<div class="settings-left pull-left">'; $html .= '<a class="row-move" href="#"><i class="fas fa-arrows-alt" aria-hidden="true"></i></a>'; $html .= '<strong class="section-title">' . $name . '</strong>'; $html .= '</div>'; $html .= '<div class="settings-right pull-right">'; $html .= '<ul class="button-group">'; $html .= '<li>'; $html .= '<a class="btn btn-small add-columns" href="#"><i class="fas fa-columns" aria-hidden="true"></i></a>'; $html .= '<ul class="column-list">'; $_active = ''; foreach ($colGrid as $key => $grid) { if ($key === $row->layout) { $_active = 'active'; } $html .= '<li><a href="#" class="column-layout column-layout-' . $key . ' ' . $_active . '" data-layout="' . $grid . '"></a></li>'; $_active = ''; } $active = ''; $customLayout = ''; if (!isset($colGrid[$row->layout])) { $active = 'active'; $split = str_split($row->layout); $customLayout = implode(',', $split); } $html .= '<li>'; $html .= '<a href="#" class="hasTooltip column-layout-custom column-layout custom ' . $active . '" data-layout="' . $customLayout . '" data-type="custom" data-original-title="<strong>Custom Layout</strong>"></a>'; $html .= '</li>'; $html .= '</ul>'; $html .= '</li>'; $html .= '<li><a class="btn btn-small add-row" href="#"><i class="fas fa-bars" aria-hidden="true"></i></a></li>'; $html .= '<li><a class="btn btn-small row-ops-set" href="#"><i class="fas fa-cogs" aria-hidden="true"></i></a></li>'; $html .= '<li><a class="btn btn-danger btn-small remove-row" href="#"><i class="fas fa-times" aria-hidden="true"></i></a></li>'; $html .= '</ul>'; $html .= '</div>'; $html .= '</div>'; $html .= '<div class="row ui-sortable">'; foreach ($row->attr as $column) { $colSettings = $this->getSettings($column->settings); $html .= '<div class="' . $column->className . '" ' . $colSettings . '>'; $html .= '<div class="column">'; if (isset($column->settings->column_type) && $column->settings->column_type) { $html .= '<h6 class="col-title pull-left">Component</h6>'; } else { if (!isset($column->settings->name)) { $column->settings->name = 'none'; } $html .= '<h6 class="col-title pull-left">' . $column->settings->name . '</h6>'; } $html .= '<a class="col-ops-set pull-right" href="#" ><i class="fas fa-cogs" aria-hidden="true"></i></a>'; $html .= '</div>'; $html .= '</div>'; } $html .= '</div>'; $html .= '</div>'; } } return $html; } /** * Get settings. * * @param array $config The configuration array. * * @return string Settings string. * @since 1.0.0 */ private function getSettings($config = null) { $data = ''; if (!empty($config)) { foreach ($config as $key => $value) { $safeKey = preg_replace('/[^a-z0-9_-]/i', '', (string) $key); $safeValue = htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8'); $data .= ' data-' . $safeKey . '="' . $safeValue . '"'; } } return $data; } } PKBA#]y,���6system/helixultimate/src/Platform/Builders/Builder.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Platform\Builders; use Joomla\Filesystem\Folder; /** * Base builder class. * * @since 2.0.0 */ class Builder { /** * Constructor function for the builder class. * * @since 2.0.0 */ public function __construct() { $this->includeFields(); } /** * Include all the fields from the layout path. * * @return void * @since 2.0.0 */ protected function includeFields() { $fields = Folder::files(HELIX_LAYOUT_PATH . '/fields', '\.php$', false, true); if (!empty($fields)) { foreach ($fields as $field) { require_once $field; } } } /** * Render field element * * @param string $key * @param array $attr * * @return string HTML string for the field element rendering * @since 2.0.0 */ public function renderFieldElement($key, $attr) { return \call_user_func_array( ['HelixultimateField' . ucfirst($attr['type']), 'getInput'], [$key, $attr] ); } }PKBA#]�חC� � :system/helixultimate/src/Platform/Builders/MenuBuilder.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Platform\Builders; defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Builders\Builder; use Joomla\CMS\Factory; use Joomla\Database\DatabaseInterface; /** * Helper class for building menu * * @since 2.0.0 */ class MenuBuilder extends Builder { /** * Constructor function for the Menu Builder * * @since 2.0.0 */ public function __construct() { parent::__construct(); } /** * Get Menu Types and their menu items. * * @param int $client The client id * * @return stdClass The menu types with the items. * @since 2.0.0 */ public function getMenuTypes($client = 0) { $menu = []; try { $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); $query->select('id, menutype, title') ->from($db->quoteName('#__menu_types')) ->where($db->quoteName('client_id') . ' = ' . (int) $client); $db->setQuery($query); $menu = $db->loadObjectList(); } catch (\Exception $e) { echo $e->getMessage(); } $menuTypes = new \stdClass; if (!empty($menu)) { foreach ($menu as $m) { $type = $m->menutype; $menuTypes->$type = $this->getMenuItems($type, $client); } } return $menuTypes; } /** * Get Menu Item for the menu type. * * @param string $menuType The menu type * @param string|array $filter The filter string. * A dot(.) separated key value pair or an array of key/value pairs * * @return array The items list array. * @since 1.0.0 * * @throws Exception */ public function getMenuItems($menuType = 'mainmenu', $client = 0, $filter = 'level.1') { $menuItems = []; try { $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); /** * Generate conditions based on the filters and others. */ $conditions = [ $db->quoteName('menutype') . ' = ' . $db->quote($menuType), $db->quoteName('published') . ' = 1', $db->quoteName('client_id') . ' = ' . (int) $client, $db->quoteName('access') . ' IN (0, 1)', ]; if (!empty($filter) && \is_string($filter)) { if (strpos($filter, '.') === false) { throw new \InvalidArgumentException(sprintf('The filter should be a dot separated string')); } list ($key, $value) = explode('.', $filter); $conditions[] = $db->quoteName($key) . ' = ' . (\is_numeric($value) ? (int) $value : $db->quote($value)); } elseif (!empty($filter) && \is_array($filter)) { foreach ($filter as $str) { if (strpos($str, '.') === false) { throw new \InvalidArgumentException(sprintf('The filter should be a dot separated string')); break; } list ($key, $value) = explode('.', $str); $conditions[] = $db->quoteName($key) . ' = ' . (\is_numeric($value) ? (int) $value : $db->quote($value)); } } $query->select('id, title, alias, menutype, path, link') ->from($db->quoteName('#__menu')) ->where($conditions); $query->order($db->quoteName('lft') . ' ASC'); $db->setQuery($query); $menuItems = $db->loadObjectList(); } catch (\InvalidArgumentException $e) { echo $e->getMessage(); } catch (\Exception $e) { echo $e->getMessage(); return $e->getMessage(); } return $menuItems; } } PKBA#]�hv��>system/helixultimate/src/Platform/Builders/MegaMenuBuilder.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Platform\Builders; defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Builders\Builder; use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\Filesystem\Folder; use Joomla\CMS\Menu\MenuItem; use Joomla\CMS\Menu\SiteMenu; use Joomla\Registry\Registry; /** * Helper class for building menu * * @since 2.0.0 */ class MegaMenuBuilder extends Builder { /** * Menu Item ID * * @var int $itemId The menu item ID. * @since 2.0.0 */ protected $itemId = 0; /** * Menu Item Params. * * @var Registry $params The menu item params registry data. * @since 2.0.0 */ protected $params = null; /** * Constructor function for the builder. * * @param int $itemId The menu type * * @since 2.0.0 */ public function __construct($itemId) { parent::__construct(); $this->itemId = $itemId; $this->params = new Registry; $this->loadMenuItemParams(); } /** * Load the menu item params to the builder. * * @return void * @since 2.0.0 */ protected function loadMenuItemParams() { $item = $this->getMenuItem(); $this->params = $item->getParams(); } /** * Get mega menu settings from the params. * * @return stdClass The mega menu settings object. * @since 2.0.0 */ public function getMegaMenuSettings() { $megaMenu = $this->params->get('helixultimatemenulayout', new \stdClass); if (!empty($megaMenu) && \is_string($megaMenu)) { $megaMenu = \json_decode($megaMenu ?? ""); } return $megaMenu; } /** * Get menu Item by id * * @return MenuItem The menu item object. * @since 2.0.0 */ public function getMenuItem() { $item = new MenuItem; try { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select('m.id, m.menutype, m.title, m.alias, m.note, m.path AS route, m.link, m.type, m.level, m.language') ->select($db->quoteName('m.browserNav') . ', m.access, m.params, m.home, m.img, m.template_style_id, m.component_id, m.parent_id') ->select('e.element as component') ->from($db->quoteName('#__menu', 'm')) ->join('LEFT', '#__extensions AS e ON m.component_id = e.extension_id') ->where($db->quoteName('id') . ' = ' . (int) $this->itemId); $item = $db->setQuery($query)->loadObject(); /** * Make items object as MenuItem object so that we can use * the MenuItem's functionalities. */ $item = new MenuItem((array) $item); } catch (Exception $e) { echo Factory::getApplication()->enqueueMessage($e->getMessage()); return $item; } return $item; } /** * Get Menu child menu items for a item id. * * @return array The menu item id items * @since 2.0.0 */ public function getItemChildren() { $children = []; try { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select('id, title, parent_id') ->from($db->quoteName('#__menu')) ->where($db->quoteName('parent_id') . ' = ' . (int) $this->itemId) ->where($db->quoteName('published') . ' = 1'); $db->setQuery($query); $children = $db->loadObjectList(); } catch (Exception $e) { echo $e->getMessage(); return []; } return $children; } /** * Get item title. If the item is a module then get the module title. * If the item is a menu item then get the item title. * * @param \stdClass $item The item object * * @return string The title string. * @since 2.0.0 */ public function getTitle($item) { $itemId = (int) ($item->item_id ?? $item->id ?? 0); if ($itemId === 0) { return ''; } $element = null; if ($item->type === 'module') { $modules = Helper::getModules(); foreach ($modules as $mod) { if ((int) $mod->id === $itemId) { $element = $mod; break; } } } else { $menu = new SiteMenu; $element = $menu->getItem($itemId); } return !empty($element) ? $element->title : ''; } /** * Get missing menu items. * * @return array the missing items array. * @since 2.0.0 */ public function getMissingItems() { $settings = $this->getMegaMenuSettings(); $children = $this->getItemChildren(); $rows = $settings->layout ?? []; $items = []; if (!empty($rows)) { foreach ($rows as $row) { $columns = $row->attr ?? []; if (!empty($columns)) { foreach ($columns as $column) { $cells = $column->items ?? []; $cells = array_filter($cells, function($cell) { return $cell->type === 'menu_item'; }); $items = array_merge($items, $cells); } } } } $missing = []; if (!empty($children) && !empty($items)) { foreach ($children as $child) { $found = false; foreach ($items as $item) { if ((int) $child->id === (int) $item->item_id) { $found = true; break; } } if (!$found) { $tmp = new \stdClass; $tmp->type = 'menu_item'; $tmp->item_id = $child->id; $missing[] = $tmp; } } } return $missing; } } PKBA#]�U����2system/helixultimate/src/Platform/HTMLOverride.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Platform; use Joomla\Filesystem\Path; /** * Static class for managing the overrides. * * @since 2.0.2 */ final class HTMLOverride { /** * The HTML path from the template. * * @var string $htmlPath The template's HTML directory path. * @since 2.0.2 */ private static $htmlPath = JPATH_ROOT . '/templates/{{template}}/html'; /** * The `overrides` directory path from the plugin * * @var string $overridePath The plugin's overrides directory path. * @since 2.0.2 */ private static $overridePath = JPATH_ROOT . '/plugins/system/helixultimate/overrides'; private static $overridePathLegacy = JPATH_ROOT . '/plugins/system/helixultimate/overrides_legacy'; /** * The template override path from the template. * * @var string $tmplOverridePath The template's override path. * @since 2.0.3 */ private static $tmplOverridePath = JPATH_ROOT . '/templates/{{template}}/overrides'; /** * Parse the path with proper template name. * * @param string $path The location path. * * @return string The parsed path. * @since 2.0.2 */ private static function parsePath(string $path): string { $template = Helper::loadTemplateData(); $path = \preg_replace("@\{\{template\}\}@", $template->template, $path); return Path::clean($path); } /** * Extract the path string by splitting it using a backslash. * returns the splitted array. * * @param string $path The path string to extract. * * @return array The splitted array of the path. * @since 2.0.2 */ private static function extractPath(string $path): array { return explode('/', trim($path, '/')); } /** * If the system could not detect the override file at template's `overrides` * folder or the plugin's `override` folder, then it search the template * file at the extension's path. * * @param string $path The path to identify the extension template location. * * @return string The extension path after parsing the location $path. * @since 2.0.2 */ private static function generateExtensionPath(string $path) : string { if (empty($path)) { return ''; } $path = self::extractPath($path); $version = JVERSION; $extension = $path[0]; /** If the path is for a component- */ if (\strpos($extension, 'com_') === 0) { if ($version < 4) { \array_splice($path, 1, 0, ['views']); \array_splice($path, 3, 0, ['tmpl']); } else { \array_splice($path, 1, 0, ['tmpl']); } return JPATH_ROOT . '/components/' . \implode('/', $path); } /** If the extension path is for a module- */ elseif (\strpos($extension, 'mod_') === 0) { \array_splice($path, 1, 0, ['tmpl']); return JPATH_ROOT . '/modules/' . \implode('/', $path); } /** If the extension path is for a plugin- */ elseif (\strpos($extension, 'plg_') === 0) { /** * Plugin folder name inside a override directory is like `plg_pluginFolder_pluginName` * explode the string using the underscore (_) and make the plugin path. */ $pluginPath = \explode('_', $extension); \array_splice($pluginPath, 0, 1); \array_push($pluginPath, 'tmpl'); \array_splice($path, 0, 1, $pluginPath); return JPATH_ROOT . '/plugins/' . \implode('/', $path); } /** If the path is for the layouts */ elseif ($extension === 'layouts') { return JPATH_ROOT . '/' . \implode('/', $path); } return \implode('/', $path); } /** * load the template HTML from the plugin. * * @return void * @since 2.0.2 */ public static function loadTemplate(): string { $backtrace = \debug_backtrace(); $callPath = $backtrace[0]['file'] ?? ''; $staticHtmlPath = self::parsePath(self::$htmlPath); $staticOverridePath = self::parsePath(self::$overridePath); if (JVERSION < 5) { $staticOverridePath = self::parsePath(self::$overridePathLegacy); } $templateOverrideUri = self::parsePath(self::$tmplOverridePath); $webAssetUri = self::parsePath('/templates/{{template}}/joomla.asset.json'); $relativePath = ''; $overridePath = ''; /** * If the callee file is in the template's html directory. */ if (\strpos($callPath, $staticHtmlPath) === 0) { $relativePath = \substr($callPath, \strlen($staticHtmlPath)); } /** If no relative path extracted. */ if (empty($relativePath)) { return self::generateExtensionPath(\substr($callPath, stripos($callPath, '/html/') + 5)); } $templateOverridePath = $templateOverrideUri . $relativePath; if (\file_exists($templateOverridePath)) { return $templateOverridePath; } $pluginOverridePath = $staticOverridePath . $relativePath; if (\file_exists($pluginOverridePath)) { return $pluginOverridePath; } return self::generateExtensionPath($relativePath); } } PKBA#]?���*�*.system/helixultimate/src/Platform/Settings.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Platform; defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use HelixUltimate\Framework\System\HelixCache; use Joomla\CMS\Factory; use Joomla\CMS\Form\Form; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Layout\LayoutHelper; use Joomla\Registry\Registry; /** * Settings class responsible for left sidebar settings * Helix framework's option sidebar. * * @since 1.0.0 */ class Settings { /** * Joomla! app instance. * * @var CMSApplication $app The CMS application instance. * @since 1.0.0 */ private $app; /** * Component name. Invoke from input option. * * @var string $option The option query string value. * @since 1.0.0 */ private $option; /** * Helix value. * * @var string $helix The helix value from query string. * @since 1.0.0 */ private $helix; /** * View name. * * @var string $view The view name from query string. * @since 1.0.0 */ private $view; /** * Template ID. * * @var integer $id The helix template ID. * @since 1.0.0 */ private $id; /** * Request value. * * @var string $request The request value from query string. * @since 1.0.0 */ private $request; /** * The Input object * * @var JInput $input Joomla Request input. * @since 1.0.0 */ private $input; /** * Template Form. * * @var Form $form Joomla Form instance. * @sine 1.0.0 */ private $form; /** * Constructor function for class Options. * * @return void * @since 1.0.0 */ public function __construct() { $this->app = Factory::getApplication(); $this->input = $this->app->input; $this->form = new Form('template'); $this->option = $this->input->get('option', '', 'STRING'); $this->id = $this->input->get('id', 0, 'INT'); $this->view = $this->input->get('view', '', 'STRING'); $this->helix = $this->input->get('helix', '', 'STRING'); $this->request = $this->input->get('request', '', 'STRING'); if ($this->option === 'com_ajax' && $this->helix === 'ultimate' && $this->id !== 0) { HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'jui/cms.js', array('version' => 'auto', 'relative' => true)); } } /** * Inject the menu_builder field if it is not present in the `options.xml` file. * * @return void * @since 2.0.0 */ protected function injectMenuBuilderField(Form &$form) { $field = $form->getField('menu_builder'); /** * If menu_builder field does not exist then * add the field. */ if (!$field) { $fieldXml = new \SimpleXMLElement('<field name="menu_builder" helixgroup="menubuilder" type="helixmenubuilder" label="HELIX_ULTIMATE_MENU_BUILDER" description="HELIX_ULTIMATE_MENU_BUILDER_DESC" hideLabel="true" />'); $form->setField($fieldXml, null, false, 'menu'); } } protected function positioningMenuField(Form &$form) { $field = $form->getFieldXml('menu'); /** * If the menu field's `helixgroup` attribute is not `menubuilder`, * i.e. for old templates update the group name. */ if ($field->attributes()->helixgroup !== 'menubuilder') { $field->attributes()->helixgroup = 'menubuilder'; $form->setField($field, null, false, 'menu'); } } /** * Prepare form data for the XML * * @return Registry $formData * @since 2.0.0 */ protected function prepareSettingsFormData() { $templateStyle = Helper::getTemplateStyle($this->id); $this->form->loadFile(JPATH_ROOT . '/templates/' . $templateStyle->template . '/options.xml'); /** * Get the xml form of the form. * Update the addfieldpath attribute and set to `/plugins/system/helixultimate/src/fields` */ $formXml = $this->form->getXml(); // In Joomla 5.2.4, a bug was introduced where checkbox fields with a default value of '0' // behave incorrectly. As a workaround, we set any '0' default values to an empty string. // @since 2.1.2 & joomla 5.2.4 if (!empty($formXml)) { foreach ($formXml->fieldset as $fieldset) { foreach ($fieldset->field as $field) { $fieldType = (string) $field['type']; if ($fieldType === 'checkbox' && strval($field['default'] ?? '') === '0') { $field['default'] = ''; } } } } if (!empty($formXml)) { for ($i = 0; $i < $formXml->count(); ++$i) { $fieldset = isset($formXml->fieldset[$i]) ? $formXml->fieldset[$i] : null; $attributes = !\is_null($fieldset) ? $fieldset->attributes() : null; if (!\is_null($attributes) && isset($attributes->addfieldpath)) { $formXml->fieldset[$i]->attributes()->addfieldpath = '/plugins/system/helixultimate/src/fields'; } } } // Load the updated xml. $this->form->load($formXml->asXML()); $this->injectMenuBuilderField($this->form); $this->positioningMenuField($this->form); $formData = new \stdClass; if (!empty($templateStyle->params)) { $formData = \json_decode($templateStyle->params ?? ""); } if (empty($formData)) { $optionsPath = JPATH_ROOT . '/templates/' . $templateStyle->template . '/options.json'; $optionDefaults = []; if (\file_exists($optionsPath)) { $optionDefaults = \json_decode(\file_get_contents($optionsPath) ?? ""); } $formData = $optionDefaults; } // Set custom field data for social share button if (empty($formData->social_share_lists)) { $formData->social_share_lists = array('facebook', 'twitter', 'linkedin'); } // Store into cache before return if (!empty($formData)) { $formData = new Registry($formData); $templateStyle->params = $formData; $draftKey = [ 'option' => 'com_ajax', 'helix' => 'ultimate', 'status' => 'draft', 'id' => $this->id ]; $initKey = [ 'option' => 'com_ajax', 'helix' => 'ultimate', 'status' => 'init', 'id' => $this->id ]; $generatedDraftKey = Helper::generateKey($draftKey); $generatedInitKey = Helper::generateKey($initKey); $cache = new HelixCache($generatedDraftKey); /** * Check if cache exists for a specific template ID then * remove the cache and store the content from DB. */ if ($cache->contains()) { $cache->removeCache($generatedDraftKey); } $cache->setCacheKey($generatedInitKey); if ($cache->contains()) { $cache->removeCache($generatedInitKey); } $cache->storeCache($templateStyle); } return $formData; } /** * Prepare Preset Edit Form for rendering * * @param object $presetData Preset Default data * @param string $presetName The preset name * * @return string Presets HTML string * @since 2.0.0 */ public static function preparePresetEditForm($presetData, $presetName) { $template = Helper::loadTemplateData(); $presetForm = new Form('preset'); $presetFormPath = JPATH_PLUGINS . '/system/helixultimate/src/form/preset.xml'; $templatePresetFormPath = JPATH_ROOT . '/templates/' . $template->template . '/preset.xml'; if (\file_exists($templatePresetFormPath)) { $presetFormPath = $templatePresetFormPath; } $presetForm->loadFile($presetFormPath); if (!empty($presetData['data'])) { $formData = new Registry($presetData['data']); $presetForm->bind($formData); } $fieldset = $presetForm->getFieldset('colors'); $group = array(); /** * Make the field id unique by adding * the preset name prefix */ foreach ($fieldset as &$presetField) { $presetField->id = $presetName . '-' . $presetField->id; $group[] = $presetField; } $html = '<div id="' . $presetData['name'] . '" class="hu-preset-container" style="display: none;">'; $html .= '<div class="' . $presetData['name'] . '">'; $html .= LayoutHelper::render( 'cpanel.control-board.fieldset.fields', ['group' => 'no-group', 'groupData' => $group], HELIX_LAYOUTS_PATH ); $html .= '</div>'; $html .= '</div>'; return $html; } /** * Get Field sets * * @return array * @since 2.0.0 */ private function getFieldsets() { $formData = $this->prepareSettingsFormData(); if (!empty($formData)) { $this->form->bind($formData); } else { return; } $fieldsets = $this->form->getFieldsets(); return $fieldsets; } /** * Render Field sets contents * * @return string Fieldset HTML String * @since 2.0.0 */ public function renderFieldsetContents() { $fieldsets = $this->getFieldsets(); $panelHTML = ''; foreach ($fieldsets as $key => $fieldset) { $layoutData = array( 'fieldset' => $fieldset, 'form' => $this->form, 'key' => $key ); $panelHTML .= LayoutHelper::render('cpanel.control-board.fieldset.panel', $layoutData, HELIX_LAYOUTS_PATH); } return $panelHTML; } /** * Render HelixUltimate admin sidebar. * * @return string Sidebar HTML string. * @since 1.0.0 */ public function renderBuilderControlBoard() { $fieldsets = $this->getFieldsets(); $layoutData = array( 'fieldsets' => $fieldsets, 'form' => $this->form ); return LayoutHelper::render('cpanel.control-board.settings', $layoutData, HELIX_LAYOUTS_PATH); } /** * Handling showon conditions form XML form. * * @param string $showOn Showon conditions. * @param string $formControl Form Control. * @param string $group Form group. * * @return array Showon data array. * @since 1.0.0 */ public static function parseShowOnConditions($showOn, $formControl = null, $group = null, $context = null) { // Process the showon data. if (!$showOn) { return array(); } $formPath = $formControl ?: ''; if ($group) { $groups = explode('.', $group); /** * An empty formControl leads to invalid shown property * Use the 1st part of the group instead to avoid. */ if (empty($formPath) && isset($groups[0])) { $formPath = $groups[0]; array_shift($groups); } foreach ($groups as $group) { $formPath .= '[' . $group . ']'; } } $showOnData = array(); $showOnParts = preg_split('#(\[AND\]|\[OR\])#', $showOn, -1, PREG_SPLIT_DELIM_CAPTURE); $op = ''; foreach ($showOnParts as $showOnPart) { if (($showOnPart === '[AND]') || $showOnPart === '[OR]') { $op = trim($showOnPart, '[]'); continue; } $compareEqual = strpos($showOnPart, '!:') === false; $showOnPartBlocks = explode(($compareEqual ? ':' : '!:'), $showOnPart, 2); $showOnData[] = array( 'field' => $formPath ? $formPath . '[' . $showOnPartBlocks[0] . ']' : $showOnPartBlocks[0], 'values' => explode(',', $showOnPartBlocks[1]), 'sign' => $compareEqual === true ? '=' : '!=', 'op' => $op, 'context' => !empty($context) ? $context : '' ); if ($op !== '') { $op = ''; } } return $showOnData; } } PKBA#]~,�� � 3system/helixultimate/src/Platform/Classes/Image.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Platform\Classes; defined('_JEXEC') or die(); /** * Image manipulation class. * * @since 1.0.0 */ class Image { public static function createThumbs($src, $sizes, $folder, $base_name, $ext, $quality = 100) { list($originalWidth, $originalHeight) = getimagesize($src); $ext = strtolower($ext); switch ($ext) { case 'bmp': $img = imagecreatefromwbmp($src); break; case 'gif': $img = imagecreatefromgif($src); break; case 'jpg': $img = imagecreatefromjpeg($src); break; case 'jpeg': $img = imagecreatefromjpeg($src); break; case 'png': $img = imagecreatefrompng($src); break; case 'webp': $img = imagecreatefromwebp($src); break; } if (!empty($sizes)) { $output = array(); if ($base_name) { $output['original'] = $folder . '/' . $base_name . '.' . $ext; } foreach ($sizes as $key => $size) { $targetWidth = $size[0]; $targetHeight = $size[1]; $ratio_thumb = $targetWidth / $targetHeight; $ratio_original = $originalWidth / $originalHeight; if ($ratio_original >= $ratio_thumb) { $height = $originalHeight; $width = ceil(($height * $targetWidth) / $targetHeight); $x = ceil(($originalWidth - $width) / 2); $y = 0; } else { $width = $originalWidth; $height = ceil(($width * $targetHeight) / $targetWidth); $y = ceil(($originalHeight - $height) / 2); $x = 0; } $new = imagecreatetruecolor($targetWidth, $targetHeight); if ($ext === 'gif' || $ext === 'png') { imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 100)); imagealphablending($new, false); imagesavealpha($new, true); } imagecopyresampled($new, $img, 0, 0, $x, $y, $targetWidth, $targetHeight, $width, $height); if ($base_name) { $dest = dirname($src) . '/' . $base_name . '_' . $key . '.' . $ext; $output[$key] = $folder . '/' . $base_name . '_' . $key . '.' . $ext; } else { $dest = $folder . '/' . $key . '.' . $ext; } switch ($ext) { case 'bmp': imagewbmp($new, $dest); break; case 'gif': imagegif($new, $dest); break; case 'jpg': imagejpeg($new, $dest, $quality); break; case 'jpeg': imagejpeg($new, $dest, $quality); break; case 'png': imagepng($new, $dest); break; case 'webp': imagewebp($new, $dest, $quality); break; } } return $output; } return false; } } PKBA#]�:Q�-�-*system/helixultimate/src/Platform/Blog.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Platform; defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Classes\Image; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\Helper\MediaHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Session\Session; use Joomla\CMS\Uri\Uri; use Joomla\Database\DatabaseInterface; use Joomla\Database\ParameterType; use Joomla\Filesystem\File; use Joomla\Filesystem\Folder; use Joomla\Filesystem\Path; use Joomla\Registry\Registry; /** * Blog class. * * @since 1.0.0 */ class Blog { public static function upload_image() { $report = []; $report['status'] = false; $report['output'] = 'Invalid Token'; Session::checkToken() or die(json_encode($report)); $input = Factory::getApplication()->input; $image = $input->files->get('image'); $index = htmlspecialchars($input->post->get('index', '', 'STRING') ?? ""); $gallery = $input->post->get('gallery', false, 'BOOLEAN'); $tplRegistry = new Registry; $tplParams = $tplRegistry->loadString(self::getTemplate()->params); // User is not authorised if (! Factory::getApplication()->getIdentity()->authorise('core.create', 'com_media')) { $report['status'] = false; $report['output'] = Text::_('You are not authorised to upload file.'); echo json_encode($report); die(); } if (! empty($image)) { if ($image['error'] === UPLOAD_ERR_OK) { $error = false; $params = ComponentHelper::getParams('com_media'); $image_path = $params->get('image_path', 'images'); $contentLength = (int) $_SERVER['CONTENT_LENGTH']; $mediaHelper = new MediaHelper; $postMaxSize = $mediaHelper->toBytes(ini_get('post_max_size')); $memoryLimit = $mediaHelper->toBytes(ini_get('memory_limit')); if (($postMaxSize > 0 && $contentLength > $postMaxSize) || ($memoryLimit > 0 && $contentLength > $memoryLimit)) { $report['status'] = false; $report['output'] = Text::_('Total size of upload exceeds the limit.'); $error = true; die(json_encode($report)); } $uploadMaxSize = $params->get('upload_maxsize', 0) * 1024 * 1024; $uploadMaxFileSize = $mediaHelper->toBytes(ini_get('upload_max_filesize')); if (($image['error'] === 1) || ($uploadMaxSize > 0 && $image['size'] > $uploadMaxSize) || ($uploadMaxFileSize > 0 && $image['size'] > $uploadMaxFileSize)) { $report['status'] = false; $report['output'] = Text::_('This file is too large to upload.'); $error = true; } if (! $error) { $acceptedImageFormats = ['jpg', 'jpeg', 'png', 'gif', 'webp']; $file_ext = strtolower(Helper::getExt($image['name'])); if (! in_array($file_ext, $acceptedImageFormats, true)) { $report['output'] = Text::_('COM_SPPAGEBUILDER_MEDIA_MANAGER_FILE_NOT_SUPPORTED'); die(json_encode($report)); } $date = Factory::getDate(); $folder = HTMLHelper::_('date', $date, 'Y') . '/' . HTMLHelper::_('date', $date, 'm') . '/' . HTMLHelper::_('date', $date, 'd'); $target_folder = Path::clean(JPATH_ROOT . '/' . $image_path . '/' . $folder); if (! file_exists($target_folder)) { try { Folder::create($target_folder, 0755); } catch (\Throwable $e) { // Fallback to native mkdir if (! file_exists($target_folder)) { if (! @mkdir($target_folder, 0755, true)) { $report['status'] = false; $report['output'] = Text::_('Failed to create directory.'); echo json_encode($report); die(); } } } } $safeBaseName = File::stripExt(File::makeSafe(basename(strtolower($image['name'])))); $ext = $file_ext; $i = 0; do { $base_name = $safeBaseName . ($i ? (string) $i : ''); $image_name = $base_name . '.' . $ext; $i++; $dest = Path::clean(JPATH_ROOT . '/' . $image_path . '/' . $folder . '/' . $image_name); $src = Path::clean($image_path . '/' . $folder . '/' . $image_name, '/'); $data_src = $src; } while (file_exists($dest)); if (File::upload($image['tmp_name'], $dest)) { $image_quality = $tplParams->get('image_crop_quality', '100'); if ($tplParams->get('image_small', 0)) { $sizes['small'] = explode('x', strtolower($tplParams->get('image_small_size', '100X100'))); } if ($tplParams->get('image_thumbnail', 1)) { $sizes['thumbnail'] = explode('x', strtolower($tplParams->get('image_thumbnail_size', '200X200'))); } if ($tplParams->get('image_medium', 0)) { $sizes['medium'] = explode('x', strtolower($tplParams->get('image_medium_size', '300X300'))); } if ($tplParams->get('image_large', 0)) { $sizes['large'] = explode('x', strtolower($tplParams->get('image_large_size', '600X600'))); } if (! empty($sizes)) { $sources = Image::createThumbs($dest, $sizes, $folder, $base_name, $ext, $image_quality); } if (\file_exists(Path::clean(JPATH_ROOT . '/' . $image_path . '/' . $folder . '/' . $base_name . '_thumbnail.' . $ext))) { $src = Path::clean($image_path . '/' . $folder . '/' . $base_name . '_thumbnail.' . $ext, '/'); } $report['status'] = true; $report['index'] = $index; if ($gallery) { $report['output'] = '<a href="#" class="btn btn-mini btn-danger btn-hu-remove-gallery-image"><span class="fas fa-times" aria-hidden="true"></span></a><img src="' . URI::root(true) . '/' . $src . '" alt="">'; $report['data_src'] = $data_src; } else { $report['output'] = '<img src="' . Uri::root(true) . '/' . $src . '" data-src="' . $data_src . '" alt="">'; } } } } } else { $report['status'] = false; $report['output'] = Text::_('Upload Failed!'); } die(json_encode($report)); } /** * Delete file. * * @return void * @since 1.0.0 */ public static function remove_image() { $report = []; $report['status'] = false; $report['output'] = 'Invalid Token'; Session::checkToken() or die(json_encode($report)); if (! Factory::getApplication()->getIdentity()->authorise('core.delete', 'com_media')) { $report['status'] = false; $report['output'] = Text::_('You are not authorised to delete file.'); echo json_encode($report); die(); } $input = Factory::getApplication()->input; $src = $input->post->get('src', '', 'STRING'); $articleId = (int) $input->get('id', 0, 'INT'); if (! Helper::canEditArticle($articleId)) { $report['output'] = Text::_('JERROR_ALERTNOAUTHOR'); echo json_encode($report); die(); } if ($src === '' || Helper::resolveMediaPath($src) === null) { $report['output'] = Text::_('HELIX_ULTIMATE_DELETE_FAILED'); die(json_encode($report)); } $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true) ->select($db->quoteName('attribs')) ->from($db->quoteName('#__content')) ->where($db->quoteName('id') . ' = :articleId') ->bind(':articleId', $articleId, ParameterType::INTEGER); $db->setQuery($query); $attribs = $db->loadResult(); $attribsDecoded = json_decode($attribs ?? '', true); if (! \is_array($attribsDecoded)) { $attribsDecoded = []; } if (($attribsDecoded['helix_ultimate_image'] ?? '') === $src) { $attribsDecoded['helix_ultimate_image'] = ''; } if (! empty($attribsDecoded['helix_ultimate_gallery'])) { $galleryImages = json_decode($attribsDecoded['helix_ultimate_gallery'], true); if (\is_array($galleryImages) && \is_array($galleryImages['helix_ultimate_gallery_images'] ?? null)) { foreach ($galleryImages['helix_ultimate_gallery_images'] as $key => $image) { if ($image === $src) { unset($galleryImages['helix_ultimate_gallery_images'][$key]); } } $galleryImages['helix_ultimate_gallery_images'] = array_values($galleryImages['helix_ultimate_gallery_images']); $attribsDecoded['helix_ultimate_gallery'] = json_encode($galleryImages); } } $attribsJson = json_encode($attribsDecoded); $updateQuery = $db->getQuery(true) ->update($db->quoteName('#__content')) ->set($db->quoteName('attribs') . ' = :attribs') ->where($db->quoteName('id') . ' = :articleId') ->bind(':attribs', $attribsJson, ParameterType::STRING) ->bind(':articleId', $articleId, ParameterType::INTEGER); $db->setQuery($updateQuery); if ($db->execute()) { $report['status'] = true; } else { $report['output'] = Text::_('Database update failed'); } die(json_encode($report)); } /** * Get template. * * @return object Template information. * @since 1.0.0 */ private static function getTemplate() { $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); $query->select($db->quoteName(['template', 'params'])); $query->from($db->quoteName('#__template_styles')); $query->where($db->quoteName('client_id') . ' = ' . $db->quote(0)); $query->where($db->quoteName('home') . ' = ' . $db->quote('1', false)); $db->setQuery($query); return $db->loadObject(); } } PKBA#]�4�2�&�&.system/helixultimate/src/Platform/Platform.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Platform; defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use HelixUltimate\Framework\Platform\Request; use HelixUltimate\Framework\System\HelixDocument; use HelixUltimate\Framework\System\JoomlaBridge; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Uri\Uri; /** * Platform management class. * * @since 1.0.0 */ class Platform { /** * Joomla! app instance. * * @var CMSApplication $app The CMS application instance. * @since 1.0.0 */ protected $app; /** * Component name. Invoke from input option. * * @var string $option The option query string value. * @since 1.0.0 */ protected $option; /** * Helix value. * * @var string $helix The helix value from query string. * @since 1.0.0 */ protected $helix; /** * View name. * * @var string $view The view name from query string. * @since 1.0.0 */ protected $view; /** * Template ID value. * * @var integer $id The template ID. * @since 1.0.0 */ protected $id; /** * Request value. * * @var string $request The request value from query string. * @since 1.0.0 */ protected $request; /** * Helix Version. * * @var string $version The helix version. * @sine 1.0.0 */ protected $version; /** * The users array. * * @var object $user The users. * @since 1.0.0 */ protected $user = null; /** * If the user has the permission. * * @var boolean $permission The permission value. * @since 1.0.0 */ protected $permission = false; /** * Constructor function for platform. * * @return void * @since 1.0.0 */ public function __construct() { $this->user = Factory::getApplication()->getIdentity(); $this->app = Factory::getApplication(); $input = $this->app->input; $this->version = Helper::getVersion(); $this->option = $input->get('option', '', 'STRING'); $this->helix = $input->get('helix', '', 'STRING'); $this->view = $input->get('view', '', 'STRING'); $this->id = $input->get('id', null, 'INT'); $this->request = $input->get('request', '', 'STRING'); $this->userTmplEditPermission(); } /** * Initialize the platform * * @return void * @since 1.0.0 */ public function initialize() { if ($this->option === 'com_ajax' && $this->helix === 'ultimate' && $this->id && $this->permission) { $app = Factory::getApplication(); $id = (int) $app->input->get('id', 0, 'INT'); $style = Helper::getTemplateStyle($id); $layoutData = array( 'style' => $style, 'id' => $this->id, 'version' => $this->version, 'view' => $this->view, 'iframe' => [ 'url' => Uri::root(true) . '/index.php?templateStyle=' . $style->id . "&helixMode=edit", 'width' => '100%', 'height' => '100%' ] ); return LayoutHelper::render('display', $layoutData, HELIX_LAYOUTS_PATH); } } /** * Handle the task requests. * This function is responsible for handling the API requests * which are made as task or subtask * * @return void * @since 2.0.0 */ public function handleRequests() { if (!$this->user->id) { die(json_encode([ 'status' => false, 'message' => Text::_('JERROR_ALERTNOAUTHOR'), ])); } $request = new Request; if ($this->option === 'com_ajax' && $this->helix === 'ultimate' && $this->request === 'task') { $request->initialize(); exit; } } /** * Check user template edit permission. * * @return void * @since 1.0.0 */ private function userTmplEditPermission() { if ($this->user->id && $this->user->authorise('core.edit', 'com_templates')) { $this->permission = true; } } /** * Load framework system. * * @return void * @since 1.0.0 */ public static function loadFrameworkSystem() { $app = Factory::getApplication(); $doc = Factory::getDocument(); $helixDocument = new HelixDocument; $style_id = (int) $app->input->get('id', 0, 'INT'); $template = Helper::loadTemplateData(); $helix_plg_uri = Uri::root(true) . '/plugins/system/helixultimate'; $helix_assets_url = Uri::root() . 'plugins/system/helixultimate/assets'; Factory::getLanguage()->load('tpl_' . $template->template, JPATH_SITE, null, true); self::registerLanguageScripts(); /** Set meta information. */ $doc->setTitle("Helix Ultimate Framework"); $doc->setGenerator('Helix Ultimate - The Best Joomla Template Framework!'); $doc->addFavicon($helix_plg_uri . '/assets/images/favicon.ico'); $doc->setMetaData('viewport', 'width=device-width, initial-scale=1.0'); $helixDocument->addInlineScript('var helixUltimateStyleId = ' . $style_id . ';'); /** System defined assets */ $helixDocument->useScript('jquery') ->useScript('jquery-noconflict') ->useScript('jquery-migrate') ->registerAndUseScript('cms', '', ['version' => 'auto', 'relative' => true]) ->registerAndUseScript('script.bootstrap', '', ['version' => 'auto', 'relative' => true]) ->registerAndUseStyle('style.bootstrap', $helix_assets_url . '/css/bootstrap.min.css', ['version' => 'auto', 'relative' => true]) ->useScript('keepalive') ->registerAndUseScript('script.chosen', '', ['version' => 'auto', 'relative' => true]) ->registerAndUseScript('script.colorPicker', '', ['version' => 'auto', 'relative' => true]); HTMLHelper::_('jquery.token'); if (JoomlaBridge::getVersion('major') >= 4) { $helixDocument->useScript('core'); } /** Framework defined assets */ $helixDocument->registerAndUseStyle('style.chosen', '', ['version' => 'auto', 'relative' => true]) ->registerAndUseStyle('style.colorPicker', '', ['version' => 'auto', 'relative' => true]) ->registerAndUseStyle('helix.jquery.ui', $helix_assets_url . '/css/admin/jquery-ui.min.css', ['version' => 'auto', 'relative' => true]) ->registerAndUseStyle('helix.ultimate', $helix_assets_url . '/css/admin/helix-ultimate.css', ['version' => 'auto', 'relative' => true]) ->registerAndUseStyle('helix.modal', $helix_assets_url . '/css/admin/modal.css', ['version' => 'auto', 'relative' => true]) ->registerAndUseStyle('helix.fontAwesome', Uri::root() . 'templates/' . $template->template . '/css/font-awesome.min.css') ->registerAndUseStyle('helix.device-field', $helix_assets_url . '/css/admin/devices-field.css', ['version' => 'auto', 'relative' => true]) ->registerAndUseStyle('style.helix.menuBuilder', $helix_assets_url . '/css/admin/menu-builder.css', ['version' => 'auto', 'relative' => true]) ->registerAndUseStyle('style.helix.megaMenu', $helix_assets_url . '/css/admin/megamenu.css', ['version' => 'auto', 'relative' => true]) ->registerAndUseStyle('style.helix.toaster', $helix_assets_url . '/css/admin/toaster.css', ['version' => 'auto', 'relative' => false]); $helixDocument->registerAndUseScript('helix.jquery.ui', $helix_assets_url . '/js/admin/jquery-ui.min.js', ['version' => 'auto', 'relative' => true], ['defer' => true]) ->registerAndUseScript('helix.toaster', $helix_assets_url . '/js/admin/toaster.js', ['version' => 'auto', 'relative' => false], ['defer' => false]) ->registerAndUseScript('helix.utils', $helix_assets_url . '/js/admin/utils.js', ['version' => 'auto', 'relative' => true], ['defer' => false]) ->registerAndUseScript('helix.fields', $helix_assets_url . '/js/admin/fields.js', ['version' => 'auto', 'relative' => true], ['defer' => true]) ->registerAndUseScript('helix.ultimate', $helix_assets_url . '/js/admin/helix-ultimate.js', ['version' => 'auto', 'relative' => true], ['defer' => true]) ->registerAndUseScript('helix.webFont', $helix_assets_url . '/js/admin/webfont.js', ['version' => 'auto', 'relative' => true], ['defer' => true]) ->registerAndUseScript('helix.modal', $helix_assets_url . '/js/admin/modal.js', ['version' => 'auto', 'relative' => true], ['defer' => true]) ->registerAndUseScript('helix.layout', $helix_assets_url . '/js/admin/layout.js', ['version' => 'auto', 'relative' => true], ['defer' => true]) ->registerAndUseScript('helix.media', $helix_assets_url . '/js/admin/media.js', ['version' => 'auto', 'relative' => true], ['defer' => true]) ->registerAndUseScript('helix.device-field', $helix_assets_url . '/js/admin/devices-field.js', ['version' => 'auto', 'relative' => true], ['defer' => true]) ->registerAndUseScript('helix.presets', $helix_assets_url . '/js/admin/presets.js', ['version' => 'auto', 'relative' => true], ['defer' => true]) ->registerAndUseScript('helix.treeSortable', $helix_assets_url . '/js/admin/treeSortable.js', ['version' => 'auto', 'relative' => true], ['defer' => true]) ->registerAndUseScript('helix.menubuilder', $helix_assets_url . '/js/admin/menubuilder.js', ['version' => 'auto', 'relative' => true], ['defer' => true]) ->registerAndUseScript('helix.megamenu', $helix_assets_url . '/js/admin/megamenu.js', ['version' => 'auto', 'relative' => true], ['defer' => true]); // Pass important data to Joomla variable for javascript $meta = array( 'base' => rtrim(Uri::root(), '/'), 'activeMenu' => $template->params->get('menu', 'mainmenu', 'STRING') ); $doc->addScriptOptions('meta', $meta); $doc->setBuffer((new self)->initialize(), 'component'); } /** * Register the framework language strings for JavaScript. * i.e by Joomla.Text._() * * @return void * @since 2.0.0 */ private static function registerLanguageScripts() { Text::script('HELIX_ULTIMATE_SELECT_ICON_LABEL'); Text::script('HELIX_ULTIMATE_MEDIA_SVG_NOT_SUPPORTED_FOR_UPLOAD'); Text::script('COM_SPPAGEBUILDER_MEDIA_MANAGER_FILE_NOT_SUPPORTED'); } } PKBA#]Cn{��,system/helixultimate/src/Document/Parser.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Document; defined('_JEXEC') or die(); use Joomla\CMS\Document\HtmlDocument; use Joomla\CMS\Factory; /** * Document parser class * * @since 1.0.0 */ class Parser extends HtmlDocument { /** * Template Tags * * @var string $_template_tags * @since 1.0.0 */ protected $_template_tags; /** * HTML Document object * * @var object $doc * @since 1.0.0 */ private $doc = null; /** * Joomla! Application object * * @var object $app * @since 1.0.0 */ private $app = null; /** * Constructor function * * @param object $params * @param array $options * * @return void * @since 1.0.0 */ public function __construct($params, $options = array()) { parent::__construct($options); parent::parse($params); $this->app = Factory::getApplication(); $this->doc = Factory::getDocument(); $this->flushToJS(); } /** * Parse Template * * * @return array * @since 1.0.0 */ public function parseTemplate() { $replace = array(); $with = array(); foreach ($this->_template_tags as $jdoc => $args) { $replace[] = $jdoc; $with[] = $this->getBuffer($args['type'], $args['name'], $args['attribs']); } return array ( 'replace' => $replace, 'with' => $with ); } /** * Flush to JS * * @return void * @since 1.0.0 */ private function flushToJS() { $contents = $this->parseTemplate(); // $this->doc->addScriptDeclaration("var templateReWi = '" . json_encode($contents) . "';"); } } PKBA#]���))1system/helixultimate/src/System/HelixDocument.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\System; use HelixUltimate\Framework\System\JoomlaBridge; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; /** * Helix Document a abstraction of the Document/HtmlDocument for making B\C of Joomla 3 & 4. * * @since 2.0.0 */ class HelixDocument { /** * The document instance * * @var Document the document instance. * @since 2.0.0 */ protected $document = null; /** * Web Asset Manager, the instance of WebAssetManager * * @var WebAssetManager|Document Return WebAssetManager if the Joomla version * is greater than or equal 4, otherwise the Document instance. * @since 2.0.0 */ protected $webAssetManager = null; /** * Joomla major version. * * @var integer * @since 2.0.0 */ private $joomlaMajor = 0; /** * Joomla 3 4 asset mapping. * * @var array * @since 2.0.0 */ private $assetMap = []; public function __construct() { $this->document = Factory::getDocument(); $this->joomlaMajor = JoomlaBridge::getVersion('major'); $this->assetMap = JoomlaBridge::getAssetMap(); $this->webAssetManager = $this->loadWebAssetManager(); } /** * Magic call method for handling register<Type>, use<Type> and registerAndUse<Type> methods. * * @param string $method The method name. * @param array $arguments The arguments for the method. * * @return mixed * @since 2.0.0 * * @throws \BadMethodException */ public function __call($method, $arguments) { $method = strtolower($method); if (strpos($method, 'use') === 0) { $type = substr($method, 3); if (empty($arguments[0])) { throw new \BadMethodCallException(sprintf('Asset name is required!')); } return $this->useAsset($type, $arguments[0]); } if (strpos($method, 'addinline') === 0) { $type = substr($method, 9); if (empty($arguments[0])) { throw new \BadMethodCallException(sprintf('Asset content is required!')); } return $this->addInline($type, ...$arguments); } if (strpos($method, 'register') === 0) { $andUse = substr($method, 8, 6) === 'anduse'; $type = $andUse ? substr($method, 14) : substr($method, 8); if ($andUse) { return $this->registerAndUseAsset($type, ...$arguments); } else { return $this->registerAsset($type, ...$arguments); } } if ($this->joomlaMajor >= 4) { if (method_exists($this->webAssetManager, $method)) { return call_user_func_array([$this->webAssetManager, $method], $arguments); } else { throw new \BadMethodCallException(sprintf('Undefined method %s in class %s', $method, get_class($this))); } } throw new \BadMethodCallException(sprintf('Undefined method %s in class %s', $method, get_class($this))); } /** * Load webAssetManager for the specific Joomla! major version. * If it is J3 then return Document as webAssetManager and for * J4 it returns the instance of document->getWebAssetManager * * @return mixed * @since 2.0.0 */ protected function loadWebAssetManager() { if ($this->joomlaMajor < 4) { return $this->document; } return $this->document->getWebAssetManager(); } /** * Get the webAssetManager instance. * * @return mixed Document|WebAssetManager * @since 2.0.0 */ public function getWebAssetManager() { return $this->webAssetManager; } /** * Register Asset. This method is working on the J4 only as J3 has nothing similar to it. * * @param string $type The asset type. Possible values are 'script' and 'style' * @param string $name The asset name. The asset will be identified by this name in future. * @param string $uri The asset location. * @param array $options The options array for the asset. * @param array $attributes The attributes array for the asset. * @param array $dependencies The dependencies array for the asset. * * @return self * @since 2.0.0 */ public function registerAsset(string $type, string $name, string $uri = '', array $options = [], array $attributes = [], array $dependencies = []) : self { if ($this->joomlaMajor >= 4) { $this->webAssetManager->registerStyle($name, $uri, $options, $attributes, $dependencies); } return $this; } /** * Use asset to the site. This asset will look for assetMap at JoomlaBridge and * add asset according to the map for both J3 and J4 * * @param string $type The asset type. Possible values are 'script' and 'style'. * @param string $name The asset name which is registered before. * * @return self * @since 2.0.0 */ public function useAsset(string $type, string $name) : self { if ($this->joomlaMajor >= 4) { if (isset($this->assetMap[$name])) { if (!empty($this->assetMap[$name][1])) { $name = $this->assetMap[$name][1]; $this->webAssetManager->useAsset($type, $name); } } else { $this->webAssetManager->useAsset($type, $name); } } else { if (isset($this->assetMap[$name])) { if (!empty($this->assetMap[$name][0])) { $name = $this->assetMap[$name][0]; HTMLHelper::_($name); } } } return $this; } /** * Register and Use Asset. This is the combination of both `registerAsset` then `useAsset`. * * @param string $type The asset type. Possible values are 'script' and 'style' * @param string $name The asset name. The asset will be identified by this name in future. * @param string $uri The asset location. * @param array $options The options array for the asset. * @param array $attributes The attributes array for the asset. * @param array $dependencies The dependencies array for the asset. * * @return self * @since 2.0.0 */ public function registerAndUseAsset(string $type, string $name, string $uri = '', array $options = [], array $attributes = [], array $dependencies = []) : self { if ($this->joomlaMajor >= 4) { if (isset($this->assetMap[$name]) && !empty($this->assetMap[$name][1])) { $uri = $this->assetMap[$name][1]; } // Generating method like registerAndUseStyle/registerAndUseScript $registerAndUseMethod = 'registerAndUse' . ucfirst($type); $this->webAssetManager->$registerAndUseMethod($name, $uri, $options, $attributes, $dependencies); } else { if (isset($this->assetMap[$name]) && !empty($this->assetMap[$name][0])) { $uri = $this->assetMap[$name][0]; } $nameMap = ['script' => 'script', 'style' => 'stylesheet']; if (!empty($uri)) { if (isset($this->assetMap[$name]) && !empty($this->assetMap[$name][2]) && $this->assetMap[$name][2] === 'registered') { HTMLHelper::_($uri); } else { HTMLHelper::_($nameMap[$type], $uri, $options, $attributes); } } } return $this; } /** * Add Inline asset. * * @param string $type The asset type. Possible values are 'script' and 'style' * @param string $name The asset name. The asset will be identified by this name in future. * @param string $uri The asset location. * @param array $options The options array for the asset. * @param array $attributes The attributes array for the asset. * @param array $dependencies The dependencies array for the asset * * @return self * @since 2.0.0 */ public function addInline(string $type, string $content, array $options = [], array $attributes = [], array $dependencies = []) : self { if ($this->joomlaMajor >= 4) { $this->webAssetManager->addInline($type, $content, $options, $attributes, $dependencies); } else { // Generating method name like addScriptDeclaration/addStyleDeclaration $declarationMethod = 'add' . ucfirst($type) . 'Declaration'; $this->webAssetManager->$declarationMethod($content); } return $this; } } PKBA#]}�O^^0system/helixultimate/src/System/JoomlaBridge.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\System; /** * Bridge between Joomla 3 and Joomla 4 * * @since 2.0.0 */ class JoomlaBridge { /** * Asset mapping between Joomla 3 and 4 * * @var array The mapping array * @since 2.0.0 */ private static $assetMap = []; /** * Joomla! core version with type. * * @param string $type The version type. Available values are major, minor and patch. * * @return int|string Full version string if type is omitted, otherwise integer value of the version. * @since 2.0.0 */ public static function getVersion($type = '') { list($major, $minor, $patch) = explode('.', JVERSION); switch ($type) { case 'major': return (int) ($major ?? 0); case 'minor': return (int) ($minor ?? 0); case 'patch': return (int) ($patch ?? 0); default: return JVERSION; } } public static function getAssetMap() : array { /** * The structure of the array is name => [j3, j4, j3AlreadyRegistered, j4AlreadyRegistered]. * That is asset name as key and first value for j3 and 2nd for j4. */ self::$assetMap = [ 'core' => ['core', 'core', ''], 'jquery' => ['jquery.framework', 'jquery'], 'jquery-migrate' => ['', 'jquery-migrate'], 'jquery-noconflict' => ['', 'jquery-noconflict'], 'keepalive' => ['behavior.keepalive', 'keepalive'], 'script.chosen' => ['formbehavior.chosen', 'vendor/chosen/chosen.jquery.js', 'registered'], 'style.chosen' => ['', 'vendor/chosen/chosen.css'], 'script.colorPicker' => ['jui/jquery.minicolors.min.js', 'vendor/minicolors/jquery.minicolors.min.js'], 'style.colorPicker' => ['jui/jquery.minicolors.css', 'vendor/minicolors/jquery.minicolors.css'], 'cms' => ['jui/cms.js', 'system/showon.min.js'], 'script.bootstrap' => ['bootstrap.framework', 'vendor/bootstrap/bootstrap.min.js', 'registered'], ]; return self::$assetMap; } } PKBA#]�&� � .system/helixultimate/src/System/HelixCache.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <joomshaper@js.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\System; defined('_JEXEC') or die(); use Joomla\CMS\Cache\Cache; use Joomla\CMS\Factory; /** * Class for caching * * @since 2.0.0 */ class HelixCache { /** * Cache key * * @var string $key Cache key. * @since 2.0.0 */ private $key; /** * Cache group where to cache store. * * @var string $group Cache group. * @since 2.0.0 */ private $group = 'helixultimate'; /** * Cache instance. * * @var Cache $cache JCache instance. * @since 2.0.0 */ private $cache; /** * Constructor function. * * @param string $key Cache key * @param integer $lifetime Cache lifetime. * * @return void * @since 2.0.0 */ public function __construct($key, $lifetime = 1440) { $this->key = $key; $this->setCacheInstance($lifetime); } /** * Set cache group externally * * @param string $group Group name * * @return self The class instance * @since 2.0.0 */ public function setGroup($group) { $this->group = $group; return $this; } /** * Set cache key. * This is for manipulate the key if anyone don't want to re-initiate the class. * * @param string $key Cache key to set. * * @return self Class instance for chaining * @since 2.0.0 */ public function setCacheKey($key) { $this->key = $key; return $this; } /** * Get Cache key for outside of the class. * * @return string Cache key * @since 2.0.0 */ public function getCacheKey() { return $this->key; } /** * Set cache instance * * @param int $lifetime Cache lifetime. * * @return self The class instance for chaining. * @since 2.0.0 */ public function setCacheInstance($lifetime) { $config = Factory::getConfig(); $options = [ 'caching' => true, 'cachebase' => $config->get('cache_path', JPATH_ROOT . '/cache'), 'lifetime' => $lifetime ]; $this->cache = Cache::getInstance('', $options); return $this; } /** * Get cache instance * * @return Cache The cache instance * @since 2.0.0 */ public function getCacheInstance() { return $this->cache; } /** * If cache data contains for the key. * * @return boolean true on success, false otherwise * @since 2.0.0 */ public function contains() : bool { return $this->cache->contains($this->key, $this->group); } /** * Clean Cache * * @return self Class instance * @since 2.0.0 */ public function cleanCache() { $this->cache->clean($this->group); return $this; } /** * Remove cache by key. * * @param string $key The key string. * * @return self * @since 2.0.0 */ public function removeCache($key = null) { if (empty($key)) { $key = $this->key; } $this->cache->remove($key, $this->group); return $this; } /** * Store cache with data. * * @param array $data data to store as cache. * * @return self Class instance * @since 2.0.0 */ public function storeCache($data) { $this->cache->store($data, $this->key, $this->group); return $this; } /** * Load cached data by key * * @return mixed Loaded data on success, null on no data. * @since 2.0.0 */ public function loadData() { $data = $this->cache->get($this->key, $this->group); if (!empty($data)) { return $data; } return null; } } PKBA#]��,]�O�O;system/helixultimate/src/Core/Classes/HelixultimateMenu.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Core\Classes; use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\Filter\OutputFilter; use Joomla\CMS\Helper\ModuleHelper; use Joomla\CMS\Router\Route; defined('_JEXEC') or die(); /** * HelixUltimate menu * * @since 1.0.0 */ class HelixultimateMenu { /** * Menu items. * * @var array Menu items. * @since 1.0.0 */ protected $_items = array(); /** * Is active menu * * @var boolean Menu status. * @since 1.0.0 */ protected $active = 0; /** * Active tree. * * @var array Menu tree. * @since 1.0.0 */ protected $active_tree = array(); /** * Menu * * @var string menu * @since 1.0.0 */ protected $menu = ''; /** * Menu params. * * @var object Menu params. * @since 1.0.0 */ public $_params = null; /** * Menu direction. * * @var string Menu direction. * @since 1.0.0 */ public $direction = 'ltr'; /** * Menu type. * * @var string Menutype * @since 1.0.0 */ public $menuname = 'mainmenu'; public $app; public $template; public $extraclass; public $children; /** * Constructor class. * * @param string $class Classes. * @param string $name Name attribute * * @return void * @since 1.0.0 */ public function __construct($class = '', $name = '') { $lang = Factory::getLanguage(); $this->app = Factory::getApplication(); $this->template = Helper::loadTemplateData(); $this->_params = $this->template->params; $this->extraclass = $class; $this->direction = $lang->get('rtl') ? 'rtl' : 'ltr'; if ($name) { $this->menuname = $name; } else { $this->menuname = $this->_params->get('menu'); } $this->initMenu(); $this->render(); } /** * Initialized the menu functionalities. * * @return void * @since 1.0.0 */ public function initMenu() { $menu = $this->app->getMenu('site'); $attributes = array('menutype'); $menu_name = array($this->menuname); $items = $menu->getItems($attributes, $menu_name); $active_item = ($menu->getActive()) ? $menu->getActive() : $menu->getDefault(); $this->active = $active_item ? $active_item->id : 0; $this->active_tree = $active_item->tree; foreach ($items as &$item) { if ($item->level >= 2 && !isset($this->_items[$item->parent_id])) { continue; } $parent = isset($this->children[$item->parent_id]) ? $this->children[$item->parent_id] : array(); $parent[] = $item; $this->children[$item->parent_id] = $parent; $this->_items[$item->id] = $item; } foreach ($items as &$item) { $class = ''; $ariaLabelOpen = ''; if ($item->id == $this->active) { $class .= ' current-item'; $ariaLabelOpen .= 'aria-current="page"'; } if (in_array($item->id, $this->active_tree)) { $class .= ' active'; } elseif ($item->type == 'alias') { $aliasToId = $item->getParams()->get('aliasoptions'); if (count($this->active_tree) > 0 && $aliasToId == $this->active_tree[count($this->active_tree) - 1]) { $class .= ' active'; } elseif (in_array($aliasToId, $this->active_tree)) { $class .= ' alias-parent-active'; } } $item->class = $class; $item->ariaLabelOpen = $ariaLabelOpen; $item->dropdown = 0; $item->flink = $item->link; if (isset($this->children[$item->id])) { $item->dropdown = 1; } switch ($item->type) { case 'separator': case 'heading': break; case 'url': if ((int) (strpos($item->link, 'index.php?') === 0) && (strpos($item->link, 'Itemid=') === false)) { // If this is an internal Joomla link, ensure the Itemid is set. $item->flink = $item->link . '&Itemid=' . $item->id; } break; case 'alias': $item->flink = 'index.php?Itemid=' . $item->getParams()->get('aliasoptions'); break; default: $item->flink = 'index.php?Itemid=' . $item->id; break; } if ((strpos($item->flink, 'index.php?') !== false) && strcasecmp(substr($item->flink, 0, 4), 'http')) { $item->flink = Route::_($item->flink, true, $item->getParams()->get('secure')); } else { $item->flink = Route::_($item->flink); } $item->title = htmlspecialchars($item->title ?? "", ENT_COMPAT, 'UTF-8', false); $item->anchor_css = htmlspecialchars($item->getParams()->get('menu-anchor_css', '') ?? "", ENT_COMPAT, 'UTF-8', false); $item->anchor_title = htmlspecialchars($item->getParams()->get('menu-anchor_title', '') ?? "", ENT_COMPAT, 'UTF-8', false); $item->anchor_rel = htmlspecialchars($item->getParams()->get('menu-anchor_rel', '') ?? "", ENT_COMPAT, 'UTF-8', false); $item->menu_icon = htmlspecialchars($item->getParams()->get('menu_icon_css', '') ?? "", ENT_COMPAT, 'UTF-8', false); $item->menu_image_css = htmlspecialchars($item->getParams()->get('menu_image_css', '') ?? "", ENT_COMPAT, 'UTF-8', false); $item->menu_image = $item->getParams()->get('menu_image', '') ? htmlspecialchars($item->getParams()->get('menu_image', '') ?? "", ENT_COMPAT, 'UTF-8', false) : ''; } } /** * Render menu. * * @return string * @since 1.0.0 */ public function render() { $this->menu = ''; $keys = array_keys($this->_items); if (!empty($keys)) { $this->navigation(null, $keys[0]); } return $this->menu; } /** * Menu navigation. * * @param object $pitem Parent item. * @param integer $start Start index. * @param integer $end End index. * @param string $class Class value. * * @return void * @since 1.0.0 */ public function navigation($pitem, $start = 0, $end = 0, $class = '') { if ($start > 0) { if (!isset($this->_items[$start])) { return; } $pid = $this->_items[$start]->parent_id; $items = array(); $started = false; foreach ($this->children[$pid] as $item) { if ($started) { if ((int) $item->id === (int) $end) { break; } $items[] = $item; } else { if ((int) $item->id === (int) $start) { $started = true; $items[] = $item; } } } if (empty($items)) { return; } } elseif ((int) $start === 0) { $pid = $pitem->id; if (!isset($this->children[$pid])) { return; } $items = $this->children[$pid]; } else { return; } // Parent class if ((int) $pid === 1) { if ($this->_params->get('menu_animation') !== 'none') { $animation = ' ' . $this->_params->get('menu_animation'); } else { $animation = ''; } $class = 'sp-megamenu-parent' . $animation; if ($this->extraclass) { $class = $class . ' ' . $this->extraclass; } $this->menu .= $this->start_lvl($class); } else { $this->menu .= $this->start_lvl($class); } foreach ($items as $item) { $this->getItem($item); } $this->menu .= $this->end_lvl(); } /** * Get menu item. * * @param object $item The menu * * @return void * @since 1.0.0 */ private function getItem($item) { if ((int) $item->getParams()->get('menu_show', 1) === 0) { return; } $this->menu .= $this->start_el(array('item' => $item)); $this->menu .= $this->item($item); $menulayout = json_decode(Helper::CheckNull($item->getParams()->get('helixultimatemenulayout'))); if (isset($menulayout->megamenu) && $menulayout->megamenu) { $this->mega($item); } elseif ($item->dropdown) { $this->dropdown($item); } $this->menu .= $this->end_el(); } /** * Menu dropdown * * @param object $item Menu item. * * @return void * @since 1.0.0 */ private function dropdown($item) { $items = isset($this->children[$item->id]) ? $this->children[$item->id] : array(); $firstitem = !empty($items) ? $items[0]->id : 0; $class = ((int) $item->level === 1) ? 'sp-dropdown sp-dropdown-main' : 'sp-dropdown sp-dropdown-sub'; // Menu_show $menu_show = $this->getMenuShow($item->id); $dropdown_width = $this->_params->get('dropdown_width', '240px'); $dropdown_width = preg_match("@(px|em|rem|%)$@", $dropdown_width) ? $dropdown_width : $dropdown_width . 'px'; $dropdown_alignment = 'right'; $dropdown_style = 'width: ' . $dropdown_width . ';'; $layout = json_decode(Helper::CheckNull($this->_items[$item->id]->getParams()->get('helixultimatemenulayout'))); if (isset($layout->dropdown) && $layout->dropdown === 'left') { if ((int) $item->parent_id !== 1) { $dropdown_style .= 'left: -' . $dropdown_width . ';'; } $dropdown_alignment = 'left'; } if ((int) $menu_show !== 0) { $this->menu .= '<div class="' . $class . ' sp-menu-' . $dropdown_alignment . '" style="' . $dropdown_style . '">'; $this->menu .= '<div class="sp-dropdown-inner">'; $this->navigation($item, $firstitem, 0, 'sp-dropdown-items'); $this->menu .= '</div>'; $this->menu .= '</div>'; } } /** * Check show menu. * * @param integer $parent_id The parent menu id. * * @return integer Show menu. * @since 1.0.0 */ private function getMenuShow($parent_id) { $items = isset($this->children[$parent_id]) ? $this->children[$parent_id] : array(); $show_menu = 0; foreach ($items as $menu_item) { if ((int) $menu_item->getParams()->get('menu_show', 1) === 1) { $show_menu ++; } } return $show_menu; } /** * Helix mega menu. * * @param object $item Menu item. * * @return void * @since 1.0.0 */ private function mega($item) { $items = isset($this->children[$item->id]) ? $this->children[$item->id] : array(); $firstitem = count($items) ? $items[0]->id : 0; $mega = json_decode($item->getParams()->get('helixultimatemenulayout') ?? ""); $layout = $mega->layout ?? []; $mega_style = 'width: ' . (preg_match("@(px|em|rem|%)$@", $mega->width) ? $mega->width : $mega->width . 'px'); $mega_style .= ';'; if ($mega->menualign === 'center') { $mega_style .= 'left: -' . ((float) $mega->width / 2) . 'px;'; } if ($mega->menualign === 'full') { $mega_style = ''; $mega->menualign = $mega->menualign . ' container'; } $this->menu .= '<div class="sp-dropdown sp-dropdown-main sp-dropdown-mega sp-menu-' . $mega->menualign . '" style="' . $mega_style . '">'; $this->menu .= '<div class="sp-dropdown-inner">'; foreach ($layout as $row) { $this->menu .= '<div class="row">'; foreach ($row->attr as $col) { $this->menu .= '<div class="col-sm-' . $col->colGrid . '">'; if (!empty($col->items)) { $this->menu .= $this->start_lvl('sp-mega-group'); foreach ($col->items as $builder_item) { $cellItemId = (int) ($builder_item->item_id ?? $builder_item->id ?? 0); if ($cellItemId === 0) { continue; } $li_head = ''; if ($builder_item->type === 'menu_item') { $li_head = 'item-header'; } $item_class = array( 'item-' . $cellItemId, $builder_item->type, $li_head ); $this->menu .= '<li class="' . implode(' ', $item_class) . '">'; if ($builder_item->type === 'module') { $this->menu .= $this->load_module($cellItemId); } elseif ($builder_item->type === 'menu_item') { if (!empty($this->_items[$cellItemId])) { $item = $this->_items[$cellItemId]; $items = isset($this->children[$cellItemId]) ? $this->children[$cellItemId] : array(); $firstitem = count($items) ? $items[0]->id : 0; if (isset($this->children[$item->id])) { $this->menu .= $this->item($item, 'sp-group-title'); } else { $this->menu .= $this->item($item); } if ($firstitem) { $this->navigation(null, $firstitem, 0, 'sp-mega-group-child sp-dropdown-items'); } } } $this->menu .= $this->end_el(); } $this->menu .= $this->end_lvl(); } $this->menu .= '</div>'; } $this->menu .= '</div>'; } $this->menu .= '</div>'; $this->menu .= '</div>'; } /** * Start label. * * @param string $cls The classes. * * @return string starting tag of the label. * @since 1.0.0 */ private function start_lvl($cls = '') { $class = trim($cls); return '<ul class="' . $class . '">'; } /** * End label. * * @return string The ending tag of the label. * @since 1.0.0 */ private function end_lvl() { return '</ul>'; } /** * Start element. * * @param array $args The arguments. * * @return string The starting element * @since 1.0.0 */ private function start_el($args = array()) { $item = $args['item']; $class = 'sp-menu-item'; // Menu show $menu_show = $this->getMenuShow($args['item']->id); $layout = json_decode(Helper::CheckNull($item->getParams()->get('helixultimatemenulayout'))); $item->hasChild = 0; if (!empty($this->children[$item->id]) && $menu_show !== 0) { $class .= ' sp-has-child'; $item->hasChild = 1; } elseif (isset($layout->megamenu) && ($layout->megamenu)) { $class .= ' sp-has-child'; $item->hasChild = 1; } if (isset($layout->customclass) && ($layout->customclass)) { $class .= ' ' . Helper::sanitizeMegaMenuCustomClass($layout->customclass); } $class .= $item->class; return '<li class="' . htmlspecialchars($class, ENT_QUOTES, 'UTF-8') . '">'; } /** * End element. * * @return string The ending element. * @since 1.0.0 */ private function end_el() { return '</li>'; } /** * Menu item. * * @param object $item The item object. * @param string $extra_class Any extra class for the menu. * * @return string The menu item * @since 1.0.0 */ private function item($item, $extra_class='') { $title = $item->anchor_title ? 'title="' . $item->anchor_title . '" ' : ''; $class = $extra_class; $class .= ($item->anchor_css && $class) ? ' ' . $item->anchor_css : $item->anchor_css; $rel = $item->anchor_rel ? 'rel="' . $item->anchor_rel . '" ' : ''; if ($item->type === 'separator') { $class .= ' sp-menu-separator'; } elseif ($item->type === 'heading') { $class .= ' sp-menu-heading'; } $class = !empty($class) ? 'class="' . $class . '"' : ''; if ($item->menu_icon) { if ($item->getParams()->get('menu_text', 1)) { $linktitle = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span>' . $item->title; } else { $linktitle = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span><span class="visually-hidden">' . $item->title . '</span>'; } } else if ($item->menu_image) { $item->getParams()->get('menu_text', 1) ? $linktitle = '<img src="' . $item->menu_image . '" alt="' . $item->title . '" class="' . $item->menu_image_css . '" /><span class="image-title">' . $item->title . '</span> ' : $linktitle = '<img src="' . $item->menu_image . '" alt="' . $item->title . '" />'; } else { $linktitle = $item->title; } $layout = json_decode(Helper::CheckNull($item->getParams()->get('helixultimatemenulayout'))); $showmenutitle = (isset($layout->showtitle)) ? $layout->showtitle : 1; $icon = Helper::sanitizeMegaMenuFaIcon(isset($layout->faicon) ? $layout->faicon : ''); if (!empty($icon) && !preg_match("@^fa[sbr]@", $icon)) { $icon = Helper::sanitizeMegaMenuFaIcon('fas ' . $icon); } if (!$showmenutitle) { $linktitle = ''; } // Add Menu Icon if ($icon) { $iconClass = htmlspecialchars($icon, ENT_QUOTES, 'UTF-8'); if ($showmenutitle) { $linktitle = '<span class="' . $iconClass . '"></span> ' . $linktitle; } else { $linktitle = '<span class="' . $iconClass . '"></span>'; } } $flink = $item->flink; $ariaLabelOpen = $item->ariaLabelOpen; $flink = str_replace('&', '&', OutputFilter::ampReplace(htmlspecialchars($flink ?? ""))); $badge_html = ''; if (isset($layout->badge) && $layout->badge) { $badge_style = ''; $badge_class = 'sp-menu-badge sp-menu-badge-right'; $badgeText = Helper::sanitizeMegaMenuBadge($layout->badge); $badgeBgColor = Helper::sanitizeMegaMenuColor($layout->badge_bg_color ?? ''); $badgeTextColor = Helper::sanitizeMegaMenuColor($layout->badge_text_color ?? ''); if ($badgeBgColor) { $badge_style .= 'background-color: ' . $badgeBgColor . ';'; } if ($badgeTextColor) { $badge_style .= 'color: ' . $badgeTextColor . ';'; } if (isset($layout->badge_position) && $layout->badge_position === 'left') { $badge_class = 'sp-menu-badge sp-menu-badge-left'; } $badge_html = '<span class="' . $badge_class . '" style="' . htmlspecialchars($badge_style, ENT_QUOTES, 'UTF-8') . '">' . htmlspecialchars($badgeText, ENT_QUOTES, 'UTF-8') . '</span>'; } $output = ''; $options = ''; if ($badge_html) { if (isset($layout->badge_position) && $layout->badge_position === 'left') { $linktitle = $badge_html . $linktitle; } else { $linktitle = $linktitle . $badge_html; } } if (isset($item->hasChild) && $item->hasChild) { // $linktitle = $linktitle . ' <span class="fas fa-angle-down" aria-hidden="true"></span>'; } if ($item->getParams()->get('menu_show', 1) !== 0) { switch ($item->browserNav) { default: case 0: if ($item->type === 'separator' || $item->type === 'heading') { $output .= '<span ' . $ariaLabelOpen . ' ' . $class . ' ' . $title . ' ' . $rel . '>' . $linktitle . '</span>'; } else { $output .= '<a ' . $ariaLabelOpen . ' ' . $class . ' href="' . $flink . '" ' . $title . ' ' . $rel . '>' . $linktitle . '</a>'; } break; case 1: $output .= '<a ' . $class . ' rel="noopener noreferrer" href="' . $flink . '" target="_blank" ' . $title . ' ' . $rel . '>' . $linktitle . '</a>'; break; case 2: $options .= 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,' . $item->getParams()->get('window_open'); $output .= '<a ' . $class . ' href="' . $flink . '" onclick="window.open(this.href, \'targetWindow\', \'' . $options . '\');return false;"' . $title . ' ' . $rel . '>' . $linktitle . '</a>'; break; } } return $output; } /** * Load module to the menu * * @param array $mod Modules * * @return string Modules * @since 1.0.0 */ private function load_module($mod) { if (!is_numeric($mod)) { return null; } $groups = implode(',', Factory::getUser()->getAuthorisedViewLevels()); $lang = Factory::getLanguage()->getTag(); $clientId = (int) $this->app->getClientId(); $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select('m.id, m.title, m.module, m.position, m.content, m.showtitle, m.params'); $query->from('#__modules AS m'); $query->where('m.published = 1'); $query->where('m.id = ' . $mod); $date = Factory::getDate(); $now = $date->toSql(); $nullDate = $db->getNullDate(); $query->where('(m.publish_up IS NULL OR m.publish_up = ' . $db->Quote($nullDate) . ' OR m.publish_up <= ' . $db->Quote($now) . ')'); $query->where('(m.publish_down IS NULL OR m.publish_down = ' . $db->Quote($nullDate) . ' OR m.publish_down >= ' . $db->Quote($now) . ')'); $query->where('m.access IN (' . $groups . ')'); $query->where('m.client_id = ' . $clientId); if ($this->app->isClient('site') && $this->app->getLanguageFilter()) { $query->where('m.language IN (' . $db->Quote($lang) . ',' . $db->Quote('*') . ')'); } $query->order('position, ordering'); $db->setQuery($query); $module = $db->loadObject(); if (!$module) { return null; } $options = array('style' => 'sp_xhtml'); $file = $module->module; $custom = substr($file, 0, 4) == 'mod_' ? 0 : 1; $module->user = $custom; $module->name = $custom ? $module->title : substr($file, 4); $module->style = null; $module->client_id = 1; $module->position = strtolower($module->position); $clean[$module->id] = $module; $output = ModuleHelper::renderModule($module, $options); return $output; } } PKBA#]�"<g%%5system/helixultimate/src/Core/Lib/helixmenuhelper.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Core\Lib; defined('_JEXEC') or die('Restricted access'); use HelixUltimate\Framework\Core\Lib\FontawesomeIcons; use Joomla\CMS\Language\Text; use Joomla\CMS\Menu\SiteMenu; $current_menu_id = $this->form->getValue('id'); $JMenuSite = new SiteMenu; $module_list = $this->getModuleNameById(); $fontawesome = new FontawesomeIcons; $mega_align = array( 'left' => Text::_('HELIX_ULTIMATE_GLOBAL_LEFT'), 'center' => Text::_('HELIX_ULTIMATE_GLOBAL_CENTER'), 'right' => Text::_('HELIX_ULTIMATE_GLOBAL_RIGHT'), 'full' => Text::_('HELIX_ULTIMATE_GLOBAL_FULL'), ); $dropdown_list = array( 'left' => Text::_('HELIX_ULTIMATE_GLOBAL_LEFT'), 'right' => Text::_('HELIX_ULTIMATE_GLOBAL_RIGHT') ); $menu_width = 600; $align = 'right'; $layout = array(); $enable_megamenu = 0; $show_title = 1; $custom_class = ''; $faicon = ''; $dropdown = 'right'; $badge = ''; $badge_position = ''; $badge_bg_color = ''; $badge_text_color = ''; $display_class = ''; $dropdown_class = ''; $unique_menu_item_count = 0; if (isset($menu_data->megamenu)) { $enable_megamenu = $menu_data->megamenu; } if (isset($menu_data->width)) { $menu_width = $menu_data->width; } if (isset($menu_data->menualign)) { $align = $menu_data->menualign; } if (isset($menu_data->layout)) { $layout = $menu_data->layout; } if (isset($menu_data->showtitle)) { $show_title = $menu_data->showtitle; } if (isset($menu_data->customclass)) { $custom_class = $menu_data->customclass; } if (isset($menu_data->faicon) && $menu_data->faicon) { $faicon = $menu_data->faicon; } if (isset($menu_data->dropdown)) { $dropdown = $menu_data->dropdown; } if (isset($menu_data->badge)) { $badge = $menu_data->badge; } if (isset($menu_data->badge_position)) { $badge_position = $menu_data->badge_position; } if (isset($menu_data->badge_bg_color)) { $badge_bg_color = $menu_data->badge_bg_color; } if (isset($menu_data->badge_text_color)) { $badge_text_color = $menu_data->badge_text_color; } if (!$enable_megamenu) { $display_class = ' hide-menu-builder'; } else { $dropdown_class = ' hide-menu-builder'; } $custom_class_label = Text::_('HELIX_ULTIMATE_MENU_CUSTOM_CLASS'); $badge_label = Text::_('HELIX_ULTIMATE_MENU_BADGE_TEXT'); $unique_menu_items = $this->uniqueMenuItems($current_menu_id, $layout); if ($unique_menu_items) { $unique_menu_item_count = count($unique_menu_items); } ?> <div class="hu-row"> <div class="hu-col-sm-9"> <div class="hu-megamenu-wrap"> <div class="hu-megamenu-actions"> <?php if ((int) $menu_item->parent_id === 1) { echo $this->switchFieldHTML('toggler', Text::_('HELIX_ULTIMATE_MENU_ENABLED'), $enable_megamenu); echo $this->textFieldHTML('width', Text::_('HELIX_ULTIMATE_MENU_SUB_WIDTH'), 400, $menu_width, 'number', $display_class); echo $this->selectFieldHTML('alignment', Text::_('HELIX_ULTIMATE_MENU_SUB_ALIGNMENT'), $mega_align, $align, $display_class); } echo $this->switchFieldHTML('title-toggler', Text::_('HELIX_ULTIMATE_MENU_SHOW_TITLE'), $show_title); echo $this->selectFieldHTML('dropdown', 'Dropdown Position', $dropdown_list, $dropdown, $dropdown_class); echo $this->selectFieldHTML('fa-icon', Text::_('HELIX_ULTIMATE_MENU_ICON'), $fontawesome->getIcons(), $faicon); echo $this->textFieldHTML('custom-class', $custom_class_label, '', $custom_class); echo $this->textFieldHTML('menu-badge', $badge_label, '', $badge); echo $this->selectFieldHTML('badge-position', 'Badge Position', $dropdown_list, $badge_position); echo $this->colorFieldHTML('bg-color', 'Background Color', '#333333', $badge_bg_color); echo $this->colorFieldHTML('text-color', 'Text Color', '#ffffff', $badge_text_color); ?> </div> <div id="hu-megamenu-layout" class="hu-megamenu-layout hu-megamenu-field-control<?php echo ($enable_megamenu != 1)?' hide-menu-builder':''?>" data-megamenu="<?php echo (int) $enable_megamenu; ?>" data-width="<?php echo htmlspecialchars($menu_width, ENT_QUOTES, 'UTF-8'); ?>" data-menualign="<?php echo htmlspecialchars($align, ENT_QUOTES, 'UTF-8'); ?>" data-dropdown="<?php echo htmlspecialchars($dropdown, ENT_QUOTES, 'UTF-8'); ?>" data-showtitle="<?php echo (int) $show_title; ?>" data-customclass="<?php echo htmlspecialchars($custom_class, ENT_QUOTES, 'UTF-8'); ?>" data-faicon="<?php echo htmlspecialchars($faicon, ENT_QUOTES, 'UTF-8'); ?>" data-badge="<?php echo htmlspecialchars($badge, ENT_QUOTES, 'UTF-8'); ?>" data-badge_position="<?php echo htmlspecialchars($badge_position, ENT_QUOTES, 'UTF-8'); ?>" data-badge_bg_color="<?php echo htmlspecialchars($badge_bg_color, ENT_QUOTES, 'UTF-8'); ?>" data-badge_text_color="<?php echo htmlspecialchars($badge_text_color, ENT_QUOTES, 'UTF-8'); ?>"> <?php if ($layout) { $col_number = 0; ?> <?php foreach ($layout as $key => $row) { ?> <div class="hu-megamenu-row"> <div class="hu-megamenu-row-actions clearfix"> <div class="hu-action-move-row"> <span class="fas fa-sort" aria-hidden="true"></span> Row</div> <a href="#" class="hu-action-detele-row"><span class="fas fa-trash" aria-hidden="true"></span></a> </div> <div class="hu-row"> <?php if (! empty($row->attr) ) { ?> <?php foreach ($row->attr as $col_key => $col) { ?> <div class="hu-megmenu-col hu-col-sm-<?php echo $col->colGrid; ?>" data-grid="<?php echo $col->colGrid; ?>"> <div class="hu-megamenu-column"> <div class="hu-megamenu-column-actions"> <span class="hu-action-move-column"><span class="fas fa-arrows-alt" aria-hidden="true"></span> Column</span> </div> <?php $col_list = '<div class="hu-megamenu-item-list">'; if ( isset($col->items) && count($col->items)) { foreach ($col->items as $item) { if ($item->type === 'module') { $modules = $this->getModuleNameById($item->item_id); $title = $modules->title . '<a href="javascript:;" class="hu-megamenu-remove-module"><span class="fas fa-times" aria-hidden="true"></span></a>'; } elseif ($item->type === 'menu_item') { $title = $JMenuSite->getItem($item->item_id)->title; } $col_list .= '<div class="hu-megamenu-item" data-mod_id="'. $item->item_id .'" data-type="'. $item->type .'">'; $col_list .= '<div class="hu-megamenu-item-module">'; $col_list .= '<div class="hu-megamenu-item-module-title">' . $title . '</div>'; $col_list .= '</div>'; $col_list .= '</div>'; } } if ($unique_menu_item_count && (int) $col_number === 0) { $col_number++; foreach ($unique_menu_items as $key => $item_id) { $col_list .= '<div class="hu-megamenu-item" data-mod_id="' . $item_id .'" data-type="menu_item">'; $col_list .= '<div class="hu-megamenu-item-module">'; $col_list .= '<div class="hu-megamenu-item-module-title">' . $JMenuSite->getItem($item_id)->title .'</div>'; $col_list .= '</div>'; $col_list .= '</div>'; } } $col_list .= '</div>'; echo $col_list; ?> </div> </div> <?php } ?> <?php } ?> </div> </div> <?php } ?> <?php } ?> </div> </div> <div class="hu-megamenu-add-row hu-megamenu-field-control clearfix<?php echo ($enable_megamenu != 1)?' hide-menu-builder':''?>"> <button id="hu-choose-megamenu-layout" class="hu-choose-megamenu-layout"><span class="fas fa-plus-circle" aria-hidden="true"></span> Add New Row</button> <div class="hu-megamenu-modal" id="hu-megamenu-layout-modal" style="display: none;" > <div class="hu-row"> <?php foreach ($this->row_layouts as $row_layout) { $col_grids = explode('+', $row_layout); ?> <div class="hu-col-sm-4"> <div class="hu-megamenu-grids" data-layout="<?php echo $row_layout; ?>"> <div class="hu-row"> <?php foreach ($col_grids as $col_grid) { ?> <div class="hu-col-sm-<?php echo $col_grid; ?>"><div><?php echo $col_grid; ?></div></div> <?php } ?> </div> </div> </div> <?php } ?> </div> </div> </div> <!-- End of Row Layout Structure --> </div> <?php if ((int) $menu_item->parent_id === 1 && $module_list) : ?> <div class="hu-col-sm-3"> <div class="hu-megamenu-sidebar <?php echo ($enable_megamenu != 1) ? ' hide-menu-builder' : ''; ?>"> <h3><span class="fas fa-bars" aria-hidden="true"></span> <?php echo Text::_('HELIX_ULTIMATE_MENU_MODULE_LIST'); ?></h3> <div class="hu-megamenu-module-list"> <?php foreach ($module_list as $module) : ?> <div class="hu-megamenu-draggable-module" data-mod_id="<?php echo $module->id; ?>" data-type="module"><span class="fas fa-arrows-alt" aria-hidden="true"></span> <?php echo $module->title; ?></div> <?php endforeach; ?> </div> </div> </div> <!-- End of Module List --> <?php endif; ?> </div> PKBA#]�\ +system/helixultimate/src/Core/Lib/fonts.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Core\Lib; defined('_JEXEC') or die('Restricted access'); $systemFonts = array( 'Arial' => array( 'weights' => array( 'regular', 'italic', 'bold', 'bold italic' ), ), 'Tahoma', 'Verdana', 'Helvetica', 'Times New Roman', 'Trebuchet MS', 'Georgia' ); PKBA#]��h�}�}�6system/helixultimate/src/Core/Lib/FontawesomeIcons.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\Core\Lib; defined('_JEXEC') or die('restricted aceess'); /** * Class for font-awesome icons. * * @since 2.0.0 */ class FontawesomeIcons { /** * Font-awesome 5 free icons * * @var array The icons class list * @since 2.0.0 */ private $fa5_classes = ["fab fa-500px", "fab fa-accessible-icon", "fab fa-accusoft", "fab fa-acquisitions-incorporated", "fas fa-ad", "far fa-address-book", "far fa-address-card", "fas fa-adjust", "fab fa-adn", "fab fa-adversal", "fab fa-affiliatetheme", "fas fa-air-freshener", "fab fa-airbnb", "fab fa-algolia", "fas fa-align-center", "fas fa-align-justify", "fas fa-align-left", "fas fa-align-right", "fab fa-alipay", "fas fa-allergies", "fab fa-amazon", "fab fa-amazon-pay", "fas fa-ambulance", "fas fa-american-sign-language-interpreting", "fab fa-amilia", "fas fa-anchor", "fab fa-android", "fab fa-angellist", "fas fa-angle-double-down", "fas fa-angle-double-left", "fas fa-angle-double-right", "fas fa-angle-double-up", "fas fa-angle-down", "fas fa-angle-left", "fas fa-angle-right", "fas fa-angle-up", "far fa-angry", "fab fa-angrycreative", "fab fa-angular", "fas fa-ankh", "fab fa-app-store", "fab fa-app-store-ios", "fab fa-apper", "fab fa-apple", "fas fa-apple-alt", "fab fa-apple-pay", "fas fa-archive", "fas fa-archway", "far fa-arrow-alt-circle-down", "far fa-arrow-alt-circle-left", "far fa-arrow-alt-circle-right", "far fa-arrow-alt-circle-up", "fas fa-arrow-circle-down", "fas fa-arrow-circle-left", "fas fa-arrow-circle-right", "fas fa-arrow-circle-up", "fas fa-arrow-down", "fas fa-arrow-left", "fas fa-arrow-right", "fas fa-arrow-up", "fas fa-arrows-alt", "fas fa-arrows-alt-h", "fas fa-arrows-alt-v", "fab fa-artstation", "fas fa-assistive-listening-systems", "fas fa-asterisk", "fab fa-asymmetrik", "fas fa-at", "fas fa-atlas", "fab fa-atlassian", "fas fa-atom", "fab fa-audible", "fas fa-audio-description", "fab fa-autoprefixer", "fab fa-avianex", "fab fa-aviato", "fas fa-award", "fab fa-aws", "fas fa-baby", "fas fa-baby-carriage", "fas fa-backspace", "fas fa-backward", "fas fa-bacon", "fas fa-bacteria", "fas fa-bacterium", "fas fa-bahai", "fas fa-balance-scale", "fas fa-balance-scale-left", "fas fa-balance-scale-right", "fas fa-ban", "fas fa-band-aid", "fab fa-bandcamp", "fas fa-barcode", "fas fa-bars", "fas fa-baseball-ball", "fas fa-basketball-ball", "fas fa-bath", "fas fa-battery-empty", "fas fa-battery-full", "fas fa-battery-half", "fas fa-battery-quarter", "fas fa-battery-three-quarters", "fab fa-battle-net", "fas fa-bed", "fas fa-beer", "fab fa-behance", "fab fa-behance-square", "far fa-bell", "far fa-bell-slash", "fas fa-bezier-curve", "fas fa-bible", "fas fa-bicycle", "fas fa-biking", "fab fa-bimobject", "fas fa-binoculars", "fas fa-biohazard", "fas fa-birthday-cake", "fab fa-bitbucket", "fab fa-bitcoin", "fab fa-bity", "fab fa-black-tie", "fab fa-blackberry", "fas fa-blender", "fas fa-blender-phone", "fas fa-blind", "fas fa-blog", "fab fa-blogger", "fab fa-blogger-b", "fab fa-bluetooth", "fab fa-bluetooth-b", "fas fa-bold", "fas fa-bolt", "fas fa-bomb", "fas fa-bone", "fas fa-bong", "fas fa-book", "fas fa-book-dead", "fas fa-book-medical", "fas fa-book-open", "fas fa-book-reader", "far fa-bookmark", "fab fa-bootstrap", "fas fa-border-all", "fas fa-border-none", "fas fa-border-style", "fas fa-bowling-ball", "fas fa-box", "fas fa-box-open", "fas fa-box-tissue", "fas fa-boxes", "fas fa-braille", "fas fa-brain", "fas fa-bread-slice", "fas fa-briefcase", "fas fa-briefcase-medical", "fas fa-broadcast-tower", "fas fa-broom", "fas fa-brush", "fab fa-btc", "fab fa-buffer", "fas fa-bug", "far fa-building", "fas fa-bullhorn", "fas fa-bullseye", "fas fa-burn", "fab fa-buromobelexperte", "fas fa-bus", "fas fa-bus-alt", "fas fa-business-time", "fab fa-buy-n-large", "fab fa-buysellads", "fas fa-calculator", "far fa-calendar", "far fa-calendar-alt", "far fa-calendar-check", "fas fa-calendar-day", "far fa-calendar-minus", "far fa-calendar-plus", "far fa-calendar-times", "fas fa-calendar-week", "fas fa-camera", "fas fa-camera-retro", "fas fa-campground", "fab fa-canadian-maple-leaf", "fas fa-candy-cane", "fas fa-cannabis", "fas fa-capsules", "fas fa-car", "fas fa-car-alt", "fas fa-car-battery", "fas fa-car-crash", "fas fa-car-side", "fas fa-caravan", "fas fa-caret-down", "fas fa-caret-left", "fas fa-caret-right", "far fa-caret-square-down", "far fa-caret-square-left", "far fa-caret-square-right", "far fa-caret-square-up", "fas fa-caret-up", "fas fa-carrot", "fas fa-cart-arrow-down", "fas fa-cart-plus", "fas fa-cash-register", "fas fa-cat", "fab fa-cc-amazon-pay", "fab fa-cc-amex", "fab fa-cc-apple-pay", "fab fa-cc-diners-club", "fab fa-cc-discover", "fab fa-cc-jcb", "fab fa-cc-mastercard", "fab fa-cc-paypal", "fab fa-cc-stripe", "fab fa-cc-visa", "fab fa-centercode", "fab fa-centos", "fas fa-certificate", "fas fa-chair", "fas fa-chalkboard", "fas fa-chalkboard-teacher", "fas fa-charging-station", "fas fa-chart-area", "far fa-chart-bar", "fas fa-chart-line", "fas fa-chart-pie", "fas fa-check", "far fa-check-circle", "fas fa-check-double", "far fa-check-square", "fas fa-cheese", "fas fa-chess", "fas fa-chess-bishop", "fas fa-chess-board", "fas fa-chess-king", "fas fa-chess-knight", "fas fa-chess-pawn", "fas fa-chess-queen", "fas fa-chess-rook", "fas fa-chevron-circle-down", "fas fa-chevron-circle-left", "fas fa-chevron-circle-right", "fas fa-chevron-circle-up", "fas fa-chevron-down", "fas fa-chevron-left", "fas fa-chevron-right", "fas fa-chevron-up", "fas fa-child", "fab fa-chrome", "fab fa-chromecast", "fas fa-church", "far fa-circle", "fas fa-circle-notch", "fas fa-city", "fas fa-clinic-medical", "far fa-clipboard", "fas fa-clipboard-check", "fas fa-clipboard-list", "far fa-clock", "far fa-clone", "far fa-closed-captioning", "fas fa-cloud", "fas fa-cloud-download-alt", "fas fa-cloud-meatball", "fas fa-cloud-moon", "fas fa-cloud-moon-rain", "fas fa-cloud-rain", "fas fa-cloud-showers-heavy", "fas fa-cloud-sun", "fas fa-cloud-sun-rain", "fas fa-cloud-upload-alt", "fab fa-cloudflare", "fab fa-cloudscale", "fab fa-cloudsmith", "fab fa-cloudversify", "fas fa-cocktail", "fas fa-code", "fas fa-code-branch", "fab fa-codepen", "fab fa-codiepie", "fas fa-coffee", "fas fa-cog", "fas fa-cogs", "fas fa-coins", "fas fa-columns", "far fa-comment", "far fa-comment-alt", "fas fa-comment-dollar", "far fa-comment-dots", "fas fa-comment-medical", "fas fa-comment-slash", "far fa-comments", "fas fa-comments-dollar", "fas fa-compact-disc", "far fa-compass", "fas fa-compress", "fas fa-compress-alt", "fas fa-compress-arrows-alt", "fas fa-concierge-bell", "fab fa-confluence", "fab fa-connectdevelop", "fab fa-contao", "fas fa-cookie", "fas fa-cookie-bite", "far fa-copy", "far fa-copyright", "fab fa-cotton-bureau", "fas fa-couch", "fab fa-cpanel", "fab fa-creative-commons", "fab fa-creative-commons-by", "fab fa-creative-commons-nc", "fab fa-creative-commons-nc-eu", "fab fa-creative-commons-nc-jp", "fab fa-creative-commons-nd", "fab fa-creative-commons-pd", "fab fa-creative-commons-pd-alt", "fab fa-creative-commons-remix", "fab fa-creative-commons-sa", "fab fa-creative-commons-sampling", "fab fa-creative-commons-sampling-plus", "fab fa-creative-commons-share", "fab fa-creative-commons-zero", "far fa-credit-card", "fab fa-critical-role", "fas fa-crop", "fas fa-crop-alt", "fas fa-cross", "fas fa-crosshairs", "fas fa-crow", "fas fa-crown", "fas fa-crutch", "fab fa-css3", "fab fa-css3-alt", "fas fa-cube", "fas fa-cubes", "fas fa-cut", "fab fa-cuttlefish", "fab fa-d-and-d", "fab fa-d-and-d-beyond", "fab fa-dailymotion", "fab fa-dashcube", "fas fa-database", "fas fa-deaf", "fab fa-deezer", "fab fa-delicious", "fas fa-democrat", "fab fa-deploydog", "fab fa-deskpro", "fas fa-desktop", "fab fa-dev", "fab fa-deviantart", "fas fa-dharmachakra", "fab fa-dhl", "fas fa-diagnoses", "fab fa-diaspora", "fas fa-dice", "fas fa-dice-d20", "fas fa-dice-d6", "fas fa-dice-five", "fas fa-dice-four", "fas fa-dice-one", "fas fa-dice-six", "fas fa-dice-three", "fas fa-dice-two", "fab fa-digg", "fab fa-digital-ocean", "fas fa-digital-tachograph", "fas fa-directions", "fab fa-discord", "fab fa-discourse", "fas fa-disease", "fas fa-divide", "far fa-dizzy", "fas fa-dna", "fab fa-dochub", "fab fa-docker", "fas fa-dog", "fas fa-dollar-sign", "fas fa-dolly", "fas fa-dolly-flatbed", "fas fa-donate", "fas fa-door-closed", "fas fa-door-open", "far fa-dot-circle", "fas fa-dove", "fas fa-download", "fab fa-draft2digital", "fas fa-drafting-compass", "fas fa-dragon", "fas fa-draw-polygon", "fab fa-dribbble", "fab fa-dribbble-square", "fab fa-dropbox", "fas fa-drum", "fas fa-drum-steelpan", "fas fa-drumstick-bite", "fab fa-drupal", "fas fa-dumbbell", "fas fa-dumpster", "fas fa-dumpster-fire", "fas fa-dungeon", "fab fa-dyalog", "fab fa-earlybirds", "fab fa-ebay", "fab fa-edge", "fab fa-edge-legacy", "far fa-edit", "fas fa-egg", "fas fa-eject", "fab fa-elementor", "fas fa-ellipsis-h", "fas fa-ellipsis-v", "fab fa-ello", "fab fa-ember", "fab fa-empire", "far fa-envelope", "far fa-envelope-open", "fas fa-envelope-open-text", "fas fa-envelope-square", "fab fa-envira", "fas fa-equals", "fas fa-eraser", "fab fa-erlang", "fab fa-ethereum", "fas fa-ethernet", "fab fa-etsy", "fas fa-euro-sign", "fab fa-evernote", "fas fa-exchange-alt", "fas fa-exclamation", "fas fa-exclamation-circle", "fas fa-exclamation-triangle", "fas fa-expand", "fas fa-expand-alt", "fas fa-expand-arrows-alt", "fab fa-expeditedssl", "fas fa-external-link-alt", "fas fa-external-link-square-alt", "far fa-eye", "fas fa-eye-dropper", "far fa-eye-slash", "fab fa-facebook", "fab fa-facebook-f", "fab fa-facebook-messenger", "fab fa-facebook-square", "fas fa-fan", "fab fa-fantasy-flight-games", "fas fa-fast-backward", "fas fa-fast-forward", "fas fa-faucet", "fas fa-fax", "fas fa-feather", "fas fa-feather-alt", "fab fa-fedex", "fab fa-fedora", "fas fa-female", "fas fa-fighter-jet", "fab fa-figma", "far fa-file", "far fa-file-alt", "far fa-file-archive", "far fa-file-audio", "far fa-file-code", "fas fa-file-contract", "fas fa-file-csv", "fas fa-file-download", "far fa-file-excel", "fas fa-file-export", "far fa-file-image", "fas fa-file-import", "fas fa-file-invoice", "fas fa-file-invoice-dollar", "fas fa-file-medical", "fas fa-file-medical-alt", "far fa-file-pdf", "far fa-file-powerpoint", "fas fa-file-prescription", "fas fa-file-signature", "fas fa-file-upload", "far fa-file-video", "far fa-file-word", "fas fa-fill", "fas fa-fill-drip", "fas fa-film", "fas fa-filter", "fas fa-fingerprint", "fas fa-fire", "fas fa-fire-alt", "fas fa-fire-extinguisher", "fab fa-firefox", "fab fa-firefox-browser", "fas fa-first-aid", "fab fa-first-order", "fab fa-first-order-alt", "fab fa-firstdraft", "fas fa-fish", "fas fa-fist-raised", "far fa-flag", "fas fa-flag-checkered", "fas fa-flag-usa", "fas fa-flask", "fab fa-flickr", "fab fa-flipboard", "far fa-flushed", "fab fa-fly", "far fa-folder", "fas fa-folder-minus", "far fa-folder-open", "fas fa-folder-plus", "fas fa-font", "fab fa-font-awesome", "fab fa-font-awesome-alt", "fab fa-font-awesome-flag", "fab fa-font-awesome-logo-full", "fab fa-fonticons", "fab fa-fonticons-fi", "fas fa-football-ball", "fab fa-fort-awesome", "fab fa-fort-awesome-alt", "fab fa-forumbee", "fas fa-forward", "fab fa-foursquare", "fab fa-free-code-camp", "fab fa-freebsd", "fas fa-frog", "far fa-frown", "far fa-frown-open", "fab fa-fulcrum", "fas fa-funnel-dollar", "far fa-futbol", "fab fa-galactic-republic", "fab fa-galactic-senate", "fas fa-gamepad", "fas fa-gas-pump", "fas fa-gavel", "far fa-gem", "fas fa-genderless", "fab fa-get-pocket", "fab fa-gg", "fab fa-gg-circle", "fas fa-ghost", "fas fa-gift", "fas fa-gifts", "fab fa-git", "fab fa-git-alt", "fab fa-git-square", "fab fa-github", "fab fa-github-alt", "fab fa-github-square", "fab fa-gitkraken", "fab fa-gitlab", "fab fa-gitter", "fas fa-glass-cheers", "fas fa-glass-martini", "fas fa-glass-martini-alt", "fas fa-glass-whiskey", "fas fa-glasses", "fab fa-glide", "fab fa-glide-g", "fas fa-globe", "fas fa-globe-africa", "fas fa-globe-americas", "fas fa-globe-asia", "fas fa-globe-europe", "fab fa-gofore", "fas fa-golf-ball", "fab fa-goodreads", "fab fa-goodreads-g", "fab fa-google", "fab fa-google-drive", "fab fa-google-pay", "fab fa-google-play", "fab fa-google-plus", "fab fa-google-plus-g", "fab fa-google-plus-square", "fab fa-google-wallet", "fas fa-gopuram", "fas fa-graduation-cap", "fab fa-gratipay", "fab fa-grav", "fas fa-greater-than", "fas fa-greater-than-equal", "far fa-grimace", "far fa-grin", "far fa-grin-alt", "far fa-grin-beam", "far fa-grin-beam-sweat", "far fa-grin-hearts", "far fa-grin-squint", "far fa-grin-squint-tears", "far fa-grin-stars", "far fa-grin-tears", "far fa-grin-tongue", "far fa-grin-tongue-squint", "far fa-grin-tongue-wink", "far fa-grin-wink", "fas fa-grip-horizontal", "fas fa-grip-lines", "fas fa-grip-lines-vertical", "fas fa-grip-vertical", "fab fa-gripfire", "fab fa-grunt", "fab fa-guilded", "fas fa-guitar", "fab fa-gulp", "fas fa-h-square", "fab fa-hacker-news", "fab fa-hacker-news-square", "fab fa-hackerrank", "fas fa-hamburger", "fas fa-hammer", "fas fa-hamsa", "fas fa-hand-holding", "fas fa-hand-holding-heart", "fas fa-hand-holding-medical", "fas fa-hand-holding-usd", "fas fa-hand-holding-water", "far fa-hand-lizard", "fas fa-hand-middle-finger", "far fa-hand-paper", "far fa-hand-peace", "far fa-hand-point-down", "far fa-hand-point-left", "far fa-hand-point-right", "far fa-hand-point-up", "far fa-hand-pointer", "far fa-hand-rock", "far fa-hand-scissors", "fas fa-hand-sparkles", "far fa-hand-spock", "fas fa-hands", "fas fa-hands-helping", "fas fa-hands-wash", "far fa-handshake", "fas fa-handshake-alt-slash", "fas fa-handshake-slash", "fas fa-hanukiah", "fas fa-hard-hat", "fas fa-hashtag", "fas fa-hat-cowboy", "fas fa-hat-cowboy-side", "fas fa-hat-wizard", "far fa-hdd", "fas fa-head-side-cough", "fas fa-head-side-cough-slash", "fas fa-head-side-mask", "fas fa-head-side-virus", "fas fa-heading", "fas fa-headphones", "fas fa-headphones-alt", "fas fa-headset", "far fa-heart", "fas fa-heart-broken", "fas fa-heartbeat", "fas fa-helicopter", "fas fa-highlighter", "fas fa-hiking", "fas fa-hippo", "fab fa-hips", "fab fa-hire-a-helper", "fas fa-history", "fab fa-hive", "fas fa-hockey-puck", "fas fa-holly-berry", "fas fa-home", "fab fa-hooli", "fab fa-hornbill", "fas fa-horse", "fas fa-horse-head", "far fa-hospital", "fas fa-hospital-alt", "fas fa-hospital-symbol", "fas fa-hospital-user", "fas fa-hot-tub", "fas fa-hotdog", "fas fa-hotel", "fab fa-hotjar", "far fa-hourglass", "fas fa-hourglass-end", "fas fa-hourglass-half", "fas fa-hourglass-start", "fas fa-house-damage", "fas fa-house-user", "fab fa-houzz", "fas fa-hryvnia", "fab fa-html5", "fab fa-hubspot", "fas fa-i-cursor", "fas fa-ice-cream", "fas fa-icicles", "fas fa-icons", "far fa-id-badge", "far fa-id-card", "fas fa-id-card-alt", "fab fa-ideal", "fas fa-igloo", "far fa-image", "far fa-images", "fab fa-imdb", "fas fa-inbox", "fas fa-indent", "fas fa-industry", "fas fa-infinity", "fas fa-info", "fas fa-info-circle", "fab fa-innosoft", "fab fa-instagram", "fab fa-instagram-square", "fab fa-instalod", "fab fa-intercom", "fab fa-internet-explorer", "fab fa-invision", "fab fa-ioxhost", "fas fa-italic", "fab fa-itch-io", "fab fa-itunes", "fab fa-itunes-note", "fab fa-java", "fas fa-jedi", "fab fa-jedi-order", "fab fa-jenkins", "fab fa-jira", "fab fa-joget", "fas fa-joint", "fab fa-joomla", "fas fa-journal-whills", "fab fa-js", "fab fa-js-square", "fab fa-jsfiddle", "fas fa-kaaba", "fab fa-kaggle", "fas fa-key", "fab fa-keybase", "far fa-keyboard", "fab fa-keycdn", "fas fa-khanda", "fab fa-kickstarter", "fab fa-kickstarter-k", "far fa-kiss", "far fa-kiss-beam", "far fa-kiss-wink-heart", "fas fa-kiwi-bird", "fab fa-korvue", "fas fa-landmark", "fas fa-language", "fas fa-laptop", "fas fa-laptop-code", "fas fa-laptop-house", "fas fa-laptop-medical", "fab fa-laravel", "fab fa-lastfm", "fab fa-lastfm-square", "far fa-laugh", "far fa-laugh-beam", "far fa-laugh-squint", "far fa-laugh-wink", "fas fa-layer-group", "fas fa-leaf", "fab fa-leanpub", "far fa-lemon", "fab fa-less", "fas fa-less-than", "fas fa-less-than-equal", "fas fa-level-down-alt", "fas fa-level-up-alt", "far fa-life-ring", "far fa-lightbulb", "fab fa-line", "fas fa-link", "fab fa-linkedin", "fab fa-linkedin-in", "fab fa-linode", "fab fa-linux", "fas fa-lira-sign", "fas fa-list", "far fa-list-alt", "fas fa-list-ol", "fas fa-list-ul", "fas fa-location-arrow", "fas fa-lock", "fas fa-lock-open", "fas fa-long-arrow-alt-down", "fas fa-long-arrow-alt-left", "fas fa-long-arrow-alt-right", "fas fa-long-arrow-alt-up", "fas fa-low-vision", "fas fa-luggage-cart", "fas fa-lungs", "fas fa-lungs-virus", "fab fa-lyft", "fab fa-magento", "fas fa-magic", "fas fa-magnet", "fas fa-mail-bulk", "fab fa-mailchimp", "fas fa-male", "fab fa-mandalorian", "far fa-map", "fas fa-map-marked", "fas fa-map-marked-alt", "fas fa-map-marker", "fas fa-map-marker-alt", "fas fa-map-pin", "fas fa-map-signs", "fab fa-markdown", "fas fa-marker", "fas fa-mars", "fas fa-mars-double", "fas fa-mars-stroke", "fas fa-mars-stroke-h", "fas fa-mars-stroke-v", "fas fa-mask", "fab fa-mastodon", "fab fa-maxcdn", "fab fa-mdb", "fas fa-medal", "fab fa-medapps", "fab fa-medium", "fab fa-medium-m", "fas fa-medkit", "fab fa-medrt", "fab fa-meetup", "fab fa-megaport", "far fa-meh", "far fa-meh-blank", "far fa-meh-rolling-eyes", "fas fa-memory", "fab fa-mendeley", "fas fa-menorah", "fas fa-mercury", "fas fa-meteor", "fab fa-microblog", "fas fa-microchip", "fas fa-microphone", "fas fa-microphone-alt", "fas fa-microphone-alt-slash", "fas fa-microphone-slash", "fas fa-microscope", "fab fa-microsoft", "fas fa-minus", "fas fa-minus-circle", "far fa-minus-square", "fas fa-mitten", "fab fa-mix", "fab fa-mixcloud", "fab fa-mixer", "fab fa-mizuni", "fas fa-mobile", "fas fa-mobile-alt", "fab fa-modx", "fab fa-monero", "fas fa-money-bill", "far fa-money-bill-alt", "fas fa-money-bill-wave", "fas fa-money-bill-wave-alt", "fas fa-money-check", "fas fa-money-check-alt", "fas fa-monument", "far fa-moon", "fas fa-mortar-pestle", "fas fa-mosque", "fas fa-motorcycle", "fas fa-mountain", "fas fa-mouse", "fas fa-mouse-pointer", "fas fa-mug-hot", "fas fa-music", "fab fa-napster", "fab fa-neos", "fas fa-network-wired", "fas fa-neuter", "far fa-newspaper", "fab fa-nimblr", "fab fa-node", "fab fa-node-js", "fas fa-not-equal", "fas fa-notes-medical", "fab fa-npm", "fab fa-ns8", "fab fa-nutritionix", "far fa-object-group", "far fa-object-ungroup", "fab fa-octopus-deploy", "fab fa-odnoklassniki", "fab fa-odnoklassniki-square", "fas fa-oil-can", "fab fa-old-republic", "fas fa-om", "fab fa-opencart", "fab fa-openid", "fab fa-opera", "fab fa-optin-monster", "fab fa-orcid", "fab fa-osi", "fas fa-otter", "fas fa-outdent", "fab fa-page4", "fab fa-pagelines", "fas fa-pager", "fas fa-paint-brush", "fas fa-paint-roller", "fas fa-palette", "fab fa-palfed", "fas fa-pallet", "far fa-paper-plane", "fas fa-paperclip", "fas fa-parachute-box", "fas fa-paragraph", "fas fa-parking", "fas fa-passport", "fas fa-pastafarianism", "fas fa-paste", "fab fa-patreon", "fas fa-pause", "far fa-pause-circle", "fas fa-paw", "fab fa-paypal", "fas fa-peace", "fas fa-pen", "fas fa-pen-alt", "fas fa-pen-fancy", "fas fa-pen-nib", "fas fa-pen-square", "fas fa-pencil-alt", "fas fa-pencil-ruler", "fab fa-penny-arcade", "fas fa-people-arrows", "fas fa-people-carry", "fas fa-pepper-hot", "fab fa-perbyte", "fas fa-percent", "fas fa-percentage", "fab fa-periscope", "fas fa-person-booth", "fab fa-phabricator", "fab fa-phoenix-framework", "fab fa-phoenix-squadron", "fas fa-phone", "fas fa-phone-alt", "fas fa-phone-slash", "fas fa-phone-square", "fas fa-phone-square-alt", "fas fa-phone-volume", "fas fa-photo-video", "fab fa-php", "fab fa-pied-piper", "fab fa-pied-piper-alt", "fab fa-pied-piper-hat", "fab fa-pied-piper-pp", "fab fa-pied-piper-square", "fas fa-piggy-bank", "fas fa-pills", "fab fa-pinterest", "fab fa-pinterest-p", "fab fa-pinterest-square", "fas fa-pizza-slice", "fas fa-place-of-worship", "fas fa-plane", "fas fa-plane-arrival", "fas fa-plane-departure", "fas fa-plane-slash", "fas fa-play", "far fa-play-circle", "fab fa-playstation", "fas fa-plug", "fas fa-plus", "fas fa-plus-circle", "far fa-plus-square", "fas fa-podcast", "fas fa-poll", "fas fa-poll-h", "fas fa-poo", "fas fa-poo-storm", "fas fa-poop", "fas fa-portrait", "fas fa-pound-sign", "fas fa-power-off", "fas fa-pray", "fas fa-praying-hands", "fas fa-prescription", "fas fa-prescription-bottle", "fas fa-prescription-bottle-alt", "fas fa-print", "fas fa-procedures", "fab fa-product-hunt", "fas fa-project-diagram", "fas fa-pump-medical", "fas fa-pump-soap", "fab fa-pushed", "fas fa-puzzle-piece", "fab fa-python", "fab fa-qq", "fas fa-qrcode", "fas fa-question", "far fa-question-circle", "fas fa-quidditch", "fab fa-quinscape", "fab fa-quora", "fas fa-quote-left", "fas fa-quote-right", "fas fa-quran", "fab fa-r-project", "fas fa-radiation", "fas fa-radiation-alt", "fas fa-rainbow", "fas fa-random", "fab fa-raspberry-pi", "fab fa-ravelry", "fab fa-react", "fab fa-reacteurope", "fab fa-readme", "fab fa-rebel", "fas fa-receipt", "fas fa-record-vinyl", "fas fa-recycle", "fab fa-red-river", "fab fa-reddit", "fab fa-reddit-alien", "fab fa-reddit-square", "fab fa-redhat", "fas fa-redo", "fas fa-redo-alt", "far fa-registered", "fas fa-remove-format", "fab fa-renren", "fas fa-reply", "fas fa-reply-all", "fab fa-replyd", "fas fa-republican", "fab fa-researchgate", "fab fa-resolving", "fas fa-restroom", "fas fa-retweet", "fab fa-rev", "fas fa-ribbon", "fas fa-ring", "fas fa-road", "fas fa-robot", "fas fa-rocket", "fab fa-rocketchat", "fab fa-rockrms", "fas fa-route", "fas fa-rss", "fas fa-rss-square", "fas fa-ruble-sign", "fas fa-ruler", "fas fa-ruler-combined", "fas fa-ruler-horizontal", "fas fa-ruler-vertical", "fas fa-running", "fas fa-rupee-sign", "fab fa-rust", "far fa-sad-cry", "far fa-sad-tear", "fab fa-safari", "fab fa-salesforce", "fab fa-sass", "fas fa-satellite", "fas fa-satellite-dish", "far fa-save", "fab fa-schlix", "fas fa-school", "fas fa-screwdriver", "fab fa-scribd", "fas fa-scroll", "fas fa-sd-card", "fas fa-search", "fas fa-search-dollar", "fas fa-search-location", "fas fa-search-minus", "fas fa-search-plus", "fab fa-searchengin", "fas fa-seedling", "fab fa-sellcast", "fab fa-sellsy", "fas fa-server", "fab fa-servicestack", "fas fa-shapes", "fas fa-share", "fas fa-share-alt", "fas fa-share-alt-square", "far fa-share-square", "fas fa-shekel-sign", "fas fa-shield-alt", "fas fa-shield-virus", "fas fa-ship", "fas fa-shipping-fast", "fab fa-shirtsinbulk", "fas fa-shoe-prints", "fab fa-shopify", "fas fa-shopping-bag", "fas fa-shopping-basket", "fas fa-shopping-cart", "fab fa-shopware", "fas fa-shower", "fas fa-shuttle-van", "fas fa-sign", "fas fa-sign-in-alt", "fas fa-sign-language", "fas fa-sign-out-alt", "fas fa-signal", "fas fa-signature", "fas fa-sim-card", "fab fa-simplybuilt", "fas fa-sink", "fab fa-sistrix", "fas fa-sitemap", "fab fa-sith", "fas fa-skating", "fab fa-sketch", "fas fa-skiing", "fas fa-skiing-nordic", "fas fa-skull", "fas fa-skull-crossbones", "fab fa-skyatlas", "fab fa-slack", "fab fa-slack-hash", "fas fa-slash", "fas fa-sleigh", "fas fa-sliders-h", "fab fa-slideshare", "far fa-smile", "far fa-smile-beam", "far fa-smile-wink", "fas fa-smog", "fas fa-smoking", "fas fa-smoking-ban", "fas fa-sms", "fab fa-snapchat", "fab fa-snapchat-ghost", "fab fa-snapchat-square", "fas fa-snowboarding", "far fa-snowflake", "fas fa-snowman", "fas fa-snowplow", "fas fa-soap", "fas fa-socks", "fas fa-solar-panel", "fas fa-sort", "fas fa-sort-alpha-down", "fas fa-sort-alpha-down-alt", "fas fa-sort-alpha-up", "fas fa-sort-alpha-up-alt", "fas fa-sort-amount-down", "fas fa-sort-amount-down-alt", "fas fa-sort-amount-up", "fas fa-sort-amount-up-alt", "fas fa-sort-down", "fas fa-sort-numeric-down", "fas fa-sort-numeric-down-alt", "fas fa-sort-numeric-up", "fas fa-sort-numeric-up-alt", "fas fa-sort-up", "fab fa-soundcloud", "fab fa-sourcetree", "fas fa-spa", "fas fa-space-shuttle", "fab fa-speakap", "fab fa-speaker-deck", "fas fa-spell-check", "fas fa-spider", "fas fa-spinner", "fas fa-splotch", "fab fa-spotify", "fas fa-spray-can", "far fa-square", "fas fa-square-full", "fas fa-square-root-alt", "fab fa-squarespace", "fab fa-stack-exchange", "fab fa-stack-overflow", "fab fa-stackpath", "fas fa-stamp", "far fa-star", "fas fa-star-and-crescent", "far fa-star-half", "fas fa-star-half-alt", "fas fa-star-of-david", "fas fa-star-of-life", "fab fa-staylinked", "fab fa-steam", "fab fa-steam-square", "fab fa-steam-symbol", "fas fa-step-backward", "fas fa-step-forward", "fas fa-stethoscope", "fab fa-sticker-mule", "far fa-sticky-note", "fas fa-stop", "far fa-stop-circle", "fas fa-stopwatch", "fas fa-stopwatch-20", "fas fa-store", "fas fa-store-alt", "fas fa-store-alt-slash", "fas fa-store-slash", "fab fa-strava", "fas fa-stream", "fas fa-street-view", "fas fa-strikethrough", "fab fa-stripe", "fab fa-stripe-s", "fas fa-stroopwafel", "fab fa-studiovinari", "fab fa-stumbleupon", "fab fa-stumbleupon-circle", "fas fa-subscript", "fas fa-subway", "fas fa-suitcase", "fas fa-suitcase-rolling", "far fa-sun", "fab fa-superpowers", "fas fa-superscript", "fab fa-supple", "far fa-surprise", "fab fa-suse", "fas fa-swatchbook", "fab fa-swift", "fas fa-swimmer", "fas fa-swimming-pool", "fab fa-symfony", "fas fa-synagogue", "fas fa-sync", "fas fa-sync-alt", "fas fa-syringe", "fas fa-table", "fas fa-table-tennis", "fas fa-tablet", "fas fa-tablet-alt", "fas fa-tablets", "fas fa-tachometer-alt", "fas fa-tag", "fas fa-tags", "fas fa-tape", "fas fa-tasks", "fas fa-taxi", "fab fa-teamspeak", "fas fa-teeth", "fas fa-teeth-open", "fab fa-telegram", "fab fa-telegram-plane", "fas fa-temperature-high", "fas fa-temperature-low", "fab fa-tencent-weibo", "fas fa-tenge", "fas fa-terminal", "fas fa-text-height", "fas fa-text-width", "fas fa-th", "fas fa-th-large", "fas fa-th-list", "fab fa-the-red-yeti", "fas fa-theater-masks", "fab fa-themeco", "fab fa-themeisle", "fas fa-thermometer", "fas fa-thermometer-empty", "fas fa-thermometer-full", "fas fa-thermometer-half", "fas fa-thermometer-quarter", "fas fa-thermometer-three-quarters", "fab fa-think-peaks", "far fa-thumbs-down", "far fa-thumbs-up", "fas fa-thumbtack", "fas fa-ticket-alt", "fab fa-tiktok", "fas fa-times", "far fa-times-circle", "fas fa-tint", "fas fa-tint-slash", "far fa-tired", "fas fa-toggle-off", "fas fa-toggle-on", "fas fa-toilet", "fas fa-toilet-paper", "fas fa-toilet-paper-slash", "fas fa-toolbox", "fas fa-tools", "fas fa-tooth", "fas fa-torah", "fas fa-torii-gate", "fas fa-tractor", "fab fa-trade-federation", "fas fa-trademark", "fas fa-traffic-light", "fas fa-trailer", "fas fa-train", "fas fa-tram", "fas fa-transgender", "fas fa-transgender-alt", "fas fa-trash", "far fa-trash-alt", "fas fa-trash-restore", "fas fa-trash-restore-alt", "fas fa-tree", "fab fa-trello", "fab fa-tripadvisor", "fas fa-trophy", "fas fa-truck", "fas fa-truck-loading", "fas fa-truck-monster", "fas fa-truck-moving", "fas fa-truck-pickup", "fas fa-tshirt", "fas fa-tty", "fab fa-tumblr", "fab fa-tumblr-square", "fas fa-tv", "fab fa-twitch", "fab fa-twitter", "fab fa-twitter-square", "fab fa-typo3", "fab fa-uber", "fab fa-ubuntu", "fab fa-uikit", "fab fa-umbraco", "fas fa-umbrella", "fas fa-umbrella-beach", "fab fa-uncharted", "fas fa-underline", "fas fa-undo", "fas fa-undo-alt", "fab fa-uniregistry", "fab fa-unity", "fas fa-universal-access", "fas fa-university", "fas fa-unlink", "fas fa-unlock", "fas fa-unlock-alt", "fab fa-unsplash", "fab fa-untappd", "fas fa-upload", "fab fa-ups", "fab fa-usb", "far fa-user", "fas fa-user-alt", "fas fa-user-alt-slash", "fas fa-user-astronaut", "fas fa-user-check", "far fa-user-circle", "fas fa-user-clock", "fas fa-user-cog", "fas fa-user-edit", "fas fa-user-friends", "fas fa-user-graduate", "fas fa-user-injured", "fas fa-user-lock", "fas fa-user-md", "fas fa-user-minus", "fas fa-user-ninja", "fas fa-user-nurse", "fas fa-user-plus", "fas fa-user-secret", "fas fa-user-shield", "fas fa-user-slash", "fas fa-user-tag", "fas fa-user-tie", "fas fa-user-times", "fas fa-users", "fas fa-users-cog", "fas fa-users-slash", "fab fa-usps", "fab fa-ussunnah", "fas fa-utensil-spoon", "fas fa-utensils", "fab fa-vaadin", "fas fa-vector-square", "fas fa-venus", "fas fa-venus-double", "fas fa-venus-mars", "fas fa-vest", "fas fa-vest-patches", "fab fa-viacoin", "fab fa-viadeo", "fab fa-viadeo-square", "fas fa-vial", "fas fa-vials", "fab fa-viber", "fas fa-video", "fas fa-video-slash", "fas fa-vihara", "fab fa-vimeo", "fab fa-vimeo-square", "fab fa-vimeo-v", "fab fa-vine", "fas fa-virus", "fas fa-virus-slash", "fas fa-viruses", "fab fa-vk", "fab fa-vnv", "fas fa-voicemail", "fas fa-volleyball-ball", "fas fa-volume-down", "fas fa-volume-mute", "fas fa-volume-off", "fas fa-volume-up", "fas fa-vote-yea", "fas fa-vr-cardboard", "fab fa-vuejs", "fas fa-walking", "fas fa-wallet", "fas fa-warehouse", "fab fa-watchman-monitoring", "fas fa-water", "fas fa-wave-square", "fab fa-waze", "fab fa-weebly", "fab fa-weibo", "fas fa-weight", "fas fa-weight-hanging", "fab fa-weixin", "fab fa-whatsapp", "fab fa-whatsapp-square", "fas fa-wheelchair", "fab fa-whmcs", "fas fa-wifi", "fab fa-wikipedia-w", "fas fa-wind", "far fa-window-close", "far fa-window-maximize", "far fa-window-minimize", "far fa-window-restore", "fab fa-windows", "fas fa-wine-bottle", "fas fa-wine-glass", "fas fa-wine-glass-alt", "fab fa-wix", "fab fa-wizards-of-the-coast", "fab fa-wodu", "fab fa-wolf-pack-battalion", "fas fa-won-sign", "fab fa-wordpress", "fab fa-wordpress-simple", "fab fa-wpbeginner", "fab fa-wpexplorer", "fab fa-wpforms", "fab fa-wpressr", "fas fa-wrench", "fas fa-x-ray", "fab fa-xbox", "fab fa-xing", "fab fa-xing-square", "fab fa-y-combinator", "fab fa-yahoo", "fab fa-yammer", "fab fa-yandex", "fab fa-yandex-international", "fab fa-yarn", "fab fa-yelp", "fas fa-yen-sign", "fas fa-yin-yang", "fab fa-yoast", "fab fa-youtube", "fab fa-youtube-square", "fab fa-zhihu"]; /** * Font awesome icon class names. * * @var array Font-awesome class names. * @since 2.0.0 */ private $fa_class_lists = array( 'fa-500px', 'fa-adjust', 'fa-adn', 'fa-align-center', 'fa-align-justify', 'fa-align-left', 'fa-align-right', 'fa-amazon', 'fa-ambulance', 'fa-anchor', 'fa-android', 'fa-angellist', 'fa-angle-double-down', 'fa-angle-double-left', 'fa-angle-double-right', 'fa-angle-double-up', 'fa-angle-down', 'fa-angle-left', 'fa-angle-right', 'fa-angle-up', 'fa-apple', 'fa-archive', 'fa-area-chart', 'fa-arrow-circle-down', 'fa-arrow-circle-left', 'fa-arrow-circle-o-down', 'fa-arrow-circle-o-left', 'fa-arrow-circle-o-right', 'fa-arrow-circle-o-up', 'fa-arrow-circle-right', 'fa-arrow-circle-up', 'fa-arrow-down', 'fa-arrow-left', 'fa-arrow-right', 'fa-arrow-up', 'fa-arrows', 'fa-arrows-alt', 'fa-arrows-h', 'fa-arrows-v', 'fa-asterisk', 'fa-at', 'fa-automobile', 'fa-backward', 'fa-balance-scale', 'fa-ban', 'fa-bank', 'fa-bar-chart', 'fa-bar-chart-o', 'fa-barcode', 'fa-bars', 'fa-battery-0', 'fa-battery-1', 'fa-battery-2', 'fa-battery-3', 'fa-battery-4', 'fa-battery-empty', 'fa-battery-full', 'fa-battery-half', 'fa-battery-quarter', 'fa-battery-three-quarters', 'fa-bed', 'fa-beer', 'fa-behance', 'fa-behance-square', 'fa-bell', 'fa-bell-o', 'fa-bell-slash', 'fa-bell-slash-o', 'fa-bicycle', 'fa-binoculars', 'fa-birthday-cake', 'fa-bitbucket', 'fa-bitbucket-square', 'fa-bitcoin', 'fa-black-tie', 'fa-bluetooth', 'fa-bluetooth-b', 'fa-bold', 'fa-bolt', 'fa-bomb', 'fa-book', 'fa-bookmark', 'fa-bookmark-o', 'fa-briefcase', 'fa-btc', 'fa-bug', 'fa-building', 'fa-building-o', 'fa-bullhorn', 'fa-bullseye', 'fa-bus', 'fa-buysellads', 'fa-cab', 'fa-calculator', 'fa-calendar', 'fa-calendar-check-o', 'fa-calendar-minus-o', 'fa-calendar-o', 'fa-calendar-plus-o', 'fa-calendar-times-o', 'fa-camera', 'fa-camera-retro', 'fa-car', 'fa-caret-down', 'fa-caret-left', 'fa-caret-right', 'fa-caret-square-o-down', 'fa-caret-square-o-left', 'fa-caret-square-o-right', 'fa-caret-square-o-up', 'fa-caret-up', 'fa-cart-arrow-down', 'fa-cart-plus', 'fa-cc', 'fa-cc-amex', 'fa-cc-diners-club', 'fa-cc-discover', 'fa-cc-jcb', 'fa-cc-mastercard', 'fa-cc-paypal', 'fa-cc-stripe', 'fa-cc-visa', 'fa-certificate', 'fa-chain', 'fa-chain-broken', 'fa-check', 'fa-check-circle', 'fa-check-circle-o', 'fa-check-square', 'fa-check-square-o', 'fa-chevron-circle-down', 'fa-chevron-circle-left', 'fa-chevron-circle-right', 'fa-chevron-circle-up', 'fa-chevron-down', 'fa-chevron-left', 'fa-chevron-right', 'fa-chevron-up', 'fa-child', 'fa-chrome', 'fa-circle', 'fa-circle-o', 'fa-circle-o-notch', 'fa-circle-thin', 'fa-clipboard', 'fa-clock-o', 'fa-clone', 'fa-close', 'fa-cloud', 'fa-cloud-download', 'fa-cloud-upload', 'fa-cny', 'fa-code', 'fa-code-fork', 'fa-codepen', 'fa-codiepie', 'fa-coffee', 'fa-cog', 'fa-cogs', 'fa-columns', 'fa-comment', 'fa-comment-o', 'fa-commenting', 'fa-commenting-o', 'fa-comments', 'fa-comments-o', 'fa-compass', 'fa-compress', 'fa-connectdevelop', 'fa-contao', 'fa-copy', 'fa-copyright', 'fa-creative-commons', 'fa-credit-card', 'fa-credit-card-alt', 'fa-crop', 'fa-crosshairs', 'fa-css3', 'fa-cube', 'fa-cubes', 'fa-cut', 'fa-cutlery', 'fa-dashboard', 'fa-dashcube', 'fa-database', 'fa-dedent', 'fa-delicious', 'fa-desktop', 'fa-deviantart', 'fa-diamond', 'fa-digg', 'fa-dollar', 'fa-dot-circle-o', 'fa-download', 'fa-dribbble', 'fa-dropbox', 'fa-drupal', 'fa-edge', 'fa-edit', 'fa-eject', 'fa-ellipsis-h', 'fa-ellipsis-v', 'fa-empire', 'fa-envelope', 'fa-envelope-o', 'fa-envelope-square', 'fa-eraser', 'fa-eur', 'fa-euro', 'fa-exchange', 'fa-exclamation', 'fa-exclamation-circle', 'fa-exclamation-triangle', 'fa-expand', 'fa-expeditedssl', 'fa-external-link', 'fa-external-link-square', 'fa-eye', 'fa-eye-slash', 'fa-eyedropper', 'fa-facebook', 'fa-facebook-f', 'fa-facebook-official', 'fa-facebook-square', 'fa-fast-backward', 'fa-fast-forward', 'fa-fax', 'fa-feed', 'fa-female', 'fa-fighter-jet', 'fa-file', 'fa-file-archive-o', 'fa-file-audio-o', 'fa-file-code-o', 'fa-file-excel-o', 'fa-file-image-o', 'fa-file-movie-o', 'fa-file-o', 'fa-file-pdf-o', 'fa-file-photo-o', 'fa-file-picture-o', 'fa-file-powerpoint-o', 'fa-file-sound-o', 'fa-file-text', 'fa-file-text-o', 'fa-file-video-o', 'fa-file-word-o', 'fa-file-zip-o', 'fa-files-o', 'fa-film', 'fa-filter', 'fa-fire', 'fa-fire-extinguisher', 'fa-firefox', 'fa-flag', 'fa-flag-checkered', 'fa-flag-o', 'fa-flash', 'fa-flask', 'fa-flickr', 'fa-floppy-o', 'fa-folder', 'fa-folder-o', 'fa-folder-open', 'fa-folder-open-o', 'fa-font', 'fa-fonticons', 'fa-fort-awesome', 'fa-forumbee', 'fa-forward', 'fa-foursquare', 'fa-frown-o', 'fa-futbol-o', 'fa-gamepad', 'fa-gavel', 'fa-gbp', 'fa-ge', 'fa-gear', 'fa-gears', 'fa-genderless', 'fa-get-pocket', 'fa-gg', 'fa-gg-circle', 'fa-gift', 'fa-git', 'fa-git-square', 'fa-github', 'fa-github-alt', 'fa-github-square', 'fa-gittip', 'fa-glass', 'fa-globe', 'fa-google', 'fa-google-plus', 'fa-google-plus-square', 'fa-google-wallet', 'fa-graduation-cap', 'fa-gratipay', 'fa-group', 'fa-h-square', 'fa-hacker-news', 'fa-hand-grab-o', 'fa-hand-lizard-o', 'fa-hand-o-down', 'fa-hand-o-left', 'fa-hand-o-right', 'fa-hand-o-up', 'fa-hand-paper-o', 'fa-hand-peace-o', 'fa-hand-pointer-o', 'fa-hand-rock-o', 'fa-hand-scissors-o', 'fa-hand-spock-o', 'fa-hand-stop-o', 'fa-hashtag', 'fa-hdd-o', 'fa-header', 'fa-headphones', 'fa-heart', 'fa-heart-o', 'fa-heartbeat', 'fa-history', 'fa-home', 'fa-hospital-o', 'fa-hotel', 'fa-hourglass', 'fa-hourglass-1', 'fa-hourglass-2', 'fa-hourglass-3', 'fa-hourglass-end', 'fa-hourglass-half', 'fa-hourglass-o', 'fa-hourglass-start', 'fa-houzz', 'fa-html5', 'fa-i-cursor', 'fa-ils', 'fa-image', 'fa-inbox', 'fa-indent', 'fa-industry', 'fa-info', 'fa-info-circle', 'fa-inr', 'fa-instagram', 'fa-institution', 'fa-internet-explorer', 'fa-intersex', 'fa-ioxhost', 'fa-italic', 'fa-joomla', 'fa-jpy', 'fa-jsfiddle', 'fa-key', 'fa-keyboard-o', 'fa-krw', 'fa-language', 'fa-laptop', 'fa-lastfm', 'fa-lastfm-square', 'fa-leaf', 'fa-leanpub', 'fa-legal', 'fa-lemon-o', 'fa-level-down', 'fa-level-up', 'fa-life-bouy', 'fa-life-buoy', 'fa-life-ring', 'fa-life-saver', 'fa-lightbulb-o', 'fa-line-chart', 'fa-link', 'fa-linkedin', 'fa-linkedin-square', 'fa-linux', 'fa-list', 'fa-list-alt', 'fa-list-ol', 'fa-list-ul', 'fa-location-arrow', 'fa-lock', 'fa-long-arrow-down', 'fa-long-arrow-left', 'fa-long-arrow-right', 'fa-long-arrow-up', 'fa-magic', 'fa-magnet', 'fa-mail-forward', 'fa-mail-reply', 'fa-mail-reply-all', 'fa-male', 'fa-map', 'fa-map-marker', 'fa-map-o', 'fa-map-pin', 'fa-map-signs', 'fa-mars', 'fa-mars-double', 'fa-mars-stroke', 'fa-mars-stroke-h', 'fa-mars-stroke-v', 'fa-maxcdn', 'fa-meanpath', 'fa-medium', 'fa-medkit', 'fa-meh-o', 'fa-mercury', 'fa-microphone', 'fa-microphone-slash', 'fa-minus', 'fa-minus-circle', 'fa-minus-square', 'fa-minus-square-o', 'fa-mixcloud', 'fa-mobile', 'fa-mobile-phone', 'fa-modx', 'fa-money', 'fa-moon-o', 'fa-mortar-board', 'fa-motorcycle', 'fa-mouse-pointer', 'fa-music', 'fa-navicon', 'fa-neuter', 'fa-newspaper-o', 'fa-object-group', 'fa-object-ungroup', 'fa-odnoklassniki', 'fa-odnoklassniki-square', 'fa-opencart', 'fa-openid', 'fa-opera', 'fa-optin-monster', 'fa-outdent', 'fa-pagelines', 'fa-paint-brush', 'fa-paper-plane', 'fa-paper-plane-o', 'fa-paperclip', 'fa-paragraph', 'fa-paste', 'fa-pause', 'fa-pause-circle', 'fa-pause-circle-o', 'fa-paw', 'fa-paypal', 'fa-pencil', 'fa-pencil-square', 'fa-pencil-square-o', 'fa-percent', 'fa-phone', 'fa-phone-square', 'fa-photo', 'fa-picture-o', 'fa-pie-chart', 'fa-pied-piper', 'fa-pied-piper-alt', 'fa-pinterest', 'fa-pinterest-p', 'fa-pinterest-square', 'fa-plane', 'fa-play', 'fa-play-circle', 'fa-play-circle-o', 'fa-plug', 'fa-plus', 'fa-plus-circle', 'fa-plus-square', 'fa-plus-square-o', 'fa-power-off', 'fa-print', 'fa-product-hunt', 'fa-puzzle-piece', 'fa-qq', 'fa-qrcode', 'fa-question', 'fa-question-circle', 'fa-quote-left', 'fa-quote-right', 'fa-ra', 'fa-random', 'fa-rebel', 'fa-recycle', 'fa-reddit', 'fa-reddit-alien', 'fa-reddit-square', 'fa-refresh', 'fa-registered', 'fa-remove', 'fa-renren', 'fa-reorder', 'fa-repeat', 'fa-reply', 'fa-reply-all', 'fa-retweet', 'fa-rmb', 'fa-road', 'fa-rocket', 'fa-rotate-left', 'fa-rotate-right', 'fa-rouble', 'fa-rss', 'fa-rss-square', 'fa-rub', 'fa-ruble', 'fa-rupee', 'fa-safari', 'fa-save', 'fa-scissors', 'fa-scribd', 'fa-search', 'fa-search-minus', 'fa-search-plus', 'fa-sellsy', 'fa-send', 'fa-send-o', 'fa-server', 'fa-share', 'fa-share-alt', 'fa-share-alt-square', 'fa-share-square', 'fa-share-square-o', 'fa-shekel', 'fa-sheqel', 'fa-shield', 'fa-ship', 'fa-shirtsinbulk', 'fa-shopping-bag', 'fa-shopping-basket', 'fa-shopping-cart', 'fa-sign-in', 'fa-sign-out', 'fa-signal', 'fa-simplybuilt', 'fa-sitemap', 'fa-skyatlas', 'fa-slack', 'fa-sliders-h', 'fa-slideshare', 'fa-smile-o', 'fa-soccer-ball-o', 'fa-sort', 'fa-sort-alpha-asc', 'fa-sort-alpha-desc', 'fa-sort-amount-asc', 'fa-sort-amount-desc', 'fa-sort-asc', 'fa-sort-desc', 'fa-sort-down', 'fa-sort-numeric-asc', 'fa-sort-numeric-desc', 'fa-sort-up', 'fa-soundcloud', 'fa-space-shuttle', 'fa-spinner', 'fa-spoon', 'fa-spotify', 'fa-square', 'fa-square-o', 'fa-stack-exchange', 'fa-stack-overflow', 'fa-star', 'fa-star-half', 'fa-star-half-empty', 'fa-star-half-full', 'fa-star-half-o', 'fa-star-o', 'fa-steam', 'fa-steam-square', 'fa-step-backward', 'fa-step-forward', 'fa-stethoscope', 'fa-sticky-note', 'fa-sticky-note-o', 'fa-stop', 'fa-stop-circle', 'fa-stop-circle-o', 'fa-street-view', 'fa-strikethrough', 'fa-stumbleupon', 'fa-stumbleupon-circle', 'fa-subscript', 'fa-subway', 'fa-suitcase', 'fa-sun-o', 'fa-superscript', 'fa-support', 'fa-table', 'fa-tablet', 'fa-tachometer', 'fa-tag', 'fa-tags', 'fa-tasks', 'fa-taxi', 'fa-television', 'fa-tencent-weibo', 'fa-terminal', 'fa-text-height', 'fa-text-width', 'fa-th', 'fa-th-large', 'fa-th-list', 'fa-thumb-tack', 'fa-thumbs-down', 'fa-thumbs-o-down', 'fa-thumbs-o-up', 'fa-thumbs-up', 'fa-ticket', 'fa-times', 'fa-times-circle', 'fa-times-circle-o', 'fa-tint', 'fa-toggle-down', 'fa-toggle-left', 'fa-toggle-off', 'fa-toggle-on', 'fa-toggle-right', 'fa-toggle-up', 'fa-trademark', 'fa-train', 'fa-transgender', 'fa-transgender-alt', 'fa-trash', 'fa-trash-o', 'fa-tree', 'fa-trello', 'fa-tripadvisor', 'fa-trophy', 'fa-truck', 'fa-try', 'fa-tty', 'fa-tumblr', 'fa-tumblr-square', 'fa-turkish-lira', 'fa-tv', 'fa-twitch', 'fa-twitter', 'fa-twitter-square', 'fa-umbrella', 'fa-underline', 'fa-undo', 'fa-university', 'fa-unlink', 'fa-unlock', 'fa-unlock-alt', 'fa-unsorted', 'fa-upload', 'fa-usb', 'fa-usd', 'fa-user', 'fa-user-md', 'fa-user-plus', 'fa-user-secret', 'fa-user-times', 'fa-users', 'fa-venus', 'fa-venus-double', 'fa-venus-mars', 'fa-viacoin', 'fa-video-camera', 'fa-vimeo', 'fa-vimeo-square', 'fa-vine', 'fa-vk', 'fa-volume-down', 'fa-volume-off', 'fa-volume-up', 'fa-warning', 'fa-wechat', 'fa-weibo', 'fa-weixin', 'fa-whatsapp', 'fa-wheelchair', 'fa-wifi', 'fa-wikipedia-w', 'fa-windows', 'fa-won', 'fa-wordpress', 'fa-wrench', 'fa-xing', 'fa-xing-square', 'fa-y-combinator', 'fa-y-combinator-square', 'fa-yahoo', 'fa-yc', 'fa-yc-square', 'fa-yelp', 'fa-yen', 'fa-youtube', 'fa-youtube-play', 'fa-youtube-square', // New 'fa-address-book', 'fa-address-book-o', 'fa-address-card', 'fa-address-card-o', 'fa-vcard', 'fa-vcard-o', 'fa-bandcamp', 'fa-bathtub', 'fa-s15', 'fa-bath', 'fa-id-card', 'fa-drivers-license-o', 'fa-id-card-o', 'fa-eercast', 'fa-envelope-open', 'fa-envelope-open-o', 'fa-etsy', 'fa-free-code-camp', 'fa-grav', 'fa-handshake-o', 'fa-id-badge', 'fa-id-card-o', 'fa-imdb', 'fa-linode', 'fa-meetup', 'fa-microchip', 'fa-podcast', 'fa-quora', 'fa-ravelry', 'fa-shower', 'fa-snowflake-o', 'fa-superpowers', 'fa-telegram', 'fa-thermometer', 'fa-thermometer-full', 'fa-thermometer-4', 'fa-thermometer-3', 'fa-thermometer-three-quarters', 'fa-thermometer-2', 'fa-thermometer-half', 'fa-thermometer-1', 'fa-thermometer-quarter', 'fa-thermometer-0', 'fa-thermometer-empty', 'fa-window-close', 'fa-window-close-o', 'fa-user-circle', 'fa-user-circle-o', 'fa-user-o', 'fa-window-maximize', 'fa-window-restore', 'fa-wpexplorer' ); /** * Fontawesome icons array. * * @var array Fontawesome icons. * @since 2.0.0 */ private $icons = array(); /** * Constructor function. * * @return void * @since 2.0.0 */ public function __construct($version = 5) { if ($version === 4) { $this->icons = $this->fa_class_lists; } elseif ($version === 5) { $this->icons = $this->fa5_classes; } } /** * Get icon list. * * @param int $version The fontawesome version. * * @return array Fontawesome icons. * @Since 1.0.0 */ public function getIcons() { return $this->icons; } /** * Add icon into the array. * * @param string $icon The icon class * * @return void * @since 2.0.0 */ public function addIcon($icon) { $this->icons[] = $icon; } } PKBA#]CT؍����/system/helixultimate/src/Core/HelixUltimate.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ Namespace HelixUltimate\Framework\Core; defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use HelixUltimate\Framework\System\JoomlaBridge; use Joomla\CMS\Access\Access; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\Filesystem\File; use Joomla\Filesystem\Folder; use Joomla\Filesystem\Path; use Joomla\CMS\Filter\OutputFilter; use Joomla\CMS\Form\Form; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Uri\Uri; use Joomla\Registry\Registry; use Joomla\Utilities\ArrayHelper; use ScssPhp\ScssPhp\Compiler; use ScssPhp\ScssPhp\OutputStyle; use ScssPhp\ScssPhp\ValueConverter; use Joomla\CMS\Language\Text; /** * Initiator class for viewing * template. * * @since 1.0.0 */ class HelixUltimate { /** * Template params. * * @var object $params The helix params. * @since 1.0.0 */ public $params; /** * The document object * * @var JDocument * @since 1.0.0 */ private $doc; /** * Joomla! app instance. * * @var CMSApplication $app The CMS application instance. * @since 1.0.0 */ public $app; /** * Input instance * * @var JInput * @since 1.0.0 */ public $input; /** * Get active template. * * @var object $template * @since 1.0.0 */ public $template; /** * Template folder url. * * @var string * @since 1.0.0 */ public $template_folder_url; /** * In positions * * @var array * @since 1.0.0 */ private $in_positions = array(); /** * Load feature * * @var array * @since 1.0.0 */ public $loadFeature = array(); /** * Constructor function. * * @since 1.0.0 */ public function __construct() { $this->app = Factory::getApplication(); $this->input = $this->app->input; $this->doc = Factory::getDocument(); /** * Load template data from cache or database * for initializing the template */ $this->template = Helper::loadTemplateData(); $this->params = $this->template->params; $this->get_template_uri(); } /** * Call magic method for handling custom assets * * @return void * @since 2.0.0 */ public function __call($method, $args) { $type = ''; if (\strpos($method, 'addCustom') !== false) { $type = \strtolower(\substr($method, 9)); } else { throw new \Exception(sprintf('Method "%s" does not exists in the class "%s"', $method, __CLASS__)); } if (!\in_array($type, ['css', 'scss', 'js'])) { throw new \Exception(sprintf('Type "%s" does not found! Only allowed types are "css", "scss", and "js"', $type)); } $this->addCustomAssets($type); } /** * Generate body class. * * @param string $class Body class. * * @return string * @since 1.0.0 */ public function bodyClass($class = '') { $menu = $this->app->getMenu()->getActive(); $menuParams = empty($menu) ? new Registry : $menu->getParams(); $stickyHeader = $this->params->get('sticky_header', 0) ? ' sticky-header' : ''; $stickyHeader = $this->params->get('sticky_header_sm', 0) ? $stickyHeader . ' sticky-header-md' : $stickyHeader; $stickyHeader = $this->params->get('sticky_header_xs', 0) ? $stickyHeader . ' sticky-header-sm' : $stickyHeader; $compClass = $this->input->get('option', '', 'STRING'); $compClassDash = str_replace('_', '-', $compClass); $bodyClass = 'site helix-ultimate hu ' . htmlspecialchars($compClass ?? "") . ' ' . $compClassDash; $bodyClass .= ' view-' . htmlspecialchars($this->input->get('view', '', 'STRING') ?? ""); $bodyClass .= ' layout-' . htmlspecialchars($this->input->get('layout', 'default', 'STRING') ?? ""); $bodyClass .= ' task-' . htmlspecialchars($this->input->get('task', 'none', 'STRING') ?? ""); $bodyClass .= ' itemid-' . (int) $this->input->get('Itemid', '', 'INT'); $bodyClass .= ($this->doc->language) ? ' ' . $this->doc->language : ''; $bodyClass .= ($this->doc->direction) ? ' ' . $this->doc->direction : ''; $bodyClass .= $stickyHeader; $bodyClass .= ($this->params->get('boxed_layout', 0)) ? ' layout-boxed' : ' layout-fluid'; $bodyClass .= ($this->params->get('blog_details_remove_container', 0)) ? ' remove-container' : ""; $bodyClass .= ' offcanvas-init offcanvs-position-' . $this->params->get('offcanvas_position', 'right'); if (isset($menu) && $menu) { if ($menuParams->get('pageclass_sfx')) { $bodyClass .= ' ' . $menuParams->get('pageclass_sfx'); } } $bodyClass .= (!empty($class)) ? ' ' . $class : ''; return $bodyClass; } public function googleAnalytics() { $code = $this->params->get('ga_code', null); $method = $this->params->get('ga_tracking_method', 'gst'); $script = ''; if (!empty($code)) { $code = preg_replace("@\s+@", '', $code); } if ($method === 'gst' && !empty($code)) { $script = " <!-- add google analytics --> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src='https://www.googletagmanager.com/gtag/js?id={$code}'></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', '{$code}'); </script> "; } elseif ($method === 'ua' && !empty($code)) { $script = " <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','{$code}');</script> <!-- End Google Tag Manager --> "; } return $script; } /** * Config header of the template. * * @return void * @since 1.0.0 */ public function head() { $option = $this->input->get('option', '', 'STRING'); $view = $this->input->get('view', '', 'STRING'); $layout = $this->input->get('layout', 'default', 'STRING'); HTMLHelper::_('jquery.framework'); HTMLHelper::_('bootstrap.framework'); if (JVERSION < 4) { if(isset($this->doc->_scripts[Uri::base(true) . '/media/jui/js/bootstrap.min.js'])) { unset($this->doc->_scripts[Uri::base(true) . '/media/jui/js/bootstrap.min.js']); } if(isset($this->doc->_scripts[Uri::base(true) . '/media/jui/js/bootstrap-tooltip-extended.min.js'])) { unset($this->doc->_scripts[Uri::base(true) . '/media/jui/js/bootstrap-tooltip-extended.min.js']); } } $webfonts = array(); if ($this->params->get('enable_body_font')) { $webfonts['body'] = $this->params->get('body_font'); } if ($this->params->get('enable_h1_font')) { $webfonts['h1'] = $this->params->get('h1_font'); } if ($this->params->get('enable_h2_font')) { $webfonts['h2'] = $this->params->get('h2_font'); } if ($this->params->get('enable_h3_font')) { $webfonts['h3'] = $this->params->get('h3_font'); } if ($this->params->get('enable_h4_font')) { $webfonts['h4'] = $this->params->get('h4_font'); } if ($this->params->get('enable_h5_font')) { $webfonts['h5'] = $this->params->get('h5_font'); } if ($this->params->get('enable_h6_font')) { $webfonts['h6'] = $this->params->get('h6_font'); } if ($this->params->get('enable_navigation_font')) { $webfonts['.sp-megamenu-parent > li > a, .sp-megamenu-parent > li > span, .sp-megamenu-parent .sp-dropdown li.sp-menu-item > a'] = $this->params->get('navigation_font'); $webfonts['.menu.nav-pills > li > a, .menu.nav-pills > li > span, .menu.nav-pills .sp-dropdown li.sp-menu-item > a'] = $this->params->get('navigation_font'); } if ($this->params->get('enable_custom_font') && $this->params->get('custom_font_selectors')) { $webfonts[$this->params->get('custom_font_selectors')] = $this->params->get('custom_font'); } if (file_exists(JPATH_THEMES . '/' . $this->template->template . '/js/inert.min.js')) { $this->add_js('inert.min.js'); } // Favicon $favicon = $this->params->get('favicon'); if ($favicon) { $url = Uri::base(true) . '/' . $favicon; $ext = strtolower(pathinfo($url, PATHINFO_EXTENSION)); switch ($ext) { case 'svg': $type = 'image/svg+xml'; break; case 'gif': $type = 'image/gif'; case 'png': $type = 'image/png'; break; case 'jpg': case 'jpeg': $type = 'image/jpeg'; break; default: $type = 'image/vnd.microsoft.icon'; break; } $this->doc->addFavicon($url, $type); } else { $this->doc->addFavicon($this->template_folder_url . '/images/favicon.ico'); } $this->addGoogleFont($webfonts); $this->doc->addScriptdeclaration('template="' . $this->template->template . '";'); $generatorText = Text::_('HELIX_ULTIMATE_GENERATOR_TEXT'); if (!empty($generatorText)) { $this->doc->setGenerator($generatorText); } if (JVERSION < 4) { echo '<jdoc:include type="head" />'; } else { echo '<jdoc:include type="metas" />'; echo '<jdoc:include type="styles" />'; echo '<jdoc:include type="scripts" />'; } $this->add_css('bootstrap.min.css'); if ($view === 'form' && $layout === 'edit') { $this->doc->addStylesheet(Uri::root(true) . '/plugins/system/helixultimate/assets/css/frontend-edit.css'); } if (JVERSION >= 6) { $this->doc->addScript(Uri::root(true) . '/plugins/system/helixultimate/assets/js/chosen.jquery.js'); $this->doc->addStylesheet(Uri::root(true) . '/plugins/system/helixultimate/assets/css/chosen.css'); } if (JVERSION >= 4) { $this->doc->getWebAssetManager()->useScript('showon'); } else { $bsBundleJSPath = JPATH_ROOT . '/templates/' . $this->template->template . '/js/bootstrap.bundle.min.js'; $bsJsPath = JPATH_ROOT . '/templates/' . $this->template->template . '/js/bootstrap.min.js'; if (\file_exists($bsBundleJSPath)) { $this->add_js('bootstrap.bundle.min.js'); } elseif (\file_exists($bsJsPath)) { $this->add_js('popper.min.js, bootstrap.min.js'); } } $app = Factory::getApplication(); $user = $app->getIdentity(); if (JVERSION >= 4) { $this->add_css('system-j4.min.css'); if ($user->id) { $this->doc->addStylesheet(Uri::root(true) . '/plugins/system/helixultimate/assets/css/choices.css'); } } else { $this->add_css('system-j3.min.css'); } } /** * Add css files at header. * * @param string $css_files Css files seperated by comma. * @param array $options Stylesheet options * @param array $attribs Tag attributes * * @return void * @since 1.0.0 */ public function add_css($css_files = '', $options = array(), $attribs = array()) { $files = array( 'resource' => $css_files, 'options' => $options, 'attribs' => $attribs ); $this->put_css_js_file($files, 'css'); } /** * Add javascript file to head. * * @param string $js_files Javascript files separated by comma. * @param array $options Script options. * @param array $attribs Script tag attributes. * * @return void * @since 1.0.0 */ public function add_js($js_files = '', $options = array(), $attribs = array()) { $files = array( 'resource' => $js_files, 'options' => $options, 'attribs' => $attribs ); $this->put_css_js_file($files, 'js'); } /** * Put css and js files into header. * * @param array $files The files array containing the file paths, doc options, and tag attributes. * @param string $folder Type of the file to add into header. @availables are (js, css) * * @return void * @since 1.0.0 */ private function put_css_js_file($files = array(), $folder = '') { $asset_path = JPATH_THEMES . "/{$this->template->template}/{$folder}/"; $file_list = explode(',', $files['resource']); foreach ($file_list as $file) { if (empty($file)) { continue; } $file = trim($file); $file_path = $asset_path . $file; if (!Helper::endsWith($file_path, $folder)) { $file_path .= '.' . $folder; } if (\file_exists($file_path)) { $file_url = Uri::base(true) . '/templates/' . $this->template->template . '/' . $folder . '/' . (Helper::endsWith($file, $folder) ? $file : $file . '.' . $folder); } elseif (\file_exists($file)) { $file_url = Helper::endsWith($file, $folder) ? $file : $file . '.' . $folder; } else { /** If asset not exists inside the template path then try to load from plugin's asset path. */ $uri = '/plugins/system/helixultimate/assets/' . $folder . '/' . (Helper::endsWith($file, $folder) ? $file : $file . '.' . $folder); if (\file_exists(JPATH_ROOT . $uri)) { $file_url = Uri::base(true) . $uri; } else { continue; } } if ($folder === 'js') { $this->doc->addScript($file_url, $files['options'], $files['attribs']); } else { $this->doc->addStyleSheet($file_url, $files['options'], $files['attribs']); } } } /** * Load font awesome font for J3 & J4 separately. * * @return void * @since 2.0.3 */ public function loadFontAwesome() { if ($this->params->get('enable_fontawesome')) { if (JVERSION < 4) { $this->add_css('font-awesome.min.css'); $this->add_css('v4-shims.min.css'); } else { $this->doc->addStyleSheet(Uri::root(true) . '/media/system/css/joomla-fontawesome.min.css', ['relative' => false, 'version' => 'auto']); } } } /** * Get template URI. * * @return void * @since 1.0.0 */ private function get_template_uri() { $this->template_folder_url = Uri::base(true) . '/templates/' . $this->template->template; } /** * Include features. * * @return void * @since 1.0.0 */ private function include_features() { $folder_path = JPATH_THEMES . '/' . $this->template->template . '/features'; if (is_dir($folder_path)) { $files = Folder::files($folder_path, '.php'); if (!empty($files)) { foreach ($files as $key => $file) { include_once $folder_path . '/' . $file; $file_name = File::stripExt($file); $class = 'HelixUltimateFeature' . ucfirst($file_name); $feature_obj = new $class($this->params); $position = $feature_obj->position; $load_pos = (isset($feature_obj->load_pos) && $feature_obj->load_pos) ? $feature_obj->load_pos : ''; $this->in_positions[] = $position; if (!empty($position)) { $this->loadFeature[$position][$key]['feature'] = $feature_obj->renderFeature(); $this->loadFeature[$position][$key]['load_pos'] = $load_pos; } } } } } /** * Render Layout * * @return void * @since 1.0.0 */ public function render_layout() { // $this->add_css('custom.css'); // $this->add_js('custom.js'); $this->include_features(); $layout = ($this->params->get('layout')) ? $this->params->get('layout') : []; if (!empty($layout)) { $rows = json_decode($layout ?? ""); } else { $layout_file = JPATH_SITE . '/templates/' . $this->template->template . '/options.json'; if (!\file_exists($layout_file)) { die('Default Layout file is not exists! Please goto to template manager and create a new layout first.'); } $layout_data = json_decode(file_get_contents($layout_file) ?? ""); $rows = json_decode($layout_data->layout ?? ""); } $output = $this->get_recursive_layout($rows); echo $output; } private function get_recursive_layout($rows = array()) { if (empty($rows) || !is_array($rows)) { return; } $option = $this->app->input->getCmd('option', ''); $view = $this->app->input->getCmd('view', ''); $pagebuilder = false; $output = ''; $modified_row = new \stdClass; if ($option === 'com_sppagebuilder') { $pagebuilder = true; } $themepath = JPATH_THEMES . '/' . $this->template->template; $carea_file = $themepath . '/html/layouts/helixultimate/frontend/conponentarea.php'; $module_file = $themepath . '/html/layouts/helixultimate/frontend/modules.php'; $lyt_thm_path = $themepath . '/html/layouts/helixultimate/'; $layout_path_carea = (file_exists($carea_file)) ? $lyt_thm_path : JPATH_ROOT . '/plugins/system/helixultimate/layouts'; $layout_path_module = (file_exists($module_file)) ? $lyt_thm_path : JPATH_ROOT . '/plugins/system/helixultimate/layouts'; $rendered_sections = []; $header = ''; $footer = ''; foreach ($rows as $key => $row) { $modified_row = $this->get_current_row($row); $columns = $modified_row->attr; if ($columns) { $componentArea = false; if (isset($modified_row->has_component) && $modified_row->has_component) { $componentArea = true; } $fluidrow = false; if (isset($modified_row->settings->fluidrow) && $modified_row->settings->fluidrow) { $fluidrow = $modified_row->settings->fluidrow; } $id = (isset($modified_row->settings->name) && $modified_row->settings->name) ? 'sp-' . OutputFilter::stringURLSafe($modified_row->settings->name) : 'sp-section-' . ($key + 1); $row_class = $this->build_row_class($modified_row->settings); $this->add_row_styles($modified_row->settings, $id); $sematic = (isset($modified_row->settings->name) && $modified_row->settings->name) ? strtolower($modified_row->settings->name) : 'section'; switch ($sematic) { case "header": $sematic = 'header'; break; case "footer": $sematic = 'footer'; break; default: $sematic = 'section'; break; } $data = array( 'sematic' => $sematic, 'id' => $id, 'row_class' => $row_class, 'componentArea' => $componentArea, 'pagebuilder' => $pagebuilder, 'fluidrow' => $fluidrow, 'rowColumns' => $columns, 'loadFeature' => $this->loadFeature ); $layout_path = JPATH_ROOT . '/plugins/system/helixultimate/layouts'; $getLayout = new FileLayout('frontend.generate', $layout_path); $rendered = $getLayout->render($data); /** * If a section is named as `header` that means the section is for * the page header or site menu header. * But if the predefined_header option is enabled then * render the predefined header instead of the header section. */ if ($sematic === 'header') { if (!$this->params->get('predefined_header')) { $output .= $getLayout->render($data); } } else { $output .= $getLayout->render($data); } } } return $output; } /** * Get current row * * @param \stdClass $row layout rows * * @return \stdClass Updated rows. * @since 1.0.0 */ private function get_current_row($row) { // Absence span $inactive_col = 0; $has_component = false; foreach ($row->attr as $key => &$column) { $column->settings->disable_modules = isset($column->settings->name) ? $this->disable_article_page_modules($column->settings->name) : false; if (!$column->settings->column_type) { if (!$this->count_modules($column->settings->name)) { $inactive_col += $column->settings->grid_size; unset($row->attr[$key]); } if ($column->settings->disable_modules && $this->count_modules($column->settings->name)) { $inactive_col += $column->settings->grid_size; unset($row->attr[$key]); } } else { $row->has_component = true; $has_component = true; } } foreach ($row->attr as &$column) { $options = $column->settings; $col_grid_size = $options->grid_size; $className = ''; if (!$has_component) { $rowAttr = $row->attr; if (end($rowAttr) === $column) { $col_grid_size += $inactive_col; } } else { if (!empty($options->column_type)) { $col_grid_size += $inactive_col; } } if (isset($options->lg_col) && $options->lg_col) { $className = $className . ' col-lg-' . $options->lg_col; } else { $className = 'col-lg-' . $col_grid_size; } if (isset($options->xxl_col) && $options->xxl_col) { $className = $className . ' col-xxl-' . $options->xxl_col; } if (isset($options->xl_col) && $options->xl_col) { $className = $className . ' col-xl-' . $options->xl_col; } if (isset($options->md_col) && $options->md_col) { $className = 'col-md-' . $options->md_col . ' ' . $className; } if (isset($options->sm_col) && $options->sm_col) { $className = 'col-sm-' . $options->sm_col . ' ' . $className; } if (isset($options->xs_col) && $options->xs_col) { $className = 'col-' . $options->xs_col . ' ' . $className; } $device_class = $this->get_device_class($options); $column->settings->className = $className . ' ' . $device_class; } return $row; } /** * Add row styles. * * @param object $options Row style options. * @param integer $id Row ID. * * @return void * @since 1.0.0 */ private function add_row_styles($options, $id) { $row_css = ''; if (isset($options->background_image) && $options->background_image) { $row_css .= 'background-image:url("' . Uri::base(true) . '/' . $options->background_image . '");'; if (isset($options->background_repeat) && $options->background_repeat) { $row_css .= 'background-repeat:' . $options->background_repeat . ';'; } if (isset($options->background_size) && $options->background_size) { $row_css .= 'background-size:' . $options->background_size . ';'; } if (isset($options->background_attachment) && $options->background_attachment) { $row_css .= 'background-attachment:' . $options->background_attachment . ';'; } if (isset($options->background_position) && $options->background_position) { $row_css .= 'background-position:' . $options->background_position . ';'; } } if (isset($options->background_color) && $options->background_color) { $row_css .= 'background-color:' . $options->background_color . ';'; } if (isset($options->color) && $options->color) { $row_css .= 'color:' . $options->color . ';'; } if (isset($options->padding) && $options->padding) { $row_css .= 'padding:' . $options->padding . ';'; } if (isset($options->margin) && $options->margin) { $row_css .= 'margin:' . $options->margin . ';'; } if ($row_css) { $this->doc->addStyledeclaration('#' . $id . '{ ' . $row_css . ' }'); } if (isset($options->link_color) && $options->link_color) { $this->doc->addStyledeclaration('#' . $id . ' a{color:' . $options->link_color . ';}'); } if (isset($options->link_hover_color) && $options->link_hover_color) { $this->doc->addStyledeclaration('#' . $id . ' a:hover{color:' . $options->link_hover_color . ';}'); } } /** * Generate the class of the row. * * @param object $options Row options. * * @return string The classes of the row. * @since 1.0.0 */ private function build_row_class($options) { $row_class = ''; if (isset($options->custom_class) && $options->custom_class) { $row_class .= $options->custom_class; } $device_class = $this->get_device_class($options); if ($device_class) { $row_class .= ' ' . $device_class; } if ($row_class) { $row_class = 'class="' . $row_class . '"'; } return $row_class; } /** * Get device class for responsiveness. * * @param object $options Options object. * * @return string Device classes. * @since 1.0.0 */ private function get_device_class($options) { $device_class = ''; if (isset($options->hide_on_phone) && $options->hide_on_phone) { $device_class = 'd-none d-sm-block'; } if (isset($options->hide_on_large_phone) && $options->hide_on_large_phone) { $device_class = $this->reshape_device_class('sm', $device_class); $device_class .= ' d-sm-none d-md-block'; } if (isset($options->hide_on_tablet) && $options->hide_on_tablet) { $device_class = $this->reshape_device_class('md', $device_class); $device_class .= ' d-md-none d-lg-block'; } if (isset($options->hide_on_small_desktop) && $options->hide_on_small_desktop) { $device_class = $this->reshape_device_class('lg', $device_class); $device_class .= ' d-lg-none d-xl-block'; } if (isset($options->hide_on_desktop) && $options->hide_on_desktop) { $device_class = $this->reshape_device_class('xl', $device_class); $device_class .= ' d-xl-none'; } if (isset($options->hide_on_ex_large_desktop) && $options->hide_on_ex_large_desktop) { $device_class = $this->reshape_device_class('xxl', $device_class); $device_class .= ' d-xxl-none'; } return $device_class; } /** * Reshape the device classes for responsiveness. * * @param string $device The device indicator. * @param string $class The existing class. * * @return string The updated class * @since 1.0.0 */ private function reshape_device_class($device = '', $class = '') { $search = 'd-' . $device . '-block'; $class = str_replace($search, '', $class); $class = trim($class, ' '); return $class; } /** * Count the number of modules of a position. * * @param string $position Module position. * * @return integer The number of modules. * @since 1.0.0 */ public function count_modules($position) { $position = Helper::CheckNull($position); return ($this->doc->countModules($position) || $this->has_feature($position)); } /** * Disable module only from article list and detail pages. * * @param string $position Module position. * * @return boolean * @since 1.0.0 */ private function disable_article_page_modules( $position ) { if (!$this->app->input->get('option') === 'com_content') { return false; } if ($this->app->input->get('view') === 'article' && $this->params->get('blog_detail_disable_module')) { $article_and_disable = true; $disabled_positions = !empty($this->params->get('blog_detail_disable_positions')) ? $this->params->get('blog_detail_disable_positions') : []; } elseif ($this->app->input->get('view') === 'category' || $this->app->input->get('view') === 'featured' && $this->params->get('blog_list_disable_module')) { $article_and_disable = true; $disabled_positions = !empty($this->params->get('blog_list_disable_positions')) ? $this->params->get('blog_list_disable_positions') : []; } else { return false; } $match_positions = in_array($position, $disabled_positions); return ($article_and_disable && $match_positions); } /** * If the position has feature. * * @param string $position The module position. * * @return boolean True on success, false otherwise. * @since 1.0.0 */ private function has_feature($position) { if (in_array($position, $this->in_positions)) { return true; } return false; } /** * Perform after body expressions. * * @return string * @since 1.0.0 */ public function after_body() { if ($before_body = $this->params->get('before_body')) { echo $before_body . "\n"; } } /** * Add scss file with options. * * @param string $scss The scss file name. * @param array $vars The variables array. * @param string $css The css file name. * @param boolean $forceCompile Compile the scss to css by force * * @return void * @since 1.0.0 */ public function add_scss($scss, $vars = array(), $css = '', $forceCompile = false, $path = '') { $scss = File::stripExt($scss); if (!empty($css)) { $css = File::stripExt($css) . '.css'; } else { $css = $scss . '.css'; } if ($this->params->get('scssoption')) { $needsCompile = $this->needScssCompile($scss, $vars); if ($forceCompile || $needsCompile) { $compiler = new Compiler; $template = Helper::loadTemplateData()->template; $scss_path = JPATH_THEMES . '/' . $template . '/scss'; $css_path = JPATH_THEMES . '/' . $template . '/css'; if (file_exists($scss_path . '/' . $scss . '.scss')) { $out = $css_path . '/' . $css; $compiler->setOutputStyle(OutputStyle::COMPRESSED); $compiler->setImportPaths($scss_path); if (!empty($vars)) { $converted = []; foreach ($vars as $name => $value) { if ($value === null || $value === '') { continue; } // If the value is a CSS string with units/colors/etc, parse it; if (is_string($value)) { $converted[$name] = ValueConverter::parseValue($value); // otherwise convert from PHP scalar/array/bool/number. } else { $converted[$name] = ValueConverter::fromPhp($value); } } $compiler->addVariables($converted); } $compiledCss = $compiler->compileString('@import "' . $scss . '.scss"'); $getComplinedCss = $compiledCss->getCss(); File::write($out, $getComplinedCss); $cache_path = JPATH_ROOT . '/cache/com_templates/templates/' . $template . '/' . $scss . '.scss.cache'; $scssCache = array(); $scssCache['imports'] = $this->parseIncludedFiles($compiledCss->getIncludedFiles()); $scssCache['vars'] = $vars; $jsonScssCache = json_encode($scssCache); File::write($cache_path, $jsonScssCache); } } } $this->add_css($css); } /** * Parse the included scss files and get the filemtime. * * @param array $files The files path array. * * @return array The new array with filepath and the modified time. * @since 2.0.5 */ private function parseIncludedFiles(array $files) : array { $parsedFiles = []; foreach ($files as $file) { if (!empty($file) && \file_exists($file)) { $realPath = realpath($file); if ($realPath !== false) { $parsedFiles[$realPath] = filemtime($file); } } } return $parsedFiles; } /** * If it is needed to compile the scss. * * @param string $scss The scss file name. * @param array $vars Scss variables. * * @return boolean * @since 1.0.0 */ public function needScssCompile($scss, $vars = array()) { $cache_path = JPATH_ROOT . '/cache/com_templates/templates/' . $this->template->template . '/' . $scss . '.scss.cache'; // Always work with arrays if (!is_array($vars)) { $vars = []; } if (!file_exists($cache_path)) { return true; } // unreadable/empty cache $raw = @file_get_contents($cache_path); if ($raw === false || $raw === '') { return true; } $cache_file = json_decode($raw); // If JSON is invalid, recompile if (!is_object($cache_file)) { return true; } // Imports $imports = []; if (isset($cache_file->imports)) { if (is_object($cache_file->imports)) { $imports = (array) $cache_file->imports; } elseif (is_array($cache_file->imports)) { $imports = $cache_file->imports; } } // Vars $cached_vars = []; if (isset($cache_file->vars)) { if (is_object($cache_file->vars)) { $cached_vars = (array) $cache_file->vars; } elseif (is_array($cache_file->vars)) { $cached_vars = $cache_file->vars; } } // If variables changed, recompile if (!empty(array_diff_assoc((array) $vars, (array) $cached_vars))) { return true; } // If any imported file is missing or modified, recompile if (!empty($imports)) { foreach ($imports as $import => $mtime) { if (!file_exists($import)) { return true; } $existModificationTime = filemtime($import); if ((int) $existModificationTime !== (int) $mtime) { return true; } } return false; } return true; } /** * Add google fonts. * * @param array $fonts Google fonts. * * @return void * @since 1.0.0 */ public function addGoogleFont($fonts) { // $doc = Factory::getDocument(); $systemFonts = array( 'Arial', 'Tahoma', 'Verdana', 'Helvetica', 'Times New Roman', 'Trebuchet MS', 'Georgia' ); if (is_array($fonts)) { foreach ($fonts as $key => $font) { $font = json_decode($font ?? ""); if (!in_array($font->fontFamily, $systemFonts)) { $fontUrl = '//fonts.googleapis.com/css?family=' . $font->fontFamily . ':100,100i,200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i'; if (!empty(trim($font->fontSubset ?? ''))) { $fontUrl .= '&subset=' . $font->fontSubset; } $fontUrl .= '&display=swap'; $this->doc->addStylesheet($fontUrl, ['version' => 'auto'], ['media' => 'none', 'onload' => 'media="all"']); } $fontCSS = $key . "{"; $fontCSS .= "font-family: '" . $font->fontFamily . "', sans-serif;"; if (isset($font->fontSize) && $font->fontSize) { $fontCSS .= 'font-size: ' . $font->fontSize . (!preg_match("@(px|em|rem|%)$@", $font->fontSize) ? 'px;' : ';'); } if (isset($font->fontWeight) && $font->fontWeight) { $fontCSS .= 'font-weight: ' . $font->fontWeight . ';'; } if (isset($font->fontStyle) && $font->fontStyle) { $fontCSS .= 'font-style: ' . $font->fontStyle . ';'; } if (!empty($font->fontColor)) { $fontCSS .= 'color: ' . $font->fontColor . ';'; } if (!empty($font->fontLineHeight)) { $fontCSS .= 'line-height: ' . $font->fontLineHeight . ';'; } if (!empty($font->fontLetterSpacing)) { $fontCSS .= 'letter-spacing: ' . $font->fontLetterSpacing . ';'; } if (!empty($font->textDecoration)) { $fontCSS .= 'text-decoration: ' . $font->textDecoration . ';'; } if (!empty($font->textAlign)) { $fontCSS .= 'text-align: ' . $font->textAlign . ';'; } $fontCSS .= "}\n"; if (isset($font->fontSize_sm) && $font->fontSize_sm) { $fontCSS .= '@media (min-width:768px) and (max-width:991px){'; $fontCSS .= $key . "{"; $fontCSS .= 'font-size: ' . $font->fontSize_sm . (!preg_match("@(px|em|rem|%)$@", $font->fontSize_sm) ? 'px;' : ';'); $fontCSS .= "}\n}\n"; } if (isset($font->fontSize_xs) && $font->fontSize_xs) { $fontCSS .= '@media (max-width:767px){'; $fontCSS .= $key . "{"; $fontCSS .= 'font-size: ' . $font->fontSize_xs . (!preg_match("@(px|em|rem|%)$@", $font->fontSize_xs) ? 'px;' : ';'); $fontCSS .= "}\n}\n"; } $this->doc->addStyledeclaration($fontCSS); } } } /** * Exclude js files and return the other js. * * @param string $key The key * @param string $excludes The files to excludes with comma seperated. * * @return boolean * @since 1.0.0 */ private function exclude_js($key, $excludes) { $match = false; if ($excludes) { $excludes = explode(',', $excludes); foreach ($excludes as $exclude) { if (basename($key) == trim($exclude)) { $match = true; } } } return $match; } /** * Exclude css files and return the other css. * * @param string $key The key * @param string $excludes The files to exclude, comma separated. * * @return boolean * @since 2.0.0 */ private function exclude_css($key, $excludes) { $match = false; if ($excludes) { $excludes = explode(',', $excludes); foreach ($excludes as $exclude) { if (basename($key) == trim($exclude)) { $match = true; } } } return $match; } /** * Check if the contents of the assets are changed. * If the contents are changed then the filesize must be changed. * * @param string $cachedFile File path * @param string $currentContent The contents * * @return bool * @since 2.0.0 */ private function contentsChanged($cachedFile, $currentContent) { $temp = tmpfile(); fwrite($temp, $currentContent); fseek($temp, 0); $tempFileSize = filesize(stream_get_meta_data($temp)['uri']); fclose($temp); return filesize($cachedFile) !== $tempFileSize; } /** * Check if the file is minified or not. * This is getting the file contents and counting * the number of lines in the file. * If there is only one line that means this is a minified file. * On the other hand, if the percentage of the ratio of the * ($numberOfLines:$contentLength) is less then 1 that means there may * have a few number of lines but that could be negligible. * * @param string $file The file url * * @return boolean True if minified, false otherwise. * @since 2.0.0 */ private function isMinified($file) { $content = file_get_contents($file); $contentLength = strlen($content); $numberOfLines = preg_match_all("@[\r\n]@", $content); return ($numberOfLines === 1) || (($numberOfLines * 100 / $contentLength) < 1); } /** * Compress javascript. * * @param string $excludes If any js to exclude from compressing. * * @return void * @since 1.0.0 */ public function compress_js($excludes = '') { $app = Factory::getApplication(); $view = $app->input->get('view'); $layout = $app->input->get('layout'); // disable js compress for edit view if($view == 'form' || $layout == 'edit') { return; } $cachetime = $app->get('cachetime', 15); $all_scripts = $this->doc->_scripts; $cache_path = JPATH_ROOT . '/cache/com_templates/templates/' . $this->template->template; $scripts = array(); $root_url = Uri::root(true); $minifiedCode = ''; $md5sum = ''; $excludeScripts = ['validate.js', 'tinymce.min.js', 'tiny_mce.js', 'editor.min.js']; $excludedScriptPaths = []; $remoteScripts = []; // Check all local scripts foreach ($all_scripts as $key => $value) { $js_file = str_replace($root_url, JPATH_ROOT, $key); // disable js compress for sp_pagebuilder if(strpos($js_file, 'com_sppagebuilder')) { continue; } if (strpos($js_file, JPATH_ROOT) === false) { $js_file = JPATH_ROOT . $key; } $fullPath = $js_file; if (\stripos($js_file, '?') !== false) { $js_file = \substr($js_file, 0, \stripos($js_file, '?')); } $ext = \strtolower(\pathinfo($js_file, PATHINFO_EXTENSION)); if ($ext !== 'js') { $remoteScripts[] = $fullPath; unset($this->doc->_scripts[$key]); continue; } /** * Exclude the scripts which are crating trouble while minifying, * and searching scripts with relative path inside the script e.g. tinymce. */ if (JVERSION < 4 && \in_array(basename($js_file), $excludeScripts)) { $excludedScriptPaths[] = $js_file; unset($this->doc->_scripts[$key]); continue; } if (\file_exists($js_file)) { if (!$this->exclude_js($key, $excludes)) { $scripts[] = $key; $md5sum .= md5($key); $compressed = \JShrink\Minifier::minify(file_get_contents($js_file), array('flaggedComments' => false)); $minifiedCode .= "/*------ " . basename($js_file) . " ------*/\n" . $compressed . "\n\n"; //add file name to compressed JS unset($this->doc->_scripts[$key]); // Remove scripts } } } // Compress All scripts if ($minifiedCode) { if (!is_dir($cache_path)) { Folder::create($cache_path, 0755); } else { $file = $cache_path . '/' . md5($md5sum) . '.js'; if (!\file_exists($file)) { File::write($file, $minifiedCode); } else { if (filesize($file) == 0 || ((filemtime($file) + $cachetime * 60) < time())) { File::write($file, $minifiedCode); } } $this->doc->addScript(Uri::root(true) . '/cache/com_templates/templates/' . $this->template->template . '/' . md5($md5sum) . '.js'); } } $excludedScriptPaths = array_merge($excludedScriptPaths, $remoteScripts); /** Add the script paths excluded earlier. */ if (!empty($excludedScriptPaths)) { foreach ($excludedScriptPaths as $path) { $path = Path::clean($path); if (\stripos($path, JPATH_ROOT) === 0) { $path = str_replace(JPATH_ROOT, '', $path); } $this->doc->addScript(Uri::root(true) . $path); } } return; } /** * Get preloader of specific type * * @param string $type Loader Type * * @return string Loader HTML string * @since 2.0.0 */ public function getPreloader($type) { $loader = array(); switch ($type) { case 'circle': $loader[] = "<div class='sp-loader-circle'></div>"; break; case 'bubble-loop': $loader[] = "<div class='sp-loader-bubble-loop'></div>"; break; case 'wave-two': $loader[] = "<div class='wave-two-wrap'>"; $loader[] = "<ul class='wave-two'>"; $loader[] = str_repeat("<li></li>", 6); $loader[] = "</ul>"; $loader[] = "</div>"; break; case 'audio-wave': $loader[] = "<div class='sp-loader-audio-wave'></div>"; break; case 'circle-two': $loader[] = "<div class='circle-two'><span></span></div>"; break; case 'clock': $loader[] = "<div class='sp-loader-clock'></div>"; break; case 'logo': $src = $this->params->get('logo_type') === 'image' ? Uri::root() . $this->params->get('logo_image') : null; $loader[] = "<div class='sp-loader-with-logo'>"; $loader[] = "<div class='logo'>"; $loader[] = $src ? "<img src='" . $src . "' />" : "Loading..."; $loader[] = "</div>"; $loader[] = "<div class='line' id='line-load'></div>"; $loader[] = "</div>"; break; default: $loader[] = "<div class='sp-preloader'></div>"; break; } return implode("\n", $loader); } /** * Get header style. * * @return void * @since 1.0.0 */ public function getHeaderStyle() { $pre_header = $this->params->get('predefined_header'); $header_style = $this->params->get('header_style'); if (!$pre_header || !$header_style) { return; } $options = new \stdClass; $options->template = $this->template; $options->params = $this->params; $template = $options->template->template; $tmpl_file_location = JPATH_ROOT . '/templates/' . $template . '/headers'; if (\file_exists($tmpl_file_location . '/' . $header_style . '/header.php')) { $getLayout = new FileLayout($header_style . '.header', $tmpl_file_location); return $getLayout->render($options); } } /** * Get offcanvas styles * * @return string The offcanvas layout HTML string. * @since 2.0.0 */ public function getOffcanvasStyle() { $offCanvasStyle = $this->params->get('offcanvas_style', ''); if (empty($offCanvasStyle)) { return ''; } $options = new \stdClass; $options->template = $this->template; $options->params = $this->params; $template = $options->template->template; $offCanvasDirectory = JPATH_ROOT . '/templates/' . $template . '/offcanvas'; if (\file_exists($offCanvasDirectory . '/' . $offCanvasStyle . '/canvas.php')) { $getLayout = new FileLayout($offCanvasStyle . '.canvas', $offCanvasDirectory); return $getLayout->render($options); } return ''; } /** * Minify CSS code. * * @param string $css_code The css code snippet. * * @return string The minified code * @since 1.0.0 */ public function minifyCss($css_code) { // Remove comments $css_code = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $css_code); // Remove space after colons $css_code = str_replace(': ', ':', $css_code); // Remove whitespace $css_code = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $css_code); // Remove Empty Selectors without any properties $css_code = preg_replace('/(?:(?:[^\r\n{}]+)\s?{[\s]*})/', '', $css_code); // Remove Empty Media Selectors without any properties or selector $css_code = preg_replace('/@media\s?\((?:[^\r\n,{}]+)\s?{[\s]*}/', '', $css_code); return $css_code; } /** * Compress css files. * * @param string $excludes If any css to exclude from compressing. * @return void * @since 1.0.0 */ public function compress_css($excludes = '') { $app = Factory::getApplication(); $cachetime = $app->get('cachetime', 15); $all_stylesheets = $this->doc->_styleSheets; $cache_path = \JPATH_ROOT . '/cache/com_templates/templates/' . $this->template->template; $stylesheets = []; $root_url = Uri::root(true); $minifiedCode = ''; $md5sum = ''; // Check all local stylesheets foreach ($all_stylesheets as $key => $value) { $css_file = str_replace($root_url, \JPATH_ROOT, $key); // disable css compress for sp_pagebuilder if(strpos($css_file, 'com_sppagebuilder')) { continue; } if (strpos($css_file, \JPATH_ROOT) === false) { $css_file = \JPATH_ROOT . $key; } global $absolute_url; $absolute_url = $key; if (\file_exists($css_file)) { // skip excluded css files by basename if ($this->exclude_css($key, $excludes)) { continue; } $stylesheets[] = $key; $md5sum .= md5($key); $compressed = $this->minifyCss(\file_get_contents($css_file)); $fixUrl = preg_replace_callback('/url\(([^\):]*)\)/', function ($matches) { global $absolute_url; $url = str_replace(array('"', '\''), '', $matches[1]); $base = dirname($absolute_url); while (preg_match('/^\.\.\//', $url)) { $base = dirname($base); $url = substr($url, 3); } $url = $base . '/' . $url; $url = str_replace('//', '/', $url); // For fixing double slash '//' in url for fontawesome return "url('$url')"; }, $compressed); $minifiedCode .= "/*------ " . basename($css_file) . " ------*/\n" . $fixUrl . "\n\n"; //add file name to compressed css unset($this->doc->_styleSheets[$key]); //Remove stylesheets } } //Compress All stylesheets if ($minifiedCode) { if (!is_dir($cache_path)) { Folder::create($cache_path, 0755); } else { $file = $cache_path . '/' . md5($md5sum) . '.css'; if (!\file_exists($file)) { File::write($file, $minifiedCode); } else { if (filesize($file) == 0 || ((filemtime($file) + $cachetime * 60) < time())) { File::write($file, $minifiedCode); } } $this->doc->addStylesheet(Uri::root(true) . '/cache/com_templates/templates/' . $this->template->template . '/' . md5($md5sum) . '.css'); } } return; } /** * Get related articles. * * @param object $params Article params. * * @return array Articles * @since 1.0.0 */ public static function getRelatedArticles($params) { $user = Factory::getUser(); $userId = $user->id; $groups = $user->getAuthorisedViewLevels(); $authorised = Access::getAuthorisedViewLevels($userId); $db = Factory::getDbo(); $app = Factory::getApplication(); $nullDate = $db->quote($db->getNullDate()); $nowDate = $db->quote(Factory::getDate()->toSql()); $item_id = $params['item_id']; $maximum = isset($params['maximum']) ? (int) $params['maximum'] : 5; $maximum = $maximum < 1 ? 5 : $maximum; $catId = isset($params['catId']) ? (int) $params['catId'] : null; $tagids = []; if (isset($params['itemTags']) && count($params['itemTags'])) { $itemTags = $params['itemTags']; foreach ($itemTags as $tag) { array_push($tagids, $tag->id); } } // Category filter $catItemIds = $tagItemIds = $itemIds = []; if ($catId !== null) { $catQuery = $db->getQuery(true) ->clear() ->select('id') ->from($db->quoteName('#__content')) ->where($db->quoteName('catid') . " = " . $catId) ->where($db->quoteName('state') . ' = 1') ->setLimit($maximum + 1); $db->setQuery($catQuery); $catItemIds = $db->loadColumn(); } // Tags filter if (is_array($tagids) && count($tagids)) { $tagId = implode(',', ArrayHelper::toInteger($tagids)); if ($tagId) { $subQuery = $db->getQuery(true) ->clear() ->select('DISTINCT content_item_id as id') ->from($db->quoteName('#__contentitem_tag_map')) ->where('tag_id IN (' . $tagId . ')') ->where('type_alias = ' . $db->quote('com_content.article')); $db->setQuery($subQuery); $tagItemIds = $db->loadColumn(); } } $itemIds = array_unique(array_merge($catItemIds, $tagItemIds)); if (count($itemIds) < 1) { return []; } $itemIds = implode(',', ArrayHelper::toInteger($itemIds)); $query = $db->getQuery(true); $query->clear() ->select('a.*') ->select('a.alias as slug') ->from($db->quoteName('#__content', 'a')) ->select($db->quoteName('b.alias', 'category_alias')) ->select($db->quoteName('b.title', 'category')) ->select($db->quoteName('b.access', 'category_access')) ->select($db->quoteName('u.name', 'author')) ->join('LEFT', $db->quoteName('#__categories', 'b') . ' ON (' . $db->quoteName('a.catid') . ' = ' . $db->quoteName('b.id') . ')') ->join('LEFT', $db->quoteName('#__users', 'u') . ' ON (' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('u.id') . ')') ->where($db->quoteName('a.access') . " IN (" . implode(',', $authorised) . ")") ->where('a.id IN (' . $itemIds . ')') ->where('a.id != ' . (int) $item_id); // Language filter if ($app->getLanguageFilter()) { $query->where('a.language IN (' . $db->Quote(Factory::getLanguage()->getTag()) . ',' . $db->Quote('*') . ')'); } $query->where('(a.publish_down IS NULL OR a.publish_down >= ' . $nowDate . ')'); $query->where($db->quoteName('a.state') . ' = ' . $db->quote(1)); $query->order($db->quoteName('a.created') . ' DESC') ->setLimit($maximum); $db->setQuery($query); $items = $db->loadObjectList(); foreach ($items as &$item) { $item->slug = $item->id . ':' . $item->slug; $item->catslug = $item->catid . ':' . $item->category_alias; $item->params = ComponentHelper::getParams('com_content'); $access = (isset($item->access) && $item->access) ? $item->access : true; if ($access) { $item->params->set('access-view', true); } else { if ($item->catid == 0 || $item->category_access === null) { $item->params->set('access-view', in_array($item->access, $groups)); } else { $item->params->set('access-view', in_array($item->access, $groups) && in_array($item->category_access, $groups)); } } } return $items; } /** * Generate the SCSS variables from the preset settings. * * @return array * @since 2.0.5 */ public function getSCSSVariables() : array { $custom_style = $this->params->get('custom_style'); $preset = $this->params->get('preset'); if($custom_style || !$preset) { $preset = !empty($preset) ? json_decode($preset, true) : []; $scssVars = ['preset' => 'default']; $customElements = []; // Read Custom Style data from XML to set custom $scssVars $template = Helper::loadTemplateData(); $form = new Form('custom'); $form->loadFile(JPATH_ROOT . '/templates/' . $template->template . '/options.xml'); $formXml = $form->getXml(); if (!empty($formXml)) { for ($i = 0; $i < $formXml->count(); ++$i) { $fieldset = isset($formXml->fieldset[$i]) ? $formXml->fieldset[$i] : null; $attributes = !\is_null($fieldset) ? $fieldset->attributes() : null; if ($attributes['name'] == 'presets') { foreach ($fieldset as $field) { $attribute = !\is_null($field) ? $field->attributes() : null; if (isset($attribute['dependant']) && $attribute['dependant'] == 'custom_style:1') { $customElements[] = (string) $attribute['name']; } } break; } } } foreach ($customElements as $customElement) { if ($customElement == 'offcanvas_menu_icon_color') { $scssVars[$customElement] = $this->params->get($customElement) ?? '#000000'; } elseif ($customElement == 'offcanvas_menu_bg_color') { $scssVars[$customElement] = $this->params->get($customElement) ?? $this->params->get('menu_dropdown_bg_color'); } elseif ($customElement == 'offcanvas_menu_items_and_items_color') { $scssVars[$customElement] = $this->params->get($customElement) ?? $this->params->get('menu_dropdown_text_color'); } elseif ($customElement == 'offcanvas_menu_active_menu_item_color') { $scssVars[$customElement] = $this->params->get($customElement) ?? $this->params->get('menu_text_active_color'); } else { $scssVars[$customElement] = $this->params->get($customElement); } } // check preset values and add them if missing in scssVars if ($preset && is_array($preset) && !empty($preset)) { foreach ($preset as $key => $value) { if (!isset($scssVars[$key]) && $key !== 'preset') { $scssVars[$key] = $value; } } } } else { $scssVars = (array) json_decode($this->params->get('preset') ?? ""); $scssVars['offcanvas_menu_icon_color'] = '#000000'; $scssVars['offcanvas_menu_bg_color'] = $scssVars['menu_dropdown_bg_color']; $scssVars['offcanvas_menu_items_and_items_color'] = $scssVars['menu_dropdown_text_color']; $scssVars['offcanvas_menu_active_menu_item_color'] = $scssVars['menu_text_active_color']; foreach ($scssVars as $key => $value) { if ((strpos($key, 'color') !== false || strpos($key, '_bg_') !== false) && (empty($value) || is_null($value))) { $scssVars[$key] = 'transparent'; } } } $scssVars['header_height'] = $this->params->get('header_height', '60px'); $scssVars['header_height_sm'] = $this->params->get('header_height_sm', '60px'); $scssVars['header_height_xs'] = $this->params->get('header_height_xs', '55px'); $scssVars['offcanvas_width'] = $this->params->get('offcanvas_width', '300') . 'px'; $scssVars['font_awesome_font_family'] = '"Font Awesome 5 Free"'; if (JoomlaBridge::getVersion('major') > 4) { $scssVars['font_awesome_font_family'] = '"Font Awesome 6 Free"'; } return $scssVars; } /** * If user put their own JS or CSS files into `templates/{template}/js/custom` * or `templates/{template}/css/custom` directory respectively then, * those files would be added automatically to the template. * * @param string $type The asset type * * @return void * @since 2.0.0 */ public function addCustomAssets($type) { $template = Helper::loadTemplateData()->template; $directory = JPATH_ROOT . '/templates/' . $template . '/' . strtolower($type) . '/custom'; $path = Uri::root(true) . '/templates/' . $template . '/' . strtolower($type) . '/custom'; if (!\file_exists($directory) || !\is_dir($directory)) { return; } $files = Folder::files($directory); if (!empty($files)) { foreach ($files as $file) { if ($type === 'css') { if (preg_match("@\.css$@", $file)) { $this->doc->addStylesheet($path . '/' . $file); } } elseif ($type === 'scss') { if (preg_match("@\.scss$@", $file)) { $vars = $this->getSCSSVariables(); $this->add_scss('custom/' . $file, $vars); } } elseif ($type === 'js') { if (preg_match("@\.js$@", $file)) { $this->doc->addScript($path . '/' . $file, [], ['defer' => true]); } } } } } } PKBA#]=վ�� � (system/helixultimate/src/form/preset.xmlnu�[���<?xml version="1.0" encoding="utf-8"?> <form name="preset"> <fieldset name="colors"> <!-- Preset edit topbar --> <field name="topbar_text_color" class="preset-control internal-use-only" helixgroup="preset_topbar" type="color" label="Topbar Text Color" track="false" /> <!-- Preset edit header --> <field name="header_bg_color" class="preset-control internal-use-only" helixgroup="preset_header" type="color" label="Header Background Color" track="false" /> <field name="logo_text_color" class="preset-control internal-use-only" helixgroup="preset_header" type="color" label="Logo Text Color" track="false" /> <!-- Preset edit menu --> <field name="menu_text_color" class="preset-control internal-use-only" helixgroup="preset_menu" type="color" label="Menu Text Color" track="false" /> <field name="menu_text_hover_color" class="preset-control internal-use-only" helixgroup="preset_menu" type="color" label="Menu Text Hover Color" track="false" /> <field name="menu_text_active_color" class="preset-control internal-use-only" helixgroup="preset_menu" type="color" label="Menu Text Active Color" track="false" /> <field name="menu_dropdown_bg_color" class="preset-control internal-use-only" helixgroup="preset_menu" type="color" label="Menu Dropdown Background Color" track="false" /> <field name="menu_dropdown_text_color" class="preset-control internal-use-only" helixgroup="preset_menu" type="color" label="Menu Dropdown Text Color" track="false" /> <field name="menu_dropdown_text_hover_color" class="preset-control internal-use-only" helixgroup="preset_menu" type="color" label="Menu Dropdown Text Hover Color" track="false" /> <field name="menu_dropdown_text_active_color" class="preset-control internal-use-only" helixgroup="preset_menu" type="color" label="Menu Dropdown Text Active Color" track="false" /> <!-- Preset edit body --> <field name="text_color" class="preset-control internal-use-only" helixgroup="preset_body" type="color" label="Body Text Color" track="false" /> <field name="bg_color" class="preset-control internal-use-only" helixgroup="preset_body" type="color" label="Body Background Color" track="false" /> <field name="link_color" class="preset-control internal-use-only" helixgroup="preset_body" type="color" label="Body Link Color" track="false" /> <field name="link_hover_color" class="preset-control internal-use-only" helixgroup="preset_body" type="color" label="Body Link Hover Color" track="false" /> <!-- Preset edit footer --> <field name="footer_bg_color" class="preset-control internal-use-only" helixgroup="preset_footer" type="color" label="Footer Background Color" track="false" /> <field name="footer_text_color" class="preset-control internal-use-only" helixgroup="preset_footer" type="color" label="Footer Text Color" track="false" /> <field name="footer_link_color" class="preset-control internal-use-only" helixgroup="preset_footer" type="color" label="Footer Link Color" track="false" /> <field name="footer_link_hover_color" class="preset-control internal-use-only" helixgroup="preset_footer" type="color" label="Footer Link Hover Color" track="false" /> </fieldset> </form>PKBA#]��d�hBhB2system/helixultimate/src/HttpResponse/Response.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <joomshaper@js.com> * @copyright Copyright (c) 2010 - 2020 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ namespace HelixUltimate\Framework\HttpResponse; use HelixUltimate\Framework\Platform\Builders\MegaMenuBuilder; use HelixUltimate\Framework\Platform\Helper; use HelixUltimate\Framework\System\JoomlaBridge; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Menu\SiteMenu; use Joomla\CMS\Table\Table; use Joomla\Database\DatabaseInterface; defined('_JEXEC') or die(); /** * Class for Ajax Http Response. * This is handle Ajax request. * * @since 1.0.0 */ class Response { /** * Response for the request getMenuItems. * * @return array * @since 2.0.0 */ public static function getMenuItems() { $input = Factory::getApplication()->input; $menuType = $input->get('menutype', 'mainmenu', 'STRING'); $items = self::getItems($menuType); return [ 'status' => true, 'data' => self::generateMenuTree($items), 'items' => $items ]; } /** * Response for the request parentAdoption * * @return array * @since 2.0.0 */ public static function parentAdoption() { $input = Factory::getApplication()->input; $itemId = $input->post->get('id', 0, 'INT'); $parentId = $input->post->get('parent', 0, 'INT'); if ($itemId > 0 && $parentId > 0) { $data = new \stdClass; $data->id = $itemId; $data->parent_id = $parentId; try { $itemModel = self::getMenuItemModel(); $db = Factory::getDbo(); $db->updateObject('#__menu', $data, 'id'); $itemModel->rebuild(); } catch (\Exception $e) { echo $e->getMessage(); } } return [ 'status' => true, 'data' => [$data] ]; } /** * Get menu item model instance. * * @return ItemModel * @since 2.0.0 */ private static function getMenuItemModel() { if (JoomlaBridge::getVersion('major') < 4) { $classUrl = JPATH_ADMINISTRATOR . '/components/com_menus/models/item.php'; $tablePath = JPATH_ADMINISTRATOR . '/components/com_menus/tables'; } if (JoomlaBridge::getVersion('major') < 4) { if (!\class_exists('MenusModelItem') && \file_exists($classUrl)) { require_once $classUrl; } Table::addIncludePath($tablePath); } return JoomlaBridge::getVersion('major') >= 4 ? new \Joomla\Component\Menus\Administrator\Model\ItemModel : new \MenusModelItem; } /** * Rebuild the menu tree * * @return void * @since 2.0.0 */ public static function rebuildMenu() { try { $itemModel = self::getMenuItemModel(); $itemModel->rebuild(); } catch (\Exception $e) { return [ 'status' => false, 'message' => $e->getMessage() ]; } return [ 'status' => true, 'message' => 'Rebuilding done' ]; } /** * Get Menu Items for a specific menu type * * @return string * @since 2.0.0 */ private static function getItems($menuType) { $items = []; try { $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); $query->select('id, title, menutype, alias, parent_id, level, lft, rgt, published') ->from($db->qn('#__menu')) ->where($db->qn('menutype') . ' = ' . $db->q($menuType)) ->where($db->qn('published') . ' IN (0,1)'); $query->order($db->qn('lft') . ' ASC'); $db->setQuery($query); $items = $db->loadObjectList(); } catch (\Exception $e) { echo $e->getMessage(); } return $items; } /** * Generate Menu Item Tree * * @param array $items The items array. * * @return string The HTML string. * @since 2.0.0 */ private static function generateMenuTree($items) { $html = []; if (!empty($items)) { $editSvg = '<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" class="bi bi-pencil-square" viewBox="0 0 16 16"><path d="M15.502 1.94a.5.5 0 0 1 0 .706L14.459 3.69l-2-2L13.502.646a.5.5 0 0 1 .707 0l1.293 1.293zm-1.75 2.456l-2-2L4.939 9.21a.5.5 0 0 0-.121.196l-.805 2.414a.25.25 0 0 0 .316.316l2.414-.805a.5.5 0 0 0 .196-.12l6.813-6.814z"/><path fill-rule="evenodd" d="M1 13.5A1.5 1.5 0 0 0 2.5 15h11a1.5 1.5 0 0 0 1.5-1.5v-6a.5.5 0 0 0-1 0v6a.5.5 0 0 1-.5.5h-11a.5.5 0 0 1-.5-.5v-11a.5.5 0 0 1 .5-.5H9a.5.5 0 0 0 0-1H2.5A1.5 1.5 0 0 0 1 2.5v11z"/></svg>'; $deleteSvg = '<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" class="bi bi-trash" viewBox="0 0 16 16"><path d="M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6z"/><path fill-rule="evenodd" d="M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1zM4.118 4L4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118zM2.5 3V2h11v1h-11z"/></svg>'; $megaSvg = '<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" class="bi bi-grid-1x2" viewBox="0 0 16 16"><path d="M6 1H1v14h5V1zm9 0h-5v5h5V1zm0 9v5h-5v-5h5zM0 1a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V1zm9 0a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1h-5a1 1 0 0 1-1-1V1zm1 8a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h5a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1h-5z"/></svg>'; $settingsSvg = '<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" class="bi bi-gear" viewBox="0 0 16 16"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492zM5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0z"/><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52l-.094-.319zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.377l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115l.094-.319z"/></svg>'; $html[] = '<ul id="hu-menu-tree">'; $count = count($items) ?? 0; foreach ($items as $key => $item) { $safeTitle = htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8'); $safeAlias = htmlspecialchars($item->alias, ENT_QUOTES, 'UTF-8'); $html[] = '<li class="hu-menu-tree-branch hu-branch-level-' . $item->level . ' ' . ((int) $item->published === 0 ? 'hu-megamenu-branch-muted' : '') . '" data-alias="' . $safeAlias . '" data-itemid="' . $item->id . '" data-parent="' . $item->parent_id . '" style="z-index: ' . (max(1, $count - $key)) . '" >'; $html[] = ' <div class="hu-menu-tree-contents">'; $html[] = ' <span class="hu-menu-branch-path"></span>'; $html[] = ' <div class="hu-branch-drag-handler">'; $html[] = ' <span class="hu-branch-icon"><svg width="6" height="10" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx=".904" cy=".904" r=".904" /><circle cx=".904" cy="4.7" r=".904" /><circle cx=".904" cy="8.496" r=".904" /><circle cx="4.7" cy=".904" r=".904" /><circle cx="4.7" cy="4.7" r=".904" /><circle cx="4.7" cy="8.496" r=".904" /></svg></span>'; $html[] = ' <span class="hu-branch-title">' . $safeTitle . '</span>'; if ((int) $item->published === 0) { $html[] = '<span class="hu-branch-unpublished far fa-eye-slash" title="' . Text::_('Unpublished') . '"></span>'; } $html[] = ' <div class="hu-branch-tools">'; $html[] = ' <ul class="hu-branch-tools-list">'; $html[] = ' <li><a href="#" class="hu-branch-tools-list-edit" aria-label="' . Text::_('HELIX_ULTIMATE_MENU_EDIT') . '" title="' . Text::_('HELIX_ULTIMATE_MENU_EDIT') . '">' . $editSvg . '</a></li>'; $html[] = ' <li><a href="#" class="hu-branch-tools-list-delete" aira-label="' . Text::_('HELIX_ULTIMATE_MENU_DELETE') . '" title="' . Text::_('HELIX_ULTIMATE_MENU_DELETE') . '">' . $deleteSvg . '</a></li>'; $html[] = ' <li><a href="#" class="hu-branch-tools-list-megamenu disabled" aria-label="' . Text::_($item->parent_id > 1 ? 'HELIX_ULTIMATE_MENU_OPTIONS' : 'HELIX_ULTIMATE_MENU_MEGAMENU') . '" title="' . Text::_($item->parent_id > 1 ? 'HELIX_ULTIMATE_MENU_OPTIONS' : 'HELIX_ULTIMATE_MENU_MEGAMENU') . '"> ' . ($item->parent_id > 1 ? $settingsSvg : $megaSvg) . '</a></li>'; $html[] = ' </ul>'; $html[] = ' </div>'; $html[] = ' </div>'; $html[] = ' </div>'; $html[] = '<div class="hu-menu-children-bus"></div>'; $html[] = '</li>'; } $html[] = '</ul>'; } return implode("\n", $html); } /** * Generate mega menu builder body contents. * * @param int $itemId The Menu Item ID. * * @return array The HTML string. * @since 2.0.0 */ public static function generateMegaMenuBody() { $input = Factory::getApplication()->input; $itemId = $input->get('id', 0, 'INT'); $layout = new FileLayout('megaMenu.container', HELIX_LAYOUT_PATH); $builder = new MegaMenuBuilder($itemId); return [ 'status' => true, 'html' => $layout->render(['itemId' => $itemId, 'builder' => $builder]) ]; } /** * Save mega menu settings. * * @return array The response array. * @since 2.0.0 */ public static function saveMegaMenuSettings() { $input = Factory::getApplication()->input; $settings = Helper::sanitizeMegaMenuSettings($input->post->get('settings', [], 'ARRAY')); $itemId = $input->post->get('id', 0, 'INT'); $menu = new SiteMenu; $item = $menu->getItem($itemId); $params = $item->getParams(); $params->set('helixultimatemenulayout', \json_encode($settings)); $response = self::updateMenuItem($itemId, $params); return [ 'status' => true, 'data' => $response ]; } private static function updateMenuItem($itemId, $params) { try { $data = new \stdClass; $data->id = $itemId; $data->params = $params->toString(); $db = Factory::getDbo(); $db->updateObject('#__menu', $data, 'id', true); return true; } catch (\Exception $e) { return $e->getMessage(); } } /** * Load slots for the rows. * * @return array The response array * @since 2.0.0 */ public static function updateRowLayout() { $input = Factory::getApplication()->input; $layout = $input->post->get('layout', '12', 'STRING'); $rowData = $input->post->get('data', null, 'RAW'); $rowId = $input->post->get('rowId', 0, 'INT'); $itemId = $input->post->get('itemId', 0, 'INT'); $rowData = \json_decode($rowData ?? ""); $layout = \preg_replace("@\s@", '', $layout); $layoutArray = explode('+', $layout); $columns = []; foreach ($layoutArray as $key => $col) { if (isset($rowData->attr[$key])) { $tmp = $rowData->attr[$key]; } else { $tmp = new \stdClass; $tmp->menuParentId = ''; $tmp->moduleId = ''; $tmp->type = 'column'; $tmp->items = []; } $tmp->colGrid = $col; $columns[] = $tmp; } $rowData->attr = $columns; $columnLayout = new FileLayout('megaMenu.column', HELIX_LAYOUT_PATH); $builder = new MegaMenuBuilder($itemId); $html = []; foreach ($columns as $key => $column) { $html[] = $columnLayout->render([ 'itemId' => $itemId, 'builder' => $builder, 'column' => $column, 'rowId' => $rowId, 'columnId' => $key + 1 ]); } return [ 'status' => true, 'html' => implode("\n", $html), 'data' => $rowData ]; } /** * Generate row from the user data. * * @return array the response array * @since 2.0.0 */ public static function generateRow() { $input = Factory::getApplication()->input; $layout = $input->post->get('layout', '12', 'STRING'); $rowId = $input->post->get('rowId', 0, 'INT'); $itemId = $input->post->get('itemId', 0, 'INT'); $layout = \preg_replace("@\s@", '', $layout); $layoutArray = explode('+', $layout); $rowData = new \stdClass; $rowData->type = 'row'; $rowData->attr = []; if (!empty($layoutArray)) { foreach ($layoutArray as $column) { $item = new \stdClass; $item->type = 'column'; $item->colGrid = $column; $item->items = []; $item->menuParentId = ''; $item->moduleId = ''; $rowData->attr[] = $item; } } $builder = new MegaMenuBuilder($itemId); $isNew = \count($builder->getMegaMenuSettings()->layout ?? []) === 0; /** * If no row exists before, then get the child items of the item * */ if ($isNew) { $children = $builder->getItemChildren(); if (!empty($children)) { $perColumn = ceil(\count($children) / \count($layoutArray)); $chunks = \array_chunk($children, $perColumn); foreach ($chunks as $key => $children) { $cells = []; foreach ($children as $child) { $tmp = new \stdClass; $tmp->type = 'menu_item'; $tmp->item_id = $child->id; $cells[] = $tmp; } $rowData->attr[$key]->items = $cells; } } } $rowLayout = new FileLayout('megaMenu.row', HELIX_LAYOUT_PATH); $rowHTML = $rowLayout->render([ 'itemId' => $itemId, 'builder' => $builder, 'row' => $rowData, 'rowId' => $rowId ]); return [ 'status' => true, 'data' => $rowHTML, 'row' => $rowData ]; } /** * Generate popover for manipulating the menu item. * * @return array The response array. * @since 2.0.0 */ public static function generatePopoverContents() { $input = Factory::getApplication()->input; // The menu item id $itemId = $input->post->get('itemId', 0, 'INT'); $type = $input->post->get('type', 'module', 'STRING'); $builder = new MegaMenuBuilder($itemId); $html = []; if ($type === 'module') { $modules = Helper::getModules(); $html = []; $html[] = '<select class="hu-input hu-megamenu-module" data-type="module" data-husearch="1">'; $html[] = '<option value="">Select Module</option>'; foreach ($modules as $module) { $html[] = '<option value="' . $module->id . '">' . $module->title . '</option>'; } $html[] = '</select>'; } elseif ($type === 'menu') { $children = $builder->getItemChildren(); $html = []; $html[] = '<select class="hu-input hu-megamenu-menuitem" data-type="menu_item">'; $html[] = '<option value="">Select Menu Item</option>'; foreach ($children as $child) { $html[] = '<option value="' . $child->id . '">' . $child->title . '</option>'; } $html[] = '</select>'; } return [ 'status' => true, 'html' => implode("\n", $html) ]; } public static function generateNewCell() { $input = Factory::getApplication()->input; $itemId = $input->post->get('itemId', 0, 'INT'); $type = $input->post->get('type', 'module', 'STRING'); $elementId = $input->post->get('item_id', 0, 'INT'); $rowId = $input->post->get('rowId', 0, 'INT'); $columnId = $input->post->get('columnId', 0, 'INT'); $cellId = $input->post->get('cellId', 0, 'INT'); $builder = new MegaMenuBuilder($itemId); $cell = new \stdClass; $cell->type = $type; $cell->item_id = $elementId; $cellLayout = new FileLayout('megaMenu.cell', HELIX_LAYOUT_PATH); $html = $cellLayout->render([ 'itemId' => $itemId, 'builder' => $builder, 'cell' => $cell, 'rowId' => $rowId, 'columnId' => $columnId, 'cellId' => $cellId ]); return [ 'status' => true, 'html' => $html ]; } /** * Get the module list and render the list * * @return array The response array. * @since 2.0.0 */ public static function getModuleList() { $input = Factory::getApplication()->input; $keyword = $input->get('keyword', '', 'STRING'); $itemId = $input->get('itemId', 0, 'INT'); $children = []; if ($itemId) { $builder = new MegaMenuBuilder($itemId); $children = $builder->getItemChildren(); } if (!empty($keyword)) { $children = array_filter($children, function ($child) use ($keyword) { return stripos($child->title, $keyword) !== false || (!empty($child->desc) && stripos($child->desc, $keyword) !== false); }); } $moduleLayout = new FileLayout('megaMenu.modules', HELIX_LAYOUT_PATH); return [ 'status' => true, 'html' => $moduleLayout->render([ 'keyword' => $keyword, 'children' => $children ]), ]; } } PKBA#]�D���0system/helixultimate/src/fields/helixgallery.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; use Joomla\Filesystem\File; /** * Form field for Helix gallery. * * @since 1.0.0 */ class JFormFieldHelixgallery extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixgallery'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $doc = Factory::getDocument(); HTMLHelper::_('jquery.framework'); $helix_plg_url = Uri::root(true) . '/plugins/system/helixultimate'; $doc->addScript($helix_plg_url . '/assets/js/admin/jquery-ui.min.js'); $values = json_decode($this->value ?? ""); if (! empty($values)) { $images = $this->element['name'] . '_images'; $values = $values->$images; } else { $values = []; } $output = '<div class="hu-gallery-field">'; $output .= '<ul class="hu-gallery-items clearfix">'; if (is_array($values) && ! empty($values)) { foreach ($values as $key => $value) { $data_src = $value; $src = Uri::root(true) . '/' . $value; $basename = basename($src); // Check for the image's existence in the media folder $absolutePath = JPATH_ROOT . '/' . $value; $thumbnail = JPATH_ROOT . '/' . dirname($value) . '/' . File::stripExt($basename) . '_thumbnail.' . Helper::getExt($basename); $small_size = JPATH_ROOT . '/' . dirname($value) . '/' . File::stripExt($basename) . '_small.' . Helper::getExt($basename); // Only show images that actually exist (thumbnail or small size) if (file_exists($absolutePath) || file_exists($thumbnail) || file_exists($small_size)) { if (file_exists($thumbnail)) { $src = Uri::root(true) . '/' . dirname($value) . '/' . File::stripExt($basename) . '_thumbnail.' . Helper::getExt($basename); } elseif (file_exists($small_size)) { $src = Uri::root(true) . '/' . dirname($value) . '/' . File::stripExt($basename) . '_small.' . Helper::getExt($basename); } $output .= '<li class="hu-gallery-item" data-src="' . $data_src . '"> <a href="#" class="btn btn-mini btn-danger btn-hu-remove-gallery-image"> <span class="fas fa-times" aria-hidden="true"></span> </a> <img src="' . $src . '" alt=""> </li>'; } } } $output .= '</ul>'; $output .= '<input type="file" id="hu-gallery-item-upload" accept="image/*" multiple="multiple" style="display:none;">'; $output .= '<a class="btn btn-default btn-secondary btn-hu-gallery-item-upload" href="#"> <i class="fas fa-plus" aria-hidden="true"></i> ' . Text::_('HELIX_ULTIMATE_UPLOAD_IMAGES') . ' </a>'; $output .= '<input type="hidden" name="' . $this->name . '" data-name="' . $this->element['name'] . '_images" id="' . $this->id . '" value="' . htmlspecialchars($this->value ?? "", ENT_COMPAT, 'UTF-8') . '" class="form-field-hu-gallery">'; $output .= '</div>'; return $output; } } PKBA#]P�g��/system/helixultimate/src/fields/helixlayout.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Form\FormField; use HelixUltimate\Framework\Platform\Helper; /** * Form field for Helix layout * * @since 1.0.0 */ class JFormFieldHelixlayout extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixlayout'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ public function getInput() { $input = Factory::getApplication()->input; $style_id = $input->get('id', 0, 'INT'); $style = Helper::getTemplateStyle($style_id); $helix_layout_path = JPATH_SITE . '/plugins/system/helixultimate/layout/'; $json = json_decode($this->value ?? ""); if (!empty($json)) { $rows = $json; } else { $layout_file = file_get_contents(JPATH_SITE . '/templates/' . $style->template . '/options.json'); $value = json_decode($layout_file ?? ""); $rows = json_decode($value->layout ?? ""); } $html = $this->generateLayout($helix_layout_path, $rows); $html .= '<input type="hidden" id="' . $this->id . '" name="' . $this->name . '">'; return $html; } /** * Generate Layout. * * @param string $path Layout path * @param object $layout_data The layout data. * * @return string Layout HTML string. * @since 1.0.0 */ private function generateLayout($path, $layout_data = null) { $GLOBALS['tpl_layout_data'] = $layout_data; ob_start(); include_once $path . 'generated.php'; $items = ob_get_contents(); ob_end_clean(); return $items; } /** * Get label for the field. * * @return boolean * @since 1.0.0 */ public function getLabel() { return false; } } PKBA#]}���2system/helixultimate/src/fields/helixpositions.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; use HelixUltimate\Framework\Platform\Helper; use Joomla\Database\DatabaseInterface; /** * Form field for Helix positions * * @since 1.0.0 */ class JFormFieldHelixpositions extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixpositions'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $html = array(); $attr = ''; $input = Factory::getApplication()->input; $style_id = $input->get('id', 0, 'INT'); $style = Helper::getTemplateStyle($style_id); $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); $query->select($db->quoteName('position')); $query->from($db->quoteName('#__modules')); $query->where($db->quoteName('client_id') . ' = 0'); $query->where($db->quoteName('published') . ' = 1'); $query->group('position'); $query->order('position ASC'); $db->setQuery($query); $dbpositions = $db->loadObjectList(); $templateXML = JPATH_SITE . '/templates/' . $style->template . '/templateDetails.xml'; $template = simplexml_load_file($templateXML); $options = array(); foreach ($dbpositions as $positions) { $options[] = $positions->position; } foreach ($template->positions[0] as $position) { $options[] = (string) $position; } ksort($options); $opts = array_unique($options); $options = array(); foreach ($opts as $opt) { $options[$opt] = $opt; } $html[] = HTMLHelper::_('select.genericlist', $options, $this->name, trim($attr), 'value', 'text', $this->value, $this->id); return implode($html); } } PKBA#]�d��yy7system/helixultimate/src/fields/helixmultipositions.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Form\Field\ListField; use Joomla\CMS\Form\FormHelper; use Joomla\Database\DatabaseInterface; FormHelper::loadFieldClass('list'); /** * Form field for Helix positions * * @since 1.0.0 */ class JFormFieldHelixmultipositions extends ListField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixmultipositions'; /** * Override getOptions function * * @return array * @since 1.0.0 */ protected function getOptions() { $input = Factory::getApplication()->input; $style_id = $input->get('id', 0, 'INT'); $style = Helper::getTemplateStyle($style_id); $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); $query->select($db->quoteName('position')); $query->from($db->quoteName('#__modules')); $query->where($db->quoteName('client_id') . ' = 0'); $query->where($db->quoteName('published') . ' = 1'); $query->group('position'); $query->order('position ASC'); $db->setQuery($query); $dbpositions = $db->loadObjectList(); $templateXML = JPATH_SITE . '/templates/' . $style->template . '/templateDetails.xml'; $template = simplexml_load_file($templateXML); $options = array(); foreach ($dbpositions as $positions) { if (empty($positions->position)) { continue; } $options[] = $positions->position; } foreach ($template->positions[0] as $position) { $options[] = (string) $position; } ksort($options); $opts = array_unique($options); $options = array(); foreach ($opts as $opt) { $options[$opt] = $opt; } $optionsArray = []; foreach ($options as $key => $item) { $optionsArray[] = HTMLHelper::_('select.option', $key, $item . ' (' . $key . ')'); } return array_merge(parent::getOptions(), $optionsArray); } } PKBA#]w�C__5system/helixultimate/src/fields/helixexportimport.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Form\FormField; /** * Form field for helix import * * @since 1.0.0 */ class JFormFieldHelixexportimport extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixexportimport'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $input = Factory::getApplication()->input; $template_id = $input->get('id', 0, 'INT'); $export_url = 'index.php?option=com_ajax&helix=ultimate&task=export&id=' . $template_id; $output = '<div class="hu-importer-wrapper">'; $output .= '<a class="hu-btn hu-btn-primary" id="btn-hu-export-settings" rel="noopener noreferrer" target="_blank" href="' . $export_url . '"><span class="fas fa-download" aria-hidden="true"></span> ' . Text::_("HELIX_ULTIMATE_SETTINGS_EXPORT") . '</a>'; $output .= '<input type="file" id="helix-import-file" accept="application/JSON" style="display: none;"/>'; $output .= '<a id="btn-hu-import-settings" class="hu-btn hu-btn-primary" rel="noopener noreferrer" data-template_id="' . $template_id . '" target="_blank" href="#"><span class="fas fa-upload" aria-hidden="true"></span> ' . Text::_("HELIX_ULTIMATE_SETTINGS_IMPORT") . '</a>'; $output .= '</div>'; return $output; } } PKBA#] ܝ;uu-system/helixultimate/src/fields/helixunit.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Form\FormField; /** * Form field for helix presets. * * @since 2.0.0 */ class JFormFieldHelixUnit extends FormField { /** * Field type * * @var string $type * @since 2.0.0 */ protected $type = 'HelixUnit'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 2.0.0 */ protected function getInput() { // By default the unit is px. $unit = 'px'; $value = $this->value; $name = $this->name; $hint = $this->getAttribute('hint', '', 'STRING'); if (isset($value)) { $matches = []; if (preg_match("@^([+-]?(?:\d+|\d*\.\d+))(px|em|rem|%)$@", $value, $matches)) { if (count($matches) >= 3) { $value = $matches[1]; if (isset($matches[2])) { $unit = strtolower($matches[2]); } } } elseif (is_numeric($value)) { $value = (float) $value; } else { $value = ''; } } $value = !isset($value) ? '' : $value; $finalValue = $value !== '' ? $value . $unit : ''; $output = ''; $output .= '<div class="hu-input-group hu-unit-group">'; $output .= ' <input type="hidden" class="hu-unit-field-value" name="' . $name . '" value="' . $finalValue . '"/>'; $output .= ' <input type="text" class="hu-field-dimension-width form-control hu-unit-field-input ' . $name . '" value="' . $value . '" ' . ($hint !== '' ? 'placeholder="' . $hint . '"' : '') . ' />'; $output .= ' <select class="hu-unit-select">'; $output .= ' <option value="px" ' . ($unit === 'px' ? 'selected' : '') . '>px</option>'; $output .= ' <option value="em" ' . ($unit === 'em' ? 'selected' : '') . '>em</option>'; $output .= ' <option value="rem" ' . ($unit === 'rem' ? 'selected' : '') . '>rem</option>'; $output .= ' <option value="%" ' . ($unit === '%' ? 'selected' : '') . '>%</option>'; $output .= ' </select>'; $output .= '</div>'; return $output; } } PKBA#]4K���0system/helixultimate/src/fields/helixdevices.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Form\FormField; /** * Form field for helixButton * * @since 2.0.0 */ class JFormFieldHelixDevices extends FormField { /** * Field type * * @var string $type * @since 2.0.0 */ protected $type = 'HelixDevices'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 2.0.0 */ protected function getInput() { $default = isset($this->element['default']) ? $this->element['default'] : 'lg'; $value = empty($this->value) ? $default : $this->value; $output = '<div class="helix-field">'; $output .= ' <div class="helix-devices">'; $output .= ' <button class="device-btn ' . ($value === 'xs' ? 'active' : '') . '" data-device="xs" title="Mobile">'; $output .= ' <svg width="14" height="14" viewBox="0 0 11 19" fill="none" xmlns="http://www.w3.org/2000/svg">'; $output .= ' <path d="M6.58001 15.2C6.58001 15.54 6.32001 15.8 5.98001 15.8H4.43999C4.09999 15.8 3.83999 15.54 3.83999 15.2C3.83999 14.86 4.09999 14.6 4.43999 14.6H5.98001C6.30001 14.6 6.58001 14.86 6.58001 15.2ZM10.4 16.88C10.4 17.72 9.72001 18.4 8.88001 18.4H1.52C0.679995 18.4 0 17.72 0 16.88V1.52002C0 0.68002 0.679995 0 1.52 0H8.88001C9.72001 0 10.4 0.68002 10.4 1.52002V16.88ZM1.6 1.6V12.2H8.8V1.6H1.6ZM8.8 16.8V13.4H1.6V16.8H8.8Z" fill="#999"/>'; $output .= ' </svg>'; $output .= ' </button>'; $output .= ' <button class="device-btn ' . ($value === 'sm' ? 'active' : '') . '" data-device="sm" title="Tablet">'; $output .= ' <svg width="14" height="14" viewBox="0 0 16 19" fill="none" xmlns="http://www.w3.org/2000/svg">'; $output .= ' <path d="M9.31998 15.4C9.31998 15.74 9.05998 16 8.71998 16H7.67999C7.33999 16 7.07999 15.74 7.07999 15.4C7.07999 15.06 7.33999 14.8 7.67999 14.8H8.71998C9.05998 14.8 9.31998 15.06 9.31998 15.4ZM15.6 16.88C15.6 17.72 14.92 18.4 14.08 18.4H2.31998C1.47998 18.4 0.799988 17.72 0.799988 16.88V1.52002C0.799988 0.68002 1.47998 0 2.31998 0H14.08C14.92 0 15.6 0.68002 15.6 1.52002V16.88ZM2.39999 1.6V12.6H14V1.6H2.39999ZM14 16.8V13.8H2.39999V16.8H14Z" fill="#999"/>'; $output .= ' </svg>'; $output .= ' </button>'; $output .= ' <button class="device-btn ' . ($value === 'md' ? 'active' : '') . '" data-device="md" title="Desktop">'; $output .= ' <svg width="14" height="14" viewBox="0 0 22 19" fill="none" xmlns="http://www.w3.org/2000/svg">'; $output .= ' <path d="M19.477 0.200012H1.7539C0.784671 0.200012 6.10352e-05 0.98465 6.10352e-05 1.95388V12.1769C6.10352e-05 13.1461 0.784671 14.0462 1.7539 14.0462H7.61545V14.9923L5.8616 16.4C5.5616 16.6538 5.42314 17.1385 5.53852 17.5077C5.67698 17.8769 6.02315 18.2 6.41546 18.2H14.7231C15.1155 18.2 15.4847 17.8769 15.6231 17.5077C15.7616 17.1385 15.6462 16.6769 15.3462 16.4231L13.6154 14.9923V14.0462H19.477C20.4462 14.0462 21.2308 13.1461 21.2308 12.1769V1.95388C21.2308 0.98465 20.4462 0.200012 19.477 0.200012ZM12.277 16.0769L12.8308 16.5846H8.30775L8.90775 16.0538C9.09236 15.8923 9.23083 15.6154 9.23083 15.3615V14.0231H12.0001V15.3615C12.0001 15.6154 12.0924 15.9154 12.277 16.0769ZM19.3847 12.2H1.84621V2.04617H19.3847V12.2Z" fill="#999"/>'; $output .= ' </svg>'; $output .= ' </button>'; $output .= ' </div>'; $output .= '<input type="hidden" data-type="hu-devices" name="' . $this->name . '" id="' . $this->id . '" value="' . $value . '" />'; // End of helix field div. $output .= '</div>'; return $output; } /** * Override the getLabel function. * * @return boolean * @since 2.0.0 */ protected function getLabel() { return false; } } PKBA#]o���bb2system/helixultimate/src/fields/helixdimension.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\Form\FormField; defined('_JEXEC') or die(); /** * Form field for Helix dimension. * * @since 2.0.0 */ class JFormFieldHelixdimension extends FormField { /** * Field type * * @var string $type * @since 2.0.0 */ protected $type = 'Helixdimension'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 2.0.0 */ public function getInput() { $unit = $this->getAttribute('unit', 'px'); list($width, $height) = explode('x', strtolower($this->value)); // Output $output = ''; $output .= '<div class="row">'; $output .= '<div class="col-6">'; $output .= '<div class="hu-d-flex hu-align-items-center">'; $output .= '<span class="hu-mr-1">W</span>'; $output .= '<div class="hu-input-group">'; $output .= '<input type="text" class="hu-field-dimension-width form-control" value="' . $width . '" /><span class="hu-input-group-text">' . $unit . '</span>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '<div class="col-6">'; $output .= '<div class="hu-d-flex hu-align-items-center">'; $output .= '<span class="hu-mr-1">H</span>'; $output .= '<div class="hu-input-group">'; $output .= '<input type="text" class="hu-field-dimension-height form-control" value="' . $height . '" /><span class="hu-input-group-text">' . $unit . '</span>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '<input type="hidden" name="' . $this->name . '" id="' . $this->id . '" class="hu-field-dimension-input ' . $this->class . '" value="' . $this->value . '" />'; return $output; } } PKBA#]���̵�0system/helixultimate/src/fields/helixdetails.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Router\Route; use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; /** * Form field for helix details. * * @since 1.0.0 */ class JFormFieldHelixdetails extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixdetails'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { HTMLHelper::_('jquery.framework'); $doc = Factory::getDocument(); $plg_path = Uri::root(true) . '/plugins/system/helixultimate'; $doc->addScript($plg_path . '/assets/js/admin/details.js'); $doc->addStyleSheet($plg_path . '/assets/css/admin/details.css'); $app = Factory::getApplication(); $id = $app->input->get('id', 0, 'INT'); $url = Route::_('index.php?option=com_ajax&helix=ultimate&id=' . $id); $html = '<a href="' . $url . '" class="hu-options"><i class="icon-options"></i> Template Options</a>'; return $html; } /** * Override the getLabel method from FormField class. * * @return boolean * @since 1.0.0 */ public function getLabel() { return false; } } PKBA#]lA�4system/helixultimate/src/fields/helixmenubuilder.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Form\FormField; use Joomla\CMS\Language\Text; /** * Form field for Helix mega menu * * @since 2.0.0 */ class JFormFieldHelixMenuBuilder extends FormField { /** * Field type * * @var string $type * @since 2.0.0 */ protected $type = "HelixMenuBuilder"; /** * Override getInput function form FormField * * @return string Field HTML string * @since 2.0.0 */ public function getInput() { $html = []; $html[] = '<div id="hu-menu-builder">'; $html[] = '<div id="hu-menu-builder-container"></div>'; $html[] = '<button type="button" class="hu-btn hu-btn-primary hu-add-menu-item"><span class="fas fa-plus" aria-hidden="true"></span> ' . Text::_('HELIX_ULTIMATE_ADD_NEW_MENU_ITEM') . '</button>'; $html[] = '</div>'; return implode("\n", $html); } } PKBA#]WW-system/helixultimate/src/fields/helixicon.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; use HelixUltimate\Framework\Core\Lib\FontawesomeIcons; defined('_JEXEC') or die(); /** * Form field for Helix icons. * * @since 1.0.0 */ class JFormFieldHelixicon extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixicon'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ public function getInput() { $fontawesome = new FontawesomeIcons; $icons = $fontawesome->getIcons(); $arr = array(); $arr[] = HTMLHelper::_('select.option', '', ''); foreach ($icons as $value) { $arr[] = HTMLHelper::_('select.option', $value, preg_replace('@^fa[sbr]\s+fa-@', '', $value)); } return HTMLHelper::_('select.genericlist', $arr, $this->name, null, 'value', 'text', $this->value); } } PKBA#]��B�!8!8-system/helixultimate/src/fields/helixfont.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Form\FormField; use HelixUltimate\Framework\Platform\Helper; /** * Form field for Helix font. * * @since 1.0.0 */ class JFormFieldHelixfont extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixfont'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $input = Factory::getApplication()->input; $style_id = $input->get('id', 0, 'INT'); $style = Helper::getTemplateStyle($style_id); $template_path = JPATH_SITE . '/templates/' . $style->template . '/webfonts/webfonts.json'; $plugin_path = JPATH_PLUGINS . '/system/helixultimate/assets/webfonts/webfonts.json'; if (file_exists($template_path)) { $json = file_get_contents($template_path); } elseif (file_exists($plugin_path)) { $json = file_get_contents($plugin_path); } if (empty($json)) { Factory::getApplication()->enqueueMessage('Missing <code>webfonts.json</code> file. Please go to <code>advanced > Font Settings</code> and add Google Font Api and update.', 'error'); return; } $webfonts = json_decode($json ?? ""); $items = $webfonts->items; $value = json_decode($this->value ?? ""); $font = null; if (isset($value->fontFamily)) { $font = $this->filterArray($items, $value->fontFamily); } $html = ''; $classes = (!empty($this->element['class'])) ? $this->element['class'] : ''; $systemFonts = array( 'Arial', 'Tahoma', 'Verdana', 'Helvetica', 'Times New Roman', 'Trebuchet MS', 'Georgia' ); $fontWeights = array( '100' => 'Thin', '200' => 'Extra Light', '300' => 'Light', '400' => 'Normal', '500' => 'Medium', '600' => 'Semi Bold', '700' => 'Bold', '800' => 'Extra Bold', '900' => 'Black' ); $fontStyles = array( 'normal' => 'Normal', 'italic' => 'Italic', 'oblique' => 'Oblique' ); /** Font family */ $html .= '<div class="hu-field-webfont ' . $classes . '">'; /** Preview Row */ $html .= '<div class="hu-webfont-preview-wrapper">'; $html .= '<div class="hu-webfont-preview">1 2 3 4 5 6 7 8 9 0 Grumpy wizards make toxic brew for the evil Queen and Jack.</div>'; $html .= '</div>'; /** Start Fonts List row */ $html .= '<div class="hu-webfont-family hu-mb-3">'; $html .= $this->renderFontsList($systemFonts, $value, $items); $html .= '</div>'; /** Font size, weight, color row */ $html .= '<div class="row">'; /** Start Font Weight */ $html .= '<div class="col-5 hu-mb-3">'; $html .= $this->renderFontWeight($fontWeights, $value); $html .= '</div>'; /** Start Font Size */ $html .= '<div class="col-4 hu-mb-3 hu-narrow-input">'; $html .= $this->renderFontSize($value); $html .= '</div>'; /** Start Font Color */ $html .= '<div class="col-3 hu-mb-3 hu-narrow-input">'; $html .= $this->renderFontColor($value); $html .= '</div>'; $html .= '</div>'; /** Font subset, letter spacing, line height row */ $html .= '<div class="row spacing-row">'; /** Font subset section */ $html .= '<div class="col-5 hu-mb-3">'; $html .= $this->renderFontSubset($systemFonts, $font, $value); $html .= '</div>'; /** Set line height */ $html .= '<div class="col-3 hu-mb-3 hu-narrow-input">'; $html .= $this->renderLineHeight($value); $html .= '</div>'; /** Set Letter Spacing */ $html .= '<div class="col-4 hu-mb-3 hu-narrow-input">'; $html .= $this->renderLetterSpacing($value); $html .= '</div>'; $html .= '</div>'; /** Font style, alignment row */ $html .= '<div class="row style-alignment">'; /** Text Decoration */ $html .= '<div class="col-6 hu-mb-3">'; $html .= $this->renderTextDecoration($value); $html .= '</div>'; /** Font Alignment */ $html .= '<div class="col-6 hu-mb-3">'; $html .= $this->renderFontAlignment($value); $html .= '</div>'; $html .= '</div>'; $html .= '<input type="hidden" name="' . $this->name . '" value=\'' . $this->value . '\' class="hu-webfont-input" id="' . $this->id . '">'; $html .= '</div>'; return $html; } /** * Get select options for the field. * * @param array $items The items form where the options will be generated. * @param string $selected The selected option item. * * @return string The option HTML string. * @since 1.0.0 */ private function generateSelectOptions( $items = array(), $selected = '' ) { $html = ''; foreach ($items as $item) { $html .= '<option ' . (($selected !== 'no-selection' && $item == $selected) ? 'selected="selected"' : '') . ' value="' . $item . '">' . $item . '</option>'; } return $html; } /** * Get Current font. * * @param array $items The fonts array. * @param string $key The expected font. * * @return mixed * @since 1.0.0 */ private function filterArray($items, $key) { foreach ($items as $item) { if ($item->family === $key) { return $item; } } return false; } private function renderFontsList($systemFonts, $value, $items) { $html = ''; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_FAMILY') . '</label>'; $html .= '<select class="hu-webfont-list">'; $html .= '<optgroup label="' . Text::_('HELIX_ULTIMATE_SYSTEM_FONT') . '">'; foreach ($systemFonts as $systemFont) { $html .= '<option ' . ((isset($value->fontFamily) && $systemFont === $value->fontFamily) ? 'selected="selected"' : '') . ' value="' . $systemFont . '">' . $systemFont . '</option>'; } $html .= '</optgroup>'; $html .= '<optgroup label="' . Text::_('HELIX_ULTIMATE_GOOGLE_FONT') . '">'; foreach ($items as $item) { $html .= '<option ' . ((isset($value->fontFamily) && $item->family === $value->fontFamily) ? 'selected="selected"' : '') . ' value="' . $item->family . '">' . $item->family . '</option>'; } $html .= '</optgroup>'; $html .= '</select>'; return $html; } private function renderFontWeight($fontWeights, $value) { $html = ''; $html .= '<div class="hu-webfont-weight">'; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_WEIGHT') . '</label>'; $html .= '<select class="hu-webfont-weight-list">'; $html .= '<option value="">' . Text::_('HELIX_ULTIMATE_SELECT') . '</option>'; foreach ($fontWeights as $key => $fontWeight) { if (isset($value->fontWeight) && (int)$value->fontWeight === $key) { $html .= '<option value="' . $key . '" selected>' . $fontWeight . '</option>'; } else { $html .= '<option value="' . $key . '">' . $fontWeight . '</option>'; } } $html .= '</select>'; $html .= '</div>'; return $html; } private function renderFontSize($value) { $html = ''; $fontSize = (isset($value->fontSize)) ? $value->fontSize : ''; $fontSize_sm = (isset($value->fontSize_sm)) ? $value->fontSize_sm : ''; $fontSize_xs = (isset($value->fontSize_xs)) ? $value->fontSize_xs : ''; $html .= '<div class="hu-webfont-size">'; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_SIZE') . '</label>'; $html .= $this->renderUnitField('hu-webfont-size-field', $fontSize, true); $html .= $this->renderUnitField('hu-webfont-size-field-sm', $fontSize_sm); $html .= $this->renderUnitField('hu-webfont-size-field-xs', $fontSize_xs); $html .= '</div>'; return $html; } /** * Render unit field which is the combination of the measurement value * and the measurement unit. * * @param string $key The field key/name. * @param string $value The measurement value. * @param boolean $active Is the field active or not. * * @return string The field HTML string. * @since 2.0.0 */ private function renderUnitField($key, $value, $active = false) { // By default the unit is px. $unit = 'px'; if (isset($value)) { $matches = []; if (preg_match("@^([+-]?(?:\d+|\d*\.\d+))(px|em|rem|%)$@", $value, $matches)) { if (count($matches) >= 3) { $value = $matches[1]; if (isset($matches[2])) { $unit = strtolower($matches[2]); } } } elseif (is_numeric($value)) { $value = (float) $value; } else { $value = ''; } } $value = !isset($value) ? '' : $value; $finalValue = $value !== '' ? $value . $unit : ''; $html = ''; $html .= '<div class="hu-input-group hu-unit-group hu-webfont-unit ' . ($active ? 'active' : '') . '">'; $html .= '<input type="hidden" class="hu-unit-field-value" name="' . $key . '" value="' . $finalValue . '"/>'; $html .= ' <input type="text" class="hu-field-dimension-width form-control hu-unit-field-input ' . $key . '" value="' . $value . '" />'; $html .= ' <select class="hu-unit-select">'; $html .= ' <option value="px" ' . ($unit === 'px' ? 'selected' : '') . '>px</option>'; $html .= ' <option value="em" ' . ($unit === 'em' ? 'selected' : '') . '>em</option>'; $html .= ' <option value="rem" ' . ($unit === 'rem' ? 'selected' : '') . '>rem</option>'; $html .= ' <option value="%" ' . ($unit === '%' ? 'selected' : '') . '>%</option>'; $html .= ' </select>'; $html .= '</div>'; return $html; } private function renderFontColor($value) { $color = !empty($value->fontColor) ? $value->fontColor : ''; $html = ''; $html .= '<div class="hu-font-color">'; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_COLOR') . '</label>'; $html .= '<input type="text" class="form-control hu-font-color-input minicolors" placeholder="Font Color" value="' . $color . '" />'; $html .= '</div>'; return $html; } private function renderFontSubset($systemFonts, $font, $value) { $html = ''; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_SUBSET') . '</label>'; $html .= '<select class="hu-webfont-subset-list">'; $html .= '<option value="">' . Text::_('HELIX_ULTIMATE_SELECT') . '</option>'; if (isset($value->fontFamily) && $value->fontFamily) { if (!in_array($value->fontFamily, $systemFonts)) { $html .= $this->generateSelectOptions($font->subsets, $value->fontSubset); } } $html .= '</select>'; return $html; } private function renderLineHeight($value) { $height = !empty($value->fontLineHeight) ? $value->fontLineHeight : ''; $html = ''; $html .= '<div class="hu-font-line-height">'; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_LINE_HEIGHT') . '</label>'; $html .= '<input type="number" class="form-control hu-font-line-height-input" min="1" max="200" value="' . $height . '" />'; $html .= '</div>'; return $html; } private function renderLetterSpacing($value) { $spacing = !empty($value->fontLetterSpacing) ? $value->fontLetterSpacing : ''; $html = ''; $html .= '<div class="hu-font-letter-spacing">'; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_LETTER_SPACING') . '</label>'; $html .= $this->renderUnitField('hu-font-letter-spacing-input', $spacing, true); $html .= '</div>'; return $html; } private function renderTextDecoration($value) { $decoration = !empty($value->textDecoration) ? $value->textDecoration : 'none'; $html = ''; $html .= '<div class="hu-font-decoration">'; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_DECORATION') . '</label>'; $html .= '<div class="hu-switcher hu-switcher-inline hu-switcher-style-tab hu-switcher-style-tab-sm">'; $html .= '<div class="hu-action-group">'; $html .= '<span data-value="none" class="hu-switcher-action ' . ($decoration === 'none' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-times" aria-hidden="true"></span>'; $html .= '</span>'; $html .= '<span data-value="underline" class="hu-switcher-action ' . ($decoration === 'underline' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-underline" aria-hidden="true"></span>'; $html .= '</span>'; $html .= '<span data-value="line-through" class="hu-switcher-action ' . ($decoration === 'strikethrough' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-strikethrough" aria-hidden="true"></span>'; $html .= '</span>'; $html .= '<span data-value="overline" class="hu-switcher-action ' . ($decoration === 'overline' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-overline" aria-hidden="true">O</span>'; $html .= '</span>'; $html .= '</div>'; $html .= '</div>'; $html .= '<input type="hidden" class="hu-text-decoration" value="' . $decoration . '" />'; $html .= '</div>'; return $html; } private function renderFontAlignment($value) { $alignment = !empty($value->textAlign) ? $value->textAlign : ''; $html = ''; $html .= '<div class="hu-font-alignment">'; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_ALIGNMENT') . '</label>'; $html .= '<div class="hu-switcher hu-switcher-inline hu-switcher-style-tab hu-switcher-style-tab-sm">'; $html .= '<div class="hu-action-group">'; $html .= '<span data-value="left" class="hu-switcher-action ' . ($alignment === 'left' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-align-left" aria-hidden="true"></span>'; $html .= '</span>'; $html .= '<span data-value="center" class="hu-switcher-action ' . ($alignment === 'center' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-align-center" aria-hidden="true"></span>'; $html .= '</span>'; $html .= '<span data-value="right" class="hu-switcher-action ' . ($alignment === 'right' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-align-right" aria-hidden="true"></span>'; $html .= '</span>'; $html .= '<span data-value="justify" class="hu-switcher-action ' . ($alignment === 'justify' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-align-justify" aria-hidden="true"></span>'; $html .= '</span>'; $html .= '</div>'; $html .= '</div>'; $html .= '<input type="hidden" class="hu-text-align" value="' . $alignment . '" />'; $html .= '</div>'; return $html; } } PKBA#] Gԕ��1system/helixultimate/src/fields/helixswitcher.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Form\FormField; use Joomla\CMS\Language\Text; use Joomla\Filesystem\File; /** * Form field for helix presets. * * @since 1.0.0 */ class JFormFieldHelixSwitcher extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'HelixSwitcher'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $rule = (string) $this->element['textrule']; $rule = !empty($rule) ? $rule : 'text'; $default = (string) $this->element['default']; $switcherStyle = (string) $this->element['switcherStyle']; $switcherStyle = !empty($switcherStyle) ? $switcherStyle : 'tab'; $fixedWidth = (string) $this->element['fixedwidth']; $fixedWidth = !empty($fixedWidth) && ($fixedWidth === 'true' || $fixedWidth === 'on'); $alignment = (string) $this->element['alignment']; $alignment = !empty($alignment) ? 'hu-align-' . $alignment : ''; $switcherClasses = 'hu-switcher-style-' . $switcherStyle; if ($fixedWidth) { $switcherClasses .= ' hu-fixed-width'; } if ($alignment) { $switcherClasses .= ' ' . $alignment; } $children = $this->element->children(); $options = null; if (!empty($children)) { $options = $children->option; } $value = empty($this->value) ? $default : $this->value; $html = []; $html[] = '<div class="hu-switcher ' . $switcherClasses . '">'; $html[] = '<div class="hu-action-group">'; if (!empty($options)) { foreach ($options as $option) { $html[] = '<span class="hu-switcher-action ' . ($value === (string) $option['value'] ? 'active' : '') . $option->class . '" data-value="' . ((string) $option['value']) . '" hu-switcher-action role="button">'; $html[] = '<span class="hu-switcher-action-content">'; if (isset($option['icon']) && !empty($option['icon'])) { $html[] = '<span class="hu-switcher-icon"><span class="' . (string) $option['icon'] . '"></span></span>'; } elseif (isset($option['svg']) && !empty($option['svg'])) { $svg_path = JPATH_PLUGINS . '/system/helixultimate/assets/images/icons/' . (string) $option['svg'] . '.svg'; // $svg = \file_exists($svg_path) ? File::read($svg_path) : (string) $option['svg']; $svg = \file_exists($svg_path) ? file_get_contents($svg_path) : (string) $option['svg']; $html[] = '<span class="hu-switcher-svg">' . $svg . '</span>'; } elseif (isset($option['image']) && !empty($option['image'])) { $html[] = '<span class="hu-switcher-img"><img src="' . (string) $option['image'] . '" /></span>'; } $html[] = '</span>'; $html[] = '<span class="hu-switcher-label">' . Text::_((string) $option) . '</span>'; $html[] = '</span>'; } } $html[] = '</div>'; $html[] = '<input type="hidden" name="' . $this->name . '" id="' . $this->id . '" value="' . $value . '" />'; $html[] = '</div>'; return implode("\n", $html); } } PKBA#]1��d��0system/helixultimate/src/fields/helixheaders.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Form\FormField; use Joomla\Filesystem\Folder; use Joomla\CMS\Language\Text; defined('_JEXEC') or die(); /** * Form field for Helix headers. * * @since 1.0.0 */ class JFormFieldHelixheaders extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixheaders'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $input = Factory::getApplication()->input; $id = $input->get('id', 0, 'INT'); $template = $this->getTemplateName($id); $headers_src = JPATH_ROOT . '/templates/' . $template . '/headers'; $thumb_url = Uri::root() . 'templates/' . $template . '/headers'; $html = ''; $fallbackRegex = "@^style-(\d+)@i"; if (is_dir($headers_src)) { $headers = Folder::folders($headers_src); if (!empty($headers)) { $html = '<div class="hu-predefined-headers">'; $html .= '<ul class="hu-header-list clearfix" data-name="' . $this->name . '">'; foreach ($headers as $header) { $headerName = preg_replace("@(^\d+-)(.+)@", "$2", $header); $headerName = preg_split("@(?=[A-Z])@", $headerName); $headerName = implode(' ', $headerName); if (preg_match($fallbackRegex, $header, $matches)) { $styleNumber = isset($matches[1]) ? (int) $matches[1] : 1; $headerName = $styleNumber <= 2 ? Text::_('HELIX_ULTIMATE_HEADER_STYLE_' . $styleNumber) : ucfirst(str_replace("-", ' ', $header)); } else { $_headerName = \strtoupper(\implode('_', \explode(' ', $headerName))); $headerName = Text::_('HELIX_ULTIMATE_HEADER_STYLE' . $_headerName); } $html .= '<li class="hu-header-item' . (($this->value === $header) ? ' active' : '') . '" data-style="' . $header . '">'; if (file_exists($headers_src . '/' . $header . '/thumb.svg')) { $html .= '<span class="img-wrap"><img src="' . $thumb_url . '/' . $header . '/thumb.svg" alt="' . $header . '"></span>'; } else { $html .= '<span class="img-wrap"><img src="' . $thumb_url . '/' . $header . '/thumb.jpg" alt="' . $header . '"></span>'; } $html .= '<span class="hu-predefined-headers-title">' . $headerName . '</span>'; $html .= '</li>'; } $html .= '<input type="hidden" name="' . $this->name . '" value=\'' . $this->value . '\' id="' . $this->id . '">'; $html .= '</div>'; } } return $html; } /** * Get template name. * * @param integer $id The template ID. * * @return object * @since 1.0.0 */ private function getTemplateName($id = 0) { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select('*'); $query->from($db->quoteName('#__template_styles')); $query->where($db->quoteName('client_id') . ' = 0'); $query->where($db->quoteName('id') . ' = ' . (int) $id); $db->setQuery($query); $result = $db->loadObject(); if (!empty($result)) { return $result->template; } return; } } PKBA#]���o��.system/helixultimate/src/fields/heliximage.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Language\Text; use Joomla\CMS\Form\FormField; use Joomla\Filesystem\File; use Joomla\CMS\HTML\HTMLHelper; /** * Form field for Helix image. * * @since 1.0.0 */ class JFormFieldHeliximage extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Heliximage'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { HTMLHelper::_('jquery.framework'); $class = ' hu-image-field-empty'; if ($this->value) { $class = ' hu-image-field-has-image'; } $output = '<div class="hu-image-field' . $class . ' clearfix">'; $output .= '<div class="hu-image-upload-wrapper">'; if ($this->value) { $data_src = $this->value; $src = Uri::root(true) . '/' . $data_src; $basename = basename($data_src); $thumbnail = JPATH_ROOT . '/' . dirname($data_src) . '/' . File::stripExt($basename) . '_thumbnail.' . $this->getExt($basename); if (file_exists($thumbnail)) { $src = Uri::root(true) . '/' . dirname($data_src) . '/' . File::stripExt($basename) . '_thumbnail.' . $this->getExt($basename); } $output .= '<img src="' . $src . '" data-src="' . $data_src . '" alt="">'; } $output .= '</div>'; $output .= '<input type="file" class="hu-image-upload" accept="image/*" style="display:none;">'; $output .= '<a class="btn btn-primary btn-hu-image-upload" href="#"><i class="fas fa-plus" aria-hidden="true"></i> ' . Text::_('HELIX_ULTIMATE_UPLOAD_IMAGE') . '</a>'; $output .= '<a class="btn btn-danger btn-hu-image-remove" href="#"><i class="fas fa-minus-circle" aria-hidden="true"></i> ' . Text::_('HELIX_ULTIMATE_REMOVE_IMAGE') . '</a>'; $output .= '<input type="hidden" name="' . $this->name . '" id="' . $this->id . '" value="' . htmlspecialchars($this->value ?? "", ENT_COMPAT, 'UTF-8') . '" class="form-field-hu-image">'; $output .= '</div>'; return $output; } /** * Gets the extension of a file name * * @param string $file The file name * * @return string The file extension * * @since 3.0.0 */ public function getExt($file) { // String manipulation should be faster than pathinfo() on newer PHP versions. $dot = strrpos($file, '.'); if ($dot === false) { return ''; } $ext = substr($file, $dot + 1); // Extension cannot contain slashes. if (strpos($ext, '/') !== false || (DIRECTORY_SEPARATOR === '\\' && strpos($ext, '\\') !== false)) { return ''; } return $ext; } } PKBA#]��F~~1system/helixultimate/src/fields/helixmegamenu.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Form\FormField; use Joomla\CMS\Menu\SiteMenu; use Joomla\Database\DatabaseInterface; /** * Form field for Helix mega menu * * @since 1.0.0 */ class JFormFieldHelixmegamenu extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = "Helixmegamenu"; /** * Row layouts. * * @var array Layouts. * @since 1.0.0 */ private $row_layouts = array('12', '6+6', '4+4+4', '3+3+3+3', '2+2+2+2+2+2', '5+7', '4+8','3+9','2+10'); /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ public function getInput() { $html = '<div>'; $html .= $this->getMegaSettings(); $html .= '<input type="hidden" name="' . $this->name . '" id="' . $this->id . '" value="' . $this->value . '">'; $html .= '</div>'; return $html; } /** * Get mega menu settings. * * @return string Megamenu settings HTML string. * @since 1.0.0 */ public function getMegaSettings() { $mega_menu_path = JPATH_SITE . '/plugins/system/helixultimate/fields/'; $menu_data = json_decode($this->value ?? ""); $menu_item = $this->form->getData()->toObject(); ob_start(); include_once dirname(__DIR__) . '/Core/Lib/helixmenuhelper.php'; $html = ob_get_clean(); return $html; } /** * Get module name ID. * * @param mixed $id Module ID. * * @return mixed Module list or module object * @since 1.0.0 */ private function getModuleNameById($id = 'all') { $db = Factory::getContainer()->get(DatabaseInterface::class); $query = $db->getQuery(true); $query->select($db->quoteName(array('id','title'))); $query->from($db->quoteName('#__modules')); $query->where($db->quoteName('published') . ' = 1'); $query->where($db->quoteName('client_id') . ' = 0'); if ($id !== 'all') { $query->where($db->quoteName('id') . ' = ' . (int) $id); } $db->setQuery($query); if ($id !== 'all') { return $db->loadObject(); } return $db->loadObjectList(); } /** * Get unique menu items. * * @param integer $current_menu_id The running menu item id. * @param array $layout Layouts. * * @return array * @since 1.0.0 */ private function uniqueMenuItems($current_menu_id, $layout = array()) { $saved_menu_items = array(); $items = $this->menuItems(); $children = isset($items[$current_menu_id]) ? $items[$current_menu_id] : array(); if (!$layout) { return $children; } foreach ($layout as $key => $row) { foreach ($row->attr as $col_key => $col) { if ($col->items) { foreach ($col->items as $item) { if ($item->type === 'menu_item') { unset($children[$item->item_id]); } } } } } return $children; } /** * Menu items. * * @return array * @since 1.0.0 */ private function menuItems() { $menus = new SiteMenu; $menus = $menus->getMenu(); $new = array(); foreach ($menus as $item) { $new[$item->parent_id][$item->id] = $item->id; } return $new; } /** * Select option field HTML. * * @param string $name Field name. * @param string $label Field label. * @param array $lsit Option list. * @param string $default Default value. * @param string $display_class Select class. * * @return string Select option HTML string. * @since 1.0.0 */ private function selectFieldHTML($name, $label, $list, $default, $display_class = '') { $view_class = ''; if ($name === 'alignment') { $view_class = 'hu-megamenu-field-control ' . $display_class; } elseif ($name === 'dropdown') { $view_class = 'hu-dropdown-field-control ' . $display_class; } $html = ''; $html .= '<div class="' . $view_class . '">'; $html .= '<span class="hu-megamenu-label">' . $label . '</span>'; $html .= '<select id="hu-megamenu-' . $name . '">'; if ($name === 'fa-icon') { $html .= '<option value="">' . Text::_('HELIX_ULTIMATE_GLOBAL_SELECT') . '</option>'; foreach ($list as $each) { $html .= '<option value="' . $each . '"' . (($default === $each) ? 'selected' : '') . '>' . str_replace('fa-', '', $each) . '</option>'; } } else { foreach ($list as $key => $each) { $html .= '<option value="' . $key . '"' . (($default === $key) ? 'selected' : '') . '>' . $each . '</option>'; } } $html .= '</select>'; $html .= '</div>'; return $html; } /** * Color field HTML. * * @param string $name Field name. * @param string $label Field label. * @param string $placeholder Field placeholder. * @param string $value Default value. * * @return string Color field HTML string. * @since 1.0.0 */ private function colorFieldHTML($name, $label, $placeholder, $value) { $html = ''; $html .= '<div>'; $html .= '<span class="hu-megamenu-label">' . $label . '</span>'; $html .= '<input type="text" class="minicolors" id="hu-menu-badge-' . $name . '" placeholder="' . $placeholder . '" value="' . $value . '" />'; $html .= '</div>'; return $html; } /** * Text field HTML. * * @param string $name Field name. * @param string $label Field label. * @param string $placeholder Field placeholder. * @param string $value Default value. * @param string $type Field type. * @param string $display_class Field class name. * * @return string Text field HTML * @since 1.0.0 */ private function textFieldHTML($name, $label, $placeholder, $value, $type = 'text', $display_class = '') { if ($type === 'number') { $display_class = 'hu-megamenu-field-control' . $display_class; } $html = ''; $html .= '<div class="' . $display_class . '">'; $html .= '<span class="hu-megamenu-label">' . $label . '</span>'; $html .= '<input type="' . $type . '" id="hu-megamenu-' . $name . '" placeholder="' . $placeholder . '" value="' . $value . '" />'; $html .= '</div>'; return $html; } /** * Switch Field HTML. * * @param string $name Field name. * @param string $label Field label. * @param string $value Defaulf value. * * @return string Switch field HTML string. * @since 1.0.0 */ private function switchFieldHTML($name, $label, $value) { $html = ''; $html .= '<div>'; $html .= '<span class="hu-megamenu-label">' . $label . '</span>'; $html .= '<input type="checkbox" class="hu-checkbox" id="hu-megamenu-' . $name . '" ' . (!empty($value) ? 'checked' : '') . '/>'; $html .= '</div>'; return $html; } } PKBA#]2�ډ�/system/helixultimate/src/fields/helixbutton.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Form\FormField; /** * Form field for helixButton * * @since 1.0.0 */ class JFormFieldHelixbutton extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixbutton'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $url = !empty($this->element['url']) ? $this->element['url'] : '#'; $class = !empty($this->element['class']) ? ' ' . $this->element['class'] : ''; $text = !empty($this->element['text']) ? $this->element['text'] : 'Button'; $target = !empty($this->element['target']) ? $this->element['target'] : '_self'; return '<a id="' . $this->id . '" class="hu-btn' . str_replace('btn-', 'hu-btn-', $class) . '" href="' . $url . '" target="' . $target . '">' . Text::_($text) . '</a>'; } } PKBA#]?�Ճ!!0system/helixultimate/src/fields/helixpresets.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Form\FormField; use HelixUltimate\Framework\Platform\Settings; use HelixUltimate\Framework\Platform\Helper; /** * Form field for helix presets. * * @since 1.0.0 */ class JFormFieldHelixpresets extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixpresets'; /** * Preset field. * * @var string Preset field. * @since 1.0.0 */ protected $presetfiled = ''; /** * Preset List. * * @var string Preset list. * @since 1.0.0 */ protected $presetList = ''; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $children = $this->element->children(); $presetXml = array(); foreach ($children as $child) { $presetXml[(string) $child['name']] = $this->getDefaultDataFromXML($child); } $html = '<div class="hu-presets clearfix">'; $templateData = Helper::loadTemplateData(); if (empty($templateData)) { throw new \Exception(sprintf('Something went wrong! Template data not found.')); } $params = $templateData->params; $data = $params->get('presets-data', null); $presetsData = $this->createPresetData($data, array_keys($presetXml), $children); if (!empty($presetsData)) { list ($data, $htmlString) = $this->generateFieldFromParamsData($presetsData, $this->value); } else { list ($data, $htmlString) = $this->generateFieldFromXmlData($children, $this->value); } $data = json_encode($data); $html .= $htmlString; $html .= '<input id="default-values" type="hidden" class="default-values" value=\'' . json_encode($presetXml) . '\' />'; $html .= '<input id="presets-data" type="hidden" name="presets-data" class="hu-presets-data" value=\'' . $data . '\' />'; $html .= '<input id="' . $this->id . '" type="hidden" name="' . $this->name . '" class="hu-input-preset" value=\'' . $this->value . '\' />'; $html .= '</div>'; return $html; } /** * Check if the options.xml is updated with new preset values or not. * If any new preset added to the xml then update the json and add the * new one. Same for removing a preset at xml. * * @param string $json The JSON preset value string. * @param array $names The preset names array. * @param SimpleXML $presets The simple XML children of the presets. * * @return \stdClass | null * @since 2.0.2 */ private function createPresetData($json, $names, $presets) { if (empty($json)) { return null; } if (\is_string($json)) { $json = \json_decode($json ?? ""); } $keys = \array_keys((array) $json); $names = \array_flip($names); foreach ($json as $presetName => $_) { if (!isset($names[$presetName])) { unset($json->$presetName); } else { unset($names[$presetName]); } } foreach ($presets as $child) { $elementName = (string) $child['name']; if (isset($json->$elementName) && !empty($json->$elementName)) { $json->$elementName = array_merge((array) $json->$elementName ?? [], [ 'default' => !empty($child['default']) ? (string) $child['default'] : '' ]); } if (isset($names[$elementName])) { $existing = isset($json->$elementName) ? (array) $json->$elementName : []; $json->$elementName = array_merge($existing, [ 'label' => isset($child['label']) ? (string) $child['label'] : '', 'description' => isset($child['description']) ? (string) $child['description'] : '', 'default' => isset($child['default']) ? (string) $child['default'] : '', 'data' => (object) $this->getDefaultDataFromXML($child) ]); } // Normalize & ensure all keys exist $json->$elementName = (object) array_merge([ 'label' => '', 'description' => '', 'default' => '', 'data' => (object) [] ], (array) $json->$elementName); } return $json; } private function getDefaultDataFromXML($presets) { $data = array(); foreach ($presets->children() as $preset) { $data[(string) $preset['name']] = (string) $preset['value']; } $data['preset'] = (string) $presets['name']; return $data; } /** * Make setting panel or modal from saved * data into database * * @param string $json Preset json string. * @param string $value Field value * * @return array * @since 2.0.0 */ private function generateFieldFromParamsData($json, $value) { $data = array(); $html = ''; if (\is_string($json ?? "") && strlen($json ?? "") > 0) { $json = json_decode($json ?? ""); } $preset = json_decode($value ?? ""); foreach ($json as $name => $child) { $class = ''; if (isset($preset->preset) && $preset->preset === $name) { $class = ' active'; } $html_data_attr = 'data-preset="' . $name . '"'; $presetData = array( 'name' => $name, 'data' => array() ); foreach ($child->data as $prop => $val) { if ($prop !== 'preset') { $html_data_attr .= ' data-' . $prop . '="' . $val . '"'; // Generate preset data for editing $presetData['data'][$prop] = $val; } } $html .= '<div class="hu-preset ' . $class . '" style="background-color: ' . $child->default . '" ' . $html_data_attr . '>'; // Edit preset $html .= '<a type="button" role="button" class="hu-edit-preset" data-preset="' . $name . '" style="color: ' . $child->default . '; border-top-right-radius: 3px;" data-preset_data=\'' . json_encode($presetData) . '\'><span class="fas fa-pen" aria-hidden="true"></span></a>'; $html .= Settings::preparePresetEditForm($presetData, $name); $html .= '<div class="hu-preset-title">' . $child->label . '</div>'; $html .= '<div class="hu-preset-contents">'; $html .= '</div>'; $html .= '</div>'; } return [$json, $html]; } /** * Make setting panel or modal from XML * * * @param array $children Preset fields * @param string $value Field value * * @return array * @since 2.0.0 */ private function generateFieldFromXmlData($children, $value) { $data = array(); $html = ''; foreach ($children as $child) { $data[(string) $child['name']] = array( 'label' => isset($child['label']) ? (string) $child['label'] : '', 'default' => isset($child['default']) ? (string) $child['default'] : '', 'description' => isset($child['description']) ? $child['description'] : '', 'data' => array() ); $preset = json_decode($value ?? ""); $class = ''; if (isset($preset->preset) && $preset->preset === $child['name']) { $class = ' active'; } $childName = $child->getName(); if ($childName === 'preset') { $html_data_attr = 'data-preset="' . $child['name'] . '"'; $presetData = array( 'name' => (string) $child['name'], 'data' => array() ); foreach ($child->children() as $preset) { $html_data_attr .= ' data-' . $preset['name'] . '="' . $preset['value'] . '"'; // Generate preset data for editing $presetData['data'][(string) $preset['name']] = (string) $preset['value']; $presetData['data']['preset'] = (string) $child['name']; $data[(string) $child['name']]['data'][(string) $preset['name']] = (string) $preset['value']; $data[(string) $child['name']]['data']['preset'] = (string) $child['name']; } $html .= '<div class="hu-preset' . $class . '" style="background-color: ' . $child['default'] . '" ' . $html_data_attr . ' class="hu-preset">'; // Edit preset $html .= '<a type="button" role="button" class="hu-edit-preset" data-preset="' . $child['name'] . '" style="color: ' . $child['default'] . '" data-preset_data=\'' . json_encode($presetData) . '\'><span class="fas fa-pen" aria-hidden="true"></span></a>'; $html .= Settings::preparePresetEditForm($presetData, $child['name']); $html .= '<div class="hu-preset-title">' . $child['label'] . '</div>'; $html .= '<div class="hu-preset-contents">'; $html .= '</div>'; $html .= '</div>'; } else { throw new UnexpectedValueException(sprintf('Unsupported element %s in JFormFieldGroupedList', $child->getName()), 500); } } return [$data, $html]; } } PKBA#]J��zD D 2system/helixultimate/src/fields/helixoffcanvas.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Form\FormField; use Joomla\Filesystem\Folder; defined('_JEXEC') or die(); /** * Form field for Helix headers. * * @since 1.0.0 */ class JFormFieldHelixOffcanvas extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'HelixOffcanvas'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $input = Factory::getApplication()->input; $id = $input->get('id', 0, 'INT'); $template = Helper::loadTemplateData(); $templateName = $template->template; $offCanvasDir = JPATH_ROOT . '/templates/' . $templateName . '/offcanvas'; $thumb_url = Uri::root() . 'templates/' . $templateName . '/offcanvas'; $html = ''; if (is_dir($offCanvasDir)) { $offCanvases = Folder::folders($offCanvasDir); if (!empty($offCanvases)) { $html = '<div class="hu-predefined-offcanvas">'; $html .= '<ul class="hu-offcanvas-list clearfix" data-name="' . $this->name . '">'; foreach ($offCanvases as $key => $canvas) { $canvasName = preg_replace("@(^\d+-)(.+)@", "$2", $canvas); $canvasName = preg_split("@(?=[A-Z])@", $canvasName); $canvasName = implode(' ', $canvasName); $html .= '<li class="hu-offcanvas-item' . (($this->value === $canvas) ? ' active' : '') . '" data-style="' . $canvas . '">'; if (file_exists($offCanvasDir . '/' . $canvas . '/thumb.svg')) { $html .= '<span class="img-wrap"><img src="' . $thumb_url . '/' . $canvas . '/thumb.svg" alt="' . $canvas . '"></span>'; } else { $html .= '<span class="img-wrap"><img src="' . $thumb_url . '/' . $canvas . '/thumb.jpg" alt="' . $canvas . '"></span>'; } $html .= '<span class="hu-predefined-offcanvas-title">' . $canvasName . '</span>'; $html .= '</li>'; } $html .= '<input type="hidden" name="' . $this->name . '" value=\'' . $this->value . '\' id="' . $this->id . '">'; $html .= '</div>'; } } return $html; } }PKBA#]@�p+::.system/helixultimate/src/fields/helixmedia.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Uri\Uri; use Joomla\CMS\Form\FormField; /** * Form field for Helix media * * @since 1.0.0 */ class JFormFieldHelixmedia extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixmedia'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ public function getInput() { $output = '<div class="hu-image-holder">'; if (!empty($this->value)) { $output .= '<img src="' . Uri::root() . $this->value . '" alt="">'; } $output .= '</div>'; $output .= '<input type="hidden" name="' . $this->name . '" id="' . $this->id . '" value="' . $this->value . '">'; $output .= '<a href="#" class="hu-media-picker hu-btn hu-btn-primary hu-mr-2" data-id="' . $this->id . '"><span class="fas fa-image" aria-hidden="true"></span> Select</a>'; $output .= '<a href="#" class="hu-media-clear hu-btn hu-btn-secondary' . (empty($this->value) ? ' hide' : '') . '"><span class="fas fa-times" aria-hidden="true"></span> Clear</a>'; return $output; } } PKBA#]��~}pp"system/helixultimate/composer.jsonnu�[���{ "name": "joomshaper/helixultimate", "description": "Joomla! template framework.", "type": "project", "license": "MIT", "authors": [ { "name": "JoomShaper", "email": "support@joomshaper.com" } ], "require": { "tedivm/jshrink": "~1.0", "scssphp/scssphp": "^2.0.1" }, "autoload": { "psr-4": { "HelixUltimate\\Framework\\": "./src/" } } } PKBA#]| �51b1b@system/helixultimate/language/en-GB.plg_system_helixultimate.ininu�[���;Basic Tab HELIX_ULTIMATE_BASIC="Basic" HELIX_ULTIMATE_GROUP_GLOBAL="Global" HELIX_ULTIMATE_GROUP_LOGO="Logo" HELIX_ULTIMATE_GROUP_HEADER="Header" HELIX_ULTIMATE_GROUP_BODY="Body" HELIX_ULTIMATE_GROUP_FOOTER="Footer" HELIX_ULTIMATE_GROUP_SOCIAL_ICONS="Social Icons" HELIX_ULTIMATE_GROUP_CONTACT_INFO="Contact Info" HELIX_ULTIMATE_GROUP_COMINGSOON="Coming Soon" HELIX_ULTIMATE_GROUP_ERRORPAGE="Error Page" HELIX_ULTIMATE_MODULE_POSITIONS="Module Position" HELIX_ULTIMATE_MODULE_POSITIONS_DESC="Select a module position from the following list." HELIX_ULTIMATE_FEATURE_POSITION="Feature Position" HELIX_ULTIMATE_FEATURE_POSITION_DESC="Set the position of this feature from the following list." HELIX_ULTIMATE_FEATURE_POSITION_DEFAULT="Default" HELIX_ULTIMATE_FEATURE_POSITION_BEFORE="Before Module" HELIX_ULTIMATE_FEATURE_POSITION_AFTER="After Module" HELIX_ULTIMATE_GROUP_OTHERS="Others" HELIX_ULTIMATE_LOGO_TYPE="Logo Type" HELIX_ULTIMATE_LOGO_TYPE_IMAGE="Image" HELIX_ULTIMATE_LOGO_TYPE_TEXT="Text" HELIX_ULTIMATE_LOGO="Logo" HELIX_ULTIMATE_LOGO_HEIGHT="Logo Height" HELIX_ULTIMATE_LOGO_HEIGHT_SM="Logo Height (Tablet)" HELIX_ULTIMATE_LOGO_HEIGHT_XS="Logo Height (Mobile)" HELIX_ULTIMATE_MOBILE_LOGO="Mobile Logo" HELIX_ULTIMATE_MOBILE_LOGO_DESC="This logo will be shown in mobile view instead of default logo. Leave blank if you do not want to show different logo for mobile devices." HELIX_ULTIMATE_MOBILE_LOGO_RETINA="Retina Logo" HELIX_ULTIMATE_MOBILE_LOGO_RETINA_DESC="This logo will be shown on the retina display. The retina logo should be twice the size of the default logo. Say if the default logo is <code>100x100</code> then the retina logo should be <code>200x200</code>." HELIX_ULTIMATE_LOGO_ALT_TEXT="Logo Alt Text" HELIX_ULTIMATE_LOGO_ALT_TEXT_DESC="Logo Alt Text can enhance your SEO performance. Use concise but brief (as possible) alt text for your site logo." HELIX_ULTIMATE_LOGO_CUSTOM_LINK="Logo Custom Link" HELIX_ULTIMATE_LOGO_CUSTOM_LINK_DESC="Custom Logo link if you want to reditect to other page rather then the root URL" HELIX_ULTIMATE_LOGO_TYPE_TEXT="Text" HELIX_ULTIMATE_LOGO_SLOGAN="logo Slogan" HELIX_ULTIMATE_PREDEFINED_HEADER="Predefined Header" HELIX_ULTIMATE_PREDEFINED_HEADER_DESC="Enable this option to use a predefined header provided by Helix Ultimate." HELIX_ULTIMATE_HEADER_HEIGHT="Header Height" HELIX_ULTIMATE_HEADER_HEIGHT_SM="Header Height (Tablet)" HELIX_ULTIMATE_HEADER_HEIGHT_XS="Header Height (Mobile)" HELIX_ULTIMATE_STICKY_HEADER_MD="Sticky Header" HELIX_ULTIMATE_STICKY_HEADER_SM="Sticky Header (Tablet)" HELIX_ULTIMATE_STICKY_HEADER_XS="Sticky Header (Mobile)" HELIX_ULTIMATE_ENABLE_SEARCH="Enable Search" HELIX_ULTIMATE_ENABLE_SEARCH_DESC="Enable search and show it to the header." HELIX_ULTIMATE_ENABLE_LOGIN="Enable Login" HELIX_ULTIMATE_ENABLE_LOGIN_DESC="Enable login and show it to the header." HELIX_ULTIMATE_HEADER_STYLE_1="Top Bar" HELIX_ULTIMATE_HEADER_STYLE_2="Classic Layout" HELIX_ULTIMATE_HEADER_STYLE_FULL_MODAL="Full Modal" HELIX_ULTIMATE_HEADER_STYLE_CENTER_MODAL="Center Modal" HELIX_ULTIMATE_HEADER_STYLE_LEFT_MODAL="Left Modal" HELIX_ULTIMATE_HEADER_STYLE_MULTI_ROWS="Multi Rows" HELIX_ULTIMATE_HEADER_STYLE_FULLWIDTH_CENTER="Fullwidth Center" HELIX_ULTIMATE_HEADER_STYLE_FULLWIDTH_LEFT="Fullwidth Left" HELIX_ULTIMATE_HEADER_STYLE_MINIMAL_LAYOUT="Minimal Layout" HELIX_ULTIMATE_TOPBAR_MSG_DRAFTING="Drafting..." HELIX_ULTIMATE_TOPBAR_MSG_RESET_DRAFT="Reset" HELIX_ULTIMATE_TOPBAR_MSG_DRAFTED="Drafted" HELIX_ULTIMATE_ENABLE_OFFCANVAS_SEARCH="Enable Search" HELIX_ULTIMATE_ENABLE_OFFCANVAS_SEARCH_DESC="Enable search field to render at off-canvas." HELIX_ULTIMATE_ENABLE_OFFCANVAS_LOGIN="Enable Login" HELIX_ULTIMATE_ENABLE_OFFCANVAS_LOGIN_DESC="Enable login field to render at off-canvas." HELIX_ULTIMATE_ENABLE_OFFCANVAS_SOCIALS="Show Social Links" HELIX_ULTIMATE_ENABLE_OFFCANVAS_SOCIALS_DESC="Enable to show the social links to the off-canvas." HELIX_ULTIMATE_ENABLE_OFFCANVAS_CONTACTS="Show Contact" HELIX_ULTIMATE_ENABLE_OFFCANVAS_CONTACTS_DESC="Enable to show the contact information to the off-canvas." HELIX_ULTIMATE_ENABLE_OFFCANVAS_LOGO="Show Logo" HELIX_ULTIMATE_ENABLE_OFFCANVAS_LOGO_DESC="Enable to show the Logo inside Off-canvas Menu at the top." HELIX_ULTIMATE_COMINGSOON_COUNTDOWN="Countdown" ; Basics HELIX_ULTIMATE_FAVICON="Favicon" HELIX_ULTIMATE_FAVICON_DESC="Upload a <code>48x48</code> <b>.png</b> or <b>.gif</b> image that will be your favicon." HELIX_ULTIMATE_PRELOADER="Preloader" HELIX_ULTIMATE_PRELOADER_LOADER_TYPE="Loader Type" HELIX_ULTIMATE_PRELOADER_LOADER_TYPE_DESC="Select a preloader animation." HELIX_ULTIMATE_LOADER_CIRCLE="Circle" HELIX_ULTIMATE_LOADER_BUBBLE_LOOP="Bubble Loops" HELIX_ULTIMATE_LOADER_WAVE_TWO="Two Waves" HELIX_ULTIMATE_LOADER_AUDIO_WAVE="Audio Wave" HELIX_ULTIMATE_LOADER_CIRCLE_TWO="Two Circles" HELIX_ULTIMATE_LOADER_CLOCK="Clock" HELIX_ULTIMATE_LOADER_LOGO="Logo" HELIX_ULTIMATE_ENABLE_BOXED_LAYOUT="Boxed Layout" HELIX_ULTIMATE_CONTAINER_MAX_WIDTH="Container Max Width (px)" HELIX_ULTIMATE_CONTAINER_MAX_WIDTH_DESC="Set the max width of the container. (Not applicable for Tablet & Mobile devices)<br><b>If you don't want to set the maximum width, leave the field blank</b>" HELIX_ULTIMATE_BODY_BACKGROUND_IMAGE="Background Image" HELIX_ULTIMATE_COPYRIGHT="Copyright" HELIX_ULTIMATE_GO_TO_TOP="Go to Top" HELIX_ULTIMATE_GROUP_COOKIE_CONSENT="Cookie Consent" HELIX_ULTIMATE_ENABLE_COOKIE_CONSENT="Enable" HELIX_ULTIMATE_ENABLE_COOKIE_CONTENT="Content" HELIX_ULTIMATE_ENABLE_COOKIE_BG_COLOR="Background Color" HELIX_ULTIMATE_ENABLE_COOKIE_TEXT_COLOR="Text Color" HELIX_ULTIMATE_ENABLE_COOKIE_ALLOW="Allow Cookies" HELIX_ULTIMATE_GROUP_ANALYTICS="Analytics" HELIX_ULTIMATE_GOOGLE_ANALYTICS_CODE="Google Analytics 4 Tracking ID" HELIX_ULTIMATE_GOOGLE_ANALYTICS_CODE_DESC="To set up a Google Analytics 4 property for your website, you need a Google tag ID (which usually starts with G-)." HELIX_ULTIMATE_GOOGLE_ANALYTICS_TRACKING_METHOD="Tracking Method" HELIX_ULTIMATE_GOOGLE_ANALYTICS_TRACKING_METHOD_DESC="Google analytics tracking method." HELIX_ULTIMATE_GOOGLE_ANALYTICS_UNIVERSAL_ANALYTICS="Universal Analytics" HELIX_ULTIMATE_GOOGLE_ANALYTICS_GOOGLE_SITE_TAGS="Global Site Tag" HELIX_ULTIMATE_GOOGLE_ANALYTICS_SELECT_TRACKING_METHOD="-- Select a Tracking Method --" ;Megamenu HELIX_ULTIMATE_MEGAMENU_ADD_NEW_ROW="Add New Row" HELIX_ULTIMATE_MENU="<i class='fas fa-bars fa-fw'></i> Mega Menu" HELIX_ULTIMATE_SUB_MENU="Helix Menu Options" HELIX_ULTIMATE_MENU_SHOW_TITLE="Show Menu Title" HELIX_ULTIMATE_MENU_SHOW_TITLE_DESC="Disable this option to hide menu title." HELIX_ULTIMATE_MENU_ICON="Menu Icon" HELIX_ULTIMATE_MENU_ICON_DESC="Select any icon from the list to display just before this menu item title." HELIX_ULTIMATE_MENU_CLASS="Custom CSS Class" HELIX_ULTIMATE_MENU_CLASS_DESC="Add custom css class to this menu item." HELIX_ULTIMATE_MENU_MANAGE_LAYOUT="Manage Layout" HELIX_ULTIMATE_GLOBAL_LEFT="Left" HELIX_ULTIMATE_GLOBAL_CENTER="Center" HELIX_ULTIMATE_GLOBAL_RIGHT="Right" HELIX_ULTIMATE_GLOBAL_FULL="Full" HELIX_ULTIMATE_GLOBAL_RESET="Reset" HELIX_ULTIMATE_MENU_SUB_WIDTH="Width" HELIX_ULTIMATE_MENU_ENABLED="Mega Menu" HELIX_ULTIMATE_MENU_MODULE_LIST="Module List" HELIX_ULTIMATE_SEARCH_MODULE_HINT="Search For Module" HELIX_ULTIMATE_SEARCH_ITEM="Search For Item" HELIX_ULTIMATE_MODULE_INSERT="Insert" HELIX_ULTIMATE_MENU_INSERT="Insert" HELIX_ULTIMATE_NOTHING_FOUND="Nothing Found" HELIX_ULTIMATE_MENU_ITEMS="Menu Items" HELIX_ULTIMATE_MODULES="Modules" HELIX_ULTIMATE_MENU_CHOOSE_LAYOUT="Choose Layout" HELIX_ULTIMATE_YES="Yes" HELIX_ULTIMATE_NO="NO" HELIX_ULTIMATE_MENU_DROPDOWN_POSITION="Dropdown Position" HELIX_ULTIMATE_MENU_DROPDOWN_POSITION_DESC="Set the position of the dropdown under this menu item." HELIX_ULTIMATE_MENU_SUB_ALIGNMENT="Alignment" HELIX_ULTIMATE_MENU_SHOW_TITLE="Show Menu Title" HELIX_ULTIMATE_MENU_ICON="Icon" HELIX_ULTIMATE_GLOBAL_SELECT="Select" HELIX_ULTIMATE_MENU_CUSTOM_CLASS="Custom Class" HELIX_ULTIMATE_MENU_BADGE_TEXT="Badge" HELIX_ULTIMATE_MENU_BADGE_POSITION="Badge Position" HELIX_ULTIMATE_MENU_BADGE_BACKGROUND="Badge Background" HELIX_ULTIMATE_MENU_BADGE_COLOR="Badge Text Color" HELIX_ULTIMATE_PAGE_TITLE_HEADING="Heading H1 or H2" HELIX_ULTIMATE_PAGE_TITLE_HEADING_DESC="Set the page title to be either an <h1> or <h2> element." HELIX_ULTIMATE_SELECT_OFFCANVAS="Select Off-canvas" HELIX_ULTIMATE_SELECT_OFFCANVAS_DESC="Select an off-canvas for mobile menu." HELIX_ULTIMATE_FEATURED="Featured" ;Page Title HELIX_ULTIMATE_PAGE_TITLE="Page Title" HELIX_ULTIMATE_ENABLE_PAGE_TITLE="Enable Page Title" HELIX_ULTIMATE_ENABLE_PAGE_TITLE_DESC="Enable this option show page title after just below the header." HELIX_ULTIMATE_PAGE_TITLE_ALT="Alternative Title" HELIX_ULTIMATE_PAGE_TITLE_ALT_DESC="Alternative title will override Joomla default menu title." HELIX_ULTIMATE_PAGE_SUBTITLE="Page Subtitle" HELIX_ULTIMATE_PAGE_SUBTITLE_DESC="Add a brief description about the page as page subtitle." HELIX_ULTIMATE_PAGE_TITLE_BACKGROUND_COLOR="Background Color" HELIX_ULTIMATE_PAGE_TITLE_BACKGROUND_COLOR_DESC="Background color for the title area." HELIX_ULTIMATE_PAGE_TITLE_BACKGROUND_IMAGE="Background Image" HELIX_ULTIMATE_PAGE_TITLE_BACKGROUND_IMAGE_DESC="Add background image for the title area." ;Blog HELIX_ULTIMATE_BLOG_OPTIONS="<i class='fas fa-images fa-fw'></i> Blog Media" HELIX_ULTIMATE_UPLOAD_IMAGE="Upload Image" HELIX_ULTIMATE_REMOVE_IMAGE="Remove Image" HELIX_ULTIMATE_UPLOAD_IMAGES="Upload Images" HELIX_ULTIMATE_REMOVE_GALLERY_IMAGE="Remove" HELIX_ULTIMATE_UPLOAD_IMAGE_FAILED="Unable to upload image. Please try again." HELIX_ULTIMATE_REMOVE_IMAGE_FAILED="Unable to remove image. Please try again." HELIX_ULTIMATE_DELETE_FAILED="Delete failed" HELIX_ULTIMATE_UPLOAD_GALLERY_IMAGE_FAILED="Unable to upload gallery image. Please try again." HELIX_ULTIMATE_REMOVE_GALLERY_IMAGE_FAILED="Unable to remove gallery image. Please try again." HELIX_ULTIMATE_UPLOAD_PROGRESS_NOT_SUPPORTED="Upload progress is not supported." HELIX_ULTIMATE_BLOG_ARTICLE_FORMAT="Article Format" HELIX_ULTIMATE_BLOG_FEATURED_IMAGE="Featured Image" HELIX_ULTIMATE_BLOG_POST_FORMAT_STANDARD="<i class='fas fa-thumbtack fa-fw'></i> Standard" HELIX_ULTIMATE_BLOG_POST_FORMAT_VIDEO="<i class='fas fa-film fa-fw'></i> Video" HELIX_ULTIMATE_BLOG_POST_FORMAT_GALLERY="<i class='fas fa-image fa-fw'></i> Gallery" HELIX_ULTIMATE_BLOG_POST_FORMAT_AUDIO="<i class='fas fa-music fa-fw'></i> Audio" HELIX_ULTIMATE_BLOG_POST_FORMAT_GALLERY_LABEL="Upload Gallery Images" HELIX_ULTIMATE_BLOG_POST_FORMAT_GALLERY_DESCRIPTION="Select one or more images" HELIX_ULTIMATE_BLOG_POST_FORMAT_AUDIO_LABEL="Audio Embed Code" HELIX_ULTIMATE_BLOG_POST_FORMAT_AUDIO_DESCRIPTION="Write Your Audio Embed Code Here" HELIX_ULTIMATE_BLOG_POST_FORMAT_VIDEO_LABEL="Video URL" HELIX_ULTIMATE_BLOG_POST_FORMAT_VIDEO_DESCRIPTION="Add YouTube, Vimeo, Dailymotion, Direct MP4 URLs, Other standard embeddable video URLs." HELIX_ULTIMATE_IMAGE_LARGE_CROP_QUALITY="Quality" HELIX_ULTIMATE_IMAGE_LARGE_CROP_QUALITY_DESC="Set image quality for better compressions. Applicable for JPG images only." HELIX_ULTIMATE_BLOG_DETAILS_REMOVE_CONTAINER="Full-width Layout" HELIX_ULTIMATE_BLOG_LIST_TYPE="List Type" HELIX_ULTIMATE_BLOG_LIST_TYPE_DEFAULT="Default" HELIX_ULTIMATE_BLOG_LIST_TYPE_MASONRY="Masonry" HELIX_ULTIMATE_BLOG_READ_TIME="Read Time" HELIX_ULTIMATE_BLOG_READ_TIME_DESC="Display estimated article Read Time in minutes" HELIX_ULTIMATE_BLOG_LIST_DISABLE_MODULE="Disable Modules" HELIX_ULTIMATE_BLOG_LIST_DISABLE_MODULE_DESC="This option will disable all modules from the selected field from article list page." HELIX_ULTIMATE_BLOG_LIST_DISABLE_MODULE_POSITIONS="Disable Positions" HELIX_ULTIMATE_BLOG_LIST_DISABLE_MODULE_POSITIONS_DESC="Select which module positions you want to disable" HELIX_ULTIMATE_BLOG_DETAILS_DISABLE_MODULE="Disable Modules" HELIX_ULTIMATE_BLOG_DETAILS_DISABLE_MODULE_DESC="This option will disable all modules from the selected filed from article details page." HELIX_ULTIMATE_BLOG_DETAILS_DISABLE_MODULE_POSITIONS="Disable Positions" HELIX_ULTIMATE_BLOG_DETAILS_DISABLE_MODULE_POSITIONS_DESC="Select which module positions you want to disable" HELIX_ULTIMATE_BLOG_MINUTE_READ="minute read" HELIX_ULTIMATE_BLOG_MINUTES_READ="minutes read" ;Layout HELIX_ULTIMATE_SECTION_TITLE="Section" ;Menu Builder HELIX_ULTIMATE_MENU_EXTRA_CLASS="Custom Class" HELIX_ULTIMATE_MENU_EXTRA_CLASS_PLACEHOLDER="Add custom classes" HELIX_ULTIMATE_MENU_ICON="Icon" HELIX_ULTIMATE_MENU_ICON_PLACEHOLDER="Add an Icon." HELIX_ULTIMATE_MENU_CAPTION="Caption" HELIX_ULTIMATE_MENU_CAPTION_PLACEHOLDER="Add a caption." HELIX_ULTIMATE_ENABLE_MEGA_MENU="Mega Menu" HELIX_ULTIMATE_ENABLE_MEGA_MENU_DESC="Enable mega menu for the menu item: <code>'%s'</code>" HELIX_ULTIMATE_MEGA_MENU_WIDTH="Menu Width" HELIX_ULTIMATE_SHOW_MENU_TITLE="Show Menu Title" HELIX_ULTIMATE_MEGA_MENU_CUSTOM_CLASSES="Custom Classes" HELIX_ULTIMATE_MEGA_MENU_ALIGNMENT="Alignment" HELIX_ULTIMATE_MEGA_MENU_ALIGNMENT_DESC="Set menu alignment" HELIX_ULTIMATE_MEGA_ROW_SETTINGS_GROUP_GENERAL="General Settings" HELIX_ULTIMATE_MEGA_ROW_LABEL="Label" HELIX_ULTIMATE_MEGA_ROW_LABEL_DESC="Define a label for identifying the row." HELIX_ULTIMATE_MEGA_ROW_ENABLE_TITLE="Enable Title" HELIX_ULTIMATE_MEGA_ROW_ENABLE_TITLE_DESC="Enable row title to show on your site." HELIX_ULTIMATE_MEGA_ROW_TITLE="Title" HELIX_ULTIMATE_MEGA_ROW_TITLE_DESC="The title to show." HELIX_ULTIMATE_MEGA_ROW_SELECTOR_ID="ID" HELIX_ULTIMATE_MEGA_ROW_SELECTOR_ID_DESC="Row ID selector" HELIX_ULTIMATE_MEGA_ROW_SELECTOR_CLASS="Class" HELIX_ULTIMATE_MEGA_ROW_SELECTOR_CLASS_DESC="Row class selector." HELIX_ULTIMATE_MEGA_ROW_SETTINGS_GROUP_STYLES="Styles" HELIX_ULTIMATE_MEGA_ROW_MARGIN="Margin" HELIX_ULTIMATE_MEGA_ROW_MARGIN_DESC="Set the margin values with space separation (Top Right Bottom Left). The default unit is <code>px</code>. You can specify your own unit with the value." HELIX_ULTIMATE_MEGA_ROW_PADDING="Padding" HELIX_ULTIMATE_MEGA_ROW_PADDING_DESC="Set the padding values with space separation (Top Right Bottom Left). The default unit is <code>px</code>. You can specify your own unit with the value." HELIX_ULTIMATE_MEGA_ROW_SETTINGS_GROUP_RESPONSIVE="Responsive" HELIX_ULTIMATE_MEGA_ROW_HIDE_PHONE="Hide on Phone" HELIX_ULTIMATE_MEGA_ROW_HIDE_PHONE_DESC="Hide this row in phone." HELIX_ULTIMATE_MEGA_ROW_HIDE_LARGE_PHONE="Hide on Large Phone" HELIX_ULTIMATE_MEGA_ROW_HIDE_LARGE_PHONE_DESC="Hide this row in large phone." HELIX_ULTIMATE_MEGA_ROW_HIDE_TABLET="Hide on Tablet" HELIX_ULTIMATE_MEGA_ROW_HIDE_TABLET_DESC="Hide this row in tablet devices." HELIX_ULTIMATE_MEGA_ROW_HIDE_SMALL_DESKTOP="Hide on Smaller Desktop" HELIX_ULTIMATE_MEGA_ROW_HIDE_SMALL_DESKTOP_DESC="Hide this row in smaller desktop devices." HELIX_ULTIMATE_MEGA_ROW_HIDE_DESKTOP="Hide on Desktop" HELIX_ULTIMATE_MEGA_ROW_HIDE_DESKTOP_DESC="Hide this row in desktop devices." HELIX_ULTIMATE_MEGA_COL_LABEL="Colum Label" HELIX_ULTIMATE_MEGA_COL_LABEL_DESC="Add a label for identifying the column." HELIX_ULTIMATE_MEGA_COL_TYPE="Column Type" HELIX_ULTIMATE_MEGA_COL_TYPE_DESC="Select a type for this column." HELIX_ULTIMATE_MEGA_MODULE_STYLE="Module Style" HELIX_ULTIMATE_MEGA_MODULE_STYLE_DESC="Select a module style." HELIX_ULTIMATE_MEGA_MODULE_POSITIONS="Module Position" HELIX_ULTIMATE_MEGA_MODULE_POSITIONS_DESC="Select a module position" HELIX_ULTIMATE_MEGA_MODULE_CUSTOM_POSITIONS="Custom Module Position" HELIX_ULTIMATE_MEGA_MODULE_CUSTOM_POSITIONS_DESC="Create a new custom module position." HELIX_ULTIMATE_MEGA_MODULE="Module" HELIX_ULTIMATE_MEGA_MODULE_DESC="Select a module" HELIX_ULTIMATE_MENU_HIERARCHY_SELECT_ALL="Select All Items" HELIX_ULTIMATE_COLUMN_SETTINGS_MODULE_POSITION="Module Position" HELIX_ULTIMATE_COLUMN_SETTINGS_MODULE="Module" HELIX_ULTIMATE_COLUMN_SETTINGS_MENU_ITEMS="Menu Items" HELIX_ULTIMATE_MEGA_ENABLE_COL_TITLE="Enable Column Title" HELIX_ULTIMATE_MEGA_ENABLE_COL_TITLE_DESC="Enable column title for displaying." HELIX_ULTIMATE_MEGA_COL_TITLE="Column Title" HELIX_ULTIMATE_MEGA_COL_TITLE_DESC="Enter a title for the column." HELIX_ULTIMATE_MEGA_COL_SELECTOR_ID="Column ID" HELIX_ULTIMATE_MEGA_COL_SELECTOR_ID_DESC="Enter a custom unique CSS ID for the column." HELIX_ULTIMATE_MEGA_COL_SELECTOR_CLASS="Column Class" HELIX_ULTIMATE_MEGA_COL_SELECTOR_CLASS_DESC="Enter a custom CSS class for the column." HELIX_ULTIMATE_MEGA_COL_MARGIN="Margin" HELIX_ULTIMATE_MEGA_COL_MARGIN_DESC="Set the margin values with space separation (Top Right Bottom Left). The default unit is <code>px</code>. You can specify your own unit with the value." HELIX_ULTIMATE_MEGA_COL_PADDING="Padding" HELIX_ULTIMATE_MEGA_COL_PADDING_DESC="Set the padding values with space separation (Top Right Bottom Left). The default unit is <code>px</code>. You can specify your own unit with the value." HELIX_ULTIMATE_MEGA_COL_HIDE_PHONE="Hide on Phone" HELIX_ULTIMATE_MEGA_COL_HIDE_PHONE_DESC="Hide this column on phone." HELIX_ULTIMATE_MEGA_COL_HIDE_LARGE_PHONE="Hide on Large Phone" HELIX_ULTIMATE_MEGA_COL_HIDE_LARGE_PHONE_DESC="Hide this column on large phone." HELIX_ULTIMATE_MEGA_COL_HIDE_TABLET="Hide on Tablet" HELIX_ULTIMATE_MEGA_COL_HIDE_TABLET_DESC="Hide this column on tablet." HELIX_ULTIMATE_MEGA_COL_HIDE_SMALL_DESKTOP="Hide on Small Desktop" HELIX_ULTIMATE_MEGA_COL_HIDE_SMALL_DESKTOP_DESC="Hide this column on small desktop." HELIX_ULTIMATE_MEGA_COL_HIDE_DESKTOP="Hide on Desktop" HELIX_ULTIMATE_MEGA_COL_HIDE_DESKTOP_DESC="Hide this colun on desktop." HELIX_ULTIMATE_MENU_BADGE="Badge" HELIX_ULTIMATE_MENU_BADGE_PLACEHOLDER="Badge" HELIX_ULTIMATE_MENU_BADGE_POSITION="Left" HELIX_ULTIMATE_MENU_EDIT="Edit" HELIX_ULTIMATE_MENU_DELETE="Delete" HELIX_ULTIMATE_MENU_MEGAMENU="Mega Menu" HELIX_ULTIMATE_MENU_OPTIONS="Settings" HELIX_ULTIMATE_CUSTOM_LAYOUT_TEXT="Custom" HELIX_ULTIMATE_CUSTOM_LAYOUT_LABEL="Custom Layout" HELIX_ULTIMATE_MEGAMENU_APPLY_TEXT="Apply" ;Custom Code HELIX_ULTIMATE_CUSTOM_CODE="Custom Code" HELIX_ULTIMATE_BEFORE_HEAD="Before </head>" HELIX_ULTIMATE_BEFORE_HEAD_DESC="Any code you place here will appear in the head section of every page of your site. This feature is useful when you need to add verification code, JavaScript or CSS links to all pages." HELIX_ULTIMATE_AFTER_BODY="After <body>" HELIX_ULTIMATE_AFTER_BODY_DESC="Any code you place here will be appeared just after the opening body tag." HELIX_ULTIMATE_BEFORE_BODY="Before </body>" HELIX_ULTIMATE_BEFORE_BODY_DESC="Any code you place here will appear at the bottom of the body section of all pages of your site. This feature is useful if you need to input a tracking code for a state counter such as Google Analytics or Clicky." HELIX_ULTIMATE_CUSTOM_CSS="Custom CSS" HELIX_ULTIMATE_CUSTOM_CSS_DESC="You can use custom CSS to add your styles or overwrite default CSS to a template or extension. This option is useful for small changes in the stylesheets. For more extensive changes (more than 10 lines of code) we suggest to use the custom.css file." HELIX_ULTIMATE_CUSTOM_JS="Custom Javascript" HELIX_ULTIMATE_CUSTOM_JS_DESC="You can add custom JavaScript code. It loads your custom Javascript file after all other JavaScript files (except special hardcoded occasions), allowing you to be the last one who will affect your website." ; Missings HELIX_ULTIMATE_PREDEFINED_HEADER="Predefined Header" HELIX_ULTIMATE_PREDEFINED_HEADER_DESC="Enable this option to use a predefined header provided by Helix Ultimate." HELIX_ULTIMATE_LOGO_ALT_TEXT="Logo Alt Text" HELIX_ULTIMATE_LOGO_ALT_TEXT_DESC="Logo Alt Text can enhance your SEO performance. Use concise but brief (as possible) alt text for your site logo." HELIX_ULTIMATE_LOGO_TYPE_TEXT="Text" HELIX_ULTIMATE_LOGO_SLOGAN="logo Slogan" HELIX_ULTIMATE_STICKY_HEADER_MD="Sticky Header" HELIX_ULTIMATE_STICKY_HEADER_SM="Sticky Header (Tablet)" HELIX_ULTIMATE_STICKY_HEADER_XS="Sticky Header (Mobile)" HELIX_ULTIMATE_PREDEFINED_PRESETS="Pre-defined Presets" HELIX_ULTIMATE_GROUP_MENUBUILDER="Menu Builder" HELIX_ULTIMATE_FONT_COLOR="Color" HELIX_ULTIMATE_FONT_LETTER_SPACING="Spacing" HELIX_ULTIMATE_FONT_ALIGNMENT="Alignment" HELIX_ULTIMATE_FONT_LINE_HEIGHT="Line Height" HELIX_ULTIMATE_FONT_DECORATION="Decoration" HELIX_ULTIMATE_GROUP_IMAGE="Image" HELIX_ULTIMATE_ENABLE_IMAGE_LAZY_LOADING="Lazy Loading" HELIX_ULTIMATE_ENABLE_IMAGE_LAZY_LOADING_DESC="Enable this option will allow you to load all of your images in a lazy mode. This will defer all the offscreen images." HELIX_ULTIMATE_GROUP_ANALYTICS="Analytics" HELIX_ULTIMATE_GOOGLE_ANALYTICS_CODE="Google Analytics 4 Tracking ID" HELIX_ULTIMATE_GOOGLE_ANALYTICS_CODE_DESC="To set up a Google Analytics 4 property for your website, you need a Google tag ID (which usually starts with G-)." HELIX_ULTIMATE_GOOGLE_ANALYTICS_TRACKING_METHOD="Tracking Method" HELIX_ULTIMATE_GOOGLE_ANALYTICS_TRACKING_METHOD_DESC="Google analytics tracking method." HELIX_ULTIMATE_GOOGLE_ANALYTICS_UNIVERSAL_ANALYTICS="Universal Analytics" HELIX_ULTIMATE_GOOGLE_ANALYTICS_GOOGLE_SITE_TAGS="Global Site Tag" HELIX_ULTIMATE_SAVE_CHANGES="Save" HELIX_ULTIMATE_PURGE_CSS_TEXT="Purge CSS" HELIX_ULTIMATE_PURGE_CSS_DESC="Remove cache css and sass files from the system." HELIX_ULTIMATE_SELECT_ICON_LABEL="--Select Icon--" HELIX_ULTIMATE_ADD_NEW_MENU_ITEM="Add new Item" ; Advanced settings HELIX_ULTIMATE_FIELDSET_ADVANCED="Advanced" HELIX_ULTIMATE_GROUP_FONTS="Font Settings" HELIX_ULTIMATE_GROUP_COMPRESSION="Compression" HELIX_ULTIMATE_ENABLE_FONT_AWESOME="Enable Font Awesome" HELIX_ULTIMATE_ENABLE_FONT_AWESOME_DESC="You can enable/disable the Font Awesome icons to load your site." HELIX_ULTIMATE_GROUP_SCSS="SCSS" HELIX_ULTIMATE_GROUP_IMPORTEXPORT="Import & Export" HELIX_ULTIMATE_CSS_COMPRESS="Compress CSS Files" HELIX_ULTIMATE_CSS_COMPRESS_DESC="Enable this option to compress and combine all CSS files to increase website performance by reducing loading time. <strong>Note: In case of problems please disable this option</strong>" HELIX_ULTIMATE_JS_COMPRESS="Compress Javascript Files" HELIX_ULTIMATE_JS_COMPRESS_DESC="Enable this option to compress and combine all Javascript files to increase website performance by reducing loading time. <strong>Note: In case of problems please disable this option</strong>" HELIX_ULTIMATE_PURGE_CSS_TEXT="<span class='fas fa-eraser'></span> Purge CSS" HELIX_ULTIMATE_PURGE_CSS_DESC="Remove cache css and sass files from the system." HELIX_ULTIMATE_EXCLUDE_CSS="Exclude CSS Files" HELIX_ULTIMATE_EXCLUDE_CSS_DESC="Enter the names of CSS files separated by a comma that you don't want to compress. e.g., template.css, bootstrap.min.css" HELIX_ULTIMATE_EXCLUDE_JS="Exclude Javascript Files" HELIX_ULTIMATE_EXCLUDE_JS_DESC="Enter the names of Javascript files separated by a comma that you don't want to compress. e.g., jquery.min.js, main.js" HELIX_ULTIMATE_ENABLE_SCSS="Compile SCSS to CSS" HELIX_ULTIMATE_ENABLE_SCSS_DESC="Enable this option will compile all the <code>SCSS</code> files during each load of your website if the SCSS file has been changed or edited. Turn off this option if your site is in production mode." HELIX_ULTIMATE_SETTINGS_EXPORT="Export Settings" HELIX_ULTIMATE_SETTINGS_IMPORT="Import Settings" COM_FINDER_ADVANCED_TIPS="<p>Entering <strong>this and that</strong> into the search form will return results containing both "this" and "that".</p><p>Here are a few examples of how you can use the search feature:</p><p>Entering <strong>this not that</strong> into the search form will return results containing "this" and not "that".</p><p>Entering <strong>this or that</strong> into the search form will return results containing either "this" or "that".</p><p>Search results can also be filtered using a variety of criteria. Select one or more filters below to get started.</p><p>Entering <strong>"this and that"</strong> (with quotes) into the search form will return results containing the exact phrase "this and that".</p>" HELIX_ULTIMATE_HEADER_STICKY_OFFSET="Sticky Offset" HELIX_ULTIMATE_HEADER_STICKY_OFFSET_DESC="After which scroll offset the header being sticky." HELIX_ULTIMATE_BLOG_IMAGE_ALT_TEXT="Image Alt Text" HELIX_ULTIMATE_BLOG_IMAGE_ALT_TEXT_DESCRIPTION="This field isn't required. So, if you leave this field then alt text will get from title." HELIX_ULTIMATE_STICKY_POSITION="Position Sticky" HELIX_ULTIMATE_STICKY_POSITION_DESC="The viewport doesn’t change when the window is scrolled, so a fixed positioned element will stay right/left where it is when the page is scrolled" HELIX_ULTIMATE_STICKY_LOGO="Sticky Header Logo" HELIX_ULTIMATE_STICKY_LOGO_DESC="Upload a logo specifically for the sticky header. If not set, the main logo will be used." HELIX_ULTIMATE_STICKY_LOGO_HEIGHT="Sticky Header Logo Height" HELIX_ULTIMATE_STICKY_LOGO_HEIGHT_DESC="Set a custom height for the sticky header logo. Leave empty to use the default logo height." HELIX_ULTIMATE_MEDIA_SVG_NOT_SUPPORTED_FOR_UPLOAD="SVG is not supported for upload. Upload via Joomla Media, then select the file here." PKBA#]��4��*system/helixultimate/fields/helixmedia.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Uri\Uri; use Joomla\CMS\Form\FormField; /** * Form field for Helix media * * @since 1.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixmedia extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixmedia'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ public function getInput() { $output = '<div class="hu-image-holder">'; if (!empty($this->value)) { $output .= '<img src="' . Uri::root() . $this->value . '" alt="">'; } $output .= '</div>'; $output .= '<input type="hidden" name="' . $this->name . '" id="' . $this->id . '" value="' . $this->value . '">'; $output .= '<a href="#" class="hu-media-picker hu-btn hu-btn-primary hu-mr-2" data-id="' . $this->id . '"><span class="fas fa-image" aria-hidden="true"></span> Select</a>'; $output .= '<a href="#" class="hu-media-clear hu-btn hu-btn-secondary' . (empty($this->value) ? ' hide' : '') . '"><span class="fas fa-times" aria-hidden="true"></span> Clear</a>'; return $output; } } PKBA#]z{(���,system/helixultimate/fields/helixdetails.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Router\Route; use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; /** * Form field for helix details. * * @since 1.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixdetails extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixdetails'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { HTMLHelper::_('jquery.framework'); $doc = Factory::getDocument(); $plg_path = Uri::root(true) . '/plugins/system/helixultimate'; $doc->addScript($plg_path . '/assets/js/admin/details.js'); $doc->addStyleSheet($plg_path . '/assets/css/admin/details.css'); $app = Factory::getApplication(); $id = $app->input->get('id', 0, 'INT'); $url = Route::_('index.php?option=com_ajax&helix=ultimate&id=' . $id); $html = '<a href="' . $url . '" class="hu-options"><i class="icon-options"></i> Template Options</a>'; return $html; } /** * Override the getLabel method from FormField class. * * @return boolean * @since 1.0.0 */ public function getLabel() { return false; } } PKBA#]�d���1system/helixultimate/fields/helixexportimport.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Form\FormField; /** * Form field for helix import * * @since 1.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixexportimport extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixexportimport'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $input = Factory::getApplication()->input; $template_id = $input->get('id', 0, 'INT'); $export_url = 'index.php?option=com_ajax&helix=ultimate&task=export&id=' . $template_id; $output = '<a class="hu-btn hu-btn-primary" id="btn-hu-export-settings" rel="noopener noreferrer" target="_blank" href="' . $export_url . '">' . Text::_("HELIX_ULTIMATE_SETTINGS_EXPORT") . '</a>'; $output .= '<textarea id="input-hu-settings" rows="5"></textarea>'; $output .= '<a id="btn-hu-import-settings" class="hu-btn hu-btn-primary" rel="noopener noreferrer" data-template_id="' . $template_id . '" target="_blank" href="#">' . Text::_("HELIX_ULTIMATE_SETTINGS_IMPORT") . '</a>'; return $output; } } PKBA#]�Z8X� � *system/helixultimate/fields/heliximage.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\Filesystem\File; use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; /** * Form field for Helix image. * * @since 1.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHeliximage extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Heliximage'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $doc = Factory::getDocument(); HTMLHelper::_('jquery.framework'); $plg_path = Uri::root(true) . '/plugins/system/helixultimate'; $class = ' hu-image-field-empty'; if ($this->value) { $class = ' hu-image-field-has-image'; } $output = '<div class="hu-image-field' . $class . ' clearfix">'; $output .= '<div class="hu-image-upload-wrapper">'; if ($this->value) { $data_src = $this->value; $src = Uri::root(true) . '/' . $data_src; $basename = basename($data_src); $thumbnail = JPATH_ROOT . '/' . dirname($data_src) . '/' . File::stripExt($basename) . '_thumbnail.' . Helper::getExt($basename); if (file_exists($thumbnail)) { $src = Uri::root(true) . '/' . dirname($data_src) . '/' . File::stripExt($basename) . '_thumbnail.' . Helper::getExt($basename); } $output .= '<img src="' . $src . '" data-src="' . $data_src . '" alt="">'; } $output .= '</div>'; $output .= '<input type="file" class="hu-image-upload" accept="image/*" style="display:none;">'; $output .= '<a class="btn btn-primary btn-hu-image-upload" href="#"><i class="fas fa-plus" aria-hidden="true"></i> ' . Text::_('HELIX_ULTIMATE_UPLOAD_IMAGE') . '</a>'; $output .= '<a class="btn btn-danger btn-hu-image-remove" href="#"><i class="fas fa-minus-circle" aria-hidden="true"></i> ' . Text::_('HELIX_ULTIMATE_REMOVE_IMAGE') . '</a>'; $output .= '<input type="hidden" name="' . $this->name . '" id="' . $this->id . '" value="' . htmlspecialchars($this->value ?? "", ENT_COMPAT, 'UTF-8') . '" class="form-field-hu-image">'; $output .= '</div>'; return $output; } } PKBA#]`��� ,system/helixultimate/fields/helixheaders.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Form\FormField; use Joomla\Filesystem\Folder; defined('_JEXEC') or die(); /** * Form field for Helix headers. * * @since 1.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixheaders extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixheaders'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $input = Factory::getApplication()->input; $id = $input->get('id', 0, 'INT'); $template = $this->getTemplateName($id); $headers_src = JPATH_ROOT . '/templates/' . $template . '/headers'; $thumb_url = Uri::root() . 'templates/' . $template . '/headers'; $html = ''; if (is_dir($headers_src)) { $headers = Folder::folders($headers_src); if (!empty($headers)) { $html = '<div class="hu-predefined-headers">'; $html .= '<ul class="hu-header-list clearfix" data-name="' . $this->name . '">'; foreach ($headers as $header) { $html .= '<li class="hu-header-item' . (($this->value === $header) ? ' active' : '') . '" data-style="' . $header . '">'; if (file_exists($headers_src . '/' . $header . '/thumb.svg')) { $html .= '<span><img src="' . $thumb_url . '/' . $header . '/thumb.svg" alt="' . $header . '"</span>'; } else { $html .= '<span><img src="' . $thumb_url . '/' . $header . '/thumb.jpg" alt="' . $header . '"</span>'; } $html .= '</li>'; } $html .= '<input type="hidden" name="' . $this->name . '" value=\'' . $this->value . '\' id="' . $this->id . '">'; $html .= '</div>'; } } return $html; } /** * Get template name. * * @param integer $id The template ID. * * @return object * @since 1.0.0 */ private function getTemplateName($id = 0) { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select('*'); $query->from($db->quoteName('#__template_styles')); $query->where($db->quoteName('client_id') . ' = 0'); $query->where($db->quoteName('id') . ' = ' . (int) $id); $db->setQuery($query); $result = $db->loadObject(); if (!empty($result)) { return $result->template; } return; } } PKBA#]<���ww-system/helixultimate/fields/helixmegamenu.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Form\FormField; use Joomla\CMS\Menu\SiteMenu; /** * Form field for Helix mega menu * * @since 1.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixmegamenu extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = "Helixmegamenu"; /** * Row layouts. * * @var array Layouts. * @since 1.0.0 */ private $row_layouts = array('12', '6+6', '4+4+4', '3+3+3+3', '2+2+2+2+2+2', '5+7', '4+8','3+9','2+10'); /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ public function getInput() { $html = '<div>'; $html .= $this->getMegaSettings(); $html .= '<input type="hidden" name="' . $this->name . '" id="' . $this->id . '" value="' . $this->value . '">'; $html .= '</div>'; return $html; } /** * Get mega menu settings. * * @return string Megamenu settings HTML string. * @since 1.0.0 */ public function getMegaSettings() { $mega_menu_path = JPATH_SITE . '/plugins/system/helixultimate/fields/'; $menu_data = json_decode($this->value ?? ""); $menu_item = $this->form->getData()->toObject(); ob_start(); include_once dirname(__DIR__) . '/core/lib/helixmenuhelper.php'; $html = ob_get_clean(); return $html; } /** * Get module name ID. * * @param mixed $id Module ID. * * @return mixed Module list or module object * @since 1.0.0 */ private function getModuleNameById($id = 'all') { $db = Factory::getDBO(); $query = $db->getQuery(true); $query->select($db->quoteName(array('id','title'))); $query->from($db->quoteName('#__modules')); $query->where($db->quoteName('published') . ' = 1'); $query->where($db->quoteName('client_id') . ' = 0'); if ($id !== 'all') { $query->where($db->quoteName('id') . ' = ' . (int) $id); } $db->setQuery($query); if ($id !== 'all') { return $db->loadObject(); } return $db->loadObjectList(); } /** * Get unique menu items. * * @param integer $current_menu_id The running menu item id. * @param array $layout Layouts. * * @return array * @since 1.0.0 */ private function uniqueMenuItems($current_menu_id, $layout = array()) { $saved_menu_items = array(); $items = $this->menuItems(); $children = isset($items[$current_menu_id]) ? $items[$current_menu_id] : array(); if (!$layout) { return $children; } foreach ($layout as $key => $row) { foreach ($row->attr as $col_key => $col) { if ($col->items) { foreach ($col->items as $item) { if ($item->type === 'menu_item') { unset($children[$item->item_id]); } } } } } return $children; } /** * Menu items. * * @return array * @since 1.0.0 */ private function menuItems() { $menus = new SiteMenu; $menus = $menus->getMenu(); $new = array(); foreach ($menus as $item) { $new[$item->parent_id][$item->id] = $item->id; } return $new; } /** * Select option field HTML. * * @param string $name Field name. * @param string $label Field label. * @param array $lsit Option list. * @param string $default Default value. * @param string $display_class Select class. * * @return string Select option HTML string. * @since 1.0.0 */ private function selectFieldHTML($name, $label, $list, $default, $display_class = '') { $view_class = ''; if ($name === 'alignment') { $view_class = 'hu-megamenu-field-control ' . $display_class; } elseif ($name === 'dropdown') { $view_class = 'hu-dropdown-field-control ' . $display_class; } $html = ''; $html .= '<div class="' . $view_class . '">'; $html .= '<span class="hu-megamenu-label">' . $label . '</span>'; $html .= '<select id="hu-megamenu-' . $name . '">'; if ($name === 'fa-icon') { $html .= '<option value="">' . Text::_('HELIX_ULTIMATE_GLOBAL_SELECT') . '</option>'; foreach ($list as $each) { $html .= '<option value="' . $each . '"' . (($default === $each) ? 'selected' : '') . '>' . str_replace('fa-', '', $each) . '</option>'; } } else { foreach ($list as $key => $each) { $html .= '<option value="' . $key . '"' . (($default === $key) ? 'selected' : '') . '>' . $each . '</option>'; } } $html .= '</select>'; $html .= '</div>'; return $html; } /** * Color field HTML. * * @param string $name Field name. * @param string $label Field label. * @param string $placeholder Field placeholder. * @param string $value Default value. * * @return string Color field HTML string. * @since 1.0.0 */ private function colorFieldHTML($name, $label, $placeholder, $value) { $html = ''; $html .= '<div>'; $html .= '<span class="hu-megamenu-label">' . $label . '</span>'; $html .= '<input type="text" class="minicolors" id="hu-menu-badge-' . $name . '" placeholder="' . $placeholder . '" value="' . $value . '" />'; $html .= '</div>'; return $html; } /** * Text field HTML. * * @param string $name Field name. * @param string $label Field label. * @param string $placeholder Field placeholder. * @param string $value Default value. * @param string $type Field type. * @param string $display_class Field class name. * * @return string Text field HTML * @since 1.0.0 */ private function textFieldHTML($name, $label, $placeholder, $value, $type = 'text', $display_class = '') { if ($type === 'number') { $display_class = 'hu-megamenu-field-control' . $display_class; } $html = ''; $html .= '<div class="' . $display_class . '">'; $html .= '<span class="hu-megamenu-label">' . $label . '</span>'; $html .= '<input type="' . $type . '" id="hu-megamenu-' . $name . '" placeholder="' . $placeholder . '" value="' . $value . '" />'; $html .= '</div>'; return $html; } /** * Switch Field HTML. * * @param string $name Field name. * @param string $label Field label. * @param string $value Defaulf value. * * @return string Switch field HTML string. * @since 1.0.0 */ private function switchFieldHTML($name, $label, $value) { $html = ''; $html .= '<div>'; $html .= '<span class="hu-megamenu-label">' . $label . '</span>'; $html .= '<input type="checkbox" class="hu-checkbox" id="hu-megamenu-' . $name . '" ' . (!empty($value) ? 'checked' : '') . '/>'; $html .= '</div>'; return $html; } } PKBA#]q�l��,system/helixultimate/fields/helixpresets.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; use HelixUltimate\Framework\Platform\Settings; use HelixUltimate\Framework\Platform\Helper; /** * Form field for helix presets. * * @since 1.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixpresets extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixpresets'; /** * Preset field. * * @var string Preset field. * @since 1.0.0 */ protected $presetfiled = ''; /** * Preset List. * * @var string Preset list. * @since 1.0.0 */ protected $presetList = ''; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $children = $this->element->children(); $defaults = array(); foreach ($children as $child) { $defaults[(string) $child['name']] = $this->getDefaultDataFromXML($child); } $html = '<div class="hu-presets clearfix">'; $templateData = Helper::loadTemplateData(); if (empty($templateData)) { throw new \Exception(sprintf('Something went wrong! Template data not found.')); } $params = $templateData->params; $presetsData = $params->get('presets-data', null); if (!empty($presetsData)) { list ($data, $htmlString) = $this->generateFieldFromParamsData($presetsData, $this->value); } else { list ($data, $htmlString) = $this->generateFieldFromXmlData($children, $this->value); } $data = json_encode($data); $html .= $htmlString; $html .= '<input id="default-values" type="hidden" class="default-values" value=\'' . json_encode($defaults) . '\' />'; $html .= '<input id="presets-data" type="hidden" name="presets-data" class="hu-presets-data" value=\'' . $data . '\' />'; $html .= '<input id="' . $this->id . '" type="hidden" name="' . $this->name . '" class="hu-input-preset" value=\'' . $this->value . '\' />'; $html .= '</div>'; return $html; } private function getDefaultDataFromXML($presets) { $data = array(); foreach ($presets->children() as $preset) { $data[(string) $preset['name']] = (string) $preset['value']; } $data['preset'] = (string) $presets['name']; return $data; } /** * Make setting panel or modal from saved * data into database * * @param string $json Preset json string. * @param object $value Field value * * @return array * @since 2.0.0 */ private function generateFieldFromParamsData($json, $value) { $data = array(); $html = ''; if (\is_string($json) && strlen($json) > 0) { $json = json_decode($json ?? ""); } $preset = json_decode($value ?? ""); foreach ($json as $name => $child) { $class = ''; if (isset($preset->preset) && $preset->preset === $name) { $class = ' active'; } $html_data_attr = 'data-preset="' . $name . '"'; $presetData = array( 'name' => $name, 'data' => array() ); foreach ($child->data as $prop => $val) { if ($prop !== 'preset') { $html_data_attr .= ' data-' . $prop . '="' . $val . '"'; // Generate preset data for editing $presetData['data'][$prop] = $val; } } $html .= '<div class="hu-preset ' . $class . '" style="background-color: ' . $child->default . '" ' . $html_data_attr . '>'; // Edit preset $html .= '<a type="button" role="button" class="hu-edit-preset" data-preset="' . $name . '" style="color: ' . $child->default . '; border-top-right-radius: 3px;" data-preset_data=\'' . json_encode($presetData) . '\'><span class="fas fa-pen" aria-hidden="true"></span></a>'; $html .= Settings::preparePresetEditForm($presetData, $name); $html .= '<div class="hu-preset-title">' . $child->label . '</div>'; $html .= '<div class="hu-preset-contents">'; $html .= '</div>'; $html .= '</div>'; } return [$json, $html]; } /** * Make setting panel or modal from XML * * * @param array $children Preset fields * @param object $value Field value * * @return array * @since 2.0.0 */ private function generateFieldFromXmlData($children, $value) { $data = array(); $html = ''; foreach ($children as $child) { $data[(string) $child['name']] = array( 'label' => isset($child['label']) ? (string) $child['label'] : '', 'default' => isset($child['default']) ? (string) $child['default'] : '', 'description' => isset($child['description']) ? $child['description'] : '', 'data' => array() ); $preset = json_decode($value ?? ""); $class = ''; if (isset($preset->preset) && $preset->preset === $child['name']) { $class = ' active'; } $childName = $child->getName(); if ($childName === 'preset') { $html_data_attr = 'data-preset="' . $child['name'] . '"'; $presetData = array( 'name' => (string) $child['name'], 'data' => array() ); foreach ($child->children() as $preset) { $html_data_attr .= ' data-' . $preset['name'] . '="' . $preset['value'] . '"'; // Generate preset data for editing $presetData['data'][(string) $preset['name']] = (string) $preset['value']; $presetData['data']['preset'] = (string) $child['name']; $data[(string) $child['name']]['data'][(string) $preset['name']] = (string) $preset['value']; $data[(string) $child['name']]['data']['preset'] = (string) $child['name']; } $html .= '<div class="hu-preset' . $class . '" style="background-color: ' . $child['default'] . '" ' . $html_data_attr . ' class="hu-preset">'; // Edit preset $html .= '<a type="button" role="button" class="hu-edit-preset" data-preset="' . $child['name'] . '" style="color: ' . $child['default'] . '" data-preset_data=\'' . json_encode($presetData) . '\'><span class="fas fa-pen" aria-hidden="true"></span></a>'; $html .= Settings::preparePresetEditForm($presetData, $child['name']); $html .= '<div class="hu-preset-title">' . $child['label'] . '</div>'; $html .= '<div class="hu-preset-contents">'; $html .= '</div>'; $html .= '</div>'; } else { throw new UnexpectedValueException(sprintf('Unsupported element %s in JFormFieldGroupedList', $child->getName()), 500); } } return [$data, $html]; } } PKBA#]�&S��3system/helixultimate/fields/helixmultipositions.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Form\FormHelper; use Joomla\CMS\Version; FormHelper::loadFieldClass('list'); $version = new Version(); $JoomlaVersion = $version->getShortVersion(); if (version_compare($JoomlaVersion, '4.0.0', '>=')) { JLoader::registerAlias('JFormFieldList', 'Joomla\CMS\Form\Field\ListField'); } /** * Form field for Helix positions * * @since 1.0.0 */ class JFormFieldHelixmultipositions extends JFormFieldList { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixmultipositions'; /** * Override getOptions function * * @return array * @since 1.0.0 */ protected function getOptions() { $input = Factory::getApplication()->input; $style_id = $input->get('id', 0, 'INT'); $style = Helper::getTemplateStyle($style_id); $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName('position')); $query->from($db->quoteName('#__modules')); $query->where($db->quoteName('client_id') . ' = 0'); $query->where($db->quoteName('published') . ' = 1'); $query->group('position'); $query->order('position ASC'); $db->setQuery($query); $dbpositions = $db->loadObjectList(); $templateXML = JPATH_SITE . '/templates/' . $style->template . '/templateDetails.xml'; $template = simplexml_load_file($templateXML); $options = array(); foreach ($dbpositions as $positions) { if (empty($positions->position)) { continue; } $options[] = $positions->position; } foreach ($template->positions[0] as $position) { $options[] = (string) $position; } ksort($options); $opts = array_unique($options); $options = array(); foreach ($opts as $opt) { $options[$opt] = $opt; } $optionsArray = []; foreach ($options as $key => $item) { $optionsArray[] = HTMLHelper::_('select.option', $key, $item . ' (' . $key . ')'); } return array_merge(parent::getOptions(), $optionsArray); } } PKBA#]6 �<� � -system/helixultimate/fields/helixswitcher.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use HelixUltimate\Framework\Platform\Settings; use Joomla\CMS\Factory; use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Filesystem\File; /** * Form field for helix presets. * * @since 1.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixSwitcher extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'HelixSwitcher'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $rule = (string) $this->element['textrule']; $rule = !empty($rule) ? $rule : 'text'; $default = (string) $this->element['default']; $switcherStyle = (string) $this->element['switcherStyle']; $switcherStyle = !empty($switcherStyle) ? $switcherStyle : 'tab'; $fixedWidth = (string) $this->element['fixedwidth']; $fixedWidth = !empty($fixedWidth) && ($fixedWidth === 'true' || $fixedWidth === 'on'); $alignment = (string) $this->element['alignment']; $alignment = !empty($alignment) ? 'hu-align-' . $alignment : ''; $switcherClasses = 'hu-switcher-style-' . $switcherStyle; if ($fixedWidth) { $switcherClasses .= ' hu-fixed-width'; } if ($alignment) { $switcherClasses .= ' ' . $alignment; } $children = $this->element->children(); $options = null; if (!empty($children)) { $options = $children->option; } $value = empty($this->value) ? $default : $this->value; $html = []; $html[] = '<div class="hu-switcher ' . $switcherClasses . '">'; $html[] = '<div class="hu-action-group">'; if (!empty($options)) { foreach ($options as $option) { $html[] = '<span class="hu-switcher-action ' . ($value === (string) $option['value'] ? 'active' : '') . $option->class . '" data-value="' . ((string) $option['value']) . '" hu-switcher-action role="button">'; $html[] = '<span class="hu-switcher-action-content">'; if (isset($option['icon']) && !empty($option['icon'])) { $html[] = '<span class="hu-switcher-icon"><span class="' . (string) $option['icon'] . '"></span></span>'; } elseif (isset($option['svg']) && !empty($option['svg'])) { $svg_path = JPATH_PLUGINS . '/system/helixultimate/assets/images/icons/' . (string) $option['svg'] . '.svg'; // $svg = \file_exists($svg_path) ? File::read($svg_path) : (string) $option['svg']; $svg = \file_exists($svg_path) ? file_get_contents($svg_path) : (string) $option['svg']; $html[] = '<span class="hu-switcher-svg">' . $svg . '</span>'; } elseif (isset($option['image']) && !empty($option['image'])) { $html[] = '<span class="hu-switcher-img"><img src="' . (string) $option['image'] . '" /></span>'; } $html[] = '</span>'; $html[] = '<span class="hu-switcher-label">' . Text::_((string) $option) . '</span>'; $html[] = '</span>'; } } $html[] = '</div>'; $html[] = '<input type="hidden" name="' . $this->name . '" id="' . $this->id . '" value="' . $value . '" />'; $html[] = '</div>'; return implode("\n", $html); } } PKBA#]�䥬�1�1)system/helixultimate/fields/helixfont.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Form\FormField; use Joomla\CMS\Filesystem\File; use HelixUltimate\Framework\Platform\Helper; /** * Form field for Helix font. * * @since 1.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixfont extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixfont'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $input = Factory::getApplication()->input; $style_id = $input->get('id', 0, 'INT'); $style = Helper::getTemplateStyle($style_id); $template_path = JPATH_SITE . '/templates/' . $style->template . '/webfonts/webfonts.json'; $plugin_path = JPATH_PLUGINS . '/system/helixultimate/assets/webfonts/webfonts.json'; if (file_exists($template_path)) { // $json = File::read($template_path); $json = file_get_contents($template_path); } else { // $json = File::read($plugin_path); $json = file_get_contents($plugin_path); } $webfonts = json_decode($json ?? ""); $items = $webfonts->items; $value = json_decode($this->value ?? ""); if (isset($value->fontFamily)) { $font = self::filterArray($items, $value->fontFamily); } $html = ''; $classes = (!empty($this->element['class'])) ? $this->element['class'] : ''; $systemFonts = array( 'Arial', 'Tahoma', 'Verdana', 'Helvetica', 'Times New Roman', 'Trebuchet MS', 'Georgia' ); $fontWeights = array( '100' => 'Thin', '200' => 'Extra Light', '300' => 'Light', '400' => 'Normal', '500' => 'Medium', '600' => 'Semi Bold', '700' => 'Bold', '800' => 'Extra Bold', '900' => 'Black' ); $fontStyles = array( 'normal' => 'Normal', 'italic' => 'Italic', 'oblique' => 'Oblique' ); // Font Family $html .= '<div class="hu-field-webfont ' . $classes . '">'; /** * Preview Row */ $html .= '<div class="hu-webfont-preview-wrapper">'; $html .= '<div class="hu-webfont-preview">1 2 3 4 5 6 7 8 9 0 Grumpy wizards make toxic brew for the evil Queen and Jack.</div>'; $html .= '</div>'; /** * Start Fonts List row */ $html .= '<div class="hu-webfont-family hu-mb-3">'; $html .= $this->renderFontsList($systemFonts, $value, $items); $html .= '</div>'; /** * Font size, weight, color row */ $html .= '<div class="row">'; /** * Start Font Weight */ $html .= '<div class="col-5 hu-mb-3">'; $html .= $this->renderFontWeight($fontWeights, $value); $html .= '</div>'; /** * Start Font Size */ $html .= '<div class="col-4 hu-mb-3 hu-narrow-input">'; $html .= $this->renderFontSize($value); $html .= '</div>'; /** * Start Font Color */ $html .= '<div class="col-3 hu-mb-3 hu-narrow-input">'; $html .= $this->renderFontColor($value); $html .= '</div>'; $html .= '</div>'; /** * Font subset, letter spacing, line height row */ $html .= '<div class="row spacing-row">'; /** * Font subset section */ $html .= '<div class="col-5 hu-mb-3">'; $html .= $this->renderFontSubset($systemFonts, $font, $value); $html .= '</div>'; /** * Set line height */ $html .= '<div class="col-3 hu-mb-3 hu-narrow-input">'; $html .= $this->renderLineHeight($value); $html .= '</div>'; /** * Set Letter Spacing */ $html .= '<div class="col-4 hu-mb-3 hu-narrow-input">'; $html .= $this->renderLetterSpacing($value); $html .= '</div>'; $html .= '</div>'; /** * Font style, alignment row */ $html .= '<div class="row style-alignment">'; /** * Text Decoration */ $html .= '<div class="col-6 hu-mb-3">'; $html .= $this->renderTextDecoration($value); $html .= '</div>'; /** * Font Alignment */ $html .= '<div class="col-6 hu-mb-3">'; $html .= $this->renderFontAlignment($value); $html .= '</div>'; $html .= '</div>'; $html .= '<input type="hidden" name="' . $this->name . '" value=\'' . $this->value . '\' class="hu-webfont-input" id="' . $this->id . '">'; $html .= '</div>'; return $html; } /** * Get select options for the field. * * @param array $items The items form where the options will be generated. * @param string $selected The selected option item. * * @return string The option HTML string. * @since 1.0.0 */ private function generateSelectOptions( $items = array(), $selected = '' ) { $html = ''; foreach ($items as $item) { $html .= '<option ' . (($selected !== 'no-selection' && $item == $selected) ? 'selected="selected"' : '') . ' value="' . $item . '">' . $item . '</option>'; } return $html; } /** * Get Current font. * * @param array $items The fonts array. * @param string $key The expected font. * * @return mixed * @since 1.0.0 */ private static function filterArray($items, $key) { foreach ($items as $item) { if ($item->family === $key) { return $item; } } return false; } private function renderFontsList($systemFonts, $value, $items) { $html = ''; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_FAMILY') . '</label>'; $html .= '<select class="hu-webfont-list">'; $html .= '<optgroup label="' . Text::_('HELIX_ULTIMATE_SYSTEM_FONT') . '">'; foreach ($systemFonts as $systemFont) { $html .= '<option ' . ((isset($value->fontFamily) && $systemFont === $value->fontFamily) ? 'selected="selected"' : '') . ' value="' . $systemFont . '">' . $systemFont . '</option>'; } $html .= '</optgroup>'; $html .= '<optgroup label="' . Text::_('HELIX_ULTIMATE_GOOGLE_FONT') . '">'; foreach ($items as $item) { $html .= '<option ' . ((isset($value->fontFamily) && $item->family === $value->fontFamily) ? 'selected="selected"' : '') . ' value="' . $item->family . '">' . $item->family . '</option>'; } $html .= '</optgroup>'; $html .= '</select>'; return $html; } private function renderFontWeight($fontWeights, $value) { $html = ''; $html .= '<div class="hu-webfont-weight">'; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_WEIGHT') . '</label>'; $html .= '<select class="hu-webfont-weight-list">'; $html .= '<option value="">' . Text::_('HELIX_ULTIMATE_SELECT') . '</option>'; foreach ($fontWeights as $key => $fontWeight) { if (isset($value->fontWeight) && $value->fontWeight === $key) { $html .= '<option value="' . $key . '" selected>' . $fontWeight . '</option>'; } else { $html .= '<option value="' . $key . '">' . $fontWeight . '</option>'; } } $html .= '</select>'; $html .= '</div>'; return $html; } private function renderFontSize($value) { $html = ''; $fontSize = (isset($value->fontSize)) ? $value->fontSize : ''; $fontSize_sm = (isset($value->fontSize_sm)) ? $value->fontSize_sm : ''; $fontSize_xs = (isset($value->fontSize_xs)) ? $value->fontSize_xs : ''; $html .= '<div class="hu-webfont-size">'; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_SIZE') . '</label>'; $html .= '<input type="number" value="' . $fontSize . '" class="form-control hu-webfont-size-input active" min="6" max="200">'; $html .= '<input type="number" value="' . $fontSize_sm . '" class="form-control hu-webfont-size-input-sm" min="6" max="200">'; $html .= '<input type="number" value="' . $fontSize_xs . '" class="form-control hu-webfont-size-input-xs" min="6" max="200">'; $html .= '</div>'; return $html; } private function renderFontColor($value) { $color = !empty($value->fontColor) ? $value->fontColor : ''; $html = ''; $html .= '<div class="hu-font-color">'; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_COLOR') . '</label>'; $html .= '<input type="text" class="form-control hu-font-color-input minicolors" placeholder="Font Color" value="' . $color . '" />'; $html .= '</div>'; return $html; } private function renderFontSubset($systemFonts, $font, $value) { $html = ''; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_SUBSET') . '</label>'; $html .= '<select class="hu-webfont-subset-list">'; $html .= '<option value="">' . Text::_('HELIX_ULTIMATE_SELECT') . '</option>'; if (isset($value->fontFamily) && $value->fontFamily) { if (!in_array($value->fontFamily, $systemFonts)) { $html .= $this->generateSelectOptions($font->subsets, $value->fontSubset); } } $html .= '</select>'; return $html; } private function renderLineHeight($value) { $height = !empty($value->fontLineHeight) ? $value->fontLineHeight : ''; $html = ''; $html .= '<div class="hu-font-line-height">'; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_LINE_HEIGHT') . '</label>'; $html .= '<input type="number" class="form-control hu-font-line-height-input" min="1" max="200" value="' . $height . '" />'; $html .= '</div>'; return $html; } private function renderLetterSpacing($value) { $spacing = !empty($value->fontLetterSpacing) ? $value->fontLetterSpacing : ''; $html = ''; $html .= '<div class="hu-font-letter-spacing">'; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_LETTER_SPACING') . '</label>'; $html .= '<input type="number" class="form-control hu-font-letter-spacing-input" value="' . $spacing . '" step=".1" />'; $html .= '</div>'; return $html; } private function renderTextDecoration($value) { $decoration = !empty($value->textDecoration) ? $value->textDecoration : 'none'; $html = ''; $html .= '<div class="hu-font-decoration">'; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_DECORATION') . '</label>'; $html .= '<div class="hu-switcher hu-switcher-inline hu-switcher-style-tab hu-switcher-style-tab-sm">'; $html .= '<div class="hu-action-group">'; $html .= '<span data-value="none" class="hu-switcher-action ' . ($decoration === 'none' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-times" aria-hidden="true"></span>'; $html .= '</span>'; $html .= '<span data-value="underline" class="hu-switcher-action ' . ($decoration === 'underline' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-underline" aria-hidden="true"></span>'; $html .= '</span>'; $html .= '<span data-value="line-through" class="hu-switcher-action ' . ($decoration === 'strikethrough' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-strikethrough" aria-hidden="true"></span>'; $html .= '</span>'; $html .= '<span data-value="overline" class="hu-switcher-action ' . ($decoration === 'overline' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-overline" aria-hidden="true">O</span>'; $html .= '</span>'; $html .= '</div>'; $html .= '</div>'; $html .= '<input type="hidden" class="hu-text-decoration" value="' . $decoration . '" />'; $html .= '</div>'; return $html; } private function renderFontAlignment($value) { $alignment = !empty($value->textAlign) ? $value->textAlign : ''; $html = ''; $html .= '<div class="hu-font-alignment">'; $html .= '<label class="hu-mb-2">' . Text::_('HELIX_ULTIMATE_FONT_ALIGNMENT') . '</label>'; $html .= '<div class="hu-switcher hu-switcher-inline hu-switcher-style-tab hu-switcher-style-tab-sm">'; $html .= '<div class="hu-action-group">'; $html .= '<span data-value="left" class="hu-switcher-action ' . ($alignment === 'left' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-align-left" aria-hidden="true"></span>'; $html .= '</span>'; $html .= '<span data-value="center" class="hu-switcher-action ' . ($alignment === 'center' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-align-center" aria-hidden="true"></span>'; $html .= '</span>'; $html .= '<span data-value="right" class="hu-switcher-action ' . ($alignment === 'right' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-align-right" aria-hidden="true"></span>'; $html .= '</span>'; $html .= '<span data-value="justify" class="hu-switcher-action ' . ($alignment === 'justify' ? 'active' : '') . '" role="button">'; $html .= '<span class="fas fa-align-justify" aria-hidden="true"></span>'; $html .= '</span>'; $html .= '</div>'; $html .= '</div>'; $html .= '<input type="hidden" class="hu-text-align" value="' . $alignment . '" />'; $html .= '</div>'; return $html; } } PKBA#]RB�%��)system/helixultimate/fields/helixicon.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; use HelixUltimate\Framework\Core\Lib\FontawesomeIcons; defined('_JEXEC') or die(); /** * Form field for Helix icons. * * @since 1.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixicon extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixicon'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ public function getInput() { $fontawesome = new FontawesomeIcons; $icons = $fontawesome->getIcons(); $arr = array(); $arr[] = HTMLHelper::_('select.option', '', ''); foreach ($icons as $value) { $arr[] = HTMLHelper::_('select.option', $value, preg_replace('@^fa[sbr]\s+fa-@', '', $value)); } return HTMLHelper::_('select.genericlist', $arr, $this->name, null, 'value', 'text', $this->value); } } PKBA#]�A Q��+system/helixultimate/fields/helixbutton.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Form\FormField; /** * Form field for helixButton * * @since 1.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixbutton extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixbutton'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $url = !empty($this->element['url']) ? $this->element['url'] : '#'; $class = !empty($this->element['class']) ? ' ' . $this->element['class'] : ''; $text = !empty($this->element['text']) ? $this->element['text'] : 'Button'; $target = !empty($this->element['target']) ? $this->element['target'] : '_self'; return '<a id="' . $this->id . '" class="hu-btn' . str_replace('btn-', 'hu-btn-', $class) . '" href="' . $url . '" target="' . $target . '">' . Text::_($text) . '</a>'; } } PKBA#]�Uz8//,system/helixultimate/fields/helixgallery.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\Factory; use Joomla\CMS\Filesystem\File; use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; defined('_JEXEC') or die(); /** * Form field for Helix gallery. * * @since 1.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixgallery extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixgallery'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $doc = Factory::getDocument(); HTMLHelper::_('jquery.framework'); $helix_plg_url = Uri::root(true) . '/plugins/system/helixultimate'; $doc->addScript($helix_plg_url . '/assets/js/admin/jquery-ui.min.js'); $plg_path = Uri::root(true) . '/plugins/system/helixultimate'; $values = json_decode($this->value ?? ""); if (!empty($values)) { $images = $this->element['name'] . '_images'; $values = $values->$images; } else { $values = array(); } $output = '<div class="hu-gallery-field">'; $output .= '<ul class="hu-gallery-items clearfix">'; if (is_array($values) && !empty($values)) { foreach ($values as $key => $value) { $data_src = $value; $src = Uri::root(true) . '/' . $value; $basename = basename($src); $thumbnail = JPATH_ROOT . '/' . dirname($value) . '/' . File::stripExt($basename) . '_thumbnail.' . File::getExt($basename); $small_size = JPATH_ROOT . '/' . dirname($value) . '/' . File::stripExt($basename) . '_small.' . File::getExt($basename); if (file_exists($thumbnail)) { $src = Uri::root(true) . '/' . dirname($value) . '/' . File::stripExt($basename) . '_thumbnail.' . File::getExt($basename); } elseif (file_exists($small_size)) { $src = Uri::root(true) . '/' . dirname($value) . '/' . File::stripExt($basename) . '_small.' . File::getExt($basename); } $output .= '<li class="hu-gallery-item" data-src="' . $data_src . '"><a href="#" class="btn btn-mini btn-danger btn-hu-remove-gallery-image"><span class="fas fa-times" aria-hidden="true"></span></a><img src="' . $src . '" alt=""></li>'; } } $output .= '</ul>'; $output .= '<input type="file" id="hu-gallery-item-upload" accept="image/*" multiple="multiple" style="display:none;">'; $output .= '<a class="btn btn-default btn-secondary btn-hu-gallery-item-upload" href="#"><i class="fas fa-plus" aria-hidden="true"></i> ' . Text::_('HELIX_ULTIMATE_UPLOAD_IMAGES') . '</a>'; $output .= '<input type="hidden" name="' . $this->name . '" data-name="' . $this->element['name'] . '_images" id="' . $this->id . '" value="' . htmlspecialchars($this->value ?? "", ENT_COMPAT, 'UTF-8') . '" class="form-field-hu-gallery">'; $output .= '</div>'; return $output; } } PKBA#]S&��0system/helixultimate/fields/helixmenubuilder.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Builders\MenuBuilder; use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\Form\FormField; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; /** * Form field for Helix mega menu * * @since 2.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixMenuBuilder extends FormField { /** * Field type * * @var string $type * @since 2.0.0 */ protected $type = "HelixMenuBuilder"; /** * Override getInput function form FormField * * @return string Field HTML string * @since 2.0.0 */ public function getInput() { $data = Helper::loadTemplateData(); $params = $data->params; if (empty($this->value)) { $this->value = new \stdClass; $value = json_encode($this->value); } else { if (!\is_string($this->value)) { $value = json_encode($this->value); } else { $value = $this->value; } } $html = []; $html[] = '<div id="hu-menu-builder">'; $html[] = '<div id="hu-menu-builder-container"></div>'; $html[] = '<button class="hu-btn hu-btn-primary hu-add-menu-item">Add New Item</button>'; $html[] = '</div>'; return implode("\n", $html); } } PKBA#]&B�__+system/helixultimate/fields/helixlayout.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Form\FormField; use Joomla\CMS\Filesystem\File; use HelixUltimate\Framework\Platform\Helper; /** * Form field for Helix layout * * @since 1.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixlayout extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixlayout'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ public function getInput() { $input = Factory::getApplication()->input; $style_id = $input->get('id', 0, 'INT'); $style = Helper::getTemplateStyle($style_id); $helix_layout_path = JPATH_SITE . '/plugins/system/helixultimate/layout/'; $json = json_decode($this->value ?? ""); if (!empty($json)) { $rows = $json; } else { // $layout_file = File::read(JPATH_SITE . '/templates/' . $style->template . '/options.json'); $layout_file = file_get_contents(JPATH_SITE . '/templates/' . $style->template . '/options.json'); $value = json_decode($layout_file ?? ""); $rows = json_decode($value->layout ?? ""); } $html = $this->generateLayout($helix_layout_path, $rows); $html .= '<input type="hidden" id="' . $this->id . '" name="' . $this->name . '">'; return $html; } /** * Generate Layout. * * @param string $path Layout path * @param object $layout_data The layout data. * * @return string Layout HTML string. * @since 1.0.0 */ private function generateLayout($path, $layout_data = null) { $GLOBALS['tpl_layout_data'] = $layout_data; ob_start(); include_once $path . 'generated.php'; $items = ob_get_contents(); ob_end_clean(); return $items; } /** * Get label for the field. * * @return boolean * @since 1.0.0 */ public function getLabel() { return false; } } PKBA#]e��r��.system/helixultimate/fields/helixpositions.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; use HelixUltimate\Framework\Platform\Helper; /** * Form field for Helix positions * * @since 1.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixpositions extends FormField { /** * Field type * * @var string $type * @since 1.0.0 */ protected $type = 'Helixpositions'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 1.0.0 */ protected function getInput() { $html = array(); $attr = ''; $input = Factory::getApplication()->input; $style_id = $input->get('id', 0, 'INT'); $style = Helper::getTemplateStyle($style_id); $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName('position')); $query->from($db->quoteName('#__modules')); $query->where($db->quoteName('client_id') . ' = 0'); $query->where($db->quoteName('published') . ' = 1'); $query->group('position'); $query->order('position ASC'); $db->setQuery($query); $dbpositions = $db->loadObjectList(); $templateXML = JPATH_SITE . '/templates/' . $style->template . '/templateDetails.xml'; $template = simplexml_load_file($templateXML); $options = array(); foreach ($dbpositions as $positions) { $options[] = $positions->position; } foreach ($template->positions[0] as $position) { $options[] = (string) $position; } ksort($options); $opts = array_unique($options); $options = array(); foreach ($opts as $opt) { $options[$opt] = $opt; } $html[] = HTMLHelper::_('select.genericlist', $options, $this->name, trim($attr), 'value', 'text', $this->value, $this->id); return implode($html); } } PKBA#]@�q���.system/helixultimate/fields/helixdimension.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; defined('_JEXEC') or die(); /** * Form field for Helix dimension. * * @since 2.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixdimension extends FormField { /** * Field type * * @var string $type * @since 2.0.0 */ protected $type = 'Helixdimension'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 2.0.0 */ public function getInput() { $unit = $this->getAttribute('unit', 'px'); list($width, $height) = explode('x', strtolower($this->value)); // Output $output = ''; $output .= '<div class="row">'; $output .= '<div class="col-6">'; $output .= '<div class="hu-d-flex hu-align-items-center">'; $output .= '<span class="hu-mr-1">W</span>'; $output .= '<div class="hu-input-group">'; $output .= '<input type="text" class="hu-field-dimension-width form-control" value="' . $width . '" /><span class="hu-input-group-text">' . $unit . '</span>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '<div class="col-6">'; $output .= '<div class="hu-d-flex hu-align-items-center">'; $output .= '<span class="hu-mr-1">H</span>'; $output .= '<div class="hu-input-group">'; $output .= '<input type="text" class="hu-field-dimension-height form-control" value="' . $height . '" /><span class="hu-input-group-text">' . $unit . '</span>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '<input type="hidden" name="' . $this->name . '" id="' . $this->id . '" class="hu-field-dimension-input ' . $this->class . '" value="' . $this->value . '" />'; return $output; } } PKBA#]@9�ț�,system/helixultimate/fields/helixdevices.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; /** * Form field for helixButton * * @since 2.0.0 * @deprecated 3.0 Use the Same Class from the src/fields instead. */ class JFormFieldHelixDevices extends FormField { /** * Field type * * @var string $type * @since 2.0.0 */ protected $type = 'HelixDevices'; /** * Override getInput function form FormField * * @return string Field HTML string * @since 2.0.0 */ protected function getInput() { $default = isset($this->element['default']) ? $this->element['default'] : 'lg'; $value = empty($this->value) ? $default : $this->value; $output = '<div class="helix-field">'; $output .= ' <div class="helix-devices">'; $output .= ' <button class="device-btn ' . ($value === 'xs' ? 'active' : '') . '" data-device="xs" title="Mobile">'; $output .= ' <svg width="14" height="14" viewBox="0 0 11 19" fill="none" xmlns="http://www.w3.org/2000/svg">'; $output .= ' <path d="M6.58001 15.2C6.58001 15.54 6.32001 15.8 5.98001 15.8H4.43999C4.09999 15.8 3.83999 15.54 3.83999 15.2C3.83999 14.86 4.09999 14.6 4.43999 14.6H5.98001C6.30001 14.6 6.58001 14.86 6.58001 15.2ZM10.4 16.88C10.4 17.72 9.72001 18.4 8.88001 18.4H1.52C0.679995 18.4 0 17.72 0 16.88V1.52002C0 0.68002 0.679995 0 1.52 0H8.88001C9.72001 0 10.4 0.68002 10.4 1.52002V16.88ZM1.6 1.6V12.2H8.8V1.6H1.6ZM8.8 16.8V13.4H1.6V16.8H8.8Z" fill="#999"/>'; $output .= ' </svg>'; $output .= ' </button>'; $output .= ' <button class="device-btn ' . ($value === 'sm' ? 'active' : '') . '" data-device="sm" title="Tablet">'; $output .= ' <svg width="14" height="14" viewBox="0 0 16 19" fill="none" xmlns="http://www.w3.org/2000/svg">'; $output .= ' <path d="M9.31998 15.4C9.31998 15.74 9.05998 16 8.71998 16H7.67999C7.33999 16 7.07999 15.74 7.07999 15.4C7.07999 15.06 7.33999 14.8 7.67999 14.8H8.71998C9.05998 14.8 9.31998 15.06 9.31998 15.4ZM15.6 16.88C15.6 17.72 14.92 18.4 14.08 18.4H2.31998C1.47998 18.4 0.799988 17.72 0.799988 16.88V1.52002C0.799988 0.68002 1.47998 0 2.31998 0H14.08C14.92 0 15.6 0.68002 15.6 1.52002V16.88ZM2.39999 1.6V12.6H14V1.6H2.39999ZM14 16.8V13.8H2.39999V16.8H14Z" fill="#999"/>'; $output .= ' </svg>'; $output .= ' </button>'; $output .= ' <button class="device-btn ' . ($value === 'md' ? 'active' : '') . '" data-device="md" title="Desktop">'; $output .= ' <svg width="14" height="14" viewBox="0 0 22 19" fill="none" xmlns="http://www.w3.org/2000/svg">'; $output .= ' <path d="M19.477 0.200012H1.7539C0.784671 0.200012 6.10352e-05 0.98465 6.10352e-05 1.95388V12.1769C6.10352e-05 13.1461 0.784671 14.0462 1.7539 14.0462H7.61545V14.9923L5.8616 16.4C5.5616 16.6538 5.42314 17.1385 5.53852 17.5077C5.67698 17.8769 6.02315 18.2 6.41546 18.2H14.7231C15.1155 18.2 15.4847 17.8769 15.6231 17.5077C15.7616 17.1385 15.6462 16.6769 15.3462 16.4231L13.6154 14.9923V14.0462H19.477C20.4462 14.0462 21.2308 13.1461 21.2308 12.1769V1.95388C21.2308 0.98465 20.4462 0.200012 19.477 0.200012ZM12.277 16.0769L12.8308 16.5846H8.30775L8.90775 16.0538C9.09236 15.8923 9.23083 15.6154 9.23083 15.3615V14.0231H12.0001V15.3615C12.0001 15.6154 12.0924 15.9154 12.277 16.0769ZM19.3847 12.2H1.84621V2.04617H19.3847V12.2Z" fill="#999"/>'; $output .= ' </svg>'; $output .= ' </button>'; $output .= ' </div>'; $output .= '<input type="hidden" data-type="hu-devices" name="' . $this->name . '" id="' . $this->id . '" value="' . $value . '" />'; // End of helix field div. $output .= '</div>'; return $output; } /** * Override the getLabel function. * * @return boolean * @since 2.0.0 */ protected function getLabel() { return false; } } PKBA#]"�J��7system/helixultimate/vendor/composer/platform_check.phpnu�[���<?php // platform_check.php @generated by Composer $issues = array(); if (!(PHP_VERSION_ID >= 80200)) { $issues[] = 'Your Composer dependencies require a PHP version ">= 8.2.0". You are running ' . PHP_VERSION . '.'; } if ($issues) { if (!headers_sent()) { header('HTTP/1.1 500 Internal Server Error'); } if (!ini_get('display_errors')) { if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); } elseif (!headers_sent()) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } throw new \RuntimeException( 'Composer detected issues in your platform: ' . implode(' ', $issues) ); } PKBA#]L����:system/helixultimate/vendor/composer/autoload_classmap.phpnu�[���<?php // autoload_classmap.php @generated by Composer $vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', ); PKBA#]<nw�C�C:system/helixultimate/vendor/composer/InstalledVersions.phpnu�[���<?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Autoload\ClassLoader; use Composer\Semver\VersionParser; /** * This class is copied in every Composer installed project and available to all * * See also https://getcomposer.org/doc/07-runtime.md#installed-versions * * To require its presence, you can require `composer-runtime-api ^2.0` * * @final */ class InstalledVersions { /** * @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to * @internal */ private static $selfDir = null; /** * @var mixed[]|null * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null */ private static $installed; /** * @var bool */ private static $installedIsLocalDir; /** * @var bool|null */ private static $canGetVendors; /** * @var array[] * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> */ private static $installedByVendor = array(); /** * Returns a list of all package names which are present, either by being installed, replaced or provided * * @return string[] * @psalm-return list<string> */ public static function getInstalledPackages() { $packages = array(); foreach (self::getInstalled() as $installed) { $packages[] = array_keys($installed['versions']); } if (1 === \count($packages)) { return $packages[0]; } return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); } /** * Returns a list of all package names with a specific type e.g. 'library' * * @param string $type * @return string[] * @psalm-return list<string> */ public static function getInstalledPackagesByType($type) { $packagesByType = array(); foreach (self::getInstalled() as $installed) { foreach ($installed['versions'] as $name => $package) { if (isset($package['type']) && $package['type'] === $type) { $packagesByType[] = $name; } } } return $packagesByType; } /** * Checks whether the given package is installed * * This also returns true if the package name is provided or replaced by another package * * @param string $packageName * @param bool $includeDevRequirements * @return bool */ public static function isInstalled($packageName, $includeDevRequirements = true) { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; } } return false; } /** * Checks whether the given package satisfies a version constraint * * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: * * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') * * @param VersionParser $parser Install composer/semver to have access to this class and functionality * @param string $packageName * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package * @return bool */ public static function satisfies(VersionParser $parser, $packageName, $constraint) { $constraint = $parser->parseConstraints((string) $constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); } /** * Returns a version constraint representing all the range(s) which are installed for a given package * * It is easier to use this via isInstalled() with the $constraint argument if you need to check * whether a given version of a package is installed, and not just whether it exists * * @param string $packageName * @return string Version constraint usable with composer/semver */ public static function getVersionRanges($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } $ranges = array(); if (isset($installed['versions'][$packageName]['pretty_version'])) { $ranges[] = $installed['versions'][$packageName]['pretty_version']; } if (array_key_exists('aliases', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); } if (array_key_exists('replaced', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); } if (array_key_exists('provided', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); } return implode(' || ', $ranges); } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['version'])) { return null; } return $installed['versions'][$packageName]['version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getPrettyVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['pretty_version'])) { return null; } return $installed['versions'][$packageName]['pretty_version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference */ public static function getReference($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['reference'])) { return null; } return $installed['versions'][$packageName]['reference']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. */ public static function getInstallPath($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @return array * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} */ public static function getRootPackage() { $installed = self::getInstalled(); return $installed[0]['root']; } /** * Returns the raw installed.php data for custom implementations * * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. * @return array[] * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} */ public static function getRawData() { @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { self::$installed = include __DIR__ . '/installed.php'; } else { self::$installed = array(); } } return self::$installed; } /** * Returns the raw data of all installed.php which are currently loaded for custom implementations * * @return array[] * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> */ public static function getAllRawData() { return self::getInstalled(); } /** * Lets you reload the static array from another file * * This is only useful for complex integrations in which a project needs to use * this class but then also needs to execute another project's autoloader in process, * and wants to ensure both projects have access to their version of installed.php. * * A typical case would be PHPUnit, where it would need to make sure it reads all * the data it needs from this class, then call reload() with * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure * the project in which it runs can then also use this class safely, without * interference between PHPUnit's dependencies and the project's dependencies. * * @param array[] $data A vendor/composer/installed.php data set * @return void * * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data */ public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); // when using reload, we disable the duplicate protection to ensure that self::$installed data is // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, // so we have to assume it does not, and that may result in duplicate data being returned when listing // all installed packages for example self::$installedIsLocalDir = false; } /** * @return string */ private static function getSelfDir() { if (self::$selfDir === null) { self::$selfDir = strtr(__DIR__, '\\', '/'); } return self::$selfDir; } /** * @return array[] * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> */ private static function getInstalled() { if (null === self::$canGetVendors) { self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); $copiedLocalDir = false; if (self::$canGetVendors) { $selfDir = self::getSelfDir(); foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { $vendorDir = strtr($vendorDir, '\\', '/'); if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */ $required = require $vendorDir.'/composer/installed.php'; self::$installedByVendor[$vendorDir] = $required; $installed[] = $required; if (self::$installed === null && $vendorDir.'/composer' === $selfDir) { self::$installed = $required; self::$installedIsLocalDir = true; } } if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) { $copiedLocalDir = true; } } } if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */ $required = require __DIR__ . '/installed.php'; self::$installed = $required; } else { self::$installed = array(); } } if (self::$installed !== array() && !$copiedLocalDir) { $installed[] = self::$installed; } return $installed; } } PKBA#]F�u�II7system/helixultimate/vendor/composer/autoload_files.phpnu�[���<?php // autoload_files.php @generated by Composer $vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', ); PKBA#]������8system/helixultimate/vendor/composer/autoload_static.phpnu�[���<?php // autoload_static.php @generated by Composer namespace Composer\Autoload; class ComposerStaticInitc22f79d1e33808587d06b3aaf2e312df { public static $files = array ( '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', ); public static $prefixLengthsPsr4 = array ( 'S' => array ( 'Symfony\\Polyfill\\Mbstring\\' => 26, 'Symfony\\Polyfill\\Ctype\\' => 23, 'Symfony\\Component\\Filesystem\\' => 29, 'SourceSpan\\' => 11, 'ScssPhp\\ScssPhp\\' => 16, ), 'P' => array ( 'Psr\\Http\\Message\\' => 17, ), 'L' => array ( 'League\\Uri\\' => 11, ), 'H' => array ( 'HelixUltimate\\Framework\\' => 24, ), ); public static $prefixDirsPsr4 = array ( 'Symfony\\Polyfill\\Mbstring\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', ), 'Symfony\\Polyfill\\Ctype\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', ), 'Symfony\\Component\\Filesystem\\' => array ( 0 => __DIR__ . '/..' . '/symfony/filesystem', ), 'SourceSpan\\' => array ( 0 => __DIR__ . '/..' . '/scssphp/source-span/src', ), 'ScssPhp\\ScssPhp\\' => array ( 0 => __DIR__ . '/..' . '/scssphp/scssphp/src', ), 'Psr\\Http\\Message\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-factory/src', 1 => __DIR__ . '/..' . '/psr/http-message/src', ), 'League\\Uri\\' => array ( 0 => __DIR__ . '/..' . '/league/uri', 1 => __DIR__ . '/..' . '/league/uri-interfaces', ), 'HelixUltimate\\Framework\\' => array ( 0 => __DIR__ . '/../..' . '/src', ), ); public static $prefixesPsr0 = array ( 'J' => array ( 'JShrink' => array ( 0 => __DIR__ . '/..' . '/tedivm/jshrink/src', ), ), ); public static $classMap = array ( 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInitc22f79d1e33808587d06b3aaf2e312df::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInitc22f79d1e33808587d06b3aaf2e312df::$prefixDirsPsr4; $loader->prefixesPsr0 = ComposerStaticInitc22f79d1e33808587d06b3aaf2e312df::$prefixesPsr0; $loader->classMap = ComposerStaticInitc22f79d1e33808587d06b3aaf2e312df::$classMap; }, null, ClassLoader::class); } } PKBA#]�s�bqkqk3system/helixultimate/vendor/composer/installed.jsonnu�[���{ "packages": [ { "name": "league/uri", "version": "7.8.1", "version_normalized": "7.8.1.0", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", "shasum": "" }, "require": { "league/uri-interfaces": "^7.8.1", "php": "^8.1", "psr/http-factory": "^1" }, "conflict": { "league/uri-schemes": "^1.0" }, "suggest": { "ext-bcmath": "to improve IPV4 host parsing", "ext-dom": "to convert the URI into an HTML anchor tag", "ext-fileinfo": "to create Data URI from file contennts", "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", "ext-uri": "to use the PHP native URI class", "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", "league/uri-components": "to provide additional tools to manipulate URI objects components", "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", "php-64bit": "to improve IPV4 host parsing", "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "time": "2026-03-15T20:22:25+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "7.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "League\\Uri\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Ignace Nyamagana Butera", "email": "nyamsprod@gmail.com", "homepage": "https://nyamsprod.com" } ], "description": "URI manipulation library", "homepage": "https://uri.thephpleague.com", "keywords": [ "URN", "data-uri", "file-uri", "ftp", "hostname", "http", "https", "middleware", "parse_str", "parse_url", "psr-7", "query-string", "querystring", "rfc2141", "rfc3986", "rfc3987", "rfc6570", "rfc8141", "uri", "uri-template", "url", "ws" ], "support": { "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", "source": "https://github.com/thephpleague/uri/tree/7.8.1" }, "funding": [ { "url": "https://github.com/sponsors/nyamsprod", "type": "github" } ], "install-path": "../league/uri" }, { "name": "league/uri-interfaces", "version": "7.8.1", "version_normalized": "7.8.1.0", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-interfaces.git", "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", "shasum": "" }, "require": { "ext-filter": "*", "php": "^8.1", "psr/http-message": "^1.1 || ^2.0" }, "suggest": { "ext-bcmath": "to improve IPV4 host parsing", "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", "php-64bit": "to improve IPV4 host parsing", "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "time": "2026-03-08T20:05:35+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "7.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "League\\Uri\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Ignace Nyamagana Butera", "email": "nyamsprod@gmail.com", "homepage": "https://nyamsprod.com" } ], "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", "homepage": "https://uri.thephpleague.com", "keywords": [ "data-uri", "file-uri", "ftp", "hostname", "http", "https", "parse_str", "parse_url", "psr-7", "query-string", "querystring", "rfc3986", "rfc3987", "rfc6570", "uri", "url", "ws" ], "support": { "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" }, "funding": [ { "url": "https://github.com/sponsors/nyamsprod", "type": "github" } ], "install-path": "../league/uri-interfaces" }, { "name": "psr/http-factory", "version": "1.1.0", "version_normalized": "1.1.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "time": "2024-04-15T12:06:14+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", "message", "psr", "psr-17", "psr-7", "request", "response" ], "support": { "source": "https://github.com/php-fig/http-factory" }, "install-path": "../psr/http-factory" }, { "name": "psr/http-message", "version": "2.0", "version_normalized": "2.0.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "time": "2023-04-04T09:54:51+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", "homepage": "https://github.com/php-fig/http-message", "keywords": [ "http", "http-message", "psr", "psr-7", "request", "response" ], "support": { "source": "https://github.com/php-fig/http-message/tree/2.0" }, "install-path": "../psr/http-message" }, { "name": "scssphp/scssphp", "version": "v2.1.0", "version_normalized": "2.1.0.0", "source": { "type": "git", "url": "https://github.com/scssphp/scssphp.git", "reference": "d8450c2baf5fb07d00374999d0ea51276974d1b6" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/scssphp/scssphp/zipball/d8450c2baf5fb07d00374999d0ea51276974d1b6", "reference": "d8450c2baf5fb07d00374999d0ea51276974d1b6", "shasum": "" }, "require": { "ext-ctype": "*", "ext-json": "*", "ext-mbstring": "*", "league/uri": "^7.6", "league/uri-interfaces": "^7.6", "php": ">=8.1", "scssphp/source-span": "^1.1", "symfony/filesystem": "^5.4 || ^6.0 || ^7.0 || ^8.0" }, "require-dev": { "jgthms/bulma": "~0.9.4", "jiripudil/phpstan-sealed-classes": "^1.3", "phpstan/phpstan": "^2.1.31", "phpstan/phpstan-deprecation-rules": "^2.0", "phpunit/phpunit": "^9.5.6", "sass/sass-spec": "*", "squizlabs/php_codesniffer": "^3.13", "symfony/phpunit-bridge": "^7.3 || ^8.0", "symfony/polyfill-php84": "^1.33", "symfony/var-dumper": "^6.4 || ^7.3 || ^8.0", "thoughtbot/bourbon": "^7.0", "twbs/bootstrap": "^5.3", "twbs/bootstrap4": "4.6.1", "zurb/foundation": "~6.7.0" }, "time": "2025-11-21T17:27:59+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "ScssPhp\\ScssPhp\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Anthon Pang", "email": "apang@softwaredevelopment.ca", "homepage": "https://github.com/robocoder" }, { "name": "Cédric Morin", "email": "cedric@yterium.com", "homepage": "https://github.com/Cerdic" } ], "description": "scssphp is a compiler for SCSS written in PHP.", "homepage": "https://scssphp.github.io/scssphp/", "keywords": [ "css", "less", "sass", "scss", "stylesheet" ], "support": { "issues": "https://github.com/scssphp/scssphp/issues", "source": "https://github.com/scssphp/scssphp/tree/v2.1.0" }, "install-path": "../scssphp/scssphp" }, { "name": "scssphp/source-span", "version": "v1.1.0", "version_normalized": "1.1.0.0", "source": { "type": "git", "url": "https://github.com/scssphp/source-span.git", "reference": "37d653206daf11da1ee60b333984101bc4c27ba2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/scssphp/source-span/zipball/37d653206daf11da1ee60b333984101bc4c27ba2", "reference": "37d653206daf11da1ee60b333984101bc4c27ba2", "shasum": "" }, "require": { "ext-mbstring": "*", "league/uri": "^7.6", "league/uri-interfaces": "^7.6", "php": ">=8.1" }, "require-dev": { "phpstan/phpstan": "^2.0", "phpstan/phpstan-deprecation-rules": "^2.0", "phpunit/phpunit": "^9.5.6", "squizlabs/php_codesniffer": "~3.5", "symfony/phpunit-bridge": "^6.4 || ^7.3 || ^8.0", "symfony/var-dumper": "^6.4 || ^7.3 || ^8.0" }, "time": "2025-11-21T16:28:19+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "1.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "SourceSpan\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Christophe Coevoet", "homepage": "https://github.com/stof" } ], "description": "Provides a representation for source code locations and spans.", "keywords": [ "parsing" ], "support": { "issues": "https://github.com/scssphp/source-span/issues", "source": "https://github.com/scssphp/source-span/tree/v1.1.0" }, "install-path": "../scssphp/source-span" }, { "name": "symfony/filesystem", "version": "v7.4.11", "version_normalized": "7.4.11.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", "reference": "d721ea61b4a5fba8c5b6e7c1feda19efea144b50" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/filesystem/zipball/d721ea61b4a5fba8c5b6e7c1feda19efea144b50", "reference": "d721ea61b4a5fba8c5b6e7c1feda19efea144b50", "shasum": "" }, "require": { "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { "symfony/process": "^6.4|^7.0|^8.0" }, "time": "2026-05-11T16:38:44+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "Symfony\\Component\\Filesystem\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/filesystem/tree/v7.4.11" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/filesystem" }, { "name": "symfony/polyfill-ctype", "version": "v1.37.0", "version_normalized": "1.37.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { "php": ">=7.2" }, "provide": { "ext-ctype": "*" }, "suggest": { "ext-ctype": "For best performance" }, "time": "2026-04-10T16:19:22+00:00", "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "installation-source": "dist", "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Gert de Pagter", "email": "BackEndTea@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for ctype functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "ctype", "polyfill", "portable" ], "support": { "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/polyfill-ctype" }, { "name": "symfony/polyfill-mbstring", "version": "v1.38.2", "version_normalized": "1.38.2.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", "shasum": "" }, "require": { "ext-iconv": "*", "php": ">=7.2" }, "provide": { "ext-mbstring": "*" }, "suggest": { "ext-mbstring": "For best performance" }, "time": "2026-05-27T06:59:30+00:00", "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "installation-source": "dist", "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", "mbstring", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://github.com/nicolas-grekas", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/polyfill-mbstring" }, { "name": "tedivm/jshrink", "version": "v1.8.1", "version_normalized": "1.8.1.0", "source": { "type": "git", "url": "https://github.com/tedious/JShrink.git", "reference": "f76454d4c48ddae6354a2f0eeb16633d4e755c9a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/tedious/JShrink/zipball/f76454d4c48ddae6354a2f0eeb16633d4e755c9a", "reference": "f76454d4c48ddae6354a2f0eeb16633d4e755c9a", "shasum": "" }, "require": { "php": "^7.0|^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.14", "php-coveralls/php-coveralls": "^2.5.0", "phpunit/phpunit": "^9|^10" }, "time": "2025-11-20T14:34:30+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-0": { "JShrink": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Robert Hafner", "email": "tedivm@tedivm.com" } ], "description": "Javascript Minifier built in PHP", "homepage": "http://github.com/tedious/JShrink", "keywords": [ "javascript", "minifier" ], "support": { "issues": "https://github.com/tedious/JShrink/issues", "source": "https://github.com/tedious/JShrink/tree/v1.8.1" }, "funding": [ { "url": "https://github.com/tedivm", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/tedivm/jshrink", "type": "tidelift" } ], "install-path": "../tedivm/jshrink" } ], "dev": true, "dev-package-names": [] } PKBA#]iښ���2system/helixultimate/vendor/composer/installed.phpnu�[���<?php return array( 'root' => array( 'name' => 'joomshaper/helixultimate', 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'reference' => '6138e7ba103d34fa78a0a0f170e0a456d31c3d85', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => true, ), 'versions' => array( 'joomshaper/helixultimate' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'reference' => '6138e7ba103d34fa78a0a0f170e0a456d31c3d85', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => false, ), 'league/uri' => array( 'pretty_version' => '7.8.1', 'version' => '7.8.1.0', 'reference' => '08cf38e3924d4f56238125547b5720496fac8fd4', 'type' => 'library', 'install_path' => __DIR__ . '/../league/uri', 'aliases' => array(), 'dev_requirement' => false, ), 'league/uri-interfaces' => array( 'pretty_version' => '7.8.1', 'version' => '7.8.1.0', 'reference' => '85d5c77c5d6d3af6c54db4a78246364908f3c928', 'type' => 'library', 'install_path' => __DIR__ . '/../league/uri-interfaces', 'aliases' => array(), 'dev_requirement' => false, ), 'psr/http-factory' => array( 'pretty_version' => '1.1.0', 'version' => '1.1.0.0', 'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-factory', 'aliases' => array(), 'dev_requirement' => false, ), 'psr/http-message' => array( 'pretty_version' => '2.0', 'version' => '2.0.0.0', 'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-message', 'aliases' => array(), 'dev_requirement' => false, ), 'scssphp/scssphp' => array( 'pretty_version' => 'v2.1.0', 'version' => '2.1.0.0', 'reference' => 'd8450c2baf5fb07d00374999d0ea51276974d1b6', 'type' => 'library', 'install_path' => __DIR__ . '/../scssphp/scssphp', 'aliases' => array(), 'dev_requirement' => false, ), 'scssphp/source-span' => array( 'pretty_version' => 'v1.1.0', 'version' => '1.1.0.0', 'reference' => '37d653206daf11da1ee60b333984101bc4c27ba2', 'type' => 'library', 'install_path' => __DIR__ . '/../scssphp/source-span', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/filesystem' => array( 'pretty_version' => 'v7.4.11', 'version' => '7.4.11.0', 'reference' => 'd721ea61b4a5fba8c5b6e7c1feda19efea144b50', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/filesystem', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-ctype' => array( 'pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => '141046a8f9477948ff284fa65be2095baafb94f2', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-mbstring' => array( 'pretty_version' => 'v1.38.2', 'version' => '1.38.2.0', 'reference' => 'd3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => false, ), 'tedivm/jshrink' => array( 'pretty_version' => 'v1.8.1', 'version' => '1.8.1.0', 'reference' => 'f76454d4c48ddae6354a2f0eeb16633d4e755c9a', 'type' => 'library', 'install_path' => __DIR__ . '/../tedivm/jshrink', 'aliases' => array(), 'dev_requirement' => false, ), ), ); PKBA#] �R$$6system/helixultimate/vendor/composer/autoload_psr4.phpnu�[���<?php // autoload_psr4.php @generated by Composer $vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), 'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'), 'SourceSpan\\' => array($vendorDir . '/scssphp/source-span/src'), 'ScssPhp\\ScssPhp\\' => array($vendorDir . '/scssphp/scssphp/src'), 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'), 'League\\Uri\\' => array($vendorDir . '/league/uri', $vendorDir . '/league/uri-interfaces'), 'HelixUltimate\\Framework\\' => array($baseDir . '/src'), ); PKBA#]D����<system/helixultimate/vendor/composer/autoload_namespaces.phpnu�[���<?php // autoload_namespaces.php @generated by Composer $vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( 'JShrink' => array($vendorDir . '/tedivm/jshrink/src'), ); PKBA#]2@u�?�?4system/helixultimate/vendor/composer/ClassLoader.phpnu�[���<?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier <fabien@symfony.com> * @author Jordi Boggiano <j.boggiano@seld.be> * @see https://www.php-fig.org/psr/psr-0/ * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { /** @var \Closure(string):void */ private static $includeFile; /** @var string|null */ private $vendorDir; // PSR-4 /** * @var array<string, array<string, int>> */ private $prefixLengthsPsr4 = array(); /** * @var array<string, list<string>> */ private $prefixDirsPsr4 = array(); /** * @var list<string> */ private $fallbackDirsPsr4 = array(); // PSR-0 /** * List of PSR-0 prefixes * * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) * * @var array<string, array<string, list<string>>> */ private $prefixesPsr0 = array(); /** * @var list<string> */ private $fallbackDirsPsr0 = array(); /** @var bool */ private $useIncludePath = false; /** * @var array<string, string> */ private $classMap = array(); /** @var bool */ private $classMapAuthoritative = false; /** * @var array<string, bool> */ private $missingClasses = array(); /** @var string|null */ private $apcuPrefix; /** * @var array<string, self> */ private static $registeredLoaders = array(); /** * @param string|null $vendorDir */ public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; self::initializeIncludeClosure(); } /** * @return array<string, list<string>> */ public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); } /** * @return array<string, list<string>> */ public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } /** * @return list<string> */ public function getFallbackDirs() { return $this->fallbackDirsPsr0; } /** * @return list<string> */ public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } /** * @return array<string, string> Array of classname => path */ public function getClassMap() { return $this->classMap; } /** * @param array<string, string> $classMap Class to filename map * * @return void */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param list<string>|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories * * @return void */ public function add($prefix, $paths, $prepend = false) { $paths = (array) $paths; if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, $paths ); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], $paths ); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param list<string>|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException * * @return void */ public function addPsr4($prefix, $paths, $prepend = false) { $paths = (array) $paths; if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], $paths ); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param list<string>|string $paths The PSR-0 base directories * * @return void */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param list<string>|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException * * @return void */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath * * @return void */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative * * @return void */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix * * @return void */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not * * @return void */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); if (null === $this->vendorDir) { return; } if ($prepend) { self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; } else { unset(self::$registeredLoaders[$this->vendorDir]); self::$registeredLoaders[$this->vendorDir] = $this; } } /** * Unregisters this instance as an autoloader. * * @return void */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); if (null !== $this->vendorDir) { unset(self::$registeredLoaders[$this->vendorDir]); } } /** * Loads the given class or interface. * * @param string $class The name of the class * @return true|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { $includeFile = self::$includeFile; $includeFile($file); return true; } return null; } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; } /** * Returns the currently registered loaders keyed by their corresponding vendor directories. * * @return array<string, self> */ public static function getRegisteredLoaders() { return self::$registeredLoaders; } /** * @param string $class * @param string $ext * @return string|false */ private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } /** * @return void */ private static function initializeIncludeClosure() { if (self::$includeFile !== null) { return; } /** * Scope isolated include. * * Prevents access to $this/self from included files. * * @param string $file * @return void */ self::$includeFile = \Closure::bind(static function($file) { include $file; }, null, null); } } PKBA#]�e6<��6system/helixultimate/vendor/composer/autoload_real.phpnu�[���<?php // autoload_real.php @generated by Composer class ComposerAutoloaderInitc22f79d1e33808587d06b3aaf2e312df { private static $loader; public static function loadClassLoader($class) { if ('Composer\Autoload\ClassLoader' === $class) { require __DIR__ . '/ClassLoader.php'; } } /** * @return \Composer\Autoload\ClassLoader */ public static function getLoader() { if (null !== self::$loader) { return self::$loader; } require __DIR__ . '/platform_check.php'; spl_autoload_register(array('ComposerAutoloaderInitc22f79d1e33808587d06b3aaf2e312df', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); spl_autoload_unregister(array('ComposerAutoloaderInitc22f79d1e33808587d06b3aaf2e312df', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInitc22f79d1e33808587d06b3aaf2e312df::getInitializer($loader)); $loader->register(true); $filesToLoad = \Composer\Autoload\ComposerStaticInitc22f79d1e33808587d06b3aaf2e312df::$files; $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; require $file; } }, null, null); foreach ($filesToLoad as $fileIdentifier => $file) { $requireFile($fileIdentifier, $file); } return $loader; } } PKBA#]h��MM=system/helixultimate/vendor/scssphp/source-span/composer.jsonnu�[���{ "name": "scssphp/source-span", "type": "library", "description": "Provides a representation for source code locations and spans.", "keywords": ["parsing"], "license": [ "MIT" ], "authors": [ { "name": "Christophe Coevoet", "homepage": "https://github.com/stof" } ], "autoload": { "psr-4": { "SourceSpan\\": "src/" } }, "autoload-dev": { "psr-4": { "SourceSpan\\Tests\\": "tests/" } }, "require": { "php": ">=8.1", "ext-mbstring": "*", "league/uri": "^7.6", "league/uri-interfaces": "^7.6" }, "require-dev": { "phpstan/phpstan": "^2.0", "phpstan/phpstan-deprecation-rules": "^2.0", "phpunit/phpunit": "^9.5.6", "squizlabs/php_codesniffer": "~3.5", "symfony/phpunit-bridge": "^6.4 || ^7.3 || ^8.0", "symfony/var-dumper": "^6.4 || ^7.3 || ^8.0" }, "extra": { "branch-alias": { "dev-main": "1.x-dev" } }, "config": { "sort-packages": true } } PKBA#]C�)��Msystem/helixultimate/vendor/scssphp/source-span/src/SourceSpanWithContext.phpnu�[���<?php namespace SourceSpan; /** * An interface that describes a segment of source text with additional context. */ interface SourceSpanWithContext extends SourceSpan { /** * Text around the span, which includes the line containing this span. */ public function getContext(): string; public function subspan(int $start, ?int $end = null): SourceSpanWithContext; } PKBA#]�1���Lsystem/helixultimate/vendor/scssphp/source-span/src/SimpleSourceLocation.phpnu�[���<?php namespace SourceSpan; use League\Uri\Contracts\UriInterface; final class SimpleSourceLocation extends SourceLocationMixin { private readonly int $line; private readonly int $column; /** * Creates a new location indicating $offset within $sourceUrl. * * $line and $column default to assuming the source is a single ASCII line. This * means that $line defaults to 0 and $column defaults to $offset. */ public function __construct( private readonly int $offset, private readonly ?UriInterface $sourceUrl = null, ?int $line = null, ?int $column = null, ) { $this->line = $line ?? 0; $this->column = $column ?? $offset; if ($offset < 0) { throw new \OutOfRangeException('Offset may not be negative.'); } if ($line !== null && $line < 0) { throw new \OutOfRangeException('Line may not be negative.'); } if ($column !== null && $column < 0) { throw new \OutOfRangeException('Column may not be negative.'); } } public function getOffset(): int { return $this->offset; } public function getLine(): int { return $this->line; } public function getColumn(): int { return $this->column; } public function getSourceUrl(): ?UriInterface { return $this->sourceUrl; } } PKBA#]a ��)�)<system/helixultimate/vendor/scssphp/source-span/src/Util.phpnu�[���<?php namespace SourceSpan; use League\Uri\Contracts\UriInterface; use League\Uri\Uri; /** * @internal */ final class Util { /** * @param iterable<object> $iter */ public static function isAllTheSame(iterable $iter): bool { $previousValue = null; foreach ($iter as $value) { if ($previousValue === null) { $previousValue = $value; continue; } if (!self::isSame($value, $previousValue)) { return false; } } return true; } /** * Returns whether 2 objects are the same, considering URIs as the same by equality rather than reference. */ public static function isSame(object $object1, object $object2): bool { if ($object1 === $object2) { return true; } if ($object1 instanceof UriInterface && $object2 instanceof UriInterface) { return $object1->toString() === $object2->toString(); } return false; } /** * Returns whether $span covers multiple lines. */ public static function isMultiline(SourceSpan $span): bool { return $span->getStart()->getLine() !== $span->getEnd()->getLine(); } /** * Sets the first `null` element of $list to $element. * * @template E * @param list<E|null> $list * @param E $element */ public static function replaceFirstNull(array &$list, $element): void { $index = array_search(null, $list, true); if ($index === false) { throw new \InvalidArgumentException('The list contains no null elements.'); } // @phpstan-ignore parameterByRef.type $list[$index] = $element; \assert(array_is_list($list)); } /** * Sets the element of $list that currently contains $element to `null`. * * @template E * @param list<E|null> $list * @param E $element */ public static function replaceWithNull(array &$list, $element): void { $index = array_search($element, $list, true); if ($index === false) { throw new \InvalidArgumentException('The list contains no matching elements.'); } // @phpstan-ignore parameterByRef.type $list[$index] = null; \assert(array_is_list($list)); } /** * Finds a line in $context containing $text at the specified column. * * Returns the index in $context where that line begins, or null if none * exists. */ public static function findLineStart(string $context, string $text, int $column): ?int { // If the text is empty, we just want to find the first line that has at least // $column characters. if ($text === '') { $beginningOfLine = 0; while (true) { $index = strpos($context, "\n", $beginningOfLine); if ($index === false) { return \strlen($context) - $beginningOfLine >= $column ? $beginningOfLine : null; } if ($index - $beginningOfLine >= $column) { return $beginningOfLine; } $beginningOfLine = $index + 1; } } $index = strpos($context, $text); while ($index !== false) { // Start looking before $index in case $text starts with a newline. $lineStart = $index === 0 ? 0 : Util::lastIndexOf($context, "\n", $index - 1) + 1; $textColumn = $index - $lineStart; if ($column === $textColumn) { return $lineStart; } $index = strpos($context, $text, $index + 1); } return null; } /** * Returns a two-element list containing the start and end locations of the * span from $start bytes (inclusive) to $end bytes (exclusive) * after the beginning of $span. * * @return array{SourceLocation, SourceLocation} */ public static function subspanLocations(SourceSpan $span, int $start, ?int $end = null): array { $text = $span->getText(); $startLocation = $span->getStart(); $line = $startLocation->getLine(); $column = $startLocation->getColumn(); // Adjust $line and $column as necessary if the character at $i in $text // is a newline. $consumeCodePoint = function (int $i) use ($text, &$line, &$column) { $codeUnit = $text[$i]; if ( $codeUnit === "\n" || // A carriage return counts as a newline, but only if it's not // followed by a line feed. ($codeUnit === "\r" && ($i + 1 === \strlen($text) || $text[$i + 1] !== "\n")) ) { $line += 1; $column = 0; } else { $column += 1; } }; for ($i = 0; $i < $start; $i++) { $consumeCodePoint($i); } $newStartLocation = new SimpleSourceLocation($startLocation->getOffset() + $start, $span->getSourceUrl(), $line, $column); if ($end === null || $end === $span->getLength()) { $newEndLocation = $span->getEnd(); } elseif ($end === $start) { $newEndLocation = $newStartLocation; } else { for ($i = $start; $i < $end; $i++) { $consumeCodePoint($i); } $newEndLocation = new SimpleSourceLocation($startLocation->getOffset() + $end, $span->getSourceUrl(), $line, $column); } return [$newStartLocation, $newEndLocation]; } /** * The starting position of the last match $needle in this string. * * Finds a match of $needle by searching backward starting at $start. * Returns -1 if $needle could not be found in this string. * If $start is omitted, search starts from the end of the string. */ public static function lastIndexOf(string $string, string $needle, ?int $start = null): int { if ($start === null || $start === \strlen($string)) { $position = strrpos($string, $needle); } else { if ($start < 0) { throw new \InvalidArgumentException("Start must be a non-negative integer"); } if ($start > \strlen($string)) { throw new \InvalidArgumentException("Start must not be greater than the length of the string"); } $position = strrpos($string, $needle, $start - \strlen($string)); } return $position === false ? -1 : $position; } /** * Returns the text of the string from $start to $end (exclusive). * * If $end isn't passed, it defaults to the end of the string. */ public static function substring(string $text, int $start, ?int $end = null): string { if ($end === null) { return substr($text, $start); } if ($end < $start) { $length = 0; } else { $length = $end - $start; } return substr($text, $start, $length); } public static function isSameUrl(?UriInterface $url1, ?UriInterface $url2): bool { if ($url1 === null) { return $url2 === null; } if ($url2 === null) { return false; } return (string) $url1 === (string) $url2; } /** * Finds the first index in the list that satisfies the provided $test. * * @template E * * @param list<E> $list * @param callable(E): bool $test */ public static function indexWhere(array $list, callable $test): ?int { foreach ($list as $index => $element) { if ($test($element)) { return $index; } } return null; } /** * Check that a range represents a slice of an indexable object. * * Throws if the range is not valid for an indexable object with * the given length. * A range is valid for an indexable object with a given $length * if `0 <= $start <= $end <= $length`. * An `end` of `null` is considered equivalent to `length`. * * @throws \OutOfRangeException */ public static function checkValidRange(int $start, ?int $end, int $length, ?string $startName = null, ?string $endName = null): void { if ($start < 0 || $start > $length) { $startName ??= 'start'; $startNameDisplay = $startName ? " $startName" : ''; throw new \OutOfRangeException("Invalid value:$startNameDisplay must be between 0 and $length: $start."); } if ($end !== null) { if ($end < $start || $end > $length) { $endName ??= 'end'; $endNameDisplay = $endName ? " $endName" : ''; throw new \OutOfRangeException("Invalid value:$endNameDisplay must be between $start and $length: $end."); } } } /** * @template T * * @param list<T> $list * * @return T */ public static function listLast(array $list) { $count = count($list); if ($count === 0) { throw new \LogicException('The list may not be empty.'); } return $list[$count - 1]; } /** * Returns a pretty URI for a path */ public static function prettyUri(string|UriInterface $path): string { if ($path instanceof UriInterface) { if ($path->getScheme() !== 'file') { return (string) $path; } $path = self::pathFromUri($path); } $normalizedPath = $path; $normalizedRootDirectory = getcwd() . '/'; if (\DIRECTORY_SEPARATOR === '\\') { $normalizedRootDirectory = str_replace('\\', '/', $normalizedRootDirectory); $normalizedPath = str_replace('\\', '/', $path); } if (str_starts_with($normalizedPath, $normalizedRootDirectory)) { return substr($path, \strlen($normalizedRootDirectory)); } return $path; } private static function pathFromUri(UriInterface $uri): string { if (!$uri instanceof Uri) { $uri = Uri::new($uri); } if (\DIRECTORY_SEPARATOR === '\\') { return $uri->toWindowsPath() ?? throw new \InvalidArgumentException("Uri $uri must have scheme 'file:'."); } return $uri->toUnixPath() ?? throw new \InvalidArgumentException("Uri $uri must have scheme 'file:'."); } } PKBA#]x Bsystem/helixultimate/vendor/scssphp/source-span/src/SourceSpan.phpnu�[���<?php namespace SourceSpan; use League\Uri\Contracts\UriInterface; /** * An interface that describes a segment of source text. */ interface SourceSpan { /** * The start location of this span. */ public function getStart(): SourceLocation; /** * The end location of this span, exclusive. */ public function getEnd(): SourceLocation; /** * The source text for this span. */ public function getText(): string; /** * The URL of the source (typically a file) of this span. * * This may be null, indicating that the source URL is unknown or * unavailable. */ public function getSourceUrl(): ?UriInterface; /** * The length of this span, in bytes. */ public function getLength(): int; /** * Creates a new span that's the union of $this and $other. * * The two spans must have the same source URL and may not be disjoint. * {@see getText} is computed by combining `$this->getText()` and `$other->getText()`. */ public function union(SourceSpan $other): SourceSpan; /** * Compares two spans. * * It returns a negative integer if $this is ordered before $other, * a positive integer if $this is ordered after $other, * and zero if $this and $other are ordered together. * * $other must have the same source URL as `this`. This orders spans by * {@see getStart} then {@see getLength}. */ public function compareTo(SourceSpan $other): int; /** * Formats $message in a human-friendly way associated with this span. * * @param string $message * * @return string */ public function message(string $message): string; /** * Like {@see message}, but also highlights $secondarySpans to provide * the user with additional context. * * Each span takes a label ($label for this span, and the keys of the * $secondarySpans map for the secondary spans) that's used to indicate to * the user what that particular span represents. * * @throws \InvalidArgumentException if any secondary span has a different source URL than this span. * * @param array<string, SourceSpan> $secondarySpans */ public function messageMultiple(string $message, string $label, array $secondarySpans): string; /** * Prints the text associated with this span in a user-friendly way. * * This is identical to {@see message}, except that it doesn't print the file * name, line number, column number, or message. */ public function highlight(): string; /** * Like {@see highlight}, but also highlights $secondarySpans to provide * the user with additional context. * * Each span takes a label ($label for this span, and the keys of the * $secondarySpans map for the secondary spans) that's used to indicate to * the user what that particular span represents. * * @throws \InvalidArgumentException if any secondary span has a different source URL than this span. * * @param array<string, SourceSpan> $secondarySpans */ public function highlightMultiple(string $label, array $secondarySpans): string; /** * Return a span from $start bytes (inclusive) to $end bytes * (exclusive) after the beginning of this span */ public function subspan(int $start, ?int $end = null): SourceSpan; } PKBA#]&I)~Hsystem/helixultimate/vendor/scssphp/source-span/src/SimpleSourceSpan.phpnu�[���<?php namespace SourceSpan; final class SimpleSourceSpan extends SourceSpanMixin { public function __construct( private readonly SourceLocation $start, private readonly SourceLocation $end, private readonly string $text, ) { if (!Util::isSameUrl($start->getSourceUrl(), $end->getSourceUrl())) { throw new \InvalidArgumentException("Source URLs \"{$start->getSourceUrl()}\" and \"{$end->getSourceUrl()}\" don't match."); } if ($this->end->getOffset() < $this->start->getOffset()) { throw new \InvalidArgumentException('End must come after start.'); } $distance = $this->start->distance($this->end); if (\strlen($this->text) !== $distance) { throw new \InvalidArgumentException("Text \"$text\" must be $distance characters long."); } } public function getStart(): SourceLocation { return $this->start; } public function getEnd(): SourceLocation { return $this->end; } public function getText(): string { return $this->text; } public function subspan(int $start, ?int $end = null): SourceSpan { Util::checkValidRange($start, $end, $this->getLength()); if ($start === 0 && ($end === null || $end === $this->getLength())) { return $this; } $locations = Util::subspanLocations($this, $start, $end); return new SimpleSourceSpan($locations[0], $locations[1], Util::substring($this->text, $start, $end)); } } PKBA#]sN���Dsystem/helixultimate/vendor/scssphp/source-span/src/FileLocation.phpnu�[���<?php namespace SourceSpan; use League\Uri\Contracts\UriInterface; /** * The implementation of {@see SourceLocation} based on a {@see SourceFile}. * * @see SourceFile::location() */ final class FileLocation extends SourceLocationMixin { /** * @internal */ public function __construct( private readonly SourceFile $file, private readonly int $offset, ) { } public function getFile(): SourceFile { return $this->file; } public function getOffset(): int { return $this->offset; } public function getLine(): int { return $this->file->getLine($this->offset); } public function getColumn(): int { return $this->file->getColumn($this->offset); } public function getSourceUrl(): ?UriInterface { return $this->file->getSourceUrl(); } public function pointSpan(): FileSpan { return new ConcreteFileSpan($this->file, $this->offset, $this->offset); } } PKBA#]�O:p��Hsystem/helixultimate/vendor/scssphp/source-span/src/Highlighter/Line.phpnu�[���<?php namespace SourceSpan\Highlighter; /** * A single line of the source file being highlighted. * * @internal */ final class Line { /** * All highlights that cover any portion of this line, in source span order. * * This is populated after the initial line is created. * * @var list<Highlight> */ public array $highlights = []; /** * The URL of the source file in which this line appears. * * For lines created from spans without an explicit URL, this is an opaque * object that differs between lines that come from different spans. */ public readonly object $url; /** * @param int $number The O-based line number in the source file */ public function __construct( public readonly string $text, public readonly int $number, object $url, ) { $this->url = $url; } } PKBA#]mf��1Q1QOsystem/helixultimate/vendor/scssphp/source-span/src/Highlighter/Highlighter.phpnu�[���<?php namespace SourceSpan\Highlighter; use League\Uri\Contracts\UriInterface; use SourceSpan\SourceSpan; use SourceSpan\Util; /** * A class for writing a chunk of text with a particular span highlighted. * * @internal */ final class Highlighter { /** * The number of spaces to render for hard tabs that appear in `_span.text`. * * We don't want to render raw tabs, because they'll mess up our character * alignment. */ private const SPACES_PER_TAB = 4; /** * The lines to display, including context around the highlighted spans. * * @var list<Line> */ private array $lines; /** * The number of characters before the bar in the sidebar. */ private readonly int $paddingBeforeSidebar; /** * The maximum number of multiline spans that cover any part of a single * line in {@see $lines}. */ private readonly int $maxMultilineSpans; /** * Whether {@see $lines} includes lines from multiple different files. */ private readonly bool $multipleFiles; /** * The buffer to which to write the result. */ private string $buffer = ''; /** * Creates a {@see Highlighter} that will return a string highlighting $span * within the text of its file when {@see highlight} is called. */ public static function create(SourceSpan $span): Highlighter { return new Highlighter(self::collateLines([new Highlight($span, primary: true)])); } /** * Creates a {@see Highlighter} that will return a string highlighting * $primarySpan as well as all the spans in $secondarySpans within the text * of their file when {@see highlight} is called. * * Each span has an associated label that will be written alongside it. For * $primarySpan this message is $primaryLabel, and for $secondarySpans the * labels are the map keys. * * @param array<string, SourceSpan> $secondarySpans */ public static function multiple(SourceSpan $primarySpan, string $primaryLabel, array $secondarySpans): Highlighter { $highlights = [new Highlight($primarySpan, primary: true, label: $primaryLabel)]; foreach ($secondarySpans as $secondaryLabel => $secondarySpan) { $highlights[] = new Highlight($secondarySpan, label: $secondaryLabel); } return new Highlighter(self::collateLines($highlights)); } /** * @param list<Line> $lines */ private function __construct(array $lines) { $this->lines = $lines; $this->paddingBeforeSidebar = 1 + max( \strlen((string) (Util::listLast($lines)->number + 1)), // If $lines aren't contiguous, we'll write "..." in place of a // line number. self::contiguous($lines) ? 0 : 3 ); $this->maxMultilineSpans = array_reduce(array_map(fn (Line $line) => \count(array_filter($line->highlights, fn (Highlight $highlight) => Util::isMultiline($highlight->span))), $lines), 'max', 0); $this->multipleFiles = !Util::isAllTheSame(array_map(fn (Line $line) => $line->url, $lines)); } /** * Returns whether $lines contains any adjacent lines from the same source * file that aren't adjacent in the original file. * * @param list<Line> $lines */ private static function contiguous(array $lines): bool { for ($i = 0; $i < \count($lines) - 1; $i++) { $thisLine = $lines[$i]; $nextLine = $lines[$i + 1]; if ($thisLine->number + 1 !== $nextLine->number && Util::isSame($thisLine->url, $nextLine->url)) { return false; } } return true; } /** * Collect all the source lines from the contexts of all spans in * $highlights, and associates them with the highlights that cover them. * * @param list<Highlight> $highlights * @return list<Line> */ private static function collateLines(array $highlights): array { // Assign spans without URLs opaque strings as keys. Each such string will // be different, but they can then be used later on to determine which lines // came from the same span even if they'd all otherwise have `null` URLs. $highlightsByUrl = []; $urls = []; foreach ($highlights as $highlight) { $url = $highlight->span->getSourceUrl() ?? new \stdClass(); $key = $url instanceof UriInterface ? $url->toString() : spl_object_hash($url); $highlightsByUrl[$key][] = $highlight; $urls[$key] = $url; } foreach ($highlightsByUrl as &$list) { usort($list, fn (Highlight $highlight1, Highlight $highlight2) => $highlight1->span->compareTo($highlight2->span)); } return iterator_to_array(self::expandMapIterable($highlightsByUrl, function (array $highlightsForFile, string $urlKey) use ($urls) { // First, create a list of all the lines in the current file that we have // context for along with their line numbers. $lines = []; /** @var Highlight $highlight */ foreach ($highlightsForFile as $highlight) { $context = $highlight->span->getContext(); // If `$highlight->span->getContext()` contains lines prior to the one // `$highlight->span->getText()` appears on, write those first. $lineStart = Util::findLineStart($context, $highlight->span->getText(), $highlight->span->getStart()->getColumn()); \assert($lineStart !== null); $linesBeforeSpan = substr_count(substr($context, 0, $lineStart), "\n"); $lineNumber = $highlight->span->getStart()->getLine() - $linesBeforeSpan; foreach (explode("\n", $context) as $line) { // Only add a line if it hasn't already been added for a previous span if ($lines === [] || $lineNumber > Util::listLast($lines)->number) { $lines[] = new Line($line, $lineNumber, $urls[$urlKey]); } $lineNumber++; } } // Next, associate each line with each highlight that covers it. $activeHighlights = []; $highlightIndex = 0; foreach ($lines as $line) { $activeHighlights = array_values(array_filter($activeHighlights, fn (Highlight $highlight) => $highlight->span->getEnd()->getLine() >= $line->number)); $oldHighlightLength = \count($activeHighlights); foreach (array_slice($highlightsForFile, $highlightIndex) as $highlight) { if ($highlight->span->getStart()->getLine() > $line->number) { break; } $activeHighlights[] = $highlight; } $highlightIndex += \count($activeHighlights) - $oldHighlightLength; foreach ($activeHighlights as $activeHighlight) { $line->highlights[] = $activeHighlight; } } return $lines; }), false); } /** * Returns the highlighted span text. * * This method should only be called once. */ public function highlight(): string { $this->writeFileStart($this->lines[0]->url); // Each index of this list represents a column after the sidebar that could // contain a line indicating an active highlight. If it's `null`, that // column is empty; if it contains a highlight, it should be drawn for that // column. $highlightsByColumn = array_fill(0, $this->maxMultilineSpans, null); foreach ($this->lines as $i => $line) { if ($i > 0) { $lastLine = $this->lines[$i - 1]; if (!Util::isSame($lastLine->url, $line->url)) { $this->writeSidebar(end: AsciiGlyph::upEnd); $this->buffer .= "\n"; $this->writeFileStart($line->url); } elseif ($lastLine->number + 1 !== $line->number) { $this->writeSidebar(text: '...'); $this->buffer .= "\n"; } } // If a highlight covers the entire first line other than initial // whitespace, don't bother pointing out exactly where it begins. Iterate // in reverse so that longer highlights (which are sorted after shorter // highlights) appear further out, leading to fewer crossed lines. foreach (array_reverse($line->highlights) as $highlight) { if (Util::isMultiline($highlight->span) && $highlight->span->getStart()->getLine() === $line->number && $this->isOnlyWhitespace(substr($line->text, 0, $highlight->span->getStart()->getColumn()))) { Util::replaceFirstNull($highlightsByColumn, $highlight); } } $this->writeSidebar(line: $line->number); $this->buffer .= ' '; $this->writeMultilineHighlights($line, $highlightsByColumn); if ($highlightsByColumn !== []) { $this->buffer .= ' '; } $primaryIdx = Util::indexWhere($line->highlights, fn (Highlight $highlight) => $highlight->isPrimary()); $primary = $primaryIdx === null ? null : $line->highlights[$primaryIdx]; $this->writeText($line->text); $this->buffer .= "\n"; // Always write the primary span's indicator first so that it's right next // to the highlighted text. if ($primary !== null) { $this->writeIndicator($line, $primary, $highlightsByColumn); } foreach ($line->highlights as $highlight) { if ($highlight->isPrimary()) { continue; } $this->writeIndicator($line, $highlight, $highlightsByColumn); } } $this->writeSidebar(end: AsciiGlyph::upEnd); return $this->buffer; } /** * Writes the beginning of the file highlight for the file with the given * $url (or opaque object if it comes from a span with a null URL). */ private function writeFileStart(object $url): void { if (!$this->multipleFiles || !$url instanceof UriInterface) { $this->writeSidebar(end: AsciiGlyph::downEnd); } else { $this->writeSidebar(end: AsciiGlyph::topLeftCorner); $this->buffer .= str_repeat(AsciiGlyph::horizontalLine, 2) . '> '; $this->buffer .= Util::prettyUri($url); } $this->buffer .= "\n"; } /** * Writes the post-sidebar highlight bars for $line according to * $highlightsByColumn. * * If $current is passed, it's the highlight for which an indicator is being * written. If it appears in $highlightsByColumn, a horizontal line is * written from its column to the rightmost column. * * @param list<Highlight|null> $highlightsByColumn */ private function writeMultilineHighlights(Line $line, array $highlightsByColumn, ?Highlight $current = null): void { // Whether we've written a sidebar indicator for opening a new span on this // line. $openedOnThisLine = false; $foundCurrent = false; foreach ($highlightsByColumn as $highlight) { $startLine = $highlight?->span->getStart()->getLine(); $endLine = $highlight?->span->getEnd()->getLine(); if ($current !== null && $highlight === $current) { $foundCurrent = true; \assert($startLine === $line->number || $endLine === $line->number); $this->buffer .= $startLine === $line->number ? AsciiGlyph::topLeftCorner : AsciiGlyph::bottomLeftCorner; } elseif ($foundCurrent) { $this->buffer .= $highlight === null ? AsciiGlyph::horizontalLine : AsciiGlyph::cross; } elseif ($highlight === null) { if ($openedOnThisLine) { $this->buffer .= AsciiGlyph::horizontalLine; } else { $this->buffer .= ' '; } } else { $vertical = $openedOnThisLine ? AsciiGlyph::cross : AsciiGlyph::verticalLine; if ($current !== null) { $this->buffer .= $vertical; } elseif ($startLine === $line->number) { $this->buffer .= '/'; $openedOnThisLine = true; } elseif ($endLine === $line->number && $highlight->span->getEnd()->getColumn() === \strlen($line->text)) { $this->buffer .= $highlight->label === null ? '\\' : $vertical; } else { $this->buffer .= $vertical; } } } } /** * Writes an indicator for where $highlight starts, ends, or both below * $line. * * This may either add or remove $highlight from $highlightsByColumn. * * @param list<Highlight|null> $highlightsByColumn */ private function writeIndicator(Line $line, Highlight $highlight, array &$highlightsByColumn): void { if (!Util::isMultiline($highlight->span)) { $this->writeSidebar(); $this->buffer .= ' '; $this->writeMultilineHighlights($line, $highlightsByColumn, $highlight); if ($highlightsByColumn !== []) { $this->buffer .= ' '; } $start = \strlen($this->buffer); $this->writeUnderline($line, $highlight->span, $highlight->isPrimary() ? '^' : AsciiGlyph::horizontalLineBold); $underlineLength = \strlen($this->buffer) - $start; $this->writeLabel($highlight, $highlightsByColumn, $underlineLength); } elseif ($highlight->span->getStart()->getLine() === $line->number) { if (\in_array($highlight, $highlightsByColumn, true)) { return; } Util::replaceFirstNull($highlightsByColumn, $highlight); $this->writeSidebar(); $this->buffer .= ' '; $this->writeMultilineHighlights($line, $highlightsByColumn, $highlight); $this->writeArrow($line, $highlight->span->getStart()->getColumn()); $this->buffer .= "\n"; } elseif ($highlight->span->getEnd()->getLine() === $line->number) { $coversWholeLine = $highlight->span->getEnd()->getColumn() === \strlen($line->text); if ($coversWholeLine && $highlight->label === null) { Util::replaceWithNull($highlightsByColumn, $highlight); return; } $this->writeSidebar(); $this->buffer .= ' '; $this->writeMultilineHighlights($line, $highlightsByColumn, $highlight); $start = \strlen($this->buffer); if ($coversWholeLine) { $this->buffer .= str_repeat(AsciiGlyph::horizontalLine, 3); } else { $this->writeArrow($line, max($highlight->span->getEnd()->getColumn() - 1, 0), false); } $underlineLength = \strlen($this->buffer) - $start; $this->writeLabel($highlight, $highlightsByColumn, $underlineLength); Util::replaceWithNull($highlightsByColumn, $highlight); } } /** * Underlines the portion of $line covered by $span with repeated instances * of $character. */ private function writeUnderline(Line $line, SourceSpan $span, string $character): void { \assert(!Util::isMultiline($span)); \assert(str_contains($line->text, $span->getText())); $startColumn = $span->getStart()->getColumn(); $endColumn = $span->getEnd()->getColumn(); // Adjust the start and end columns to account for any tabs that were // converted to spaces. $tabsBefore = substr_count(substr($line->text, 0, $startColumn), "\t"); $tabsInside = substr_count(Util::substring($line->text, $startColumn, $endColumn), "\t"); $startColumn += $tabsBefore * (self::SPACES_PER_TAB - 1); $endColumn += ($tabsBefore + $tabsInside) * (self::SPACES_PER_TAB - 1); $this->buffer .= str_repeat(' ', $startColumn); $this->buffer .= str_repeat($character, max($endColumn - $startColumn, 1)); } /** * Write an arrow pointing to column $column in $line. * * If the arrow points to a tab character, this will point to the beginning * of the tab if $beginning is `true` and the end if it's `false`. */ private function writeArrow(Line $line, int $column, bool $beginning = true): void { $tabs = substr_count(substr($line->text, 0, $column + ($beginning ? 0 : 1)), "\t"); $this->buffer .= str_repeat(AsciiGlyph::horizontalLine, 1 + $column + $tabs * (self::SPACES_PER_TAB - 1)); $this->buffer .= '^'; } /** * Writes $highlight's label. * * The {@see $buffer} is assumed to be written to the point where the first line * of `$highlight->label` can be written after a space, but this takes care of * writing indentation and highlight columns for later lines. * * The $highlightsByColumn are used to write ongoing highlight lines if the * label is more than one line long. * * The $underlineLength is the length of the line written between the * highlights and the beginning of the first label. * * @param list<Highlight|null> $highlightsByColumn */ private function writeLabel(Highlight $highlight, array $highlightsByColumn, int $underlineLength): void { $label = $highlight->label; if ($label === null) { $this->buffer .= "\n"; return; } $lines = explode("\n", $label); $this->buffer .= ' '; $this->buffer .= $lines[0]; $this->buffer .= "\n"; foreach (array_slice($lines, 1) as $text) { $this->writeSidebar(); $this->buffer .= ' '; foreach ($highlightsByColumn as $columnHighlight) { if ($columnHighlight === null || $columnHighlight === $highlight) { $this->buffer .= ' '; } else { $this->buffer .= AsciiGlyph::verticalLine; } } $this->buffer .= str_repeat(' ', $underlineLength + 1); $this->buffer .= $text; $this->buffer .= "\n"; } } /** * Writes a snippet from the source text, converting hard tab characters into * plain indentation. */ private function writeText(string $text): void { $this->buffer .= str_replace("\t", str_repeat(' ', self::SPACES_PER_TAB), $text); } /** * Writes a sidebar to {@see $buffer} that includes $line as the line number if * given and writes $end at the end (defaults to {@see AsciiGlyph::verticalLine}). * * If $text is given, it's used in place of the line number. It can't be * passed at the same time as $line. */ private function writeSidebar(?int $line = null, ?string $text = null, ?string $end = null): void { \assert($line === null || $text === null); if ($line !== null) { // Add 1 to line to convert from computer-friendly 0-indexed line numbers to // human-friendly 1-indexed line numbers. $text = (string) ($line + 1); } $this->buffer .= str_pad($text ?? '', $this->paddingBeforeSidebar); $this->buffer .= $end ?? AsciiGlyph::verticalLine; } /** * Returns whether $text contains only space or tab characters. */ private function isOnlyWhitespace(string $text): bool { for ($i = 0; $i < \strlen($text); $i++) { $char = $text[$i]; if ($char !== ' ' && $char !== "\t") { return false; } } return true; } /** * @template K * @template E * @template T * @param iterable<K, E> $elements * @param callable(E, K): iterable<T> $callback * @return \Traversable<T> * * @param-immediately-invoked-callable $callback */ private static function expandMapIterable(iterable $elements, callable $callback): \Traversable { foreach ($elements as $key => $element) { yield from $callback($element, $key); } } } PKBA#]��||Nsystem/helixultimate/vendor/scssphp/source-span/src/Highlighter/AsciiGlyph.phpnu�[���<?php namespace SourceSpan\Highlighter; /** * @internal */ final class AsciiGlyph { public const horizontalLine = '-'; public const verticalLine = '|'; public const topLeftCorner = ','; public const bottomLeftCorner = "'"; public const cross = '+'; public const upEnd = "'"; public const downEnd = ','; public const horizontalLineBold = '='; } PKBA#]� ���Msystem/helixultimate/vendor/scssphp/source-span/src/Highlighter/Highlight.phpnu�[���<?php namespace SourceSpan\Highlighter; use SourceSpan\SimpleSourceLocation; use SourceSpan\SimpleSourceSpanWithContext; use SourceSpan\SourceSpan; use SourceSpan\SourceSpanWithContext; use SourceSpan\Util; /** * Information about how to highlight a single section of a source file. * * @internal */ final class Highlight { /** * The section of the source file to highlight. * * This is normalized to make it easier for {@see Highlighter} to work with. */ public readonly SourceSpanWithContext $span; /** * The label to include inline when highlighting {@see $span}. * * This helps distinguish clarify what each highlight means when multiple are * used in the same message. */ public readonly ?string $label; public function __construct( SourceSpan $span, private readonly bool $primary = false, ?string $label = null, ) { $this->span = self::normalizeSpan($span); $this->label = $label === null ? null : str_replace("\r\n", "\n", $label); } /** * Whether this is the primary span in the highlight. * * The primary span is highlighted with a different character than * non-primary spans. */ public function isPrimary(): bool { return $this->primary; } private static function normalizeSpan(SourceSpan $span): SourceSpanWithContext { $newSpan = self::normalizeContext($span); $newSpan = self::normalizeNewlines($newSpan); $newSpan = self::normalizeTrailingNewline($newSpan); return self::normalizeEndOfLine($newSpan); } /** * Normalizes $span to ensure that it's a {@see SourceSpanWithContext} whose * context actually contains its text at the expected column. * * If it's not already a {@see SourceSpanWithContext}, adjust the start and end * locations' line and column fields so that the highlighter can assume they * match up with the context. */ private static function normalizeContext(SourceSpan $span): SourceSpanWithContext { if ($span instanceof SourceSpanWithContext && Util::findLineStart($span->getContext(), $span->getText(), $span->getStart()->getColumn()) !== null) { return $span; } return new SimpleSourceSpanWithContext( new SimpleSourceLocation($span->getStart()->getOffset(), $span->getSourceUrl(), 0, 0), new SimpleSourceLocation($span->getEnd()->getOffset(), $span->getSourceUrl(), substr_count($span->getText(), "\n"), self::lastLineLength($span->getText())), $span->getText(), $span->getText() ); } /** * Normalizes $span to replace Windows-style newlines with Unix-style * newlines. */ private static function normalizeNewlines(SourceSpanWithContext $span): SourceSpanWithContext { $text = $span->getText(); if (!str_contains($text, "\r\n")) { return $span; } $endOffset = $span->getEnd()->getOffset() - substr_count($text, "\r\n"); return new SimpleSourceSpanWithContext( $span->getStart(), new SimpleSourceLocation($endOffset, $span->getSourceUrl(), $span->getEnd()->getLine(), $span->getEnd()->getColumn()), str_replace("\r\n", "\n", $text), str_replace("\r\n", "\n", $span->getContext()) ); } /** * Normalizes $span to remove a trailing newline from `$span->getContext()`. * * If necessary, also adjust `$span->getEnd()` so that it doesn't point past where * the trailing newline used to be. */ private static function normalizeTrailingNewline(SourceSpanWithContext $span): SourceSpanWithContext { if (!str_ends_with($span->getContext(), "\n")) { return $span; } // If there's a full blank line on the end of `$span->getContext()`, it's probably // significant, so we shouldn't trim it. if (str_ends_with($span->getText(), "\n\n")) { return $span; } $context = substr($span->getContext(), 0, -1); $text = $span->getText(); $start = $span->getStart(); $end = $span->getEnd(); if (str_ends_with($text, "\n") && self::isTextAtEndOfContext($span)) { $text = substr($text, 0, -1); if ($text === '') { $end = $start; } else { $end = new SimpleSourceLocation( $end->getOffset() - 1, $span->getSourceUrl(), $end->getLine() - 1, self::lastLineLength($context) ); $start = $span->getStart()->getOffset() === $span->getEnd()->getOffset() ? $end : $span->getStart(); } } return new SimpleSourceSpanWithContext($start, $end, $text, $context); } /** * Normalizes $span so that the end location is at the end of a line rather * than at the beginning of the next line. */ private static function normalizeEndOfLine(SourceSpanWithContext $span): SourceSpanWithContext { if ($span->getEnd()->getColumn() !== 0) { return $span; } if ($span->getEnd()->getLine() === $span->getStart()->getLine()) { return $span; } $text = substr($span->getText(), 0, -1); return new SimpleSourceSpanWithContext( $span->getStart(), new SimpleSourceLocation( $span->getEnd()->getOffset() - 1, $span->getSourceUrl(), $span->getEnd()->getLine() - 1, \strlen($text) - Util::lastIndexOf($text, "\n") - 1 ), $text, // If the context also ends with a newline, it's possible that we don't // have the full context for that line, so we shouldn't print it at all. str_ends_with($span->getContext(), "\n") ? substr($span->getContext(), 0, -1) : $span->getContext() ); } /** * Returns the length of the last line in $text, whether or not it ends in a * newline. */ private static function lastLineLength(string $text): int { if ($text === '') { return 0; } if ($text[\strlen($text) - 1] === '\n') { return \strlen($text) === 1 ? 0 : \strlen($text) - Util::lastIndexOf($text, "\n", \strlen($text) - 2) - 1; } return \strlen($text) - Util::lastIndexOf($text, "\n") - 1; } /** * Returns whether $span's text runs all the way to the end of its context. */ private static function isTextAtEndOfContext(SourceSpanWithContext $span): bool { $lineStart = Util::findLineStart($span->getContext(), $span->getText(), $span->getStart()->getColumn()); \assert($lineStart !== null); return $lineStart + $span->getStart()->getColumn() + $span->getLength() === \strlen($span->getContext()); } } PKBA#]ç�Y��Ksystem/helixultimate/vendor/scssphp/source-span/src/SourceLocationMixin.phpnu�[���<?php namespace SourceSpan; /** * A mixin for easily implementing {@see SourceLocation}. * * @internal */ abstract class SourceLocationMixin implements SourceLocation { public function distance(SourceLocation $other): int { if (!Util::isSameUrl($this->getSourceUrl(), $other->getSourceUrl())) { throw new \InvalidArgumentException("Source URLs \"{$this->getSourceUrl()}\" and \"{$other->getSourceUrl()}\" don't match."); } return abs($this->getOffset() - $other->getOffset()); } public function pointSpan(): SourceSpan { return new SimpleSourceSpan($this, $this, ''); } public function compareTo(SourceLocation $other): int { if (!Util::isSameUrl($this->getSourceUrl(), $other->getSourceUrl())) { throw new \InvalidArgumentException("Source URLs \"{$this->getSourceUrl()}\" and \"{$other->getSourceUrl()}\" don't match."); } return $this->getOffset() - $other->getOffset(); } } PKBA#]w����Gsystem/helixultimate/vendor/scssphp/source-span/src/SourceSpanMixin.phpnu�[���<?php namespace SourceSpan; use League\Uri\Contracts\UriInterface; use SourceSpan\Highlighter\Highlighter; /** * A mixin for easily implementing {@see SourceSpan}. * * This implements the {@see SourceSpan} methods in terms of {@see getStart}, {@see getEnd}, and * {@see getText}. This assumes that {@see getStart} and {@see getEnd} have the same source URL, that * {@see getStart} comes before {@see getEnd}, and that {@see getText} has a number of characters equal * to the distance between {@see getStart} and {@see getEnd}. * * @internal */ abstract class SourceSpanMixin implements SourceSpan { public function getSourceUrl(): ?UriInterface { return $this->getStart()->getSourceUrl(); } public function getLength(): int { return $this->getEnd()->getOffset() - $this->getStart()->getOffset(); } public function union(SourceSpan $other): SourceSpan { if (!Util::isSameUrl($this->getSourceUrl(), $other->getSourceUrl())) { throw new \InvalidArgumentException("Source URLs \"{$this->getSourceUrl()}\" and \"{$other->getSourceUrl()}\" don't match."); } if ($this->getStart()->compareTo($other->getStart()) > 0) { $start = $other->getStart(); $beginSpan = $other; } else { $start = $this->getStart(); $beginSpan = $this; } if ($this->getEnd()->compareTo($other->getEnd()) > 0) { $end = $this->getEnd(); $endSpan = $this; } else { $end = $other->getEnd(); $endSpan = $other; } if ($beginSpan->getEnd()->compareTo($endSpan->getStart()) < 0) { throw new \InvalidArgumentException("Spans are disjoint."); } $text = $beginSpan->getText() . substr($endSpan->getText(), $beginSpan->getEnd()->distance($endSpan->getStart())); return new SimpleSourceSpan($start, $end, $text); } public function compareTo(SourceSpan $other): int { $result = $this->getStart()->compareTo($other->getStart()); if ($result !== 0) { return $result; } return $this->getEnd()->compareTo($other->getEnd()); } public function message(string $message): string { $startLine = $this->getStart()->getLine() + 1; $startColumn = $this->getStart()->getColumn() + 1; $sourceUrl = $this->getSourceUrl(); $buffer = "line $startLine, column $startColumn"; if ($sourceUrl !== null) { $prettyUri = Util::prettyUri($sourceUrl); $buffer .= " of $prettyUri"; } $buffer .= ": $message"; $highlight = $this->highlight(); if ($highlight !== '') { $buffer .= "\n"; $buffer .= $highlight; } return $buffer; } public function messageMultiple(string $message, string $label, array $secondarySpans): string { $startLine = $this->getStart()->getLine() + 1; $startColumn = $this->getStart()->getColumn() + 1; $sourceUrl = $this->getSourceUrl(); $buffer = "line $startLine, column $startColumn"; if ($sourceUrl !== null) { $prettyUri = Util::prettyUri($sourceUrl); $buffer .= " of $prettyUri"; } $buffer .= ": $message"; $highlight = $this->highlightMultiple($label, $secondarySpans); if ($highlight !== '') { $buffer .= "\n"; $buffer .= $highlight; } return $buffer; } public function highlight(): string { if (!$this instanceof SourceSpanWithContext && $this->getLength() === 0) { return ''; } return Highlighter::create($this)->highlight(); } public function highlightMultiple(string $label, array $secondarySpans): string { return Highlighter::multiple($this, $label, $secondarySpans)->highlight(); } } PKBA#]�����Ssystem/helixultimate/vendor/scssphp/source-span/src/SimpleSourceSpanWithContext.phpnu�[���<?php namespace SourceSpan; final class SimpleSourceSpanWithContext extends SourceSpanMixin implements SourceSpanWithContext { public function __construct( private readonly SourceLocation $start, private readonly SourceLocation $end, private readonly string $text, private readonly string $context ) { if (!Util::isSameUrl($start->getSourceUrl(), $end->getSourceUrl())) { throw new \InvalidArgumentException("Source URLs \"{$start->getSourceUrl()}\" and \"{$end->getSourceUrl()}\" don't match."); } if ($this->end->getOffset() < $this->start->getOffset()) { throw new \InvalidArgumentException('End must come after start.'); } $distance = $this->start->distance($this->end); if (\strlen($this->text) !== $distance) { throw new \InvalidArgumentException("Text \"$text\" must be $distance characters long."); } if (!str_contains($this->context, $this->text)) { throw new \InvalidArgumentException("The context line \"$context\" must contain \"$text\"."); } if (Util::findLineStart($this->context, $this->text, $this->start->getColumn()) === null) { $column = $this->start->getColumn() + 1; throw new \InvalidArgumentException("The span text \"$text\" must start at column $column in a line within \"$context\"."); } } public function getStart(): SourceLocation { return $this->start; } public function getEnd(): SourceLocation { return $this->end; } public function getText(): string { return $this->text; } public function getContext(): string { return $this->context; } public function subspan(int $start, ?int $end = null): SourceSpanWithContext { Util::checkValidRange($start, $end, $this->getLength()); if ($start === 0 && ($end === null || $end === $this->getLength())) { return $this; } $locations = Util::subspanLocations($this, $start, $end); return new SimpleSourceSpanWithContext($locations[0], $locations[1], Util::substring($this->text, $start, $end), $this->context); } } PKBA#] ����@system/helixultimate/vendor/scssphp/source-span/src/FileSpan.phpnu�[���<?php namespace SourceSpan; interface FileSpan extends SourceSpanWithContext { public function getFile(): SourceFile; public function getStart(): FileLocation; public function getEnd(): FileLocation; public function expand(FileSpan $other): FileSpan; /** * Return a span from $start bytes (inclusive) to $end bytes * (exclusive) after the beginning of this span */ public function subspan(int $start, ?int $end = null): FileSpan; } PKBA#]�2<�88Hsystem/helixultimate/vendor/scssphp/source-span/src/ConcreteFileSpan.phpnu�[���<?php namespace SourceSpan; use League\Uri\Contracts\UriInterface; /** * The implementation of {@see FileSpan} based on a {@see SourceFile}. * * @see SourceFile::span() * * @internal */ final class ConcreteFileSpan extends SourceSpanMixin implements FileSpan { /** * @param int $start The offset of the beginning of the span. * @param int $end The offset of the end of the span. */ public function __construct( private readonly SourceFile $file, private readonly int $start, private readonly int $end, ) { if ($this->end < $this->start) { throw new \InvalidArgumentException("End $this->end must come after start $this->start."); } if ($this->end > $this->file->getLength()) { throw new \OutOfRangeException("End $this->end not be greater than the number of characters in the file, {$this->file->getLength()}."); } if ($this->start < 0) { throw new \OutOfRangeException("Start may not be negative, was $this->start."); } } public function getFile(): SourceFile { return $this->file; } public function getSourceUrl(): ?UriInterface { return $this->file->getSourceUrl(); } public function getLength(): int { return $this->end - $this->start; } public function getStart(): FileLocation { return new FileLocation($this->file, $this->start); } public function getEnd(): FileLocation { return new FileLocation($this->file, $this->end); } public function getText(): string { return $this->file->getText($this->start, $this->end); } public function getContext(): string { $endLine = $this->file->getLine($this->end); $endColumn = $this->file->getColumn($this->end); if ($endColumn === 0 && $endLine !== 0) { // If $this->end is at the very beginning of the line, the span covers the // previous newline, so we only want to include the previous line in the // context... if ($this->getLength() === 0) { // ...unless this is a point span, in which case we want to include the // next line (or the empty string if this is the end of the file). return $endLine === $this->file->getLines() - 1 ? '' : $this->file->getText($this->file->getOffset($endLine), $this->file->getOffset($endLine + 1)); } $endOffset = $this->end; } elseif ($endLine === $this->file->getLines() - 1) { // If the span covers the last line of the file, the context should go all // the way to the end of the file. $endOffset = $this->file->getLength(); } else { // Otherwise, the context should cover the full line on which [end] // appears. $endOffset = $this->file->getOffset($endLine + 1); } return $this->file->getText($this->file->getOffset($this->file->getLine($this->start)), $endOffset); } public function compareTo(SourceSpan $other): int { if (!$other instanceof ConcreteFileSpan) { return parent::compareTo($other); } $result = $this->start <=> $other->start; if ($result !== 0) { return $result; } return $this->end <=> $other->end; } public function union(SourceSpan $other): SourceSpan { if (!$other instanceof FileSpan) { return parent::union($other); } $span = $this->expand($other); if ($other instanceof ConcreteFileSpan) { if ($this->start > $other->end || $other->start > $this->end) { throw new \InvalidArgumentException("Spans are disjoint."); } } else { if ($this->start > $other->getEnd()->getOffset() || $other->getStart()->getOffset() > $this->end) { throw new \InvalidArgumentException("Spans are disjoint."); } } return $span; } public function expand(FileSpan $other): FileSpan { if ($this->file->getSourceUrl() !== $other->getFile()->getSourceUrl()) { throw new \InvalidArgumentException('Source map URLs don\'t match.'); } $start = min($this->start, $other->getStart()->getOffset()); $end = max($this->end, $other->getEnd()->getOffset()); return new ConcreteFileSpan($this->file, $start, $end); } public function subspan(int $start, ?int $end = null): FileSpan { Util::checkValidRange($start, $end, $this->getLength()); if ($start === 0 && ($end === null || $end === $this->getLength())) { return $this; } return $this->file->span($this->start + $start, $end === null ? $this->end : $this->start + $end); } } PKBA#]@:=WWFsystem/helixultimate/vendor/scssphp/source-span/src/SourceLocation.phpnu�[���<?php namespace SourceSpan; use League\Uri\Contracts\UriInterface; interface SourceLocation { public function getOffset(): int; /** * The 0-based line of that location */ public function getLine(): int; /** * The 0-based column of that location */ public function getColumn(): int; public function getSourceUrl(): ?UriInterface; /** * Returns the distance in characters between $this and $other. * * This always returns a non-negative value. * * @return int<0, max> */ public function distance(SourceLocation $other): int; /** * Returns a span that covers only a single point: this location. */ public function pointSpan(): SourceSpan; /** * Compares two locations. * * It returns a negative integer if $this is ordered before $other, * a positive integer if $this is ordered after $other, * and zero if $this and $other are ordered together. * * $other must have the same source URL as $this. */ public function compareTo(SourceLocation $other): int; } PKBA#]�t�x��Bsystem/helixultimate/vendor/scssphp/source-span/src/SourceFile.phpnu�[���<?php namespace SourceSpan; use League\Uri\Contracts\UriInterface; final class SourceFile { private readonly string $string; private readonly ?UriInterface $sourceUrl; /** * @var list<int> */ private readonly array $lineStarts; /** * The 0-based last line that was returned by {@see getLine} * * This optimizes computation for successive accesses to * the same line or to the next line. * It is stored as 0-based to correspond to the indices * in {@see $lineStarts}. * * @var int|null */ private ?int $cachedLine = null; public static function fromString(string $content, ?UriInterface $sourceUrl = null): SourceFile { return new SourceFile($content, $sourceUrl); } private function __construct(string $content, ?UriInterface $sourceUrl = null) { $this->string = $content; $this->sourceUrl = $sourceUrl; // Extract line starts $lineStarts = [0]; if ($content === '') { $this->lineStarts = $lineStarts; return; } $prev = 0; while (true) { $crPos = strpos($content, "\r", $prev); $lfPos = strpos($content, "\n", $prev); if ($crPos === false && $lfPos === false) { break; } if ($crPos !== false) { // Return not followed by newline is treated as a newline if ($lfPos === false || $lfPos > $crPos + 1) { $lineStarts[] = $crPos + 1; $prev = $crPos + 1; continue; } } if ($lfPos !== false) { $lineStarts[] = $lfPos + 1; $prev = $lfPos + 1; } } $this->lineStarts = $lineStarts; } public function getLength(): int { return \strlen($this->string); } /** * The number of lines in the file. */ public function getLines(): int { return \count($this->lineStarts); } public function span(int $start, ?int $end = null): FileSpan { if ($end === null) { $end = \strlen($this->string); } return new ConcreteFileSpan($this, $start, $end); } public function location(int $offset): FileLocation { if ($offset < 0) { throw new \OutOfRangeException("Offset may not be negative, was $offset."); } if ($offset > \strlen($this->string)) { $fileLength = \strlen($this->string); throw new \OutOfRangeException("Offset $offset must not be greater than the number of characters in the file, $fileLength."); } return new FileLocation($this, $offset); } public function getSourceUrl(): ?UriInterface { return $this->sourceUrl; } public function getString(): string { return $this->string; } /** * The 0-based line corresponding to that offset. */ public function getLine(int $offset): int { if ($offset < 0) { throw new \OutOfRangeException('Position cannot be negative'); } if ($offset > \strlen($this->string)) { throw new \OutOfRangeException('Position cannot be greater than the number of characters in the string.'); } if ($offset < $this->lineStarts[0]) { return -1; } if ($offset >= Util::listLast($this->lineStarts)) { return \count($this->lineStarts) - 1; } if ($this->isNearCacheLine($offset)) { assert($this->cachedLine !== null); return $this->cachedLine; } $this->cachedLine = $this->binarySearch($offset) - 1; return $this->cachedLine; } /** * Returns `true` if $offset is near {@see $cachedLine}. * * Checks on {@see $cachedLine} and the next line. If it's on the next line, it * updates {@see $cachedLine} to point to that. */ private function isNearCacheLine(int $offset): bool { if ($this->cachedLine === null) { return false; } if ($offset < $this->lineStarts[$this->cachedLine]) { return false; } if ( $this->cachedLine >= \count($this->lineStarts) - 1 || $offset < $this->lineStarts[$this->cachedLine + 1] ) { return true; } if ( $this->cachedLine >= \count($this->lineStarts) - 2 || $offset < $this->lineStarts[$this->cachedLine + 2] ) { ++$this->cachedLine; return true; } return false; } /** * Binary search through {@see $lineStarts} to find the line containing $offset. * * Returns the index of the line in {@see $lineStarts}. */ private function binarySearch(int $offset): int { $min = 0; $max = \count($this->lineStarts) - 1; while ($min < $max) { $half = $min + intdiv($max - $min, 2); if ($this->lineStarts[$half] > $offset) { $max = $half; } else { $min = $half + 1; } } return $max; } /** * The 0-based column of that offset. * * Unlike offsets (which are byte-offsets), columns are computed based on Unicode * codepoints to provide a better experience. */ public function getColumn(int $offset): int { $line = $this->getLine($offset); return mb_strlen(substr($this->string, $this->lineStarts[$line], $offset - $this->lineStarts[$line]), 'UTF-8'); } /** * Gets the offset for a line and column. */ public function getOffset(int $line, int $column = 0): int { if ($line < 0) { throw new \OutOfRangeException('Line may not be negative.'); } if ($line >= \count($this->lineStarts)) { throw new \OutOfRangeException('Line must be less than the number of lines in the file.'); } if ($column < 0) { throw new \OutOfRangeException('Column may not be negative.'); } if ($column === 0) { $result = $this->lineStarts[$line]; } else { $lineContent = substr($this->string, $this->lineStarts[$line], $this->lineStarts[$line + 1] ?? null); if ($column > mb_strlen($lineContent, 'UTF-8')) { throw new \OutOfRangeException("Line $line doesn't have $column columns."); } $result = $this->lineStarts[$line] + \strlen(mb_substr($lineContent, 0, $column, 'UTF-8')); } if ($result > \strlen($this->string) || ($line + 1 < \count($this->lineStarts) && $result >= $this->lineStarts[$line + 1])) { throw new \OutOfRangeException("Line $line doesn't have $column columns."); } return $result; } /** * Returns the text of the file from $start to $end (exclusive). * * If $end isn't passed, it defaults to the end of the file. */ public function getText(int $start, ?int $end = null): string { if ($end !== null) { if ($end < $start) { throw new \InvalidArgumentException("End $end must come after start $start."); } if ($end > $this->getLength()) { throw new \OutOfRangeException("End $end not be greater than the number of characters in the file, {$this->getLength()}."); } } if ($start < 0) { throw new \OutOfRangeException("Start may not be negative, was $start."); } return Util::substring($this->string, $start, $end); } } PKBA#]���� 9system/helixultimate/vendor/scssphp/scssphp/composer.jsonnu�[���{ "name": "scssphp/scssphp", "type": "library", "description": "scssphp is a compiler for SCSS written in PHP.", "keywords": ["css", "stylesheet", "scss", "sass", "less"], "homepage": "https://scssphp.github.io/scssphp/", "license": [ "MIT" ], "authors": [ { "name": "Anthon Pang", "email": "apang@softwaredevelopment.ca", "homepage": "https://github.com/robocoder" }, { "name": "Cédric Morin", "email": "cedric@yterium.com", "homepage": "https://github.com/Cerdic" } ], "autoload": { "psr-4": { "ScssPhp\\ScssPhp\\": "src/" } }, "autoload-dev": { "psr-4": { "ScssPhp\\ScssPhp\\Tests\\": "tests/" } }, "require": { "php": ">=8.1", "ext-ctype": "*", "ext-json": "*", "ext-mbstring": "*", "league/uri": "^7.6", "league/uri-interfaces": "^7.6", "scssphp/source-span": "^1.1", "symfony/filesystem": "^5.4 || ^6.0 || ^7.0 || ^8.0" }, "require-dev": { "jgthms/bulma": "~0.9.4", "jiripudil/phpstan-sealed-classes": "^1.3", "phpstan/phpstan": "^2.1.31", "phpstan/phpstan-deprecation-rules": "^2.0", "phpunit/phpunit": "^9.5.6", "sass/sass-spec": "*", "squizlabs/php_codesniffer": "^3.13", "symfony/phpunit-bridge": "^7.3 || ^8.0", "symfony/polyfill-php84": "^1.33", "symfony/var-dumper": "^6.4 || ^7.3 || ^8.0", "thoughtbot/bourbon": "^7.0", "twbs/bootstrap": "^5.3", "twbs/bootstrap4": "4.6.1", "zurb/foundation": "~6.7.0" }, "repositories": [ { "type": "package", "package": { "name": "sass/sass-spec", "version": "2024.06.24", "source": { "type": "git", "url": "https://github.com/sass/sass-spec.git", "reference": "7ac806618da724333c60ad7b9c16b969470b9302" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sass/sass-spec/zipball/7ac806618da724333c60ad7b9c16b969470b9302", "reference": "7ac806618da724333c60ad7b9c16b969470b9302", "shasum": "" } } }, { "type": "package", "package": { "name": "thoughtbot/bourbon", "version": "v7.0.0", "source": { "type": "git", "url": "https://github.com/thoughtbot/bourbon.git", "reference": "fbe338ee6807e7f7aa996d82c8a16f248bb149b3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/thoughtbot/bourbon/zipball/fbe338ee6807e7f7aa996d82c8a16f248bb149b3", "reference": "fbe338ee6807e7f7aa996d82c8a16f248bb149b3", "shasum": "" } } }, { "type": "package", "package": { "name": "jgthms/bulma", "version": "v0.9.4", "source": { "type": "git", "url": "https://github.com/jgthms/bulma.git", "reference": "3e00a8e6d0d0e566d507328f0185ef84854effba" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/jgthms/bulma/zipball/3e00a8e6d0d0e566d507328f0185ef84854effba", "reference": "3e00a8e6d0d0e566d507328f0185ef84854effba", "shasum": "" } } }, { "type": "package", "package": { "name": "twbs/bootstrap4", "version": "v4.6.1", "source": { "type": "git", "url": "https://github.com/twbs/bootstrap.git", "reference": "043a03c95a2ad6738f85b65e53b9dbdfb03b8d10" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/twbs/bootstrap/zipball/043a03c95a2ad6738f85b65e53b9dbdfb03b8d10", "reference": "043a03c95a2ad6738f85b65e53b9dbdfb03b8d10", "shasum": "" } } } ], "config": { "sort-packages": true } } PKBA#]��BDsystem/helixultimate/vendor/scssphp/scssphp/src/StackTrace/Trace.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\StackTrace; /** * A stack trace, comprised of a list of stack frames. */ final class Trace { /** * @var list<Frame> * @readonly */ private readonly array $frames; /** * @param list<Frame> $frames */ public function __construct(array $frames) { $this->frames = $frames; } /** * @return list<Frame> */ public function getFrames(): array { return $this->frames; } public function getFormattedTrace(): string { $longest = 0; foreach ($this->frames as $frame) { $length = \strlen($frame->getLocation()); $longest = max($longest, $length); } return implode(array_map(fn(Frame $frame) => str_pad($frame->getLocation(), $longest) . ' ' . $frame->getMember() . "\n", $this->frames)); } } PKBA#]�7J� � Dsystem/helixultimate/vendor/scssphp/scssphp/src/StackTrace/Frame.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\StackTrace; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Util\Path; /** * A single stack frame. Each frame points to a precise location in Sass code. */ final class Frame { /** * The URI of the file in which the code is located. */ private readonly UriInterface $url; /** * The line number on which the code location is located. * * This can be null, indicating that the line number is unknown or * unimportant. */ private readonly ?int $line; /** * The column number of the code location. * * This can be null, indicating that the column number is unknown or * unimportant. */ private readonly ?int $column; /** * The name of the member in which the code location occurs. */ private readonly ?string $member; public function __construct(UriInterface $url, ?int $line, ?int $column, ?string $member) { $this->url = $url; $this->line = $line; $this->column = $column; $this->member = $member; } /** * The URI of the file in which the code is located. */ public function getUrl(): UriInterface { return $this->url; } /** * The line number on which the code location is located. * * This can be null, indicating that the line number is unknown or * unimportant. */ public function getLine(): ?int { return $this->line; } /** * The column number of the code location. * * This can be null, indicating that the column number is unknown or * unimportant. */ public function getColumn(): ?int { return $this->column; } /** * The name of the member in which the code location occurs. */ public function getMember(): ?string { return $this->member; } /** * A human-friendly description of the code location. */ public function getLocation(): string { $library = Path::prettyUri($this->url); if ($this->line === null) { return $library; } if ($this->column === null) { return $library . ' ' . $this->line; } return $library . ' ' . $this->line . ':' . $this->column; } } PKBA#]��*XIsystem/helixultimate/vendor/scssphp/scssphp/src/SourceMap/TargetEntry.phpnu�[���<?php /** * SCSSPHP * * @copyright 2018-2020 Anthon Pang * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\SourceMap; /** * A target segment entry read from a source map * * @internal */ final class TargetEntry { public function __construct( public readonly int $column, public readonly ?int $sourceUrlId = null, public readonly ?int $sourceLine = null, public readonly ?int $sourceColumn = null, ) { } } PKBA#]iGs���Dsystem/helixultimate/vendor/scssphp/scssphp/src/SourceMap/Base64.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\SourceMap; /** * Base 64 Encode/Decode * * @author Anthon Pang <anthon.pang@gmail.com> * * @internal */ final class Base64 { /** * @var array<int, string> */ private const ENCODING_MAP = [ 0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D', 4 => 'E', 5 => 'F', 6 => 'G', 7 => 'H', 8 => 'I', 9 => 'J', 10 => 'K', 11 => 'L', 12 => 'M', 13 => 'N', 14 => 'O', 15 => 'P', 16 => 'Q', 17 => 'R', 18 => 'S', 19 => 'T', 20 => 'U', 21 => 'V', 22 => 'W', 23 => 'X', 24 => 'Y', 25 => 'Z', 26 => 'a', 27 => 'b', 28 => 'c', 29 => 'd', 30 => 'e', 31 => 'f', 32 => 'g', 33 => 'h', 34 => 'i', 35 => 'j', 36 => 'k', 37 => 'l', 38 => 'm', 39 => 'n', 40 => 'o', 41 => 'p', 42 => 'q', 43 => 'r', 44 => 's', 45 => 't', 46 => 'u', 47 => 'v', 48 => 'w', 49 => 'x', 50 => 'y', 51 => 'z', 52 => '0', 53 => '1', 54 => '2', 55 => '3', 56 => '4', 57 => '5', 58 => '6', 59 => '7', 60 => '8', 61 => '9', 62 => '+', 63 => '/', ]; /** * Convert to base64 */ public static function encode(int $value): string { return self::ENCODING_MAP[$value]; } } PKBA#]@1["� � Gsystem/helixultimate/vendor/scssphp/scssphp/src/SourceMap/Base64VLQ.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\SourceMap; /** * Base 64 VLQ * * Based on the Base 64 VLQ implementation in Closure Compiler: * https://github.com/google/closure-compiler/blob/master/src/com/google/debugging/sourcemap/Base64VLQ.java * * Copyright 2011 The Closure Compiler Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * @author John Lenz <johnlenz@google.com> * @author Anthon Pang <anthon.pang@gmail.com> * * @internal */ final class Base64VLQ { // A Base64 VLQ digit can represent 5 bits, so it is base-32. const VLQ_BASE_SHIFT = 5; // A mask of bits for a VLQ digit (11111), 31 decimal. const VLQ_BASE_MASK = 31; // The continuation bit is the 6th bit. const VLQ_CONTINUATION_BIT = 32; /** * Returns the VLQ encoded value. */ public static function encode(int $value): string { $encoded = ''; $vlq = self::toVLQSigned($value); do { $digit = $vlq & self::VLQ_BASE_MASK; //$vlq >>>= self::VLQ_BASE_SHIFT; // unsigned right shift $vlq = (($vlq >> 1) & PHP_INT_MAX) >> (self::VLQ_BASE_SHIFT - 1); if ($vlq > 0) { $digit |= self::VLQ_CONTINUATION_BIT; } $encoded .= Base64::encode($digit); } while ($vlq > 0); return $encoded; } /** * Converts from a two-complement value to a value where the sign bit is * is placed in the least significant bit. For example, as decimals: * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) */ private static function toVLQSigned(int $value): int { if ($value < 0) { return ((-$value) << 1) + 1; } return $value << 1; } } PKBA#] ����Ksystem/helixultimate/vendor/scssphp/scssphp/src/SourceMap/Builder/Entry.phpnu�[���<?php /** * SCSSPHP * * @copyright 2018-2020 Anthon Pang * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\SourceMap\Builder; use SourceSpan\SourceLocation; /** * An entry in the source map builder. * * @internal */ final class Entry { /** * Span denoting the original location in the input source file */ public readonly SourceLocation $source; /** * Span indicating the corresponding location in the target file. */ public readonly SourceLocation $target; public function __construct(SourceLocation $source, SourceLocation $target) { $this->source = $source; $this->target = $target; } /** * Implements comparison to ensure that entries are ordered by their * location in the target file. We sort primarily by the target offset * because source map files are encoded by printing each mapping in order as * they appear in the target file. */ public function compareTo(Entry $other): int { $res = $this->target->compareTo($other->target); if ($res !== 0) { return $res; } $res = (string) $this->source->getSourceUrl() <=> (string) $other->source->getSourceUrl(); if ($res !== 0) { return $res; } return $this->source->compareTo($other->source); } } PKBA#]�>�S�.�.Psystem/helixultimate/vendor/scssphp/scssphp/src/SourceMap/SourceMapGenerator.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\SourceMap; use ScssPhp\ScssPhp\Exception\CompilerException; /** * Source Map Generator * * {@internal Derivative of oyejorge/less.php's lib/SourceMap/Generator.php, relicensed with permission. }} * * @author Josh Schmidt <oyejorge@gmail.com> * @author Nicolas FRANÇOIS <nicolas.francois@frog-labs.com> * * @internal */ class SourceMapGenerator { /** * What version of source map does the generator generate? */ const VERSION = 3; /** * Array of default options * * @var array * @phpstan-var array{sourceRoot: string, sourceMapFilename: string|null, sourceMapURL: string|null, sourceMapWriteTo: string|null, outputSourceFiles: bool, sourceMapRootpath: string, sourceMapBasepath: string} */ protected $defaultOptions = [ // an optional source root, useful for relocating source files // on a server or removing repeated values in the 'sources' entry. // This value is prepended to the individual entries in the 'source' field. 'sourceRoot' => '', // an optional name of the generated code that this source map is associated with. 'sourceMapFilename' => null, // url of the map 'sourceMapURL' => null, // absolute path to a file to write the map to 'sourceMapWriteTo' => null, // output source contents? 'outputSourceFiles' => false, // base path for filename normalization 'sourceMapRootpath' => '', // base path for filename normalization 'sourceMapBasepath' => '' ]; /** * The base64 VLQ encoder * * @var \ScssPhp\ScssPhp\SourceMap\Base64VLQ */ protected $encoder; /** * Array of mappings * * @var array * @phpstan-var list<array{generated_line: int, generated_column: int, original_line: int, original_column: int, source_file: string}> */ protected $mappings = []; /** * Array of contents map * * @var array */ protected $contentsMap = []; /** * File to content map * * @var array<string, string> */ protected $sources = []; /** * @var array<string, int> */ protected $sourceKeys = []; /** * @var array * @phpstan-var array{sourceRoot: string, sourceMapFilename: string|null, sourceMapURL: string|null, sourceMapWriteTo: string|null, outputSourceFiles: bool, sourceMapRootpath: string, sourceMapBasepath: string} */ private $options; /** * @phpstan-param array{sourceRoot?: string, sourceMapFilename?: string|null, sourceMapURL?: string|null, sourceMapWriteTo?: string|null, outputSourceFiles?: bool, sourceMapRootpath?: string, sourceMapBasepath?: string} $options */ public function __construct(array $options = []) { $this->options = array_replace($this->defaultOptions, $options); $this->encoder = new Base64VLQ(); } /** * Adds a mapping * * @param int $generatedLine The line number in generated file * @param int $generatedColumn The column number in generated file * @param int $originalLine The line number in original file * @param int $originalColumn The column number in original file * @param string $sourceFile The original source file * * @return void */ public function addMapping($generatedLine, $generatedColumn, $originalLine, $originalColumn, $sourceFile) { $this->mappings[] = [ 'generated_line' => $generatedLine, 'generated_column' => $generatedColumn, 'original_line' => $originalLine, 'original_column' => $originalColumn, 'source_file' => $sourceFile ]; $this->sources[$sourceFile] = $sourceFile; } /** * Saves the source map to a file * * @param string $content The content to write * * @return string|null * * @throws \ScssPhp\ScssPhp\Exception\CompilerException If the file could not be saved * @deprecated */ public function saveMap($content) { $file = $this->options['sourceMapWriteTo']; assert($file !== null); $dir = \dirname($file); // directory does not exist if (! is_dir($dir)) { // FIXME: create the dir automatically? throw new CompilerException( sprintf('The directory "%s" does not exist. Cannot save the source map.', $dir) ); } // FIXME: proper saving, with dir write check! if (file_put_contents($file, $content) === false) { throw new CompilerException(sprintf('Cannot save the source map to "%s"', $file)); } return $this->options['sourceMapURL']; } /** * Generates the JSON source map * * @param string $prefix A prefix added in the output file, which needs to shift mappings * * @return string * * @see https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit# */ public function generateJson($prefix = '') { $sourceMap = []; $mappings = $this->generateMappings($prefix); // File version (always the first entry in the object) and must be a positive integer. $sourceMap['version'] = self::VERSION; // An optional name of the generated code that this source map is associated with. $file = $this->options['sourceMapFilename']; if ($file) { $sourceMap['file'] = $file; } // An optional source root, useful for relocating source files on a server or removing repeated values in the // 'sources' entry. This value is prepended to the individual entries in the 'source' field. $root = $this->options['sourceRoot']; if ($root) { $sourceMap['sourceRoot'] = $root; } // A list of original sources used by the 'mappings' entry. $sourceMap['sources'] = []; foreach ($this->sources as $sourceFilename) { $sourceMap['sources'][] = $this->normalizeFilename($sourceFilename); } // A list of symbol names used by the 'mappings' entry. $sourceMap['names'] = []; // A string with the encoded mapping data. $sourceMap['mappings'] = $mappings; if ($this->options['outputSourceFiles']) { // An optional list of source content, useful when the 'source' can't be hosted. // The contents are listed in the same order as the sources above. // 'null' may be used if some original sources should be retrieved by name. $sourceMap['sourcesContent'] = $this->getSourcesContent(); } // less.js compat fixes if (\count($sourceMap['sources']) && empty($sourceMap['sourceRoot'])) { unset($sourceMap['sourceRoot']); } $jsonSourceMap = json_encode($sourceMap, JSON_UNESCAPED_SLASHES); if (json_last_error() !== JSON_ERROR_NONE) { throw new \RuntimeException(json_last_error_msg()); } assert($jsonSourceMap !== false); return $jsonSourceMap; } /** * Returns the sources contents * * @return string[]|null */ protected function getSourcesContent() { if (empty($this->sources)) { return null; } $content = []; foreach ($this->sources as $sourceFile) { $content[] = file_get_contents($sourceFile); } return $content; } /** * Generates the mappings string * * @param string $prefix A prefix added in the output file, which needs to shift mappings * * @return string */ public function generateMappings($prefix = '') { if (! \count($this->mappings)) { return ''; } $prefixLines = substr_count($prefix, "\n"); $lastPrefixNewLine = strrpos($prefix, "\n"); $lastPrefixLineStart = false === $lastPrefixNewLine ? 0 : $lastPrefixNewLine + 1; $prefixColumn = strlen($prefix) - $lastPrefixLineStart; $this->sourceKeys = array_flip(array_keys($this->sources)); // group mappings by generated line number. $groupedMap = $groupedMapEncoded = []; foreach ($this->mappings as $m) { $groupedMap[$m['generated_line']][] = $m; } ksort($groupedMap); $lastGeneratedLine = $lastOriginalIndex = $lastOriginalLine = $lastOriginalColumn = 0; foreach ($groupedMap as $lineNumber => $lineMap) { if ($lineNumber > 1) { // The prefix only impacts the column for the first line of the original output $prefixColumn = 0; } $lineNumber += $prefixLines; while (++$lastGeneratedLine < $lineNumber) { $groupedMapEncoded[] = ';'; } $lineMapEncoded = []; $lastGeneratedColumn = 0; foreach ($lineMap as $m) { $generatedColumn = $m['generated_column'] + $prefixColumn; $mapEncoded = $this->encoder->encode($generatedColumn - $lastGeneratedColumn); $lastGeneratedColumn = $generatedColumn; // find the index if ($m['source_file']) { $index = $this->findFileIndex($m['source_file']); if ($index !== false) { $mapEncoded .= $this->encoder->encode($index - $lastOriginalIndex); $lastOriginalIndex = $index; // lines are stored 0-based in SourceMap spec version 3 $mapEncoded .= $this->encoder->encode($m['original_line'] - 1 - $lastOriginalLine); $lastOriginalLine = $m['original_line'] - 1; $mapEncoded .= $this->encoder->encode($m['original_column'] - $lastOriginalColumn); $lastOriginalColumn = $m['original_column']; } } $lineMapEncoded[] = $mapEncoded; } $groupedMapEncoded[] = implode(',', $lineMapEncoded) . ';'; } return rtrim(implode($groupedMapEncoded), ';'); } /** * Finds the index for the filename * * @param string $filename * * @return int|false */ protected function findFileIndex($filename) { return $this->sourceKeys[$filename]; } /** * Normalize filename * * @param string $filename * * @return string */ protected function normalizeFilename($filename) { $filename = $this->fixWindowsPath($filename); $rootpath = $this->options['sourceMapRootpath']; $basePath = $this->options['sourceMapBasepath']; // "Trim" the 'sourceMapBasepath' from the output filename. if (\strlen($basePath) && strpos($filename, $basePath) === 0) { $filename = substr($filename, \strlen($basePath)); } // Remove extra leading path separators. if (strpos($filename, '\\') === 0 || strpos($filename, '/') === 0) { $filename = substr($filename, 1); } return $rootpath . $filename; } /** * Fix windows paths * * @param string $path * @param bool $addEndSlash * * @return string */ public function fixWindowsPath($path, $addEndSlash = false) { $slash = ($addEndSlash) ? '/' : ''; if (! empty($path)) { $path = str_replace('\\', '/', $path); $path = rtrim($path, '/') . $slash; } return $path; } } PKBA#]�X�$��Msystem/helixultimate/vendor/scssphp/scssphp/src/SourceMap/TargetLineEntry.phpnu�[���<?php /** * SCSSPHP * * @copyright 2018-2020 Anthon Pang * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\SourceMap; /** * @internal */ final class TargetLineEntry { /** * @param \ArrayObject<int, TargetEntry> $entries */ public function __construct( public readonly int $line, public readonly \ArrayObject $entries, ) { } } PKBA#]��ݭ�Ksystem/helixultimate/vendor/scssphp/scssphp/src/SourceMap/SingleMapping.phpnu�[���<?php /** * SCSSPHP * * @copyright 2018-2020 Anthon Pang * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\SourceMap; use ScssPhp\ScssPhp\SourceMap\Builder\Entry; use SourceSpan\FileLocation; use SourceSpan\SourceFile; /** * @internal */ final class SingleMapping { /** * @var list<string> */ public readonly array $urls; /** * The {@see SourceFile}s to which the entries in {@see $lines} refer. * * This is in the same order as {@see $urls}. If this was constructed using * {@see SingleMapping::fromEntries()}, this contains files from any {@see FileLocation}s * used to build the mapping. * * Files whose contents aren't available are `null`. * * @var list<SourceFile|null> */ public readonly array $files; /** * Entries indicating the beginning of each span. * * @var list<TargetLineEntry> */ public readonly array $lines; /** * Url of the target file. */ public ?string $targetUrl = null; /** * Source root prepended to all entries in {@see $urls}. */ public ?string $sourceRoot = null; /** * @param list<SourceFile|null> $files * @param list<string> $urls * @param list<TargetLineEntry> $lines */ private function __construct(array $files, array $urls, array $lines) { $this->urls = $urls; $this->files = $files; $this->lines = $lines; } /** * @param Entry[] $sourceEntries */ public static function fromEntries(array $sourceEntries): self { usort($sourceEntries, fn (Entry $a, Entry $b) => $a->compareTo($b)); $lines = []; // Indices associated with file urls that will be part of the source map. We // rely on map order so that `array_keys($url)[$urls[$u]] === $u` $urls = []; // The file for each URL, indexed by $urls' values. $files = []; $lineNum = null; $targetEntries = null; foreach ($sourceEntries as $sourceEntry) { if ($lineNum === null || $sourceEntry->target->getLine() > $lineNum) { $lineNum = $sourceEntry->target->getLine(); $targetEntries = new \ArrayObject(); $lines[] = new TargetLineEntry($lineNum, $targetEntries); } $sourceUrl = $sourceEntry->source->getSourceUrl(); $urlId = $urls[$sourceUrl?->toString() ?? ''] ??= \count($urls); if ($sourceEntry->source instanceof FileLocation) { $files[$urlId] ??= $sourceEntry->source->getFile(); } $targetEntries[] = new TargetEntry($sourceEntry->target->getColumn(), $urlId, $sourceEntry->source->getLine(), $sourceEntry->source->getColumn()); } return new self(array_values(array_map(fn (int $i) => $files[$i] ?? null, $urls)), array_keys($urls), $lines); } /** * Encodes the Mapping mappings as a json map. * * If $includeSourceContents is `true`, this includes the source file * contents from {@see $files} in the map if possible. * * @return array<string, mixed> */ public function toJson(bool $includeSourceContents = false): array { $buff = ''; $line = 0; $column = 0; $srcLine = 0; $srcColumn = 0; $srcUrlId = 0; $first = true; foreach ($this->lines as $entry) { $nextLine = $entry->line; if ($nextLine > $line) { for ($i = $line; $i < $nextLine; $i++) { $buff .= ';'; } $line = $nextLine; $column = 0; $first = true; } foreach ($entry->entries as $segment) { if (!$first) { $buff .= ','; } $first = false; $buff .= Base64VLQ::encode($segment->column - $column); $column = $segment->column; // Encoding can be just the column offset if there is no source // information. $newUrlId = $segment->sourceUrlId; if ($newUrlId === null) { continue; } \assert($segment->sourceLine !== null); \assert($segment->sourceColumn !== null); $buff .= Base64VLQ::encode($newUrlId - $srcUrlId); $srcUrlId = $newUrlId; $buff .= Base64VLQ::encode($segment->sourceLine - $srcLine); $srcLine = $segment->sourceLine; $buff .= Base64VLQ::encode($segment->sourceColumn - $srcColumn); $srcColumn = $segment->sourceColumn; } } $result = [ 'version' => 3, 'sourceRoot' => $this->sourceRoot ?? '', 'sources' => $this->urls, 'names' => [], 'mappings' => $buff, ]; if ($this->targetUrl !== null) { $result['file'] = $this->targetUrl; } if ($includeSourceContents) { $result['sourcesContent'] = array_map(fn (?SourceFile $file) => $file?->getText(0), $this->files); } return $result; } /** * Returns a new mapping with {@see $urls} transformed by $callback. * * @param callable(string): string $callback */ public function mapUrls(callable $callback): self { $newUrls = array_map($callback, $this->urls); $new = new self($this->files, $newUrls, $this->lines); $new->targetUrl = $this->targetUrl; $new->sourceRoot = $this->sourceRoot; return $new; } } PKBA#]]�K�U�U?system/helixultimate/vendor/scssphp/scssphp/src/Node/Number.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Node; use ScssPhp\ScssPhp\Compiler; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Node; use ScssPhp\ScssPhp\Type; use ScssPhp\ScssPhp\Util\NumberUtil; /** * Dimension + optional units * * {@internal * This is a work-in-progress. * * The \ArrayAccess interface is temporary until the migration is complete. * }} * * @author Anthon Pang <anthon.pang@gmail.com> * * @template-implements \ArrayAccess<int, mixed> */ final class Number extends Node implements \ArrayAccess, \JsonSerializable { const PRECISION = 10; /** * @see http://www.w3.org/TR/2012/WD-css3-values-20120308/ * * @var array * @phpstan-var array<string, array<string, float|int>> */ private static $unitTable = [ 'in' => [ 'in' => 1, 'pc' => 6, 'pt' => 72, 'px' => 96, 'cm' => 2.54, 'mm' => 25.4, 'q' => 101.6, ], 'turn' => [ 'deg' => 360, 'grad' => 400, 'rad' => 6.28318530717958647692528676, // 2 * M_PI 'turn' => 1, ], 's' => [ 's' => 1, 'ms' => 1000, ], 'Hz' => [ 'Hz' => 1, 'kHz' => 0.001, ], 'dpi' => [ 'dpi' => 1, 'dpcm' => 1 / 2.54, 'dppx' => 1 / 96, ], ]; /** * @var int|float */ private $dimension; /** * @var string[] * @phpstan-var list<string> */ private $numeratorUnits; /** * @var string[] * @phpstan-var list<string> */ private $denominatorUnits; /** * Initialize number * * @param int|float $dimension * @param string[]|string $numeratorUnits * @param string[] $denominatorUnits * * @phpstan-param list<string>|string $numeratorUnits * @phpstan-param list<string> $denominatorUnits */ public function __construct($dimension, $numeratorUnits, array $denominatorUnits = []) { if (is_string($numeratorUnits)) { $numeratorUnits = $numeratorUnits ? [$numeratorUnits] : []; } elseif (isset($numeratorUnits['numerator_units'], $numeratorUnits['denominator_units'])) { $denominatorUnits = $numeratorUnits['denominator_units']; $numeratorUnits = $numeratorUnits['numerator_units']; } $this->dimension = $dimension; $this->numeratorUnits = $numeratorUnits; $this->denominatorUnits = $denominatorUnits; } /** * @return float|int */ public function getDimension() { return $this->dimension; } /** * @return list<string> */ public function getNumeratorUnits() { return $this->numeratorUnits; } /** * @return list<string> */ public function getDenominatorUnits() { return $this->denominatorUnits; } /** * @return mixed */ #[\ReturnTypeWillChange] public function jsonSerialize() { // Passing a compiler instance makes the method output a Sass representation instead of a CSS one, supporting full units. return $this->output(new Compiler()); } /** * @return bool */ #[\ReturnTypeWillChange] public function offsetExists($offset) { if ($offset === -3) { return ! \is_null($this->sourceColumn); } if ($offset === -2) { return ! \is_null($this->sourceLine); } if ( $offset === -1 || $offset === 0 || $offset === 1 || $offset === 2 ) { return true; } return false; } /** * @return mixed */ #[\ReturnTypeWillChange] public function offsetGet($offset) { switch ($offset) { case -3: return $this->sourceColumn; case -2: return $this->sourceLine; case -1: return $this->sourceIndex; case 0: return Type::T_NUMBER; case 1: return $this->dimension; case 2: return array('numerator_units' => $this->numeratorUnits, 'denominator_units' => $this->denominatorUnits); } } /** * @return void */ #[\ReturnTypeWillChange] public function offsetSet($offset, $value) { throw new \BadMethodCallException('Number is immutable'); } /** * @return void */ #[\ReturnTypeWillChange] public function offsetUnset($offset) { throw new \BadMethodCallException('Number is immutable'); } /** * Returns true if the number is unitless * * @return bool */ public function unitless() { return \count($this->numeratorUnits) === 0 && \count($this->denominatorUnits) === 0; } /** * Returns true if the number has any units * * @return bool */ public function hasUnits() { return !$this->unitless(); } /** * Checks whether the number has exactly this unit * * @param string $unit * * @return bool */ public function hasUnit($unit) { return \count($this->numeratorUnits) === 1 && \count($this->denominatorUnits) === 0 && $this->numeratorUnits[0] === $unit; } /** * Returns unit(s) as the product of numerator units divided by the product of denominator units * * @return string */ public function unitStr() { if ($this->unitless()) { return ''; } return self::getUnitString($this->numeratorUnits, $this->denominatorUnits); } /** * @param float|int $min * @param float|int $max * @param string|null $name * * @return float * @throws SassScriptException */ public function valueInRange($min, $max, $name = null) { return NumberUtil::fuzzyCheckRange($this->dimension, $min, $max) ?? throw SassScriptException::forArgument(sprintf('Expected %s to be within %s%s and %s%3$s.', $this, $min, $this->unitStr(), $max), $name); } /** * @param float|int $min * @param float|int $max * @param string $name * @param string $unit * * @return float * @throws SassScriptException * * @internal */ public function valueInRangeWithUnit($min, $max, $name, $unit) { return NumberUtil::fuzzyCheckRange($this->dimension, $min, $max) ?? throw SassScriptException::forArgument(sprintf('Expected %s to be within %s%s and %s%3$s.', $this, $min, $unit, $max), $name); } /** * @param string|null $varName * * @return void */ public function assertNoUnits($varName = null) { if ($this->unitless()) { return; } throw SassScriptException::forArgument(sprintf('Expected %s to have no units.', $this), $varName); } /** * @param string $unit * @param string|null $varName * * @return void */ public function assertUnit($unit, $varName = null) { if ($this->hasUnit($unit)) { return; } throw SassScriptException::forArgument(sprintf('Expected %s to have unit "%s".', $this, $unit), $varName); } /** * @param Number $other * * @return void */ public function assertSameUnitOrUnitless(Number $other) { if ($other->unitless()) { return; } if ($this->numeratorUnits === $other->numeratorUnits && $this->denominatorUnits === $other->denominatorUnits) { return; } throw new SassScriptException(sprintf( 'Incompatible units %s and %s.', self::getUnitString($this->numeratorUnits, $this->denominatorUnits), self::getUnitString($other->numeratorUnits, $other->denominatorUnits) )); } /** * Returns a copy of this number, converted to the units represented by $newNumeratorUnits and $newDenominatorUnits. * * This does not throw an error if this number is unitless and * $newNumeratorUnits/$newDenominatorUnits are not empty, or vice versa. Instead, * it treats all unitless numbers as convertible to and from all units without * changing the value. * * @param string[] $newNumeratorUnits * @param string[] $newDenominatorUnits * * @return Number * * @phpstan-param list<string> $newNumeratorUnits * @phpstan-param list<string> $newDenominatorUnits * * @throws SassScriptException if this number's units are not compatible with $newNumeratorUnits and $newDenominatorUnits */ public function coerce(array $newNumeratorUnits, array $newDenominatorUnits) { return new Number($this->valueInUnits($newNumeratorUnits, $newDenominatorUnits), $newNumeratorUnits, $newDenominatorUnits); } /** * @param Number $other * * @return bool */ public function isComparableTo(Number $other) { if ($this->unitless() || $other->unitless()) { return true; } try { $this->greaterThan($other); return true; } catch (SassScriptException $e) { return false; } } /** * @param Number $other * * @return bool */ public function lessThan(Number $other) { return $this->coerceUnits($other, function ($num1, $num2) { return $num1 < $num2; }); } /** * @param Number $other * * @return bool */ public function lessThanOrEqual(Number $other) { return $this->coerceUnits($other, function ($num1, $num2) { return $num1 <= $num2; }); } /** * @param Number $other * * @return bool */ public function greaterThan(Number $other) { return $this->coerceUnits($other, function ($num1, $num2) { return $num1 > $num2; }); } /** * @param Number $other * * @return bool */ public function greaterThanOrEqual(Number $other) { return $this->coerceUnits($other, function ($num1, $num2) { return $num1 >= $num2; }); } /** * @param Number $other * * @return Number */ public function plus(Number $other) { return $this->coerceNumber($other, function ($num1, $num2) { return $num1 + $num2; }); } /** * @param Number $other * * @return Number */ public function minus(Number $other) { return $this->coerceNumber($other, function ($num1, $num2) { return $num1 - $num2; }); } /** * @return Number */ public function unaryMinus() { return new Number(-$this->dimension, $this->numeratorUnits, $this->denominatorUnits); } /** * @param Number $other * * @return Number */ public function modulo(Number $other) { return $this->coerceNumber($other, function ($num1, $num2) { if ($num2 == 0) { return NAN; } $result = fmod($num1, $num2); if ($result == 0) { return 0; } if ($num2 < 0 xor $num1 < 0) { $result += $num2; } return $result; }); } /** * @param Number $other * * @return Number */ public function times(Number $other) { return $this->multiplyUnits($this->dimension * $other->dimension, $this->numeratorUnits, $this->denominatorUnits, $other->numeratorUnits, $other->denominatorUnits); } /** * @param Number $other * * @return Number */ public function dividedBy(Number $other) { if ($other->dimension == 0) { if ($this->dimension == 0) { $value = NAN; } elseif ($this->dimension > 0) { $value = INF; } else { $value = -INF; } } else { $value = $this->dimension / $other->dimension; } return $this->multiplyUnits($value, $this->numeratorUnits, $this->denominatorUnits, $other->denominatorUnits, $other->numeratorUnits); } /** * @param Number $other * * @return bool */ public function equals(Number $other) { // Unitless numbers are convertable to unit numbers, but not equal, so we special-case unitless here. if ($this->unitless() !== $other->unitless()) { return false; } // In Sass, neither NaN nor Infinity are equal to themselves, while PHP defines INF==INF if (is_nan($this->dimension) || is_nan($other->dimension) || !is_finite($this->dimension) || !is_finite($other->dimension)) { return false; } if ($this->unitless()) { return round($this->dimension, self::PRECISION) == round($other->dimension, self::PRECISION); } try { return $this->coerceUnits($other, function ($num1, $num2) { return round($num1, self::PRECISION) == round($num2, self::PRECISION); }); } catch (SassScriptException $e) { return false; } } /** * Output number * * @param \ScssPhp\ScssPhp\Compiler $compiler * * @return string */ public function output(?Compiler $compiler = null) { $dimension = round($this->dimension, self::PRECISION); if (is_nan($dimension)) { return 'NaN'; } if ($dimension === INF) { return 'Infinity'; } if ($dimension === -INF) { return '-Infinity'; } if ($compiler) { $unit = $this->unitStr(); } elseif (isset($this->numeratorUnits[0])) { $unit = $this->numeratorUnits[0]; } else { $unit = ''; } $dimension = number_format($dimension, self::PRECISION, '.', ''); return rtrim(rtrim($dimension, '0'), '.') . $unit; } /** * {@inheritdoc} */ public function __toString() { return $this->output(); } /** * @param Number $other * @param callable $operation * * @return Number * * @phpstan-param callable(int|float, int|float): (int|float) $operation */ private function coerceNumber(Number $other, $operation) { $result = $this->coerceUnits($other, $operation); if (!$this->unitless()) { return new Number($result, $this->numeratorUnits, $this->denominatorUnits); } return new Number($result, $other->numeratorUnits, $other->denominatorUnits); } /** * @param Number $other * @param callable $operation * * @return mixed * * @phpstan-template T * @phpstan-param callable(int|float, int|float): T $operation * @phpstan-return T */ private function coerceUnits(Number $other, $operation) { if (!$this->unitless()) { $num1 = $this->dimension; $num2 = $other->valueInUnits($this->numeratorUnits, $this->denominatorUnits); } else { $num1 = $this->valueInUnits($other->numeratorUnits, $other->denominatorUnits); $num2 = $other->dimension; } return \call_user_func($operation, $num1, $num2); } /** * @param string[] $numeratorUnits * @param string[] $denominatorUnits * * @return int|float * * @phpstan-param list<string> $numeratorUnits * @phpstan-param list<string> $denominatorUnits * * @throws SassScriptException if this number's units are not compatible with $numeratorUnits and $denominatorUnits */ private function valueInUnits(array $numeratorUnits, array $denominatorUnits) { if ( $this->unitless() || (\count($numeratorUnits) === 0 && \count($denominatorUnits) === 0) || ($this->numeratorUnits === $numeratorUnits && $this->denominatorUnits === $denominatorUnits) ) { return $this->dimension; } $value = $this->dimension; $oldNumerators = $this->numeratorUnits; foreach ($numeratorUnits as $newNumerator) { foreach ($oldNumerators as $key => $oldNumerator) { $conversionFactor = self::getConversionFactor($newNumerator, $oldNumerator); if (\is_null($conversionFactor)) { continue; } $value *= $conversionFactor; unset($oldNumerators[$key]); continue 2; } throw new SassScriptException(sprintf( 'Incompatible units %s and %s.', self::getUnitString($this->numeratorUnits, $this->denominatorUnits), self::getUnitString($numeratorUnits, $denominatorUnits) )); } $oldDenominators = $this->denominatorUnits; foreach ($denominatorUnits as $newDenominator) { foreach ($oldDenominators as $key => $oldDenominator) { $conversionFactor = self::getConversionFactor($newDenominator, $oldDenominator); if (\is_null($conversionFactor)) { continue; } $value /= $conversionFactor; unset($oldDenominators[$key]); continue 2; } throw new SassScriptException(sprintf( 'Incompatible units %s and %s.', self::getUnitString($this->numeratorUnits, $this->denominatorUnits), self::getUnitString($numeratorUnits, $denominatorUnits) )); } if (\count($oldNumerators) || \count($oldDenominators)) { throw new SassScriptException(sprintf( 'Incompatible units %s and %s.', self::getUnitString($this->numeratorUnits, $this->denominatorUnits), self::getUnitString($numeratorUnits, $denominatorUnits) )); } return $value; } /** * @param int|float $value * @param string[] $numerators1 * @param string[] $denominators1 * @param string[] $numerators2 * @param string[] $denominators2 * * @return Number * * @phpstan-param list<string> $numerators1 * @phpstan-param list<string> $denominators1 * @phpstan-param list<string> $numerators2 * @phpstan-param list<string> $denominators2 */ private function multiplyUnits($value, array $numerators1, array $denominators1, array $numerators2, array $denominators2) { $newNumerators = array(); foreach ($numerators1 as $numerator) { foreach ($denominators2 as $key => $denominator) { $conversionFactor = self::getConversionFactor($numerator, $denominator); if (\is_null($conversionFactor)) { continue; } $value /= $conversionFactor; unset($denominators2[$key]); continue 2; } $newNumerators[] = $numerator; } foreach ($numerators2 as $numerator) { foreach ($denominators1 as $key => $denominator) { $conversionFactor = self::getConversionFactor($numerator, $denominator); if (\is_null($conversionFactor)) { continue; } $value /= $conversionFactor; unset($denominators1[$key]); continue 2; } $newNumerators[] = $numerator; } $newDenominators = array_values(array_merge($denominators1, $denominators2)); return new Number($value, $newNumerators, $newDenominators); } /** * Returns the number of [unit1]s per [unit2]. * * Equivalently, `1unit1 * conversionFactor(unit1, unit2) = 1unit2`. * * @param string $unit1 * @param string $unit2 * * @return float|int|null */ private static function getConversionFactor($unit1, $unit2) { if ($unit1 === $unit2) { return 1; } foreach (self::$unitTable as $unitVariants) { if (isset($unitVariants[$unit1]) && isset($unitVariants[$unit2])) { return $unitVariants[$unit1] / $unitVariants[$unit2]; } } return null; } /** * Returns unit(s) as the product of numerator units divided by the product of denominator units * * @param string[] $numerators * @param string[] $denominators * * @phpstan-param list<string> $numerators * @phpstan-param list<string> $denominators * * @return string */ private static function getUnitString(array $numerators, array $denominators) { if (!\count($numerators)) { if (\count($denominators) === 0) { return 'no units'; } if (\count($denominators) === 1) { return $denominators[0] . '^-1'; } return '(' . implode('*', $denominators) . ')^-1'; } return implode('*', $numerators) . (\count($denominators) ? '/' . implode('*', $denominators) : ''); } } PKBA#]͐!��Csystem/helixultimate/vendor/scssphp/scssphp/src/Block/EachBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Type; /** * @internal */ class EachBlock extends Block { /** * @var string[] */ public $vars = []; /** * @var array */ public $list; public function __construct() { $this->type = Type::T_EACH; } } PKBA#]�k|@ZZBsystem/helixultimate/vendor/scssphp/scssphp/src/Block/ForBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Type; /** * @internal */ class ForBlock extends Block { /** * @var string */ public $var; /** * @var array */ public $start; /** * @var array */ public $end; /** * @var bool */ public $until; public function __construct() { $this->type = Type::T_FOR; } } PKBA#]n&�3Hsystem/helixultimate/vendor/scssphp/scssphp/src/Block/DirectiveBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Type; /** * @internal */ class DirectiveBlock extends Block { /** * @var string|array */ public $name; /** * @var string|array|null */ public $value; public function __construct() { $this->type = Type::T_DIRECTIVE; } } PKBA#]5��xEsystem/helixultimate/vendor/scssphp/scssphp/src/Block/AtRootBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Type; /** * @internal */ class AtRootBlock extends Block { /** * @var array|null */ public $selector; /** * @var array|null */ public $with; public function __construct() { $this->type = Type::T_AT_ROOT; } } PKBA#]�QY,44Fsystem/helixultimate/vendor/scssphp/scssphp/src/Block/ContentBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Compiler\Environment; use ScssPhp\ScssPhp\Type; /** * @internal */ class ContentBlock extends Block { /** * @var array|null */ public $child; /** * @var Environment|null */ public $scope; public function __construct() { $this->type = Type::T_INCLUDE; } } PKBA#]\n�Dsystem/helixultimate/vendor/scssphp/scssphp/src/Block/MediaBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Type; /** * @internal */ class MediaBlock extends Block { /** * @var string|array|null */ public $value; /** * @var array|null */ public $queryList; public function __construct() { $this->type = Type::T_MEDIA; } } PKBA#]~�<%Msystem/helixultimate/vendor/scssphp/scssphp/src/Block/NestedPropertyBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Type; /** * @internal */ class NestedPropertyBlock extends Block { /** * @var bool */ public $hasValue; /** * @var array */ public $prefix; public function __construct() { $this->type = Type::T_NESTED_PROPERTY; } } PKBA#]%}Π��Dsystem/helixultimate/vendor/scssphp/scssphp/src/Block/WhileBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Type; /** * @internal */ class WhileBlock extends Block { /** * @var array */ public $cond; public function __construct() { $this->type = Type::T_WHILE; } } PKBA#]Ǩ)�zzGsystem/helixultimate/vendor/scssphp/scssphp/src/Block/CallableBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Compiler\Environment; /** * @internal */ class CallableBlock extends Block { /** * @var string */ public $name; /** * @var array|null */ public $args; /** * @var Environment|null */ public $parentEnv; /** * @param string $type */ public function __construct($type) { $this->type = $type; } } PKBA#]�ypĈ�Csystem/helixultimate/vendor/scssphp/scssphp/src/Block/ElseBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Type; /** * @internal */ class ElseBlock extends Block { public function __construct() { $this->type = Type::T_ELSE; } } PKBA#]�)�Asystem/helixultimate/vendor/scssphp/scssphp/src/Block/IfBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Type; /** * @internal */ class IfBlock extends Block { /** * @var array */ public $cond; /** * @var array<ElseifBlock|ElseBlock> */ public $cases = []; public function __construct() { $this->type = Type::T_IF; } } PKBA#]�R{��Esystem/helixultimate/vendor/scssphp/scssphp/src/Block/ElseifBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Type; /** * @internal */ class ElseifBlock extends Block { /** * @var array */ public $cond; public function __construct() { $this->type = Type::T_ELSEIF; } } PKBA#]@�N�M M Gsystem/helixultimate/vendor/scssphp/scssphp/src/Logger/StreamLogger.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Logger; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\StackTrace\Trace; use ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Util\Path; use SourceSpan\FileSpan; use SourceSpan\SourceSpan; /** * A logger that prints to a PHP stream (for instance stderr) */ final class StreamLogger implements LoggerInterface { /** * @var resource */ private $stream; private bool $closeOnDestruct; /** * @param resource $stream A stream resource * @param bool $closeOnDestruct If true, takes ownership of the stream and close it on destruct to avoid leaks. */ public function __construct($stream, bool $closeOnDestruct = false) { $this->stream = $stream; $this->closeOnDestruct = $closeOnDestruct; } /** * @internal */ public function __destruct() { if ($this->closeOnDestruct) { fclose($this->stream); } } public function warn(string $message, ?Deprecation $deprecation = null, ?FileSpan $span = null, ?Trace $trace = null): void { $prefix = ($deprecation !== null ? 'DEPRECATION ' : '') . 'WARNING'; if ($span === null) { $formattedMessage = ': ' . $message; } elseif ($trace !== null) { // If there's a span and a trace, the span's location information is // probably duplicated in the trace, so we just use it for highlighting. $formattedMessage = ': ' . $message . "\n\n" . $span->highlight(); } else { $formattedMessage = ' on ' . $span->message("\n" . $message); } if ($trace !== null) { $formattedMessage .= "\n" . Util::indent(rtrim($trace->getFormattedTrace()), 4); } fwrite($this->stream, $prefix . $formattedMessage . "\n\n"); } public function debug(string $message, SourceSpan $span): void { $url = $span->getStart()->getSourceUrl() === null ? '-' : Path::prettyUri($span->getStart()->getSourceUrl()); $line = $span->getStart()->getLine() + 1; $location = "$url:$line "; fwrite($this->stream, \sprintf("%sDEBUG: %s", $location, $message) . "\n"); } } PKBA#]�BOߏ�Jsystem/helixultimate/vendor/scssphp/scssphp/src/Logger/LoggerInterface.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Logger; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\StackTrace\Trace; use SourceSpan\FileSpan; use SourceSpan\SourceSpan; /** * Interface implemented by loggers for warnings and debug messages. * * The official Sass implementation recommends that loggers report the * messages immediately rather than waiting for the end of the * compilation, to provide a better debugging experience when the * compilation does not end (error or infinite loop after the warning * for instance). */ interface LoggerInterface { /** * Emits a warning with the given message. * * If $span is passed, it's the location in the Sass source that generated * the warning. If $trace is passed, it's the Sass stack trace when the * warning was issued. * If $deprecation is non-null, it indicates that this is a deprecation * warning. Implementations should surface all this information to * the end user. */ public function warn(string $message, ?Deprecation $deprecation = null, ?FileSpan $span = null, ?Trace $trace = null): void; /** * Emits a debugging message associated with the given span. */ public function debug(string $message, SourceSpan $span): void; } PKBA#]��8Vsystem/helixultimate/vendor/scssphp/scssphp/src/Logger/DeprecationProcessingLogger.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Logger; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Exception\SimpleSassException; use ScssPhp\ScssPhp\Exception\SimpleSassRuntimeException; use ScssPhp\ScssPhp\StackTrace\Trace; use SourceSpan\FileSpan; use SourceSpan\SourceSpan; /** * A logger that wraps an inner logger to have special handling for * deprecation warnings, silencing, making fatal, enabling future, and/or * limiting repetition based on its inputs. * * @internal */ final class DeprecationProcessingLogger implements LoggerInterface { private const MAX_REPETITIONS = 5; /** * A map of how many times each deprecation has been emitted by this logger. * * @var array<value-of<Deprecation>, int> */ private array $warningCounts = []; /** * Deprecation warnings of these types will be ignored. * * @var Deprecation[] */ private readonly array $silenceDeprecations; /** * Deprecation warnings of one of these types will cause an error to be * thrown. * * Future deprecations in this list will still cause an error even if they * are not also in {@see $futureDeprecations}. * * @var Deprecation[] */ private readonly array $fatalDeprecations; /** * Future deprecations that the user has explicitly opted into. * * @var Deprecation[] */ private readonly array $futureDeprecations; /** * @param Deprecation[] $silenceDeprecations * @param Deprecation[] $fatalDeprecations * @param Deprecation[] $futureDeprecations */ public function __construct( private readonly LoggerInterface $inner, array $silenceDeprecations, array $fatalDeprecations, array $futureDeprecations, private readonly bool $limitRepetition = true, ) { $this->silenceDeprecations = $silenceDeprecations; $this->futureDeprecations = $futureDeprecations; $this->fatalDeprecations = $fatalDeprecations; } /** * Warns if any of the deprecations options are incompatible or unnecessary. */ public function validate(): void { foreach ($this->fatalDeprecations as $deprecation) { if ($deprecation->isFuture() && !\in_array($deprecation, $this->futureDeprecations, true)) { $this->warn("Future $deprecation->value deprecation must be enabled before it can be made fatal."); } elseif ($deprecation->getObsoleteIn() !== null) { $this->warn("$deprecation->value deprecation is obsolete, so does not need to be made fatal."); } elseif (\in_array($deprecation, $this->silenceDeprecations, true)) { $this->warn("Ignoring setting to silence $deprecation->value deprecation, since it has also been made fatal."); } } foreach ($this->silenceDeprecations as $deprecation) { if ($deprecation === Deprecation::userAuthored) { $this->warn('User-authored deprecations should not be silenced.'); } elseif ($deprecation->getObsoleteIn() !== null) { $this->warn("$deprecation->value deprecation is obsolete. If you were previously silencing it, your code may now behave in unexpected ways."); } elseif ($deprecation->isFuture() && \in_array($deprecation, $this->futureDeprecations, true)) { $this->warn("Conflicting options for future $deprecation->value deprecation cancel each other out."); } elseif ($deprecation->isFuture()) { $this->warn("Future $deprecation->value deprecation is not yet active, so silencing it is unnecessary."); } } foreach ($this->futureDeprecations as $deprecation) { if (!$deprecation->isFuture()) { $this->warn("$deprecation->value is not a future deprecation, so it does not need to be explicitly enabled."); } } } public function warn(string $message, ?Deprecation $deprecation = null, ?FileSpan $span = null, ?Trace $trace = null): void { if ($deprecation !== null) { $this->handleDeprecation($deprecation, $message, $span, $trace); } else { $this->inner->warn($message, $deprecation, $span, $trace); } } /** * Processes a deprecation warning. * * If $deprecation is in {@see $fatalDeprecations}, this shows an error. * * If it's a future deprecation that hasn't been opted into or it's a * deprecation that's already been warned for {@see self::MAX_REPETITIONS} times and * {@see limitRepetitions} is true, the warning is dropped. * * Otherwise, this is passed on to {@see warn}. */ private function handleDeprecation(Deprecation $deprecation, string $message, ?FileSpan $span = null, ?Trace $trace = null): void { if ($deprecation->isFuture() && !\in_array($deprecation, $this->futureDeprecations, true)) { return; } if (\in_array($deprecation, $this->fatalDeprecations, true)) { $message .= "\n\nThis is only an error because you've set the {$deprecation->value} deprecation to be fatal.\nRemove this setting if you need to keep using this feature."; if ($span !== null && $trace !== null) { throw new SimpleSassRuntimeException($message, $span, $trace); } if ($span !== null) { throw new SimpleSassException($message, $span); } throw new SassScriptException($message); } if (\in_array($deprecation, $this->silenceDeprecations, true)) { return; } if ($this->limitRepetition) { $count = $this->warningCounts[$deprecation->value] = ($this->warningCounts[$deprecation->value] ?? 0) + 1; if ($count > self::MAX_REPETITIONS) { return; } } $this->inner->warn($message, $deprecation, $span, $trace); } public function debug(string $message, SourceSpan $span): void { $this->inner->debug($message, $span); } /** * Prints a warning indicating the number of deprecation warnings that were * omitted due to repetition. */ public function summarize(): void { $total = 0; foreach ($this->warningCounts as $count) { if ($count > self::MAX_REPETITIONS) { $total += $count - self::MAX_REPETITIONS; } } if ($total > 0) { $this->inner->warn("$total repetitive deprecation warnings omitted.\nRun in verbose mode to see all warnings."); } } } PKBA#]��Sd��Fsystem/helixultimate/vendor/scssphp/scssphp/src/Logger/QuietLogger.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Logger; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\StackTrace\Trace; use SourceSpan\FileSpan; use SourceSpan\SourceSpan; /** * A logger that silently ignores all messages. */ final class QuietLogger implements LoggerInterface { public function warn(string $message, ?Deprecation $deprecation = null, ?FileSpan $span = null, ?Trace $trace = null): void { } public function debug(string $message, SourceSpan $span): void { } } PKBA#]�墕Fsystem/helixultimate/vendor/scssphp/scssphp/src/Formatter/Expanded.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Formatter; use ScssPhp\ScssPhp\Formatter; /** * Expanded formatter * * @author Leaf Corcoran <leafot@gmail.com> * * @internal */ class Expanded extends Formatter { /** * {@inheritdoc} */ public function __construct() { $this->indentLevel = 0; $this->indentChar = ' '; $this->break = "\n"; $this->open = ' {'; $this->close = '}'; $this->tagSeparator = ', '; $this->assignSeparator = ': '; $this->keepSemicolons = true; } /** * {@inheritdoc} */ protected function indentStr() { return str_repeat($this->indentChar, $this->indentLevel); } /** * {@inheritdoc} */ protected function blockLines(OutputBlock $block) { $inner = $this->indentStr(); $glue = $this->break . $inner; foreach ($block->lines as $index => $line) { if (substr($line, 0, 2) === '/*') { $replacedLine = preg_replace('/\r\n?|\n|\f/', $this->break, $line); assert($replacedLine !== null); $block->lines[$index] = $replacedLine; } } $this->write($inner . implode($glue, $block->lines)); if (empty($block->selectors) || ! empty($block->children)) { $this->write($this->break); } } } PKBA#]c�,���Hsystem/helixultimate/vendor/scssphp/scssphp/src/Formatter/Compressed.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Formatter; use ScssPhp\ScssPhp\Formatter; /** * Compressed formatter * * @author Leaf Corcoran <leafot@gmail.com> * * @internal */ class Compressed extends Formatter { /** * {@inheritdoc} */ public function __construct() { $this->indentLevel = 0; $this->indentChar = ' '; $this->break = ''; $this->open = '{'; $this->close = '}'; $this->tagSeparator = ','; $this->assignSeparator = ':'; $this->keepSemicolons = false; } /** * {@inheritdoc} */ public function blockLines(OutputBlock $block) { $inner = $this->indentStr(); $glue = $this->break . $inner; foreach ($block->lines as $index => $line) { if (substr($line, 0, 2) === '/*' && substr($line, 2, 1) !== '!') { unset($block->lines[$index]); } } $this->write($inner . implode($glue, $block->lines)); if (! empty($block->children)) { $this->write($this->break); } } /** * Output block selectors * * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block */ protected function blockSelectors(OutputBlock $block) { assert(! empty($block->selectors)); $inner = $this->indentStr(); $this->write( $inner . implode( $this->tagSeparator, str_replace([' > ', ' + ', ' ~ '], ['>', '+', '~'], $block->selectors) ) . $this->open . $this->break ); } } PKBA#]W�M�Dsystem/helixultimate/vendor/scssphp/scssphp/src/Formatter/Nested.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Formatter; use ScssPhp\ScssPhp\Formatter; use ScssPhp\ScssPhp\Type; /** * Nested formatter * * @author Leaf Corcoran <leafot@gmail.com> * * @deprecated since 1.4.0. Use the Expanded formatter instead. * * @internal */ class Nested extends Formatter { /** * @var int */ private $depth; /** * {@inheritdoc} */ public function __construct() { @trigger_error('The Nested formatter is deprecated since 1.4.0. Use the Expanded formatter instead.', E_USER_DEPRECATED); $this->indentLevel = 0; $this->indentChar = ' '; $this->break = "\n"; $this->open = ' {'; $this->close = ' }'; $this->tagSeparator = ', '; $this->assignSeparator = ': '; $this->keepSemicolons = true; } /** * {@inheritdoc} */ protected function indentStr() { $n = $this->depth - 1; return str_repeat($this->indentChar, max($this->indentLevel + $n, 0)); } /** * {@inheritdoc} */ protected function blockLines(OutputBlock $block) { $inner = $this->indentStr(); $glue = $this->break . $inner; foreach ($block->lines as $index => $line) { if (substr($line, 0, 2) === '/*') { $replacedLine = preg_replace('/\r\n?|\n|\f/', $this->break, $line); assert($replacedLine !== null); $block->lines[$index] = $replacedLine; } } $this->write($inner . implode($glue, $block->lines)); } /** * {@inheritdoc} */ protected function block(OutputBlock $block) { static $depths; static $downLevel; static $closeBlock; static $previousEmpty; static $previousHasSelector; if ($block->type === 'root') { $depths = [ 0 ]; $downLevel = ''; $closeBlock = ''; $this->depth = 0; $previousEmpty = false; $previousHasSelector = false; } $isMediaOrDirective = \in_array($block->type, [Type::T_DIRECTIVE, Type::T_MEDIA]); $isSupport = ($block->type === Type::T_DIRECTIVE && $block->selectors && strpos(implode('', $block->selectors), '@supports') !== false); while ($block->depth < end($depths) || ($block->depth == 1 && end($depths) == 1)) { array_pop($depths); $this->depth--; if ( ! $this->depth && ($block->depth <= 1 || (! $this->indentLevel && $block->type === Type::T_COMMENT)) && (($block->selectors && ! $isMediaOrDirective) || $previousHasSelector) ) { $downLevel = $this->break; } if (empty($block->lines) && empty($block->children)) { $previousEmpty = true; } } if (empty($block->lines) && empty($block->children)) { return; } $this->currentBlock = $block; if (! empty($block->lines) || (! empty($block->children) && ($this->depth < 1 || $isSupport))) { if ($block->depth > end($depths)) { if (! $previousEmpty || $this->depth < 1) { $this->depth++; $depths[] = $block->depth; } else { // keep the current depth unchanged but take the block depth as a new reference for following blocks array_pop($depths); $depths[] = $block->depth; } } } $previousEmpty = ($block->type === Type::T_COMMENT); $previousHasSelector = false; if (! empty($block->selectors)) { if ($closeBlock) { $this->write($closeBlock); $closeBlock = ''; } if ($downLevel) { $this->write($downLevel); $downLevel = ''; } $this->blockSelectors($block); $this->indentLevel++; } if (! empty($block->lines)) { if ($closeBlock) { $this->write($closeBlock); $closeBlock = ''; } if ($downLevel) { $this->write($downLevel); $downLevel = ''; } $this->blockLines($block); $closeBlock = $this->break; } if (! empty($block->children)) { if ($this->depth > 0 && ($isMediaOrDirective || ! $this->hasFlatChild($block))) { array_pop($depths); $this->depth--; $this->blockChildren($block); $this->depth++; $depths[] = $block->depth; } else { $this->blockChildren($block); } } // reclear to not be spoiled by children if T_DIRECTIVE if ($block->type === Type::T_DIRECTIVE) { $previousHasSelector = false; } if (! empty($block->selectors)) { $this->indentLevel--; if (! $this->keepSemicolons) { $this->strippedSemicolon = ''; } $this->write($this->close); $closeBlock = $this->break; if ($this->depth > 1 && ! empty($block->children)) { array_pop($depths); $this->depth--; } if (! $isMediaOrDirective) { $previousHasSelector = true; } } if ($block->type === 'root') { $this->write($this->break); } } /** * Block has flat child * * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block * * @return bool */ private function hasFlatChild($block) { foreach ($block->children as $child) { if (empty($child->selectors)) { return true; } } return false; } } PKBA#]˝��Esystem/helixultimate/vendor/scssphp/scssphp/src/Formatter/Compact.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Formatter; use ScssPhp\ScssPhp\Formatter; /** * Compact formatter * * @author Leaf Corcoran <leafot@gmail.com> * * @deprecated since 1.4.0. Use the Compressed formatter instead. * * @internal */ class Compact extends Formatter { /** * {@inheritdoc} */ public function __construct() { @trigger_error('The Compact formatter is deprecated since 1.4.0. Use the Compressed formatter instead.', E_USER_DEPRECATED); $this->indentLevel = 0; $this->indentChar = ''; $this->break = ''; $this->open = ' {'; $this->close = "}\n\n"; $this->tagSeparator = ','; $this->assignSeparator = ':'; $this->keepSemicolons = true; } /** * {@inheritdoc} */ public function indentStr() { return ' '; } } PKBA#]�x[ [ Csystem/helixultimate/vendor/scssphp/scssphp/src/Formatter/Debug.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Formatter; use ScssPhp\ScssPhp\Formatter; /** * Debug formatter * * @author Anthon Pang <anthon.pang@gmail.com> * * @deprecated since 1.4.0. * * @internal */ class Debug extends Formatter { /** * {@inheritdoc} */ public function __construct() { @trigger_error('The Debug formatter is deprecated since 1.4.0.', E_USER_DEPRECATED); $this->indentLevel = 0; $this->indentChar = ''; $this->break = "\n"; $this->open = ' {'; $this->close = ' }'; $this->tagSeparator = ', '; $this->assignSeparator = ': '; $this->keepSemicolons = true; } /** * {@inheritdoc} */ protected function indentStr() { return str_repeat(' ', $this->indentLevel); } /** * {@inheritdoc} */ protected function blockLines(OutputBlock $block) { $indent = $this->indentStr(); if (empty($block->lines)) { $this->write("{$indent}block->lines: []\n"); return; } foreach ($block->lines as $index => $line) { $this->write("{$indent}block->lines[{$index}]: $line\n"); } } /** * {@inheritdoc} */ protected function blockSelectors(OutputBlock $block) { $indent = $this->indentStr(); if (empty($block->selectors)) { $this->write("{$indent}block->selectors: []\n"); return; } foreach ($block->selectors as $index => $selector) { $this->write("{$indent}block->selectors[{$index}]: $selector\n"); } } /** * {@inheritdoc} */ protected function blockChildren(OutputBlock $block) { $indent = $this->indentStr(); if (empty($block->children)) { $this->write("{$indent}block->children: []\n"); return; } $this->indentLevel++; foreach ($block->children as $i => $child) { $this->block($child); } $this->indentLevel--; } /** * {@inheritdoc} */ protected function block(OutputBlock $block) { $indent = $this->indentStr(); $this->write("{$indent}block->type: {$block->type}\n" . "{$indent}block->depth: {$block->depth}\n"); $this->currentBlock = $block; $this->blockSelectors($block); $this->blockLines($block); $this->blockChildren($block); } } PKBA#]EQ#��Fsystem/helixultimate/vendor/scssphp/scssphp/src/Formatter/Crunched.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Formatter; use ScssPhp\ScssPhp\Formatter; /** * Crunched formatter * * @author Anthon Pang <anthon.pang@gmail.com> * * @deprecated since 1.4.0. Use the Compressed formatter instead. * * @internal */ class Crunched extends Formatter { /** * {@inheritdoc} */ public function __construct() { @trigger_error('The Crunched formatter is deprecated since 1.4.0. Use the Compressed formatter instead.', E_USER_DEPRECATED); $this->indentLevel = 0; $this->indentChar = ' '; $this->break = ''; $this->open = '{'; $this->close = '}'; $this->tagSeparator = ','; $this->assignSeparator = ':'; $this->keepSemicolons = false; } /** * {@inheritdoc} */ public function blockLines(OutputBlock $block) { $inner = $this->indentStr(); $glue = $this->break . $inner; foreach ($block->lines as $index => $line) { if (substr($line, 0, 2) === '/*') { unset($block->lines[$index]); } } $this->write($inner . implode($glue, $block->lines)); if (! empty($block->children)) { $this->write($this->break); } } /** * Output block selectors * * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block */ protected function blockSelectors(OutputBlock $block) { assert(! empty($block->selectors)); $inner = $this->indentStr(); $this->write( $inner . implode( $this->tagSeparator, str_replace([' > ', ' + ', ' ~ '], ['>', '+', '~'], $block->selectors) ) . $this->open . $this->break ); } } PKBA#]>ZLeeIsystem/helixultimate/vendor/scssphp/scssphp/src/Formatter/OutputBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Formatter; /** * Output block * * @author Anthon Pang <anthon.pang@gmail.com> * * @internal */ class OutputBlock { /** * @var string|null */ public $type; /** * @var int */ public $depth; /** * @var array|null */ public $selectors; /** * @var string[] */ public $lines; /** * @var OutputBlock[] */ public $children; /** * @var OutputBlock|null */ public $parent; /** * @var string|null */ public $sourceName; /** * @var int|null */ public $sourceLine; /** * @var int|null */ public $sourceColumn; } PKBA#]k�B�8system/helixultimate/vendor/scssphp/scssphp/src/Node.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; /** * Base node * * @author Anthon Pang <anthon.pang@gmail.com> * * @internal */ abstract class Node { /** * @var string */ public $type; /** * @var int */ public $sourceIndex; /** * @var int|null */ public $sourceLine; /** * @var int|null */ public $sourceColumn; } PKBA#]lvJBsystem/helixultimate/vendor/scssphp/scssphp/src/ValueConverter.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; use ScssPhp\ScssPhp\Collection\Map; use ScssPhp\ScssPhp\Logger\QuietLogger; use ScssPhp\ScssPhp\Node\Number; use ScssPhp\ScssPhp\Value\ListSeparator; use ScssPhp\ScssPhp\Value\SassBoolean; use ScssPhp\ScssPhp\Value\SassList; use ScssPhp\ScssPhp\Value\SassMap; use ScssPhp\ScssPhp\Value\SassNull; use ScssPhp\ScssPhp\Value\SassNumber; use ScssPhp\ScssPhp\Value\SassString; use ScssPhp\ScssPhp\Value\Value; final class ValueConverter { // Prevent instantiating it private function __construct() { } /** * Parses a value from a Scss source string. * * The returned value is guaranteed to be supported by the * Compiler methods for registering custom variables. No other * guarantee about it is provided. It should be considered * opaque values by the caller. */ public static function parseValue(string $source): Value { $value = null; $compiler = new Compiler(); $compiler->setLogger(new QuietLogger()); $compiler->registerFunction('scssphp-parse-value', function (array $arguments) use (&$value): Value { \assert(\count($arguments) === 1); \assert($arguments[0] instanceof Value); $value = $arguments[0]; return SassNull::create(); }, ['arg']); $scss = <<<SCSS a {b: scssphp-parse-value(($source))} SCSS; $compiler->compileString($scss); \assert($value !== null); return $value; } /** * Converts a PHP value to a Sass value * * The returned value is guaranteed to be supported by the * Compiler methods for registering custom variables. No other * guarantee about it is provided. It should be considered * opaque values by the caller. */ public static function fromPhp(mixed $value): Value { if ($value instanceof Value) { return $value; } if ($value instanceof Number) { return SassNumber::withUnits($value->getDimension(), $value->getNumeratorUnits(), $value->getDenominatorUnits()); } if ($value === null) { return SassNull::create(); } if ($value === true) { return SassBoolean::create(true); } if ($value === false) { return SassBoolean::create(false); } if ($value === '') { return new SassString(''); } if (\is_int($value) || \is_float($value)) { return SassNumber::create($value); } if (\is_string($value)) { return new SassString($value); } if (\is_array($value)) { if (array_is_list($value)) { $result = []; foreach ($value as $val) { $result[] = self::fromPhp($val); } return new SassList($result, \count($result) > 0 ? ListSeparator::COMMA : ListSeparator::UNDECIDED); } /** @var Map<Value> $map */ $map = new Map(); foreach ($value as $key => $val) { $map->put(new SassString($key), self::fromPhp($val)); } return SassMap::create($map); } throw new \InvalidArgumentException(sprintf('Cannot convert the value of type "%s" to a Sass value.', get_debug_type($value))); } } PKBA#]5�8system/helixultimate/vendor/scssphp/scssphp/src/Type.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; /** * Block/node types * * @author Anthon Pang <anthon.pang@gmail.com> */ final class Type { const T_COLOR = 'color'; /** * @internal */ const T_KEYWORD = 'keyword'; const T_LIST = 'list'; const T_MAP = 'map'; const T_NULL = 'null'; const T_NUMBER = 'number'; const T_STRING = 'string'; } PKBA#]R߅B��9system/helixultimate/vendor/scssphp/scssphp/src/Cache.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; use Exception; use ScssPhp\ScssPhp\Version; /** * The scss cache manager. * * In short: * * allow to put in cache/get from cache a generic result from a known operation on a generic dataset, * taking in account options that affects the result * * The cache manager is agnostic about data format and only the operation is expected to be described by string */ /** * SCSS cache * * @author Cedric Morin <cedric@yterium.com> * * @internal */ class Cache { const CACHE_VERSION = 1; /** * directory used for storing data * * @var string|false */ public static $cacheDir = false; /** * prefix for the storing data * * @var string */ public static $prefix = 'scssphp_'; /** * force a refresh : 'once' for refreshing the first hit on a cache only, true to never use the cache in this hit * * @var bool|string */ public static $forceRefresh = false; /** * specifies the number of seconds after which data cached will be seen as 'garbage' and potentially cleaned up * * @var int */ public static $gcLifetime = 604800; /** * array of already refreshed cache if $forceRefresh==='once' * * @var array<string, bool> */ protected static $refreshed = []; /** * Constructor * * @param array $options * * @phpstan-param array{cacheDir?: string, prefix?: string, forceRefresh?: string} $options */ public function __construct($options) { // check $cacheDir if (isset($options['cacheDir'])) { self::$cacheDir = $options['cacheDir']; } if (empty(self::$cacheDir)) { throw new Exception('cacheDir not set'); } if (isset($options['prefix'])) { self::$prefix = $options['prefix']; } if (empty(self::$prefix)) { throw new Exception('prefix not set'); } if (isset($options['forceRefresh'])) { self::$forceRefresh = $options['forceRefresh']; } self::checkCacheDir(); } /** * Get the cached result of $operation on $what, * which is known as dependant from the content of $options * * @param string $operation parse, compile... * @param mixed $what content key (e.g., filename to be treated) * @param array $options any option that affect the operation result on the content * @param int|null $lastModified last modified timestamp * * @return mixed * * @throws \Exception */ public function getCache($operation, $what, $options = [], $lastModified = null) { $fileCache = self::$cacheDir . self::cacheName($operation, $what, $options); if ( ((self::$forceRefresh === false) || (self::$forceRefresh === 'once' && isset(self::$refreshed[$fileCache]))) && file_exists($fileCache) ) { $cacheTime = filemtime($fileCache); if ( (\is_null($lastModified) || $cacheTime > $lastModified) && $cacheTime + self::$gcLifetime > time() ) { $c = file_get_contents($fileCache); $c = unserialize($c); if (\is_array($c) && isset($c['value'])) { return $c['value']; } } } return null; } /** * Put in cache the result of $operation on $what, * which is known as dependant from the content of $options * * @param string $operation * @param mixed $what * @param mixed $value * @param array $options * * @return void */ public function setCache($operation, $what, $value, $options = []) { $fileCache = self::$cacheDir . self::cacheName($operation, $what, $options); $c = ['value' => $value]; $c = serialize($c); file_put_contents($fileCache, $c); if (self::$forceRefresh === 'once') { self::$refreshed[$fileCache] = true; } } /** * Get the cache name for the caching of $operation on $what, * which is known as dependant from the content of $options * * @param string $operation * @param mixed $what * @param array $options * * @return string */ private static function cacheName($operation, $what, $options = []) { $t = [ 'version' => self::CACHE_VERSION, 'scssphpVersion' => Version::VERSION, 'operation' => $operation, 'what' => $what, 'options' => $options ]; $t = self::$prefix . sha1(json_encode($t)) . ".$operation" . ".scsscache"; return $t; } /** * Check that the cache dir exists and is writeable * * @return void * * @throws \Exception */ public static function checkCacheDir() { self::$cacheDir = str_replace('\\', '/', self::$cacheDir); self::$cacheDir = rtrim(self::$cacheDir, '/') . '/'; if (! is_dir(self::$cacheDir)) { throw new Exception('Cache directory doesn\'t exist: ' . self::$cacheDir); } if (! is_writable(self::$cacheDir)) { throw new Exception('Cache directory isn\'t writable: ' . self::$cacheDir); } } /** * Delete unused cached files * * @return void */ public static function cleanCache() { static $clean = false; if ($clean || empty(self::$cacheDir)) { return; } $clean = true; // only remove files with extensions created by SCSSPHP Cache // css files removed based on the list files $removeTypes = ['scsscache' => 1]; $files = scandir(self::$cacheDir); if (! $files) { return; } $checkTime = time() - self::$gcLifetime; foreach ($files as $file) { // don't delete if the file wasn't created with SCSSPHP Cache if (strpos($file, self::$prefix) !== 0) { continue; } $parts = explode('.', $file); $type = array_pop($parts); if (! isset($removeTypes[$type])) { continue; } $fullPath = self::$cacheDir . $file; $mtime = filemtime($fullPath); // don't delete if it's a relatively new file if ($mtime > $checkTime) { continue; } unlink($fullPath); } } } PKBA#]�Z��Ksystem/helixultimate/vendor/scssphp/scssphp/src/Parser/MediaQueryParser.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; use ScssPhp\ScssPhp\Ast\Css\CssMediaQuery; use ScssPhp\ScssPhp\Exception\SassFormatException; /** * A parser for `@media` queries. * * @internal */ final class MediaQueryParser extends Parser { /** * @return list<CssMediaQuery> * * @throws SassFormatException when parsing fails */ public function parse(): array { return $this->wrapSpanFormatException(function () { $queries = []; do { $this->whitespace(); $queries[] = $this->mediaQuery(); $this->whitespace(); } while ($this->scanner->scanChar(',')); $this->scanner->expectDone(); return $queries; }); } /** * Consumes a single media query. */ private function mediaQuery(): CssMediaQuery { if ($this->scanner->peekChar() === '(') { $conditions = [$this->mediaInParens()]; $this->whitespace(); $conjunction = true; if ($this->scanIdentifier('and')) { $this->expectWhitespace(); $conditions = array_merge($conditions, $this->mediaLogicSequence('and')); } elseif ($this->scanIdentifier('or')) { $this->expectWhitespace(); $conjunction = false; $conditions = array_merge($conditions, $this->mediaLogicSequence('or')); } return CssMediaQuery::condition($conditions, $conjunction); } $modifier = null; $type = null; $identifier1 = $this->identifier(); if (strtolower($identifier1) === 'not') { $this->expectWhitespace(); if (!$this->lookingAtIdentifier()) { // For example, "@media not (...) {" return CssMediaQuery::condition(['(not ' . $this->mediaInParens() . ')']); } } $this->whitespace(); if (!$this->lookingAtIdentifier()) { // For example, "@media screen {" return CssMediaQuery::type($identifier1); } $identifier2 = $this->identifier(); if (strtolower($identifier2) === 'and') { $this->expectWhitespace(); // For example, "@media screen and ..." $type = $identifier1; } else { $this->whitespace(); $modifier = $identifier1; $type = $identifier2; if ($this->scanIdentifier('and')) { // For example, "@media only screen and ..." $this->expectWhitespace(); } else { // For example, "@media only screen {" return CssMediaQuery::type($type, $modifier); } } // We've consumed either `IDENTIFIER "and"` or // `IDENTIFIER IDENTIFIER "and"`. if ($this->scanIdentifier('not')) { $this->expectWhitespace(); // For example, "@media screen and not (...) {" return CssMediaQuery::type($type, $modifier, ['(not ' . $this->mediaInParens() . ')']); } return CssMediaQuery::type($type, $modifier, $this->mediaLogicSequence('and')); } /** * Consumes one or more `<media-in-parens>` expressions separated by * $operator and returns them. * * @return list<string> */ private function mediaLogicSequence(string $operator): array { $result = []; while (true) { $result[] = $this->mediaInParens(); $this->whitespace(); if (!$this->scanIdentifier($operator)) { return $result; } $this->expectWhitespace(); } } /** * Consumes a `<media-in-parens>` expression and returns it, parentheses * included. */ private function mediaInParens(): string { $this->scanner->expectChar('(', 'media condition in parentheses'); $result = '(' . $this->declarationValue() . ')'; $this->scanner->expectChar(')'); return $result; } } PKBA#]�g�B��Esystem/helixultimate/vendor/scssphp/scssphp/src/Parser/ScssParser.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\Statement\LoudComment; use ScssPhp\ScssPhp\Ast\Sass\Statement\SilentComment; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\Util\Character; use ScssPhp\ScssPhp\Util\LoggerUtil; /** * A parser for the CSS-compatible syntax. * * @internal */ class ScssParser extends StylesheetParser { protected function isIndented(): bool { return false; } protected function getCurrentIndentation(): int { return 0; } protected function styleRuleSelector(): Interpolation { return $this->almostAnyValue(); } protected function expectStatementSeparator(?string $name = null): void { $this->whitespaceWithoutComments(); if ($this->scanner->isDone()) { return; } $next = $this->scanner->peekChar(); if ($next === ';' || $next === '}') { return; } $this->scanner->expectChar(';'); } protected function atEndOfStatement(): bool { $next = $this->scanner->peekChar(); return $next === null || $next === ';' || $next === '}' || $next === '{'; } protected function lookingAtChildren(): bool { return $this->scanner->peekChar() === '{'; } protected function scanElse(int $ifIndentation): bool { $start = $this->scanner->getPosition(); $this->whitespace(); $beforeAt = $this->scanner->getPosition(); if ($this->scanner->scanChar('@')) { if ($this->scanIdentifier('else', true)) { return true; } if ($this->scanIdentifier('elseif', true)) { LoggerUtil::warnForDeprecation($this->logger, Deprecation::elseif, "@elseif is deprecated and will not be supported in future Sass versions.\n\nRecommendation: @else if", $this->scanner->spanFrom($beforeAt)); $this->scanner->setPosition($this->scanner->getPosition() - 2); return true; } } $this->scanner->setPosition($start); return false; } protected function children(callable $child): array { $this->scanner->expectChar('{'); $this->whitespaceWithoutComments(); $children = []; while (true) { switch ($this->scanner->peekChar()) { case '$': $children[] = $this->variableDeclarationWithoutNamespace(); break; case '/': switch ($this->scanner->peekChar(1)) { case '/': $children[] = $this->silentCommentStatement(); $this->whitespaceWithoutComments(); break; case '*': $children[] = $this->loudCommentStatement(); $this->whitespaceWithoutComments(); break; default: $children[] = $child(); break; } break; case ';': $this->scanner->readChar(); $this->whitespaceWithoutComments(); break; case '}': $this->scanner->expectChar('}'); return $children; default: $children[] = $child(); break; } } } protected function statements(callable $statement): array { $statements = []; $this->whitespaceWithoutComments(); while (!$this->scanner->isDone()) { switch ($this->scanner->peekChar()) { case '$': $statements[] = $this->variableDeclarationWithoutNamespace(); break; case '/': switch ($this->scanner->peekChar(1)) { case '/': $statements[] = $this->silentCommentStatement(); $this->whitespaceWithoutComments(); break; case '*': $statements[] = $this->loudCommentStatement(); $this->whitespaceWithoutComments(); break; default: $child = $statement(); if ($child !== null) { $statements[] = $child; } break; } break; case ';': $this->scanner->readChar(); $this->whitespaceWithoutComments(); break; default: $child = $statement(); if ($child !== null) { $statements[] = $child; } break; } } return $statements; } /** * Consumes a statement-level silent comment block. */ private function silentCommentStatement(): SilentComment { $start = $this->scanner->getPosition(); $this->scanner->expect('//'); do { while (!$this->scanner->isDone() && !Character::isNewline($this->scanner->readChar())) { // Ignore the content of the comment } if ($this->scanner->isDone()) { break; } $this->spaces(); } while ($this->scanner->scan('//')); if ($this->isPlainCss()) { $this->error('Silent comments aren\'t allowed in plain CSS.', $this->scanner->spanFrom($start)); } $this->lastSilentComment = new SilentComment($this->scanner->substring($start), $this->scanner->spanFrom($start)); return $this->lastSilentComment; } /** * Consumes a statement-level loud comment block. */ private function loudCommentStatement(): LoudComment { $start = $this->scanner->getPosition(); $this->scanner->expect('/*'); $buffer = new InterpolationBuffer(); $buffer->write('/*'); while (true) { switch ($this->scanner->peekChar()) { case '#': if ($this->scanner->peekChar(1) === '{') { $buffer->add($this->singleInterpolation()); } else { $buffer->write($this->scanner->readChar()); } break; case '*': $buffer->write($this->scanner->readChar()); if ($this->scanner->peekChar() !== '/') { break; } $buffer->write($this->scanner->readChar()); return new LoudComment($buffer->buildInterpolation($this->scanner->spanFrom($start))); case "\r": $this->scanner->readChar(); if ($this->scanner->peekChar() !== "\n") { $buffer->write("\n"); } break; case "\f": $this->scanner->readChar(); $buffer->write("\n"); break; default: $buffer->write($this->scanner->readUtf8Char()); } } } } PKBA#]��l?��Usystem/helixultimate/vendor/scssphp/scssphp/src/Parser/MultiSourceFormatException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; use SourceSpan\FileSpan; /** * @internal */ final class MultiSourceFormatException extends FormatException { /** * {@see MultiSpanSassException::$primaryLabel} */ public readonly string $primaryLabel; /** * {@see MultiSpanSassException::$secondarySpans} * * @var array<string, FileSpan> */ public readonly array $secondarySpans; /** * @param array<string, FileSpan> $secondarySpans */ public function __construct(string $message, FileSpan $span, string $primaryLabel, array $secondarySpans, ?\Throwable $previous = null) { $this->primaryLabel = $primaryLabel; $this->secondarySpans = $secondarySpans; parent::__construct($message, $span, $previous); } } PKBA#]}}V���Nsystem/helixultimate/vendor/scssphp/scssphp/src/Parser/InterpolationBuffer.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use SourceSpan\FileSpan; /** * A buffer that iteratively builds up an {@see Interpolation}. * * @internal */ final class InterpolationBuffer { private string $text = ''; /** * @var list<string|Expression> */ private array $contents = []; /** * Returns the substring of the buffer string after the last interpolation. */ public function getTrailingString(): string { return $this->text; } public function isEmpty(): bool { return $this->text === '' && \count($this->contents) === 0; } public function write(string $string): void { $this->text .= $string; } public function add(Expression $expression): void { $this->flushText(); $this->contents[] = $expression; } public function addInterpolation(Interpolation $interpolation): void { $contents = $interpolation->getContents(); if (empty($contents)) { return; } if (is_string($contents[0])) { $this->text .= $contents[0]; array_shift($contents); } $this->flushText(); foreach ($contents as $content) { $this->contents[] = $content; } if (\is_string($this->contents[\count($this->contents) - 1])) { $this->text = $this->contents[\count($this->contents) - 1]; array_pop($this->contents); } } public function buildInterpolation(FileSpan $span): Interpolation { $contents = $this->contents; if ($this->text !== '') { $contents[] = $this->text; } return new Interpolation($contents, $span); } /** * Flushes {@see self::$text} to {@see self::$contents} if necessary. */ private function flushText(): void { if ($this->text === '') { return; } $this->contents[] = $this->text; $this->text = ''; } } PKBA#]݁p�@ @ Qsystem/helixultimate/vendor/scssphp/scssphp/src/Parser/KeyframeSelectorParser.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Util\Character; /** * A parser for `@keyframes` block selectors. * * @internal */ final class KeyframeSelectorParser extends Parser { /** * @return list<string> * * @throws SassFormatException */ public function parse(): array { return $this->wrapSpanFormatException(function () { $selectors = []; do { $this->whitespace(); if ($this->lookingAtIdentifier()) { if ($this->scanIdentifier('from')) { $selectors[] = 'from'; } else { $this->expectIdentifier('to', '"to" or "from"'); $selectors[] = 'to'; } } else { $selectors[] = $this->percentage(); } $this->whitespace(); } while ($this->scanner->scanChar(',')); $this->scanner->expectDone(); return $selectors; }); } private function percentage(): string { $buffer = ''; if ($this->scanner->scanChar('+')) { $buffer .= '+'; } $second = $this->scanner->peekChar(); if (!Character::isDigit($second) && $second !== '.') { $this->scanner->error('Expected number.'); } while (Character::isDigit($this->scanner->peekChar())) { $buffer .= $this->scanner->readChar(); } if ($this->scanner->peekChar() === '.') { $buffer .= $this->scanner->readChar(); while (Character::isDigit($this->scanner->peekChar())) { $buffer .= $this->scanner->readChar(); } } if ($this->scanIdentChar('e')) { $buffer .= 'e'; $next = $this->scanner->peekChar(); if ($next === '+' || $next === '-') { $buffer .= $this->scanner->readChar(); } if (!Character::isDigit($this->scanner->peekChar())) { $this->scanner->error('Expected digit.'); } while (Character::isDigit($this->scanner->peekChar())) { $buffer .= $this->scanner->readChar(); } } $this->scanner->expectChar('%'); $buffer .= '%'; return $buffer; } } PKBA#]U&ffCfCKsystem/helixultimate/vendor/scssphp/scssphp/src/Parser/StylesheetParser.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; use League\Uri\Contracts\UriInterface; use League\Uri\Exceptions\SyntaxError; use League\Uri\Uri; use ScssPhp\ScssPhp\Ast\Sass\Argument; use ScssPhp\ScssPhp\Ast\Sass\ArgumentDeclaration; use ScssPhp\ScssPhp\Ast\Sass\ArgumentInvocation; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression\BinaryOperationExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\BinaryOperator; use ScssPhp\ScssPhp\Ast\Sass\Expression\BooleanExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\ColorExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\FunctionExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\IfExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\InterpolatedFunctionExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\ListExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\MapExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\NullExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\NumberExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\ParenthesizedExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\SelectorExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\StringExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\SupportsExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\UnaryOperationExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\UnaryOperator; use ScssPhp\ScssPhp\Ast\Sass\Expression\VariableExpression; use ScssPhp\ScssPhp\Ast\Sass\Import; use ScssPhp\ScssPhp\Ast\Sass\Import\DynamicImport; use ScssPhp\ScssPhp\Ast\Sass\Import\StaticImport; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Statement\AtRootRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\AtRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ContentBlock; use ScssPhp\ScssPhp\Ast\Sass\Statement\ContentRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\DebugRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\Declaration; use ScssPhp\ScssPhp\Ast\Sass\Statement\EachRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ElseClause; use ScssPhp\ScssPhp\Ast\Sass\Statement\ErrorRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ExtendRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ForRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\FunctionRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\IfClause; use ScssPhp\ScssPhp\Ast\Sass\Statement\IfRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ImportRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\IncludeRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\MediaRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\MixinRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ReturnRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\SilentComment; use ScssPhp\ScssPhp\Ast\Sass\Statement\StyleRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\Stylesheet; use ScssPhp\ScssPhp\Ast\Sass\Statement\SupportsRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\VariableDeclaration; use ScssPhp\ScssPhp\Ast\Sass\Statement\WarnRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\WhileRule; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsAnything; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsDeclaration; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsFunction; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsInterpolation; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsNegation; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsOperation; use ScssPhp\ScssPhp\Colors; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Util\Character; use ScssPhp\ScssPhp\Util\LoggerUtil; use ScssPhp\ScssPhp\Util\Path; use ScssPhp\ScssPhp\Util\StringUtil; use ScssPhp\ScssPhp\Value\ListSeparator; use ScssPhp\ScssPhp\Value\SassColor; use ScssPhp\ScssPhp\Value\SpanColorFormat; use SourceSpan\FileSpan; /** * @internal */ abstract class StylesheetParser extends Parser { /** * The silent comment this parser encountered previously. */ protected ?SilentComment $lastSilentComment = null; /** * Whether we've consumed a rule other than `@charset`, `@forward`, or `@use`. */ private bool $isUseAllowed = true; /** * Whether the parser is currently parsing the contents of a mixin declaration. */ private bool $inMixin = false; /** * Whether the parser is currently parsing a content block passed to a mixin. */ private bool $inContentBlock = false; /** * Whether the parser is currently parsing a control directive such as `@if` * or `@each`. */ private bool $inControlDirective = false; /** * Whether the parser is currently parsing an unknown rule. */ private bool $inUnknownAtRule = false; /** * Whether the parser is currently parsing a style rule. */ private bool $inStyleRule = false; /** * Whether the parser is currently within a parenthesized expression. */ private bool $inParentheses = false; /** * Whether the parser is currently within an expression. */ private bool $inExpression = false; /** * A map from all variable names that are assigned with `!global` in the * current stylesheet to the nodes where they're defined. * * These are collected at parse time because they affect the variables * exposed by the module generated for this stylesheet, *even if they aren't * evaluated*. This allows us to ensure that the stylesheet always exposes * the same set of variable names no matter how it's evaluated. * * @var array<string, VariableDeclaration> */ private array $globalVariables = []; public function __construct(string $contents, ?LoggerInterface $logger = null, ?UriInterface $sourceUrl = null) { parent::__construct($contents, $logger, $sourceUrl); } protected function inExpression(): bool { return $this->inExpression; } /** * @throws SassFormatException when parsing fails */ public function parse(): Stylesheet { return $this->wrapSpanFormatException(function () { $start = $this->scanner->getPosition(); // Allow a byte-order mark at the beginning of the document. $this->scanner->scan("\u{FEFF}"); $statements = $this->statements(function () { // Handle this specially so that {@see atRule} always returns a non-nullable Statement. if ($this->scanner->scan('@charset')) { $this->whitespace(); $this->string(); return null; } return $this->statement(true); }); $this->scanner->expectDone(); // Ensure that all global variable assignments produce a variable in this // stylesheet, even if they aren't evaluated. See sass/language#50. foreach ($this->globalVariables as $declaration) { $statements[] = new VariableDeclaration($declaration->getName(), new NullExpression($declaration->getExpression()->getSpan()), $declaration->getSpan(), null, true); } return new Stylesheet($statements, $this->scanner->spanFrom($start), $this->isPlainCss()); }); } public function parseArgumentDeclaration(): ArgumentDeclaration { return $this->wrapSpanFormatException(function () { $this->scanner->expectChar('@', '@-rule'); $this->identifier(); $this->whitespace(); $this->identifier(); $arguments = $this->argumentDeclaration(); $this->whitespace(); $this->scanner->expectChar('{'); $this->scanner->expectDone(); return $arguments; }); } /** * Consumes a statement that's allowed at the top level of the stylesheet or * within nested style and at rules. * * If $root is `true`, this parses at-rules that are allowed only at the * root of the stylesheet. */ private function statement(bool $root = false): Statement { switch ($this->scanner->peekChar()) { case '@': return $this->atRule($this->statement(...), $root); case '+': if (!$this->isIndented() || !$this->lookingAtIdentifier(1)) { return $this->styleRule(); } $this->isUseAllowed = false; $start = $this->scanner->getPosition(); $this->scanner->readChar(); return $this->includeRule($start); case '=': if (!$this->isIndented()) { return $this->styleRule(); } $this->isUseAllowed = false; $start = $this->scanner->getPosition(); $this->scanner->readChar(); $this->whitespace(); return $this->mixinRule($start); case '}': $this->scanner->error('unmatched "}".'); default: if ($this->inStyleRule || $this->inUnknownAtRule || $this->inMixin || $this->inContentBlock) { return $this->declarationOrStyleRule(); } return $this->variableDeclarationOrStyleRule(); } } /** * Consumes a namespaced variable declaration. * * @throws FormatException */ private function variableDeclarationWithNamespace(): VariableDeclaration { $start = $this->scanner->getPosition(); $namespace = $this->identifier(); $this->scanner->expectChar('.'); return $this->variableDeclarationWithoutNamespace($namespace, $start); } /** * Consumes a variable declaration. */ protected function variableDeclarationWithoutNamespace(?string $namespace = null, ?int $start = null): VariableDeclaration { $precedingComment = $this->lastSilentComment; $this->lastSilentComment = null; $start = $start ?? $this->scanner->getPosition(); $name = $this->variableName(); if ($namespace !== null) { $this->assertPublic($name, fn() => $this->scanner->spanFrom($start)); } if ($this->isPlainCss()) { $this->error('Sass variables aren\'t allowed in plain CSS.', $this->scanner->spanFrom($start)); } $this->whitespace(); $this->scanner->expectChar(':'); $this->whitespace(); $value = $this->expression(); $guarded = false; $global = false; $flagStart = $this->scanner->getPosition(); while ($this->scanner->scanChar('!')) { $flag = $this->identifier(); if ($flag === 'default') { if ($guarded) { LoggerUtil::warnForDeprecation($this->logger, Deprecation::duplicateVarFlags, "!default should only be written once for each variable.\nThis will be an error in Dart Sass 2.0.0.", $this->scanner->spanFrom($flagStart)); } $guarded = true; } elseif ($flag === 'global') { if ($namespace !== null) { $this->error("!global isn't allowed for variables in other modules.", $this->scanner->spanFrom($flagStart)); } elseif ($global) { LoggerUtil::warnForDeprecation($this->logger, Deprecation::duplicateVarFlags, "!global should only be written once for each variable.\nThis will be an error in Dart Sass 2.0.0.", $this->scanner->spanFrom($flagStart)); } $global = true; } else { $this->error('Invalid flag name.', $this->scanner->spanFrom($flagStart)); } $this->whitespace(); $flagStart = $this->scanner->getPosition(); } $this->expectStatementSeparator('variable declaration'); // TODO remove this when implementing modules if ($namespace !== null) { $this->error('Sass modules are not implemented yet.', $this->scanner->spanFrom($start)); } $declaration = new VariableDeclaration($name, $value, $this->scanner->spanFrom($start), $namespace, $guarded, $global, $precedingComment); if ($global && !isset($this->globalVariables[$name])) { $this->globalVariables[$name] = $declaration; } return $declaration; } private function variableDeclarationOrStyleRule(): Statement { if ($this->isPlainCss()) { return $this->styleRule(); } // The indented syntax allows a single backslash to distinguish a style rule // from old-style property syntax. We don't support old property syntax, but // we do support the backslash because it's easy to do. if ($this->isIndented() && $this->scanner->scanChar('\\')) { return $this->styleRule(); } if (!$this->lookingAtIdentifier()) { return $this->styleRule(); } $start = $this->scanner->getPosition(); $variableOrInterpolation = $this->variableDeclarationOrInterpolation(); if ($variableOrInterpolation instanceof VariableDeclaration) { return $variableOrInterpolation; } $buffer = new InterpolationBuffer(); $buffer->addInterpolation($variableOrInterpolation); return $this->styleRule($buffer, $start); } /** * Consumes a {@see VariableDeclaration}, a {@see Declaration}, or a {@see StyleRule}. * * @throws FormatException */ private function declarationOrStyleRule(): Statement { // The indented syntax allows a single backslash to distinguish a style rule // from old-style property syntax. We don't support old property syntax, but // we do support the backslash because it's easy to do. if ($this->isIndented() && $this->scanner->scanChar('\\')) { return $this->styleRule(); } $start = $this->scanner->getPosition(); $declarationBuffer = $this->declarationOrBuffer(); if ($declarationBuffer instanceof Statement) { return $declarationBuffer; } return $this->styleRule($declarationBuffer, $start); } /** * Tries to parse a variable or property declaration, and returns the value * parsed so far if it fails. * * This can return either an {@see InterpolationBuffer}, indicating that it * couldn't consume a declaration and that selector parsing should be * attempted; or it can return a {@see Declaration} or a {@see VariableDeclaration}, * indicating that it successfully consumed a declaration. */ private function declarationOrBuffer(): Statement|InterpolationBuffer { $start = $this->scanner->getPosition(); $nameBuffer = new InterpolationBuffer(); $first = $this->scanner->peekChar(); $startsWithPunctuation = false; // Allow the "*prop: val", ":prop: val", "#prop: val", and ".prop: val" // hacks. if ($first === ':' || $first === '*' || $first === '.' || ($first === '#' && $this->scanner->peekChar(1) !== '{')) { $startsWithPunctuation = true; $nameBuffer->write($this->scanner->readChar()); $nameBuffer->write($this->rawText($this->whitespace(...))); } if (!$this->lookingAtInterpolatedIdentifier()) { return $nameBuffer; } $variableOrInterpolation = $startsWithPunctuation ? $this->interpolatedIdentifier() : $this->variableDeclarationOrInterpolation(); if ($variableOrInterpolation instanceof VariableDeclaration) { return $variableOrInterpolation; } $nameBuffer->addInterpolation($variableOrInterpolation); $this->isUseAllowed = false; if ($this->scanner->matches('/*')) { $nameBuffer->write($this->rawText($this->loudComment(...))); } $midBuffer = $this->rawText($this->whitespace(...)); $beforeColon = $this->scanner->getPosition(); if (!$this->scanner->scanChar(':')) { if ($midBuffer !== '') { $nameBuffer->write(' '); } return $nameBuffer; } $midBuffer .= ':'; // Parse custom properties as declarations no matter what. $name = $nameBuffer->buildInterpolation($this->scanner->spanFrom($start, $beforeColon)); if (str_starts_with($name->getInitialPlain(), '--')) { $value = new StringExpression($this->interpolatedDeclarationValue(silentComments: false)); $this->expectStatementSeparator('custom property'); return Declaration::create($name, $value, $this->scanner->spanFrom($start)); } if ($this->scanner->scanChar(':')) { $nameBuffer->write($midBuffer); $nameBuffer->write(':'); return $nameBuffer; } if ($this->isIndented() && $this->lookingAtInterpolatedIdentifier()) { // In the indented syntax, `foo:bar` is always considered a selector // rather than a property. $nameBuffer->write($midBuffer); return $nameBuffer; } $postColonWhitespace = $this->rawText($this->whitespace(...)); $nested = $this->tryDeclarationChildren($name, $start); if ($nested !== null) { return $nested; } $midBuffer .= $postColonWhitespace; $couldBeSelector = $postColonWhitespace === '' && $this->lookingAtInterpolatedIdentifier(); $beforeDeclaration = $this->scanner->getPosition(); try { $value = $this->expression(); if ($this->lookingAtChildren()) { // Properties that are ambiguous with selectors can't have additional // properties nested beneath them, so we force an error. This will be // caught below and cause the text to be reparsed as a selector. if ($couldBeSelector) { $this->expectStatementSeparator(); } } elseif (!$this->atEndOfStatement()) { // Force an exception if there isn't a valid end-of-property character // but don't consume that character. This will also cause the text to be // reparsed. $this->expectStatementSeparator(); } } catch (FormatException $e) { if (!$couldBeSelector) { throw $e; } // If the value would be followed by a semicolon, it's definitely supposed // to be a property, not a selector. $this->scanner->setPosition($beforeDeclaration); $additional = $this->almostAnyValue(); if (!$this->isIndented() && $this->scanner->peekChar() === ';') { throw $e; } $nameBuffer->write($midBuffer); $nameBuffer->addInterpolation($additional); return $nameBuffer; } $nested = $this->tryDeclarationChildren($name, $start, $value); if ($nested !== null) { return $nested; } $this->expectStatementSeparator(); return Declaration::create($name, $value, $this->scanner->spanFrom($start)); } /** * Tries to parse a namespaced {@see VariableDeclaration}, and returns the value * parsed so far if it fails. * * This can return either an {@see Interpolation}, indicating that it couldn't * consume a variable declaration and that property declaration or selector * parsing should be attempted; or it can return a {@see VariableDeclaration}, * indicating that it successfully consumed a variable declaration. */ private function variableDeclarationOrInterpolation(): Interpolation|VariableDeclaration { if (!$this->lookingAtIdentifier()) { return $this->interpolatedIdentifier(); } $start = $this->scanner->getPosition(); $identifier = $this->identifier(); if ($this->scanner->matches('.$')) { $this->scanner->readChar(); return $this->variableDeclarationWithoutNamespace($identifier, $start); } $buffer = new InterpolationBuffer(); $buffer->write($identifier); // Parse the rest of an interpolated identifier if one exists, so callers // don't have to. if ($this->lookingAtInterpolatedIdentifierBody()) { $buffer->addInterpolation($this->interpolatedIdentifier()); } return $buffer->buildInterpolation($this->scanner->spanFrom($start)); } /** * Consumes a StyleRule */ private function styleRule(?InterpolationBuffer $buffer = null, ?int $start = null): StyleRule { $start = $start ?? $this->scanner->getPosition(); $interpolation = $this->styleRuleSelector(); if ($buffer !== null) { $buffer->addInterpolation($interpolation); $interpolation = $buffer->buildInterpolation($this->scanner->spanFrom($start)); } if (!$interpolation->getContents()) { $this->scanner->error('expected "}".'); } $wasInStyleRule = $this->inStyleRule; $this->inStyleRule = true; return $this->withChildren($this->statement(...), $start, function (array $children) use ($wasInStyleRule, $start, $interpolation) { if ($this->isIndented() && $children === []) { $this->warn("This selector doesn't have any properties and won't be rendered.", $interpolation->getSpan()); } $this->inStyleRule = $wasInStyleRule; return new StyleRule($interpolation, $children, $this->scanner->spanFrom($start)); }); } /** * Consumes either a property declaration or a namespaced variable declaration. * * This is only used in contexts where declarations are allowed but style * rules are not, such as nested declarations. Otherwise, * {@see declarationOrStyleRule} is used instead. * * If $parseCustomProperties is `true`, properties that begin with `--` will * be parsed using custom property parsing rules. */ private function propertyOrVariableDeclaration(bool $parseCustomProperties = true): Statement { $start = $this->scanner->getPosition(); // Allow the "*prop: val", ":prop: val", "#prop: val", and ".prop: val" // hacks. $first = $this->scanner->peekChar(); if ($first === ':' || $first === '*' || $first === '.' || ($first === '#' && $this->scanner->peekChar(1) !== '{')) { $nameBuffer = new InterpolationBuffer(); $nameBuffer->write($this->scanner->readChar()); $nameBuffer->write($this->rawText($this->whitespace(...))); $nameBuffer->addInterpolation($this->interpolatedIdentifier()); $name = $nameBuffer->buildInterpolation($this->scanner->spanFrom($start)); } elseif (!$this->isPlainCss()) { $variableOrInterpolation = $this->variableDeclarationOrInterpolation(); if ($variableOrInterpolation instanceof VariableDeclaration) { return $variableOrInterpolation; } $name = $variableOrInterpolation; } else { $name = $this->interpolatedIdentifier(); } $this->whitespace(); $this->scanner->expectChar(':'); if ($parseCustomProperties && str_starts_with($name->getInitialPlain(), '--')) { $value = new StringExpression($this->interpolatedDeclarationValue(silentComments: false)); $this->expectStatementSeparator('custom property'); return Declaration::create($name, $value, $this->scanner->spanFrom($start)); } $this->whitespace(); $nested = $this->tryDeclarationChildren($name, $start); if ($nested !== null) { return $nested; } $value = $this->expression(); $nested = $this->tryDeclarationChildren($name, $start, $value); if ($nested !== null) { return $nested; } $this->expectStatementSeparator(); return Declaration::create($name, $value, $this->scanner->spanFrom($start)); } /** * Tries parsing nested children of a declaration whose $name has already * been parsed, and returns `null` if it doesn't have any. * * If $value is passed, it's used as the value of the property without * nesting. */ private function tryDeclarationChildren(Interpolation $name, int $start, ?Expression $value = null): ?Declaration { if (!$this->lookingAtChildren()) { return null; } if ($this->isPlainCss()) { $this->scanner->error("Nested declarations aren't allowed in plain CSS."); } return $this->withChildren($this->declarationChild(...), $start, fn(array $children, FileSpan $span) => Declaration::nested($name, $children, $span, $value)); } /** * Consumes a statement that's allowed within a declaration. */ private function declarationChild(): Statement { if ($this->scanner->peekChar() === '@') { return $this->declarationAtRule(); } return $this->propertyOrVariableDeclaration(false); } /** * Consumes an at-rule. * * This consumes at-rules that are allowed at all levels of the document; the * $child parameter is called to consume any at-rules that are specifically * allowed in the caller's context. * * If $root is `true`, this parses at-rules that are allowed only at the * root of the stylesheet. * * @param callable(): Statement $child * * @param-immediately-invoked-callable $child */ protected function atRule(callable $child, bool $root = false): Statement { $start = $this->scanner->getPosition(); $this->scanner->expectChar('@', '@-rule'); $name = $this->interpolatedIdentifier(); $this->whitespace(); $wasUseAllowed = $this->isUseAllowed; $this->isUseAllowed = false; switch ($name->getAsPlain()) { case 'at-root': return $this->atRootRule($start); case 'content': return $this->contentRule($start); case 'debug': return $this->debugRule($start); case 'each': return $this->eachRule($start, $child); case 'else': $this->disallowedAtRule($start); case 'error': return $this->errorRule($start); case 'extend': return $this->extendRule($start); case 'for': return $this->forRule($start, $child); case 'forward': $this->isUseAllowed = $wasUseAllowed; if (!$root) { $this->disallowedAtRule($start); } // TODO remove this when implementing modules $this->error('Sass modules are not implemented yet.', $this->scanner->spanFrom($start)); case 'function': return $this->functionRule($start); case 'if': return $this->ifRule($start, $child); case 'import': return $this->importRule($start); case 'include': return $this->includeRule($start); case 'media': return $this->mediaRule($start); case 'mixin': return $this->mixinRule($start); case '-moz-document': return $this->mozDocumentRule($start, $name); case 'return': $this->disallowedAtRule($start); case 'supports': return $this->supportsRule($start); case 'use': $this->isUseAllowed = $wasUseAllowed; if (!$root) { $this->disallowedAtRule($start); } // TODO remove this when implementing modules $this->error('Sass modules are not implemented yet.', $this->scanner->spanFrom($start)); case 'warn': return $this->warnRule($start); case 'while': return $this->whileRule($start, $child); default: return $this->unknownAtRule($start, $name); } } /** * Consumes an at-rule allowed within a property declaration. */ private function declarationAtRule(): Statement { $start = $this->scanner->getPosition(); $name = $this->plainAtRuleName(); switch ($name) { case 'content': return $this->contentRule($start); case 'debug': return $this->debugRule($start); case 'each': return $this->eachRule($start, $this->declarationChild(...)); case 'else': $this->disallowedAtRule($start); case 'error': return $this->errorRule($start); case 'for': return $this->forRule($start, $this->declarationChild(...)); case 'if': return $this->ifRule($start, $this->declarationChild(...)); case 'include': return $this->includeRule($start); case 'warn': return $this->warnRule($start); case 'while': return $this->whileRule($start, $this->declarationChild(...)); default: $this->disallowedAtRule($start); } } /** * Consumes a statement allowed within a function. */ private function functionChild(): Statement { if ($this->scanner->peekChar() !== '@') { $start = $this->scanner->getPosition(); try { return $this->variableDeclarationWithNamespace(); } catch (FormatException $variableDeclarationError) { // TODO remove this when implementing modules if ($variableDeclarationError->getMessage() === 'Sass modules are not implemented yet.') { throw $variableDeclarationError; } $this->scanner->setPosition($start); // If a variable declaration failed to parse, it's possible the user // thought they could write a style rule or property declaration in a // function. If so, throw a more helpful error message. try { $statement = $this->declarationOrStyleRule(); } catch (FormatException) { throw $variableDeclarationError; } $this->error('@function rules may not contain ' . ($statement instanceof StyleRule ? 'style rules.' : 'declarations.'), $statement->getSpan()); } } $start = $this->scanner->getPosition(); switch ($this->plainAtRuleName()) { case 'debug': return $this->debugRule($start); case 'each': return $this->eachRule($start, $this->functionChild(...)); case 'else': $this->disallowedAtRule($start); case 'error': return $this->errorRule($start); case 'for': return $this->forRule($start, $this->functionChild(...)); case 'if': return $this->ifRule($start, $this->functionChild(...)); case 'return': return $this->returnRule($start); case 'warn': return $this->warnRule($start); case 'while': return $this->whileRule($start, $this->functionChild(...)); default: $this->disallowedAtRule($start); } } /** * Consumes an at-rule's name, with interpolation disallowed. */ private function plainAtRuleName(): string { $this->scanner->expectChar('@', '@-rule'); $name = $this->identifier(); $this->whitespace(); return $name; } /** * Consumes an `@at-root` rule. * * $start should point before the `@`. */ private function atRootRule(int $start): AtRootRule { if ($this->scanner->peekChar() === '(') { $query = $this->atRootQuery(); $this->whitespace(); return $this->withChildren($this->statement(...), $start, fn(array $children, FileSpan $span) => new AtRootRule($children, $span, $query)); } if ($this->lookingAtChildren() || ($this->isIndented() && $this->atEndOfStatement())) { return $this->withChildren($this->statement(...), $start, fn(array $children, FileSpan $span) => new AtRootRule($children, $span)); } $child = $this->styleRule(); return new AtRootRule([$child], $this->scanner->spanFrom($start)); } /** * Consumes a query expression of the form `(foo: bar)`. */ private function atRootQuery(): Interpolation { $start = $this->scanner->getPosition(); $buffer = new InterpolationBuffer(); $this->scanner->expectChar('('); $buffer->write('('); $this->whitespace(); $this->addOrInject($buffer, $this->expression()); if ($this->scanner->scanChar(':')) { $this->whitespace(); $buffer->write(': '); $this->addOrInject($buffer, $this->expression()); } $this->scanner->expectChar(')'); $this->whitespace(); $buffer->write(')'); return $buffer->buildInterpolation($this->scanner->spanFrom($start)); } /** * Consumes a `@content` rule. * * $start should point before the `@`. */ private function contentRule(int $start): ContentRule { if (!$this->inMixin) { $this->error('@content is only allowed within mixin declarations.', $this->scanner->spanFrom($start)); } $beforeWhitespace = $this->scanner->getLocation(); $this->whitespace(); if ($this->scanner->peekChar() === '(') { $arguments = $this->argumentInvocation(true); $this->whitespace(); } else { $arguments = ArgumentInvocation::createEmpty($beforeWhitespace->pointSpan()); } $this->expectStatementSeparator('@content rule'); return new ContentRule($arguments, $this->scanner->spanFrom($start)); } /** * Consumes a `@debug` rule. * * $start should point before the `@`. */ private function debugRule(int $start): DebugRule { $value = $this->expression(); $this->expectStatementSeparator('@debug rule'); return new DebugRule($value, $this->scanner->spanFrom($start)); } /** * Consumes a `@each` rule. * * $start should point before the `@`. $child is called to consume any * children that are specifically allowed in the caller's context. * * @param callable(): Statement $child * * @param-immediately-invoked-callable $child */ private function eachRule(int $start, callable $child): EachRule { $wasInControlDirective = $this->inControlDirective; $this->inControlDirective = true; $variables = [$this->variableName()]; $this->whitespace(); while ($this->scanner->scanChar(',')) { $this->whitespace(); $variables[] = $this->variableName(); $this->whitespace(); } $this->expectIdentifier('in'); $this->whitespace(); $list = $this->expression(); return $this->withChildren($child, $start, function (array $children, FileSpan $span) use ($variables, $wasInControlDirective, $list) { $this->inControlDirective = $wasInControlDirective; return new EachRule($variables, $list, $children, $span); }); } /** * Consumes a `@error` rule. * * $start should point before the `@`. */ private function errorRule(int $start): ErrorRule { $value = $this->expression(); $this->expectStatementSeparator('@error rule'); return new ErrorRule($value, $this->scanner->spanFrom($start)); } /** * Consumes a `@extend` rule. * * $start should point before the `@`. */ private function extendRule(int $start): ExtendRule { if (!$this->inStyleRule && !$this->inMixin && !$this->inContentBlock) { $this->error('@extend may only be used within style rules.', $this->scanner->spanFrom($start)); } $value = $this->almostAnyValue(); $optional = $this->scanner->scanChar('!'); if ($optional) { $this->expectIdentifier('optional'); $this->whitespace(); } $this->expectStatementSeparator('@extend rule'); return new ExtendRule($value, $this->scanner->spanFrom($start), $optional); } /** * Consumes a function declaration. * * $start should point before the `@`. */ private function functionRule(int $start): FunctionRule { $precedingComment = $this->lastSilentComment; $this->lastSilentComment = null; $beforeName = $this->scanner->getPosition(); $name = $this->identifier(); if (str_starts_with($name, '--')) { LoggerUtil::warnForDeprecation( $this->logger, Deprecation::cssFunctionMixin, "Sass @function names beginning with -- are deprecated for forward-compatibility with plain CSS mixins.\n\nFor details, see https://sass-lang.com/d/css-function-mixin", $this->scanner->spanFrom($beforeName) ); } $this->whitespace(); $arguments = $this->argumentDeclaration(); if ($this->inMixin || $this->inContentBlock) { $this->error('Mixins may not contain function declarations.', $this->scanner->spanFrom($start)); } if ($this->inControlDirective) { $this->error('Functions may not be declared in control directives.', $this->scanner->spanFrom($start)); } switch (Util::unvendor($name)) { case 'calc': case 'element': case 'expression': case 'url': case 'and': case 'or': case 'not': case 'clamp': $this->error('Invalid function name.', $this->scanner->spanFrom($start)); } $this->whitespace(); return $this->withChildren( $this->functionChild(...), $start, fn(array $children, FileSpan $span) => new FunctionRule($name, $arguments, $span, $children, $precedingComment) ); } /** * Consumes a `@for` rule. * * $start should point before the `@`. $child is called to consume any * children that are specifically allowed in the caller's context. * * @param callable(): Statement $child * * @param-immediately-invoked-callable $child */ private function forRule(int $start, callable $child): ForRule { $wasInControlDirective = $this->inControlDirective; $this->inControlDirective = true; $variable = $this->variableName(); $this->whitespace(); $this->expectIdentifier('from'); $this->whitespace(); $exclusive = null; $from = $this->expression(function () use (&$exclusive) { if (!$this->lookingAtIdentifier()) { return false; } if ($this->scanIdentifier('to')) { $exclusive = true; return true; } if ($this->scanIdentifier('through')) { $exclusive = false; return true; } return false; }); if ($exclusive === null) { $this->scanner->error('Expected "to" or "through".'); } $this->whitespace(); $to = $this->expression(); return $this->withChildren($child, $start, function (array $children, FileSpan $span) use ($variable, $from, $to, $exclusive, $wasInControlDirective) { $this->inControlDirective = $wasInControlDirective; return new ForRule($variable, $from, $to, $children, $span, $exclusive); }); } /** * Consumes a `@if` rule. * * $start should point before the `@`. $child is called to consume any * children that are specifically allowed in the caller's context. * * @param callable(): Statement $child * * @param-immediately-invoked-callable $child */ private function ifRule(int $start, callable $child): IfRule { $ifIndentation = $this->getCurrentIndentation(); $wasInControlDirective = $this->inControlDirective; $this->inControlDirective = true; $condition = $this->expression(); $children = $this->children($child); $this->whitespaceWithoutComments(); $clauses = [new IfClause($condition, $children)]; $lastClause = null; while ($this->scanElse($ifIndentation)) { $this->whitespace(); if ($this->scanIdentifier('if')) { $this->whitespace(); $clauses[] = new IfClause($this->expression(), $this->children($child)); } else { $lastClause = new ElseClause($this->children($child)); break; } } $this->inControlDirective = $wasInControlDirective; $span = $this->scanner->spanFrom($start); $this->whitespaceWithoutComments(); return new IfRule($clauses, $span, $lastClause); } /** * Consumes an `@import` rule. * * $start should point before the `@`. */ private function importRule(int $start): ImportRule { $imports = []; do { $this->whitespace(); $argument = $this->importArgument(); if (($this->inControlDirective || $this->inMixin) && $argument instanceof DynamicImport) { $this->disallowedAtRule($start); } $imports[] = $argument; $this->whitespace(); } while ($this->scanner->scanChar(',')); $this->expectStatementSeparator('@import rule'); return new ImportRule($imports, $this->scanner->spanFrom($start)); } /** * Consumes an argument to an `@import` rule. */ protected function importArgument(): Import { $start = $this->scanner->getPosition(); $next = $this->scanner->peekChar(); if ($next === 'u' || $next === 'U') { $url = $this->dynamicUrl(); $this->whitespace(); $modifiers = $this->tryImportModifiers(); return new StaticImport(new Interpolation([$url], $this->scanner->spanFrom($start)), $this->scanner->spanFrom($start), $modifiers); } $url = $this->string(); $urlSpan = $this->scanner->spanFrom($start); $this->whitespace(); $modifiers = $this->tryImportModifiers(); if ($this->isPlainImportUrl($url) || $modifiers !== null) { return new StaticImport(new Interpolation([$urlSpan->getText()], $urlSpan), $this->scanner->spanFrom($start), $modifiers); } try { return new DynamicImport($this->parseImportUrl($url), $urlSpan); } catch (SyntaxError $e) { $this->error('Invalid URL: ' . $e->getMessage(), $urlSpan, $e); } } /** * Parses $url as an import URL. * * @throws SyntaxError */ protected function parseImportUrl(string $url): string { // Backwards-compatibility for implementations that allow absolute Windows // paths in imports. if (Path::isWindowsAbsolute($url) && !self::isRootRelativeUrl($url)) { return (string) Uri::fromWindowsPath($url); } Uri::new($url); return $url; } private static function isRootRelativeUrl(string $path): bool { return $path !== '' && $path[0] === '/'; } /** * Returns whether $url indicates that an `@import` is a plain CSS import. */ protected function isPlainImportUrl(string $url): bool { if (\strlen($url) < 5) { return false; } if (str_ends_with($url, '.css')) { return true; } if ($url[0] === '/') { return $url[1] === '/'; } if ($url[0] !== 'h') { return false; } return str_starts_with($url, 'http://') || str_starts_with($url, 'https://'); } /** * Returns `null` if there are no modifiers. */ protected function tryImportModifiers(): ?Interpolation { // Exit before allocating anything if we're not looking at any modifiers, as // is the most common case. if (!$this->lookingAtInterpolatedIdentifier() && $this->scanner->peekChar() !== '(') { return null; } $start = $this->scanner->getPosition(); $buffer = new InterpolationBuffer(); while (true) { if ($this->lookingAtInterpolatedIdentifier()) { if (!$buffer->isEmpty()) { $buffer->write(' '); } $identifier = $this->interpolatedIdentifier(); $buffer->addInterpolation($identifier); $name = $identifier->getAsPlain() !== null ? strtolower($identifier->getAsPlain()) : null; if ($name !== 'and' && $this->scanner->scanChar('(')) { if ($name === 'supports') { $query = $this->importSupportsQuery(); if (!$query instanceof SupportsDeclaration) { $buffer->write('('); } $buffer->add(new SupportsExpression($query)); if (!$query instanceof SupportsDeclaration) { $buffer->write(')'); } } else { $buffer->write('('); $buffer->addInterpolation($this->interpolatedDeclarationValue(true, true)); $buffer->write(')'); } $this->scanner->expectChar(')'); $this->whitespace(); } else { $this->whitespace(); if ($this->scanner->scanChar(',')) { $buffer->write(', '); $buffer->addInterpolation($this->mediaQueryList()); return $buffer->buildInterpolation($this->scanner->spanFrom($start)); } } } elseif ($this->scanner->peekChar() === '(') { if (!$buffer->isEmpty()) { $buffer->write(' '); } $buffer->addInterpolation($this->mediaQueryList()); return $buffer->buildInterpolation($this->scanner->spanFrom($start)); } else { return $buffer->buildInterpolation($this->scanner->spanFrom($start)); } } } /** * Consumes the contents of a `supports()` function after an `@import` rule * (but not the function name or parentheses). */ private function importSupportsQuery(): SupportsCondition { if ($this->scanIdentifier('not')) { $this->whitespace(); $start = $this->scanner->getPosition(); return new SupportsNegation($this->supportsConditionInParens(), $this->scanner->spanFrom($start)); } if ($this->scanner->peekChar() === '(') { return $this->supportsCondition(); } $function = $this->tryImportSupportsFunction(); if ($function !== null) { return $function; } $start = $this->scanner->getPosition(); $name = $this->expression(); $this->scanner->expectChar(':'); return $this->supportsDeclarationValue($name, $start); } /** * Consumes a function call within a `supports()` function after an * `@import` if available. */ private function tryImportSupportsFunction(): ?SupportsCondition { if (!$this->lookingAtInterpolatedIdentifier()) { return null; } $start = $this->scanner->getPosition(); $name = $this->interpolatedIdentifier(); assert($name->getAsPlain() !== 'not'); if (!$this->scanner->scanChar('(')) { $this->scanner->setPosition($start); return null; } $value = $this->interpolatedDeclarationValue(true, true); $this->scanner->expectChar(')'); return new SupportsFunction($name, $value, $this->scanner->spanFrom($start)); } /** * Consumes a `@include` rule. * * $start should point before the `@`. */ private function includeRule(int $start): IncludeRule { $namespace = null; $name = $this->identifier(); if ($this->scanner->scanChar('.')) { $namespace = $name; $name = $this->publicIdentifier(); } $this->whitespace(); $arguments = $this->scanner->peekChar() === '(' ? $this->argumentInvocation(true) : ArgumentInvocation::createEmpty($this->scanner->getEmptySpan()); $this->whitespace(); $contentArguments = null; if ($this->scanIdentifier('using')) { $this->whitespace(); $contentArguments = $this->argumentDeclaration(); $this->whitespace(); } $content = null; if ($contentArguments !== null || $this->lookingAtChildren()) { $contentArguments = $contentArguments ?? ArgumentDeclaration::createEmpty($this->scanner->getEmptySpan()); $wasInContentBlock = $this->inContentBlock; $this->inContentBlock = true; $content = $this->withChildren($this->statement(...), $start, fn(array $children, FileSpan $span) => new ContentBlock($contentArguments, $children, $span)); $this->inContentBlock = $wasInContentBlock; } else { $this->expectStatementSeparator(); } $span = $this->scanner->spanFrom($start, $start)->expand(($content ?? $arguments)->getSpan()); // TODO remove this when implementing modules if ($namespace !== null) { $this->error('Sass modules are not implemented yet.', $this->scanner->spanFrom($start)); } return new IncludeRule($name, $arguments, $span, $namespace, $content); } /** * Consumes a `@media` rule. * * $start should point before the `@`. */ protected function mediaRule(int $start): MediaRule { $query = $this->mediaQueryList(); return $this->withChildren($this->statement(...), $start, fn(array $children, FileSpan $span) => new MediaRule($query, $children, $span)); } /** * Consumes a mixin declaration. * * $start should point before the `@`. */ private function mixinRule(int $start): MixinRule { $precedingComment = $this->lastSilentComment; $this->lastSilentComment = null; $beforeName = $this->scanner->getPosition(); $name = $this->identifier(); if (str_starts_with($name, '--')) { LoggerUtil::warnForDeprecation( $this->logger, Deprecation::cssFunctionMixin, "Sass @mixin names beginning with -- are deprecated for forward-compatibility with plain CSS mixins.\n\nFor details, see https://sass-lang.com/d/css-function-mixin", $this->scanner->spanFrom($beforeName) ); } $this->whitespace(); $arguments = $this->scanner->peekChar() === '(' ? $this->argumentDeclaration() : ArgumentDeclaration::createEmpty($this->scanner->getEmptySpan()); if ($this->inMixin || $this->inContentBlock) { $this->error('Mixins may not contain mixin declarations.', $this->scanner->spanFrom($start)); } if ($this->inControlDirective) { $this->error('Mixins may not be declared in control directives.', $this->scanner->spanFrom($start)); } $this->whitespace(); $this->inMixin = true; return $this->withChildren($this->statement(...), $start, function (array $children, FileSpan $span) use ($name, $arguments, $precedingComment) { $this->inMixin = false; return new MixinRule($name, $arguments, $span, $children, $precedingComment); }); } /** * Consumes a `@moz-document` rule. * * Gecko's `@-moz-document` diverges from [the specification][] allows the * `url-prefix` and `domain` functions to omit quotation marks, contrary to * the standard. * * [the specification]: https://www.w3.org/TR/css3-conditional/ */ protected function mozDocumentRule(int $start, Interpolation $name): AtRule { $valueStart = $this->scanner->getPosition(); $buffer = new InterpolationBuffer(); $needsDeprecationWarning = false; while (true) { if ($this->scanner->peekChar() === '#') { $buffer->add($this->singleInterpolation()); $needsDeprecationWarning = true; } else { $identifierStart = $this->scanner->getPosition(); $identifier = $this->identifier(); switch ($identifier) { case 'url': case 'url-prefix': case 'domain': $contents = $this->tryUrlContents($identifierStart, $identifier); if ($contents !== null) { $buffer->addInterpolation($contents); } else { $this->scanner->expectChar('('); $this->whitespace(); $argument = $this->interpolatedString(); $this->scanner->expectChar(')'); $buffer->write($identifier); $buffer->write('('); $buffer->addInterpolation($argument->asInterpolation()); $buffer->write(')'); } // A url-prefix with no argument, or with an empty string as an // argument, is not (yet) deprecated. $trailing = $buffer->getTrailingString(); if (!str_ends_with($trailing, 'url-prefix()') && !str_ends_with($trailing, "url-prefix('')") && !str_ends_with($trailing, 'url-prefix("")')) { $needsDeprecationWarning = true; } break; case 'regexp': $buffer->write('regexp('); $this->scanner->expectChar('('); $buffer->addInterpolation($this->interpolatedString()->asInterpolation()); $this->scanner->expectChar(')'); $buffer->write(')'); $needsDeprecationWarning = true; break; default: $this->error('Invalid function name.', $this->scanner->spanFrom($identifierStart)); } } $this->whitespace(); if (!$this->scanner->scanChar(',')) { break; } $buffer->write(','); $buffer->write($this->rawText($this->whitespace(...))); } $value = $buffer->buildInterpolation($this->scanner->spanFrom($valueStart)); return $this->withChildren($this->statement(...), $start, function (array $children, FileSpan $span) use ($name, $value, $needsDeprecationWarning) { if ($needsDeprecationWarning) { LoggerUtil::warnForDeprecation($this->logger, Deprecation::mozDocument, "@-moz-document is deprecated and support will be removed in Dart Sass 2.0.0.\n\nFor details, see https://sass-lang.com/d/moz-document.", $span); } return new AtRule($name, $span, $value, $children); }); } /** * Consumes a `@return` rule. * * $start should point before the `@`. */ private function returnRule(int $start): ReturnRule { $value = $this->expression(); $this->expectStatementSeparator('@return rule'); return new ReturnRule($value, $this->scanner->spanFrom($start)); } /** * Consumes a `@supports` rule. * * $start should point before the `@`. */ protected function supportsRule(int $start): SupportsRule { $condition = $this->supportsCondition(); $this->whitespace(); return $this->withChildren($this->statement(...), $start, fn(array $children, FileSpan $span) => new SupportsRule($condition, $children, $span)); } /** * Consumes a `@warn` rule. * * $start should point before the `@`. */ private function warnRule(int $start): WarnRule { $value = $this->expression(); $this->expectStatementSeparator('@warn rule'); return new WarnRule($value, $this->scanner->spanFrom($start)); } /** * Consumes a `@while` rule. * * $start should point before the `@`. $child is called to consume any * children that are specifically allowed in the caller's context. * * @param callable(): Statement $child * * @param-immediately-invoked-callable $child */ private function whileRule(int $start, callable $child): WhileRule { $wasInControlDirective = $this->inControlDirective; $this->inControlDirective = true; $condition = $this->expression(); return $this->withChildren($child, $start, function (array $children, FileSpan $span) use ($condition, $wasInControlDirective) { $this->inControlDirective = $wasInControlDirective; return new WhileRule($condition, $children, $span); }); } /** * Consumes an at-rule that's not explicitly supported by Sass. * * $start should point before the `@`. $name is the name of the at-rule. */ protected function unknownAtRule(int $start, Interpolation $name): AtRule { $wasInUnknownAtRule = $this->inUnknownAtRule; $this->inUnknownAtRule = true; $value = null; $next = $this->scanner->peekChar(); if ($next !== '!' && !$this->atEndOfStatement()) { $value = $this->interpolatedDeclarationValue(allowOpenBrace: false); } if ($this->lookingAtChildren()) { $rule = $this->withChildren($this->statement(...), $start, fn(array $children, FileSpan $span) => new AtRule($name, $span, $value, $children)); } else { $this->expectStatementSeparator(); $rule = new AtRule($name, $this->scanner->spanFrom($start), $value); } $this->inUnknownAtRule = $wasInUnknownAtRule; return $rule; } /** * Throws an exception indicating that the at-rule starting at $start is * not allowed in the current context. */ private function disallowedAtRule(int $start): never { $this->interpolatedDeclarationValue(allowEmpty: true, allowOpenBrace: false); $this->error('This at-rule is not allowed here.', $this->scanner->spanFrom($start)); } /** * Consumes an argument declaration. */ private function argumentDeclaration(): ArgumentDeclaration { $start = $this->scanner->getPosition(); $this->scanner->expectChar('('); $this->whitespace(); $arguments = []; $named = []; $restArgument = null; while ($this->scanner->peekChar() === '$') { $variableStart = $this->scanner->getPosition(); $name = $this->variableName(); $this->whitespace(); $defaultValue = null; if ($this->scanner->scanChar(':')) { $this->whitespace(); $defaultValue = $this->expressionUntilComma(); } elseif ($this->scanner->scanChar('.')) { $this->scanner->expectChar('.'); $this->scanner->expectChar('.'); $this->whitespace(); $restArgument = $name; break; } $argument = new Argument($name, $this->scanner->spanFrom($variableStart), $defaultValue); $arguments[] = $argument; if (isset($named[$name])) { $this->error('Duplicate argument.', $argument->getSpan()); } $named[$name] = true; if (!$this->scanner->scanChar(',')) { break; } $this->whitespace(); } $this->scanner->expectChar(')'); return new ArgumentDeclaration($arguments, $this->scanner->spanFrom($start), $restArgument); } /** * Consumes an argument invocation. * * If $mixin is `true`, this is parsed as a mixin invocation. Mixin * invocations don't allow the Microsoft-style `=` operator at the top level, * but function invocations do. * * If $allowEmptySecondArg is `true`, this allows the second argument to be * omitted, in which case an unquoted empty string will be passed in its * place. */ private function argumentInvocation(bool $mixin = false, bool $allowEmptySecondArg = false): ArgumentInvocation { $start = $this->scanner->getPosition(); $this->scanner->expectChar('('); $this->whitespace(); $positional = []; $named = []; $rest = null; $keywordRest = null; while ($this->lookingAtExpression()) { $expression = $this->expressionUntilComma(!$mixin); $this->whitespace(); if ($expression instanceof VariableExpression && $this->scanner->scanChar(':')) { $this->whitespace(); if (isset($named[$expression->getName()])) { $this->error('Duplicate argument.', $expression->getSpan()); } $named[$expression->getName()] = $this->expressionUntilComma(!$mixin); } elseif ($this->scanner->scanChar('.')) { $this->scanner->expectChar('.'); $this->scanner->expectChar('.'); if ($rest === null) { $rest = $expression; } else { $keywordRest = $expression; $this->whitespace(); break; } } elseif ($named) { $this->error('Positional arguments must come before keyword arguments.', $expression->getSpan()); } else { $positional[] = $expression; } $this->whitespace(); if (!$this->scanner->scanChar(',')) { break; } $this->whitespace(); if ($allowEmptySecondArg && \count($positional) === 1 && \count($named) === 0 && $rest === null && $this->scanner->peekChar() === ')') { $positional[] = StringExpression::plain('', $this->scanner->getEmptySpan()); break; } } $this->scanner->expectChar(')'); return new ArgumentInvocation($positional, $named, $this->scanner->spanFrom($start), $rest, $keywordRest); } /** * Consumes an expression. * * @param (callable(): bool)|null $until * @phpstan-impure */ private function expression(?callable $until = null, bool $singleEquals = false, bool $bracketList = false): Expression { if ($until !== null && $until()) { $this->scanner->error('Expected expression.'); } $beforeBracket = null; if ($bracketList) { $beforeBracket = $this->scanner->getPosition(); $this->scanner->expectChar('['); $this->whitespace(); if ($this->scanner->scanChar(']')) { return new ListExpression([], ListSeparator::UNDECIDED, $this->scanner->spanFrom($beforeBracket), true); } } $start = $this->scanner->getPosition(); $wasInExpression = $this->inExpression; $wasInParentheses = $this->inParentheses; $this->inExpression = true; /** * @var list<Expression>|null $commaExpressions */ $commaExpressions = null; /** * @var list<Expression>|null $spaceExpressions */ $spaceExpressions = null; /** * Operators whose right-hand $operands are not fully parsed yet, in order of * appearance in the document. Because a low-precedence operator will cause * parsing to finish for all preceding higher-precedence $operators, this is * naturally ordered from lowest to highest precedence. * * @var list<BinaryOperator>|null $operators */ $operators = null; /** * The left-hand sides of $operators. `$operands[n]` is the left-hand side * of `$operators[n]`. * * @var list<Expression>|null $operands */ $operands = null; /** * Whether the single expression parsed so far may be interpreted as * slash-separated numbers. */ $allowSlash = true; /** * The leftmost expression that's been fully-parsed. This can be null in * special cases where the expression begins with a sub-expression but has * a later character that indicates that the outer expression isn't done, * as here: * * foo, bar * ^ * * @var Expression|null $singleExpression */ $singleExpression = $this->singleExpression(); /** * Resets the scanner state to the state it was at the beginning of the * expression, except for {@see $inParentheses}. */ $resetState = function () use (&$commaExpressions, &$spaceExpressions, &$operators, &$operands, &$allowSlash, &$singleExpression, $start): void { $commaExpressions = null; $spaceExpressions = null; $operators = null; $operands = null; $this->scanner->setPosition($start); $allowSlash = true; $singleExpression = $this->singleExpression(); }; $resolveOneOperation = function () use (&$operands, &$operators, &$singleExpression, &$allowSlash): void { assert($operands !== null); assert($operators !== null); $operator = array_pop($operators); assert($operator !== null, 'The list of operators must not be empty'); $left = array_pop($operands); assert($left !== null, 'The list of operands must not be empty'); $right = $singleExpression; if ($right === null) { $this->scanner->error('Expected expression.', $this->scanner->getPosition() - \strlen($operator->getOperator()), \strlen($operator->getOperator())); } if ($allowSlash && !$this->inParentheses && $operator === BinaryOperator::DIVIDED_BY && self::isSlashOperand($left) && self::isSlashOperand($right)) { $singleExpression = BinaryOperationExpression::slash($left, $right); } else { $singleExpression = new BinaryOperationExpression($operator, $left, $right); $allowSlash = false; if ($operator === BinaryOperator::PLUS || $operator === BinaryOperator::MINUS) { if ( $this->scanner->substring($right->getSpan()->getStart()->getOffset() - 1, $right->getSpan()->getStart()->getOffset()) === $operator->getOperator() && Character::isWhitespace($this->scanner->getString()[$left->getSpan()->getEnd()->getOffset()]) ) { $operatorText = $operator->getOperator(); $message = <<<WARNING This operation is parsed as: $left $operatorText $right but you may have intended it to mean: $left ($operatorText$right) Add a space after $operatorText to clarify that it's meant to be a binary operation, or wrap it in parentheses to make it a unary operation. This will be an error in future versions of Sass. More info and automated migrator: https://sass-lang.com/d/strict-unary WARNING; LoggerUtil::warnForDeprecation($this->logger, Deprecation::strictUnary, $message, $singleExpression->getSpan()); } } } }; $resolveOperations = function () use (&$operators, $resolveOneOperation): void { if ($operators === null) { return; } while ($operators) { $resolveOneOperation(); } }; $addSingleExpression = function (Expression $expression) use (&$singleExpression, &$allowSlash, &$spaceExpressions, $resetState, $resolveOperations): void { if ($singleExpression !== null) { // If we discover we're parsing a list whose first element is a division // operation, and we're in parentheses, reparse outside of a paren // context. This ensures that `(1/2 1)` doesn't perform division on its // first element. if ($this->inParentheses) { $this->inParentheses = false; if ($allowSlash) { $resetState(); return; } } $spaceExpressions = $spaceExpressions ?? []; $resolveOperations(); $spaceExpressions[] = $singleExpression; $allowSlash = true; } $singleExpression = $expression; }; $addOperator = function (BinaryOperator $operator) use (&$allowSlash, &$operators, &$operands, &$singleExpression, $resolveOneOperation): void { if ( $this->isPlainCss() && $operator !== BinaryOperator::SINGLE_EQUALS // These are allowed in calculations, so we have to check them at // evaluation time. && $operator !== BinaryOperator::PLUS && $operator !== BinaryOperator::MINUS && $operator !== BinaryOperator::TIMES && $operator !== BinaryOperator::DIVIDED_BY ) { $this->scanner->error("Operators aren't allowed in plain CSS.", $this->scanner->getPosition() - \strlen($operator->getOperator()), \strlen($operator->getOperator())); } $allowSlash = $allowSlash && $operator === BinaryOperator::DIVIDED_BY; $operators = $operators ?? []; $operands = $operands ?? []; $precedence = $operator->getPrecedence(); while ($operators && $operators[\count($operators) - 1]->getPrecedence() >= $precedence) { $resolveOneOperation(); } $operators[] = $operator; if ($singleExpression === null) { $this->scanner->error('Expected expression.', $this->scanner->getPosition() - \strlen($operator->getOperator()), \strlen($operator->getOperator())); } $operands[] = $singleExpression; $this->whitespace(); $singleExpression = $this->singleExpression(); }; $resolveSpaceExpressions = function () use (&$spaceExpressions, &$singleExpression, $resolveOperations): void { $resolveOperations(); if ($spaceExpressions !== null) { if ($singleExpression === null) { $this->scanner->error('Expected expression.'); } $spaceExpressions[] = $singleExpression; $singleExpression = new ListExpression( $spaceExpressions, ListSeparator::SPACE, $spaceExpressions[0]->getSpan()->expand($spaceExpressions[\count($spaceExpressions) - 1]->getSpan()) ); $spaceExpressions = null; } }; while (true) { $this->whitespace(); if ($until !== null && $until()) { break; } $first = $this->scanner->peekChar(); switch ($first) { case '(': // Parenthesized numbers can't be slash-separated. $addSingleExpression($this->parentheses()); break; case '[': $addSingleExpression($this->expression(null, false, true)); break; case '$': $addSingleExpression($this->variable()); break; case '&': $addSingleExpression($this->selector()); break; case "'": case '"': $addSingleExpression($this->interpolatedString()); break; case '#': $addSingleExpression($this->hashExpression()); break; case '=': $this->scanner->readChar(); if ($singleEquals && $this->scanner->peekChar() !== '=') { $addOperator(BinaryOperator::SINGLE_EQUALS); } else { $this->scanner->expectChar('='); $addOperator(BinaryOperator::EQUALS); } break; case '!': $next = $this->scanner->peekChar(1); if ($next === '=') { $this->scanner->readChar(); $this->scanner->readChar(); $addOperator(BinaryOperator::NOT_EQUALS); } elseif ($next === null || $next === 'i' || $next === 'I' || Character::isWhitespace($next)) { $addSingleExpression($this->importantExpression()); } else { break 2; } break; case '<': $this->scanner->readChar(); $addOperator($this->scanner->scanChar('=') ? BinaryOperator::LESS_THAN_OR_EQUALS : BinaryOperator::LESS_THAN); break; case '>': $this->scanner->readChar(); $addOperator($this->scanner->scanChar('=') ? BinaryOperator::GREATER_THAN_OR_EQUALS : BinaryOperator::GREATER_THAN); break; case '*': $this->scanner->readChar(); $addOperator(BinaryOperator::TIMES); break; case '+': if ($singleExpression === null) { $addSingleExpression($this->unaryOperation()); } else { $this->scanner->readChar(); $addOperator(BinaryOperator::PLUS); } break; case '-': $next = $this->scanner->peekChar(1); // Make sure `1-2` parses as `1 - 2`, not `1 (-2)`. if ((Character::isDigit($next) || $next === '.') && ($singleExpression === null || Character::isWhitespace($this->scanner->peekChar(-1)))) { $addSingleExpression($this->number()); } elseif ($this->lookingAtInterpolatedIdentifier()) { $addSingleExpression($this->identifierLike()); } elseif ($singleExpression === null) { $addSingleExpression($this->unaryOperation()); } else { $this->scanner->readChar(); $addOperator(BinaryOperator::MINUS); } break; case '/': if ($singleExpression === null) { $addSingleExpression($this->unaryOperation()); } else { $this->scanner->readChar(); $addOperator(BinaryOperator::DIVIDED_BY); } break; case '%': $this->scanner->readChar(); $addOperator(BinaryOperator::MODULO); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': $addSingleExpression($this->number()); break; case '.': if ($this->scanner->peekChar(1) === '.') { break 2; } $addSingleExpression($this->number()); break; case 'a': if (!$this->isPlainCss() && $this->scanIdentifier('and')) { $addOperator(BinaryOperator::AND); } else { $addSingleExpression($this->identifierLike()); } break; case 'o': if (!$this->isPlainCss() && $this->scanIdentifier('or')) { $addOperator(BinaryOperator::OR); } else { $addSingleExpression($this->identifierLike()); } break; case 'u': case 'U': if ($this->scanner->peekChar(1) === '+') { $addSingleExpression($this->unicodeRange()); } else { $addSingleExpression($this->identifierLike()); } break; case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'p': case 'q': case 'r': case 's': case 't': case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case '\\': $addSingleExpression($this->identifierLike()); break; case ',': // If we discover we're parsing a list whose first element is a // division operation, and we're in parentheses, reparse outside of a // paren context. This ensures that `(1/2, 1)` doesn't perform division // on its first element. if ($this->inParentheses) { $this->inParentheses = false; if ($allowSlash) { $resetState(); break; } } $commaExpressions = $commaExpressions ?? []; if ($singleExpression === null) { $this->scanner->error('Expected expression.'); } $resolveSpaceExpressions(); $commaExpressions[] = $singleExpression; $this->scanner->readChar(); $allowSlash = true; $singleExpression = null; break; default: if ($first !== null && \ord($first) >= 0x80) { $addSingleExpression($this->identifierLike()); break; } break 2; } } if ($bracketList) { $this->scanner->expectChar(']'); } if ($commaExpressions !== null) { $resolveSpaceExpressions(); $this->inParentheses = $wasInParentheses; if ($singleExpression !== null) { $commaExpressions[] = $singleExpression; } $this->inExpression = $wasInExpression; return new ListExpression($commaExpressions, ListSeparator::COMMA, $this->scanner->spanFrom($beforeBracket ?? $start), $bracketList); } if ($bracketList && $spaceExpressions !== null) { $resolveOperations(); $this->inExpression = $wasInExpression; assert($singleExpression !== null); $spaceExpressions[] = $singleExpression; return new ListExpression($spaceExpressions, ListSeparator::SPACE, $this->scanner->spanFrom($beforeBracket), true); } $resolveSpaceExpressions(); assert($singleExpression !== null); if ($bracketList) { assert($beforeBracket !== null); $singleExpression = new ListExpression([$singleExpression], ListSeparator::UNDECIDED, $this->scanner->spanFrom($beforeBracket), true); } $this->inExpression = $wasInExpression; return $singleExpression; } /** * Consumes an expression until it reaches a top-level comma. * * If $singleEquals is true, this will allow the Microsoft-style `=` * operator at the top level. * * @phpstan-impure */ protected function expressionUntilComma(bool $singleEquals = false): Expression { return $this->expression(fn() => $this->scanner->peekChar() === ',', $singleEquals); } /** * Whether $expression is allowed as an operand of a `/` expression that * produces a potentially slash-separated number. */ private static function isSlashOperand(Expression $expression): bool { return $expression instanceof NumberExpression || $expression instanceof FunctionExpression || ($expression instanceof BinaryOperationExpression && $expression->allowsSlash()); } /** * Consumes an expression that doesn't contain any top-level whitespace. */ private function singleExpression(): Expression { $first = $this->scanner->peekChar(); switch ($first) { case '(': return $this->parentheses(); case '/': return $this->unaryOperation(); case '.': return $this->number(); case '[': return $this->expression(null, false, true); case '$': return $this->variable(); case '&': return $this->selector(); case "'": case '"': return $this->interpolatedString(); case '#': return $this->hashExpression(); case '+': return $this->plusExpression(); case '-': return $this->minusExpression(); case '!': return $this->importantExpression(); case 'u': case 'U': if ($this->scanner->peekChar(1) === '+') { return $this->unicodeRange(); } return $this->identifierLike(); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return $this->number(); case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case '\\': return $this->identifierLike(); default: if ($first !== null && \ord($first) >= 0x80) { return $this->identifierLike(); } $this->scanner->error('Expected expression.'); } } /** * Consumes a parenthesized expression. */ protected function parentheses(): Expression { if ($this->isPlainCss()) { $this->scanner->error("Parentheses aren't allowed in plain CSS."); } $wasInParentheses = $this->inParentheses; $this->inParentheses = true; try { $start = $this->scanner->getPosition(); $this->scanner->expectChar('('); $this->whitespace(); if (!$this->lookingAtExpression()) { $this->scanner->expectChar(')'); return new ListExpression([], ListSeparator::UNDECIDED, $this->scanner->spanFrom($start)); } $first = $this->expressionUntilComma(); if ($this->scanner->scanChar(':')) { $this->whitespace(); return $this->map($first, $start); } if (!$this->scanner->scanChar(',')) { $this->scanner->expectChar(')'); return new ParenthesizedExpression($first, $this->scanner->spanFrom($start)); } $this->whitespace(); $expressions = [$first]; while (true) { if (!$this->lookingAtExpression()) { break; } $expressions[] = $this->expressionUntilComma(); if (!$this->scanner->scanChar(',')) { break; } $this->whitespace(); } $this->scanner->expectChar(')'); return new ListExpression($expressions, ListSeparator::COMMA, $this->scanner->spanFrom($start)); } finally { $this->inParentheses = $wasInParentheses; } } /** * Consumes a map expression. * * This expects to be called after the first colon in the map, with $first * as the expression before the colon and $start the point before the * opening parenthesis. */ private function map(Expression $first, int $start): MapExpression { $pairs = [ [$first, $this->expressionUntilComma()], ]; while ($this->scanner->scanChar(',')) { $this->whitespace(); if (!$this->lookingAtExpression()) { break; } $key = $this->expressionUntilComma(); $this->scanner->expectChar(':'); $this->whitespace(); $value = $this->expressionUntilComma(); $pairs[] = [$key, $value]; } $this->scanner->expectChar(')'); return new MapExpression($pairs, $this->scanner->spanFrom($start)); } /** * Consumes an expression that starts with a `#`. */ private function hashExpression(): Expression { assert($this->scanner->peekChar() === '#'); if ($this->scanner->peekChar(1) === '{') { return $this->identifierLike(); } $start = $this->scanner->getPosition(); $this->scanner->expectChar('#'); $first = $this->scanner->peekChar(); if ($first !== null && Character::isDigit($first)) { return new ColorExpression($this->hexColorContents($start), $this->scanner->spanFrom($start)); } $afterHash = $this->scanner->getPosition(); $identifier = $this->interpolatedIdentifier(); if ($this->isHexColor($identifier)) { $this->scanner->setPosition($afterHash); return new ColorExpression($this->hexColorContents($start), $this->scanner->spanFrom($start)); } $buffer = new InterpolationBuffer(); $buffer->write('#'); $buffer->addInterpolation($identifier); return new StringExpression($buffer->buildInterpolation($this->scanner->spanFrom($start))); } /** * Consumes the contents of a hex color, after the `#`. */ private function hexColorContents(int $start): SassColor { $digit1 = $this->hexDigit(); $digit2 = $this->hexDigit(); $digit3 = $this->hexDigit(); $alpha = null; if (!Character::isHex($this->scanner->peekChar())) { // #abc $red = ($digit1 << 4) + $digit1; $green = ($digit2 << 4) + $digit2; $blue = ($digit3 << 4) + $digit3; } else { $digit4 = $this->hexDigit(); if (!Character::isHex($this->scanner->peekChar())) { #abcd $red = ($digit1 << 4) + $digit1; $green = ($digit2 << 4) + $digit2; $blue = ($digit3 << 4) + $digit3; $alpha = (($digit4 << 4) + $digit4) / 0xff; } else { $red = ($digit1 << 4) + $digit2; $green = ($digit3 << 4) + $digit4; $blue = ($this->hexDigit() << 4) + $this->hexDigit(); if (Character::isHex($this->scanner->peekChar())) { $alpha = (($this->hexDigit() << 4) + $this->hexDigit()) / 0xff; } } } // Don't emit four- or eight-digit hex colors as hex, since that's not // yet well-supported in browsers. return SassColor::rgbInternal($red, $green, $blue, $alpha ?? 1.0, $alpha === null ? new SpanColorFormat($this->scanner->spanFrom($start)) : null); } private function isHexColor(Interpolation $interpolation): bool { $plain = $interpolation->getAsPlain(); if ($plain === null) { return false; } $length = \strlen($plain); if ($length !== 3 && $length !== 4 && $length !== 6 && $length !== 8) { return false; } for ($i = 0; $i < $length; $i++) { if (!Character::isHex($plain[$i])) { return false; } } return true; } /** * Consumes a single hexadecimal digit. * * @phpstan-impure */ private function hexDigit(): int { $char = $this->scanner->peekChar(); if ($char === null || !Character::isHex($char)) { $this->scanner->error('Expected hex digit.'); } return (int) hexdec($this->scanner->readChar()); } /** * Consumes an expression that starts with a `+`. */ private function plusExpression(): Expression { assert($this->scanner->peekChar() === '+'); $next = $this->scanner->peekChar(1); if (Character::isDigit($next) || $next === '.') { return $this->number(); } return $this->unaryOperation(); } /** * Consumes an expression that starts with a `-`. */ private function minusExpression(): Expression { assert($this->scanner->peekChar() === '-'); $next = $this->scanner->peekChar(1); if (Character::isDigit($next) || $next === '.') { return $this->number(); } if ($this->lookingAtInterpolatedIdentifier()) { return $this->identifierLike(); } return $this->unaryOperation(); } /** * Consumes an `!important` expression. */ private function importantExpression(): Expression { assert($this->scanner->peekChar() === '!'); $start = $this->scanner->getPosition(); $this->scanner->readChar(); $this->whitespace(); $this->expectIdentifier('important'); return StringExpression::plain('!important', $this->scanner->spanFrom($start)); } /** * Consumes a unary operation expression. */ private function unaryOperation(): UnaryOperationExpression { $start = $this->scanner->getPosition(); $operator = $this->unaryOperatorFor($this->scanner->readChar()); if ($operator === null) { $this->scanner->error('Expected unary operator.', $this->scanner->getPosition() - 1); } if ($this->isPlainCss() && $operator !== UnaryOperator::DIVIDE) { $this->scanner->error("Operators aren't allowed in plain CSS.", $this->scanner->getPosition() - 1, 1); } $this->whitespace(); $operand = $this->singleExpression(); return new UnaryOperationExpression($operator, $operand, $this->scanner->spanFrom($start)); } /** * Returns the unary operator corresponding to $character, or `null` if * the character is not a unary operator. */ private function unaryOperatorFor(string $character): ?UnaryOperator { return match ($character) { '+' => UnaryOperator::PLUS, '-' => UnaryOperator::MINUS, '/' => UnaryOperator::DIVIDE, default => null, }; } /** * Consumes a number expression. */ private function number(): NumberExpression { $start = $this->scanner->getPosition(); $first = $this->scanner->peekChar(); if ($first === '+' || $first === '-') { $this->scanner->readChar(); } if ($this->scanner->peekChar() !== '.') { $this->consumeNaturalNumber(); } // Don't complain about a dot after a number unless the number starts with a // dot. We don't allow a plain ".", but we need to allow "1." so that // "1..." will work as a rest argument. $this->tryDecimal($this->scanner->getPosition() !== $start && $first !== '+' && $first !== '-'); $this->tryExponent(); // Use PHP's built-in double parsing so that we don't accumulate // floating-point errors for numbers with lots of digits. $number = floatval($this->scanner->substring($start)); $unit = null; if ($this->scanner->scanChar('%')) { $unit = '%'; } elseif ($this->lookingAtIdentifier() && ($this->scanner->peekChar() !== '-' || $this->scanner->peekChar(1) !== '-')) { $unit = $this->identifier(false, true); } return new NumberExpression($number, $this->scanner->spanFrom($start), $unit); } /** * Consumes a natural number (that is, a non-negative integer). * * Doesn't support scientific notation. */ private function consumeNaturalNumber(): void { if (!Character::isDigit($this->scanner->readChar())) { $this->scanner->error('Expected digit.', $this->scanner->getPosition() - 1); } while (Character::isDigit($this->scanner->peekChar())) { $this->scanner->readChar(); } } /** * Consumes the decimal component of a number if it exists. * * If $allowTrailingDot is `false`, this will throw an error if there's a * dot without any numbers following it. Otherwise, it will ignore the dot * without consuming it. */ private function tryDecimal(bool $allowTrailingDot = false): void { if ($this->scanner->peekChar() !== '.') { return; } if (!Character::isDigit($this->scanner->peekChar(1))) { if ($allowTrailingDot) { return; } $this->scanner->error('Expected digit.', $this->scanner->getPosition() + 1); } $this->scanner->readChar(); while (Character::isDigit($this->scanner->peekChar())) { $this->scanner->readChar(); } } /** * Consumes the exponent component of a number if it exists. */ private function tryExponent(): void { $first = $this->scanner->peekChar(); if ($first !== 'e' && $first !== 'E') { return; } $next = $this->scanner->peekChar(1); if (!Character::isDigit($next) && $next !== '-' && $next !== '+') { return; } $this->scanner->readChar(); if ($next === '+' || $next === '-') { $this->scanner->readChar(); } if (!Character::isDigit($this->scanner->peekChar())) { $this->scanner->error('Expected digit.'); } while (Character::isDigit($this->scanner->peekChar())) { $this->scanner->readChar(); } } /** * Consumes a unicode range expression. */ private function unicodeRange(): StringExpression { $start = $this->scanner->getPosition(); $this->expectIdentChar('u'); $this->scanner->expectChar('+'); $firstRangeLength = 0; while ($this->scanCharIf(Character::isHex(...))) { $firstRangeLength++; } $hasQuestionMark = false; while ($this->scanner->scanChar('?')) { $hasQuestionMark = true; $firstRangeLength++; } if ($firstRangeLength === 0) { $this->scanner->error('Expected hex digit or "?".'); } elseif ($firstRangeLength > 6) { $this->error('Expected at most 6 digits.', $this->scanner->spanFrom($start)); } elseif ($hasQuestionMark) { return StringExpression::plain($this->scanner->substring($start), $this->scanner->spanFrom($start)); } if ($this->scanner->scanChar('-')) { $secondRangeStart = $this->scanner->getPosition(); $secondRangeLength = 0; while ($this->scanCharIf(Character::isHex(...))) { $secondRangeLength++; } if ($secondRangeLength === 0) { $this->scanner->error('Expected hex digit.'); } elseif ($secondRangeLength > 6) { $this->error('Expected at most 6 digits.', $this->scanner->spanFrom($secondRangeStart)); } } if ($this->lookingAtInterpolatedIdentifierBody()) { $this->scanner->error('Expected end of identifier.'); } return StringExpression::plain($this->scanner->substring($start), $this->scanner->spanFrom($start)); } /** * Consumes a variable expression. */ private function variable(): VariableExpression { $start = $this->scanner->getPosition(); $name = $this->variableName(); if ($this->isPlainCss()) { $this->error('Sass variables aren\'t allowed in plain CSS.', $this->scanner->spanFrom($start)); } return new VariableExpression($name, $this->scanner->spanFrom($start)); } /** * Consumes a selector expression. */ private function selector(): SelectorExpression { if ($this->isPlainCss()) { $this->scanner->error("The parent selector isn't allowed in plain CSS.", null, 1); } $start = $this->scanner->getPosition(); $this->scanner->expectChar('&'); if ($this->scanner->scanChar('&')) { $this->warn('In Sass, "&&" means two copies of the parent selector. You probably want to use "and" instead.', $this->scanner->spanFrom($start)); $this->scanner->setPosition($this->scanner->getPosition() - 1); } return new SelectorExpression($this->scanner->spanFrom($start)); } /** * Consumes a quoted string expression. */ protected function interpolatedString(): StringExpression { $start = $this->scanner->getPosition(); $quote = $this->scanner->readChar(); if ($quote !== "'" && $quote !== '"') { $this->scanner->error('Expected string.', $start); } $buffer = new InterpolationBuffer(); while (true) { $next = $this->scanner->peekChar(); if ($next === $quote) { $this->scanner->readChar(); break; } if ($next === null || Character::isNewline($next)) { $this->scanner->error("Expected $quote."); } if ($next === '\\') { $second = $this->scanner->peekChar(1); if (Character::isNewline($second)) { $this->scanner->readChar(); $this->scanner->readChar(); if ($second === "\r") { $this->scanner->scanChar("\n"); } } else { $buffer->write($this->escapeCharacter()); } } elseif ($next === '#') { if ($this->scanner->peekChar(1) === '{') { $buffer->add($this->singleInterpolation()); } else { $buffer->write($this->scanner->readChar()); } } else { $buffer->write($this->scanner->readUtf8Char()); } } return new StringExpression($buffer->buildInterpolation($this->scanner->spanFrom($start)), true); } /** * Consumes an expression that starts like an identifier. */ protected function identifierLike(): Expression { $start = $this->scanner->getPosition(); $identifier = $this->interpolatedIdentifier(); $plain = $identifier->getAsPlain(); if ($plain !== null) { if ($plain === 'if' && $this->scanner->peekChar() === '(') { $invocation = $this->argumentInvocation(); return new IfExpression($invocation, $identifier->getSpan()->expand($invocation->getSpan())); } if ($plain === 'not') { $this->whitespace(); $expression = $this->singleExpression(); return new UnaryOperationExpression(UnaryOperator::NOT, $expression, $identifier->getSpan()->expand($expression->getSpan())); } $lower = strtolower($plain); if ($this->scanner->peekChar() !== '(') { switch ($plain) { case 'false': return new BooleanExpression(false, $identifier->getSpan()); case 'null': return new NullExpression($identifier->getSpan()); case 'true': return new BooleanExpression(true, $identifier->getSpan()); } $color = Colors::colorNameToColor($lower); if ($color !== null) { return new ColorExpression( SassColor::rgbInternal($color->getRed(), $color->getGreen(), $color->getBlue(), $color->getAlpha(), new SpanColorFormat($identifier->getSpan())), $identifier->getSpan() ); } } $specialFunction = $this->trySpecialFunction($lower, $start); if ($specialFunction !== null) { return $specialFunction; } } switch ($this->scanner->peekChar()) { case '.': if ($this->scanner->peekChar(1) === '.') { return new StringExpression($identifier); } $this->scanner->readChar(); if ($plain !== null) { return $this->namespacedExpression($plain, $start); } $this->error("Interpolation isn't allowed in namespaces.", $identifier->getSpan()); case '(': if ($plain === null) { return new InterpolatedFunctionExpression($identifier, $this->argumentInvocation(), $this->scanner->spanFrom($start)); } return new FunctionExpression($plain, $this->argumentInvocation(false, $lower === 'var'), $this->scanner->spanFrom($start)); default: return new StringExpression($identifier); } } /** * Consumes an expression after a namespace. * * This assumes the scanner is positioned immediately after the `.`. The * $start should refer to the state at the beginning of the namespace. */ protected function namespacedExpression(string $namespace, int $start): Expression { if ($this->scanner->peekChar() === '$') { $name = $this->variableName(); $this->assertPublic($name, fn() => $this->scanner->spanFrom($start)); // TODO remove this when implementing modules $this->error('Sass modules are not implemented yet.', $this->scanner->spanFrom($start)); // return new VariableExpression($name, $this->scanner->spanFrom($start), $plain); } // TODO remove this when implementing modules $this->publicIdentifier(); $this->error('Sass modules are not implemented yet.', $this->scanner->spanFrom($start)); // return new FunctionExpression($this->publicIdentifier(), $this->argumentInvocation(), $this->scanner->spanFrom($start), $plain); } /** * If $name is the name of a function with special syntax, consumes it. * * Otherwise, returns `null`. $start is the location before the beginning of $name. */ protected function trySpecialFunction(string $name, int $start): ?Expression { $normalized = Util::unvendor($name); switch ($normalized) { case 'calc': if ($normalized === $name) { return null; } // fall through case 'element': case 'expression': if (!$this->scanner->scanChar('(')) { return null; } $buffer = new InterpolationBuffer(); $buffer->write($name); $buffer->write('('); break; case 'progid': if (!$this->scanner->scanChar(':')) { return null; } $buffer = new InterpolationBuffer(); $buffer->write($name); $buffer->write(':'); $next = $this->scanner->peekChar(); while ($next !== null && (Character::isAlphabetic($next) || $next === '.')) { $buffer->write($this->scanner->readChar()); $next = $this->scanner->peekChar(); } $this->scanner->expectChar('('); $buffer->write('('); break; case 'url': $contents = $this->tryUrlContents($start); if ($contents === null) { return null; } return new StringExpression($contents); default: return null; } $buffer->addInterpolation($this->interpolatedDeclarationValue(true)); $this->scanner->expectChar(')'); $buffer->write(')'); return new StringExpression($buffer->buildInterpolation($this->scanner->spanFrom($start))); } private function tryUrlContents(int $start, ?string $name = null): ?Interpolation { $beginningOfContents = $this->scanner->getPosition(); if (!$this->scanner->scanChar('(')) { return null; } $this->whitespaceWithoutComments(); $buffer = new InterpolationBuffer(); $buffer->write($name ?? 'url'); $buffer->write('('); while (true) { $next = $this->scanner->peekChar(); if ($next === null) { break; } if ($next === '\\') { $buffer->write($this->escape()); } elseif ($next === '!' || $next === '%' || $next === '&' || (\ord($next) >= \ord('*') && \ord($next) <= \ord('~')) || \ord($next) >= 0x80) { $buffer->write($this->scanner->readUtf8Char()); } elseif ($next === '#') { if ($this->scanner->peekChar(1) === '{') { $buffer->add($this->singleInterpolation()); } else { $buffer->write($this->scanner->readChar()); } } elseif (Character::isWhitespace($next)) { $this->whitespaceWithoutComments(); if ($this->scanner->peekChar() !== ')') { break; } } elseif ($next === ')') { $buffer->write($this->scanner->readChar()); return $buffer->buildInterpolation($this->scanner->spanFrom($start)); } else { break; } } $this->scanner->setPosition($beginningOfContents); return null; } /** * Consumes a `url` token that's allowed to contain SassScript. */ protected function dynamicUrl(): Expression { $start = $this->scanner->getPosition(); $this->expectIdentifier('url'); $contents = $this->tryUrlContents($start); if ($contents !== null) { return new StringExpression($contents); } return new InterpolatedFunctionExpression(new Interpolation(['url'], $this->scanner->spanFrom($start)), $this->argumentInvocation(), $this->scanner->spanFrom($start)); } /** * Consumes tokens up to "{", "}", ";", or "!". * * This respects string and comment boundaries and supports interpolation. * Once this interpolation is evaluated, it's expected to be re-parsed. * * If $omitComments is true, comments will still be consumed, but they will * not be included in the returned interpolation. * * Differences from {@see interpolatedDeclarationValue} include: * * - This always stops at curly braces. * - This does not interpret backslashes, since the text is expected to be * re-parsed. * - This does not compress adjacent whitespace characters. */ protected function almostAnyValue(bool $omitComments = false): Interpolation { $start = $this->scanner->getPosition(); $buffer = new InterpolationBuffer(); while (true) { $next = $this->scanner->peekChar(); switch ($next) { case '\\': // Write a literal backslash because this text will be re-parsed. $buffer->write($this->scanner->readChar()); $buffer->write($this->scanner->readUtf8Char()); break; case '"': case "'": $buffer->addInterpolation($this->interpolatedString()->asInterpolation()); break; case '/': switch ($this->scanner->peekChar(1)) { case '*': if (!$omitComments) { $buffer->write($this->rawText($this->loudComment(...))); } else { $this->loudComment(); } break; case '/': if (!$omitComments) { $buffer->write($this->rawText($this->silentComment(...))); } else { $this->silentComment(); } break; default: $buffer->write($this->scanner->readChar()); } break; case '#': if ($this->scanner->peekChar(1) === '{') { // Add a full interpolated identifier to handle cases like // "#{...}--1", since "--1" isn't a valid identifier on its own. $buffer->addInterpolation($this->interpolatedIdentifier()); } else { $buffer->write($this->scanner->readChar()); } break; case "\r": case "\n": case "\f": if ($this->isIndented()) { break 2; } $buffer->write($this->scanner->readChar()); break; case '!': case ';': case '{': case '}': break 2; case 'u': case 'U': $beforeUrl = $this->scanner->getPosition(); $identifier = $this->identifier(); if ( $identifier !== 'url' // This isn't actually a standard CSS feature, but it was // supported by the old `@document` rule, so we continue to support // it for backwards-compatibility. && $identifier !== 'url-prefix' ) { $buffer->write($identifier); continue 2; } $contents = $this->tryUrlContents($beforeUrl, $identifier); if ($contents === null) { $this->scanner->setPosition($beforeUrl); $buffer->write($this->scanner->readChar()); } else { $buffer->addInterpolation($contents); } break; default: if ($next === null) { break 2; } if ($this->lookingAtIdentifier()) { $buffer->write($this->identifier()); } else { $buffer->write($this->scanner->readUtf8Char()); } break; } } return $buffer->buildInterpolation($this->scanner->spanFrom($start)); } /** * Consumes tokens until it reaches a top-level `";"`, `")"`, `"]"`, * or `"}"` and returns their contents as a string. * * If $allowEmpty is `false` (the default), this requires at least one token. * * If $allowSemicolon is `true`, this doesn't stop at semicolons and instead * includes them in the interpolated output. * * If $allowColon is `false`, this stops at top-level colons. * * If $allowOpenBrace is `false`, this stops at opening curly braces. * * If $silentComments is `true`, this will parse silent comments as * comments. Otherwise, it will preserve two adjacent slashes and emit them * to CSS. * * Unlike {@see declarationValue}, this allows interpolation. */ private function interpolatedDeclarationValue(bool $allowEmpty = false, bool $allowSemicolon = false, bool $allowColon = true, bool $allowOpenBrace = true, bool $silentComments = true): Interpolation { $start = $this->scanner->getPosition(); $buffer = new InterpolationBuffer(); $brackets = []; $wroteNewline = false; while (true) { $next = $this->scanner->peekChar(); if ($next === null) { break; } switch ($next) { case '\\': $buffer->write($this->escape(true)); $wroteNewline = false; break; case '"': case "'": $buffer->addInterpolation($this->interpolatedString()->asInterpolation()); $wroteNewline = false; break; case '/': $peekedChar = $this->scanner->peekChar(1); if ($peekedChar === '*') { $buffer->write($this->rawText($this->loudComment(...))); } elseif ($peekedChar === '/' && $silentComments) { $this->silentComment(); } else { $buffer->write($this->scanner->readChar()); } $wroteNewline = false; break; case '#': if ($this->scanner->peekChar(1) === '{') { // Add a full interpolated identifier to handle cases like // "#{...}--1", since "--1" isn't a valid identifier on its own. $buffer->addInterpolation($this->interpolatedIdentifier()); } else { $buffer->write($this->scanner->readChar()); } $wroteNewline = false; break; case ' ': case "\t": $second = $this->scanner->peekChar(1); if ($wroteNewline || $second === null || !Character::isWhitespace($second)) { $buffer->write($this->scanner->readChar()); } else { $this->scanner->readChar(); } break; case "\n": case "\r": case "\f": if ($this->isIndented()) { break 2; } $prev = $this->scanner->peekChar(-1); if ($prev === null || !Character::isNewline($prev)) { $buffer->write("\n"); } $this->scanner->readChar(); $wroteNewline = true; break; case '{': if (!$allowOpenBrace) { break 2; } // Fallthrough case '(': case '[': $bracket = $this->scanner->readChar(); $buffer->write($bracket); $brackets[] = Character::opposite($bracket); $wroteNewline = false; break; case ')': case '}': case ']': if (empty($brackets)) { break 2; } $bracket = array_pop($brackets); $this->scanner->expectChar($bracket); $buffer->write($bracket); $wroteNewline = false; break; case ';': if (!$allowSemicolon && empty($brackets)) { break 2; } $buffer->write($this->scanner->readChar()); $wroteNewline = false; break; case ':': if (!$allowColon && empty($brackets)) { break 2; } $buffer->write($this->scanner->readChar()); $wroteNewline = false; break; case 'u': case 'U': $beforeUrl = $this->scanner->getPosition(); $identifier = $this->identifier(); if ( $identifier !== 'url' // This isn't actually a standard CSS feature, but it was // supported by the old `@document` rule, so we continue to support // it for backwards-compatibility. && $identifier !== 'url-prefix' ) { $buffer->write($identifier); $wroteNewline = false; continue 2; } $contents = $this->tryUrlContents($beforeUrl, $identifier); if ($contents === null) { $this->scanner->setPosition($beforeUrl); $buffer->write($this->scanner->readChar()); } else { $buffer->addInterpolation($contents); } $wroteNewline = false; break; default: if ($this->lookingAtIdentifier()) { $buffer->write($this->identifier()); } else { $buffer->write($this->scanner->readUtf8Char()); } $wroteNewline = false; break; } } if (!empty($brackets)) { $this->scanner->expectChar(array_pop($brackets)); } if (!$allowEmpty && $buffer->isEmpty()) { $this->scanner->error('Expected token.'); } return $buffer->buildInterpolation($this->scanner->spanFrom($start)); } /** * Consumes an identifier that may contain interpolation. */ protected function interpolatedIdentifier(): Interpolation { $start = $this->scanner->getPosition(); $buffer = new InterpolationBuffer(); if ($this->scanner->scanChar('-')) { $buffer->write('-'); if ($this->scanner->scanChar('-')) { $buffer->write('-'); $this->interpolatedIdentifierBody($buffer); return $buffer->buildInterpolation($this->scanner->spanFrom($start)); } } $first = $this->scanner->peekChar(); if ($first === null) { $this->scanner->error('Expected identifier.'); } if (Character::isNameStart($first)) { $buffer->write($this->scanner->readUtf8Char()); } elseif ($first === '\\') { $buffer->write($this->escape(true)); } elseif ($first === '#' && $this->scanner->peekChar(1) === '{') { $buffer->add($this->singleInterpolation()); } else { $this->scanner->error('Expected identifier.'); } $this->interpolatedIdentifierBody($buffer); return $buffer->buildInterpolation($this->scanner->spanFrom($start)); } /** * Consumes a chunk of a possibly-interpolated CSS identifier after the name * start, and adds the contents to the $buffer buffer. */ private function interpolatedIdentifierBody(InterpolationBuffer $buffer): void { while (true) { $next = $this->scanner->peekChar(); if ($next === null) { break; } if ($next === '_' || $next === '-' || Character::isAlphanumeric($next) || \ord($next) >= 0x80) { $buffer->write($this->scanner->readUtf8Char()); } elseif ($next === '\\') { $buffer->write($this->escape()); } elseif ($next === '#' && $this->scanner->peekChar(1) === '{') { $buffer->add($this->singleInterpolation()); } else { break; } } } /** * Consumes interpolation. */ protected function singleInterpolation(): Expression { $start = $this->scanner->getPosition(); $this->scanner->expect('#{'); $this->whitespace(); $contents = $this->expression(); $this->scanner->expectChar('}'); if ($this->isPlainCss()) { $this->error('Interpolation isn\'t allowed in plain CSS.', $this->scanner->spanFrom($start)); } return $contents; } /** * Consumes a list of media queries. */ private function mediaQueryList(): Interpolation { $start = $this->scanner->getPosition(); $buffer = new InterpolationBuffer(); while (true) { $this->whitespace(); $this->mediaQuery($buffer); $this->whitespace(); if (!$this->scanner->scanChar(',')) { break; } $buffer->write(', '); } return $buffer->buildInterpolation($this->scanner->spanFrom($start)); } /** * Consumes a single media query. */ private function mediaQuery(InterpolationBuffer $buffer): void { if ($this->scanner->peekChar() === '(') { $this->mediaInParens($buffer); $this->whitespace(); if ($this->scanIdentifier('and')) { $buffer->write(' and '); $this->expectWhitespace(); $this->mediaLogicSequence($buffer, 'and'); } elseif ($this->scanIdentifier('or')) { $buffer->write(' or '); $this->expectWhitespace(); $this->mediaLogicSequence($buffer, 'or'); } return; } $identifier1 = $this->interpolatedIdentifier(); if (StringUtil::equalsIgnoreCase($identifier1->getAsPlain(), 'not')) { // For example, "@media not (...) {" $this->expectWhitespace(); if (!$this->lookingAtInterpolatedIdentifier()) { $buffer->write('not '); $this->mediaOrInterp($buffer); return; } } $this->whitespace(); $buffer->addInterpolation($identifier1); if (!$this->lookingAtInterpolatedIdentifier()) { // For example, "@media screen {". return; } $buffer->write(' '); $identifier2 = $this->interpolatedIdentifier(); if (StringUtil::equalsIgnoreCase($identifier2->getAsPlain(), 'and')) { $this->expectWhitespace(); // For example, "@media screen and ..." $buffer->write(' and '); } else { $this->whitespace(); $buffer->addInterpolation($identifier2); if ($this->scanIdentifier('and')) { // For example, "@media only screen and ..." $this->expectWhitespace(); $buffer->write(' and '); } else { // For example, "@media only screen {" return; } } // We've consumed either `IDENTIFIER "and"` or // `IDENTIFIER IDENTIFIER "and"`. if ($this->scanIdentifier('not')) { // For example, "@media screen and not (...) {" $this->expectWhitespace(); $buffer->write('not '); $this->mediaOrInterp($buffer); return; } $this->mediaLogicSequence($buffer, 'and'); } /** * Consumes one or more `MediaOrInterp` expressions separated by $operator * and writes them to $buffer. */ private function mediaLogicSequence(InterpolationBuffer $buffer, string $operator): void { while (true) { $this->mediaOrInterp($buffer); $this->whitespace(); if (!$this->scanIdentifier($operator)) { return; } $this->expectWhitespace(); $buffer->write(' '); $buffer->write($operator); $buffer->write(' '); } } /** * Consumes a `MediaOrInterp` expression and writes it to $buffer. */ private function mediaOrInterp(InterpolationBuffer $buffer): void { if ($this->scanner->peekChar() === '#') { $interpolation = $this->singleInterpolation(); $buffer->addInterpolation(new Interpolation([$interpolation], $interpolation->getSpan())); } else { $this->mediaInParens($buffer); } } /** * Consumes a `MediaInParens` expression and writes it to $buffer. */ private function mediaInParens(InterpolationBuffer $buffer): void { $this->scanner->expectChar('(', 'media condition in parentheses'); $buffer->write('('); $this->whitespace(); if ($this->scanner->peekChar() === '(') { $this->mediaInParens($buffer); $this->whitespace(); if ($this->scanIdentifier('and')) { $buffer->write(' and '); $this->expectWhitespace(); $this->mediaLogicSequence($buffer, 'and'); } elseif ($this->scanIdentifier('or')) { $buffer->write(' or '); $this->expectWhitespace(); $this->mediaLogicSequence($buffer, 'or'); } } elseif ($this->scanIdentifier('not')) { $buffer->write('not '); $this->expectWhitespace(); $this->mediaOrInterp($buffer); } else { $buffer->add($this->expressionUntilComparison()); if ($this->scanner->scanChar(':')) { $this->whitespace(); $buffer->write(': '); $buffer->add($this->expression()); } else { $next = $this->scanner->peekChar(); if ($next === '<' || $next === '>' || $next === '=') { $buffer->write(' '); $buffer->write($this->scanner->readChar()); if (($next === '<' || $next === '>') && $this->scanner->scanChar('=')) { $buffer->write('='); } $buffer->write(' '); $this->whitespace(); $buffer->add($this->expressionUntilComparison()); if (($next === '<' || $next === '>') && $this->scanner->scanChar($next)) { $buffer->write(' '); $buffer->write($next); if ($this->scanner->scanChar('=')) { $buffer->write('='); } $buffer->write(' '); $this->whitespace(); $buffer->add($this->expressionUntilComparison()); } } } } $this->scanner->expectChar(')'); $this->whitespace(); $buffer->write(')'); } /** * Consumes an expression until it reaches a top-level `<`, `>`, or a `=` * that's not `==`. */ private function expressionUntilComparison(): Expression { return $this->expression(function () { $next = $this->scanner->peekChar(); if ($next === '=') { return $this->scanner->peekChar(1) !== '='; } return $next === '<' || $next === '>'; }); } /** * Consumes a `@supports` condition. */ private function supportsCondition(): SupportsCondition { $start = $this->scanner->getPosition(); if ($this->scanIdentifier('not')) { $this->whitespace(); return new SupportsNegation($this->supportsConditionInParens(), $this->scanner->spanFrom($start)); } $condition = $this->supportsConditionInParens(); $this->whitespace(); $operator = null; while ($this->lookingAtIdentifier()) { if ($operator !== null) { $this->expectIdentifier($operator); } elseif ($this->scanIdentifier('or')) { $operator = 'or'; } else { $this->expectIdentifier('and'); $operator = 'and'; } $this->whitespace(); $right = $this->supportsConditionInParens(); $condition = new SupportsOperation($condition, $right, $operator, $this->scanner->spanFrom($start)); $this->whitespace(); } return $condition; } /** * Consumes a parenthesized supports condition, or an interpolation. */ private function supportsConditionInParens(): SupportsCondition { $start = $this->scanner->getPosition(); if ($this->lookingAtInterpolatedIdentifier()) { $identifier = $this->interpolatedIdentifier(); if ($identifier->getAsPlain() !== null && strtolower($identifier->getAsPlain()) === 'not') { $this->error('"not" is not a valid identifier here.', $identifier->getSpan()); } if ($this->scanner->scanChar('(')) { $arguments = $this->interpolatedDeclarationValue(true, true); $this->scanner->expectChar(')'); return new SupportsFunction($identifier, $arguments, $this->scanner->spanFrom($start)); } if (\count($identifier->getContents()) !== 1 || !$identifier->getContents()[0] instanceof Expression) { $this->error('Expected @supports condition.', $identifier->getSpan()); } else { return new SupportsInterpolation($identifier->getContents()[0], $identifier->getSpan()); } } $this->scanner->expectChar('('); $this->whitespace(); if ($this->scanIdentifier('not')) { $this->whitespace(); $condition = $this->supportsConditionInParens(); $this->scanner->expectChar(')'); return new SupportsNegation($condition, $this->scanner->spanFrom($start)); } if ($this->scanner->peekChar() === '(') { $condition = $this->supportsCondition(); $this->scanner->expectChar(')'); return $condition; } // Unfortunately, we may have to backtrack here. The grammar is: // // Expression ":" Expression // | InterpolatedIdentifier InterpolatedAnyValue? // // These aren't ambiguous because this `InterpolatedAnyValue` is forbidden // from containing a top-level colon, but we still have to parse the full // expression to figure out if there's a colon after it. // // We could avoid the overhead of a full expression parse by looking ahead // for a colon (outside of balanced brackets), but in practice we expect the // vast majority of real uses to be `Expression ":" Expression`, so it makes // sense to parse that case faster in exchange for less code complexity and // a slower backtracking case. $nameStart = $this->scanner->getPosition(); $wasInParentheses = $this->inParentheses; try { $name = $this->expression(); $this->scanner->expectChar(':'); } catch (FormatException $e) { $this->scanner->setPosition($nameStart); $this->inParentheses = $wasInParentheses; $identifier = $this->interpolatedIdentifier(); $operation = $this->trySupportsOperation($identifier, $nameStart); if ($operation !== null) { $this->scanner->expectChar(')'); return $operation; } // If parsing an expression fails, try to parse an // `InterpolatedAnyValue` instead. But if that value runs into a // top-level colon, then this is probably intended to be a declaration // after all, so we rethrow the declaration-parsing error. $buffer = new InterpolationBuffer(); $buffer->addInterpolation($identifier); $buffer->addInterpolation($this->interpolatedDeclarationValue(true, true, false)); $contents = $buffer->buildInterpolation($this->scanner->spanFrom($nameStart)); if ($this->scanner->peekChar() === ':') { throw $e; } $this->scanner->expectChar(')'); return new SupportsAnything($contents, $this->scanner->spanFrom($start)); } $declaration = $this->supportsDeclarationValue($name, $start); $this->scanner->expectChar(')'); return $declaration; } private function supportsDeclarationValue(Expression $name, int $start): SupportsDeclaration { if ($name instanceof StringExpression && !$name->hasQuotes() && str_starts_with($name->getText()->getInitialPlain(), '--')) { $value = new StringExpression($this->interpolatedDeclarationValue()); } else { $this->whitespace(); $value = $this->expression(); } return new SupportsDeclaration($name, $value, $this->scanner->spanFrom($start)); } /** * If $interpolation is followed by `"and"` or `"or"`, parse it as a supports operation. * * Otherwise, return `null` without moving the scanner position. */ private function trySupportsOperation(Interpolation $interpolation, int $start): ?SupportsOperation { if (\count($interpolation->getContents()) !== 1) { return null; } $expression = $interpolation->getContents()[0]; if (!$expression instanceof Expression) { return null; } $beforeWhitespace = $this->scanner->getPosition(); $this->whitespace(); $operation = null; $operator = null; while ($this->lookingAtIdentifier()) { if ($operator !== null) { $this->expectIdentifier($operator); } elseif ($this->scanIdentifier('and')) { $operator = 'and'; } elseif ($this->scanIdentifier('or')) { $operator = 'or'; } else { $this->scanner->setPosition($beforeWhitespace); return null; } $this->whitespace(); $right = $this->supportsConditionInParens(); $operation = new SupportsOperation($operation ?? new SupportsInterpolation($expression, $interpolation->getSpan()), $right, $operator, $this->scanner->spanFrom($start)); $this->whitespace(); } return $operation; } /** * Returns whether the scanner is immediately before an identifier that may * contain interpolation. * * This is based on [the CSS algorithm][], but it assumes all backslashes * start escapes and it considers interpolation to be valid in an identifier. * * [the CSS algorithm]: https://drafts.csswg.org/css-syntax-3/#would-start-an-identifier */ private function lookingAtInterpolatedIdentifier(): bool { $first = $this->scanner->peekChar(); if ($first === null) { return false; } if ($first === '\\' || Character::isNameStart($first)) { return true; } if ($first === '#' && $this->scanner->peekChar(1) === '{') { return true; } if ($first !== '-') { return false; } $second = $this->scanner->peekChar(1); if ($second === null) { return false; } if ($second === '#') { return $this->scanner->peekChar(2) === '{'; } return $second === '\\' || $second === '-' || Character::isNameStart($second); } /** * Returns whether the scanner is immediately before a sequence of characters * that could be part of an CSS identifier body. * * The identifier body may include interpolation. */ private function lookingAtInterpolatedIdentifierBody(): bool { $first = $this->scanner->peekChar(); if ($first === null) { return false; } if ($first === '\\' || Character::isName($first)) { return true; } return $first === '#' && $this->scanner->peekChar(1) === '{'; } /** * Returns whether the scanner is immediately before a SassScript expression. */ private function lookingAtExpression(): bool { $character = $this->scanner->peekChar(); if ($character === null) { return false; } if ($character === '.') { return $this->scanner->peekChar(1) !== '.'; } if ($character === '!') { $next = $this->scanner->peekChar(1); return $next === null || $next === 'i' || $next === 'I' || Character::isWhitespace($next); } return $character === '(' || $character === '/' || $character === '[' || $character === "'" || $character === '"' || $character === '#' || $character === '+' || $character === '-' || $character === '\\' || $character === '$' || $character === '&' || Character::isNameStart($character) || Character::isDigit($character); } /** * Consumes a block of $child statements and passes them, as well as the * span from $start to the end of the child block, to $create. * * @template T * @param callable(): Statement $child * @param callable(Statement[], FileSpan): T $create * @return T * * @param-immediately-invoked-callable $child * @param-immediately-invoked-callable $create */ private function withChildren(callable $child, int $start, callable $create) { $children = $this->children($child); $result = $create($children, $this->scanner->spanFrom($start)); $this->whitespaceWithoutComments(); return $result; } /** * Like {@see identifier}, but rejects identifiers that begin with `_` or `-`. */ private function publicIdentifier(): string { $start = $this->scanner->getPosition(); $result = $this->identifier(); $this->assertPublic($result, fn() => $this->scanner->spanFrom($start)); return $result; } /** * Throws an error if $identifier isn't public. * * Calls $span to provide the span for an error if one occurs. * * @param callable(): FileSpan $span * * @param-immediately-invoked-callable $span */ private function assertPublic(string $identifier, callable $span): void { if (!Character::isPrivate($identifier)) { return; } $this->error("Private members can't be accessed from outside their modules.", $span()); } /** * Adds $expression to $buffer, or if it's an unquoted string adds the * interpolation it contains instead. */ private function addOrInject(InterpolationBuffer $buffer, Expression $expression): void { if ($expression instanceof StringExpression && !$expression->hasQuotes()) { $buffer->addInterpolation($expression->getText()); } else { $buffer->add($expression); } } /** * Whether this is parsing the indented syntax. */ abstract protected function isIndented(): bool; /** * Whether this is a plain CSS stylesheet. */ protected function isPlainCss(): bool { return false; } /** * The indentation level at the current scanner position. * * This value isn't used directly by StylesheetParser; it's just passed to * {@see scanElse}. */ abstract protected function getCurrentIndentation(): int; /** * Parses and returns a selector used in a style rule. */ abstract protected function styleRuleSelector(): Interpolation; /** * Asserts that the scanner is positioned before a statement separator, or at * the end of a list of statements. * * If the name of the parent rule is passed, it's used for error reporting. * * This consumes whitespace, but nothing else, including comments. * * @throws FormatException */ abstract protected function expectStatementSeparator(?string $name = null): void; /** * Whether the scanner is positioned at the end of a statement. */ abstract protected function atEndOfStatement(): bool; /** * Whether the scanner is positioned before a block of children that can be * parsed with {@see children}. */ abstract protected function lookingAtChildren(): bool; /** * Tries to scan an `@else` rule after an `@if` block, and returns whether that succeeded. * * This should just scan the rule name, not anything afterwards. * $ifIndentation is the result of {@see getCurrentIndentation} from before the * corresponding `@if` was parsed. */ abstract protected function scanElse(int $ifIndentation): bool; /** * Consumes a block of child statements. * * Unlike most production consumers, this does *not* consume trailing * whitespace. This is necessary to ensure that the source span for the * parent rule doesn't cover whitespace after the rule. * * @param callable(): Statement $child * * @return Statement[] * * @param-immediately-invoked-callable $child */ abstract protected function children(callable $child): array; /** * Consumes top-level statements. * * The $statement callback may return `null`, indicating that a statement * was consumed that shouldn't be added to the AST. * * @param callable(): ?Statement $statement * * @return Statement[] * * @param-immediately-invoked-callable $statement */ abstract protected function statements(callable $statement): array; } PKBA#]�@�00Dsystem/helixultimate/vendor/scssphp/scssphp/src/Parser/CssParser.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; use ScssPhp\ScssPhp\Ast\Sass\ArgumentInvocation; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression\FunctionExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\ParenthesizedExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\StringExpression; use ScssPhp\ScssPhp\Ast\Sass\Import\StaticImport; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Statement\ImportRule; use ScssPhp\ScssPhp\Function\FunctionRegistry; /** * A parser for imported CSS files. * * @internal */ final class CssParser extends ScssParser { /** * Sass global functions which are shadowing a CSS function are allowed in CSS files. */ private const CSS_ALLOWED_FUNCTIONS = [ 'rgb' => true, 'rgba' => true, 'hsl' => true, 'hsla' => true, 'grayscale' => true, 'invert' => true, 'alpha' => true, 'opacity' => true, 'saturate' => true, 'min' => true, 'max' => true, 'round' => true, 'abs' => true, ]; protected function isPlainCss(): bool { return true; } protected function silentComment(): bool { if ($this->inExpression()) { return false; } $start = $this->scanner->getPosition(); parent::silentComment(); $this->error("Silent comments aren't allowed in plain CSS.", $this->scanner->spanFrom($start)); } protected function atRule(callable $child, bool $root = false): Statement { $start = $this->scanner->getPosition(); $this->scanner->expectChar('@'); $name = $this->interpolatedIdentifier(); $this->whitespace(); return match ($name->getAsPlain()) { 'at-root', 'content', 'debug', 'each', 'error', 'extend', 'for', 'function', 'if', 'include', 'mixin', 'return', 'warn', 'while' => $this->forbiddenAtRule($start), 'import' => $this->cssImportRule($start), 'media' => $this->mediaRule($start), '-moz-document' => $this->mozDocumentRule($start, $name), 'supports' => $this->supportsRule($start), default => $this->unknownAtRule($start, $name), }; } private function forbiddenAtRule(int $start): never { $this->almostAnyValue(); $this->error("This at-rule isn't allowed in plain CSS.", $this->scanner->spanFrom($start)); } private function cssImportRule(int $start): ImportRule { $urlStart = $this->scanner->getPosition(); $next = $this->scanner->peekChar(); if ($next === 'u' || $next === 'U') { $url = $this->dynamicUrl(); } else { $url = new StringExpression($this->interpolatedString()->asInterpolation(true)); } $urlSpan = $this->scanner->spanFrom($urlStart); $this->whitespace(); $modifiers = $this->tryImportModifiers(); $this->expectStatementSeparator('@import rule'); return new ImportRule([ new StaticImport(new Interpolation([$url], $urlSpan), $this->scanner->spanFrom($start), $modifiers), ], $this->scanner->spanFrom($start)); } protected function parentheses(): Expression { // Expressions are only allowed within calculations, but we verify this at // evaluation time. $start = $this->scanner->getPosition(); $this->scanner->expectChar('('); $this->whitespace(); $expression = $this->expressionUntilComma(); $this->scanner->expectChar(')'); return new ParenthesizedExpression($expression, $this->scanner->spanFrom($start)); } protected function identifierLike(): Expression { $start = $this->scanner->getPosition(); $identifier = $this->interpolatedIdentifier(); $plain = $identifier->getAsPlain(); assert($plain !== null); // CSS doesn't allow non-plain identifiers $lower = strtolower($plain); $specialFunction = $this->trySpecialFunction($lower, $start); if ($specialFunction !== null) { return $specialFunction; } $beforeArguments = $this->scanner->getPosition(); // `namespacedExpression()` is just here to throw a clearer error. if ($this->scanner->scanChar('.')) { return $this->namespacedExpression($plain, $start); } if (!$this->scanner->scanChar('(')) { return new StringExpression($identifier); } $allowEmptySecondArg = $lower === 'var'; $arguments = []; if (!$this->scanner->scanChar(')')) { do { $this->whitespace(); if ($allowEmptySecondArg && \count($arguments) === 1 && $this->scanner->peekChar() === ')') { $arguments[] = StringExpression::plain('', $this->scanner->getEmptySpan()); break; } $arguments[] = $this->expressionUntilComma(true); $this->whitespace(); } while ($this->scanner->scanChar(',')); $this->scanner->expectChar(')'); } if ($plain === 'if' || (!isset(self::CSS_ALLOWED_FUNCTIONS[$plain]) && FunctionRegistry::isBuiltinFunction($plain))) { $this->error("This function isn't allowed in plain CSS.", $this->scanner->spanFrom($start)); } return new FunctionExpression( $plain, new ArgumentInvocation($arguments, [], $this->scanner->spanFrom($beforeArguments)), $this->scanner->spanFrom($start) ); } protected function namespacedExpression(string $namespace, int $start): Expression { $expression = parent::namespacedExpression($namespace, $start); $this->error("Module namespaces aren't allowed in plain CSS.", $expression->getSpan()); } } PKBA#]>�[�E�EEsystem/helixultimate/vendor/scssphp/scssphp/src/Parser/SassParser.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; use League\Uri\Exceptions\SyntaxError; use ScssPhp\ScssPhp\Ast\Sass\Import; use ScssPhp\ScssPhp\Ast\Sass\Import\DynamicImport; use ScssPhp\ScssPhp\Ast\Sass\Import\StaticImport; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Statement\LoudComment; use ScssPhp\ScssPhp\Ast\Sass\Statement\SilentComment; use ScssPhp\ScssPhp\Util\Character; use ScssPhp\ScssPhp\Value\SassString; /** * A parser for the indented syntax. * * @internal */ final class SassParser extends StylesheetParser { private int $currentIndentation = 0; /** * The indentation level of the next source line after the scanner's * position, or `null` if that hasn't been computed yet. * * A source line is any line that's not entirely whitespace. */ private ?int $nextIndentation = null; /** * The beginning of the next source line after the scanner's position, or * `null` if the next indentation hasn't been computed yet. * * A source line is any line that's not entirely whitespace. */ private ?int $nextIndentationEnd = null; /** * Whether the document is indented using spaces or tabs. * * If this is `true`, the document is indented using spaces. If it's `false`, * the document is indented using tabs. If it's `null`, we haven't yet seen * the indentation character used by the document. */ private ?bool $spaces = null; public function getCurrentIndentation(): int { return $this->currentIndentation; } protected function isIndented(): bool { return true; } protected function styleRuleSelector(): Interpolation { $start = $this->scanner->getPosition(); $buffer = new InterpolationBuffer(); do { $buffer->addInterpolation($this->almostAnyValue(omitComments: true)); $buffer->write("\n"); } while (str_ends_with(rtrim($buffer->getTrailingString()), ',') && $this->scanCharIf(fn ($char) => Character::isNewline($char))); return $buffer->buildInterpolation($this->scanner->spanFrom($start)); } protected function expectStatementSeparator(?string $name = null): void { if (!$this->atEndOfStatement()) { $this->expectNewline(); } if ($this->peekIndentation() <= $this->currentIndentation) { return; } \assert($this->nextIndentationEnd !== null); $this->scanner->error(\sprintf('Nothing may be indented %s.', $name === null ? 'here' : "beneath a $name"), $this->nextIndentationEnd); } protected function atEndOfStatement(): bool { $nextChar = $this->scanner->peekChar(); return $nextChar === null || Character::isNewline($nextChar); } protected function lookingAtChildren(): bool { return $this->atEndOfStatement() && $this->peekIndentation() > $this->currentIndentation; } protected function importArgument(): Import { switch ($this->scanner->peekChar()) { case 'u': case 'U': $start = $this->scanner->getPosition(); if ($this->scanIdentifier('url')) { if ($this->scanner->scanChar('(')) { $this->scanner->setPosition($start); return parent::importArgument(); } else { $this->scanner->setPosition($start); } } break; case "'": case '"': return parent::importArgument(); } $start = $this->scanner->getPosition(); $next = $this->scanner->peekChar(); while ($next !== null && $next !== ',' && $next !== ';' && !Character::isNewline($next)) { $this->scanner->readUtf8Char(); $next = $this->scanner->peekChar(); } $url = $this->scanner->substring($start); $span = $this->scanner->spanFrom($start); if ($this->isPlainImportUrl($url)) { // Serialize $url as a Sass string because StaticImport expects it to // include quotes. return new StaticImport(new Interpolation([(string) new SassString($url)], $span), $span); } try { return new DynamicImport($this->parseImportUrl($url), $span); } catch (SyntaxError $e) { $this->error('Invalid URL: ' . $e->getMessage(), $span, $e); } } protected function scanElse(int $ifIndentation): bool { if ($this->peekIndentation() !== $ifIndentation) { return false; } $start = $this->scanner->getPosition(); $startIndentation = $this->currentIndentation; $startNextIndentation = $this->nextIndentation; $startNextIndentationEnd = $this->nextIndentationEnd; $this->readIndentation(); if ($this->scanner->scanChar('@') && $this->scanIdentifier('else')) { return true; } $this->scanner->setPosition($start); $this->currentIndentation = $startIndentation; $this->nextIndentation = $startNextIndentation; $this->nextIndentationEnd = $startNextIndentationEnd; return false; } protected function children(callable $child): array { $children = []; $this->whileIndentedLower(function () use ($child, &$children) { $parsedChild = $this->child($child); if ($parsedChild !== null) { $children[] = $parsedChild; } }); return $children; } protected function statements(callable $statement): array { $next = $this->scanner->peekChar(); if ($next === "\t" || $next === ' ') { $this->scanner->error('Indenting at the beginning of the document is illegal.', 0, $this->scanner->getPosition()); } $statements = []; while (!$this->scanner->isDone()) { $child = $this->child($statement); if ($child !== null) { $statements[] = $child; } $indentation = $this->readIndentation(); \assert($indentation === 0); } return $statements; } /** * Consumes a child of the current statement. * * This consumes children that are allowed at all levels of the document; the * $child parameter is called to consume any children that are specifically * allowed in the caller's context. * * @param callable(): (Statement|null) $child */ private function child(callable $child): ?Statement { return match ($this->scanner->peekChar()) { // Ignore empty lines. "\r", "\n", "\f" => null, '$' => $this->variableDeclarationWithoutNamespace(), '/' => match ($this->scanner->peekChar(1)) { '/' => $this->silentCommentStatement(), '*' => $this->loudCommentStatement(), default => $child(), }, default => $child(), }; } /** * Consumes an indented-style silent comment. */ private function silentCommentStatement(): SilentComment { $start = $this->scanner->getPosition(); $this->scanner->expect('//'); $buffer = ''; $parentIndentation = $this->currentIndentation; do { $commentPrefix = $this->scanner->scanChar('/') ? '///' : '//'; while (true) { $buffer .= $commentPrefix; // Skip the initial characters because we're already writing the // slashes. for ($i = \strlen($commentPrefix); $i < $this->currentIndentation - $parentIndentation; $i++) { $buffer .= ' '; } while (!$this->scanner->isDone() && !Character::isNewline($this->scanner->peekChar())) { $buffer .= $this->scanner->readUtf8Char(); } $buffer .= "\n"; if ($this->peekIndentation() < $parentIndentation) { break 2; } if ($this->peekIndentation() === $parentIndentation) { // Look ahead to the next line to see if it starts another comment. if ($this->scanner->peekChar(1 + $parentIndentation) === '/' && $this->scanner->peekChar(2 + $parentIndentation) === '/') { $this->readIndentation(); } break; } $this->readIndentation(); } } while ($this->scanner->scan('//')); return $this->lastSilentComment = new SilentComment($buffer, $this->scanner->spanFrom($start)); } /** * Consumes an indented-style loud context. */ private function loudCommentStatement(): LoudComment { $start = $this->scanner->getPosition(); $this->scanner->expect('/*'); $first = true; $buffer = new InterpolationBuffer(); $buffer->write('/*'); $parentIndentation = $this->currentIndentation; while (true) { if ($first) { // If the first line is empty, ignore it. $beginningOfComment = $this->scanner->getPosition(); $this->spaces(); if (Character::isNewline($this->scanner->peekChar())) { $this->readIndentation(); $buffer->write(' '); } else { $buffer->write($this->scanner->substring($beginningOfComment)); } } else { $buffer->write("\n * "); } $first = false; for ($i = 3; $i < $this->currentIndentation - $parentIndentation; $i++) { $buffer->write(' '); } while (!$this->scanner->isDone()) { switch ($this->scanner->peekChar()) { case "\n": case "\r": case "\f": break 2; case '#': if ($this->scanner->peekChar(1) === '{') { $buffer->add($this->singleInterpolation()); } else { $buffer->write($this->scanner->readChar()); } break; default: $buffer->write($this->scanner->readUtf8Char()); } } if ($this->peekIndentation() <= $parentIndentation) { break; } // Preserve empty lines. while ($this->lookingAtDoubleNewline()) { $this->expectNewline(); $buffer->write("\n *"); } $this->readIndentation(); } return new LoudComment($buffer->buildInterpolation($this->scanner->spanFrom($start))); } protected function whitespaceWithoutComments(): void { // This overrides whitespace consumption so that it doesn't consume // newlines. while (!$this->scanner->isDone()) { $next = $this->scanner->peekChar(); if ($next !== "\t" && $next !== ' ') { break; } $this->scanner->readChar(); } } protected function loudComment(): void { // This overrides loud comment consumption so that it doesn't consume // multi-line comments. $this->scanner->expect('/*'); while (true) { $next = $this->scanner->readUtf8Char(); if (Character::isNewline($next)) { $this->scanner->error('expected */.'); } if ($next !== '*') { continue; } do { $next = $this->scanner->readUtf8Char(); } while ($next === '*'); if ($next === '/') { break; } } } /** * Expect and consume a single newline character. */ private function expectNewline(): void { switch ($this->scanner->peekChar()) { case ';': $this->scanner->error("semicolons aren't allowed in the indented syntax."); case "\r": $this->scanner->readChar(); if ($this->scanner->peekChar() === "\n") { $this->scanner->readChar(); } break; case "\n": case "\f": $this->scanner->readChar(); break; default: $this->scanner->error('expected newline.'); } } /** * Returns whether the scanner is immediately before *two* newlines. */ private function lookingAtDoubleNewline(): bool { return match ($this->scanner->peekChar()) { "\r" => match ($this->scanner->peekChar(1)) { "\n" => Character::isNewline($this->scanner->peekChar(2)), "\r", "\f" => true, default => false, }, "\n", "\f" => Character::isNewline($this->scanner->peekChar(1)), default => false, }; } /** * As long as the scanner's position is indented beneath the starting line, * runs $body to consume the next statement. * * @param callable(): void $body */ private function whileIndentedLower(callable $body): void { $parentIndentation = $this->currentIndentation; $childIndentation = null; while ($this->peekIndentation() > $parentIndentation) { $indentation = $this->readIndentation(); $childIndentation ??= $indentation; if ($childIndentation !== $indentation) { $this->scanner->error( "Inconsistent indentation, expected $childIndentation spaces.", $this->scanner->getPosition() - $this->scanner->getColumn(), $this->scanner->getColumn() ); } $body(); } } /** * Consumes indentation whitespace and returns the indentation level of the * next line. * * @phpstan-impure */ private function readIndentation(): int { $currentIndentation = $this->currentIndentation = $this->nextIndentation ??= $this->peekIndentation(); \assert($this->nextIndentationEnd !== null); $this->scanner->setPosition($this->nextIndentationEnd); $this->nextIndentation = null; $this->nextIndentationEnd = null; return $currentIndentation; } /** * Returns the indentation level of the next line. */ private function peekIndentation(): int { if ($this->nextIndentation !== null) { return $this->nextIndentation; } if ($this->scanner->isDone()) { $this->nextIndentation = 0; $this->nextIndentationEnd = $this->scanner->getPosition(); return 0; } $start = $this->scanner->getPosition(); do { $containsTab = false; $containsSpace = false; $nextIndentation = 0; while (true) { switch ($this->scanner->peekChar()) { case ' ': $containsSpace = true; break; case "\t": $containsTab = true; break; default: break 2; } $nextIndentation++; $this->scanner->readChar(); } if ($this->scanner->isDone()) { $this->nextIndentation = 0; $this->nextIndentationEnd = $this->scanner->getPosition(); $this->scanner->setPosition($start); return 0; } } while ($this->scanCharIf(fn ($char) => Character::isNewline($char))); $this->checkIndentationConsistency($containsTab, $containsSpace); $this->nextIndentation = $nextIndentation; if ($nextIndentation > 0) { $this->spaces ??= $containsSpace; } $this->nextIndentationEnd = $this->scanner->getPosition(); $this->scanner->setPosition($start); return $nextIndentation; } /** * Ensures that the document uses consistent characters for indentation. * * The $containsTab and $containsSpace parameters refer to a single line of * indentation that has just been parsed. */ private function checkIndentationConsistency(bool $containsTab, bool $containsSpace): void { if ($containsTab) { if ($containsSpace) { $this->scanner->error('Tabs and spaces may not be mixed.', $this->scanner->getPosition() - $this->scanner->getColumn(), $this->scanner->getColumn()); } if ($this->spaces === true) { $this->scanner->error('Expected spaces, was tabs.', $this->scanner->getPosition() - $this->scanner->getColumn(), $this->scanner->getColumn()); } } elseif ($containsSpace && $this->spaces === false) { $this->scanner->error('Expected tabs, was spaces.', $this->scanner->getPosition() - $this->scanner->getColumn(), $this->scanner->getColumn()); } } } PKBA#]Z���Ksystem/helixultimate/vendor/scssphp/scssphp/src/Parser/InterpolationMap.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Util\Character; use ScssPhp\ScssPhp\Util\IterableUtil; use SourceSpan\FileLocation; use SourceSpan\FileSpan; use SourceSpan\SourceLocation; /** * A class that can map locations in a string generated from an {@see Interpolation} * to the original source code in the interpolation. * * @internal */ final class InterpolationMap { private readonly Interpolation $interpolation; /** * Locations in the generated string. * * Each of these indicates the location in the generated string that * corresponds to the end of the component at the same index of * {@see $interpolation->getContents()}. Its length is always one less than * {@see $interpolation->getContents()} because the last element always ends the string. * * @var list<SourceLocation> */ private readonly array $targetLocations; /** * @param list<SourceLocation> $targetLocations */ public function __construct(Interpolation $interpolation, array $targetLocations) { $this->interpolation = $interpolation; $this->targetLocations = $targetLocations; $expectedLocations = max(0, \count($interpolation->getContents()) - 1); if (\count($targetLocations) !== $expectedLocations) { $interpolationParts = \count($interpolation->getContents()); throw new \InvalidArgumentException("InterpolationMap must have $expectedLocations targetLocations if the interpolation has $interpolationParts components."); } } public function mapException(FormatException $error): FormatException { if (\count($this->interpolation->getContents()) === 0) { return new FormatException($error->getMessage(), $this->interpolation->getSpan(), $error); } $target = $error->getSpan(); $source = $this->mapSpan($target); $startIndex = $this->indexInContents($target->getStart()); $endIndex = $this->indexInContents($target->getEnd()); if (!IterableUtil::any(array_slice($this->interpolation->getContents(), $startIndex, $endIndex - $startIndex + 1), fn ($content) => $content instanceof Expression)) { return new FormatException($error->getMessage(), $source, $error); } return new MultiSourceFormatException($error->getMessage(), $source, '', ['error in interpolated output' => $target], $error); } public function mapSpan(FileSpan $target): FileSpan { $start = $this->mapLocation($target->getStart()); $end = $this->mapLocation($target->getEnd()); if ($start instanceof FileSpan) { if ($end instanceof FileSpan) { return $start->expand($end); } return $this->interpolation->getSpan()->getFile()->span($this->expandInterpolationSpanLeft($start->getStart()), $end->getOffset()); } if ($end instanceof FileSpan) { return $this->interpolation->getSpan()->getFile()->span($start->getOffset(), $this->expandInterpolationSpanRight($end->getEnd())); } return $this->interpolation->getSpan()->getFile()->span($start->getOffset(), $end->getOffset()); } /** * @return FileSpan|FileLocation */ private function mapLocation(SourceLocation $target): object { if (\count($this->interpolation->getContents()) === 0) { return $this->interpolation->getSpan(); } $index = $this->indexInContents($target); $components = $this->interpolation->getContents(); if ($components[$index] instanceof Expression) { return $components[$index]->getSpan(); } if ($index === 0) { $previousLocation = $this->interpolation->getSpan()->getStart(); } else { $previousComponent = $components[$index - 1]; \assert($previousComponent instanceof Expression); $previousLocation = $this->interpolation->getSpan()->getFile()->location($this->expandInterpolationSpanRight($previousComponent->getSpan()->getEnd())); } $offsetInString = $target->getOffset() - ($index === 0 ? 0 : $this->targetLocations[$index - 1]->getOffset()); return $previousLocation->getFile()->location($previousLocation->getOffset() + $offsetInString); } /** * @return int<0, max> */ private function indexInContents(SourceLocation $target): int { foreach ($this->targetLocations as $i => $location) { if ($target->getOffset() < $location->getOffset()) { return $i; } } \assert(\count($this->interpolation->getContents()) > 0); return \count($this->interpolation->getContents()) - 1; } /** * Given the start of a {@see FileSpan} covering an interpolated expression, returns * the offset of the interpolation's opening `#`. * * Note that this can be tricked by a `#{` that appears within a single-line * comment before the expression, but since it's only used for error * reporting that's probably fine. */ private function expandInterpolationSpanLeft(FileLocation $start): int { $source = $start->getFile()->getString(); $i = $start->getOffset() - 1; while ($i >= 0) { $prev = $source[$i--]; if ($prev === '{') { if ($source[$i] === '#') { break; } } elseif ($prev === '/') { $second = $source[$i--]; if ($second === '*') { while ($i >= 0) { $char = $source[$i--]; if ($char !== '*') { continue; } do { $char = $source[$i--]; } while ($char === '*' && $i >= 0); if ($char === '/') { break; } } } } } return $i; } /** * Given the end of a {@see FileSpan} covering an interpolated expression, returns * the offset of the interpolation's closing `}`. */ private function expandInterpolationSpanRight(FileLocation $end): int { $source = $end->getFile()->getString(); $i = $end->getOffset(); while ($i < \strlen($source)) { $next = $source[$i++]; if ($next === '}') { break; } if ($next === '/') { $second = $source[$i++]; if ($second === '/') { while (!Character::isNewline($source[$i++] ?? null)) { // Move forward } } elseif ($second === '*') { while (true) { $char = $source[$i++] ?? null; if ($char !== '*') { continue; } do { $char = $source[$i++] ?? null; } while ($char === '*'); if ($char === '/') { break; } } } } } return $i; } } PKBA#]�D�OpKpKIsystem/helixultimate/vendor/scssphp/scssphp/src/Parser/SelectorParser.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Ast\Css\CssValue; use ScssPhp\ScssPhp\Ast\Selector\AttributeOperator; use ScssPhp\ScssPhp\Ast\Selector\AttributeSelector; use ScssPhp\ScssPhp\Ast\Selector\ClassSelector; use ScssPhp\ScssPhp\Ast\Selector\Combinator; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelector; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelectorComponent; use ScssPhp\ScssPhp\Ast\Selector\CompoundSelector; use ScssPhp\ScssPhp\Ast\Selector\IDSelector; use ScssPhp\ScssPhp\Ast\Selector\ParentSelector; use ScssPhp\ScssPhp\Ast\Selector\PlaceholderSelector; use ScssPhp\ScssPhp\Ast\Selector\PseudoSelector; use ScssPhp\ScssPhp\Ast\Selector\QualifiedName; use ScssPhp\ScssPhp\Ast\Selector\SelectorList; use ScssPhp\ScssPhp\Ast\Selector\SimpleSelector; use ScssPhp\ScssPhp\Ast\Selector\TypeSelector; use ScssPhp\ScssPhp\Ast\Selector\UniversalSelector; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Util\Character; /** * A parser for selectors. * * @internal */ final class SelectorParser extends Parser { /** * Pseudo-class selectors that take unadorned selectors as arguments. */ private const SELECTOR_PSEUDO_CLASSES = ['not', 'is', 'matches', 'where', 'current', 'any', 'has', 'host', 'host-context']; /** * Pseudo-element selectors that take unadorned selectors as arguments. */ private const SELECTOR_PSEUDO_ELEMENTS = ['slotted']; private readonly bool $allowParent; /** * Whether to parse the selector as plain CSS. */ private readonly bool $plainCss; /** * Creates a parser that parses CSS selectors. * * If $allowParent is `false`, this will throw a @see SassFormatException} if * the selector includes the parent selector `&`. * * If $plainCss is `true`, this will parse the selector as a plain CSS * selector rather than a Sass selector. */ public function __construct(string $contents, ?LoggerInterface $logger = null, ?UriInterface $url = null, bool $allowParent = true, ?InterpolationMap $interpolationMap = null, bool $plainCss = false) { $this->allowParent = $allowParent; $this->plainCss = $plainCss; parent::__construct($contents, $logger, $url, $interpolationMap); } /** * @throws SassFormatException */ public function parse(): SelectorList { return $this->wrapSpanFormatException(function () { $selector = $this->selectorList(); if (!$this->scanner->isDone()) { $this->scanner->error('expected selector.'); } return $selector; }); } public function parseComplexSelector(): ComplexSelector { return $this->wrapSpanFormatException(function () { $complex = $this->complexSelector(); if (!$this->scanner->isDone()) { $this->scanner->error('expected selector.'); } return $complex; }); } public function parseCompoundSelector(): CompoundSelector { return $this->wrapSpanFormatException(function () { $compound = $this->compoundSelector(); if (!$this->scanner->isDone()) { $this->scanner->error('expected selector.'); } return $compound; }); } public function parseSimpleSelector(): SimpleSelector { return $this->wrapSpanFormatException(function () { $simple = $this->simpleSelector(); if (!$this->scanner->isDone()) { $this->scanner->error('unexpected token.'); } return $simple; }); } /** * Consumes a selector list. */ private function selectorList(): SelectorList { $start = $this->scanner->getPosition(); $previousLine = $this->scanner->getLine(); $components = [$this->complexSelector()]; $this->whitespace(); while ($this->scanner->scanChar(',')) { $this->whitespace(); $next = $this->scanner->peekChar(); if ($next === ',') { continue; } if ($this->scanner->isDone()) { break; } $lineBreak = $this->scanner->getLine() !== $previousLine; if ($lineBreak) { $previousLine = $this->scanner->getLine(); } $components[] = $this->complexSelector($lineBreak); } return new SelectorList($components, $this->spanFrom($start)); } /** * Consumes a complex selector. * * If $lineBreak is `true`, that indicates that there was a line break * before this selector. */ private function complexSelector(bool $lineBreak = false): ComplexSelector { $start = $this->scanner->getPosition(); $componentStart = $this->scanner->getPosition(); $lastCompound = null; /** @var list<CssValue<Combinator>> $combinators */ $combinators = []; $initialCombinators = null; $components = []; while (true) { $this->whitespace(); $next = $this->scanner->peekChar(); switch ($next) { case '+': $combinatorStart = $this->scanner->getPosition(); $this->scanner->readChar(); $combinators[] = new CssValue(Combinator::NEXT_SIBLING, $this->spanFrom($combinatorStart)); break; case '>': $combinatorStart = $this->scanner->getPosition(); $this->scanner->readChar(); $combinators[] = new CssValue(Combinator::CHILD, $this->spanFrom($combinatorStart)); break; case '~': $combinatorStart = $this->scanner->getPosition(); $this->scanner->readChar(); $combinators[] = new CssValue(Combinator::FOLLOWING_SIBLING, $this->spanFrom($combinatorStart)); break; default: if ($next === null || (!\in_array($next, ['[', '.', '#', '%', ':', '&', '*', '|'], true) && !$this->lookingAtIdentifier())) { break 2; } if ($lastCompound !== null) { $components[] = new ComplexSelectorComponent($lastCompound, $combinators, $this->spanFrom($componentStart)); } elseif (\count($combinators) !== 0) { \assert($initialCombinators === null); $initialCombinators = $combinators; $componentStart = $this->scanner->getPosition(); } $lastCompound = $this->compoundSelector(); $combinators = []; if ($this->scanner->peekChar() === '&') { $this->scanner->error('"&" may only used at the beginning of a compound selector.'); } break; } } if (\count($combinators) > 0 && $this->plainCss) { $this->scanner->error('expected selector.'); } if ($lastCompound !== null) { $components[] = new ComplexSelectorComponent($lastCompound, $combinators, $this->spanFrom($componentStart)); } elseif (\count($combinators) !== 0) { $initialCombinators = $combinators; } else { $this->scanner->error('expected selector.'); } return new ComplexSelector($initialCombinators ?? [], $components, $this->spanFrom($start), $lineBreak); } /** * Consumes a compound selector. */ private function compoundSelector(): CompoundSelector { $start = $this->scanner->getPosition(); $components = [$this->simpleSelector()]; while ($this->isSimpleSelectorStart($this->scanner->peekChar())) { $components[] = $this->simpleSelector(false); } return new CompoundSelector($components, $this->spanFrom($start)); } /** * Consumes a simple selector. * * If $allowParent is passed, it controls whether the parent selector `&` is * allowed. Otherwise, it defaults to {@see allowParent}. */ private function simpleSelector(?bool $allowParent = null): SimpleSelector { $start = $this->scanner->getPosition(); $allowParent ??= $this->allowParent; switch ($this->scanner->peekChar()) { case '[': return $this->attributeSelector(); case '.': return $this->classSelector(); case '#': return $this->idSelector(); case '%': $selector = $this->placeholderSelector(); if ($this->plainCss) { $this->error("Placeholder selectors aren't allowed in plain CSS.", $this->scanner->spanFrom($start)); } return $selector; case ':': return $this->pseudoSelector(); case '&': $selector = $this->parentSelector(); if (!$allowParent) { $this->error("Parent selectors aren't allowed here.", $this->scanner->spanFrom($start)); } return $selector; default: return $this->typeOrUniversalSelector(); } } /** * Consumes an attribute selector. */ private function attributeSelector(): AttributeSelector { $start = $this->scanner->getPosition(); $this->scanner->expectChar('['); $this->whitespace(); $name = $this->attributeName(); $this->whitespace(); if ($this->scanner->scanChar(']')) { return AttributeSelector::create($name, $this->spanFrom($start)); } $operator = $this->attributeOperator(); $this->whitespace(); $next = $this->scanner->peekChar(); $value = $next === "'" || $next === '"' ? $this->string() : $this->identifier(); $this->whitespace(); $next = $this->scanner->peekChar(); $modifier = $next !== null && Character::isAlphabetic($next) ? $this->scanner->readChar() : null; $this->scanner->expectChar(']'); return AttributeSelector::withOperator($name, $operator, $value, $this->spanFrom($start), $modifier); } /** * Consumes a qualified name as part of an attribute selector. */ private function attributeName(): QualifiedName { if ($this->scanner->scanChar('*')) { $this->scanner->expectChar('|'); return new QualifiedName($this->identifier(), '*'); } if ($this->scanner->scanChar('|')) { return new QualifiedName($this->identifier(), ''); } $nameOrNamespace = $this->identifier(); if ($this->scanner->peekChar() !== '|' || $this->scanner->peekChar(1) === '=') { return new QualifiedName($nameOrNamespace); } $this->scanner->readChar(); return new QualifiedName($this->identifier(), $nameOrNamespace); } /** * Consumes an attribute selector's operator. */ private function attributeOperator(): AttributeOperator { $start = $this->scanner->getPosition(); switch ($this->scanner->readChar()) { case '=': return AttributeOperator::EQUAL; case '~': $this->scanner->expectChar('='); return AttributeOperator::INCLUDE; case '|': $this->scanner->expectChar('='); return AttributeOperator::DASH; case '^': $this->scanner->expectChar('='); return AttributeOperator::PREFIX; case '$': $this->scanner->expectChar('='); return AttributeOperator::SUFFIX; case '*': $this->scanner->expectChar('='); return AttributeOperator::SUBSTRING; default: $this->scanner->error('Expected "]".', $start); } } /** * Consumes a class selector. */ private function classSelector(): ClassSelector { $start = $this->scanner->getPosition(); $this->scanner->expectChar('.'); $name = $this->identifier(); return new ClassSelector($name, $this->spanFrom($start)); } /** * Consumes an ID selector. */ private function idSelector(): IDSelector { $start = $this->scanner->getPosition(); $this->scanner->expectChar('#'); $name = $this->identifier(); return new IDSelector($name, $this->spanFrom($start)); } /** * Consumes a placeholder selector. */ private function placeholderSelector(): PlaceholderSelector { $start = $this->scanner->getPosition(); $this->scanner->expectChar('%'); $name = $this->identifier(); return new PlaceholderSelector($name, $this->spanFrom($start)); } /** * Consumes a parent selector. */ private function parentSelector(): ParentSelector { $start = $this->scanner->getPosition(); $this->scanner->expectChar('&'); $suffix = $this->lookingAtIdentifierBody() ? $this->identifierBody() : null; if ($this->plainCss && $suffix !== null) { $this->scanner->error("Parent selectors can't have suffixes in plain CSS.", $start, $this->scanner->getPosition() - $start); } return new ParentSelector($this->spanFrom($start), $suffix); } /** * Consumes a pseudo selector. */ private function pseudoSelector(): PseudoSelector { $start = $this->scanner->getPosition(); $this->scanner->expectChar(':'); $element = $this->scanner->scanChar(':'); $name = $this->identifier(); if (!$this->scanner->scanChar('(')) { return new PseudoSelector($name, $this->spanFrom($start), $element); } $this->whitespace(); $unvendored = Util::unvendor($name); $argument = null; $selector = null; if ($element) { if (\in_array($unvendored, self::SELECTOR_PSEUDO_ELEMENTS, true)) { $selector = $this->selectorList(); } else { $argument = $this->declarationValue(true); } } elseif (\in_array($unvendored, self::SELECTOR_PSEUDO_CLASSES, true)) { $selector = $this->selectorList(); } elseif ($unvendored === 'nth-child' || $unvendored === 'nth-last-child') { $argument = $this->aNPlusB(); $this->whitespace(); if (Character::isWhitespace($this->scanner->peekChar(-1)) && $this->scanner->peekChar() !== ')') { $this->expectIdentifier('of'); $argument .= ' of'; $this->whitespace(); $selector = $this->selectorList(); } } else { $argument = rtrim($this->declarationValue(true)); } $this->scanner->expectChar(')'); return new PseudoSelector($name, $this->spanFrom($start), $element, $argument, $selector); } /** * Consumes an [`An+B` production][An+B] and returns its text. * * [An+B]: https://drafts.csswg.org/css-syntax-3/#anb-microsyntax */ private function aNPlusB(): string { $buffer = ''; switch ($this->scanner->peekChar()) { case 'e': case 'E': $this->expectIdentifier('even'); return 'even'; case 'o': case 'O': $this->expectIdentifier('odd'); return 'odd'; case '+': case '-': $buffer .= $this->scanner->readChar(); break; } $first = $this->scanner->peekChar(); if ($first !== null && Character::isDigit($first)) { while (Character::isDigit($this->scanner->peekChar())) { $buffer .= $this->scanner->readChar(); } $this->whitespace(); if (!$this->scanIdentChar('n')) { return $buffer; } } else { $this->expectIdentChar('n'); } $buffer .= 'n'; $this->whitespace(); $next = $this->scanner->peekChar(); if ($next !== '+' && $next !== '-') { return $buffer; } $buffer .= $this->scanner->readChar(); $this->whitespace(); $last = $this->scanner->peekChar(); if ($last === null || !Character::isDigit($last)) { $this->scanner->error('Expected a number.'); } while (Character::isDigit($this->scanner->peekChar())) { $buffer .= $this->scanner->readChar(); } return $buffer; } /** * Consumes a type selector or a universal selector. * * These are combined because either one could start with `*`. */ private function typeOrUniversalSelector(): SimpleSelector { $start = $this->scanner->getPosition(); $first = $this->scanner->peekChar(); if ($first === '*') { $this->scanner->readChar(); if (!$this->scanner->scanChar('|')) { return new UniversalSelector($this->spanFrom($start)); } if ($this->scanner->scanChar('*')) { return new UniversalSelector($this->spanFrom($start), '*'); } return new TypeSelector(new QualifiedName($this->identifier(), '*'), $this->spanFrom($start)); } if ($first === '|') { $this->scanner->readChar(); if ($this->scanner->scanChar('*')) { return new UniversalSelector($this->spanFrom($start), ''); } return new TypeSelector(new QualifiedName($this->identifier(), ''), $this->spanFrom($start)); } $nameOrNamespace = $this->identifier(); if (!$this->scanner->scanChar('|')) { return new TypeSelector(new QualifiedName($nameOrNamespace), $this->spanFrom($start)); } if ($this->scanner->scanChar('*')) { return new UniversalSelector($this->spanFrom($start), $nameOrNamespace); } return new TypeSelector(new QualifiedName($this->identifier(), $nameOrNamespace), $this->spanFrom($start)); } /** * Returns whether $character can start a simple selector in the middle of a compound selector. */ private function isSimpleSelectorStart(?string $character): bool { return match ($character) { '*', '[', '.', '#', '%', ':' => true, '&' => $this->plainCss, default => false, }; } } PKBA#]]�`��p�pAsystem/helixultimate/vendor/scssphp/scssphp/src/Parser/Parser.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Exception\MultiSpanSassFormatException; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Exception\SimpleSassFormatException; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Logger\QuietLogger; use ScssPhp\ScssPhp\SourceSpan\LazyFileSpan; use ScssPhp\ScssPhp\Util\Character; use ScssPhp\ScssPhp\Util\ParserUtil; use SourceSpan\FileLocation; use SourceSpan\FileSpan; /** * @internal */ class Parser { protected readonly StringScanner $scanner; protected readonly LoggerInterface $logger; /** * A map used to map source spans in the text being parsed back to their * original locations in the source file, if this isn't being parsed directly * from source. */ private readonly ?InterpolationMap $interpolationMap; /** * Parses $text as a CSS identifier and returns the result. * * @throws SassFormatException if parsing fails. */ public static function parseIdentifier(string $text, ?LoggerInterface $logger = null): string { return (new Parser($text, $logger))->doParseIdentifier(); } /** * Returns whether $text is a valid CSS identifier. */ public static function isIdentifier(string $text, ?LoggerInterface $logger = null): bool { try { self::parseIdentifier($text, $logger); return true; } catch (SassFormatException) { return false; } } public function __construct(string $contents, ?LoggerInterface $logger = null, ?UriInterface $sourceUrl = null, ?InterpolationMap $interpolationMap = null) { $this->scanner = new StringScanner($contents, $sourceUrl); $this->logger = $logger ?? new QuietLogger(); $this->interpolationMap = $interpolationMap; } /** * @throws SassFormatException */ private function doParseIdentifier(): string { return $this->wrapSpanFormatException(function () { $result = $this->identifier(); $this->scanner->expectDone(); return $result; }); } /** * Consumes whitespace, including any comments. */ protected function whitespace(): void { do { $this->whitespaceWithoutComments(); } while ($this->scanComment()); } /** * Consumes whitespace, but not comments. */ protected function whitespaceWithoutComments(): void { while (!$this->scanner->isDone() && Character::isWhitespace($this->scanner->peekChar())) { $this->scanner->readChar(); } } /** * Consumes spaces and tabs. */ protected function spaces(): void { while (!$this->scanner->isDone() && Character::isSpaceOrTab($this->scanner->peekChar())) { $this->scanner->readChar(); } } /** * Consumes and ignores a comment if possible. * * Returns whether the comment was consumed. */ protected function scanComment(): bool { if ($this->scanner->peekChar() !== '/') { return false; } $next = $this->scanner->peekChar(1); if ($next === '/') { return $this->silentComment(); } if ($next === '*') { $this->loudComment(); return true; } return false; } /** * Like {@see whitespace}, but throws an error if no whitespace is consumed. */ protected function expectWhitespace(): void { if ($this->scanner->isDone() || !(Character::isWhitespace($this->scanner->peekChar()) || $this->scanComment())) { $this->scanner->error('Expected whitespace.'); } $this->whitespace(); } /** * Consumes and ignores a single silent (Sass-style) comment, not including * the trailing newline. * * Returns whether the comment was consumed. */ protected function silentComment(): bool { $this->scanner->expect('//'); while (!$this->scanner->isDone() && !Character::isNewline($this->scanner->peekChar())) { $this->scanner->readChar(); } return true; } /** * Consumes and ignores a loud (CSS-style) comment. */ protected function loudComment(): void { $this->scanner->expect('/*'); while (true) { $next = $this->scanner->readChar(); if ($next !== '*') { continue; } do { $next = $this->scanner->readChar(); } while ($next === '*'); if ($next === '/') { break; } } } /** * Consumes a plain CSS identifier. * * If $normalize is `true`, this converts underscores into hyphens. * * If $unit is `true`, this doesn't parse a `-` followed by a digit. This * ensures that `1px-2px` parses as subtraction rather than the unit * `px-2px`. */ protected function identifier(bool $normalize = false, bool $unit = false): string { $text = ''; if ($this->scanner->scanChar('-')) { $text .= '-'; if ($this->scanner->scanChar('-')) { $text .= '-'; $text .= $this->consumeIdentifierBody($normalize, $unit); return $text; } } $first = $this->scanner->peekChar(); if ($first === null) { $this->scanner->error('Expected identifier.'); } if ($normalize && $first === '_') { $this->scanner->readChar(); $text .= '-'; } elseif (Character::isNameStart($first)) { $text .= $this->scanner->readUtf8Char(); } elseif ($first === '\\') { $text .= $this->escape(true); } else { $this->scanner->error('Expected identifier.'); } $text .= $this->consumeIdentifierBody($normalize, $unit); return $text; } /** * Consumes a chunk of a plain CSS identifier after the name start. */ public function identifierBody(): string { $text = $this->consumeIdentifierBody(); if ($text === '') { $this->scanner->error('Expected identifier body.'); } return $text; } private function consumeIdentifierBody(bool $normalize = false, bool $unit = false): string { $text = ''; while (true) { $next = $this->scanner->peekChar(); if ($next === null) { break; } if ($unit && $next === '-') { $second = $this->scanner->peekChar(1); if ($second !== null && ($second === '.' || Character::isDigit($second))) { break; } $text .= $this->scanner->readChar(); } elseif ($normalize && $next === '_') { $this->scanner->readChar(); $text .= '-'; } elseif (Character::isName($next)) { $text .= $this->scanner->readUtf8Char(); } elseif ($next === '\\') { $text .= $this->escape(); } else { break; } } return $text; } /** * Consumes a plain CSS string. * * This returns the parsed contents of the string—that is, it doesn't include * quotes and its escapes are resolved. */ protected function string(): string { $quote = $this->scanner->readChar(); if ($quote !== '"' && $quote !== "'") { $this->scanner->error('Expected string.'); } $buffer = ''; while (true) { $next = $this->scanner->peekChar(); if ($next === $quote) { $this->scanner->readChar(); break; } if ($next === null || Character::isNewline($next)) { $this->scanner->error("Expected $quote."); } if ($next === '\\') { $second = $this->scanner->peekChar(1); if ($second !== null && Character::isNewline($second)) { $this->scanner->readChar(); $this->scanner->readChar(); } else { $buffer .= $this->escapeCharacter(); } } else { $buffer .= $this->scanner->readUtf8Char(); } } return $buffer; } /** * Consumes and returns a natural number (that is, a non-negative integer) as a double. * * Doesn't support scientific notation. */ protected function naturalNumber(): float { $first = $this->scanner->readChar(); if (!Character::isDigit($first)) { $this->scanner->error('Expected digit.', $this->scanner->getPosition() - 1); } $number = (float) intval($first); while (Character::isDigit($this->scanner->peekChar())) { $number *= 10; $number += intval($this->scanner->readChar()); } return $number; } /** * Consumes tokens until it reaches a top-level `";"`, `")"`, `"]"`, * or `"}"` and returns their contents as a string. * * If $allowEmpty is `false` (the default), this requires at least one token. */ protected function declarationValue(bool $allowEmpty = false): string { $buffer = ''; $brackets = []; $wroteNewline = false; while (true) { $next = $this->scanner->peekChar(); if ($next === null) { break; } switch ($next) { case '\\': $buffer .= $this->escape(true); $wroteNewline = false; break; case '"': case "'": $buffer .= $this->rawText($this->string(...)); $wroteNewline = false; break; case '/': if ($this->scanner->peekChar(1) === '*') { $buffer .= $this->rawText($this->loudComment(...)); } else { $buffer .= $this->scanner->readChar(); } $wroteNewline = false; break; case ' ': case "\t": $second = $this->scanner->peekChar(1); if ($wroteNewline || $second === null || !Character::isWhitespace($second)) { $buffer .= ' '; } $this->scanner->readChar(); break; case "\n": case "\r": case "\f": $prev = $this->scanner->peekChar(-1); if ($prev === null || !Character::isNewline($prev)) { $buffer .= "\n"; } $this->scanner->readChar(); $wroteNewline = true; break; case '(': case '{': case '[': $buffer .= $next; $brackets[] = Character::opposite($this->scanner->readChar()); $wroteNewline = false; break; case ')': case '}': case ']': if (empty($brackets)) { break 2; } $buffer .= $next; $this->scanner->expectChar(array_pop($brackets)); $wroteNewline = false; break; case ';': if (empty($brackets)) { break 2; } $buffer .= $this->scanner->readChar(); break; case 'u': case 'U': $url = $this->tryUrl(); if ($url !== null) { $buffer .= $url; } else { $buffer .= $this->scanner->readChar(); } $wroteNewline = false; break; default: if ($this->lookingAtIdentifier()) { $buffer .= $this->identifier(); } else { $buffer .= $this->scanner->readUtf8Char(); } $wroteNewline = false; break; } } if (!empty($brackets)) { $this->scanner->expectChar(array_pop($brackets)); } if (!$allowEmpty && $buffer === '') { $this->scanner->error('Expected token.'); } return $buffer; } /** * Consumes a `url()` token if possible, and returns `null` otherwise. */ protected function tryUrl(): ?string { $start = $this->scanner->getPosition(); if (!$this->scanIdentifier('url')) { return null; } if (!$this->scanner->scanChar('(')) { $this->scanner->setPosition($start); return null; } $this->whitespace(); $buffer = 'url('; while (true) { $next = $this->scanner->peekChar(); if ($next === null) { break; } $nextCharCode = \ord($next); if ($next === '\\') { $buffer .= $this->escape(); } elseif ($next === '%' || $next === '&' || $next === '#' || ($nextCharCode >= \ord('*') && $nextCharCode <= \ord('~')) || $nextCharCode >= 0x80) { $buffer .= $this->scanner->readUtf8Char(); } elseif (Character::isWhitespace($next)) { $this->whitespace(); if ($this->scanner->peekChar() !== ')') { break; } } elseif ($next === ')') { $buffer .= $this->scanner->readChar(); return $buffer; } else { break; } } $this->scanner->setPosition($start); return null; } /** * Consumes a Sass variable name, and returns its name without the dollar sign. */ protected function variableName(): string { $this->scanner->expectChar('$'); return $this->identifier(true); } /** * Consumes an escape sequence and returns the text that defines it. * * If $identifierStart is true, this normalizes the escape sequence as * though it were at the beginning of an identifier. */ protected function escape(bool $identifierStart = false): string { $start = $this->scanner->getPosition(); $this->scanner->expectChar('\\'); $first = $this->scanner->peekChar(); if ($first === null) { $this->scanner->error('Expected escape sequence.'); } if (Character::isNewline($first)) { $this->scanner->error('Expected escape sequence.'); } if (Character::isHex($first)) { $value = 0; for ($i = 0; $i < 6; $i++) { $next = $this->scanner->peekChar(); if ($next === null || !Character::isHex($next)) { break; } $value *= 16; $value += hexdec($this->scanner->readChar()); assert(\is_int($value)); } $this->scanCharIf(Character::isWhitespace(...)); $valueText = mb_chr($value, 'UTF-8'); } else { $valueText = $this->scanner->readUtf8Char(); $value = mb_ord($valueText, 'UTF-8'); } if ($valueText === false) { $this->scanner->error('Invalid Unicode code point.', $start, $this->scanner->getPosition() - $start); } if ($identifierStart ? Character::isNameStart($valueText) : Character::isName($valueText)) { if ($value > 0x10ffff) { $this->scanner->error('Invalid Unicode code point.', $start, $this->scanner->getPosition() - $start); } return $valueText; } if ($value <= 0x1f || $valueText === "\x7f" || ($identifierStart && Character::isDigit($valueText))) { $hexValueText = $value === 0 ? '0' : ltrim(bin2hex($valueText), '0'); return '\\' . $hexValueText . ' '; } return '\\' . $valueText; } /** * Consumes an escape sequence and returns the character it represents. */ protected function escapeCharacter(): string { return ParserUtil::consumeEscapedCharacter($this->scanner); } /** * @param callable(string): bool $condition * * @param-immediately-invoked-callable $condition * * @phpstan-impure */ protected function scanCharIf(callable $condition): bool { $next = $this->scanner->peekChar(); if ($next === null || !$condition($next)) { return false; } $this->scanner->readChar(); return true; } /** * Consumes the next character or escape sequence if it matches $character. * * Matching will be case-insensitive unless $caseSensitive is true. * When matching case-insensitively, $character must be passed in lowercase. * * This only supports ASCII identifier characters. */ protected function scanIdentChar(string $character, bool $caseSensitive = false): bool { $matches = function (string $actual) use ($character, $caseSensitive): bool { if ($caseSensitive) { return $actual === $character; } return \strtolower($actual) === $character; }; $next = $this->scanner->peekChar(); if ($next !== null && $matches($next)) { $this->scanner->readChar(); return true; } if ($next === '\\') { $start = $this->scanner->getPosition(); if ($matches($this->escapeCharacter())) { return true; } $this->scanner->setPosition($start); } return false; } /** * Consumes the next character or escape sequence and asserts it matches $char. * * Matching will be case-insensitive unless $caseSensitive is true. * When matching case-insensitively, $char must be passed in lowercase. * * This only supports ASCII identifier characters. */ protected function expectIdentChar(string $char, bool $caseSensitive = false): void { if ($this->scanIdentChar($char, $caseSensitive)) { return; } $this->scanner->error("Expected \"$char\"."); } /** * Returns whether the scanner is immediately before a number. * * This follows [the CSS algorithm][]. * * [the CSS algorithm]: https://drafts.csswg.org/css-syntax-3/#starts-with-a-number */ protected function lookingAtNumber(): bool { $first = $this->scanner->peekChar(); if ($first === null) { return false; } if (Character::isDigit($first)) { return true; } if ($first === '.') { $second = $this->scanner->peekChar(1); return $second !== null && Character::isDigit($second); } if ($first === '+' || $first === '-') { $second = $this->scanner->peekChar(1); if ($second === null) { return false; } if (Character::isDigit($second)) { return true; } if ($second !== '.') { return false; } $third = $this->scanner->peekChar(2); return $third !== null && Character::isDigit($third); } return false; } /** * Returns whether the scanner is immediately before a plain CSS identifier. * * If $forward is passed, this looks that many characters forward instead. * * This is based on [the CSS algorithm][], but it assumes all backslashes * start escapes. * * [the CSS algorithm]: https://drafts.csswg.org/css-syntax-3/#would-start-an-identifier */ protected function lookingAtIdentifier(int $forward = 0): bool { $first = $this->scanner->peekChar($forward); if ($first === null) { return false; } if ($first === '\\' || Character::isNameStart($first)) { return true; } if ($first !== '-') { return false; } $second = $this->scanner->peekChar($forward + 1); if ($second === null) { return false; } return $second === '\\' || $second === '-' || Character::isNameStart($second); } /** * Returns whether the scanner is immediately before a sequence of characters * that could be part of a plain CSS identifier body. */ protected function lookingAtIdentifierBody(): bool { $next = $this->scanner->peekChar(); return $next !== null && ($next === '\\' || Character::isName($next)); } /** * Consumes an identifier if its name exactly matches $text. * * When matching case-insensitively, $text must be passed in lowercase. * * This only supports ASCII identifiers. */ protected function scanIdentifier(string $text, bool $caseSensitive = false): bool { if (!$this->lookingAtIdentifier()) { return false; } $start = $this->scanner->getPosition(); if ($this->consumeIdentifier($text, $caseSensitive) && !$this->lookingAtIdentifierBody()) { return true; } $this->scanner->setPosition($start); return false; } /** * Returns whether an identifier whose name exactly matches $text is at the * current scanner position. * * This doesn't move the scan pointer forward */ protected function matchesIdentifier(string $text, bool $caseSensitive = false): bool { if (!$this->lookingAtIdentifier()) { return false; } $start = $this->scanner->getPosition(); $result = $this->consumeIdentifier($text, $caseSensitive) && !$this->lookingAtIdentifierBody(); $this->scanner->setPosition($start); return $result; } /** * Consumes $text as an identifier, but doesn't verify whether there's * additional identifier text afterwards. * * Returns `true` if the full $text is consumed and `false` otherwise, but * doesn't reset the scan pointer. */ private function consumeIdentifier(string $text, bool $caseSensitive): bool { for ($i = 0; $i < \strlen($text); $i++) { if (!$this->scanIdentChar($text[$i], $caseSensitive)) { return false; } } return true; } /** * Consumes an identifier asserts that its name exactly matches $text. * * When matching case-insensitively, $text must be passed in lowercase. * * This only supports ASCII identifiers. */ protected function expectIdentifier(string $text, ?string $name = null, bool $caseSensitive = false): void { $name ??= "\"$text\""; $start = $this->scanner->getPosition(); for ($i = 0; $i < \strlen($text); $i++) { if ($this->scanIdentChar($text[$i], $caseSensitive)) { continue; } $this->scanner->error("Expected $name.", $start); } if (!$this->lookingAtIdentifierBody()) { return; } $this->scanner->error("Expected $name.", $start); } /** * Runs $consumer and returns the source text that it consumes. * * @param callable(): (mixed|void) $consumer * * @param-immediately-invoked-callable $consumer */ protected function rawText(callable $consumer): string { $start = $this->scanner->getPosition(); $consumer(); return $this->scanner->substring($start); } /** * Like {@see StringScanner::spanFrom()} but passes the span through {@see $interpolationMap} if it's available. */ protected function spanFrom(int $position): FileSpan { $span = $this->scanner->spanFrom($position); if ($this->interpolationMap === null) { return $span; } $interpolationMap = $this->interpolationMap; return new LazyFileSpan(static fn() => $interpolationMap->mapSpan($span)); } /** * Prints a warning to standard error, associated with $span. */ protected function warn(string $message, FileSpan $span): void { $this->logger->warn($message, null, $span); } /** * Throws an error associated with $position. * * @throws FormatException */ protected function error(string $message, FileSpan $span, ?\Throwable $previous = null): never { throw new FormatException($message, $span, $previous); } /** * Runs $callback and wraps any {@see FormatException} it throws in a * {@see SassFormatException} * * @template T * @param callable(): T $callback * @return T * * @param-immediately-invoked-callable $callback * * @throws SassFormatException */ protected function wrapSpanFormatException(callable $callback) { try { try { return $callback(); } catch (FormatException $e) { if ($this->interpolationMap === null) { throw $e; } throw $this->interpolationMap->mapException($e); } } catch (MultiSourceFormatException $error) { $span = $error->getSpan(); $secondarySpans = $error->secondarySpans; if (0 === stripos($error->getMessage(), 'expected')) { $span = $this->adjustExceptionSpan($span); $secondarySpans = array_map(fn (FileSpan $span) => $this->adjustExceptionSpan($span), $secondarySpans); } throw new MultiSpanSassFormatException($error->getMessage(), $span, $error->primaryLabel, $secondarySpans, $error); } catch (FormatException $error) { $span = $error->getSpan(); if (0 === stripos($error->getMessage(), 'expected')) { $span = $this->adjustExceptionSpan($span); } throw new SimpleSassFormatException($error->getMessage(), $span, $error); } } /** * Moves span to {@see firstNewlineBefore} if necessary. */ private function adjustExceptionSpan(FileSpan $span): FileSpan { if ($span->getLength() > 0) { return $span; } $start = $this->firstNewlineBefore($span->getStart()); if ($start === $span->getStart()) { return $span; } return $start->pointSpan(); } /** * If $location is separated from the previous non-whitespace character in * `$scanner->getString()` by one or more newlines, returns the location of the last * separating newline. * * Otherwise returns $location. * * This helps avoid missing token errors pointing at the next closing bracket * rather than the line where the problem actually occurred. */ private function firstNewlineBefore(FileLocation $location): FileLocation { $text = $location->getFile()->getText(0, $location->getOffset()); $index = $location->getOffset() - 1; $lastNewline = null; while ($index >= 0) { $char = $text[$index]; if (!Character::isWhitespace($char)) { return $lastNewline === null ? $location : $location->getFile()->location($lastNewline); } if (Character::isNewline($char)) { $lastNewline = $index; } $index--; } // If the document *only* contains whitespace before $location, always // return $location. return $location; } } PKBA#]���&Lsystem/helixultimate/vendor/scssphp/scssphp/src/Parser/AtRootQueryParser.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; use ScssPhp\ScssPhp\Ast\Sass\AtRootQuery; use ScssPhp\ScssPhp\Exception\SassFormatException; /** * A parser for `@at-root` queries. * * @internal */ final class AtRootQueryParser extends Parser { /** * @throws SassFormatException */ public function parse(): AtRootQuery { return $this->wrapSpanFormatException(function () { $this->scanner->expectChar('('); $this->whitespace(); $include = $this->scanIdentifier('with'); if (!$include) { $this->expectIdentifier('without', '"with" or "without"'); } $this->whitespace(); $this->scanner->expectChar(':'); $this->whitespace(); $atRules = []; do { $atRules[] = strtolower($this->identifier()); $this->whitespace(); } while ($this->lookingAtIdentifier()); $this->scanner->expectChar(')'); $this->scanner->expectDone(); return AtRootQuery::create($atRules, $include); }); } } PKBA#]sF�8��Jsystem/helixultimate/vendor/scssphp/scssphp/src/Parser/FormatException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; use JiriPudil\SealedClasses\Sealed; use SourceSpan\FileSpan; /** * @internal */ #[Sealed([MultiSourceFormatException::class])] class FormatException extends \Exception { private readonly FileSpan $span; public function __construct(string $message, FileSpan $span, ?\Throwable $previous = null) { $this->span = $span; parent::__construct($message, 0, $previous); } public function getSpan(): FileSpan { return $this->span; } } PKBA#]���2FFFsystem/helixultimate/vendor/scssphp/scssphp/src/Parser/LineScanner.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; /** * A subclass of {@see StringScanner} that tracks line and column information. * * @internal */ final class LineScanner extends StringScanner { /** * @var int */ private int $line = 0; /** * @var int */ private int $column = 0; public function getLine(): int { return $this->line; } public function getColumn(): int { return $this->column; } /** * Whether the current position is between a CR character and an LF * character. */ private function betweenCRLF(): bool { return $this->peekChar(-1) === "\r" && $this->peekChar() === "\n"; } public function setPosition(int $position): void { $newPosition = $position; $oldPosition = $this->getPosition(); parent::setPosition($position); if ($newPosition > $oldPosition) { $newlines = $this->newlinesIn($this->substring($oldPosition, $newPosition)); $this->line += \count($newlines); if ($newlines === []) { $this->column += $newPosition - $oldPosition; } else { $last = $newlines[\count($newlines) - 1]; $end = $last[1] + \strlen($last[0]); $this->column = $newPosition - $end; } } else { $newlines = $this->newlinesIn($this->substring($newPosition, $oldPosition)); if ($this->betweenCRLF()) { array_pop($newlines); } $this->line -= \count($newlines); if ($newlines === []) { $this->column -= $oldPosition - $newPosition; } else { $lastCrlfPosition = strrpos($this->getString(), "\r\n", $newPosition); if ($lastCrlfPosition === false) { $lastCrlfPosition = -1; } $lastLfPosition = strrpos($this->getString(), "\n", $newPosition); if ($lastLfPosition === false) { $lastLfPosition = -1; } $lastNewLinePosition = max($lastCrlfPosition, $lastLfPosition); $this->column = $newPosition - $lastNewLinePosition - 1; } } } /** * @phpstan-impure */ public function scanChar(string $char): bool { if (!parent::scanChar($char)) { return false; } $this->adjustLineAndColumn($char); return true; } /** * @phpstan-impure */ public function readChar(): string { $character = parent::readChar(); $this->adjustLineAndColumn($character); return $character; } /** * @phpstan-impure */ public function readUtf8Char(): string { $character = parent::readUtf8Char(); $this->adjustLineAndColumn($character); return $character; } /** * Adjusts {@see line} and {@see column} after having consumed $character. */ private function adjustLineAndColumn(string $character): void { if ($character === "\n" || ($character === "\r" && $this->peekChar() !== "\n")) { $this->line += 1; $this->column = 0; } else { $this->column += \strlen($character); } } /** * @phpstan-impure */ public function scan(string $string): bool { if (!parent::scan($string)) { return false; } $newlines = $this->newlinesIn($string); $this->line += \count($newlines); if ($newlines === []) { $this->column += \strlen($string); } else { $last = $newlines[\count($newlines) - 1]; $end = $last[1] + \strlen($last[0]); $this->column = \strlen($string) - $end; } return true; } /** * @return list<array{string, int}> */ private function newlinesIn(string $text): array { preg_match_all('/\r\n?|\n/', $text, $matches, PREG_OFFSET_CAPTURE); $newlines = $matches[0]; if ($this->betweenCRLF()) { array_pop($newlines); } return $newlines; } } PKBA#]���7Y"Y"Hsystem/helixultimate/vendor/scssphp/scssphp/src/Parser/StringScanner.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Parser; use League\Uri\Contracts\UriInterface; use SourceSpan\FileLocation; use SourceSpan\FileSpan; use SourceSpan\SourceFile; /** * A port of Dart's string_scanner package to be used by the parser. * * The scanner only supports UTF-8 strings. * * Differences with Dart: * - reading a character is reading a byte, not a UTF-16 code unit (as PHP strings are not UTF-16). The * {@see readUtf8Char} method can be used to consume a UTF-8 char. * - characters are represented as a single-char string, not as an integer with their UTF-16 char code * - offsets are based on bytes, not on UTF-16 code units. In practice, parsing Sass generally needs * to peak following chars only when already knowing that the current char is an ASCII one, which * makes this safe. When this assumption does not hold anymore, a different logic should be used * - as strings and regexp cannot be used interchangeably in PHP (in Dart, regexps are a different * object, and both String and Regexp are implementing a Pattern interface for matching), the scanner * exposes supports only strings in scan() and expect(). Should we need support for regexps, a * separate method will be added. * * @internal */ class StringScanner { private readonly string $string; private int $position = 0; private readonly SourceFile $sourceFile; private ?int $lastMatchStart = null; private ?int $lastMatchPosition = null; public function __construct(string $content, ?UriInterface $sourceUrl = null) { $this->string = $content; $this->sourceFile = SourceFile::fromString($content, $sourceUrl); } public function getString(): string { return $this->string; } public function getPosition(): int { return $this->position; } public function setPosition(int $position): void { $this->position = $position; $this->lastMatchStart = null; } public function spanFrom(int $start, ?int $end = null): FileSpan { return $this->sourceFile->span($start, $end ?? $this->position); } /** * The current location of the scanner. */ public function getLocation(): FileLocation { return $this->sourceFile->location($this->position); } /** * Returns an empty span at the current location. */ public function getEmptySpan(): FileSpan { return $this->sourceFile->span($this->position, $this->position); } public function isDone(): bool { return $this->position === \strlen($this->string); } /** * @throws FormatException if the end of the string is reached * * @phpstan-impure */ public function readChar(): string { if ($this->position === \strlen($this->string)) { $this->fail('more input'); } return $this->string[$this->position++]; } /** * @throws FormatException if the end of the string is reached * * @phpstan-impure */ public function readUtf8Char(): string { if ($this->position === \strlen($this->string)) { $this->fail('more input'); } if (\ord($this->string[$this->position]) < 0x80) { return $this->string[$this->position++]; } if (!preg_match('/./usA', $this->string, $m, 0, $this->position)) { $this->fail('utf-8 char'); } $this->position += \strlen($m[0]); return $m[0]; } /** * Consumes the next character in the string if it is the provided character. * * @return bool Whether the character was consumed. * * @phpstan-impure */ public function scanChar(string $char): bool { if ($this->position === \strlen($this->string)) { return false; } if ($this->string[$this->position] !== $char) { return false; } ++$this->position; return true; } /** * Consumes the provided string if it appears at the current position. * * @return bool Whether the string was consumed. * * @phpstan-impure */ public function scan(string $string): bool { if (!$this->matches($string)) { return false; } $this->position += \strlen($string); $this->lastMatchPosition = $this->position; return true; } /** * Returns whether or not the provided string appears at the current position. * * This doesn't move the scan pointer forward. */ public function matches(string $string): bool { if ($this->position - 1 + \strlen($string) >= \strlen($this->string)) { return false; } if (substr($this->string, $this->position, \strlen($string)) === $string) { $this->lastMatchStart = $this->position; $this->lastMatchPosition = $this->position; return true; } return false; } /** * If the next character in the string is $character, consumes it. * * If $character could not be consumed, throws an exception * describing the position of the failure. $name is used in this error as * the expected name of the character being matched; if it's `null`, the * character itself is used instead. * * @throws FormatException * * @phpstan-impure */ public function expectChar(string $character, ?string $name = null): void { if ($this->scanChar($character)) { return; } if ($name === null) { $name = '"' . $character . '"'; } $this->fail($name); } /** * @throws FormatException * * @phpstan-impure */ public function expect(string $string): void { if ($this->scan($string)) { return; } $this->fail('"' . $string . '"'); } /** * @throws FormatException */ public function expectDone(): void { if ($this->isDone()) { return; } $this->fail('no more input'); } /** * Returns the character at the given offset of the current position. * * The offset can be negative to peek already seen characters. * Returns null if the offset goes out of range. * This does not affect the position or the last match. */ public function peekChar(int $offset = 0): ?string { $pos = $this->position + $offset; if ($pos < 0 || $pos >= \strlen($this->string)) { return null; } return $this->string[$pos]; } /** * Returns the substring of the string between $start and $end (excluded). * * $end defaults to the current position. */ public function substring(int $start, ?int $end = null): string { if ($end === null) { $end = $this->position; } if ($end < $start) { return ''; } return substr($this->string, $start, $end - $start); } /** * The scanner's current (zero-based) line number. */ public function getLine(): int { return $this->sourceFile->getLine($this->position); } /** * The scanner's current (zero-based) column number. */ public function getColumn(): int { return $this->sourceFile->getColumn($this->position); } /** * @throws FormatException */ public function error(string $message, ?int $position = null, ?int $length = null): never { if ($position === null && $length === null && $this->getLastMatchStart() !== null) { \assert($this->lastMatchStart !== null); $position = $this->lastMatchStart; $length = $this->position - $position; } $position ??= $this->position; $length ??= 0; $span = $this->sourceFile->span($position, $position + $length); throw new FormatException($message, $span); } private function getLastMatchStart(): ?int { // Lazily unset $this->lastMatchStart so that we avoid extra assignments in // character-by-character methods that are used in core loops. if ($this->lastMatchPosition !== $this->position) { $this->lastMatchStart = null; } return $this->lastMatchStart; } /** * @throws FormatException */ private function fail(string $message): never { $this->error("expected $message."); } } PKBA#]&��! ! Ksystem/helixultimate/vendor/scssphp/scssphp/src/Visitor/EveryCssVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Visitor; use ScssPhp\ScssPhp\Ast\Css\CssAtRule; use ScssPhp\ScssPhp\Ast\Css\CssComment; use ScssPhp\ScssPhp\Ast\Css\CssDeclaration; use ScssPhp\ScssPhp\Ast\Css\CssImport; use ScssPhp\ScssPhp\Ast\Css\CssKeyframeBlock; use ScssPhp\ScssPhp\Ast\Css\CssMediaRule; use ScssPhp\ScssPhp\Ast\Css\CssNode; use ScssPhp\ScssPhp\Ast\Css\CssStyleRule; use ScssPhp\ScssPhp\Ast\Css\CssStylesheet; use ScssPhp\ScssPhp\Ast\Css\CssSupportsRule; use ScssPhp\ScssPhp\Util\IterableUtil; /** * A visitor that visits each statement in a CSS AST and returns `true` if all * of the individual methods return `true`. * * Each method returns `false` by default. * * @template-implements CssVisitor<bool> * @internal */ abstract class EveryCssVisitor implements CssVisitor { public function visitCssAtRule(CssAtRule $node): bool { return IterableUtil::every($node->getChildren(), fn (CssNode $child) => $child->accept($this)); } public function visitCssComment(CssComment $node): bool { return false; } public function visitCssDeclaration(CssDeclaration $node): bool { return false; } public function visitCssImport(CssImport $node): bool { return false; } public function visitCssKeyframeBlock(CssKeyframeBlock $node): bool { return IterableUtil::every($node->getChildren(), fn (CssNode $child) => $child->accept($this)); } public function visitCssMediaRule(CssMediaRule $node): bool { return IterableUtil::every($node->getChildren(), fn (CssNode $child) => $child->accept($this)); } public function visitCssStyleRule(CssStyleRule $node): bool { return IterableUtil::every($node->getChildren(), fn (CssNode $child) => $child->accept($this)); } public function visitCssStylesheet(CssStylesheet $node): bool { return IterableUtil::every($node->getChildren(), fn (CssNode $child) => $child->accept($this)); } public function visitCssSupportsRule(CssSupportsRule $node): bool { return IterableUtil::every($node->getChildren(), fn (CssNode $child) => $child->accept($this)); } } PKBA#]�X07Lsystem/helixultimate/vendor/scssphp/scssphp/src/Visitor/StatementVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Visitor; use ScssPhp\ScssPhp\Ast\Sass\Statement\AtRootRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\AtRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ContentBlock; use ScssPhp\ScssPhp\Ast\Sass\Statement\ContentRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\DebugRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\Declaration; use ScssPhp\ScssPhp\Ast\Sass\Statement\EachRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ErrorRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ExtendRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ForRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\FunctionRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\IfRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ImportRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\IncludeRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\LoudComment; use ScssPhp\ScssPhp\Ast\Sass\Statement\MediaRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\MixinRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ReturnRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\SilentComment; use ScssPhp\ScssPhp\Ast\Sass\Statement\StyleRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\Stylesheet; use ScssPhp\ScssPhp\Ast\Sass\Statement\SupportsRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\VariableDeclaration; use ScssPhp\ScssPhp\Ast\Sass\Statement\WarnRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\WhileRule; /** * An interface for visitors that traverse SassScript statements. * * @internal * * @template T */ interface StatementVisitor { /** * @return T */ public function visitAtRootRule(AtRootRule $node); /** * @return T */ public function visitAtRule(AtRule $node); /** * @return T */ public function visitContentBlock(ContentBlock $node); /** * @return T */ public function visitContentRule(ContentRule $node); /** * @return T */ public function visitDebugRule(DebugRule $node); /** * @return T */ public function visitDeclaration(Declaration $node); /** * @return T */ public function visitEachRule(EachRule $node); /** * @return T */ public function visitErrorRule(ErrorRule $node); /** * @return T */ public function visitExtendRule(ExtendRule $node); /** * @return T */ public function visitForRule(ForRule $node); /** * @return T */ public function visitFunctionRule(FunctionRule $node); /** * @return T */ public function visitIfRule(IfRule $node); /** * @return T */ public function visitImportRule(ImportRule $node); /** * @return T */ public function visitIncludeRule(IncludeRule $node); /** * @return T */ public function visitLoudComment(LoudComment $node); /** * @return T */ public function visitMediaRule(MediaRule $node); /** * @return T */ public function visitMixinRule(MixinRule $node); /** * @return T */ public function visitReturnRule(ReturnRule $node); /** * @return T */ public function visitSilentComment(SilentComment $node); /** * @return T */ public function visitStyleRule(StyleRule $node); /** * @return T */ public function visitStylesheet(Stylesheet $node); /** * @return T */ public function visitSupportsRule(SupportsRule $node); /** * @return T */ public function visitVariableDeclaration(VariableDeclaration $node); /** * @return T */ public function visitWarnRule(WarnRule $node); /** * @return T */ public function visitWhileRule(WhileRule $node); } PKBA#]��KKRsystem/helixultimate/vendor/scssphp/scssphp/src/Visitor/StatementSearchVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Visitor; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Statement\AtRootRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\AtRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\CallableDeclaration; use ScssPhp\ScssPhp\Ast\Sass\Statement\ContentBlock; use ScssPhp\ScssPhp\Ast\Sass\Statement\ContentRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\DebugRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\Declaration; use ScssPhp\ScssPhp\Ast\Sass\Statement\EachRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ErrorRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ExtendRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ForRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\FunctionRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\IfClause; use ScssPhp\ScssPhp\Ast\Sass\Statement\IfRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ImportRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\IncludeRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\LoudComment; use ScssPhp\ScssPhp\Ast\Sass\Statement\MediaRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\MixinRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ParentStatement; use ScssPhp\ScssPhp\Ast\Sass\Statement\ReturnRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\SilentComment; use ScssPhp\ScssPhp\Ast\Sass\Statement\StyleRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\Stylesheet; use ScssPhp\ScssPhp\Ast\Sass\Statement\SupportsRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\VariableDeclaration; use ScssPhp\ScssPhp\Ast\Sass\Statement\WarnRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\WhileRule; use ScssPhp\ScssPhp\Util\IterableUtil; /** * A StatementVisitor whose `visit*` methods default to returning `null`, but * which returns the first non-`null` value returned by any method. * * This can be extended to find the first instance of particular nodes in the * AST. * * @internal * * @template T * @template-implements StatementVisitor<T|null> */ abstract class StatementSearchVisitor implements StatementVisitor { public function visitAtRootRule(AtRootRule $node) { return $this->visitChildren($node->getChildren()); } public function visitAtRule(AtRule $node) { if ($node->getChildren() !== null) { return $this->visitChildren($node->getChildren()); } return null; } public function visitContentBlock(ContentBlock $node) { return $this->visitCallableDeclaration($node); } public function visitContentRule(ContentRule $node) { return null; } public function visitDebugRule(DebugRule $node) { return null; } public function visitDeclaration(Declaration $node) { if ($node->getChildren() !== null) { return $this->visitChildren($node->getChildren()); } return null; } public function visitEachRule(EachRule $node) { return $this->visitChildren($node->getChildren()); } public function visitErrorRule(ErrorRule $node) { return null; } public function visitExtendRule(ExtendRule $node) { return null; } public function visitForRule(ForRule $node) { return $this->visitChildren($node->getChildren()); } public function visitFunctionRule(FunctionRule $node) { return $this->visitCallableDeclaration($node); } public function visitIfRule(IfRule $node) { $value = IterableUtil::search($node->getClauses(), fn(IfClause $clause) => IterableUtil::search($clause->getChildren(), fn(Statement $child) => $child->accept($this))); if ($node->getLastClause() !== null) { $value ??= IterableUtil::search($node->getLastClause()->getChildren(), fn(Statement $child) => $child->accept($this)); } return $value; } public function visitImportRule(ImportRule $node) { return null; } public function visitIncludeRule(IncludeRule $node) { if ($node->getContent() !== null) { return $this->visitContentBlock($node->getContent()); } return null; } public function visitLoudComment(LoudComment $node) { return null; } public function visitMediaRule(MediaRule $node) { return $this->visitChildren($node->getChildren()); } public function visitMixinRule(MixinRule $node) { return $this->visitCallableDeclaration($node); } public function visitReturnRule(ReturnRule $node) { return null; } public function visitSilentComment(SilentComment $node) { return null; } public function visitStyleRule(StyleRule $node) { return $this->visitChildren($node->getChildren()); } public function visitStylesheet(Stylesheet $node) { return $this->visitChildren($node->getChildren()); } public function visitSupportsRule(SupportsRule $node) { return $this->visitChildren($node->getChildren()); } public function visitVariableDeclaration(VariableDeclaration $node) { return null; } public function visitWarnRule(WarnRule $node) { return null; } public function visitWhileRule(WhileRule $node) { return $this->visitChildren($node->getChildren()); } /** * Visits each of $node's expressions and children. * * The default implementations of {@see visitFunctionRule} and {@see visitMixinRule} * call this. * * @return T|null */ protected function visitCallableDeclaration(CallableDeclaration $node) { return $this->visitChildren($node->getChildren()); } /** * Visits each child in $children. * * The default implementation of the visit methods for all {@see ParentStatement}s * call this. * * @param Statement[] $children * * @return T|null */ protected function visitChildren(array $children) { return IterableUtil::search($children, fn (Statement $child) => $child->accept($this)); } } PKBA#]�s+Cl l Qsystem/helixultimate/vendor/scssphp/scssphp/src/Visitor/SelectorSearchVisitor.phpnu�[���<?php namespace ScssPhp\ScssPhp\Visitor; use ScssPhp\ScssPhp\Ast\Selector\AttributeSelector; use ScssPhp\ScssPhp\Ast\Selector\ClassSelector; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelector; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelectorComponent; use ScssPhp\ScssPhp\Ast\Selector\CompoundSelector; use ScssPhp\ScssPhp\Ast\Selector\IDSelector; use ScssPhp\ScssPhp\Ast\Selector\ParentSelector; use ScssPhp\ScssPhp\Ast\Selector\PlaceholderSelector; use ScssPhp\ScssPhp\Ast\Selector\PseudoSelector; use ScssPhp\ScssPhp\Ast\Selector\SelectorList; use ScssPhp\ScssPhp\Ast\Selector\SimpleSelector; use ScssPhp\ScssPhp\Ast\Selector\TypeSelector; use ScssPhp\ScssPhp\Ast\Selector\UniversalSelector; use ScssPhp\ScssPhp\Util\IterableUtil; /** * A {@see SelectorVisitor} whose `visit*` methods default to returning `null`, but * which returns the first non-`null` value returned by any method. * * This can be extended to find the first instance of particular nodes in the * AST. * * @template T * @template-implements SelectorVisitor<T|null> * * @internal */ abstract class SelectorSearchVisitor implements SelectorVisitor { public function visitAttributeSelector(AttributeSelector $attribute) { return null; } public function visitClassSelector(ClassSelector $klass) { return null; } public function visitIDSelector(IDSelector $id) { return null; } public function visitParentSelector(ParentSelector $parent) { return null; } public function visitPlaceholderSelector(PlaceholderSelector $placeholder) { return null; } public function visitTypeSelector(TypeSelector $type) { return null; } public function visitUniversalSelector(UniversalSelector $universal) { return null; } public function visitComplexSelector(ComplexSelector $complex) { return IterableUtil::search($complex->getComponents(), fn(ComplexSelectorComponent $component) => $this->visitCompoundSelector($component->getSelector())); } public function visitCompoundSelector(CompoundSelector $compound) { return IterableUtil::search($compound->getComponents(), fn(SimpleSelector $simple) => $simple->accept($this)); } public function visitPseudoSelector(PseudoSelector $pseudo) { if ($pseudo->getSelector() !== null) { return $this->visitSelectorList($pseudo->getSelector()); } return null; } public function visitSelectorList(SelectorList $list) { return IterableUtil::search($list->getComponents(), $this->visitComplexSelector(...)); } } PKBA#]y� �� � Nsystem/helixultimate/vendor/scssphp/scssphp/src/Visitor/AnySelectorVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Visitor; use ScssPhp\ScssPhp\Ast\Selector\AttributeSelector; use ScssPhp\ScssPhp\Ast\Selector\ClassSelector; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelector; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelectorComponent; use ScssPhp\ScssPhp\Ast\Selector\CompoundSelector; use ScssPhp\ScssPhp\Ast\Selector\IDSelector; use ScssPhp\ScssPhp\Ast\Selector\ParentSelector; use ScssPhp\ScssPhp\Ast\Selector\PlaceholderSelector; use ScssPhp\ScssPhp\Ast\Selector\PseudoSelector; use ScssPhp\ScssPhp\Ast\Selector\SelectorList; use ScssPhp\ScssPhp\Ast\Selector\SimpleSelector; use ScssPhp\ScssPhp\Ast\Selector\TypeSelector; use ScssPhp\ScssPhp\Ast\Selector\UniversalSelector; use ScssPhp\ScssPhp\Util\IterableUtil; /** * A visitor that visits each selector in a Sass selector AST and returns * `true` if any of the individual methods return `true`. * * Each method returns `false` by default. * * @template-implements SelectorVisitor<bool> * @internal */ abstract class AnySelectorVisitor implements SelectorVisitor { public function visitComplexSelector(ComplexSelector $complex): bool { return IterableUtil::any($complex->getComponents(), fn (ComplexSelectorComponent $component) => $this->visitCompoundSelector($component->getSelector())); } public function visitCompoundSelector(CompoundSelector $compound): bool { return IterableUtil::any($compound->getComponents(), fn (SimpleSelector $simple) => $simple->accept($this)); } public function visitPseudoSelector(PseudoSelector $pseudo): bool { $selector = $pseudo->getSelector(); return $selector === null ? false : $selector->accept($this); } public function visitSelectorList(SelectorList $list): bool { return IterableUtil::any($list->getComponents(), $this->visitComplexSelector(...)); } public function visitAttributeSelector(AttributeSelector $attribute): bool { return false; } public function visitClassSelector(ClassSelector $klass): bool { return false; } public function visitIDSelector(IDSelector $id): bool { return false; } public function visitParentSelector(ParentSelector $parent): bool { return false; } public function visitPlaceholderSelector(PlaceholderSelector $placeholder): bool { return false; } public function visitTypeSelector(TypeSelector $type): bool { return false; } public function visitUniversalSelector(UniversalSelector $universal): bool { return false; } } PKBA#]�qeDMMMsystem/helixultimate/vendor/scssphp/scssphp/src/Visitor/ExpressionVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Visitor; use ScssPhp\ScssPhp\Ast\Sass\Expression\BinaryOperationExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\BooleanExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\ColorExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\FunctionExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\IfExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\InterpolatedFunctionExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\ListExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\MapExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\NullExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\NumberExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\ParenthesizedExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\SelectorExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\StringExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\SupportsExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\UnaryOperationExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\ValueExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\VariableExpression; /** * An interface for visitors that traverse SassScript expressions. * * @internal * * @template T */ interface ExpressionVisitor { /** * @return T */ public function visitBinaryOperationExpression(BinaryOperationExpression $node); /** * @return T */ public function visitBooleanExpression(BooleanExpression $node); /** * @return T */ public function visitColorExpression(ColorExpression $node); /** * @return T */ public function visitInterpolatedFunctionExpression(InterpolatedFunctionExpression $node); /** * @return T */ public function visitFunctionExpression(FunctionExpression $node); /** * @return T */ public function visitIfExpression(IfExpression $node); /** * @return T */ public function visitListExpression(ListExpression $node); /** * @return T */ public function visitMapExpression(MapExpression $node); /** * @return T */ public function visitNullExpression(NullExpression $node); /** * @return T */ public function visitNumberExpression(NumberExpression $node); /** * @return T */ public function visitParenthesizedExpression(ParenthesizedExpression $node); /** * @return T */ public function visitSelectorExpression(SelectorExpression $node); /** * @return T */ public function visitStringExpression(StringExpression $node); /** * @return T */ public function visitSupportsExpression(SupportsExpression $node); /** * @return T */ public function visitUnaryOperationExpression(UnaryOperationExpression $node); /** * @return T */ public function visitValueExpression(ValueExpression $node); /** * @return T */ public function visitVariableExpression(VariableExpression $node); } PKBA#]��g.��Ksystem/helixultimate/vendor/scssphp/scssphp/src/Visitor/SelectorVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Visitor; use ScssPhp\ScssPhp\Ast\Selector\AttributeSelector; use ScssPhp\ScssPhp\Ast\Selector\ClassSelector; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelector; use ScssPhp\ScssPhp\Ast\Selector\CompoundSelector; use ScssPhp\ScssPhp\Ast\Selector\IDSelector; use ScssPhp\ScssPhp\Ast\Selector\ParentSelector; use ScssPhp\ScssPhp\Ast\Selector\PlaceholderSelector; use ScssPhp\ScssPhp\Ast\Selector\PseudoSelector; use ScssPhp\ScssPhp\Ast\Selector\SelectorList; use ScssPhp\ScssPhp\Ast\Selector\TypeSelector; use ScssPhp\ScssPhp\Ast\Selector\UniversalSelector; /** * An interface for visitors that traverse selectors. * * @internal * * @template T */ interface SelectorVisitor { /** * @return T */ public function visitAttributeSelector(AttributeSelector $attribute); /** * @return T */ public function visitClassSelector(ClassSelector $klass); /** * @return T */ public function visitComplexSelector(ComplexSelector $complex); /** * @return T */ public function visitCompoundSelector(CompoundSelector $compound); /** * @return T */ public function visitIDSelector(IDSelector $id); /** * @return T */ public function visitParentSelector(ParentSelector $parent); /** * @return T */ public function visitPlaceholderSelector(PlaceholderSelector $placeholder); /** * @return T */ public function visitPseudoSelector(PseudoSelector $pseudo); /** * @return T */ public function visitSelectorList(SelectorList $list); /** * @return T */ public function visitTypeSelector(TypeSelector $type); /** * @return T */ public function visitUniversalSelector(UniversalSelector $universal); } PKBA#]�j��Tsystem/helixultimate/vendor/scssphp/scssphp/src/Visitor/ReplaceExpressionVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Visitor; use ScssPhp\ScssPhp\Ast\Sass\ArgumentInvocation; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression\BinaryOperationExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\BooleanExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\ColorExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\FunctionExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\IfExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\InterpolatedFunctionExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\ListExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\MapExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\NullExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\NumberExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\ParenthesizedExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\SelectorExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\StringExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\SupportsExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\UnaryOperationExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\ValueExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\VariableExpression; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsDeclaration; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsInterpolation; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsNegation; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsOperation; /** * A visitor that recursively traverses each expression in a SassScript AST and * replaces its contents with the values returned by nested recursion. * * In addition to the methods from {@see ExpressionVisitor}, this has more general * protected methods that can be overridden to add behavior for a wide variety * of AST nodes: * * * {@see visitArgumentInvocation} * * {@see visitSupportsCondition} * * {@see visitInterpolation} * * @template-implements ExpressionVisitor<Expression> * * @internal */ abstract class ReplaceExpressionVisitor implements ExpressionVisitor { public function visitBinaryOperationExpression(BinaryOperationExpression $node): Expression { return new BinaryOperationExpression($node->getOperator(), $node->getLeft()->accept($this), $node->getRight()->accept($this)); } public function visitBooleanExpression(BooleanExpression $node): Expression { return $node; } public function visitColorExpression(ColorExpression $node): Expression { return $node; } public function visitFunctionExpression(FunctionExpression $node): Expression { return new FunctionExpression( $node->getOriginalName(), $this->visitArgumentInvocation($node->getArguments()), $node->getSpan(), $node->getNamespace() ); } public function visitInterpolatedFunctionExpression(InterpolatedFunctionExpression $node): Expression { return new InterpolatedFunctionExpression( $this->visitInterpolation($node->getName()), $this->visitArgumentInvocation($node->getArguments()), $node->getSpan() ); } public function visitIfExpression(IfExpression $node): Expression { return new IfExpression($this->visitArgumentInvocation($node->getArguments()), $node->getSpan()); } public function visitListExpression(ListExpression $node): Expression { return new ListExpression( array_map(fn(Expression $item) => $item->accept($this), $node->getContents()), $node->getSeparator(), $node->getSpan(), $node->hasBrackets() ); } public function visitMapExpression(MapExpression $node): Expression { return new MapExpression( array_map(fn(array $pair) => [$pair[0]->accept($this), $pair[1]->accept($this)], $node->getPairs()), $node->getSpan() ); } public function visitNullExpression(NullExpression $node): Expression { return $node; } public function visitNumberExpression(NumberExpression $node): Expression { return $node; } public function visitParenthesizedExpression(ParenthesizedExpression $node): Expression { return new ParenthesizedExpression($node->getExpression()->accept($this), $node->getSpan()); } public function visitSelectorExpression(SelectorExpression $node): Expression { return $node; } public function visitStringExpression(StringExpression $node): Expression { return new StringExpression($this->visitInterpolation($node->getText()), $node->hasQuotes()); } public function visitSupportsExpression(SupportsExpression $node): Expression { return new SupportsExpression($this->visitSupportsCondition($node->getCondition())); } public function visitUnaryOperationExpression(UnaryOperationExpression $node): Expression { return new UnaryOperationExpression($node->getOperator(), $node->getOperand()->accept($this), $node->getSpan()); } public function visitValueExpression(ValueExpression $node): Expression { return $node; } public function visitVariableExpression(VariableExpression $node): Expression { return $node; } /** * Replaces each expression in an invocation. * * The default implementation of the visit methods calls this to replace any * argument invocation in an expression. */ protected function visitArgumentInvocation(ArgumentInvocation $invocation): ArgumentInvocation { return new ArgumentInvocation( array_map(fn(Expression $expression) => $expression->accept($this), $invocation->getPositional()), array_map(fn(Expression $expression) => $expression->accept($this), $invocation->getNamed()), $invocation->getSpan(), $invocation->getRest()?->accept($this), $invocation->getKeywordRest()?->accept($this) ); } /** * Replaces each expression in $condition. * * The default implementation of the visit methods call this to visit any * {@see SupportsCondition} they encounter. */ protected function visitSupportsCondition(SupportsCondition $condition): SupportsCondition { if ($condition instanceof SupportsOperation) { return new SupportsOperation( $this->visitSupportsCondition($condition->getLeft()), $this->visitSupportsCondition($condition->getRight()), $condition->getOperator(), $condition->getSpan() ); } if ($condition instanceof SupportsNegation) { return new SupportsNegation($this->visitSupportsCondition($condition->getCondition()), $condition->getSpan()); } if ($condition instanceof SupportsInterpolation) { return new SupportsInterpolation($condition->getExpression()->accept($this), $condition->getSpan()); } if ($condition instanceof SupportsDeclaration) { return new SupportsDeclaration($condition->getName()->accept($this), $condition->getValue()->accept($this), $condition->getSpan()); } throw new \UnexpectedValueException('BUG: Unknown SupportsCondition ' . get_class($condition)); } protected function visitInterpolation(Interpolation $interpolation): Interpolation { return new Interpolation(array_map(function ($node) { return $node instanceof Expression ? $node->accept($this) : $node; }, $interpolation->getContents()), $interpolation->getSpan()); } } PKBA#]5ފR��Psystem/helixultimate/vendor/scssphp/scssphp/src/Visitor/ModifiableCssVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Visitor; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssAtRule; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssComment; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssDeclaration; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssImport; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssKeyframeBlock; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssMediaRule; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssStyleRule; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssStylesheet; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssSupportsRule; /** * An interface for visitors that traverse CSS statements. * * @internal * * @template T */ interface ModifiableCssVisitor { /** * @return T */ public function visitCssAtRule(ModifiableCssAtRule $node); /** * @return T */ public function visitCssComment(ModifiableCssComment $node); /** * @return T */ public function visitCssDeclaration(ModifiableCssDeclaration $node); /** * @return T */ public function visitCssImport(ModifiableCssImport $node); /** * @return T */ public function visitCssKeyframeBlock(ModifiableCssKeyframeBlock $node); /** * @return T */ public function visitCssMediaRule(ModifiableCssMediaRule $node); /** * @return T */ public function visitCssStyleRule(ModifiableCssStyleRule $node); /** * @return T */ public function visitCssStylesheet(ModifiableCssStylesheet $node); /** * @return T */ public function visitCssSupportsRule(ModifiableCssSupportsRule $node); } PKBA#]i�:���Hsystem/helixultimate/vendor/scssphp/scssphp/src/Visitor/ValueVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Visitor; use ScssPhp\ScssPhp\Value\SassBoolean; use ScssPhp\ScssPhp\Value\SassCalculation; use ScssPhp\ScssPhp\Value\SassColor; use ScssPhp\ScssPhp\Value\SassFunction; use ScssPhp\ScssPhp\Value\SassList; use ScssPhp\ScssPhp\Value\SassMap; use ScssPhp\ScssPhp\Value\SassMixin; use ScssPhp\ScssPhp\Value\SassNumber; use ScssPhp\ScssPhp\Value\SassString; /** * An interface for visitors that traverse SassScript $values. * * @internal * * @template T */ interface ValueVisitor { /** * @return T */ public function visitBoolean(SassBoolean $value); /** * @return T */ public function visitCalculation(SassCalculation $value); /** * @return T */ public function visitColor(SassColor $value); /** * @return T */ public function visitFunction(SassFunction $value); /** * @return T */ public function visitMixin(SassMixin $value); /** * @return T */ public function visitList(SassList $value); /** * @return T */ public function visitMap(SassMap $value); /** * @return T */ public function visitNull(); /** * @return T */ public function visitNumber(SassNumber $value); /** * @return T */ public function visitString(SassString $value); } PKBA#]�2XXXFsystem/helixultimate/vendor/scssphp/scssphp/src/Visitor/CssVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Visitor; use ScssPhp\ScssPhp\Ast\Css\CssAtRule; use ScssPhp\ScssPhp\Ast\Css\CssComment; use ScssPhp\ScssPhp\Ast\Css\CssDeclaration; use ScssPhp\ScssPhp\Ast\Css\CssImport; use ScssPhp\ScssPhp\Ast\Css\CssKeyframeBlock; use ScssPhp\ScssPhp\Ast\Css\CssMediaRule; use ScssPhp\ScssPhp\Ast\Css\CssStyleRule; use ScssPhp\ScssPhp\Ast\Css\CssStylesheet; use ScssPhp\ScssPhp\Ast\Css\CssSupportsRule; /** * An interface for visitors that traverse CSS statements. * * @internal * * @template T * @template-extends ModifiableCssVisitor<T> */ interface CssVisitor extends ModifiableCssVisitor { /** * @return T */ public function visitCssAtRule(CssAtRule $node); /** * @return T */ public function visitCssComment(CssComment $node); /** * @return T */ public function visitCssDeclaration(CssDeclaration $node); /** * @return T */ public function visitCssImport(CssImport $node); /** * @return T */ public function visitCssKeyframeBlock(CssKeyframeBlock $node); /** * @return T */ public function visitCssMediaRule(CssMediaRule $node); /** * @return T */ public function visitCssStyleRule(CssStyleRule $node); /** * @return T */ public function visitCssStylesheet(CssStylesheet $node); /** * @return T */ public function visitCssSupportsRule(CssSupportsRule $node); } PKBA#]#���Bsystem/helixultimate/vendor/scssphp/scssphp/src/Collection/Map.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Collection; use ScssPhp\ScssPhp\Value\Value; /** * A map using Sass values as keys based on Value::equals. * * The map can be either modifiable or unmodifiable. For unmodifiable * maps, all mutators will throw a LogicException. * * Iteration preserves the order in which keys have been inserted. * * @template T * @template-implements \IteratorAggregate<Value, T> */ final class Map implements \Countable, \IteratorAggregate { private bool $modifiable = true; // TODO implement a better internal storage to allow reading keys in O(1). /** * @var array<int, array{Value, T}> */ private array $pairs = []; /** * Returns a modifiable version of the Map. * * @template V * @param Map<V> $map * * @return Map<V> */ public static function of(Map $map): Map { $modifiableMap = clone $map; $modifiableMap->modifiable = true; return $modifiableMap; } /** * Returns an unmodifiable version of the Map. * * All mutators will throw a LogicException when trying to use them. * * @template V * @param Map<V> $map * * @return Map<V> */ public static function unmodifiable(Map $map): Map { if (!$map->modifiable) { return $map; } $unmodifiableMap = clone $map; $unmodifiableMap->modifiable = false; return $unmodifiableMap; } public function getIterator(): \Traversable { foreach ($this->pairs as $pair) { yield $pair[0] => $pair[1]; } } public function count(): int { return \count($this->pairs); } /** * The value for the given key, or `null` if $key is not in the map. * * @return T|null */ public function get(Value $key) { foreach ($this->pairs as $pair) { if ($key->equals($pair[0])) { return $pair[1]; } } return null; } public function containsKey(Value $key): bool { return $this->get($key) !== null; } /** * Associates the key with the given value. * * If the key was already in the map, its associated value is changed. * Otherwise the key/value pair is added to the map. * * @param T $value */ public function put(Value $key, $value): void { $this->assertModifiable(); foreach ($this->pairs as $i => $pair) { if ($key->equals($pair[0])) { $this->pairs[$i][1] = $value; return; } } $this->pairs[] = [$key, $value]; } /** * Removes $key and its associated value, if present, from the map. * * Returns the value associated with `key` before it was removed. * Returns `null` if `key` was not in the map. * * Note that some maps allow `null` as a value, * so a returned `null` value doesn't always mean that the key was absent. * * @return T|null */ public function remove(Value $key) { $this->assertModifiable(); foreach ($this->pairs as $i => $pair) { if ($key->equals($pair[0])) { unset($this->pairs[$i]); return $pair[1]; } } return null; } /** * @return list<Value> */ public function keys(): array { $keys = []; foreach ($this->pairs as $pair) { $keys[] = $pair[0]; } return $keys; } /** * @return list<T> */ public function values(): array { $values = []; foreach ($this->pairs as $pair) { $values[] = $pair[1]; } return $values; } private function assertModifiable(): void { if (!$this->modifiable) { throw new \LogicException('Mutating an unmodifiable Map is not supported. Use Map::of to create a modifiable copy.'); } } } PKBA#]O>�4��Nsystem/helixultimate/vendor/scssphp/scssphp/src/Serializer/SerializeResult.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Serializer; use ScssPhp\ScssPhp\SourceMap\SingleMapping; /** * The result of converting a CSS AST to CSS text. * * @internal */ final class SerializeResult { public function __construct( public readonly string $css, public readonly ?SingleMapping $mapping, ) { } } PKBA#]=�KxxIsystem/helixultimate/vendor/scssphp/scssphp/src/Serializer/Serializer.phpnu�[���<?php /** * SCSSPHP * * @copyright 2018-2020 Anthon Pang * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Serializer; use ScssPhp\ScssPhp\Ast\Css\CssNode; use ScssPhp\ScssPhp\Ast\Css\CssParentNode; use ScssPhp\ScssPhp\Ast\Selector\Selector; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\OutputStyle; use ScssPhp\ScssPhp\Value\Value; use ScssPhp\ScssPhp\Visitor\CssVisitor; use ScssPhp\ScssPhp\Visitor\ModifiableCssVisitor; /** * @internal */ final class Serializer { public static function serialize(CssNode $node, bool $inspect = false, OutputStyle $style = OutputStyle::EXPANDED, bool $sourceMap = false, bool $charset = true, ?LoggerInterface $logger = null): SerializeResult { $visitor = new SerializeVisitor($inspect, true, $style, $sourceMap, $logger); $node->accept($visitor); $css = (string) $visitor->getBuffer(); $prefix = ''; if ($charset && strlen($css) !== mb_strlen($css, 'UTF-8')) { if ($style === OutputStyle::COMPRESSED) { $prefix = "\u{FEFF}"; } else { $prefix = '@charset "UTF-8";' . "\n"; } } return new SerializeResult( $prefix . $css, $sourceMap ? $visitor->getBuffer()->buildSourceMap($prefix) : null, ); } /** * Converts $value to a CSS string. * * If $inspect is `true`, this will emit an unambiguous representation of the * source structure. Note however that, although this will be valid SCSS, it * may not be valid CSS. If $inspect is `false` and $value can't be * represented in plain CSS, throws a {@see SassScriptException}. * * If $quote is `false`, quoted strings are emitted without quotes. */ public static function serializeValue(Value $value, bool $inspect = false, bool $quote = true): string { // Force loading the CssParentNode and CssVisitor before using the visitor because of a weird PHP behavior. class_exists(CssParentNode::class); class_exists(CssVisitor::class); $visitor = new SerializeVisitor($inspect, $quote); $value->accept($visitor); return (string) $visitor->getBuffer(); } /** * Converts $selector to a CSS string. * * If $inspect is `true`, this will emit an unambiguous representation of the * source structure. Note however that, although this will be valid SCSS, it * may not be valid CSS. If $inspect is `false` and $selector can't be * represented in plain CSS, throws a {@see SassScriptException}. */ public static function serializeSelector(Selector $selector, bool $inspect = false): string { // Force loading the CssParentNode and CssVisitor before using the visitor because of a weird PHP behavior. class_exists(CssParentNode::class); class_exists(CssVisitor::class); $visitor = new SerializeVisitor($inspect); $selector->accept($visitor); return (string) $visitor->getBuffer(); } } PKBA#]o�~��Qsystem/helixultimate/vendor/scssphp/scssphp/src/Serializer/SimpleStringBuffer.phpnu�[���<?php /** * SCSSPHP * * @copyright 2018-2020 Anthon Pang * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Serializer; use ScssPhp\ScssPhp\SourceMap\SingleMapping; use SourceSpan\FileSpan; /** * A buffer that doesn't actually build a source map. * * We implement {@see SourceMapBuffer} directly on SimpleStringBuffer to avoid * an unnecessary wrapper for NoSourceMapBuffer (dart-sass has to make a wrapper * because StringBuffer comes from dart core). * * @internal */ final class SimpleStringBuffer implements SourceMapBuffer { private string $text = ''; public function getLength(): int { return \strlen($this->text); } public function write(string $string): void { $this->text .= $string; } public function writeChar(string $char): void { $this->text .= $char; } public function __toString(): string { return $this->text; } public function forSpan(FileSpan $span, callable $callback) { return $callback(); } public function buildSourceMap(?string $prefix): SingleMapping { throw new \BadMethodCallException(__METHOD__ . ' is not supported.'); } } PKBA#]������Osystem/helixultimate/vendor/scssphp/scssphp/src/Serializer/SerializeVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2018-2020 Anthon Pang * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Serializer; use ScssPhp\ScssPhp\Ast\AstNode; use ScssPhp\ScssPhp\Ast\Css\CssAtRule; use ScssPhp\ScssPhp\Ast\Css\CssComment; use ScssPhp\ScssPhp\Ast\Css\CssDeclaration; use ScssPhp\ScssPhp\Ast\Css\CssImport; use ScssPhp\ScssPhp\Ast\Css\CssKeyframeBlock; use ScssPhp\ScssPhp\Ast\Css\CssMediaQuery; use ScssPhp\ScssPhp\Ast\Css\CssMediaRule; use ScssPhp\ScssPhp\Ast\Css\CssNode; use ScssPhp\ScssPhp\Ast\Css\CssParentNode; use ScssPhp\ScssPhp\Ast\Css\CssStyleRule; use ScssPhp\ScssPhp\Ast\Css\CssStylesheet; use ScssPhp\ScssPhp\Ast\Css\CssSupportsRule; use ScssPhp\ScssPhp\Ast\Css\CssValue; use ScssPhp\ScssPhp\Ast\Selector\AttributeSelector; use ScssPhp\ScssPhp\Ast\Selector\ClassSelector; use ScssPhp\ScssPhp\Ast\Selector\Combinator; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelector; use ScssPhp\ScssPhp\Ast\Selector\CompoundSelector; use ScssPhp\ScssPhp\Ast\Selector\IDSelector; use ScssPhp\ScssPhp\Ast\Selector\ParentSelector; use ScssPhp\ScssPhp\Ast\Selector\PlaceholderSelector; use ScssPhp\ScssPhp\Ast\Selector\PseudoSelector; use ScssPhp\ScssPhp\Ast\Selector\SelectorList; use ScssPhp\ScssPhp\Ast\Selector\TypeSelector; use ScssPhp\ScssPhp\Ast\Selector\UniversalSelector; use ScssPhp\ScssPhp\Colors; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Logger\QuietLogger; use ScssPhp\ScssPhp\OutputStyle; use ScssPhp\ScssPhp\Parser\LineScanner; use ScssPhp\ScssPhp\Parser\Parser; use ScssPhp\ScssPhp\Parser\StringScanner; use ScssPhp\ScssPhp\SourceSpan\MultiSpan; use ScssPhp\ScssPhp\Util\Character; use ScssPhp\ScssPhp\Util\IterableUtil; use ScssPhp\ScssPhp\Util\LoggerUtil; use ScssPhp\ScssPhp\Util\NumberUtil; use ScssPhp\ScssPhp\Util\SpanUtil; use ScssPhp\ScssPhp\Util\StringUtil; use ScssPhp\ScssPhp\Value\CalculationOperation; use ScssPhp\ScssPhp\Value\CalculationOperator; use ScssPhp\ScssPhp\Value\ColorFormatEnum; use ScssPhp\ScssPhp\Value\ListSeparator; use ScssPhp\ScssPhp\Value\SassBoolean; use ScssPhp\ScssPhp\Value\SassCalculation; use ScssPhp\ScssPhp\Value\SassColor; use ScssPhp\ScssPhp\Value\SassFunction; use ScssPhp\ScssPhp\Value\SassList; use ScssPhp\ScssPhp\Value\SassMap; use ScssPhp\ScssPhp\Value\SassMixin; use ScssPhp\ScssPhp\Value\SassNumber; use ScssPhp\ScssPhp\Value\SassString; use ScssPhp\ScssPhp\Value\SpanColorFormat; use ScssPhp\ScssPhp\Value\Value; use ScssPhp\ScssPhp\Visitor\CssVisitor; use ScssPhp\ScssPhp\Visitor\SelectorVisitor; use ScssPhp\ScssPhp\Visitor\ValueVisitor; /** * @internal * * @template-implements CssVisitor<void> * @template-implements ValueVisitor<void> * @template-implements SelectorVisitor<void> */ final class SerializeVisitor implements CssVisitor, ValueVisitor, SelectorVisitor { private readonly SourceMapBuffer $buffer; /** * The current indentation of the CSS output. * * @var int */ private int $indentation = 0; /** * Whether we're emitting an unambiguous representation of the source * structure, as opposed to valid CSS. */ private readonly bool $inspect; /** * Whether quoted strings should be emitted with quotes. */ private readonly bool $quote; private readonly LoggerInterface $logger; private readonly bool $compressed; public function __construct(bool $inspect = false, bool $quote = true, OutputStyle $style = OutputStyle::EXPANDED, bool $sourceMap = false, ?LoggerInterface $logger = null) { $this->buffer = $sourceMap ? new TrackingSourceMapBuffer() : new SimpleStringBuffer(); $this->inspect = $inspect; $this->quote = $quote; $this->logger = $logger ?? new QuietLogger(); $this->compressed = $style === OutputStyle::COMPRESSED; } public function getBuffer(): SourceMapBuffer { return $this->buffer; } public function visitCssStylesheet(CssStylesheet $node): void { $previous = null; foreach ($node->getChildren() as $child) { if ($this->isInvisible($child)) { continue; } if ($previous !== null) { if ($this->requiresSemicolon($previous)) { $this->buffer->writeChar(';'); } if ($this->isTrailingComment($child, $previous)) { $this->writeOptionalSpace(); } else { $this->writeLineFeed(); if ($previous->isGroupEnd()) { $this->writeLineFeed(); } } } $previous = $child; $child->accept($this); } if ($previous !== null && $this->requiresSemicolon($previous) && !$this->compressed) { $this->buffer->writeChar(';'); } } public function visitCssComment(CssComment $node): void { $this->for($node, function () use ($node) { // Preserve comments that start with `/*!`. if ($this->compressed && !$node->isPreserved()) { return; } // Ignore sourceMappingURL and sourceURL comments. if (preg_match('{^/\*# source(Mapping)?URL=}', $node->getText())) { return; } $minimumIndentation = $this->minimumIndentation($node->getText()); assert($minimumIndentation !== -1); if ($minimumIndentation === null) { $this->writeIndentation(); $this->buffer->write($node->getText()); return; } $minimumIndentation = min($minimumIndentation, $node->getSpan()->getStart()->getColumn()); $this->writeIndentation(); $this->writeWithIndent($node->getText(), $minimumIndentation); }); } public function visitCssAtRule(CssAtRule $node): void { $this->writeIndentation(); $this->for($node, function () use ($node) { $this->buffer->writeChar('@'); $this->write($node->getName()); $value = $node->getValue(); if ($value !== null) { $this->buffer->writeChar(' '); $this->write($value); } if (!$node->isChildless()) { $this->writeOptionalSpace(); $this->visitChildren($node); } }); } public function visitCssMediaRule(CssMediaRule $node): void { $this->writeIndentation(); $this->for($node, function () use ($node) { $this->buffer->write('@media'); $firstQuery = $node->getQueries()[0]; if (!$this->compressed || $firstQuery->getModifier() !== null || $firstQuery->getType() !== null || (\count($firstQuery->getConditions()) === 1) && str_starts_with($firstQuery->getConditions()[0], '(not ')) { $this->buffer->writeChar(' '); } $this->writeBetween($node->getQueries(), $this->getCommaSeparator(), $this->visitMediaQuery(...)); }); $this->writeOptionalSpace(); $this->visitChildren($node); } public function visitCssImport(CssImport $node): void { $this->writeIndentation(); $this->for($node, function () use ($node) { $this->buffer->write('@import'); $this->writeOptionalSpace(); $this->for($node->getUrl(), function () use ($node) { $this->writeImportUrl($node->getUrl()->getValue()); }); if ($node->getModifiers() !== null) { $this->writeOptionalSpace(); $this->write($node->getModifiers()); } }); } /** * Writes $url, which is an import's URL, to the buffer. */ private function writeImportUrl(string $url): void { if (!$this->compressed || $url[0] !== 'u') { $this->buffer->write($url); return; } // If this is url(...), remove the surrounding function. This is terser and // it allows us to remove whitespace between `@import` and the URL. $urlContents = substr($url, 4, \strlen($url) - 5); $maybeQuote = $urlContents[0]; if ($maybeQuote === "'" || $maybeQuote === '"') { $this->buffer->write($urlContents); } else { // If the URL didn't contain quotes, write them manually. $this->visitQuotedString($urlContents); } } public function visitCssKeyframeBlock(CssKeyframeBlock $node): void { $this->writeIndentation(); $this->for($node->getSelector(), function () use ($node) { $this->writeBetween($node->getSelector()->getValue(), $this->getCommaSeparator(), $this->buffer->write(...)); }); $this->writeOptionalSpace(); $this->visitChildren($node); } private function visitMediaQuery(CssMediaQuery $query): void { if ($query->getModifier() !== null) { $this->buffer->write($query->getModifier()); $this->buffer->writeChar(' '); } if ($query->getType() !== null) { $this->buffer->write($query->getType()); if (\count($query->getConditions())) { $this->buffer->write(' and '); } } if (\count($query->getConditions()) === 1 && str_starts_with($query->getConditions()[0], '(not ')) { $this->buffer->write('not '); $condition = $query->getConditions()[0]; $this->buffer->write(substr($condition, \strlen('(not '), \strlen($condition) - (\strlen('(not ') + 1))); } else { $operator = $query->isConjunction() ? 'and' : 'or'; $this->writeBetween($query->getConditions(), $this->compressed ? "$operator " : " $operator ", $this->buffer->write(...)); } } public function visitCssStyleRule(CssStyleRule $node): void { $this->writeIndentation(); $this->for($node->getSelector(), function () use ($node) { $node->getSelector()->accept($this); }); $this->writeOptionalSpace(); $this->visitChildren($node); } public function visitCssSupportsRule(CssSupportsRule $node): void { $this->writeIndentation(); $this->for($node, function () use ($node) { $this->buffer->write('@supports'); if (!($this->compressed && $node->getCondition()->getValue()[0] === '(')) { $this->buffer->writeChar(' '); } $this->write($node->getCondition()); }); $this->writeOptionalSpace(); $this->visitChildren($node); } public function visitCssDeclaration(CssDeclaration $node): void { if ($node->getInterleavedRules() !== []) { \assert($node->getParent() !== null); $declSpecificities = $this->specificities($node->getParent()); foreach ($node->getInterleavedRules() as $rule) { $ruleSpecificities = $this->specificities($rule); // If the declaration can never match with the same specificity as one // of its sibling rules, then ordering will never matter and there's no // need to warn about the declaration being re-ordered. if (!IterableUtil::any($declSpecificities, fn ($s) => \in_array($s, $ruleSpecificities, true))) { continue; } LoggerUtil::warnForDeprecation( $this->logger, Deprecation::mixedDecls, <<<'MESSAGE' Sass's behavior for declarations that appear after nested rules will be changing to match the behavior specified by CSS in an upcoming version. To keep the existing behavior, move the declaration above the nested rule. To opt into the new behavior, wrap the declaration in `& {}`. More info: https://sass-lang.com/d/mixed-decls MESSAGE, new MultiSpan($node->getSpan(), 'declaration', [ 'nested rule' => $rule->getSpan(), ]), $node->getTrace() ); } } $this->writeIndentation(); $this->write($node->getName()); $this->buffer->writeChar(':'); // If `node` is a custom property that was parsed as a normal Sass-syntax // property (such as `#{--foo}: ...`), we serialize its value using the // normal Sass property logic as well. if ($node->isCustomProperty() && $node->isParsedAsCustomProperty()) { $this->for($node->getValue(), function () use ($node) { if ($this->compressed) { $this->writeFoldedValue($node); } else { $this->writeReindentedValue($node); } }); } else { $this->writeOptionalSpace(); try { $this->buffer->forSpan($node->getValueSpanForMap(), fn () => $node->getValue()->getValue()->accept($this)); } catch (SassScriptException $error) { throw $error->withSpan($node->getValue()->getSpan()); } } } /** * Returns the set of possible specificities with which $node might match. * * @return non-empty-array<int> */ private function specificities(CssParentNode $node): array { if ($node instanceof CssStyleRule) { // Plain CSS style rule nesting implicitly wraps parent selectors in // `:is()`, so they all match with the highest specificity among any of // them. if ($node->getParent() !== null) { $parent = max($this->specificities($node->getParent())); } else { $parent = 0; } return array_map(fn (ComplexSelector $selector) => $parent + $selector->getSpecificity(), $node->getSelector()->getComponents()); } if ($node->getParent() !== null) { return $this->specificities($node->getParent()); } return [0]; } /** * Emits the value of $node, with all newlines followed by whitespace */ private function writeFoldedValue(CssDeclaration $node): void { $value = $node->getValue()->getValue(); assert($value instanceof SassString); $scannner = new StringScanner($value->getText()); while (!$scannner->isDone()) { $next = $scannner->readUtf8Char(); if ($next !== "\n") { $this->buffer->writeChar($next); continue; } $this->buffer->writeChar(' '); while (Character::isWhitespace($scannner->peekChar())) { $scannner->readChar(); } } } /** * Emits the value of $node, re-indented relative to the current indentation. */ private function writeReindentedValue(CssDeclaration $node): void { $nodeValue = $node->getValue()->getValue(); assert($nodeValue instanceof SassString); $value = $nodeValue->getText(); $minimumIndentation = $this->minimumIndentation($value); if ($minimumIndentation === null) { $this->buffer->write($value); return; } if ($minimumIndentation === -1) { $this->buffer->write(StringUtil::trimAsciiRight($value, true)); $this->buffer->writeChar(' '); return; } $minimumIndentation = min($minimumIndentation, $node->getName()->getSpan()->getStart()->getColumn()); $this->writeWithIndent($value, $minimumIndentation); } /** * Returns the indentation level of the least-indented non-empty line in * $text after the first. * * Returns `null` if $text contains no newlines, and -1 if it contains * newlines but no lines are indented. */ private function minimumIndentation(string $text): ?int { $scanner = new LineScanner($text); while (!$scanner->isDone() && $scanner->readChar() !== "\n") { } if ($scanner->isDone()) { return $scanner->peekChar(-1) === "\n" ? -1 : null; } $min = null; while (!$scanner->isDone()) { while (!$scanner->isDone()) { $next = $scanner->peekChar(); if ($next !== ' ' && $next !== "\t") { break; } $scanner->readChar(); } if ($scanner->isDone() || $scanner->scanChar("\n")) { continue; } $min = $min === null ? $scanner->getColumn() : min($min, $scanner->getColumn()); while (!$scanner->isDone() && $scanner->readChar() !== "\n") { } } return $min ?? -1; } /** * Writes $text to {@see buffer}, replacing $minimumIndentation with * {@see indentation} for each non-empty line after the first. * * Compresses trailing empty lines of $text into a single trailing space. */ private function writeWithIndent(string $text, int $minimumIndentation): void { $scanner = new LineScanner($text); while (!$scanner->isDone()) { $next = $scanner->readChar(); if ($next === "\n") { break; } $this->buffer->writeChar($next); } while (true) { assert(Character::isWhitespace($scanner->peekChar(-1))); // Scan forward until we hit non-whitespace or the end of [text]. $lineStart = $scanner->getPosition(); $newlines = 1; while (true) { // If we hit the end of $text, we still need to preserve the fact that // whitespace exists because it could matter for custom properties. if ($scanner->isDone()) { $this->buffer->writeChar(' '); return; } $next = $scanner->readChar(); if ($next === ' ' || $next === "\t") { continue; } if ($next !== "\n") { break; } $lineStart = $scanner->getPosition(); $newlines++; } $this->writeTimes("\n", $newlines); $this->writeIndentation(); $this->buffer->write($scanner->substring($lineStart + $minimumIndentation)); // Scan and write until we hit a newline or the end of $text. while (true) { if ($scanner->isDone()) { return; } $next = $scanner->readChar(); if ($next === "\n") { break; } $this->buffer->writeChar($next); } } } // ## Values public function visitBoolean(SassBoolean $value): void { $this->buffer->write($value->getValue() ? 'true' : 'false'); } public function visitCalculation(SassCalculation $value): void { $this->buffer->write($value->getName()); $this->buffer->writeChar('('); $isFirst = true; foreach ($value->getArguments() as $argument) { if ($isFirst) { $isFirst = false; } else { $this->buffer->write($this->getCommaSeparator()); } $this->writeCalculationValue($argument); } $this->buffer->writeChar(')'); } private function writeCalculationValue(object $value): void { if ($value instanceof SassNumber && $value->hasComplexUnits() && !$this->inspect) { throw new SassScriptException("$value isn't a valid CSS value."); } if ($value instanceof SassNumber && !is_finite($value->getValue())) { if (is_nan($value->getValue())) { $this->buffer->write('NaN'); } elseif ($value->getValue() > 0) { $this->buffer->write('infinity'); } else { $this->buffer->write('-infinity'); } $this->writeCalculationUnits($value->getNumeratorUnits(), $value->getDenominatorUnits()); } elseif ($value instanceof SassNumber && $value->hasComplexUnits()) { $this->writeNumber($value->getValue()); $firstUnit = $value->getNumeratorUnits()[0] ?? null; if ($firstUnit !== null) { $this->buffer->write($firstUnit); $this->writeCalculationUnits(array_slice($value->getNumeratorUnits(), 1), $value->getDenominatorUnits()); } else { $this->writeCalculationUnits([], $value->getDenominatorUnits()); } } elseif ($value instanceof Value) { $value->accept($this); } elseif ($value instanceof CalculationOperation) { $left = $value->getLeft(); $parenthesizeLeft = $left instanceof CalculationOperation && $left->getOperator()->getPrecedence() < $value->getOperator()->getPrecedence(); if ($parenthesizeLeft) { $this->buffer->writeChar('('); } $this->writeCalculationValue($left); if ($parenthesizeLeft) { $this->buffer->writeChar(')'); } $operatorWhitespace = !$this->compressed || $value->getOperator()->getPrecedence() === 1; if ($operatorWhitespace) { $this->buffer->writeChar(' '); } $this->buffer->write($value->getOperator()->getOperator()); if ($operatorWhitespace) { $this->buffer->writeChar(' '); } $right = $value->getRight(); $parenthesizeRight = ($right instanceof CalculationOperation && $this->parenthesizeCalculationRhs($value->getOperator(), $right->getOperator())) || ($value->getOperator() === CalculationOperator::DIVIDED_BY && $right instanceof SassNumber && (is_finite($right->getValue()) ? $right->hasComplexUnits() : $right->hasUnits())); if ($parenthesizeRight) { $this->buffer->writeChar('('); } $this->writeCalculationValue($right); if ($parenthesizeRight) { $this->buffer->writeChar(')'); } } } /** * Writes the complex numerator and denominator units beyond the first * numerator unit for a number as they appear in a calculation. * * @param list<string> $numeratorUnits * @param list<string> $denominatorUnits */ private function writeCalculationUnits(array $numeratorUnits, array $denominatorUnits): void { foreach ($numeratorUnits as $unit) { $this->writeOptionalSpace(); $this->buffer->writeChar('*'); $this->writeOptionalSpace(); $this->buffer->writeChar('1'); $this->buffer->write($unit); } foreach ($denominatorUnits as $unit) { $this->writeOptionalSpace(); $this->buffer->writeChar('/'); $this->writeOptionalSpace(); $this->buffer->writeChar('1'); $this->buffer->write($unit); } } /** * Returns whether the right-hand operation of a calculation should be * parenthesized. * * In `a ? (b # c)`, `outer` is `?` and `right` is `#`. */ private function parenthesizeCalculationRhs(CalculationOperator $outer, CalculationOperator $right): bool { if ($outer === CalculationOperator::DIVIDED_BY) { return true; } if ($outer === CalculationOperator::PLUS) { return false; } return $right === CalculationOperator::PLUS || $right === CalculationOperator::MINUS; } public function visitColor(SassColor $value): void { $name = Colors::RGBaToColorName($value->getRed(), $value->getGreen(), $value->getBlue(), $value->getAlpha()); // In compressed mode, emit colors in the shortest representation possible. if ($this->compressed) { if (!NumberUtil::fuzzyEquals($value->getAlpha(), 1)) { $this->writeRgb($value); } else { $canUseShortHex = $this->canUseShortHex($value); $hexLength = $canUseShortHex ? 4 : 7; if ($name !== null && \strlen($name) <= $hexLength) { $this->buffer->write($name); } elseif ($canUseShortHex) { $this->buffer->writeChar('#'); $this->buffer->writeChar(dechex($value->getRed() & 0xF)); $this->buffer->writeChar(dechex($value->getGreen() & 0xF)); $this->buffer->writeChar(dechex($value->getBlue() & 0xF)); } else { $this->buffer->writeChar('#'); $this->writeHexComponent($value->getRed()); $this->writeHexComponent($value->getGreen()); $this->writeHexComponent($value->getBlue()); } } return; } $format = $value->getFormat(); if ($format !== null) { if ($format === ColorFormatEnum::rgbFunction) { $this->writeRgb($value); } elseif ($format === ColorFormatEnum::hslFunction) { $this->writeHsl($value); } elseif ($format instanceof SpanColorFormat) { $this->buffer->write($format->getOriginal()); } else { // should not happen as our interface is sealed. \assert(false, 'unknown format'); } } elseif ( $name !== null && // Always emit generated transparent colors in rgba format. This works // around an IE bug. See https://github.com/sass/sass/issues/1782. !NumberUtil::fuzzyEquals($value->getAlpha(), 0) ) { $this->buffer->write($name); } elseif (NumberUtil::fuzzyEquals($value->getAlpha(), 1)) { $this->buffer->writeChar('#'); $this->writeHexComponent($value->getRed()); $this->writeHexComponent($value->getGreen()); $this->writeHexComponent($value->getBlue()); } else { $this->writeRgb($value); } } /** * Writes $value as an `rgb` or `rgba` function. */ private function writeRgb(SassColor $value): void { $opaque = NumberUtil::fuzzyEquals($value->getAlpha(), 1); $this->buffer->write($opaque ? 'rgb(' : 'rgba('); $this->buffer->write((string) $value->getRed()); $this->buffer->write($this->getCommaSeparator()); $this->buffer->write((string) $value->getGreen()); $this->buffer->write($this->getCommaSeparator()); $this->buffer->write((string) $value->getBlue()); if (!$opaque) { $this->buffer->write($this->getCommaSeparator()); $this->writeNumber($value->getAlpha()); } $this->buffer->writeChar(')'); } /** * Writes $value as an `hsl` or `hsla` function. */ private function writeHsl(SassColor $value): void { $opaque = NumberUtil::fuzzyEquals($value->getAlpha(), 1); $this->buffer->write($opaque ? 'hsl(' : 'hsla('); $this->writeNumber($value->getHue()); $this->buffer->write($this->getCommaSeparator()); $this->writeNumber($value->getSaturation()); $this->buffer->writeChar('%'); $this->buffer->write($this->getCommaSeparator()); $this->writeNumber($value->getLightness()); $this->buffer->writeChar('%'); if (!$opaque) { $this->buffer->write($this->getCommaSeparator()); $this->writeNumber($value->getAlpha()); } $this->buffer->writeChar(')'); } /** * Returns whether $color's hex pair representation is symmetrical (e.g. `FF`). */ private function isSymmetricalHex(int $color): bool { return ($color & 0xF) === $color >> 4; } /** * Returns whether $color can be represented as a short hexadecimal color * (e.g. `#fff`). */ private function canUseShortHex(SassColor $color): bool { return $this->isSymmetricalHex($color->getRed()) && $this->isSymmetricalHex($color->getGreen()) && $this->isSymmetricalHex($color->getBlue()); } /** * Emits $color as a hex character pair. */ private function writeHexComponent(int $color): void { $this->buffer->write(str_pad(dechex($color), 2, '0', STR_PAD_LEFT)); } public function visitFunction(SassFunction $value): void { if (!$this->inspect) { throw new SassScriptException("$value isn't a valid CSS value."); } $this->buffer->write('get-function('); $this->visitQuotedString($value->getCallable()->getName()); $this->buffer->writeChar(')'); } public function visitMixin(SassMixin $value): void { if (!$this->inspect) { throw new SassScriptException("$value isn't a valid CSS value."); } $this->buffer->write('get-mixin('); $this->visitQuotedString($value->getCallable()->getName()); $this->buffer->writeChar(')'); } public function visitList(SassList $value): void { if ($value->hasBrackets()) { $this->buffer->writeChar('['); } elseif (\count($value->asList()) === 0) { if (!$this->inspect) { throw new SassScriptException("() isn't a valid CSS value."); } $this->buffer->write('()'); return; } $singleton = $this->inspect && \count($value->asList()) === 1 && ($value->getSeparator() === ListSeparator::COMMA || $value->getSeparator() === ListSeparator::SLASH); if ($singleton && !$value->hasBrackets()) { $this->buffer->writeChar('('); } $separator = $this->separatorString($value->getSeparator()); $isFirst = true; foreach ($value->asList() as $element) { if (!$this->inspect && $element->isBlank()) { continue; } if ($isFirst) { $isFirst = false; } else { $this->buffer->write($separator); } $needsParens = $this->inspect && self::elementNeedsParens($value->getSeparator(), $element); if ($needsParens) { $this->buffer->writeChar('('); } $element->accept($this); if ($needsParens) { $this->buffer->writeChar(')'); } } if ($singleton) { \assert($value->getSeparator()->getSeparator() !== null, 'The list separator is not undecided at that point.'); $this->buffer->write($value->getSeparator()->getSeparator()); if (!$value->hasBrackets()) { $this->buffer->writeChar(')'); } } if ($value->hasBrackets()) { $this->buffer->writeChar(']'); } } private function separatorString(ListSeparator $separator): string { return match ($separator) { ListSeparator::COMMA => $this->getCommaSeparator(), ListSeparator::SLASH => $this->compressed ? '/' : ' / ', ListSeparator::SPACE => ' ', /** * This should never be used, but it may still be returned since * {@see separatorString} is invoked eagerly by {@see writeList} even for lists * with only one element. */ default => '', }; } /** * Returns whether the value needs parentheses as an element in a list with the given separator. */ private static function elementNeedsParens(ListSeparator $separator, Value $value): bool { if (!$value instanceof SassList) { return false; } if (count($value->asList()) < 2) { return false; } if ($value->hasBrackets()) { return false; } return match ($separator) { ListSeparator::COMMA => $value->getSeparator() === ListSeparator::COMMA, ListSeparator::SLASH => $value->getSeparator() === ListSeparator::COMMA || $value->getSeparator() === ListSeparator::SLASH, default => $value->getSeparator() !== ListSeparator::UNDECIDED, }; } public function visitMap(SassMap $value): void { if (!$this->inspect) { throw new SassScriptException("$value isn't a valid CSS value."); } $this->buffer->writeChar('('); $isFirst = true; foreach ($value->getContents() as $key => $element) { if ($isFirst) { $isFirst = false; } else { $this->buffer->write(', '); } $this->writeMapElement($key); $this->buffer->write(': '); $this->writeMapElement($element); } $this->buffer->writeChar(')'); } private function writeMapElement(Value $value): void { $needsParens = $value instanceof SassList && ListSeparator::COMMA === $value->getSeparator() && !$value->hasBrackets(); if ($needsParens) { $this->buffer->writeChar('('); } $value->accept($this); if ($needsParens) { $this->buffer->writeChar(')'); } } public function visitNull(): void { if ($this->inspect) { $this->buffer->write('null'); } } public function visitNumber(SassNumber $value): void { $asSlash = $value->getAsSlash(); if ($asSlash !== null) { $this->visitNumber($asSlash[0]); $this->buffer->writeChar('/'); $this->visitNumber($asSlash[1]); return; } if (!is_finite($value->getValue())) { $this->visitCalculation(SassCalculation::unsimplified('calc', [$value])); return; } if ($value->hasComplexUnits()) { if (!$this->inspect) { throw new SassScriptException("$value isn't a valid CSS value."); } $this->visitCalculation(SassCalculation::unsimplified('calc', [$value])); } else { $this->writeNumber($value->getValue()); if (\count($value->getNumeratorUnits()) > 0) { $this->buffer->write($value->getNumeratorUnits()[0]); } } } /** * Writes $number without exponent notation and with at most * {@see SassNumber::PRECISION} digits after the decimal point. */ private function writeNumber(float $number): void { if (is_nan($number)) { $this->buffer->write('NaN'); return; } if ($number === INF) { $this->buffer->write('Infinity'); return; } if ($number === -INF) { $this->buffer->write('-Infinity'); return; } $int = NumberUtil::fuzzyAsInt($number); if ($int !== null) { $this->buffer->write((string) $int); return; } $text = $this->removeExponent((string) $number); // Any double that's less than `SassNumber.precision + 2` digits long is // guaranteed to be safe to emit directly, since it'll contain at most `0.` // followed by [SassNumber.precision] digits. $canWriteDirectly = \strlen($text) < SassNumber::PRECISION + 2; if ($canWriteDirectly) { if ($this->compressed && $text[0] === '0') { $text = substr($text, 1); } $this->buffer->write($text); return; } $this->writeRounded($text); } /** * If $text is written in exponent notation, returns a string representation * of it without exponent notation. * * Otherwise, returns $text as-is. */ private function removeExponent(string $text): string { $exponentDelimiterPosition = strpos($text, 'E'); if ($exponentDelimiterPosition === false) { return $text; } $negative = $text[0] === '-'; $buffer = $text[0]; // If the number has more than one significant digit, the second // character will be a decimal point that we don't want to include in // the generated number. if ($negative) { $buffer .= $text[1]; if ($exponentDelimiterPosition > 3) { $buffer .= substr($text, 3, $exponentDelimiterPosition - 3); } } elseif ($exponentDelimiterPosition > 2) { $buffer .= substr($text, 2, $exponentDelimiterPosition - 2); } $exponent = intval(substr($text, $exponentDelimiterPosition + 1)); if ($exponent > 0) { // Write an additional zero for each exponent digits other than those // already written to the buffer. We subtract 1 from `buffer.length` // because the first digit doesn't count towards the exponent. Subtract 1 // more for negative numbers because of the `-` written to the buffer. $additionalZeroes = $exponent - (\strlen($buffer) - 1 - ($negative ? 1 : 0)); $buffer .= str_repeat('0', $additionalZeroes); return $buffer; } $result = ''; if ($negative) { $result .= '-'; } $result .= '0.'; for ($i = -1; $i > $exponent; --$i) { $result .= '0'; } $result .= $negative ? substr($buffer, 1) : $buffer; return $result; } /** * Assuming $text is a number written without exponent notation, rounds it * to {@see SassNumber::PRECISION} digits after the decimal and writes the result * to {@see $buffer}. */ private function writeRounded(string $text): void { \assert(preg_match('/^-?\d+(\.\d+)?$/D', $text) === 1, "\"$text\" should be a number written without exponent notation."); // We need to ensure that we write at most [SassNumber.precision] digits // after the decimal point, and that we round appropriately if necessary. To // do this, we maintain an intermediate buffer of digits (both before and // after the decimal point), which we then write to [_buffer] as text. We // start writing after the first digit to give us room to round up to a // higher decimal place than was represented in the original number. $digits = array_fill(0, \strlen($text) + 1, 0); $digitsIndex = 1; // Write the digits before the decimal to $digits. $textIndex = 0; $negative = $text[0] === '-'; if ($negative) { $textIndex++; } while (true) { if ($textIndex === \strlen($text)) { // If we get here, $text has no decimal point. It definitely doesn't // need to be rounded; we can write it as-is. $this->buffer->write($text); return; } $codeUnit = $text[$textIndex++]; if ($codeUnit === '.') { break; } $digits[$digitsIndex++] = intval($codeUnit); } $firstFractionalDigit = $digitsIndex; // Only write at most PRECISION digits after the decimal. If there aren't // that many digits left in the number, write it as-is since no rounding or // truncation is needed. $indexAfterPrecision = $textIndex + SassNumber::PRECISION; if ($indexAfterPrecision >= \strlen($text)) { $this->buffer->write($text); return; } // Write the digits after the decimal to $digits. while ($textIndex < $indexAfterPrecision) { $digits[$digitsIndex++] = intval($text[$textIndex++]); } // Round the trailing digits in $digits up if necessary. if (intval($text[$textIndex]) >= 5) { while (true) { // $digitsIndex is guaranteed to be >0 here because we added a leading // 0 to $digits when we constructed it, so even if we round everything // up $newDigit will always be 1 when $digitsIndex is 1. $newDigit = ++$digits[$digitsIndex - 1]; if ($newDigit !== 10) { break; } $digitsIndex--; } } // At most one of the following loops will actually execute. If we rounded // digits up before the decimal point, the first loop will set those digits // to 0 (rather than 10, which is not a valid decimal digit). On the other // hand, if we have trailing zeros left after the decimal point, the second // loop will move $digitsIndex before them and cause them not to be // written. Either way, $digitsIndex will end up >= $firstFractionalDigit. for (; $digitsIndex < $firstFractionalDigit; $digitsIndex++) { $digits[$digitsIndex] = 0; } while ($digitsIndex > $firstFractionalDigit && $digits[$digitsIndex - 1] === 0) { $digitsIndex--; } // Omit the minus sign if the number ended up being rounded to exactly zero, // write "0" explicit to avoid adding a minus sign or omitting the number // entirely in compressed mode. if ($digitsIndex === 2 && $digits[0] === 0 && $digits[1] == 0) { $this->buffer->writeChar('0'); return; } if ($negative) { $this->buffer->writeChar('-'); } // Write the digits before the decimal point to $buffer. Omit the leading // 0 that's added to $digits to accommodate rounding, and in compressed // mode omit the 0 before the decimal point as well. $writtenIndex = 0; if ($digits[0] === 0) { $writtenIndex++; if ($this->compressed && $digits[1] === 0) { $writtenIndex++; } } for (; $writtenIndex < $firstFractionalDigit; $writtenIndex++) { $this->buffer->writeChar((string) $digits[$writtenIndex]); } if ($digitsIndex > $firstFractionalDigit) { $this->buffer->writeChar('.'); for (; $writtenIndex < $digitsIndex; $writtenIndex++) { $this->buffer->writeChar((string) $digits[$writtenIndex]); } } } public function visitString(SassString $value): void { if ($this->quote && $value->hasQuotes()) { $this->visitQuotedString($value->getText()); } else { $this->visitUnquotedString($value->getText()); } } private function visitQuotedString(string $string): void { $includesDoubleQuote = str_contains($string, '"'); $includesSingleQuote = str_contains($string, '\''); $forceDoubleQuotes = $includesSingleQuote && $includesDoubleQuote; $quote = $forceDoubleQuotes || !$includesDoubleQuote ? '"' : "'"; $this->buffer->writeChar($quote); $length = \strlen($string); for ($i = 0; $i < $length; $i++) { $char = $string[$i]; switch ($char) { case "'": $this->buffer->writeChar("'"); // such string is always rendered double-quoted break; case '"': if ($forceDoubleQuotes) { $this->buffer->writeChar('\\'); } $this->buffer->writeChar('"'); break; case "\0": case "\x1": case "\x2": case "\x3": case "\x4": case "\x5": case "\x6": case "\x7": case "\x8": case "\xA": case "\xB": case "\xC": case "\xD": case "\xE": case "\xF": case "\x10": case "\x11": case "\x12": case "\x13": case "\x14": case "\x15": case "\x16": case "\x17": case "\x18": case "\x19": case "\x1A": case "\x1B": case "\x1C": case "\x1D": case "\x1E": case "\x1F": case "\x7F": $this->writeEscape($this->buffer, $char, $string, $i); break; case '\\': $this->buffer->writeChar('\\'); $this->buffer->writeChar('\\'); break; default: $newIndex = $this->tryPrivateUseCharacter($this->buffer, $char, $string, $i); if ($newIndex !== null) { $i = $newIndex; break; } $this->buffer->writeChar($char); break; } } $this->buffer->writeChar($quote); } private function visitUnquotedString(string $string): void { $afterNewline = false; $length = \strlen($string); for ($i = 0; $i < $length; ++$i) { $char = $string[$i]; switch ($char) { case "\n": $this->buffer->writeChar(' '); $afterNewline = true; break; case ' ': if (!$afterNewline) { $this->buffer->writeChar(' '); } break; default: $afterNewline = false; $newIndex = $this->tryPrivateUseCharacter($this->buffer, $char, $string, $i); if ($newIndex !== null) { $i = $newIndex; break; } $this->buffer->writeChar($char); break; } } } /** * If $char is the beginning of a private-use character and Sass isn't * emitting compressed CSS, writes that character as an escape to $buffer. * * The $string is the string from which $char was read, and $i is the * index it was read from. If this successfully writes the character, returns * the index of the *last* byte that was consumed for it. Otherwise, * returns `null`. * * In expanded mode, we print all characters in Private Use Areas as escape * codes since there's no useful way to render them directly. These * characters are often used for glyph fonts, where it's useful for readers * to be able to distinguish between them in the rendered stylesheet. */ private function tryPrivateUseCharacter(SourceMapBuffer $buffer, string $char, string $string, int $i): ?int { if ($this->compressed) { return null; } $firstByteCode = \ord($char); if ($firstByteCode >= 0xF0) { $extraBytes = 3; // 4-bytes chars } elseif ($firstByteCode >= 0xE0) { $extraBytes = 2; // 3-bytes chars } elseif ($firstByteCode >= 0xC2) { $extraBytes = 1; // 2-bytes chars } elseif ($firstByteCode >= 0x80 && $firstByteCode <= 0x8F) { return null; // Continuation of a UTF-8 char started in a previous byte } else { $extraBytes = 0; } if (\strlen($string) <= $i + $extraBytes) { return null; // Invalid UTF-8 chars } if ($extraBytes) { $fullChar = substr($string, $i, $extraBytes + 1); $charCode = mb_ord($fullChar, 'UTF-8'); } else { $fullChar = $char; $charCode = $firstByteCode; } if ( $charCode >= 0xE000 && $charCode <= 0xF8FF || // PUA of the BMP $charCode >= 0xF0000 && $charCode <= 0x10FFFF // Supplementary PUAs of the planes 15 and 16 ) { $this->writeEscape($buffer, $fullChar, $string, $i + $extraBytes); return $i + $extraBytes; } return null; } /** * Writes $character as a hexadecimal escape sequence to $buffer. * * The $string is the string from which the escape is being written, and $i * is the index of the last byte of $character in that string. These * are used to write a trailing space after the escape if necessary to * disambiguate it from the next character. */ private function writeEscape(SourceMapBuffer $buffer, string $character, string $string, int $i): void { $buffer->writeChar('\\'); $buffer->write(dechex(mb_ord($character, 'UTF-8'))); if (\strlen($string) === $i + 1) { return; } $next = $string[$i + 1]; if ($next === ' ' || $next === "\t" || Character::isHex($next)) { $buffer->writeChar(' '); } } // ## Selectors public function visitAttributeSelector(AttributeSelector $attribute): void { $this->buffer->writeChar('['); $this->buffer->write($attribute->getName()); $value = $attribute->getValue(); if ($value !== null) { assert($attribute->getOp() !== null); $this->buffer->write($attribute->getOp()->getText()); // Emit identifiers that start with `--` with quotes, because IE11 // doesn't consider them to be valid identifiers. if (Parser::isIdentifier($value) && !str_starts_with($value, '--')) { $this->buffer->write($value); if ($attribute->getModifier() !== null) { $this->buffer->writeChar(' '); } } else { $this->visitQuotedString($value); if ($attribute->getModifier() !== null) { $this->writeOptionalSpace(); } } if ($attribute->getModifier() !== null) { $this->buffer->write($attribute->getModifier()); } } $this->buffer->writeChar(']'); } public function visitClassSelector(ClassSelector $klass): void { $this->buffer->writeChar('.'); $this->buffer->write($klass->getName()); } public function visitComplexSelector(ComplexSelector $complex): void { $this->writeCombinators($complex->getLeadingCombinators()); if (\count($complex->getLeadingCombinators()) !== 0 && \count($complex->getComponents()) !== 0) { $this->writeOptionalSpace(); } foreach ($complex->getComponents() as $i => $component) { $this->visitCompoundSelector($component->getSelector()); if (\count($component->getCombinators()) !== 0) { $this->writeOptionalSpace(); } $this->writeCombinators($component->getCombinators()); if ($i !== \count($complex->getComponents()) - 1 && (!$this->compressed || \count($component->getCombinators()) === 0)) { $this->buffer->writeChar(' '); } } } /** * Writes $combinators to {@see buffer}, with spaces in between in expanded * mode. * * @param list<CssValue<Combinator>> $combinators */ private function writeCombinators(array $combinators): void { $this->writeBetween($combinators, $this->compressed ? '' : ' ', function ($text) { $this->buffer->write($text); }); } public function visitCompoundSelector(CompoundSelector $compound): void { $start = $this->buffer->getLength(); foreach ($compound->getComponents() as $simple) { $simple->accept($this); } // If we emit an empty compound, it's because all of the components got // optimized out because they match all selectors, so we just emit the // universal selector. if ($this->buffer->getLength() === $start) { $this->buffer->writeChar('*'); } } public function visitIDSelector(IDSelector $id): void { $this->buffer->writeChar('#'); $this->buffer->write($id->getName()); } public function visitSelectorList(SelectorList $list): void { $first = true; foreach ($list->getComponents() as $complex) { if (!$this->inspect && $complex->isInvisible()) { continue; } if ($first) { $first = false; } else { $this->buffer->writeChar(','); if ($complex->getLineBreak()) { $this->writeLineFeed(); $this->writeIndentation(); } else { $this->writeOptionalSpace(); } } $this->visitComplexSelector($complex); } } public function visitParentSelector(ParentSelector $parent): void { $this->buffer->writeChar('&'); if ($parent->getSuffix() !== null) { $this->buffer->write($parent->getSuffix()); } } public function visitPlaceholderSelector(PlaceholderSelector $placeholder): void { $this->buffer->writeChar('%'); $this->buffer->write($placeholder->getName()); } public function visitPseudoSelector(PseudoSelector $pseudo): void { $innerSelector = $pseudo->getSelector(); // `:not(%a)` is semantically identical to `*`. if ($innerSelector !== null && $pseudo->getName() === 'not' && $innerSelector->isInvisible()) { return; } $this->buffer->writeChar(':'); if ($pseudo->isSyntacticElement()) { $this->buffer->writeChar(':'); } $this->buffer->write($pseudo->getName()); if ($pseudo->getArgument() === null && $pseudo->getSelector() === null) { return; } $this->buffer->writeChar('('); if ($pseudo->getArgument() !== null) { $this->buffer->write($pseudo->getArgument()); if ($pseudo->getSelector() !== null) { $this->buffer->writeChar(' '); } } if ($innerSelector !== null) { $this->visitSelectorList($innerSelector); } $this->buffer->writeChar(')'); } public function visitTypeSelector(TypeSelector $type): void { $this->buffer->write($type->getName()); } public function visitUniversalSelector(UniversalSelector $universal): void { if ($universal->getNamespace() !== null) { $this->buffer->write($universal->getNamespace()); $this->buffer->writeChar('|'); } $this->buffer->writeChar('*'); } // ## Utilities /** * Runs $callback and associates all text written within it with the span of $node * * @template T * * @param callable(): T $callback * * @return T * * @param-immediately-invoked-callable $callback */ private function for(AstNode $node, callable $callback) { return $this->buffer->forSpan($node->getSpan(), $callback); } /** * @param CssValue<string> $value */ private function write(CssValue $value): void { $this->for($value, function () use ($value) { $this->buffer->write($value->getValue()); }); } /** * Emits `$parent->getChildren()` in a block */ private function visitChildren(CssParentNode $parent): void { $this->buffer->writeChar('{'); $prePrevious = null; $previous = null; foreach ($parent->getChildren() as $child) { if ($this->isInvisible($child)) { continue; } if ($previous !== null && $this->requiresSemicolon($previous)) { $this->buffer->writeChar(';'); } if ($this->isTrailingComment($child, $previous ?? $parent)) { $this->writeOptionalSpace(); $this->withoutIndentation(function () use ($child) { $child->accept($this); }); } else { $this->writeLineFeed(); $this->indent(function () use ($child) { $child->accept($this); }); } $prePrevious = $previous; $previous = $child; } if ($previous !== null) { if ($this->requiresSemicolon($previous) && !$this->compressed) { $this->buffer->writeChar(';'); } if ($prePrevious === null && $this->isTrailingComment($previous, $parent)) { $this->writeOptionalSpace(); } else { $this->writeLineFeed(); $this->writeIndentation(); } } $this->buffer->writeChar('}'); } /** * Whether $node requires a semicolon to be written after it. */ private function requiresSemicolon(CssNode $node): bool { if ($node instanceof CssParentNode) { return $node->isChildless(); } return !$node instanceof CssComment; } private function isTrailingComment(CssNode $node, CssNode $previous): bool { // Short-circuit in compressed mode to avoid expensive span shenanigans // (shespanigans?), since we're compressing all whitespace anyway. if ($this->compressed) { return false; } if (!$node instanceof CssComment) { return false; } if ($node->getSpan()->getSourceUrl() !== $previous->getSpan()->getSourceUrl()) { return false; } if (!SpanUtil::contains($previous->getSpan(), $node->getSpan())) { return $node->getSpan()->getStart()->getLine() === $previous->getSpan()->getEnd()->getLine(); } // Walk back from just before the current node starts looking for the // parent's left brace (to open the child block). This is safer than a // simple forward search of the previous.span.text as that might contain // other left braces. $searchFrom = $node->getSpan()->getStart()->getOffset() - $previous->getSpan()->getStart()->getOffset() - 1; // Imports can cause a node to be "contained" by another node when they are // actually the same node twice in a row. if ($searchFrom < 0) { return false; } $previousSpanText = $previous->getSpan()->getText(); $endOffset = strrpos($previousSpanText, '{', $searchFrom - \strlen($previousSpanText)); if ($endOffset === false) { $endOffset = 0; } $span = $previous->getSpan()->getFile()->span($previous->getSpan()->getStart()->getOffset(), $previous->getSpan()->getStart()->getOffset() + $endOffset); return $node->getSpan()->getStart()->getLine() === $span->getEnd()->getLine(); } /** * Writes a line feed, unless this emitting compressed CSS. */ private function writeLineFeed(): void { if (!$this->compressed) { $this->buffer->writeChar("\n"); } } private function writeOptionalSpace(): void { if (!$this->compressed) { $this->buffer->writeChar(' '); } } private function writeIndentation(): void { if (!$this->compressed) { $this->writeTimes(' ', $this->indentation * 2); } } /** * Writes $char to {@see buffer} with $times repetitions. */ private function writeTimes(string $char, int $times): void { for ($i = 0; $i < $times; $i++) { $this->buffer->writeChar($char); } } /** * Calls $callback to write each value in $iterable, and writes $text * between each one. * * @template T * * @param iterable<T> $iterable * @param callable(T): void $callback * * @param-immediately-invoked-callable $callback */ private function writeBetween(iterable $iterable, string $text, callable $callback): void { $first = true; foreach ($iterable as $value) { if ($first) { $first = false; } else { $this->buffer->write($text); } $callback($value); } } /** * Returns a comma used to separate values in lists. */ private function getCommaSeparator(): string { return $this->compressed ? ',' : ', '; } /** * Runs $callback with indentation increased one level. * * @param callable(): void $callback * * @param-immediately-invoked-callable $callback */ private function indent(callable $callback): void { $this->indentation++; $callback(); $this->indentation--; } /** * Runs $callback without any indentation. * * @param callable(): void $callback * * @param-immediately-invoked-callable $callback */ private function withoutIndentation(callable $callback): void { $savedIndentation = $this->indentation; $this->indentation = 0; $callback(); $this->indentation = $savedIndentation; } /** * Returns whether $node is invisible. */ private function isInvisible(CssNode $node): bool { return !$this->inspect && ($this->compressed ? $node->isInvisibleHidingComments() : $node->isInvisible()); } } PKBA#]�+�GGVsystem/helixultimate/vendor/scssphp/scssphp/src/Serializer/TrackingSourceMapBuffer.phpnu�[���<?php /** * SCSSPHP * * @copyright 2018-2020 Anthon Pang * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Serializer; use ScssPhp\ScssPhp\SourceMap\Builder\Entry; use ScssPhp\ScssPhp\SourceMap\SingleMapping; use ScssPhp\ScssPhp\Util\ListUtil; use SourceSpan\FileLocation; use SourceSpan\FileSpan; use SourceSpan\SimpleSourceLocation; use SourceSpan\SourceLocation; use SourceSpan\SourceSpan; /** * A {@see SourceMapBuffer} that builds a source map. * * @internal */ final class TrackingSourceMapBuffer implements SourceMapBuffer { private readonly StringBuffer $buffer; /** * @var list<Entry> */ private array $entries = []; /** * The index of the current line in {@see $buffer}. */ private int $line = 0; /** * The index of the current column in {@see $buffer}. */ private int $column = 0; /** * Whether the text currently being written should be encompassed by a * {@see SourceSpan}. */ private bool $inSpan = false; public function __construct() { $this->buffer = new SimpleStringBuffer(); } public function getLength(): int { return $this->buffer->getLength(); } /** * The current location in {@see $buffer}. */ private function getTargetLocation(): SourceLocation { return new SimpleSourceLocation($this->buffer->getLength(), line: $this->line, column: $this->column); } public function forSpan(FileSpan $span, callable $callback) { $wasInSpan = $this->inSpan; $this->inSpan = true; $this->addEntry($span->getStart(), $this->getTargetLocation()); try { return $callback(); } finally { // We could map $span->getEnd() to $this->getTargetLocation() here, but in practice // browsers don't care about where a span ends as long as it covers at // least the entity that they're looking up. Avoiding end mappings halves // the size of the source maps we generate. $this->inSpan = $wasInSpan; } } /** * Adds an entry to {@see $entries} unless it's redundant with the last entry. */ private function addEntry(FileLocation $source, SourceLocation $target): void { if ($this->entries !== []) { $entry = ListUtil::last($this->entries); // Browsers don't care about the position of a value within a line, so // it's redundant to have two entries on the same target line that both // point to the same source line, even if they point to different // columns in that line. if ($entry->source->getLine() === $source->getLine() && $entry->target->getLine() === $target->getLine()) { return; } // Since source maps are only used to look up the source from the target // and not vice versa, we don't need multiple mappings to the same target. if ($entry->target->getOffset() === $target->getOffset()) { return; } } $this->entries[] = new Entry($source, $target); } public function write(string $string): void { $this->buffer->write($string); for ($i = 0; $i < \strlen($string); ++$i) { if ($string[$i] === "\n") { $this->writeLine(); } else { $this->column++; } } } public function writeChar(string $char): void { $this->buffer->writeChar($char); if ($char === "\n") { $this->writeLine(); } else { $this->column++; } } /** * Records that a line has been passed. * * If we're in the middle of a source span, indicate that at the beginning of * the new line. This is necessary because source maps consider each line * separately. */ private function writeLine(): void { $lastEntry = ListUtil::last($this->entries); // Trim useless entries. if ($lastEntry->target->getLine() === $this->line && $lastEntry->target->getColumn() === $this->column) { array_pop($this->entries); } $this->line++; $this->column = 0; if ($this->inSpan) { $this->entries[] = new Entry($lastEntry->source, $this->getTargetLocation()); } } public function __toString(): string { return (string) $this->buffer; } public function buildSourceMap(?string $prefix): SingleMapping { if ($prefix === null || $prefix === '') { return SingleMapping::fromEntries($this->entries); } $prefixLength = \strlen($prefix); $prefixLines = 0; $prefixColumn = 0; for ($i = 0; $i < \strlen($prefix); ++$i) { if ($prefix[$i] === "\n") { $prefixLines++; $prefixColumn = 0; } else { $prefixColumn++; } } return SingleMapping::fromEntries(array_map(fn (Entry $entry) => new Entry( $entry->source, new SimpleSourceLocation( $entry->target->getOffset() + $prefixLength, line: $entry->target->getLine() + $prefixLines, // Only adjust the column for entries that are on the same line as // the last chunk of the prefix. column: $entry->target->getColumn() + ($entry->target->getLine() === 0 ? $prefixColumn : 0) ) ), $this->entries)); } } PKBA#]USȳDDNsystem/helixultimate/vendor/scssphp/scssphp/src/Serializer/SourceMapBuffer.phpnu�[���<?php /** * SCSSPHP * * @copyright 2018-2020 Anthon Pang * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Serializer; use ScssPhp\ScssPhp\SourceMap\SingleMapping; use SourceSpan\FileSpan; /** * @internal */ interface SourceMapBuffer extends StringBuffer { /** * Runs $callback and associates all text written within it with $span. * * Specifically, this associates the point at the beginning of the written * text with {@see FileSpan::getStart()} and the point at the end of the * written text with {@see FileSpan::getEnd()}. * * @template T * @param callable(): T $callback * @return T */ public function forSpan(FileSpan $span, callable $callback); /** * Returns the source map for the file being written. * * If $prefix is passed, all the entries in the source map will be moved * forward by the number of characters and lines in $prefix. */ public function buildSourceMap(?string $prefix): SingleMapping; } PKBA#]0|�22Ksystem/helixultimate/vendor/scssphp/scssphp/src/Serializer/StringBuffer.phpnu�[���<?php /** * SCSSPHP * * @copyright 2018-2020 Anthon Pang * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Serializer; /** * @internal */ interface StringBuffer extends \Stringable { /** * Returns the length of the content that has been accumulated so far. */ public function getLength(): int; public function write(string $string): void; /** * Writes a single char to the buffer. */ public function writeChar(string $char): void; } PKBA#]���?system/helixultimate/vendor/scssphp/scssphp/src/Deprecation.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; /** * A deprecated feature in the language. * * Code consuming this enum outside Scssphp must not rely on exhaustiveness checks. New values will be added * in this enum in minor versions of the package without considering that as a BC break. */ enum Deprecation: string { /** * Deprecation for passing a string directly to meta.call(). */ case callString = 'call-string'; /** * Deprecation for @elseif. */ case elseif = 'elseif'; /** * Deprecation for @-moz-document. */ case mozDocument = 'moz-document'; /** * Deprecation for declaring new variables with !global. */ case newGlobal = 'new-global'; /** * Deprecation for / operator for division. */ case slashDiv = 'slash-div'; /** * Deprecation for leading, trailing, and repeated combinators. */ case bogusCombinators = 'bogus-combinators'; /** * Deprecation for ambiguous + and - operators. */ case strictUnary = 'strict-unary'; /** * Deprecation for passing invalid units to built-in functions. */ case functionUnits = 'function-units'; /** * Deprecation for using !default or !global multiple times for one variable. */ case duplicateVarFlags = 'duplicate-var-flags'; /** * Deprecation for passing percentages to the Sass abs() function. */ case absPercent = 'abs-percent'; /** * Deprecation for function and mixin names beginning with --. */ case cssFunctionMixin = 'css-function-mixin'; /** * Deprecation for declarations after or between nested rules. */ case mixedDecls = 'mixed-decls'; /** * Deprecation for meta.feature-exists. */ case featureExists = 'feature-exists'; /** * Used for deprecations coming from user-authored code. */ case userAuthored = 'user-authored'; public function getDescription(): ?string { return match ($this) { self::callString => 'Passing a string directly to meta.call().', self::elseif => '@elseif.', self::mozDocument => '@-moz-document.', self::newGlobal => 'Declaring new variables with !global.', self::slashDiv => '/ operator for division.', self::bogusCombinators => 'Leading, trailing, and repeated combinators.', self::strictUnary => 'Ambiguous + and - operators.', self::functionUnits => 'Passing invalid units to built-in functions.', self::duplicateVarFlags => 'Using !default or !global multiple times for one variable.', self::absPercent => 'Passing percentages to the Sass abs() function.', self::cssFunctionMixin => 'Function and mixin names beginning with --.', self::mixedDecls => 'Declarations after or between nested rules.', self::featureExists => 'meta.feature-exists', self::userAuthored => null, }; } /** * The version in which this feature was first deprecated. */ public function getDeprecatedIn(): ?string { return match ($this) { self::callString => '1.2.0', self::elseif => '2.0.0', self::mozDocument => '2.0.0', self::newGlobal => '2.0.0', self::slashDiv => null, self::bogusCombinators => '2.0.0', self::strictUnary => '2.0.0', self::functionUnits => '2.0.0', self::duplicateVarFlags => '2.0.0', self::absPercent => '2.0.0', self::cssFunctionMixin => '2.0.0', self::mixedDecls => '2.0.0', self::featureExists => '2.0.0', self::userAuthored => null, }; } /** * The version this feature was fully removed in, making the * deprecation obsolete. * * For deprecations that are not yet obsolete, this should be null. */ public function getObsoleteIn(): ?string { return null; // For now, no deprecation is obsolete } public function isFuture(): bool { if ($this === self::userAuthored) { return false; } return $this->getDeprecatedIn() === null; } public function getStatus(): DeprecationStatus { if ($this === self::userAuthored) { return DeprecationStatus::user; } if ($this->isFuture()) { return DeprecationStatus::future; } if ($this->getObsoleteIn() !== null) { return DeprecationStatus::obsolete; } return DeprecationStatus::active; } } PKBA#]�P���Esystem/helixultimate/vendor/scssphp/scssphp/src/DeprecationStatus.phpnu�[���<?php namespace ScssPhp\ScssPhp; enum DeprecationStatus { case active; case user; case future; case obsolete; } PKBA#]�~�Cgg>system/helixultimate/vendor/scssphp/scssphp/src/Base/Range.phpnu�[���<?php /** * SCSSPHP * * @copyright 2015-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Base; /** * Range * * @author Anthon Pang <anthon.pang@gmail.com> * * @internal */ class Range { /** * @var float|int */ public $first; /** * @var float|int */ public $last; /** * Initialize range * * @param int|float $first * @param int|float $last */ public function __construct($first, $last) { $this->first = $first; $this->last = $last; } /** * Test for inclusion in range * * @param int|float $value * * @return bool */ public function includes($value) { return $value >= $this->first && $value <= $this->last; } } PKBA#] xV��:system/helixultimate/vendor/scssphp/scssphp/src/Syntax.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; enum Syntax { /** * The CSS-superset SCSS syntax. */ case SCSS; /** * The whitespace-sensitive indented syntax. */ case SASS; /** * The plain CSS syntax, which disallows special Sass features. */ case CSS; public static function forPath(string $path): self { if (str_ends_with($path, '.sass')) { return self::SASS; } if (str_ends_with($path, '.css')) { return self::CSS; } return self::SCSS; } } PKBA#]�����Esystem/helixultimate/vendor/scssphp/scssphp/src/CompilationResult.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; final class CompilationResult { private string $css; private ?string $sourceMap; /** * @var list<string> */ private array $includedFiles; /** * @param list<string> $includedFiles */ public function __construct(string $css, ?string $sourceMap, array $includedFiles) { $this->css = $css; $this->sourceMap = $sourceMap; $this->includedFiles = $includedFiles; } public function getCss(): string { return $this->css; } /** * @return list<string> */ public function getIncludedFiles(): array { return $this->includedFiles; } /** * The sourceMap content, if it was generated */ public function getSourceMap(): ?string { return $this->sourceMap; } } PKBA#]W�T& & Hsystem/helixultimate/vendor/scssphp/scssphp/src/SourceSpan/MultiSpan.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\SourceSpan; use League\Uri\Contracts\UriInterface; use SourceSpan\FileLocation; use SourceSpan\FileSpan; use SourceSpan\SourceFile; use SourceSpan\SourceSpan; /** * A FileSpan wrapper that with secondary spans attached, so that * {@see MultiSpan::message} can forward to {@see SourceSpan::messageMultiple}. * * This is used to transparently support multi-span messages in situations that * need to be backwards-compatible with single spans, such as logger * invocations. To match the `source_span` package, separate APIs should * generally be preferred over this class wherever backwards compatibility * isn't a concern. * * @internal */ final class MultiSpan implements FileSpan { /** * @param array<string, SourceSpan> $secondarySpans */ public function __construct( private readonly FileSpan $primary, private readonly string $primaryLabel, private readonly array $secondarySpans, ) { } public function getStart(): FileLocation { return $this->primary->getStart(); } public function getEnd(): FileLocation { return $this->primary->getEnd(); } public function getText(): string { return $this->primary->getText(); } public function getContext(): string { return $this->primary->getContext(); } public function getFile(): SourceFile { return $this->primary->getFile(); } public function getLength(): int { return $this->primary->getLength(); } public function getSourceUrl(): ?UriInterface { return $this->primary->getSourceUrl(); } public function compareTo(SourceSpan $other): int { return $this->primary->compareTo($other); } public function expand(FileSpan $other): FileSpan { return $this->withPrimary($this->primary->expand($other)); } public function union(SourceSpan $other): SourceSpan { return $this->primary->union($other); } public function subspan(int $start, ?int $end = null): FileSpan { return $this->withPrimary($this->primary->subspan($start, $end)); } public function highlight(): string { return $this->primary->highlightMultiple($this->primaryLabel, $this->secondarySpans); } public function message(string $message): string { return $this->primary->messageMultiple($message, $this->primaryLabel, $this->secondarySpans); } public function highlightMultiple(string $label, array $secondarySpans): string { return $this->primary->highlightMultiple($label, array_merge($this->secondarySpans, $secondarySpans)); } public function messageMultiple(string $message, string $label, array $secondarySpans): string { return $this->primary->messageMultiple($message, $label, array_merge($this->secondarySpans, $secondarySpans)); } /** * Returns a copy of $this with $newPrimary as its primary span. */ private function withPrimary(FileSpan $newPrimary): MultiSpan { return new MultiSpan($newPrimary, $this->primaryLabel, $this->secondarySpans); } } PKBA#]G��""Ksystem/helixultimate/vendor/scssphp/scssphp/src/SourceSpan/LazyFileSpan.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\SourceSpan; use League\Uri\Contracts\UriInterface; use SourceSpan\FileLocation; use SourceSpan\FileSpan; use SourceSpan\SourceFile; use SourceSpan\SourceSpan; /** * A wrapper for {@see FileSpan} that allows an expensive creation process to be * deferred until the span is actually needed. * * @internal */ class LazyFileSpan implements FileSpan { /** * @var \Closure(): FileSpan * @readonly */ private readonly \Closure $builder; /** * @var FileSpan|null */ private ?FileSpan $span = null; /** * @param \Closure(): FileSpan $builder */ public function __construct(\Closure $builder) { $this->builder = $builder; } public function getSpan(): FileSpan { if ($this->span === null) { $this->span = ($this->builder)(); } return $this->span; } public function getFile(): SourceFile { return $this->getSpan()->getFile(); } public function getSourceUrl(): ?UriInterface { return $this->getSpan()->getSourceUrl(); } public function getLength(): int { return $this->getSpan()->getLength(); } public function getStart(): FileLocation { return $this->getSpan()->getStart(); } public function getEnd(): FileLocation { return $this->getSpan()->getEnd(); } public function getText(): string { return $this->getSpan()->getText(); } public function union(SourceSpan $other): SourceSpan { return $this->getSpan()->union($other); } public function compareTo(SourceSpan $other): int { return $this->getSpan()->compareTo($other); } public function expand(FileSpan $other): FileSpan { return $this->getSpan()->expand($other); } public function message(string $message): string { return $this->getSpan()->message($message); } public function messageMultiple(string $message, string $label, array $secondarySpans): string { return $this->getSpan()->messageMultiple($message, $label, $secondarySpans); } public function highlight(): string { return $this->getSpan()->highlight(); } public function highlightMultiple(string $label, array $secondarySpans): string { return $this->getSpan()->highlightMultiple($label, $secondarySpans); } public function subspan(int $start, ?int $end = null): FileSpan { return $this->getSpan()->subspan($start, $end); } public function getContext(): string { return $this->getSpan()->getContext(); } } PKBA#]ְĕttIsystem/helixultimate/vendor/scssphp/scssphp/src/Importer/NoOpImporter.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Importer; use League\Uri\Contracts\UriInterface; /** * An importer that never imports any stylesheets. * * This is used for stylesheets which don't support relative imports, such as * those created from PHP code with plain strings. */ final class NoOpImporter extends Importer { public function canonicalize(UriInterface $url): ?UriInterface { return null; } public function load(UriInterface $url): ?ImporterResult { return null; } public function couldCanonicalize(UriInterface $url, UriInterface $canonicalUrl): bool { return false; } public function __toString(): string { return '(unknown)'; } } PKBA#]�lڀ�Esystem/helixultimate/vendor/scssphp/scssphp/src/Importer/Importer.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Importer; use League\Uri\Contracts\UriInterface; /** * A base class for importers that resolves URLs in `@import`s to the contents * of Sass files. * * Importers should implement {@see __toString} to provide a human-readable description * of the importer. For example, the default filesystem importer returns its * load path. */ abstract class Importer implements \Stringable { /** * If $url is recognized by this importer, returns its canonical format. * * Note that canonical URLs *must* be absolute, including a scheme. Returning * `file:` URLs is encouraged if the imported stylesheet comes from a file on * disk. * * If Sass has already loaded a stylesheet with the returned canonical URL, * it re-uses the existing parse tree. This means that importers **must * ensure** that the same canonical URL always refers to the same stylesheet, * *even across different importers*. * * This may return `null` if $url isn't recognized by this importer. * * If this importer's URL format supports file extensions, it should * canonicalize them the same way as the default filesystem importer: * * * The importer should look for stylesheets by adding the prefix `_` to the * URL's basename, and by adding the extensions `.sass` and `.scss` if the * URL doesn't already have one of those extensions. For example, if the * URL was `foo/bar/baz`, the importer would look for: * * `foo/bar/baz.sass` * * `foo/bar/baz.scss` * * `foo/bar/_baz.sass` * * `foo/bar/_baz.scss` * * If the URL was `foo/bar/baz.scss`, the importer would just look for: * * `foo/bar/baz.scss` * * `foo/bar/_baz.scss` * * If the importer finds a stylesheet at more than one of these URLs, it * should throw an exception indicating that the import is ambiguous. Note * that if the extension is explicitly specified, a stylesheet with the * opposite extension may exist. * * * If none of the possible paths is valid, the importer should perform the * same resolution on the URL followed by `/index`. In the example above, * it would look for: * * `foo/bar/baz/_index.sass` * * `foo/bar/baz/index.sass` * * `foo/bar/baz/_index.scss` * * `foo/bar/baz/index.scss` * * As above, if the importer finds a stylesheet at more than one of these * URLs, it should throw an exception indicating that the import is * ambiguous. * * If no stylesheets are found, the importer should return `null`. * * Calling {@see canonicalize} multiple times with the same URL must return the * same result. Calling {@see canonicalize} with a URL returned by {@see canonicalize} * must return that URL. Calling {@see canonicalize} with a URL relative to one * returned by {@see canonicalize} must return a meaningful result. */ abstract public function canonicalize(UriInterface $url): ?UriInterface; /** * Loads the Sass text for the given $url, or returns `null` if * this importer can't find the stylesheet it refers to. * * The $url comes from a call to {@see canonicalize} for this importer. * * When Sass encounters an `@import` rule in a stylesheet, it first calls * {@see canonicalize} and {@see load} on the importer that first loaded that * stylesheet with the imported URL resolved relative to the stylesheet's * original URL. If either of those returns `null`, it then calls * {@see canonicalize} and {@see load} on each importer in order with the URL as it * appears in the `@import` rule. * * If the importer finds a stylesheet at $url but it fails to load for some * reason, or if $url is uniquely associated with this importer but doesn't * refer to a real stylesheet, the importer may throw an exception that will * be wrapped by Sass. */ abstract public function load(UriInterface $url): ?ImporterResult; /** * Without accessing the filesystem, returns whether passing $url to * {@see canonicalize} could possibly return $canonicalUrl. * * This is expected to be very efficient, and subclasses are allowed to * return false positives if it would be inefficient to determine whether * $url would actually resolve to $canonicalUrl. Subclasses are not allowed * to return false negatives. */ public function couldCanonicalize(UriInterface $url, UriInterface $canonicalUrl): bool { return true; } /** * Returns whether the given URL scheme (without `:`) should be considered * "non-canonical" for this importer. * * An importer may not return a URL with a non-canonical scheme from * {@see canonicalize}. In exchange, {@see getContainingUrl} is available within * {@see canonicalize} for absolute URLs with non-canonical schemes so that the * importer can resolve those URLs differently based on where they're loaded. * * This must always return the same value for the same $scheme. It is * expected to be very efficient. */ public function isNonCanonicalScheme(string $scheme): bool { return false; } /** * Whether the current {@see canonicalize} invocation comes from an `@import` * rule. * * When evaluating `@import` rules, URLs should canonicalize to an * [import-only file] if one exists for the URL being canonicalized. * Otherwise, canonicalization should be identical for `@import` and `@use` * rules. * * [import-only file]: https://sass-lang.com/documentation/at-rules/import#import-only-files * * Subclasses should only access this from within calls to {@see canonicalize}. * Outside of that context, its value is undefined and subject to change. */ final protected function isFromImport(): bool { return ImportContext::isFromImport(); } /** * The canonical URL of the stylesheet that caused the current {@see canonicalize} * invocation. * * This is only set when the containing stylesheet has a canonical URL, and * when the URL being canonicalized is either relative or has a scheme for * which {@see isNonCanonicalScheme} returns `true`. This restriction ensures that * canonical URLs are always interpreted the same way regardless of their * context. * * Subclasses should only access this from within calls to {@see canonicalize}. * Outside of that context, its value is undefined and subject to change. */ final protected function getContainingUrl(): ?UriInterface { return ImportContext::getCanonicalizeContext()->getContainingUrl(); } } PKBA#]�SP^Nsystem/helixultimate/vendor/scssphp/scssphp/src/Importer/SpecialCacheValue.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Importer; /** * @internal */ enum SpecialCacheValue { case null; } PKBA#]�)n~~Ksystem/helixultimate/vendor/scssphp/scssphp/src/Importer/ImporterResult.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Importer; use League\Uri\Contracts\UriInterface; use League\Uri\Uri; use ScssPhp\ScssPhp\Syntax; final class ImporterResult { private readonly string $contents; private readonly ?UriInterface $sourceMapUrl; private readonly Syntax $syntax; public function __construct(string $contents, Syntax $syntax, ?UriInterface $sourceMapUrl = null) { $this->contents = $contents; $this->syntax = $syntax; $this->sourceMapUrl = $sourceMapUrl; } public function getContents(): string { return $this->contents; } /** * An absolute, browser-accessible URL indicating the resolved location of * the imported stylesheet. * * This should be a `file:` URL if one is available, but an `http:` URL is * acceptable as well. If no URL is supplied, a `data:` URL is generated * automatically from {@see contents}. */ public function getSourceMapUrl(): UriInterface { return $this->sourceMapUrl ?? Uri::fromData($this->contents, '', 'charset=utf-8'); } /** * The syntax to use to parse the stylesheet. */ public function getSyntax(): Syntax { return $this->syntax; } } PKBA#]����,�,Hsystem/helixultimate/vendor/scssphp/scssphp/src/Importer/ImportCache.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Importer; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Ast\Sass\Statement\Stylesheet; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Logger\QuietLogger; use ScssPhp\ScssPhp\Util\UriUtil; /** * An in-memory cache of parsed stylesheets that have been imported by Sass. * * @internal */ final class ImportCache { /** * @var list<Importer> */ private readonly array $importers; private readonly LoggerInterface $logger; /** * The canonicalized URLs for each non-canonical URL. * * The `forImport` in each key is true when this canonicalization is for an * `@import` rule. Otherwise, it's for a `@use` or `@forward` rule. * * This cache covers loads that go through the entire chain of {@see $importers}, * but it doesn't cover individual loads or loads in which any importer * accesses `containingUrl`. See also {@see $perImporterCanonicalizeCache}. * * @var array<string, array<0|1, CanonicalizeResult|SpecialCacheValue>> */ private array $canonicalizeCache = []; /** * Like {@see $canonicalizeCache} but also includes the specific importer in the * key. * * This is used to cache both relative imports from the base importer and * individual importer results in the case where some other component of the * importer chain isn't cacheable. * * @var \SplObjectStorage<Importer, array<string, array<0|1, CanonicalizeResult|SpecialCacheValue>>> */ private \SplObjectStorage $perImporterCanonicalizeCache; /** * The parsed stylesheets for each canonicalized import URL. * * @var array<string, Stylesheet|SpecialCacheValue> */ private array $importCache = []; /** * The import results for each canonicalized import URL. * * @var array<string, ImporterResult> */ private array $resultsCache = []; /** * @param list<Importer> $importers */ public function __construct(array $importers, LoggerInterface $logger) { $this->importers = $importers; $this->logger = $logger; $this->perImporterCanonicalizeCache = new \SplObjectStorage(); } public function canonicalize(UriInterface $url, ?Importer $baseImporter = null, ?UriInterface $baseUrl = null, bool $forImport = false): ?CanonicalizeResult { $urlCacheKey = (string) $url; $forImportCacheKey = (int) $forImport; if ($baseImporter !== null && $url->getScheme() === null) { $resolvedUrl = self::resolveUri($baseUrl, $url); $resolvedUrlCacheKey = (string) $resolvedUrl; if (!isset($this->perImporterCanonicalizeCache[$baseImporter][$resolvedUrlCacheKey][$forImportCacheKey])) { [$result, $cacheable] = $this->doCanonicalize($baseImporter, $resolvedUrl, $baseUrl, $forImport); \assert($cacheable, 'Relative loads should always be cacheable because they never provide access to the containing URL.'); $importerCache = $this->perImporterCanonicalizeCache[$baseImporter] ?? []; $importerCache[$resolvedUrlCacheKey][$forImportCacheKey] = $result ?? SpecialCacheValue::null; $this->perImporterCanonicalizeCache[$baseImporter] = $importerCache; } $relativeResult = $this->perImporterCanonicalizeCache[$baseImporter][$resolvedUrlCacheKey][$forImportCacheKey]; if ($relativeResult !== SpecialCacheValue::null) { return $relativeResult; } } if (isset($this->canonicalizeCache[$urlCacheKey][$forImportCacheKey])) { $cacheResult = $this->canonicalizeCache[$urlCacheKey][$forImportCacheKey]; if ($cacheResult !== SpecialCacheValue::null) { return $cacheResult; } return null; } // Each individual call to a `canonicalize()` override may not be cacheable // (specifically, if it has access to `containingUrl` it's too // context-sensitive to usefully cache). We want to cache a given URL across // the _entire_ importer chain, so we use $cacheable to track whether _all_ // `canonicalize()` calls we've attempted are cacheable. Only if they are, do // we store the result in the cache. $cacheable = true; foreach ($this->importers as $i => $importer) { if (isset($this->perImporterCanonicalizeCache[$importer][$urlCacheKey][$forImportCacheKey])) { $result = $this->perImporterCanonicalizeCache[$importer][$urlCacheKey][$forImportCacheKey]; if ($result !== SpecialCacheValue::null) { return $result; } continue; } [$result, $importerCacheable] = $this->doCanonicalize($importer, $url, $baseUrl, $forImport); if ($result !== null && $importerCacheable && $cacheable) { $this->canonicalizeCache[$urlCacheKey][$forImportCacheKey] = $result; return $result; } if ($importerCacheable && !$cacheable) { $importerCache = $this->perImporterCanonicalizeCache[$importer] ?? []; $importerCache[$urlCacheKey][$forImportCacheKey] = $result ?? SpecialCacheValue::null; $this->perImporterCanonicalizeCache[$importer] = $importerCache; if ($result !== null) { return $result; } } if (!$importerCacheable) { if ($cacheable) { // If this is the first uncacheable result, add all previous results // to the per-importer cache so we don't have to re-run them for // future uses of this importer. for ($j = 0; $j < $i; ++$j) { $importerCache = $this->perImporterCanonicalizeCache[$this->importers[$j]] ?? []; $importerCache[$urlCacheKey][$forImportCacheKey] = SpecialCacheValue::null; $this->perImporterCanonicalizeCache[$this->importers[$j]] = $importerCache; } $cacheable = false; } if ($result !== null) { return $result; } } } if ($cacheable) { $this->canonicalizeCache[$urlCacheKey][$forImportCacheKey] = SpecialCacheValue::null; } return null; } private static function resolveUri(?UriInterface $baseUrl, UriInterface $url): UriInterface { if ($baseUrl === null) { return $url; } return UriUtil::resolveUri($baseUrl, $url); } /** * Calls {@see Importer::canonicalize} and prints a deprecation warning if it * returns a relative URL. * * This returns both the result of the call to `canonicalize()` and whether * that result is cacheable at all. * * @return array{CanonicalizeResult|null, bool} */ private function doCanonicalize(Importer $importer, UriInterface $url, ?UriInterface $baseUrl, bool $forImport): array { $passContainingUrl = $baseUrl !== null && ($url->getScheme() === null || $importer->isNonCanonicalScheme($url->getScheme())); $canonicalizeContext = new CanonicalizeContext($passContainingUrl ? $baseUrl : null, $forImport); $result = ImportContext::withCanonicalizeContext($canonicalizeContext, fn () => $importer->canonicalize($url)); $cacheable = !$passContainingUrl || !$canonicalizeContext->wasContainingUrlAccessed(); if ($result === null) { return [null, $cacheable]; } if ($result->getScheme() === null) { // dart-sass triggers a deprecation here. As we never supported the old behavior, we forbid it directly. throw new \UnexpectedValueException("Importer $importer canonicalized $url to $result but canonical URLs must be absolute."); } if ($importer->isNonCanonicalScheme($result->getScheme())) { throw new \UnexpectedValueException("Importer $importer canonicalized $url to $result, which uses a scheme declared as non-canonical."); } return [new CanonicalizeResult($importer, $result, $url), $cacheable]; } /** * Tries to load the canonicalized $canonicalUrl using $importer. * * If $importer can import $canonicalUrl, returns the imported {@see Stylesheet}. * Otherwise returns `null`. * * If passed, the $originalUrl represents the URL that was canonicalized * into $canonicalUrl. It's used to resolve a relative canonical URL, which * importers may return for legacy reasons. * * If $quiet is `true`, this will disable logging warnings when parsing the * newly imported stylesheet. * * Caches the result of the import and uses cached results if possible. */ public function importCanonical(Importer $importer, UriInterface $canonicalUrl, ?UriInterface $originalUrl = null, bool $quiet = false): ?Stylesheet { $result = $this->importCache[(string) $canonicalUrl] ??= $this->doImportCanonical($importer, $canonicalUrl, $originalUrl, $quiet) ?? SpecialCacheValue::null; if ($result !== SpecialCacheValue::null) { return $result; } return null; } private function doImportCanonical(Importer $importer, UriInterface $canonicalUrl, ?UriInterface $originalUrl = null, bool $quiet = false): ?Stylesheet { $result = $importer->load($canonicalUrl); if ($result === null) { return null; } $this->resultsCache[(string) $canonicalUrl] = $result; return Stylesheet::parse($result->getContents(), $result->getSyntax(), $quiet ? new QuietLogger() : $this->logger, self::resolveUri($originalUrl, $canonicalUrl)); } public function humanize(UriInterface $canonicalUrl): UriInterface { $shortestUrl = null; $shortestLength = \PHP_INT_MAX; foreach ($this->canonicalizeCache as $cacheValues) { foreach ($cacheValues as $cacheValue) { if ($cacheValue === SpecialCacheValue::null) { continue; } if ($cacheValue->canonicalUrl->toString() !== $canonicalUrl->toString()) { continue; } $originalUrlLength = \strlen($cacheValue->originalUrl->getPath()); if ($shortestUrl === null || $originalUrlLength < $shortestLength) { $shortestUrl = $cacheValue->originalUrl; $shortestLength = $originalUrlLength; } } } if ($shortestUrl !== null) { return UriUtil::resolve($shortestUrl, basename($canonicalUrl->getPath())); } return $canonicalUrl; } public function sourceMapUrl(UriInterface $canonicalUrl): UriInterface { return ($this->resultsCache[(string) $canonicalUrl] ?? null)?->getSourceMapUrl() ?? $canonicalUrl; } } PKBA#]ʛ\3 Osystem/helixultimate/vendor/scssphp/scssphp/src/Importer/FilesystemImporter.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Importer; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Syntax; use ScssPhp\ScssPhp\Util\Path; /** * An importer that loads files from a load path on the filesystem. */ final class FilesystemImporter extends Importer { /** * The path relative to which this importer looks for files. * * If this is `null`, this importer will _only_ load absolute `file:` URLs * and URLs relative to the current file. */ private readonly ?string $loadPath; public function __construct(?string $loadPath) { $this->loadPath = $loadPath !== null ? Path::absolute($loadPath) : null; } public function canonicalize(UriInterface $url): ?UriInterface { if ($url->getScheme() === 'file') { $resolved = ImportUtil::resolveImportPath(Path::fromUri($url)); } elseif ($url->getScheme() !== null) { return null; } elseif ($this->loadPath !== null) { $resolved = ImportUtil::resolveImportPath(Path::join($this->loadPath, Path::fromUri($url))); } else { return null; } if ($resolved === null) { return null; } return Path::toUri(Path::canonicalize($resolved)); } public function load(UriInterface $url): ?ImporterResult { $path = Path::fromUri($url); $content = file_get_contents($path); if ($content === false) { throw new \Exception("Could not read file $path"); } return new ImporterResult($content, Syntax::forPath($path), $url); } public function couldCanonicalize(UriInterface $url, UriInterface $canonicalUrl): bool { if ($url->getScheme() !== 'file' && $url->getScheme() !== null) { return false; } if ($canonicalUrl->getScheme() !== 'file') { return false; } $basename = basename((string) $url); $canonicalBasename = basename((string) $canonicalUrl); if (!str_starts_with($basename, '_') && str_starts_with($canonicalBasename, '_')) { $canonicalBasename = substr($canonicalBasename, 1); } return $basename === $canonicalBasename || $basename === Path::withoutExtension($canonicalBasename); } public function __toString(): string { return $this->loadPath ?? '<absolute file importer>'; } } PKBA#]�H����Ssystem/helixultimate/vendor/scssphp/scssphp/src/Importer/LegacyCallbackImporter.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Importer; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Util\Path; /** * @internal */ final class LegacyCallbackImporter extends Importer { private readonly \Closure $callback; private readonly Importer $filesystemImporter; /** * @param \Closure(string): (string|null) $callback */ public function __construct(\Closure $callback) { $this->callback = $callback; $this->filesystemImporter = new FilesystemImporter(null); } public function canonicalize(UriInterface $url): ?UriInterface { if ($url->getScheme() === 'file') { return $this->filesystemImporter->canonicalize($url); } $result = ($this->callback)((string) $url); if ($result === null) { return null; } $resultUrl = Path::toUri($result); return $this->filesystemImporter->canonicalize($resultUrl); } public function load(UriInterface $url): ?ImporterResult { return $this->filesystemImporter->load($url); } public function couldCanonicalize(UriInterface $url, UriInterface $canonicalUrl): bool { return $this->filesystemImporter->couldCanonicalize($url, $canonicalUrl); } public function __toString(): string { return 'LegacyCallbackImporter'; } } PKBA#]�D�ӧ�Jsystem/helixultimate/vendor/scssphp/scssphp/src/Importer/ImportContext.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Importer; /** * @internal */ final class ImportContext { private static ?CanonicalizeContext $context = null; /** * Whether the Sass compiler is currently evaluating an `@import` rule. * * When evaluating `@import` rules, URLs should canonicalize to an import-only * file if one exists for the URL being canonicalized. Otherwise, * canonicalization should be identical for `@import` and `@use` rules. It's * admittedly hacky to set this globally, but `@import` will eventually be * removed, at which point we can delete this and have one consistent behavior. */ public static function isFromImport(): bool { return self::$context?->isFromImport() ?? false; } /** * @template T * * @param callable(): T $callback * @return T * * @param-immediately-invoked-callable $callback */ public static function inImportRule(callable $callback) { if (self::$context !== null) { return self::$context->withFromImport(true, $callback); } return self::withCanonicalizeContext(new CanonicalizeContext(null, true), $callback); } public static function getCanonicalizeContext(): CanonicalizeContext { if (self::$context === null) { throw new \LogicException('canonicalizeContext may only be accessed within a call to canonicalize().'); } return self::$context; } /** * Runs $callback in the given context. * * @template T * * @param callable(): T $callback * @return T * * @param-immediately-invoked-callable $callback */ public static function withCanonicalizeContext(?CanonicalizeContext $canonicalizeContext, callable $callback) { $oldCanonicalizeContext = self::$context; self::$context = $canonicalizeContext; try { return $callback(); } finally { self::$context = $oldCanonicalizeContext; } } } PKBA#]@�)��Osystem/helixultimate/vendor/scssphp/scssphp/src/Importer/CanonicalizeResult.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Importer; use League\Uri\Contracts\UriInterface; /** * @internal */ final class CanonicalizeResult { public function __construct( public readonly Importer $importer, public readonly UriInterface $canonicalUrl, public readonly UriInterface $originalUrl, ) { } } PKBA#]- �a~~Psystem/helixultimate/vendor/scssphp/scssphp/src/Importer/CanonicalizeContext.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Importer; use League\Uri\Contracts\UriInterface; /** * @internal */ final class CanonicalizeContext { private readonly ?UriInterface $containingUrl; private bool $fromImport; private bool $containingUrlAccessed = false; public function __construct(?UriInterface $containingUrl, bool $fromImport) { $this->containingUrl = $containingUrl; $this->fromImport = $fromImport; } /** * Whether the Sass compiler is currently evaluating an `@import` rule. */ public function isFromImport(): bool { return $this->fromImport; } /** * @template T * * @param callable(): T $callback * @return T * * @param-immediately-invoked-callable $callback */ public function withFromImport(bool $fromImport, callable $callback) { $oldFromImport = $this->fromImport; $this->fromImport = $fromImport; try { return $callback(); } finally { $this->fromImport = $oldFromImport; } } public function getContainingUrl(): ?UriInterface { $this->containingUrlAccessed = true; return $this->containingUrl; } /** * Whether {@see getContainingUrl} has been accessed. * * This is used to determine whether canonicalize result is cacheable. */ public function wasContainingUrlAccessed(): bool { return $this->containingUrlAccessed; } } PKBA#]��wooGsystem/helixultimate/vendor/scssphp/scssphp/src/Importer/ImportUtil.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Importer; use ScssPhp\ScssPhp\Util\Path; /** * @internal */ final class ImportUtil { /** * Resolves an imported path using the same logic as the filesystem importer. * * This tries to fill in extensions and partial prefixes and check for a * directory default. If no file can be found, it returns `null`. */ public static function resolveImportPath(string $path): ?string { $extension = Path::extension($path); if ($extension === '.sass' || $extension === '.scss' || $extension === '.css') { return self::ifInImport(fn () => self::exactlyOne(self::tryPath(Path::withoutExtension($path) . '.import' . $extension))) ?? self::exactlyOne(self::tryPath($path)); } return self::ifInImport(fn () => self::exactlyOne(self::tryPathWithExtensions($path . '.import'))) ?? self::exactlyOne(self::tryPathWithExtensions($path)) ?? self::tryPathAsDirectory($path); } /** * Like {@see tryPath}, but checks `.sass`, `.scss`, and `.css` extensions. * * @return list<string> */ private static function tryPathWithExtensions(string $path): array { $result = array_merge( self::tryPath($path . '.sass'), self::tryPath($path . '.scss'), ); if ($result !== []) { return $result; } return self::tryPath($path . '.css'); } /** * Returns the $path and/or the partial with the same name, if either or both * exists. * * If neither exists, returns an empty list. * * @return list<string> */ private static function tryPath(string $path): array { $partial = Path::join(dirname($path), '_' . basename($path)); $candidates = []; if (is_file($partial)) { $candidates[] = $partial; } if (is_file($path)) { $candidates[] = $path; } return $candidates; } /** * Returns the resolved index file for $path if $path is a directory and the * index file exists. * * Otherwise, returns `null`. */ private static function tryPathAsDirectory(string $path): ?string { if (!is_dir($path)) { return null; } return self::ifInImport(fn () => self::exactlyOne(self::tryPathWithExtensions(Path::join($path, 'index.import')))) ?? self::exactlyOne(self::tryPathWithExtensions(Path::join($path, 'index'))); } /** * @param list<string> $paths */ private static function exactlyOne(array $paths): ?string { if (\count($paths) === 0) { return null; } if (\count($paths) === 1) { return $paths[0]; } $formattedPrettyPaths = []; foreach ($paths as $path) { $formattedPrettyPaths[] = ' ' . Path::prettyUri($path); } throw new \Exception("It's not clear which file to import. Found:\n" . implode("\n", $formattedPrettyPaths)); } /** * If {@see ImportContext::isFromImport} is `true`, invokes callback and returns the result. * * Otherwise, returns `null`. * * @template T * * @param callable(): T $callback * @return T|null */ private static function ifInImport(callable $callback) { if (ImportContext::isFromImport()) { return $callback(); } return null; } } PKBA#]I��Csystem/helixultimate/vendor/scssphp/scssphp/src/Ast/FakeAstNode.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast; use SourceSpan\FileSpan; /** * An {@see AstNode} that just exposes a single span generated by a callback. * * @internal */ final class FakeAstNode implements AstNode { /** * @var \Closure(): FileSpan */ private readonly \Closure $callback; /** * @param callable(): FileSpan $callback */ public function __construct(callable $callback) { $this->callback = $callback(...); } public function getSpan(): FileSpan { return ($this->callback)(); } public function __toString(): string { return ''; } } PKCA#]:J:KKOsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/CallableInvocation.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass; /** * @internal */ interface CallableInvocation extends SassNode { public function getArguments(): ArgumentInvocation; } PKCA#]:����Lsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/SassDeclaration.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass; use SourceSpan\FileSpan; /** * A common interface for any node that declares a Sass member. * * @internal */ interface SassDeclaration extends SassNode { /** * The name of the declaration, with underscores converted to hyphens. * * This does not include the `$` for variables. */ public function getName(): string; /** * The span containing this declaration's name. * * This includes the `$` for variables. */ public function getNameSpan(): FileSpan; } PKCA#]�5��ggEsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Argument.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass; use ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Util\SpanUtil; use SourceSpan\FileSpan; /** * An argument declared as part of an {@see ArgumentDeclaration}. * * @internal */ final class Argument implements SassNode, SassDeclaration { private readonly string $name; private readonly ?Expression $defaultValue; private readonly FileSpan $span; public function __construct(string $name, FileSpan $span, ?Expression $defaultValue = null) { $this->name = $name; $this->defaultValue = $defaultValue; $this->span = $span; } public function getName(): string { return $this->name; } /** * The variable name as written in the document, without underscores * converted to hyphens and including the leading `$`. * * This isn't particularly efficient, and should only be used for error * messages. */ public function getOriginalName(): string { if ($this->defaultValue === null) { return $this->span->getText(); } return Util::declarationName($this->span); } public function getNameSpan(): FileSpan { if ($this->defaultValue === null) { return $this->span; } return SpanUtil::initialIdentifier($this->span, 1); } public function getDefaultValue(): ?Expression { return $this->defaultValue; } public function getSpan(): FileSpan { return $this->span; } public function __toString(): string { if ($this->defaultValue === null) { return $this->name; } return $this->name . ': ' . $this->defaultValue; } } PKCA#]l{e���Osystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/WarnRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A `@warn` rule. * * This prints a Sass value—usually a string—to warn the user of something. * * @internal */ final class WarnRule implements Statement { private readonly Expression $expression; private readonly FileSpan $span; public function __construct(Expression $expression, FileSpan $span) { $this->expression = $expression; $this->span = $span; } public function getExpression(): Expression { return $this->expression; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitWarnRule($this); } public function __toString(): string { return '@warn ' . $this->expression . ';'; } } PKCA#]���� � Rsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/IncludeRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\ArgumentInvocation; use ScssPhp\ScssPhp\Ast\Sass\CallableInvocation; use ScssPhp\ScssPhp\Ast\Sass\SassReference; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Util\SpanUtil; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A mixin invocation. * * @internal */ final class IncludeRule implements Statement, CallableInvocation, SassReference { private readonly ?string $namespace; private readonly string $name; private readonly string $originalName; private readonly ArgumentInvocation $arguments; private readonly ?ContentBlock $content; private readonly FileSpan $span; public function __construct(string $originalName, ArgumentInvocation $arguments, FileSpan $span, ?string $namespace = null, ?ContentBlock $content = null) { $this->originalName = $originalName; $this->name = str_replace('_', '-', $originalName); $this->arguments = $arguments; $this->span = $span; $this->namespace = $namespace; $this->content = $content; } public function getNamespace(): ?string { return $this->namespace; } public function getName(): string { return $this->name; } /** * The original name of the mixin being invoked, without underscores * converted to hyphens. */ public function getOriginalName(): string { return $this->originalName; } public function getArguments(): ArgumentInvocation { return $this->arguments; } public function getContent(): ?ContentBlock { return $this->content; } public function getSpan(): FileSpan { return $this->span; } public function getSpanWithoutContent(): FileSpan { if ($this->content === null) { return $this->span; } return SpanUtil::trim($this->span->getFile()->span($this->span->getStart()->getOffset(), $this->arguments->getSpan()->getEnd()->getOffset())); } public function getNameSpan(): FileSpan { $startSpan = $this->span->getText()[0] === '+' ? SpanUtil::trimLeft($this->span->subspan(1)) : SpanUtil::withoutInitialAtRule($this->span); if ($this->namespace !== null) { $startSpan = SpanUtil::withoutNamespace($startSpan); } return SpanUtil::initialIdentifier($startSpan); } public function getNamespaceSpan(): ?FileSpan { if ($this->namespace === null) { return null; } $startSpan = $this->span->getText()[0] === '+' ? SpanUtil::trimLeft($this->span->subspan(1)) : SpanUtil::withoutInitialAtRule($this->span); return SpanUtil::initialIdentifier($startSpan); } public function accept(StatementVisitor $visitor) { return $visitor->visitIncludeRule($this); } public function __toString(): string { $buffer = '@include '; if ($this->namespace !== null) { $buffer .= $this->namespace . '.'; } $buffer .= $this->name; if (!$this->arguments->isEmpty()) { $buffer .= "($this->arguments)"; } $buffer .= $this->content === null ? ';' : ' ' . $this->content; return $buffer; } } PKCA#]׃���Ssystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/IfRuleClause.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Import\DynamicImport; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Util\IterableUtil; /** * The superclass of `@if` and `@else` clauses. * * @internal */ abstract class IfRuleClause { /** * @var Statement[] */ private readonly array $children; private readonly bool $declarations; /** * @param Statement[] $children */ public function __construct(array $children) { $this->children = $children; $this->declarations = IterableUtil::any($children, function (Statement $child) { if ($child instanceof VariableDeclaration || $child instanceof FunctionRule || $child instanceof MixinRule) { return true; } if ($child instanceof ImportRule) { return IterableUtil::any($child->getImports(), fn ($import) => $import instanceof DynamicImport); } return false; }); } /** * @return Statement[] */ final public function getChildren(): array { return $this->children; } final public function hasDeclarations(): bool { return $this->declarations; } } PKCA#]F?O�wwRsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/ContentRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\ArgumentInvocation; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A `@content` rule. * * This is used in a mixin to include statement-level content passed by the * caller. * * @internal */ final class ContentRule implements Statement { /** * The arguments pass to this `@content` rule. * * This will be an empty invocation if `@content` has no arguments. */ private readonly ArgumentInvocation $arguments; private readonly FileSpan $span; public function __construct(ArgumentInvocation $arguments, FileSpan $span) { $this->arguments = $arguments; $this->span = $span; } public function getArguments(): ArgumentInvocation { return $this->arguments; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitContentRule($this); } public function __toString(): string { return $this->arguments->isEmpty() ? '@content;' : "@content($this->arguments);"; } } PKCA#]��B"..Ssystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/SupportsRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A `@supports` rule. * * @extends ParentStatement<Statement[]> * * @internal */ final class SupportsRule extends ParentStatement { private readonly SupportsCondition $condition; private readonly FileSpan $span; /** * @param Statement[] $children */ public function __construct(SupportsCondition $condition, array $children, FileSpan $span) { $this->condition = $condition; $this->span = $span; parent::__construct($children); } public function getCondition(): SupportsCondition { return $this->condition; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitSupportsRule($this); } public function __toString(): string { return '@supports ' . $this->condition . ' {' . implode(' ', $this->getChildren()) . '}'; } } PKCA#]G�5 Ssystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/FunctionRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\SassDeclaration; use ScssPhp\ScssPhp\Util\SpanUtil; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A function declaration. * * This declares a function that's invoked using normal CSS function syntax. * * @internal */ final class FunctionRule extends CallableDeclaration implements SassDeclaration { public function getNameSpan(): FileSpan { return SpanUtil::initialIdentifier(SpanUtil::withoutInitialAtRule($this->getSpan())); } public function accept(StatementVisitor $visitor) { return $visitor->visitFunctionRule($this); } public function __toString(): string { return '@function ' . $this->getName() . '(' . $this->getArguments() . ') {' . implode(' ', $this->getChildren()) . '}'; } } PKCA#]0W��eeZsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/CallableDeclaration.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\ArgumentDeclaration; use ScssPhp\ScssPhp\Ast\Sass\Statement; use SourceSpan\FileSpan; /** * An abstract class for callables (functions or mixins) that are declared in * user code. * * @extends ParentStatement<Statement[]> * * @internal */ abstract class CallableDeclaration extends ParentStatement { private readonly string $name; private readonly string $originalName; private readonly ArgumentDeclaration $arguments; private readonly ?SilentComment $comment; private readonly FileSpan $span; /** * @param Statement[] $children */ public function __construct(string $originalName, ArgumentDeclaration $arguments, FileSpan $span, array $children, ?SilentComment $comment = null) { $this->originalName = $originalName; $this->name = str_replace('_', '-', $originalName); $this->arguments = $arguments; $this->comment = $comment; $this->span = $span; parent::__construct($children); } /** * The name of this callable, with underscores converted to hyphens. */ final public function getName(): string { return $this->name; } /** * The callable's original name, without underscores converted to hyphens. */ public function getOriginalName(): string { return $this->originalName; } final public function getArguments(): ArgumentDeclaration { return $this->arguments; } final public function getComment(): ?SilentComment { return $this->comment; } final public function getSpan(): FileSpan { return $this->span; } } PKCA#]�z����Psystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/MixinRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\ArgumentDeclaration; use ScssPhp\ScssPhp\Ast\Sass\SassDeclaration; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Util\SpanUtil; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A mixin declaration. * * This declares a mixin that's invoked using `@include`. * * @internal */ final class MixinRule extends CallableDeclaration implements SassDeclaration { /** * Whether the mixin contains a `@content` rule. */ private ?bool $content = null; /** * @param Statement[] $children */ public function __construct(string $name, ArgumentDeclaration $arguments, FileSpan $span, array $children, ?SilentComment $comment = null) { parent::__construct($name, $arguments, $span, $children, $comment); } public function hasContent(): bool { if (!isset($this->content)) { $this->content = (new HasContentVisitor())->visitMixinRule($this) === true; } return $this->content; } public function getNameSpan(): FileSpan { $startSpan = $this->getSpan()->getText()[0] === '=' ? SpanUtil::trimLeft($this->getSpan()->subspan(1)) : SpanUtil::withoutInitialAtRule($this->getSpan()); return SpanUtil::initialIdentifier($startSpan); } public function accept(StatementVisitor $visitor) { return $visitor->visitMixinRule($this); } public function __toString(): string { $buffer = '@mixin ' . $this->getName(); if (!$this->getArguments()->isEmpty()) { $buffer .= "({$this->getArguments()})"; } $buffer .= ' {' . implode(' ', $this->getChildren()) . '}'; return $buffer; } } PKCA#]���ddPsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/WhileRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A `@while` rule. * * This repeatedly executes a block of code as long as a statement evaluates to * `true`. * * @extends ParentStatement<Statement[]> * * @internal */ final class WhileRule extends ParentStatement { private readonly Expression $condition; private readonly FileSpan $span; /** * @param Statement[] $children */ public function __construct(Expression $condition, array $children, FileSpan $span) { $this->condition = $condition; $this->span = $span; parent::__construct($children); } public function getCondition(): Expression { return $this->condition; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitWhileRule($this); } public function __toString(): string { return '@while ' . $this->condition . ' {' . implode(' ', $this->getChildren()) . '}'; } } PKCA#]$���Rsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/LoudComment.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A loud CSS-style comment. * * @internal */ final class LoudComment implements Statement { private readonly Interpolation $text; public function __construct(Interpolation $text) { $this->text = $text; } public function getText(): Interpolation { return $this->text; } public function getSpan(): FileSpan { return $this->text->getSpan(); } public function accept(StatementVisitor $visitor) { return $visitor->visitLoudComment($this); } public function __toString(): string { return (string) $this->text; } } PKCA#],����Psystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/StyleRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A style rule. * * This applies style declarations to elements that match a given selector. * * @extends ParentStatement<Statement[]> * * @internal */ final class StyleRule extends ParentStatement { private readonly Interpolation $selector; private readonly FileSpan $span; /** * @param Statement[] $children */ public function __construct(Interpolation $selector, array $children, FileSpan $span) { $this->selector = $selector; $this->span = $span; parent::__construct($children); } /** * The selector to which the declaration will be applied. * * This is only parsed after the interpolation has been resolved. */ public function getSelector(): Interpolation { return $this->selector; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitStyleRule($this); } public function __toString(): string { return $this->selector . ' {' . implode(' ', $this->getChildren()) . '}'; } } PKCA#]S:�п�Qsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/ElseClause.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; /** * An `@else` clause in an `@if` rule. * * @internal */ final class ElseClause extends IfRuleClause { public function __toString(): string { return '@else {' . implode(' ', $this->getChildren()) . '}'; } } PKCA#]�I@��Psystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/MediaRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A `@media` rule. * * @extends ParentStatement<Statement[]> * * @internal */ final class MediaRule extends ParentStatement { private readonly Interpolation $query; private readonly FileSpan $span; /** * @param Statement[] $children */ public function __construct(Interpolation $query, array $children, FileSpan $span) { $this->query = $query; $this->span = $span; parent::__construct($children); } /** * The query that determines on which platforms the styles will be in effect. * * This is only parsed after the interpolation has been resolved. */ public function getQuery(): Interpolation { return $this->query; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitMediaRule($this); } public function __toString(): string { return '@media ' . $this->query . ' {' . implode(' ', $this->getChildren()) . '}'; } } PKCA#]>�>�ttPsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/ErrorRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A `@error` rule. * * This emits an error and stops execution. * * @internal */ final class ErrorRule implements Statement { private readonly Expression $expression; private readonly FileSpan $span; public function __construct(Expression $expression, FileSpan $span) { $this->expression = $expression; $this->span = $span; } public function getExpression(): Expression { return $this->expression; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitErrorRule($this); } public function __toString(): string { return '@error ' . $this->expression . ';'; } } PKCA#]Әd���Msystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/AtRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * An unknown at-rule. * * @extends ParentStatement<Statement[]|null> * * @internal */ final class AtRule extends ParentStatement { private readonly Interpolation $name; private readonly ?Interpolation $value; private readonly FileSpan $span; /** * @param Statement[]|null $children */ public function __construct(Interpolation $name, FileSpan $span, ?Interpolation $value = null, ?array $children = null) { $this->name = $name; $this->value = $value; $this->span = $span; parent::__construct($children); } public function getName(): Interpolation { return $this->name; } public function getValue(): ?Interpolation { return $this->value; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitAtRule($this); } public function __toString(): string { $buffer = '@' . $this->name; if ($this->value !== null) { $buffer .= ' ' . $this->value; } $children = $this->getChildren(); if ($children === null) { return $buffer . ';'; } return $buffer . '{' . implode(' ', $children) . '}'; } } PKCA#]������Qsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/ReturnRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A `@return` rule. * * This exits from the current function body with a return value. * * @internal */ final class ReturnRule implements Statement { private readonly Expression $expression; private readonly FileSpan $span; public function __construct(Expression $expression, FileSpan $span) { $this->expression = $expression; $this->span = $span; } public function getExpression(): Expression { return $this->expression; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitReturnRule($this); } public function __toString(): string { return '@return ' . $this->expression . ';'; } } PKCA#]]����Tsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/SilentComment.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A silent Sass-style comment. * * @internal */ final class SilentComment implements Statement { private readonly string $text; private readonly FileSpan $span; public function __construct(string $text, FileSpan $span) { $this->text = $text; $this->span = $span; } public function getText(): string { return $this->text; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitSilentComment($this); } public function __toString(): string { return $this->text; } } PKCA#]��Vsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/ParentStatement.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Import\DynamicImport; use ScssPhp\ScssPhp\Ast\Sass\Statement; /** * A {@see Statement} that can have child statements. * * This has a generic parameter so that its subclasses can choose whether or * not their children lists are nullable. * * @template T * @psalm-template T of (Statement[]|null) * * @internal */ abstract class ParentStatement implements Statement { /** * @var T */ private readonly ?array $children; private readonly bool $declarations; /** * @param T $children */ public function __construct(?array $children) { $this->children = $children; if ($children === null) { $this->declarations = false; return; } foreach ($children as $child) { if ($child instanceof VariableDeclaration || $child instanceof FunctionRule || $child instanceof MixinRule) { $this->declarations = true; return; } if ($child instanceof ImportRule) { foreach ($child->getImports() as $import) { if ($import instanceof DynamicImport) { $this->declarations = true; return; } } } } $this->declarations = false; } /** * @return T */ final public function getChildren(): ?array { return $this->children; } final public function hasDeclarations(): bool { return $this->declarations; } } PKCA#]^*��||Psystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/DebugRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A `@debug` rule. * * This prints a Sass value for debugging purposes. * * @internal */ final class DebugRule implements Statement { private readonly Expression $expression; private readonly FileSpan $span; public function __construct(Expression $expression, FileSpan $span) { $this->expression = $expression; $this->span = $span; } public function getExpression(): Expression { return $this->expression; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitDebugRule($this); } public function __toString(): string { return '@debug ' . $this->expression . ';'; } } PKCA#]_���Osystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/EachRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * An `@each` rule. * * This iterates over values in a list or map. * * @extends ParentStatement<Statement[]> * * @internal */ final class EachRule extends ParentStatement { /** * @var list<string> */ private readonly array $variables; private readonly Expression $list; private readonly FileSpan $span; /** * @param list<string> $variables * @param Statement[] $children */ public function __construct(array $variables, Expression $list, array $children, FileSpan $span) { $this->variables = $variables; $this->list = $list; $this->span = $span; parent::__construct($children); } /** * @return list<string> */ public function getVariables(): array { return $this->variables; } public function getList(): Expression { return $this->list; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitEachRule($this); } public function __toString(): string { return '@each ' . implode(', ', array_map(fn($variable) => '$' . $variable, $this->variables)) . ' in ' . $this->list . ' {' . implode(' ', $this->getChildren()) . '}'; } } PKCA#]7��RRSsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/ContentBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\ArgumentDeclaration; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * An anonymous block of code that's invoked for a {@see ContentRule}. * * @internal */ final class ContentBlock extends CallableDeclaration { /** * @param Statement[] $children */ public function __construct(ArgumentDeclaration $arguments, array $children, FileSpan $span) { parent::__construct('@content', $arguments, $span, $children); } public function accept(StatementVisitor $visitor) { return $visitor->visitContentBlock($this); } public function __toString(): string { $buffer = $this->getArguments()->isEmpty() ? '' : ' using (' . $this->getArguments() . ')'; return $buffer . '{' . implode(' ', $this->getChildren()) . '}'; } } PKCA#]�&tZOsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/IfClause.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Statement; /** * An `@if` or `@else if` clause in an `@if` rule. * * @internal */ final class IfClause extends IfRuleClause { private readonly Expression $expression; /** * @param Statement[] $children */ public function __construct(Expression $expression, array $children) { $this->expression = $expression; parent::__construct($children); } public function getExpression(): Expression { return $this->expression; } } PKCA#]h0��UUXsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/HasContentVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementSearchVisitor; /** * A visitor for determining whether a {@see MixinRule} recursively contains a * {@see ContentRule}. * * @internal * * @extends StatementSearchVisitor<bool> */ final class HasContentVisitor extends StatementSearchVisitor { public function visitContentRule(ContentRule $node): bool { return true; } } PKCA#]�}W���Rsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/Declaration.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression\StringExpression; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A declaration (that is, a `name: value` pair). * * @extends ParentStatement<Statement[]|null> * * @internal */ final class Declaration extends ParentStatement { private readonly Interpolation $name; /** * The value of this declaration. * * If {@see getChildren} is `null`, this is never `null`. Otherwise, it may or may * not be `null`. */ private readonly ?Expression $value; private readonly FileSpan $span; /** * @param Statement[]|null $children */ private function __construct(Interpolation $name, ?Expression $value, FileSpan $span, ?array $children = null) { $this->name = $name; $this->value = $value; $this->span = $span; parent::__construct($children); } public static function create(Interpolation $name, Expression $value, FileSpan $span): self { return new self($name, $value, $span); } /** * @param Statement[] $children */ public static function nested(Interpolation $name, array $children, FileSpan $span, ?Expression $value = null): self { return new self($name, $value, $span, $children); } public function getName(): Interpolation { return $this->name; } public function getValue(): ?Expression { return $this->value; } /** * Returns whether this is a CSS Custom Property declaration. * * Note that this can return `false` for declarations that will ultimately be * serialized as custom properties if they aren't *parsed as* custom * properties, such as `#{--foo}: ...`. * * If this is `true`, then `value` will be a {@see StringExpression}. */ public function isCustomProperty(): bool { return str_starts_with($this->name->getInitialPlain(), '--'); } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitDeclaration($this); } public function __toString(): string { $buffer = $this->name . ':'; if ($this->value !== null) { if (!$this->isCustomProperty()) { $buffer .= ' '; } $buffer .= $this->value; } $children = $this->getChildren(); if ($children === null) { return $buffer . ';'; } return $buffer . '{' . implode(' ', $children) . '}'; } } PKCA#]���BBMsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/IfRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * An `@if` rule. * * This conditionally executes a block of code. * * @internal */ final class IfRule implements Statement { /** * @var list<IfClause> */ private readonly array $clauses; private readonly ?ElseClause $lastClause; private readonly FileSpan $span; /** * @param list<IfClause> $clauses */ public function __construct(array $clauses, FileSpan $span, ?ElseClause $lastClause = null) { $this->clauses = $clauses; $this->span = $span; $this->lastClause = $lastClause; } /** * The `@if` and `@else if` clauses. * * The first clause whose expression evaluates to `true` will have its * statements executed. If no expression evaluates to `true`, `lastClause` * will be executed if it's not `null`. * * @return list<IfClause> */ public function getClauses(): array { return $this->clauses; } /** * The final, unconditional `@else` clause. * * This is `null` if there is no unconditional `@else`. */ public function getLastClause(): ?ElseClause { return $this->lastClause; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitIfRule($this); } public function __toString(): string { $parts = []; foreach ($this->clauses as $index => $clause) { $parts[] = ($index === 0 ? '@if ' : '@else if ') . $clause->getExpression() . '{' . implode(' ', $clause->getChildren()) . '}'; } if ($this->lastClause !== null) { $parts[] = $this->lastClause; } return implode(' ', $parts); } } PKCA#]��l Qsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/ExtendRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * An `@extend` rule. * * This gives one selector all the styling of another. * * @internal */ final class ExtendRule implements Statement { private readonly Interpolation $selector; private readonly FileSpan $span; private readonly bool $optional; public function __construct(Interpolation $selector, FileSpan $span, bool $optional = false) { $this->selector = $selector; $this->span = $span; $this->optional = $optional; } public function getSelector(): Interpolation { return $this->selector; } /** * Whether this is an optional extension. * * If an extension isn't optional, it will emit an error if it doesn't match * any selectors. */ public function isOptional(): bool { return $this->optional; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitExtendRule($this); } public function __toString(): string { return '@extend ' . $this->selector . ($this->optional ? ' !optional' : '') . ';'; } } PKCA#]~� ??Qsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/Stylesheet.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Parser\CssParser; use ScssPhp\ScssPhp\Parser\SassParser; use ScssPhp\ScssPhp\Parser\ScssParser; use ScssPhp\ScssPhp\Syntax; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A Sass stylesheet. * * This is the root Sass node. It contains top-level statements. * * @extends ParentStatement<Statement[]> * * @internal */ final class Stylesheet extends ParentStatement { private readonly bool $plainCss; private readonly FileSpan $span; /** * @param Statement[] $children */ public function __construct(array $children, FileSpan $span, bool $plainCss = false) { $this->span = $span; $this->plainCss = $plainCss; parent::__construct($children); } public function isPlainCss(): bool { return $this->plainCss; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitStylesheet($this); } /** * @throws SassFormatException when parsing fails */ public static function parse(string $contents, Syntax $syntax, ?LoggerInterface $logger = null, ?UriInterface $sourceUrl = null): self { return match ($syntax) { Syntax::SASS => self::parseSass($contents, $logger, $sourceUrl), Syntax::SCSS => self::parseScss($contents, $logger, $sourceUrl), Syntax::CSS => self::parseCss($contents, $logger, $sourceUrl), }; } /** * @throws SassFormatException when parsing fails */ public static function parseSass(string $contents, ?LoggerInterface $logger = null, ?UriInterface $sourceUrl = null): self { return (new SassParser($contents, $logger, $sourceUrl))->parse(); } /** * @throws SassFormatException when parsing fails */ public static function parseScss(string $contents, ?LoggerInterface $logger = null, ?UriInterface $sourceUrl = null): self { return (new ScssParser($contents, $logger, $sourceUrl))->parse(); } /** * @throws SassFormatException when parsing fails */ public static function parseCss(string $contents, ?LoggerInterface $logger = null, ?UriInterface $sourceUrl = null): self { return (new CssParser($contents, $logger, $sourceUrl))->parse(); } public function __toString(): string { return implode(' ', $this->getChildren()); } } PKCA#]{5Q5��Qsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/ImportRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Import; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * An `@import` rule. * * @internal */ final class ImportRule implements Statement { /** * @var list<Import> */ private readonly array $imports; private readonly FileSpan $span; /** * @param list<Import> $imports */ public function __construct(array $imports, FileSpan $span) { $this->imports = $imports; $this->span = $span; } /** * @return list<Import> */ public function getImports(): array { return $this->imports; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitImportRule($this); } public function __toString(): string { return '@import ' . implode(', ', $this->imports) . ';'; } } PKCA#]AնQsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/AtRootRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A `@at-root` rule. * * This moves it contents "up" the tree through parent nodes. * * @extends ParentStatement<Statement[]> * * @internal */ final class AtRootRule extends ParentStatement { private readonly ?Interpolation $query; private readonly FileSpan $span; /** * @param Statement[] $children */ public function __construct(array $children, FileSpan $span, ?Interpolation $query = null) { $this->query = $query; $this->span = $span; parent::__construct($children); } /** * The query specifying which statements this should move its contents through. */ public function getQuery(): ?Interpolation { return $this->query; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitAtRootRule($this); } public function __toString(): string { $buffer = '@at-root '; if ($this->query !== null) { $buffer .= $this->query . ' '; } return $buffer . '{' . implode(' ', $this->getChildren()) . '}'; } } PKCA#]��PV��Nsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/ForRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A `@for` rule. * * This iterates a set number of times. * * @extends ParentStatement<Statement[]> * * @internal */ final class ForRule extends ParentStatement { private readonly string $variable; private readonly Expression $from; private readonly Expression $to; private readonly bool $exclusive; private readonly FileSpan $span; /** * @param Statement[] $children */ public function __construct(string $variable, Expression $from, Expression $to, array $children, FileSpan $span, bool $exclusive = false) { $this->variable = $variable; $this->from = $from; $this->to = $to; $this->exclusive = $exclusive; $this->span = $span; parent::__construct($children); } public function getVariable(): string { return $this->variable; } public function getFrom(): Expression { return $this->from; } public function getTo(): Expression { return $this->to; } /** * Whether {@see getTo} is exclusive. */ public function isExclusive(): bool { return $this->exclusive; } public function getSpan(): FileSpan { return $this->span; } public function accept(StatementVisitor $visitor) { return $visitor->visitForRule($this); } public function __toString(): string { return '@for $' . $this->variable . ' from ' . $this->from . ($this->exclusive ? ' to ' : ' through ') . $this->to . '{' . implode(' ', $this->getChildren()) . '}'; } } PKCA#] ]��E E Zsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement/VariableDeclaration.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\SassDeclaration; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Util\SpanUtil; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use SourceSpan\FileSpan; /** * A variable declaration. * * This defines or sets a variable. * * @internal */ final class VariableDeclaration implements Statement, SassDeclaration { private readonly ?string $namespace; private readonly string $name; private readonly ?SilentComment $comment; private readonly Expression $expression; private readonly bool $guarded; private readonly bool $global; private readonly FileSpan $span; public function __construct(string $name, Expression $expression, FileSpan $span, ?string $namespace = null, bool $guarded = false, bool $global = false, ?SilentComment $comment = null) { $this->name = $name; $this->expression = $expression; $this->span = $span; $this->namespace = $namespace; $this->guarded = $guarded; $this->global = $global; $this->comment = $comment; if ($namespace !== null && $global) { throw new \InvalidArgumentException("Other modules' members can't be defined with !global."); } } public function getNamespace(): ?string { return $this->namespace; } /** * The name of the variable, with underscores converted to hyphens. */ public function getName(): string { return $this->name; } /** * The variable name as written in the document, without underscores * converted to hyphens and including the leading `$`. * * This isn't particularly efficient, and should only be used for error * messages. */ public function getOriginalName(): string { return Util::declarationName($this->span); } public function getComment(): ?SilentComment { return $this->comment; } public function getExpression(): Expression { return $this->expression; } public function isGuarded(): bool { return $this->guarded; } public function isGlobal(): bool { return $this->global; } public function getSpan(): FileSpan { return $this->span; } public function getNameSpan(): FileSpan { $span = $this->span; if ($this->namespace !== null) { $span = SpanUtil::withoutNamespace($span); } return SpanUtil::initialIdentifier($span, 1); } public function getNamespaceSpan(): ?FileSpan { if ($this->namespace === null) { return null; } return SpanUtil::initialIdentifier($this->span); } public function accept(StatementVisitor $visitor) { return $visitor->visitVariableDeclaration($this); } public function __toString(): string { $buffer = ''; if ($this->namespace !== null) { $buffer .= $this->namespace . '.'; } $buffer .= "\$$this->name: $this->expression;"; return $buffer; } } PKCA#]�#d~��Psystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/ArgumentDeclaration.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Exception\MultiSpanSassScriptException; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Parser\ScssParser; use ScssPhp\ScssPhp\Util\Character; use ScssPhp\ScssPhp\Util\SpanUtil; use ScssPhp\ScssPhp\Util\StringUtil; use SourceSpan\FileSpan; /** * An argument declaration, as for a function or mixin definition. * * @internal */ final class ArgumentDeclaration implements SassNode { /** * @var list<Argument> */ private readonly array $arguments; private readonly ?string $restArgument; private readonly FileSpan $span; /** * @param list<Argument> $arguments */ public function __construct(array $arguments, FileSpan $span, ?string $restArgument = null) { $this->arguments = $arguments; $this->restArgument = $restArgument; $this->span = $span; } public static function createEmpty(FileSpan $span): ArgumentDeclaration { return new self([], $span); } /** * Parses an argument declaration from $contents, which should be of the * form `@rule name(args) {`. * * If passed, $url is the name of the file from which $contents comes. * * @throws SassFormatException if parsing fails. */ public static function parse(string $contents, ?LoggerInterface $logger = null, ?UriInterface $url = null): ArgumentDeclaration { return (new ScssParser($contents, $logger, $url))->parseArgumentDeclaration(); } public function isEmpty(): bool { return \count($this->arguments) === 0 && $this->restArgument === null; } /** * @return list<Argument> */ public function getArguments(): array { return $this->arguments; } public function getRestArgument(): ?string { return $this->restArgument; } public function getSpan(): FileSpan { return $this->span; } /** * Returns {@see $span} expanded to include an identifier immediately before the * declaration, if possible. */ public function getSpanWithName(): FileSpan { $text = $this->span->getFile()->getText(0); // Move backwards through any whitespace between the name and the arguments. $i = $this->span->getStart()->getOffset() - 1; while ($i > 0 && Character::isWhitespace($text[$i])) { $i--; } // Then move backwards through the name itself. if (!Character::isName($text[$i])) { return $this->span; } $i--; while ($i >= 0 && Character::isName($text[$i])) { $i--; } // Trim because it's possible that this span is empty (for example, a mixin // may be declared without an argument list). return SpanUtil::trim($this->span->getFile()->span($i + 1, $this->span->getEnd()->getOffset())); } /** * @param array<string, mixed> $names Only keys are relevant * * @throws SassScriptException if $positional and $names aren't valid for this argument declaration. */ public function verify(int $positional, array $names): void { $nameUsed = 0; foreach ($this->arguments as $i => $argument) { if ($i < $positional) { if (isset($names[$argument->getName()])) { $originalName = $this->originalArgumentName($argument->getName()); throw new SassScriptException(sprintf('Argument %s was passed both by position and by name.', $originalName)); } } elseif (isset($names[$argument->getName()])) { $nameUsed++; } elseif ($argument->getDefaultValue() === null) { $originalName = $this->originalArgumentName($argument->getName()); throw new MultiSpanSassScriptException(sprintf('Missing argument %s.', $originalName), 'invocation', ['declaration' => $this->getSpanWithName()]); } } if ($this->restArgument !== null) { return; } if ($positional > \count($this->arguments)) { $message = sprintf( 'Only %d %s%s allowed, but %d %s passed.', \count($this->arguments), empty($names) ? '' : 'positional ', StringUtil::pluralize('argument', \count($this->arguments)), $positional, StringUtil::pluralize('was', $positional, 'were') ); throw new MultiSpanSassScriptException($message, 'invocation', ['declaration' => $this->getSpanWithName()]); } if ($nameUsed < \count($names)) { $unknownNames = array_values(array_diff(array_keys($names), array_map(fn($argument) => $argument->getName(), $this->arguments))); \assert(\count($unknownNames) > 0); $message = sprintf( 'No %s named %s.', StringUtil::pluralize('argument', \count($unknownNames)), StringUtil::toSentence(array_map(fn ($name) => '$' . $name, $unknownNames), 'or') ); throw new MultiSpanSassScriptException($message, 'invocation', ['declaration' => $this->getSpanWithName()]); } } private function originalArgumentName(string $name): string { if ($name === $this->restArgument) { $text = $this->span->getText(); $lastDollar = strrpos($text, '$'); assert($lastDollar !== false); $fromDollar = substr($text, $lastDollar); $dot = strrpos($fromDollar, '.'); assert($dot !== false); return substr($fromDollar, 0, $dot); } foreach ($this->arguments as $argument) { if ($argument->getName() === $name) { return $argument->getOriginalName(); } } throw new \InvalidArgumentException("This declaration has no argument named \"\$$name\"."); } /** * Returns whether $positional and $names are valid for this argument * declaration. * * @param array<string, mixed> $names Only keys are relevant */ public function matches(int $positional, array $names): bool { $nameUsed = 0; foreach ($this->arguments as $i => $argument) { if ($i < $positional) { if (isset($names[$argument->getName()])) { return false; } } elseif (isset($names[$argument->getName()])) { $nameUsed++; } elseif ($argument->getDefaultValue() === null) { return false; } } if ($this->restArgument !== null) { return true; } if ($positional > \count($this->arguments)) { return false; } if ($nameUsed < \count($names)) { return false; } return true; } public function __toString(): string { $parts = []; foreach ($this->arguments as $arg) { $parts[] = "\$$arg"; } if ($this->restArgument !== null) { $parts[] = "\$$this->restArgument..."; } return implode(', ', $parts); } } PKCA#]"C����Psystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Import/StaticImport.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Import; use ScssPhp\ScssPhp\Ast\Sass\Import; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use SourceSpan\FileSpan; /** * An import that produces a plain CSS `@import` rule. * * @internal */ final class StaticImport implements Import { /** * The URL for this import. * * This already contains quotes. */ private readonly Interpolation $url; /** * The modifiers (such as media or supports queries) attached to this import, * or `null` if none are attached. */ private readonly ?Interpolation $modifiers; private readonly FileSpan $span; public function __construct(Interpolation $url, FileSpan $span, ?Interpolation $modifiers = null) { $this->url = $url; $this->span = $span; $this->modifiers = $modifiers; } public function getUrl(): Interpolation { return $this->url; } public function getModifiers(): ?Interpolation { return $this->modifiers; } public function getSpan(): FileSpan { return $this->span; } public function __toString(): string { $buffer = (string) $this->url; if ($this->modifiers !== null) { $buffer .= ' ' . $this->modifiers; } return $buffer; } } PKCA#]��Я��Qsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Import/DynamicImport.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Import; use League\Uri\Contracts\UriInterface; use League\Uri\Uri; use ScssPhp\ScssPhp\Ast\Sass\Expression\StringExpression; use ScssPhp\ScssPhp\Ast\Sass\Import; use SourceSpan\FileSpan; /** * An import that will load a Sass file at runtime. * * @internal */ final class DynamicImport implements Import { /** * The URI of the file to import. * * If this is relative, it's relative to the containing file. */ private readonly string $urlString; private readonly FileSpan $span; public function __construct(string $urlString, FileSpan $span) { $this->urlString = $urlString; $this->span = $span; } public function getUrl(): UriInterface { return Uri::new($this->urlString); } public function getUrlString(): string { return $this->urlString; } public function getSpan(): FileSpan { return $this->span; } public function __toString(): string { return StringExpression::quoteText($this->urlString); } } PKCA#]��::Jsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/SassReference.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass; use SourceSpan\FileSpan; /** * A common interface for any node that references a Sass member. * * @internal */ interface SassReference extends SassNode { /** * The namespace of the member being referenced, or `null` if it's referenced * without a namespace. */ public function getNamespace(): ?string; /** * The name of the member being referenced, with underscores converted to * hyphens. * * This does not include the `$` for variables. */ public function getName(): string; /** * The span containing this reference's name. * * For variables, this should include the `$`. */ public function getNameSpan(): FileSpan; /** * The span containing this reference's namespace, null if {@see getNamespace} is * null. */ public function getNamespaceSpan(): ?FileSpan; } PKCA#]���HHHsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/AtRootQuery.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Ast\Css\CssAtRule; use ScssPhp\ScssPhp\Ast\Css\CssMediaRule; use ScssPhp\ScssPhp\Ast\Css\CssParentNode; use ScssPhp\ScssPhp\Ast\Css\CssStyleRule; use ScssPhp\ScssPhp\Ast\Css\CssSupportsRule; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Parser\AtRootQueryParser; use ScssPhp\ScssPhp\Parser\InterpolationMap; /** * A query for the `@at-root` rule. * * @internal */ final class AtRootQuery { /** * Whether the query includes or excludes rules with the specified names. */ private readonly bool $include; /** * The names of the rules included or excluded by this query. * * There are two special names. "all" indicates that all rules are included * or excluded, and "rule" indicates style rules are included or excluded. * * @var string[] */ private readonly array $names; /** * Whether this includes or excludes *all* rules. */ private readonly bool $all; /** * Whether this includes or excludes style rules. */ private readonly bool $rule; /** * Parses an at-root query from $contents. * * If passed, $url is the name of the file from which $contents comes. * * @throws SassFormatException if parsing fails */ public static function parse(string $contents, ?LoggerInterface $logger = null, ?UriInterface $url = null, ?InterpolationMap $interpolationMap = null): AtRootQuery { return (new AtRootQueryParser($contents, $logger, $url, $interpolationMap))->parse(); } /** * @param string[] $names */ public static function create(array $names, bool $include): AtRootQuery { return new AtRootQuery($names, $include, \in_array('all', $names, true), \in_array('rule', $names, true)); } /** * The default at-root query */ public static function getDefault(): AtRootQuery { return new AtRootQuery([], false, false, true); } /** * @param string[] $names */ private function __construct(array $names, bool $include, bool $all, bool $rule) { $this->include = $include; $this->names = $names; $this->all = $all; $this->rule = $rule; } public function getInclude(): bool { return $this->include; } /** * @return string[] */ public function getNames(): array { return $this->names; } /** * Whether this excludes style rules. * * Note that this takes {@see include} into account. */ public function excludesStyleRules(): bool { return ($this->all || $this->rule) !== $this->include; } /** * Returns whether $this excludes $node */ public function excludes(CssParentNode $node): bool { if ($this->all) { return !$this->include; } if ($node instanceof CssStyleRule) { return $this->excludesStyleRules(); } if ($node instanceof CssMediaRule) { return $this->excludesName('media'); } if ($node instanceof CssSupportsRule) { return $this->excludesName('supports'); } if ($node instanceof CssAtRule) { return $this->excludesName(strtolower($node->getName()->getValue())); } return false; } /** * Returns whether $this excludes an at-rule with the given $name. */ public function excludesName(string $name): bool { return ($this->all || \in_array($name, $this->names, true)) !== $this->include; } } PKCA#]�]��99_system/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/SupportsCondition/SupportsAnything.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use SourceSpan\FileSpan; /** * A supports condition that represents the forwards-compatible * `<general-enclosed>` production. * * @internal */ final class SupportsAnything implements SupportsCondition { /** * The contents of the condition. */ private readonly Interpolation $contents; private readonly FileSpan $span; public function __construct(Interpolation $contents, FileSpan $span) { $this->contents = $contents; $this->span = $span; } public function getContents(): Interpolation { return $this->contents; } public function getSpan(): FileSpan { return $this->span; } public function __toString(): string { return "($this->contents)"; } } PKCA#]�����_system/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/SupportsCondition/SupportsFunction.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use SourceSpan\FileSpan; /** * A function-syntax condition. * * @internal */ final class SupportsFunction implements SupportsCondition { /** * The name of the function. */ private readonly Interpolation $name; /** * The arguments of the function. */ private readonly Interpolation $arguments; private readonly FileSpan $span; public function __construct(Interpolation $name, Interpolation $arguments, FileSpan $span) { $this->name = $name; $this->arguments = $arguments; $this->span = $span; } public function getName(): Interpolation { return $this->name; } public function getArguments(): Interpolation { return $this->arguments; } public function getSpan(): FileSpan { return $this->span; } public function __toString(): string { return "$this->name($this->arguments)"; } } PKCA#]��� dsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/SupportsCondition/SupportsInterpolation.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use SourceSpan\FileSpan; /** * An interpolated condition. * * @internal */ final class SupportsInterpolation implements SupportsCondition { /** * The expression in the interpolation. */ private readonly Expression $expression; private readonly FileSpan $span; public function __construct(Expression $expression, FileSpan $span) { $this->expression = $expression; $this->span = $span; } public function getExpression(): Expression { return $this->expression; } public function getSpan(): FileSpan { return $this->span; } public function __toString(): string { return '#{' . $this->expression . '}'; } } PKCA#]:�]��bsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/SupportsCondition/SupportsDeclaration.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression\StringExpression; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use SourceSpan\FileSpan; /** * A condition that selects for browsers where a given declaration is * supported. * * @internal */ final class SupportsDeclaration implements SupportsCondition { /** * The name of the declaration being tested. */ private readonly Expression $name; /** * The value of the declaration being tested. */ private readonly Expression $value; private readonly FileSpan $span; public function __construct(Expression $name, Expression $value, FileSpan $span) { $this->name = $name; $this->value = $value; $this->span = $span; } public function getName(): Expression { return $this->name; } public function getValue(): Expression { return $this->value; } public function getSpan(): FileSpan { return $this->span; } /** * Returns whether this is a CSS Custom Property declaration. * * Note that this can return `false` for declarations that will ultimately be * serialized as custom properties if they aren't *parsed as* custom * properties, such as `#{--foo}: ...`. * * If this is `true`, then `value` will be a {@see StringExpression}. */ public function isCustomProperty(): bool { return $this->name instanceof StringExpression && !$this->name->hasQuotes() && str_starts_with($this->name->getText()->getInitialPlain(), '--'); } public function __toString(): string { return "($this->name: $this->value)"; } } PKCA#]�IH>`system/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/SupportsCondition/SupportsOperation.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use SourceSpan\FileSpan; /** * An operation defining the relationship between two conditions. * * @internal */ final class SupportsOperation implements SupportsCondition { /** * The left-hand operand. */ private readonly SupportsCondition $left; /** * The right-hand operand. */ private readonly SupportsCondition $right; private readonly string $operator; private readonly FileSpan $span; public function __construct(SupportsCondition $left, SupportsCondition $right, string $operator, FileSpan $span) { $this->left = $left; $this->right = $right; $this->operator = $operator; $this->span = $span; } public function getLeft(): SupportsCondition { return $this->left; } public function getRight(): SupportsCondition { return $this->right; } public function getOperator(): string { return $this->operator; } public function getSpan(): FileSpan { return $this->span; } public function __toString(): string { return $this->parenthesize($this->left) . ' ' . $this->operator . ' ' . $this->parenthesize($this->right); } private function parenthesize(SupportsCondition $condition): string { if ($condition instanceof SupportsNegation || $condition instanceof SupportsOperation && $condition->operator === $this->operator) { return "($condition)"; } return (string) $condition; } } PKCA#]Y��d��_system/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/SupportsCondition/SupportsNegation.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use SourceSpan\FileSpan; /** * A negated condition. * * @internal */ final class SupportsNegation implements SupportsCondition { /** * The condition that's been negated. */ private readonly SupportsCondition $condition; private readonly FileSpan $span; public function __construct(SupportsCondition $condition, FileSpan $span) { $this->condition = $condition; $this->span = $span; } public function getCondition(): SupportsCondition { return $this->condition; } public function getSpan(): FileSpan { return $this->span; } public function __toString(): string { if ($this->condition instanceof SupportsNegation || $this->condition instanceof SupportsOperation) { return "not ($this->condition)"; } return 'not ' . $this->condition; } } PKCA#]5.�P��Osystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/ArgumentInvocation.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass; use ScssPhp\ScssPhp\Ast\Sass\Expression\ListExpression; use ScssPhp\ScssPhp\Value\ListSeparator; use SourceSpan\FileSpan; /** * A set of arguments passed in to a function or mixin. * * @internal */ final class ArgumentInvocation implements SassNode { /** * @var list<Expression> */ private readonly array $positional; /** * @var array<string, Expression> */ private readonly array $named; private readonly ?Expression $rest; private readonly ?Expression $keywordRest; private readonly FileSpan $span; /** * @param list<Expression> $positional * @param array<string, Expression> $named */ public function __construct(array $positional, array $named, FileSpan $span, ?Expression $rest = null, ?Expression $keywordRest = null) { assert($keywordRest === null || $rest !== null); $this->positional = $positional; $this->named = $named; $this->rest = $rest; $this->keywordRest = $keywordRest; $this->span = $span; } public static function createEmpty(FileSpan $span): ArgumentInvocation { return new self([], [], $span); } public function isEmpty(): bool { return \count($this->positional) === 0 && \count($this->named) === 0 && $this->rest === null; } /** * @return list<Expression> */ public function getPositional(): array { return $this->positional; } /** * @return array<string, Expression> */ public function getNamed(): array { return $this->named; } public function getRest(): ?Expression { return $this->rest; } public function getKeywordRest(): ?Expression { return $this->keywordRest; } public function getSpan(): FileSpan { return $this->span; } public function __toString(): string { $parts = []; foreach ($this->positional as $argument) { $parts[] = $this->parenthesizeArgument($argument); } foreach ($this->named as $name => $arg) { $parts[] = "\$$name: {$this->parenthesizeArgument($arg)}"; } if ($this->rest !== null) { $parts[] = "{$this->parenthesizeArgument($this->rest)}..."; } if ($this->keywordRest !== null) { $parts[] = "{$this->parenthesizeArgument($this->keywordRest)}..."; } return '(' . implode(', ', $parts) . ')'; } private function parenthesizeArgument(Expression $argument): string { if ($argument instanceof ListExpression && $argument->getSeparator() === ListSeparator::COMMA && !$argument->hasBrackets() && \count($argument->getContents()) > 1) { return "($argument)"; } return (string) $argument; } } PKCA#]�{L&99Csystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Import.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass; /** * An interface for different types of import. * * @internal */ interface Import extends SassNode { } PKCA#]l5�W\\Nsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/SupportsCondition.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass; /** * An interface for defining the condition a `@supports` rule selects. * * @internal */ interface SupportsCondition extends SassNode { } PKCA#]s�i��Wsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/ValueExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Value\Value; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * An expression that directly embeds a value. * * This is never constructed by the parser. It's only used when ASTs are * constructed dynamically, as for the `call()` function. * * @internal */ final class ValueExpression implements Expression { private readonly Value $value; private readonly FileSpan $span; public function __construct(Value $value, FileSpan $span) { $this->value = $value; $this->span = $span; } public function getValue(): Value { return $this->value; } public function getSpan(): FileSpan { return $this->span; } public function accept(ExpressionVisitor $visitor) { return $visitor->visitValueExpression($this); } public function __toString(): string { return (string) $this->value; } } PKCA#]�wLL_system/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/ParenthesizedExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * An expression wrapped in parentheses. * * @internal */ final class ParenthesizedExpression implements Expression { private readonly Expression $expression; private readonly FileSpan $span; public function __construct(Expression $expression, FileSpan $span) { $this->expression = $expression; $this->span = $span; } public function getExpression(): Expression { return $this->expression; } public function getSpan(): FileSpan { return $this->span; } public function accept(ExpressionVisitor $visitor) { return $visitor->visitParenthesizedExpression($this); } public function __toString(): string { return '(' . $this->expression . ')'; } } PKCA#]�y�Ysystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/BooleanExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * A boolean literal, `true` or `false`. * * @internal */ final class BooleanExpression implements Expression { private readonly bool $value; private readonly FileSpan $span; public function __construct(bool $value, FileSpan $span) { $this->value = $value; $this->span = $span; } public function getValue(): bool { return $this->value; } public function getSpan(): FileSpan { return $this->span; } public function accept(ExpressionVisitor $visitor) { return $visitor->visitBooleanExpression($this); } public function __toString(): string { return $this->value ? 'true' : 'false'; } } PKCA#]� ���Xsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/StringExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Parser\InterpolationBuffer; use ScssPhp\ScssPhp\Util\Character; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * A string literal. * * @internal */ final class StringExpression implements Expression { private readonly Interpolation $text; private readonly bool $quotes; public function __construct(Interpolation $text, bool $quotes = false) { $this->text = $text; $this->quotes = $quotes; } /** * Returns a string expression with no interpolation. */ public static function plain(string $text, FileSpan $span, bool $quotes = false): self { return new self(new Interpolation([$text], $span), $quotes); } /** * Returns Sass source for a quoted string that, when evaluated, will have * $text as its contents. */ public static function quoteText(string $text): string { $quote = self::bestQuote([$text]); $buffer = $quote; $buffer .= self::quoteInnerText($text, $quote, true); $buffer .= $quote; return $buffer; } /** * Interpolation that, when evaluated, produces the contents of this string. * * Unlike {@see asInterpolation}, escapes are resolved and quotes are not * included. * If this is a quoted string, escapes are resolved and quotes are not * included in this text (unlike {@see asInterpolation}). If it's an unquoted * string, escapes are *not* resolved. */ public function getText(): Interpolation { return $this->text; } public function hasQuotes(): bool { return $this->quotes; } public function getSpan(): FileSpan { return $this->text->getSpan(); } public function accept(ExpressionVisitor $visitor) { return $visitor->visitStringExpression($this); } public function asInterpolation(bool $static = false, ?string $quote = null): Interpolation { if (!$this->quotes) { return $this->text; } $quote = $quote ?? self::bestQuote($this->text->getContents()); $buffer = new InterpolationBuffer(); $buffer->write($quote); foreach ($this->text->getContents() as $value) { if ($value instanceof Expression) { $buffer->add($value); } else { $buffer->write(self::quoteInnerText($value, $quote, $static)); } } $buffer->write($quote); return $buffer->buildInterpolation($this->text->getSpan()); } private static function quoteInnerText(string $value, string $quote, bool $static = false): string { $buffer = ''; $length = \strlen($value); for ($i = 0; $i < $length; $i++) { $char = $value[$i]; if (Character::isNewline($char)) { $buffer .= '\\a'; if ($i !== $length - 1) { $next = $value[$i + 1]; if (Character::isWhitespace($next) || Character::isHex($next)) { $buffer .= ' '; } } } else { if ($char === $quote || $char === '\\' || ($static && $char === '#' && $i < $length - 1 && $value[$i + 1] === '{')) { $buffer .= '\\'; } if (\ord($char) < 0x80) { $buffer .= $char; } else { if (!preg_match('/./usA', $value, $m, 0, $i)) { throw new \UnexpectedValueException('Invalid UTF-8 char'); } $buffer .= $m[0]; $i += \strlen($m[0]) - 1; // skip over the extra bytes that have been processed. } } } return $buffer; } /** * @param array<string|Expression> $parts */ private static function bestQuote(array $parts): string { $containsDoubleQuote = false; foreach ($parts as $part) { if (!\is_string($part)) { continue; } if (str_contains($part, "'")) { return '"'; } if (str_contains($part, '"')) { $containsDoubleQuote = true; } } return $containsDoubleQuote ? "'" : '"'; } public function __toString(): string { return (string) $this->asInterpolation(); } } PKCA#]�u��asystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/BinaryOperationExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Util\SpanUtil; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * A binary operator, as in `1 + 2` or `$this and $other`. * * @internal */ final class BinaryOperationExpression implements Expression { private readonly BinaryOperator $operator; private readonly Expression $left; private readonly Expression $right; /** * Whether this is a dividedBy operation that may be interpreted as slash-separated numbers. */ private bool $allowsSlash = false; public function __construct(BinaryOperator $operator, Expression $left, Expression $right) { $this->operator = $operator; $this->left = $left; $this->right = $right; } /** * Creates a dividedBy operation that may be interpreted as slash-separated numbers. */ public static function slash(Expression $left, Expression $right): self { $operation = new self(BinaryOperator::DIVIDED_BY, $left, $right); $operation->allowsSlash = true; return $operation; } public function getOperator(): BinaryOperator { return $this->operator; } public function getLeft(): Expression { return $this->left; } public function getRight(): Expression { return $this->right; } public function allowsSlash(): bool { return $this->allowsSlash; } public function getSpan(): FileSpan { $left = $this->left; while ($left instanceof BinaryOperationExpression) { $left = $left->left; } $right = $this->right; while ($right instanceof BinaryOperationExpression) { $right = $right->right; } $leftSpan = $left->getSpan(); $rightSpan = $right->getSpan(); return $leftSpan->expand($rightSpan); } /** * Returns the span that covers only {@see $operator}. * * @internal */ public function getOperatorSpan(): FileSpan { $leftSpan = $this->left->getSpan(); $rightSpan = $this->right->getSpan(); if ($leftSpan->getFile() === $rightSpan->getFile() && $leftSpan->getEnd()->getOffset() < $rightSpan->getStart()->getOffset()) { return SpanUtil::trim($leftSpan->getFile()->span($leftSpan->getEnd()->getOffset(), $rightSpan->getStart()->getOffset())); } return $this->getSpan(); } public function accept(ExpressionVisitor $visitor) { return $visitor->visitBinaryOperationExpression($this); } public function __toString(): string { $buffer = ''; $leftNeedsParens = ($this->left instanceof BinaryOperationExpression && $this->left->getOperator()->getPrecedence() < $this->operator->getPrecedence()) || ($this->left instanceof ListExpression && !$this->left->hasBrackets() && \count($this->left->getContents()) > 1); if ($leftNeedsParens) { $buffer .= '('; } $buffer .= $this->left; if ($leftNeedsParens) { $buffer .= ')'; } $buffer .= ' '; $buffer .= $this->operator->getOperator(); $buffer .= ' '; $rightNeedsParens = ($this->right instanceof BinaryOperationExpression && $this->right->getOperator()->getPrecedence() <= $this->operator->getPrecedence() && !($this->right->operator === $this->operator && $this->operator->isAssociative())) || ($this->right instanceof ListExpression && !$this->right->hasBrackets() && \count($this->right->getContents()) > 1); if ($rightNeedsParens) { $buffer .= '('; } $buffer .= $this->right; if ($rightNeedsParens) { $buffer .= ')'; } return $buffer; } } PKCA#]1��KK`system/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/UnaryOperationExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * A unary operator, as in `+$var` or `not fn()`. * * @internal */ final class UnaryOperationExpression implements Expression { private readonly UnaryOperator $operator; private readonly Expression $operand; private readonly FileSpan $span; public function __construct(UnaryOperator $operator, Expression $operand, FileSpan $span) { $this->operator = $operator; $this->operand = $operand; $this->span = $span; } public function getOperator(): UnaryOperator { return $this->operator; } public function getOperand(): Expression { return $this->operand; } public function getSpan(): FileSpan { return $this->span; } public function accept(ExpressionVisitor $visitor) { return $visitor->visitUnaryOperationExpression($this); } public function __toString(): string { $buffer = $this->operator->getOperator(); if ($this->operator === UnaryOperator::NOT) { $buffer .= ' '; } $needsParens = $this->operand instanceof BinaryOperationExpression || $this->operand instanceof UnaryOperationExpression || ($this->operand instanceof ListExpression && !$this->operand->hasBrackets() && \count($this->operand->getContents()) > 1); if ($needsParens) { $buffer .= '('; } $buffer .= $this->operand; if ($needsParens) { $buffer .= ')'; } return $buffer; } } PKCA#]FX���Zsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/SupportsExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * An expression-level `@supports` condition. * * This appears only in the modifiers that come after a plain-CSS `@import`. It * doesn't include the function name wrapping the condition. * * @internal */ final class SupportsExpression implements Expression { private readonly SupportsCondition $condition; public function __construct(SupportsCondition $condition) { $this->condition = $condition; } public function getCondition(): SupportsCondition { return $this->condition; } public function getSpan(): FileSpan { return $this->condition->getSpan(); } public function accept(ExpressionVisitor $visitor) { return $visitor->visitSupportsExpression($this); } public function __toString(): string { return (string) $this->condition; } } PKCA#]�X VVZsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/SelectorExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * A parent selector reference, `&`. * * @internal */ final class SelectorExpression implements Expression { private readonly FileSpan $span; public function __construct(FileSpan $span) { $this->span = $span; } public function getSpan(): FileSpan { return $this->span; } public function accept(ExpressionVisitor $visitor) { return $visitor->visitSelectorExpression($this); } public function __toString(): string { return '&'; } } PKCA#]~f��Vsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/BinaryOperator.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; /** * @internal */ enum BinaryOperator { case SINGLE_EQUALS; case OR; case AND; case EQUALS; case NOT_EQUALS; case GREATER_THAN; case GREATER_THAN_OR_EQUALS; case LESS_THAN; case LESS_THAN_OR_EQUALS; case PLUS; case MINUS; case TIMES; case DIVIDED_BY; case MODULO; /** * The Sass syntax for this operator */ public function getOperator(): string { return match ($this) { self::SINGLE_EQUALS => '=', self::OR => 'or', self::AND => 'and', self::EQUALS => '==', self::NOT_EQUALS => '!=', self::GREATER_THAN => '>', self::GREATER_THAN_OR_EQUALS => '>=', self::LESS_THAN => '<', self::LESS_THAN_OR_EQUALS => '<=', self::PLUS => '+', self::MINUS => '-', self::TIMES => '*', self::DIVIDED_BY => '/', self::MODULO => '%', }; } public function getPrecedence(): int { return match ($this) { self::SINGLE_EQUALS => 0, self::OR => 1, self::AND => 2, self::EQUALS, self::NOT_EQUALS => 3, self::GREATER_THAN, self::GREATER_THAN_OR_EQUALS, self::LESS_THAN, self::LESS_THAN_OR_EQUALS => 4, self::PLUS, self::MINUS => 5, self::TIMES, self::DIVIDED_BY, self::MODULO => 6, }; } /** * Whether this operation has the [associative property]. * * [associative property]: https://en.wikipedia.org/wiki/Associative_property */ public function isAssociative(): bool { return match ($this) { self::OR, self::AND, self::PLUS, self::TIMES => true, default => false, }; } } PKCA#]^ɲ�##Wsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/ColorExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Value\SassColor; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * A color literal. * * @internal */ final class ColorExpression implements Expression { private readonly SassColor $value; private readonly FileSpan $span; public function __construct(SassColor $value, FileSpan $span) { $this->value = $value; $this->span = $span; } public function getValue(): SassColor { return $this->value; } public function getSpan(): FileSpan { return $this->span; } public function accept(ExpressionVisitor $visitor) { return $visitor->visitColorExpression($this); } public function __toString(): string { return (string) $this->value; } } PKCA#]�^iifsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/InterpolatedFunctionExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\ArgumentInvocation; use ScssPhp\ScssPhp\Ast\Sass\CallableInvocation; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * An interpolated function invocation. * * This is always a plain CSS function. * * @internal */ final class InterpolatedFunctionExpression implements Expression, CallableInvocation { /** * The name of the function being invoked. */ private readonly Interpolation $name; /** * The arguments to pass to the function. */ private readonly ArgumentInvocation $arguments; private readonly FileSpan $span; public function __construct(Interpolation $name, ArgumentInvocation $arguments, FileSpan $span) { $this->span = $span; $this->name = $name; $this->arguments = $arguments; } public function getName(): Interpolation { return $this->name; } public function getArguments(): ArgumentInvocation { return $this->arguments; } public function getSpan(): FileSpan { return $this->span; } public function accept(ExpressionVisitor $visitor) { return $visitor->visitInterpolatedFunctionExpression($this); } public function __toString(): string { return $this->name . $this->arguments; } } PKCA#]�]�8��Xsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/NumberExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Value\SassNumber; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * A number literal. * * @internal */ final class NumberExpression implements Expression { private readonly float $value; private readonly FileSpan $span; private readonly ?string $unit; public function __construct(float $value, FileSpan $span, ?string $unit = null) { $this->value = $value; $this->span = $span; $this->unit = $unit; } public function getValue(): float { return $this->value; } public function getSpan(): FileSpan { return $this->span; } public function getUnit(): ?string { return $this->unit; } public function accept(ExpressionVisitor $visitor) { return $visitor->visitNumberExpression($this); } public function __toString(): string { return (string) SassNumber::create($this->value, $this->unit); } } PKCA#]_�,keeTsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/IfExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\ArgumentDeclaration; use ScssPhp\ScssPhp\Ast\Sass\ArgumentInvocation; use ScssPhp\ScssPhp\Ast\Sass\CallableInvocation; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * A ternary expression. * * This is defined as a separate syntactic construct rather than a normal * function because only one of the `$if-true` and `$if-false` arguments are * evaluated. * * @internal */ final class IfExpression implements Expression, CallableInvocation { /** * The arguments passed to `if()`. */ private readonly ArgumentInvocation $arguments; private readonly FileSpan $span; private static ?ArgumentDeclaration $declaration = null; public function __construct(ArgumentInvocation $arguments, FileSpan $span) { $this->span = $span; $this->arguments = $arguments; } /** * The declaration of `if()`, as though it were a normal function. */ public static function getDeclaration(): ArgumentDeclaration { if (self::$declaration === null) { self::$declaration = ArgumentDeclaration::parse('@function if($condition, $if-true, $if-false) {'); } return self::$declaration; } public function getArguments(): ArgumentInvocation { return $this->arguments; } public function getSpan(): FileSpan { return $this->span; } public function accept(ExpressionVisitor $visitor) { return $visitor->visitIfExpression($this); } public function __toString(): string { return 'if' . $this->arguments; } } PKCA#]�S:>��Usystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/MapExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * A map literal. * * @internal */ final class MapExpression implements Expression { /** * @var list<array{Expression, Expression}> */ private readonly array $pairs; private readonly FileSpan $span; /** * @param list<array{Expression, Expression}> $pairs */ public function __construct(array $pairs, FileSpan $span) { $this->pairs = $pairs; $this->span = $span; } /** * @return list<array{Expression, Expression}> */ public function getPairs(): array { return $this->pairs; } public function getSpan(): FileSpan { return $this->span; } public function accept(ExpressionVisitor $visitor) { return $visitor->visitMapExpression($this); } public function __toString(): string { return '(' . implode(', ', array_map(fn($pair) => $pair[0] . ': ' . $pair[1], $this->pairs)) . ')'; } } PKCA#]ai'��Zsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/FunctionExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\ArgumentInvocation; use ScssPhp\ScssPhp\Ast\Sass\CallableInvocation; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\SassReference; use ScssPhp\ScssPhp\Util\SpanUtil; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * A function invocation. * * This may be a plain CSS function or a Sass function, but may not include * interpolation. * * @internal */ final class FunctionExpression implements Expression, CallableInvocation, SassReference { /** * The name of the function being invoked, with underscores converted to * hyphens. * * If this function is a plain CSS function, use {@see $originalName} instead. */ private readonly string $name; /** * The name of the function being invoked, with underscores left as-is. */ private readonly string $originalName; /** * The arguments to pass to the function. */ private readonly ArgumentInvocation $arguments; /** * The namespace of the function being invoked, or `null` if it's invoked * without a namespace. */ private readonly ?string $namespace; private readonly FileSpan $span; public function __construct(string $originalName, ArgumentInvocation $arguments, FileSpan $span, ?string $namespace = null) { $this->span = $span; $this->originalName = $originalName; $this->arguments = $arguments; $this->namespace = $namespace; $this->name = str_replace('_', '-', $this->originalName); } public function getOriginalName(): string { return $this->originalName; } /** * The name of the function being invoked, with underscores converted to * hyphens. * * If this function is a plain CSS function, use {@see getOriginalName} instead. */ public function getName(): string { return $this->name; } public function getArguments(): ArgumentInvocation { return $this->arguments; } public function getNamespace(): ?string { return $this->namespace; } public function getSpan(): FileSpan { return $this->span; } public function getNameSpan(): FileSpan { if ($this->namespace === null) { return SpanUtil::initialIdentifier($this->span); } return SpanUtil::initialIdentifier(SpanUtil::withoutNamespace($this->span)); } public function getNamespaceSpan(): ?FileSpan { if ($this->namespace === null) { return null; } return SpanUtil::initialIdentifier($this->span); } public function accept(ExpressionVisitor $visitor) { return $visitor->visitFunctionExpression($this); } public function __toString(): string { $buffer = ''; if ($this->namespace !== null) { $buffer .= $this->namespace . '.'; } $buffer .= $this->originalName . $this->arguments; return $buffer; } } PKCA#]�SA�u u `system/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/IsCalculationSafeVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Util\IterableUtil; use ScssPhp\ScssPhp\Value\ListSeparator; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; /** * @template-implements ExpressionVisitor<bool> * * @internal */ final class IsCalculationSafeVisitor implements ExpressionVisitor { public function visitBinaryOperationExpression(BinaryOperationExpression $node): bool { return \in_array($node->getOperator(), [BinaryOperator::TIMES, BinaryOperator::DIVIDED_BY, BinaryOperator::PLUS, BinaryOperator::MINUS], true) && ($node->getLeft()->accept($this) || $node->getRight()->accept($this)); } public function visitBooleanExpression(BooleanExpression $node): bool { return false; } public function visitColorExpression(ColorExpression $node): bool { return false; } public function visitFunctionExpression(FunctionExpression $node): bool { return true; } public function visitInterpolatedFunctionExpression(InterpolatedFunctionExpression $node): bool { return true; } public function visitIfExpression(IfExpression $node): bool { return true; } public function visitListExpression(ListExpression $node): bool { return $node->getSeparator() === ListSeparator::SPACE && !$node->hasBrackets() && \count($node->getContents()) > 1 && IterableUtil::every($node->getContents(), fn(Expression $expression) => $expression->accept($this)); } public function visitMapExpression(MapExpression $node): bool { return false; } public function visitNullExpression(NullExpression $node): bool { return false; } public function visitNumberExpression(NumberExpression $node): bool { return true; } public function visitParenthesizedExpression(ParenthesizedExpression $node): bool { return $node->getExpression()->accept($this); } public function visitSelectorExpression(SelectorExpression $node): bool { return false; } public function visitStringExpression(StringExpression $node): bool { if ($node->hasQuotes()) { return false; } /** * Exclude non-identifier constructs that are parsed as {@see StringExpression}s. * We could just check if they parse as valid identifiers, but this is * cheaper. */ $text = $node->getText()->getInitialPlain(); // !important return !str_starts_with($text, '!') // ID-style identifiers && !str_starts_with($text, '#') // Unicode ranges && ($text[1] ?? null) !== '+' // url() && ($text[3] ?? null) !== '('; } public function visitSupportsExpression(SupportsExpression $node): bool { return false; } public function visitUnaryOperationExpression(UnaryOperationExpression $node): bool { return false; } public function visitValueExpression(ValueExpression $node): bool { return false; } public function visitVariableExpression(VariableExpression $node): bool { return true; } } PKCA#]��{DttZsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/VariableExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\SassReference; use ScssPhp\ScssPhp\Util\SpanUtil; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * A Sass variable. * * @internal */ final class VariableExpression implements Expression, SassReference { /** * The name of this variable, with underscores converted to hyphens. */ private readonly string $name; /** * The namespace of the variable being referenced, or `null` if it's * referenced without a namespace. */ private ?string $namespace; private readonly FileSpan $span; public function __construct(string $name, FileSpan $span, ?string $namespace = null) { $this->span = $span; $this->name = $name; $this->namespace = $namespace; } public function getName(): string { return $this->name; } public function getNamespace(): ?string { return $this->namespace; } public function getSpan(): FileSpan { return $this->span; } public function getNameSpan(): FileSpan { if ($this->namespace === null) { return $this->span; } return SpanUtil::withoutNamespace($this->span); } public function getNamespaceSpan(): ?FileSpan { if ($this->namespace === null) { return null; } return SpanUtil::initialIdentifier($this->span); } public function accept(ExpressionVisitor $visitor) { return $visitor->visitVariableExpression($this); } public function __toString(): string { return $this->span->getText(); } } PKCA#]:\e�??Vsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/NullExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * A null literal. * * @internal */ final class NullExpression implements Expression { private readonly FileSpan $span; public function __construct(FileSpan $span) { $this->span = $span; } public function getSpan(): FileSpan { return $this->span; } public function accept(ExpressionVisitor $visitor) { return $visitor->visitNullExpression($this); } public function __toString(): string { return 'null'; } } PKCA#]�nv Vsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/ListExpression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Value\ListSeparator; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use SourceSpan\FileSpan; /** * A list literal. * * @internal */ final class ListExpression implements Expression { /** * @var list<Expression> */ private readonly array $contents; private readonly ListSeparator $separator; private readonly FileSpan $span; private readonly bool $brackets; /** * ListExpression constructor. * * @param list<Expression> $contents */ public function __construct(array $contents, ListSeparator $separator, FileSpan $span, bool $brackets = false) { $this->contents = $contents; $this->separator = $separator; $this->span = $span; $this->brackets = $brackets; } /** * @return list<Expression> */ public function getContents(): array { return $this->contents; } public function getSeparator(): ListSeparator { return $this->separator; } public function hasBrackets(): bool { return $this->brackets; } public function getSpan(): FileSpan { return $this->span; } public function accept(ExpressionVisitor $visitor) { return $visitor->visitListExpression($this); } public function __toString(): string { $buffer = ''; if ($this->hasBrackets()) { $buffer .= '['; } elseif (\count($this->contents) === 0 || (\count($this->contents) === 1 && $this->separator === ListSeparator::COMMA)) { $buffer .= '('; } $buffer .= implode( $this->separator === ListSeparator::COMMA ? ', ' : ' ', array_map(fn($element) => $this->elementNeedsParens($element) ? "($element)" : (string) $element, $this->contents) ); if ($this->hasBrackets()) { $buffer .= ']'; } elseif (\count($this->contents) === 0) { $buffer .= ')'; } elseif (\count($this->contents) === 1 && $this->separator === ListSeparator::COMMA) { $buffer .= ',)'; } return $buffer; } /** * Returns whether $expression, contained in $this, needs parentheses when * printed as Sass source. */ private function elementNeedsParens(Expression $expression): bool { if ($expression instanceof ListExpression) { if (\count($expression->contents) < 2) { return false; } if ($expression->brackets) { return false; } return $this->separator === ListSeparator::COMMA ? $expression->separator === ListSeparator::COMMA : $expression->separator !== ListSeparator::UNDECIDED; } if ($this->separator !== ListSeparator::SPACE) { return false; } if ($expression instanceof UnaryOperationExpression) { return $expression->getOperator() === UnaryOperator::PLUS || $expression->getOperator() === UnaryOperator::MINUS; } return false; } } PKCA#]~9 �[[Usystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression/UnaryOperator.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass\Expression; /** * @internal */ enum UnaryOperator { case PLUS; case MINUS; case DIVIDE; case NOT; /** * The Sass syntax for this operator */ public function getOperator(): string { return match ($this) { self::PLUS => '+', self::MINUS => '-', self::DIVIDE => '/', self::NOT => 'not', }; } } PKCA#]�����Fsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Statement.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass; use ScssPhp\ScssPhp\Visitor\StatementVisitor; /** * A statement in a Sass syntax tree. * * @internal */ interface Statement extends SassNode { /** * @template T * @param StatementVisitor<T> $visitor * @return T */ public function accept(StatementVisitor $visitor); } PKCA#]o��� � Jsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Interpolation.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass; use ScssPhp\ScssPhp\Parser\InterpolationBuffer; use SourceSpan\FileSpan; /** * Plain text interpolated with Sass expressions. * * @internal */ final class Interpolation implements SassNode { /** * @var list<string|Expression> */ private readonly array $contents; private readonly FileSpan $span; /** * @param list<string|Expression> $contents */ public function __construct(array $contents, FileSpan $span) { for ($i = 0; $i < \count($contents); $i++) { // Dart-sass has a validation on the type of elements here. This is useless for us because phpstan supports union types, unlike the Dart type system if ($i != 0 && \is_string($contents[$i]) && \is_string($contents[$i - 1])) { throw new \InvalidArgumentException('The contents of an Interpolation may not contain adjacent strings.'); } } $this->contents = $contents; $this->span = $span; } /** * @return list<string|Expression> */ public function getContents(): array { return $this->contents; } public function getSpan(): FileSpan { return $this->span; } /** * Returns whether this contains no interpolated expressions. */ public function isPlain(): bool { return $this->getAsPlain() !== null; } /** * If this contains no interpolated expressions, returns its text contents. * * Otherwise, returns `null`. * * @psalm-mutation-free */ public function getAsPlain(): ?string { if (\count($this->contents) === 0) { return ''; } if (\count($this->contents) > 1) { return null; } if (\is_string($this->contents[0])) { return $this->contents[0]; } return null; } /** * Returns the plain text before the interpolation, or the empty string. */ public function getInitialPlain(): string { $first = $this->contents[0] ?? null; if (\is_string($first)) { return $first; } return ''; } public function __toString(): string { return implode('', array_map(fn($value) => \is_string($value) ? $value : '#{' . $value . '}', $this->contents)); } } PKCA#]E��qqEsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/SassNode.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass; use ScssPhp\ScssPhp\Ast\AstNode; /** * A node in the abstract syntax tree for an unevaluated Sass file. * * @internal */ interface SassNode extends AstNode { } PKCA#]Ns.��Osystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/ConfiguredVariable.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass; use ScssPhp\ScssPhp\Util\SpanUtil; use SourceSpan\FileSpan; /** * A variable configured by a `with` clause in a `@use` or `@forward` rule. * * @internal */ final class ConfiguredVariable implements SassNode, SassDeclaration { private readonly string $name; private readonly Expression $expression; private readonly FileSpan $span; private readonly bool $guarded; public function __construct(string $name, Expression $expression, FileSpan $span, bool $guarded = false) { $this->name = $name; $this->expression = $expression; $this->span = $span; $this->guarded = $guarded; } public function getName(): string { return $this->name; } public function getExpression(): Expression { return $this->expression; } public function getSpan(): FileSpan { return $this->span; } public function isGuarded(): bool { return $this->guarded; } public function getNameSpan(): FileSpan { return SpanUtil::initialIdentifier($this->span, 1); } public function __toString(): string { return '$' . $this->name . ': ' . $this->expression . ($this->guarded ? ' !default' : ''); } } PKCA#]�-�zGsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Sass/Expression.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Sass; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; /** * A SassScript expression in a Sass syntax tree. * * @internal */ interface Expression extends SassNode { /** * @template T * @param ExpressionVisitor<T> $visitor * @return T */ public function accept(ExpressionVisitor $visitor); } PKCA#]Z3��N N Rsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/AttributeSelector.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Visitor\SelectorVisitor; use SourceSpan\FileSpan; /** * An attribute selector. * * This selects for elements with the given attribute, and optionally with a * value matching certain conditions as well. * * @internal */ final class AttributeSelector extends SimpleSelector { /** * The name of the attribute being selected for. */ private readonly QualifiedName $name; /** * The operator that defines the semantics of {@see value}. * * If this is `null`, this matches any element with the given property, * regardless of this value. It's `null` if and only if {@see value} is `null`. */ private readonly ?AttributeOperator $op; /** * An assertion about the value of {@see name}. * * The precise semantics of this string are defined by {@see op}. * * If this is `null`, this matches any element with the given property, * regardless of this value. It's `null` if and only if {@see op} is `null`. */ private readonly ?string $value; /** * The modifier which indicates how the attribute selector should be * processed. * * See for example [case-sensitivity][] modifiers. * * [case-sensitivity]: https://www.w3.org/TR/selectors-4/#attribute-case * * If {@see op} is `null`, this is always `null` as well. */ private readonly ?string $modifier; /** * Creates an attribute selector that matches any element with a property of * the given name. */ public static function create(QualifiedName $name, FileSpan $span): AttributeSelector { return new AttributeSelector($name, $span, null, null, null); } /** * Creates an attribute selector that matches an element with a property * named $name, whose value matches $value based on the semantics of $op. */ public static function withOperator(QualifiedName $name, ?AttributeOperator $op, ?string $value, FileSpan $span, ?string $modifier = null): AttributeSelector { return new AttributeSelector($name, $span, $op, $value, $modifier); } private function __construct(QualifiedName $name, FileSpan $span, ?AttributeOperator $op, ?string $value, ?string $modifier) { $this->name = $name; $this->op = $op; $this->value = $value; $this->modifier = $modifier; parent::__construct($span); } public function getName(): QualifiedName { return $this->name; } public function getOp(): ?AttributeOperator { return $this->op; } public function getValue(): ?string { return $this->value; } public function getModifier(): ?string { return $this->modifier; } public function accept(SelectorVisitor $visitor) { return $visitor->visitAttributeSelector($this); } public function equals(object $other): bool { return $other instanceof AttributeSelector && $other->name->equals($this->name) && $other->op === $this->op && $other->value === $this->value && $other->modifier === $this->modifier; } } PKCA#]�G���Nsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/ClassSelector.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Visitor\SelectorVisitor; use SourceSpan\FileSpan; /** * A class selector. * * This selects elements whose `class` attribute contains an identifier with * the given name. * * @internal */ final class ClassSelector extends SimpleSelector { /** * The class name this selects for. */ private readonly string $name; public function __construct(string $name, FileSpan $span) { $this->name = $name; parent::__construct($span); } public function getName(): string { return $this->name; } public function accept(SelectorVisitor $visitor) { return $visitor->visitClassSelector($this); } public function equals(object $other): bool { return $other instanceof ClassSelector && $other->name === $this->name; } public function addSuffix(string $suffix): SimpleSelector { return new ClassSelector($this->name . $suffix, $this->getSpan()); } } PKCA#]���&�&Osystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/PseudoSelector.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Visitor\SelectorVisitor; use SourceSpan\FileSpan; /** * A pseudo-class or pseudo-element selector. * * The semantics of a specific pseudo selector depends on its name. Some * selectors take arguments, including other selectors. Sass manually encodes * logic for each pseudo selector that takes a selector as an argument, to * ensure that extension and other selector operations work properly. * * @internal */ final class PseudoSelector extends SimpleSelector { /** * The name of this selector. */ private readonly string $name; /** * Like {@see name}, but without any vendor prefixes. */ private readonly string $normalizedName; private readonly bool $isClass; private readonly bool $isSyntacticClass; /** * The non-selector argument passed to this selector. * * This is `null` if there's no argument. If {@see argument} and {@see selector} are * both non-`null`, the selector follows the argument. */ private readonly ?string $argument; /** * The selector argument passed to this selector. * * This is `null` if there's no selector. If {@see argument} and {@see selector} are * both non-`null`, the selector follows the argument. */ private readonly ?SelectorList $selector; private ?int $specificity = null; public function __construct(string $name, FileSpan $span, bool $element = false, ?string $argument = null, ?SelectorList $selector = null) { $this->name = $name; $this->isClass = !$element && !self::isFakePseudoElement($name); $this->isSyntacticClass = !$element; $this->argument = $argument; $this->selector = $selector; $this->normalizedName = Util::unvendor($name); parent::__construct($span); } /** * Returns whether $name is the name of a pseudo-element that can be written * with pseudo-class syntax (`:before`, `:after`, `:first-line`, or * `:first-letter`) */ private static function isFakePseudoElement(string $name): bool { if ($name === '') { return false; } switch ($name[0]) { case 'a': case 'A': return strtolower($name) === 'after'; case 'b': case 'B': return strtolower($name) === 'before'; case 'f': case 'F': $lowerCasedName = strtolower($name); return $lowerCasedName === 'first-line' || $lowerCasedName === 'first-letter'; default: return false; } } public function getName(): string { return $this->name; } public function getNormalizedName(): string { return $this->normalizedName; } /** * Whether this is a pseudo-class selector. * * This is `true` if and only if {@see isElement} is `false`. */ public function isClass(): bool { return $this->isClass; } /** * Whether this is a pseudo-element selector. * * This is `true` if and only if {@see isClass} is `false`. */ public function isElement(): bool { return !$this->isClass; } /** * Whether this is syntactically a pseudo-class selector. * * This is the same as {@see isClass} unless this selector is a pseudo-element * that was written syntactically as a pseudo-class (`:before`, `:after`, * `:first-line`, or `:first-letter`). * * This is `true` if and only if {@see isSyntacticElement} is `false`. */ public function isSyntacticClass(): bool { return $this->isSyntacticClass; } /** * Whether this is syntactically a pseudo-element selector. * * This is `true` if and only if {@see isSyntacticClass} is `false`. */ public function isSyntacticElement(): bool { return !$this->isSyntacticClass; } /** * Whether this is a valid `:host` selector. * * @internal */ public function isHost(): bool { return $this->isClass && $this->name === 'host'; } /** * Whether this is a valid `:host-context` selector. * * @internal */ public function isHostContext(): bool { return $this->isClass && $this->name === 'host-context' && $this->selector !== null; } public function getArgument(): ?string { return $this->argument; } public function getSelector(): ?SelectorList { return $this->selector; } public function getSpecificity(): int { if ($this->specificity === null) { $this->specificity = $this->computeSpecificity(); } return $this->specificity; } /** * @internal */ public function hasComplicatedSuperselectorSemantics(): bool { return $this->isElement() || $this->selector !== null; } private function computeSpecificity(): int { if ($this->isElement()) { return 1; } $selector = $this->selector; if ($selector === null) { return parent::getSpecificity(); } // https://www.w3.org/TR/selectors-4/#specificity-rules switch ($this->normalizedName) { case 'where': return 0; case 'is': case 'not': case 'has': case 'matches': $maxSpecificity = 0; foreach ($selector->getComponents() as $complex) { $maxSpecificity = max($maxSpecificity, $complex->getSpecificity()); } return $maxSpecificity; case 'nth-child': case 'nth-last-child': $maxSpecificity = 0; foreach ($selector->getComponents() as $complex) { $maxSpecificity = max($maxSpecificity, $complex->getSpecificity()); } return parent::getSpecificity() + $maxSpecificity; default: return parent::getSpecificity(); } } public function withSelector(SelectorList $selector): PseudoSelector { return new PseudoSelector($this->name, $this->getSpan(), $this->isElement(), $this->argument, $selector); } public function addSuffix(string $suffix): SimpleSelector { if ($this->argument !== null || $this->selector !== null) { parent::addSuffix($suffix); } return new PseudoSelector($this->name . $suffix, $this->getSpan(), $this->isElement()); } public function unify(array $compound): ?array { if ($this->name === 'host' || $this->name === 'host-context') { foreach ($compound as $simple) { if (!$simple instanceof PseudoSelector || (!$simple->isHost() && $simple->selector === null)) { return null; } } } elseif (\count($compound) === 1) { $other = $compound[0]; if ($other instanceof UniversalSelector || $other instanceof PseudoSelector && ($other->isHost() || $other->isHostContext())) { return $other->unify([$this]); } } if (EquatableUtil::iterableContains($compound, $this)) { return $compound; } $result = []; $addedThis = false; foreach ($compound as $simple) { if ($simple instanceof PseudoSelector && $simple->isElement()) { // A given compound selector may only contain one pseudo element. If // $compound has a different one than $this, unification fails. if ($this->isElement()) { return null; } // Otherwise, this is a pseudo selector and should come before pseudo // elements. $result[] = $this; $addedThis = true; } $result[] = $simple; } if (!$addedThis) { $result[] = $this; } return $result; } public function isSuperselector(SimpleSelector $other): bool { if (parent::isSuperselector($other)) { return true; } $selector = $this->selector; if ($selector === null) { return $this === $other || $this->equals($other); } if ($other instanceof PseudoSelector && $this->isElement() && $other->isElement() && $this->normalizedName === 'slotted' && $other->name === $this->name) { if ($other->getSelector() !== null) { return $selector->isSuperselector($other->getSelector()); } return false; } // Fall back to the logic defined in ExtendUtil, which knows how to // compare selector pseudoclasses against raw selectors. return (new CompoundSelector([$this], $this->getSpan()))->isSuperselector(new CompoundSelector([$other], $this->getSpan())); } public function accept(SelectorVisitor $visitor) { return $visitor->visitPseudoSelector($this); } public function equals(object $other): bool { return $other instanceof PseudoSelector && $other->name === $this->name && $other->isClass === $this->isClass && $other->argument === $this->argument && ($this->selector === $other->selector || ($this->selector !== null && $other->selector !== null && $this->selector->equals($other->selector))); } } PKCA#]3�,5,5Msystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/SelectorList.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Ast\Css\CssValue; use ScssPhp\ScssPhp\Exception\MultiSpanSassException; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Exception\SimpleSassException; use ScssPhp\ScssPhp\Extend\ExtendUtil; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Parser\InterpolationMap; use ScssPhp\ScssPhp\Parser\SelectorParser; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Util\ListUtil; use ScssPhp\ScssPhp\Util\SpanUtil; use ScssPhp\ScssPhp\Value\ListSeparator; use ScssPhp\ScssPhp\Value\SassList; use ScssPhp\ScssPhp\Value\SassString; use ScssPhp\ScssPhp\Visitor\SelectorVisitor; use SourceSpan\FileSpan; /** * A selector list. * * A selector list is composed of {@see ComplexSelector}s. It matches any element * that matches any of the component selectors. * * @internal */ final class SelectorList extends Selector { /** * The components of this selector. * * This is never empty. * * @var non-empty-list<ComplexSelector> */ private readonly array $components; /** * Parses a selector list from $contents. * * If passed, $url is the name of the file from which $contents comes. If * $allowParent is false, this doesn't allow {@see ParentSelector}s. If * $plainCss is true, this parses the selector as plain CSS rather than * unresolved Sass. * * If passed, $interpolationMap maps the text of $contents back to the * original location of the selector in the source file. * * @throws SassFormatException if parsing fails. */ public static function parse(string $contents, ?LoggerInterface $logger = null, ?InterpolationMap $interpolationMap = null, ?UriInterface $url = null, bool $allowParent = true, bool $plainCss = false): SelectorList { return (new SelectorParser($contents, $logger, $url, $allowParent, $interpolationMap, $plainCss))->parse(); } /** * @param list<ComplexSelector> $components */ public function __construct(array $components, FileSpan $span) { if ($components === []) { throw new \InvalidArgumentException('components may not be empty.'); } $this->components = $components; parent::__construct($span); } /** * @return non-empty-list<ComplexSelector> */ public function getComponents(): array { return $this->components; } /** * Returns a SassScript list that represents this selector. * * This has the same format as a list returned by `selector-parse()`. */ public function asSassList(): SassList { return new SassList(array_map(static function (ComplexSelector $complex) { $result = []; foreach ($complex->getLeadingCombinators() as $combinator) { $result[] = new SassString($combinator, false); } foreach ($complex->getComponents() as $component) { $result[] = new SassString((string) $component->getSelector(), false); foreach ($component->getCombinators() as $combinator) { $result[] = new SassString($combinator, false); } } return new SassList($result, ListSeparator::SPACE); }, $this->components), ListSeparator::COMMA); } public function accept(SelectorVisitor $visitor) { return $visitor->visitSelectorList($this); } /** * Returns a {@see SelectorList} that matches only elements that are matched by * both this and $other. * * If no such list can be produced, returns `null`. */ public function unify(SelectorList $other): ?SelectorList { $contents = []; foreach ($this->components as $complex1) { foreach ($other->components as $complex2) { $unified = ExtendUtil::unifyComplex([$complex1, $complex2], $complex1->getSpan()); if ($unified === null) { continue; } foreach ($unified as $complex) { $contents[] = $complex; } } } return \count($contents) === 0 ? null : new SelectorList($contents, $this->getSpan()); } /** * Returns a new selector list that represents $this nested within $parent. * * By default, this replaces {@see ParentSelector}s in $this with $parent. If * $preserveParentSelectors is true, this instead preserves those selectors * as parent selectors. * * If $implicitParent is true, this prepends $parent to any * {@see ComplexSelector}s in this that don't contain explicit {@see ParentSelector}s, * or to _all_ {@see ComplexSelector}s if $preserveParentSelectors is true. * * The given $parent may be `null`, indicating that this has no parents. If * so, this list is returned as-is if it doesn't contain any explicit * {@see ParentSelector}s or if $preserveParentSelectors is true. Otherwise, this * throws a {@see SassScriptException}. */ public function nestWithin(?SelectorList $parent, bool $implicitParent = true, bool $preserveParentSelectors = false): SelectorList { if ($parent === null) { if ($preserveParentSelectors) { return $this; } $parentSelector = $this->accept(new ParentSelectorVisitor()); if ($parentSelector === null) { return $this; } throw new SimpleSassException('Top-level selectors may not contain the parent selector "&".', $parentSelector->getSpan()); } return new SelectorList(ListUtil::flattenVertically(array_map(function (ComplexSelector $complex) use ($parent, $implicitParent, $preserveParentSelectors) { if ($preserveParentSelectors || !self::containsParentSelector($complex)) { if (!$implicitParent) { return [$complex]; } return array_map(fn(ComplexSelector $parentComplex) => $parentComplex->concatenate($complex, $complex->getSpan()), $parent->getComponents()); } /** @var list<ComplexSelector> $newComplexes */ $newComplexes = []; foreach ($complex->getComponents() as $component) { $resolved = self::nestWithinCompound($component, $parent); if ($resolved === null) { if (\count($newComplexes) === 0) { $newComplexes[] = new ComplexSelector($complex->getLeadingCombinators(), [$component], $complex->getSpan(), false); } else { $newComplexes = array_map(fn ($newComplex) => $newComplex->withAdditionalComponent($component, $complex->getSpan()), $newComplexes); } } elseif (\count($newComplexes) === 0) { if (\count($complex->getLeadingCombinators()) === 0) { $newComplexes = $resolved; } else { $newComplexes = array_map(fn (ComplexSelector $resolvedComplex) => new ComplexSelector( array_merge($complex->getLeadingCombinators(), $resolvedComplex->getLeadingCombinators()), $resolvedComplex->getComponents(), $complex->getSpan(), $resolvedComplex->getLineBreak() ), $resolved); } } else { $previousComplexes = $newComplexes; $newComplexes = []; foreach ($previousComplexes as $newComplex) { foreach ($resolved as $resolvedComplex) { $newComplexes[] = $newComplex->concatenate($resolvedComplex, $newComplex->getSpan()); } } } } return $newComplexes; }, $this->components)), $this->getSpan()); } /** * Whether this is a superselector of $other. * * That is, whether this matches every element that $other matches, as well * as possibly additional elements. */ public function isSuperselector(SelectorList $other): bool { return ExtendUtil::listIsSuperselector($this->components, $other->components); } public function equals(object $other): bool { return $other instanceof SelectorList && EquatableUtil::listEquals($this->components, $other->components); } /** * Returns a new selector list based on $component with all * {@see ParentSelector}s replaced with $parent. * * Returns `null` if $component doesn't contain any {@see ParentSelector}s. * * @return list<ComplexSelector>|null */ private static function nestWithinCompound(ComplexSelectorComponent $component, SelectorList $parent): ?array { $simples = $component->getSelector()->getComponents(); $containsSelectorPseudo = false; foreach ($simples as $simple) { if (!$simple instanceof PseudoSelector) { continue; } $selector = $simple->getSelector(); if ($selector !== null && self::containsParentSelector($selector)) { $containsSelectorPseudo = true; break; } } if (!$containsSelectorPseudo && !$simples[0] instanceof ParentSelector) { return null; } if ($containsSelectorPseudo) { $resolvedSimples = array_map(function (SimpleSelector $simple) use ($parent): SimpleSelector { if (!$simple instanceof PseudoSelector) { return $simple; } $selector = $simple->getSelector(); if ($selector === null) { return $simple; } if (!self::containsParentSelector($selector)) { return $simple; } return $simple->withSelector($selector->nestWithin($parent, false)); }, $simples); } else { $resolvedSimples = $simples; } $parentSelector = $simples[0]; if (!$parentSelector instanceof ParentSelector) { return [ new ComplexSelector([], [ new ComplexSelectorComponent( new CompoundSelector($resolvedSimples, $component->getSelector()->getSpan()), $component->getCombinators(), $component->getSpan() ), ], $component->getSpan()), ]; } if (\count($simples) === 1 && $parentSelector->getSuffix() === null) { return $parent->withAdditionalCombinators($component->getCombinators())->getComponents(); } return array_map(function (ComplexSelector $complex) use ($parentSelector, $resolvedSimples, $component) { $lastComponent = $complex->getLastComponent(); if (\count($lastComponent->getCombinators()) !== 0) { throw new MultiSpanSassException("Selector \"$complex\" can't be used as a parent in a compound selector.", SpanUtil::trimRight($lastComponent->getSpan()), 'outer selector', ['parent selector' => $parentSelector->getSpan()]); } $suffix = $parentSelector->getSuffix(); $lastSimples = $lastComponent->getSelector()->getComponents(); if ($suffix !== null) { $last = new CompoundSelector(array_merge( ListUtil::exceptLast($lastSimples), [ListUtil::last($lastSimples)->addSuffix($suffix)], array_slice($resolvedSimples, 1) ), $component->getSelector()->getSpan()); } else { $last = new CompoundSelector(array_merge($lastSimples, array_slice($resolvedSimples, 1)), $component->getSelector()->getSpan()); } $components = ListUtil::exceptLast($complex->getComponents()); $components[] = new ComplexSelectorComponent($last, $component->getCombinators(), $component->getSpan()); return new ComplexSelector($complex->getLeadingCombinators(), $components, $component->getSpan(), $complex->getLineBreak()); }, $parent->getComponents()); } /** * Returns a copy of `this` with $combinators added to the end of each * complex selector in {@see components}]. * * @param list<CssValue<Combinator>> $combinators */ public function withAdditionalCombinators(array $combinators): SelectorList { if ($combinators === []) { return $this; } return new SelectorList(array_map(fn(ComplexSelector $complex) => $complex->withAdditionalCombinators($combinators), $this->components), $this->getSpan()); } /** * Returns whether $selector recursively contains a parent selector. */ private static function containsParentSelector(Selector $selector): bool { return $selector->accept(new ParentSelectorVisitor()) !== null; } } PKCA#]g�� Ysystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/ComplexSelectorComponent.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Ast\Css\CssValue; use ScssPhp\ScssPhp\Util\Equatable; use ScssPhp\ScssPhp\Util\EquatableUtil; use SourceSpan\FileSpan; /** * A component of a {@see ComplexSelector}. * * This a {@see CompoundSelector} with one or more trailing {@see Combinator}s. * * @internal */ final class ComplexSelectorComponent implements Equatable { /** * This component's compound selector. */ private readonly CompoundSelector $selector; /** * This selector's combinators. * * If this is empty, that indicates that it has an implicit descendent * combinator. If it's more than one element, that means it's invalid CSS; * however, we still support this for backwards-compatibility purposes. * * @var list<CssValue<Combinator>> */ private readonly array $combinators; private readonly FileSpan $span; /** * @param list<CssValue<Combinator>> $combinators */ public function __construct(CompoundSelector $selector, array $combinators, FileSpan $span) { $this->selector = $selector; $this->combinators = $combinators; $this->span = $span; } public function getSelector(): CompoundSelector { return $this->selector; } public function getSpan(): FileSpan { return $this->span; } /** * @return list<CssValue<Combinator>> */ public function getCombinators(): array { return $this->combinators; } public function equals(object $other): bool { return $other instanceof ComplexSelectorComponent && $this->selector->equals($other->selector) && EquatableUtil::listEquals($this->combinators, $other->combinators); } /** * Returns a copy of $this with $combinators added to the end of * `$this->combinators`. * * @param list<CssValue<Combinator>> $combinators */ public function withAdditionalCombinators(array $combinators): ComplexSelectorComponent { if ($combinators === []) { return $this; } return new ComplexSelectorComponent($this->selector, array_merge($this->combinators, $combinators), $this->span); } public function __toString(): string { return $this->selector . implode('', array_map(fn ($combinator) => ' ' . $combinator, $this->combinators)); } } PKCA#]{oOcPPSsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/IsInvisibleVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Visitor\AnySelectorVisitor; /** * The visitor used to implement {@see Selector::isInvisible}. * * @internal */ final class IsInvisibleVisitor extends AnySelectorVisitor { /** * Whether to consider selectors with bogus combinators invisible. */ private readonly bool $includeBogus; public function __construct(bool $includeBogus) { $this->includeBogus = $includeBogus; } public function visitSelectorList(SelectorList $list): bool { foreach ($list->getComponents() as $complex) { if (!$this->visitComplexSelector($complex)) { return false; } } return true; } public function visitComplexSelector(ComplexSelector $complex): bool { return parent::visitComplexSelector($complex) || ($this->includeBogus && $complex->isBogusOtherThanLeadingCombinator()); } public function visitPlaceholderSelector(PlaceholderSelector $placeholder): bool { return true; } public function visitPseudoSelector(PseudoSelector $pseudo): bool { $selector = $pseudo->getSelector(); if ($selector === null) { return false; } // We don't consider `:not(%foo)` to be invisible because, semantically, it // means "doesn't match this selector that matches nothing", so it's // equivalent to *. If the entire compound selector is composed of `:not`s // with invisible lists, the serializer emits it as `*`. return $pseudo->getName() === 'not' ? ($this->includeBogus && $selector->isBogus()) : $selector->accept($this); } } PKCA#]�"����Ksystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/Combinator.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; /** * A combinator that defines the relationship between selectors in a * {@see ComplexSelector}. * * @internal */ enum Combinator { /** * Matches the right-hand selector if it's immediately adjacent to the * left-hand selector in the DOM tree. */ case NEXT_SIBLING; /** * Matches the right-hand selector if it's a direct child of the left-hand * selector in the DOM tree. */ case CHILD; /** * Matches the right-hand selector if it comes after the left-hand selector * in the DOM tree. */ case FOLLOWING_SIBLING; public function getText(): string { return match ($this) { self::NEXT_SIBLING => '+', self::CHILD => '>', self::FOLLOWING_SIBLING => '~', }; } } PKCA#]��% Isystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/Selector.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Ast\AstNode; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\Exception\SassException; use ScssPhp\ScssPhp\Serializer\Serializer; use ScssPhp\ScssPhp\Util\Equatable; use ScssPhp\ScssPhp\Visitor\SelectorVisitor; use ScssPhp\ScssPhp\Warn; use SourceSpan\FileSpan; /** * A node in the abstract syntax tree for a selector. * * This selector tree is mostly plain CSS, but also may contain a * {@see ParentSelector} or a {@see PlaceholderSelector}. * * Selectors have structural equality semantics. * * @internal */ abstract class Selector implements AstNode, Equatable { private readonly FileSpan $span; public function __construct(FileSpan $span) { $this->span = $span; } public function getSpan(): FileSpan { return $this->span; } /** * Whether this selector, and complex selectors containing it, should not be * emitted. */ public function isInvisible(): bool { return $this->accept(new IsInvisibleVisitor(true)); } /** * Whether this selector would be invisible even if it didn't have bogus * combinators. */ public function isInvisibleOtherThanBogusCombinators(): bool { return $this->accept(new IsInvisibleVisitor(false)); } /** * Whether this selector is not valid CSS. * * This includes both selectors that are useful exclusively for build-time * nesting (`> .foo)` and selectors with invalid combinators that are still * supported for backwards-compatibility reasons (`.foo + ~ .bar`). */ public function isBogus(): bool { return $this->accept(new IsBogusVisitor(true)); } /** * Whether this selector is bogus other than having a leading combinator. */ public function isBogusOtherThanLeadingCombinator(): bool { return $this->accept(new IsBogusVisitor(false)); } /** * Whether this is a useless selector (that is, it's bogus _and_ it can't be * transformed into valid CSS by `@extend` or nesting). */ public function isUseless(): bool { return $this->accept(new IsUselessVisitor()); } /** * Prints a warning if $this is a bogus selector. * * This may only be called from within a custom Sass function. This will * throw a {@see SassException} in a future major version. */ public function assertNotBogus(?string $name = null): void { if (!$this->isBogus()) { return; } Warn::forDeprecation(($name === null ? '' : "\$$name: ") . "$this is not valid CSS.\nThis will be an error in Dart Sass 2.0.0.\n\nMore info: https://sass-lang.com/d/bogus-combinators", Deprecation::bogusCombinators); } /** * Calls the appropriate visit method on $visitor. * * @template T * * @param SelectorVisitor<T> $visitor * * @return T * * @internal */ abstract public function accept(SelectorVisitor $visitor); final public function __toString(): string { return Serializer::serializeSelector($this, true); } } PKCA#]W)6rqqOsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/ParentSelector.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Visitor\SelectorVisitor; use SourceSpan\FileSpan; /** * A selector that matches the parent in the Sass stylesheet. * * This is not a plain CSS selector—it should be removed before emitting a CSS * document. * * @internal */ final class ParentSelector extends SimpleSelector { /** * The suffix that will be added to the parent selector after it's been * resolved. * * This is assumed to be a valid identifier suffix. It may be `null`, * indicating that the parent selector will not be modified. */ private readonly ?string $suffix; public function __construct(FileSpan $span, ?string $suffix = null) { $this->suffix = $suffix; parent::__construct($span); } public function getSuffix(): ?string { return $this->suffix; } public function equals(object $other): bool { return $other === $this; } public function accept(SelectorVisitor $visitor) { return $visitor->visitParentSelector($this); } public function unify(array $compound): ?array { throw new \LogicException("& doesn't support unification."); } } PKCA#]�j���Osystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/IsBogusVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Visitor\AnySelectorVisitor; /** * The visitor used to implement {@see Selector::isBogus}. * * @internal */ final class IsBogusVisitor extends AnySelectorVisitor { /** * Whether to consider selectors with leading combinators as bogus. */ private readonly bool $includeLeadingCombinator; public function __construct(bool $includeLeadingCombinator) { $this->includeLeadingCombinator = $includeLeadingCombinator; } public function visitComplexSelector(ComplexSelector $complex): bool { if (\count($complex->getComponents()) === 0) { return \count($complex->getLeadingCombinators()) > 0; } if (\count($complex->getLeadingCombinators()) > ($this->includeLeadingCombinator ? 0 : 1) || count($complex->getLastComponent()->getCombinators()) !== 0) { return true; } foreach ($complex->getComponents() as $component) { if (\count($component->getCombinators()) > 1 || $component->getSelector()->accept($this)) { return true; } } return false; } public function visitPseudoSelector(PseudoSelector $pseudo): bool { $selector = $pseudo->getSelector(); if ($selector === null) { return false; } // The CSS spec specifically allows leading combinators in `:has()`. return $pseudo->getName() === 'has' ? $selector->isBogusOtherThanLeadingCombinator() : $selector->isBogus(); } } PKCA#]��uMF#F#Psystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/ComplexSelector.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Ast\Css\CssValue; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Extend\ExtendUtil; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Parser\SelectorParser; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Util\ListUtil; use ScssPhp\ScssPhp\Visitor\SelectorVisitor; use SourceSpan\FileSpan; /** * A complex selector. * * A complex selector is composed of {@see CompoundSelector}s separated by * {@see Combinator}s. It selects elements based on their parent selectors. * * @internal */ final class ComplexSelector extends Selector { /** * This selector's leading combinators. * * If this is empty, that indicates that it has no leading combinator. If * it's more than one element, that means it's invalid CSS; however, we still * support this for backwards-compatibility purposes. * * @var list<CssValue<Combinator>> */ private readonly array $leadingCombinators; /** * The components of this selector. * * This is only empty if {@see $leadingCombinators} is not empty. * * Descendant combinators aren't explicitly represented here. If two * {@see CompoundSelector}s are adjacent to one another, there's an implicit * descendant combinator between them. * * It's possible for multiple {@see Combinator}s to be adjacent to one another. * This isn't valid CSS, but Sass supports it for CSS hack purposes. * * @var list<ComplexSelectorComponent> */ private readonly array $components; /** * Whether a line break should be emitted *before* this selector. */ private readonly bool $lineBreak; private ?int $specificity = null; /** * @param list<CssValue<Combinator>> $leadingCombinators * @param list<ComplexSelectorComponent> $components */ public function __construct(array $leadingCombinators, array $components, FileSpan $span, bool $lineBreak = false) { if ($leadingCombinators === [] && $components === []) { throw new \InvalidArgumentException('leadingCombinators and components may not both be empty.'); } $this->leadingCombinators = $leadingCombinators; $this->components = $components; $this->lineBreak = $lineBreak; parent::__construct($span); } /** * Parses a complex selector from $contents. * * If passed, $url is the name of the file from which $contents comes. * $allowParent controls whether a {@see ParentSelector} is allowed in this * selector. * * @throws SassFormatException if parsing fails. */ public static function parse(string $contents, ?LoggerInterface $logger = null, ?UriInterface $url = null, bool $allowParent = true): ComplexSelector { return (new SelectorParser($contents, $logger, $url, $allowParent))->parseComplexSelector(); } /** * @return list<CssValue<Combinator>> */ public function getLeadingCombinators(): array { return $this->leadingCombinators; } /** * @return list<ComplexSelectorComponent> */ public function getComponents(): array { return $this->components; } /** * If this compound selector is composed of a single compound selector with * no combinators, returns it. * * Otherwise, returns null. * * @return CompoundSelector|null */ public function getSingleCompound(): ?CompoundSelector { if (\count($this->leadingCombinators) === 0 && \count($this->components) === 1 && \count($this->components[0]->getCombinators()) === 0) { return $this->components[0]->getSelector(); } return null; } public function getLastComponent(): ComplexSelectorComponent { if (\count($this->components) === 0) { throw new \OutOfBoundsException('Cannot get the last component of an empty list.'); } return $this->components[\count($this->components) - 1]; } public function getLineBreak(): bool { return $this->lineBreak; } /** * This selector's specificity. * * Specificity is represented in base 1000. The spec says this should be * "sufficiently high"; it's extremely unlikely that any single selector * sequence will contain 1000 simple selectors. */ public function getSpecificity(): int { if ($this->specificity === null) { $specificity = 0; foreach ($this->components as $component) { $specificity += $component->getSelector()->getSpecificity(); } $this->specificity = $specificity; } return $this->specificity; } public function accept(SelectorVisitor $visitor) { return $visitor->visitComplexSelector($this); } /** * Whether this is a superselector of $other. * * That is, whether this matches every element that $other matches, as well * as possibly additional elements. */ public function isSuperselector(ComplexSelector $other): bool { return \count($this->leadingCombinators) === 0 && \count($other->leadingCombinators) === 0 && ExtendUtil::complexIsSuperselector($this->components, $other->components); } public function equals(object $other): bool { return $other instanceof ComplexSelector && EquatableUtil::listEquals($this->leadingCombinators, $other->leadingCombinators) && EquatableUtil::listEquals($this->components, $other->components); } /** * Returns a copy of `$this` with $combinators added to the end of the final * component in {@see components}. * * If $forceLineBreak is `true`, this will mark the new complex selector as * having a line break. * * @param list<CssValue<Combinator>> $combinators */ public function withAdditionalCombinators(array $combinators, bool $forceLineBreak = false): ComplexSelector { if ($combinators === []) { return $this; } if ($this->components === []) { return new ComplexSelector(array_merge($this->leadingCombinators, $combinators), [], $this->getSpan(), $this->lineBreak || $forceLineBreak); } return new ComplexSelector( $this->leadingCombinators, array_merge( ListUtil::exceptLast($this->components), [ListUtil::last($this->components)->withAdditionalCombinators($combinators)] ), $this->getSpan(), $this->lineBreak || $forceLineBreak ); } /** * Returns a copy of `$this` with an additional $component added to the end. * * If $forceLineBreak is `true`, this will mark the new complex selector as * having a line break. */ public function withAdditionalComponent(ComplexSelectorComponent $component, FileSpan $span, bool $forceLineBreak = false): ComplexSelector { return new ComplexSelector($this->leadingCombinators, array_merge($this->components, [$component]), $span, $this->lineBreak || $forceLineBreak); } /** * Returns a copy of `this` with $child's combinators added to the end. * * If $child has {@see leadingCombinators}, they're appended to `this`'s last * combinator. This does _not_ resolve parent selectors. * * If $forceLineBreak is `true`, this will mark the new complex selector as * having a line break. */ public function concatenate(ComplexSelector $child, FileSpan $span, bool $forceLineBreak = false): ComplexSelector { if (\count($child->leadingCombinators) === 0) { return new ComplexSelector( $this->leadingCombinators, array_merge($this->components, $child->components), $span, $this->lineBreak || $child->lineBreak || $forceLineBreak ); } if (\count($this->components) === 0) { return new ComplexSelector( array_merge($this->leadingCombinators, $child->leadingCombinators), $child->components, $span, $this->lineBreak || $child->lineBreak || $forceLineBreak ); } return new ComplexSelector( $this->leadingCombinators, array_merge( ListUtil::exceptLast($this->components), [ListUtil::last($this->components)->withAdditionalCombinators($child->leadingCombinators)], $child->components ), $span, $this->lineBreak || $child->lineBreak || $forceLineBreak ); } } PKCA#]I���Qsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/IsUselessVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Visitor\AnySelectorVisitor; /** * The visitor used to implement {@see Selector::isUseless}. * * @internal */ final class IsUselessVisitor extends AnySelectorVisitor { public function visitComplexSelector(ComplexSelector $complex): bool { if (\count($complex->getLeadingCombinators()) > 1) { return true; } foreach ($complex->getComponents() as $component) { if (\count($component->getCombinators()) > 1 || $component->getSelector()->accept($this)) { return true; } } return false; } public function visitPseudoSelector(PseudoSelector $pseudo): bool { return $pseudo->isBogus(); } } PKCA#]���Tsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/PlaceholderSelector.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Util\Character; use ScssPhp\ScssPhp\Visitor\SelectorVisitor; use SourceSpan\FileSpan; /** * A placeholder selector. * * This doesn't match any elements. It's intended to be extended using * `@extend`. It's not a plain CSS selector—it should be removed before * emitting a CSS document. * * @internal */ final class PlaceholderSelector extends SimpleSelector { /** * The name of the placeholder. */ private readonly string $name; public function __construct(string $name, FileSpan $span) { $this->name = $name; parent::__construct($span); } public function getName(): string { return $this->name; } /** * Returns whether this is a private selector (that is, whether it begins * with `-` or `_`). */ public function isPrivate(): bool { return Character::isPrivate($this->name); } public function accept(SelectorVisitor $visitor) { return $visitor->visitPlaceholderSelector($this); } public function addSuffix(string $suffix): SimpleSelector { return new PlaceholderSelector($this->name . $suffix, $this->getSpan()); } public function equals(object $other): bool { return $other instanceof PlaceholderSelector && $other->name === $this->name; } } PKCA#]L��Rsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/AttributeOperator.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; /** * An operator that defines the semantics of an {@see AttributeSelector}. * * @internal */ enum AttributeOperator { /** * The attribute value exactly equals the given value. */ case EQUAL; /** * The attribute value is a whitespace-separated list of words, one of which * is the given value. */ case INCLUDE; /** * The attribute value is either exactly the given value, or starts with the * given value followed by a dash. */ case DASH; /** * The attribute value begins with the given value. */ case PREFIX; /** * The attribute value ends with the given value. */ case SUFFIX; /** * The attribute value contains the given value. */ case SUBSTRING; public function getText(): string { return match ($this) { self::EQUAL => '=', self::INCLUDE => '~=', self::DASH => '|=', self::PREFIX => '^=', self::SUFFIX => '$=', self::SUBSTRING => '*=', }; } } PKCA#]"��3kkMsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/TypeSelector.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Extend\ExtendUtil; use ScssPhp\ScssPhp\Visitor\SelectorVisitor; use SourceSpan\FileSpan; /** * A type selector. * * This selects elements whose name equals the given name. * * @internal */ final class TypeSelector extends SimpleSelector { /** * The element name being selected. */ private readonly QualifiedName $name; public function __construct(QualifiedName $name, FileSpan $span) { $this->name = $name; parent::__construct($span); } public function getName(): QualifiedName { return $this->name; } public function getSpecificity(): int { return 1; } public function accept(SelectorVisitor $visitor) { return $visitor->visitTypeSelector($this); } public function addSuffix(string $suffix): SimpleSelector { return new TypeSelector(new QualifiedName($this->name->getName() . $suffix, $this->name->getNamespace()), $this->getSpan()); } public function unify(array $compound): ?array { $first = $compound[0] ?? null; if ($first instanceof UniversalSelector || $first instanceof TypeSelector) { $unified = ExtendUtil::unifyUniversalAndElement($this, $first); if ($unified === null) { return null; } $compound[0] = $unified; return $compound; } return array_merge([$this], $compound); } public function isSuperselector(SimpleSelector $other): bool { return parent::isSuperselector($other) || ($other instanceof TypeSelector && $this->name->getName() === $other->getName()->getName() && ($this->name->getNamespace() === '*' || $this->name->getNamespace() === $other->getName()->getNamespace())); } public function equals(object $other): bool { return $other instanceof TypeSelector && $other->name->equals($this->name); } } PKCA#]��??Ksystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/IDSelector.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Visitor\SelectorVisitor; use SourceSpan\FileSpan; /** * An ID selector. * * This selects elements whose `id` attribute exactly matches the given name. * * @internal */ final class IDSelector extends SimpleSelector { /** * The ID name this selects for. */ private readonly string $name; public function __construct(string $name, FileSpan $span) { $this->name = $name; parent::__construct($span); } public function getName(): string { return $this->name; } public function getSpecificity(): int { return parent::getSpecificity() ** 2; } public function accept(SelectorVisitor $visitor) { return $visitor->visitIDSelector($this); } public function addSuffix(string $suffix): SimpleSelector { return new IDSelector($this->name . $suffix, $this->getSpan()); } public function unify(array $compound): ?array { // A given compound selector may only contain one ID. foreach ($compound as $simple) { if ($simple instanceof IDSelector && !$simple->equals($this)) { return null; } } return parent::unify($compound); } public function equals(object $other): bool { return $other instanceof IDSelector && $other->name === $this->name; } } PKCA#]u���Osystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/SimpleSelector.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Exception\MultiSpanSassException; use ScssPhp\ScssPhp\Exception\SassException; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Parser\SelectorParser; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Util\ListUtil; /** * An abstract superclass for simple selectors. * * @internal */ abstract class SimpleSelector extends Selector { /** * Names of pseudo-classes that take selectors as arguments, and that are * subselectors of their arguments. * * For example, `.foo` is a superselector of `:matches(.foo)`. */ private const SUBSELECTOR_PSEUDOS = [ 'is', 'matches', 'where', 'any', 'nth-child', 'nth-last-child', ]; /** * Parses a simple selector from $contents. * * If passed, $url is the name of the file from which $contents comes. * $allowParent controls whether a {@see ParentSelector} is allowed in this * selector. * * @throws SassFormatException if parsing fails. */ public static function parse(string $contents, ?LoggerInterface $logger = null, ?UriInterface $url = null, bool $allowParent = true): SimpleSelector { return (new SelectorParser($contents, $logger, $url, $allowParent))->parseSimpleSelector(); } /** * This selector's specificity. * * Specificity is represented in base 1000. The spec says this should be * "sufficiently high"; it's extremely unlikely that any single selector * sequence will contain 1000 simple selectors. */ public function getSpecificity(): int { return 1000; } /** * Whether this requires complex non-local reasoning to determine whether * it's a super- or sub-selector. * * This includes both pseudo-elements and pseudo-selectors that take * selectors as arguments. * * @internal */ public function hasComplicatedSuperselectorSemantics(): bool { return false; } /** * Returns a new {@see SimpleSelector} based on $this, as though it had been * written with $suffix at the end. * * Assumes $suffix is a valid identifier suffix. If this wouldn't produce a * valid SimpleSelector, throws an exception. * * @throws SassException */ public function addSuffix(string $suffix): SimpleSelector { throw new MultiSpanSassException("Invalid parent selector \"$this\"", $this->getSpan(), 'outer selector', []); } /** * Returns the components of a {@see CompoundSelector} that matches only elements * matched by both this and $compound. * * By default, this just returns a copy of $compound with this selector * added to the end, or returns the original array if this selector already * exists in it. * * Returns `null` if unification is impossible—for example, if there are * multiple ID selectors. * * @param list<SimpleSelector> $compound * * @return list<SimpleSelector>|null */ public function unify(array $compound): ?array { if (\count($compound) === 1) { $other = $compound[0]; if ($other instanceof UniversalSelector || $other instanceof PseudoSelector && ($other->isHost() || $other->isHostContext())) { return $other->unify([$this]); } } if (EquatableUtil::iterableContains($compound, $this)) { return $compound; } $result = []; $addedThis = false; foreach ($compound as $simple) { // Make sure pseudo selectors always come last. if (!$addedThis && $simple instanceof PseudoSelector) { $result[] = $this; $addedThis = true; } $result[] = $simple; } if (!$addedThis) { $result[] = $this; } return $result; } public function isSuperselector(SimpleSelector $other): bool { if ($this === $other || $this->equals($other)) { return true; } if ($other instanceof PseudoSelector && $other->isClass()) { $list = $other->getSelector(); if ($list !== null && \in_array($other->getNormalizedName(), self::SUBSELECTOR_PSEUDOS, true)) { foreach ($list->getComponents() as $complex) { if (\count($complex->getComponents()) === 0) { return false; } foreach (ListUtil::last($complex->getComponents())->getSelector()->getComponents() as $simple) { if ($this->isSuperselector($simple)) { continue 2; } } return false; } return true; } } return false; } } PKCA#]���Vsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/ParentSelectorVisitor.phpnu�[���<?php namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Visitor\SelectorSearchVisitor; /** * A visitor for finding the first {@see ParentSelector} in a given selector. * * @template-extends SelectorSearchVisitor<ParentSelector> * * @internal */ final class ParentSelectorVisitor extends SelectorSearchVisitor { public function visitParentSelector(ParentSelector $selector): ParentSelector { return $selector; } } PKCA#]� ����Nsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/QualifiedName.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Util\Equatable; /** * A [qualified name][]. * * [qualified name]: https://www.w3.org/TR/css3-namespace/#css-qnames * * @internal */ final class QualifiedName implements Equatable { /** * The identifier name. */ private readonly string $name; /** * The namespace name. * * If this is `null`, {@see name} belongs to the default namespace. If it's the * empty string, {@see name} belongs to no namespace. If it's `*`, {@see name} belongs * to any namespace. Otherwise, {@see name} belongs to the given namespace. */ private readonly ?string $namespace; public function __construct(string $name, ?string $namespace = null) { $this->name = $name; $this->namespace = $namespace; } public function getName(): string { return $this->name; } public function getNamespace(): ?string { return $this->namespace; } public function __toString(): string { return $this->namespace === null ? $this->name : $this->namespace . '|' . $this->name; } public function equals(object $other): bool { return $other instanceof QualifiedName && $other->name === $this->name && $other->namespace === $this->namespace; } } PKCA#]�K� � Rsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/UniversalSelector.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Extend\ExtendUtil; use ScssPhp\ScssPhp\Visitor\SelectorVisitor; use SourceSpan\FileSpan; /** * Matches any element in the given namespace. * * @internal */ final class UniversalSelector extends SimpleSelector { /** * The selector namespace. * * If this is `null`, this matches all elements in the default namespace. If * it's the empty string, this matches all elements that aren't in any * namespace. If it's `*`, this matches all elements in any namespace. * Otherwise, it matches all elements in the given namespace. */ private readonly ?string $namespace; public function __construct(FileSpan $span, ?string $namespace = null) { $this->namespace = $namespace; parent::__construct($span); } public function getNamespace(): ?string { return $this->namespace; } public function getSpecificity(): int { return 0; } public function accept(SelectorVisitor $visitor) { return $visitor->visitUniversalSelector($this); } public function unify(array $compound): ?array { $first = $compound[0] ?? null; if ($first instanceof UniversalSelector || $first instanceof TypeSelector) { $unified = ExtendUtil::unifyUniversalAndElement($this, $first); if ($unified === null) { return null; } $compound[0] = $unified; return $compound; } if (\count($compound) === 1 && $first instanceof PseudoSelector && ($first->isHost() || $first->isHostContext())) { return null; } if ($this->namespace !== null && $this->namespace !== '*') { return array_merge([$this], $compound); } // Not-empty compound list if ($first !== null) { return $compound; } return [$this]; } public function isSuperselector(SimpleSelector $other): bool { if ($this->namespace === '*') { return true; } if ($other instanceof TypeSelector) { return $this->namespace === $other->getName()->getNamespace(); } if ($other instanceof UniversalSelector) { return $this->namespace === $other->namespace; } return $this->namespace === null || parent::isSuperselector($other); } public function equals(object $other): bool { return $other instanceof UniversalSelector && $other->namespace === $this->namespace; } } PKCA#]ݟEEQsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Selector/CompoundSelector.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Extend\ExtendUtil; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Parser\SelectorParser; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Util\IterableUtil; use ScssPhp\ScssPhp\Visitor\SelectorVisitor; use SourceSpan\FileSpan; /** * A compound selector. * * A compound selector is composed of {@see SimpleSelector}s. It matches an element * that matches all of the component simple selectors. * * @internal */ final class CompoundSelector extends Selector { /** * The components of this selector. * * This is never empty. * * @var list<SimpleSelector> */ private readonly array $components; private ?int $specificity = null; private ?bool $complicatedSuperselectorSemantics = null; /** * Parses a compound selector from $contents. * * If passed, $url is the name of the file from which $contents comes. * $allowParent controls whether a {@see ParentSelector} is allowed in this * selector. * * @throws SassFormatException if parsing fails. */ public static function parse(string $contents, ?LoggerInterface $logger = null, ?UriInterface $url = null, bool $allowParent = true): CompoundSelector { return (new SelectorParser($contents, $logger, $url, $allowParent))->parseCompoundSelector(); } /** * @param list<SimpleSelector> $components */ public function __construct(array $components, FileSpan $span) { if ($components === []) { throw new \InvalidArgumentException('components may not be empty.'); } $this->components = $components; parent::__construct($span); } /** * @return list<SimpleSelector> */ public function getComponents(): array { return $this->components; } public function getLastComponent(): SimpleSelector { return $this->components[\count($this->components) - 1]; } /** * This selector's specificity. * * Specificity is represented in base 1000. The spec says this should be * "sufficiently high"; it's extremely unlikely that any single selector * sequence will contain 1000 simple selectors. */ public function getSpecificity(): int { if ($this->specificity === null) { $specificity = 0; foreach ($this->components as $component) { $specificity += $component->getSpecificity(); } $this->specificity = $specificity; } return $this->specificity; } /** * If this compound selector is composed of a single simple selector, returns * it. * * Otherwise, returns null. */ public function getSingleSimple(): ?SimpleSelector { return \count($this->components) === 1 ? $this->components[0] : null; } /** * Whether any simple selector in this contains a selector that requires * complex non-local reasoning to determine whether it's a super- or * sub-selector. * * This includes both pseudo-elements and pseudo-selectors that take * selectors as arguments. * * @internal */ public function hasComplicatedSuperselectorSemantics(): bool { return $this->complicatedSuperselectorSemantics ??= IterableUtil::any($this->components, fn (SimpleSelector $component) => $component->hasComplicatedSuperselectorSemantics()); } public function accept(SelectorVisitor $visitor) { return $visitor->visitCompoundSelector($this); } /** * Whether this is a superselector of $other. * * That is, whether this matches every element that $other matches, as well * as possibly additional elements. */ public function isSuperselector(CompoundSelector $other): bool { return ExtendUtil::compoundIsSuperselector($this, $other); } public function equals(object $other): bool { return $other instanceof CompoundSelector && EquatableUtil::listEquals($this->components, $other->components); } } PKCA#]�^� ��Osystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssImport.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\Visitor\ModifiableCssVisitor; use SourceSpan\FileSpan; /** * A modifiable version of {@see CssImport} for use in the evaluation step. * * @internal */ final class ModifiableCssImport extends ModifiableCssNode implements CssImport { /** * The URL being imported. * * This includes quotes. * * @var CssValue<string> */ private readonly CssValue $url; /** * @var CssValue<string>|null */ private readonly ?CssValue $modifiers; private readonly FileSpan $span; /** * @param CssValue<string> $url * @param CssValue<string>|null $modifiers */ public function __construct(CssValue $url, FileSpan $span, ?CssValue $modifiers = null) { $this->url = $url; $this->modifiers = $modifiers; $this->span = $span; } public function getUrl(): CssValue { return $this->url; } public function getModifiers(): ?CssValue { return $this->modifiers; } public function getSpan(): FileSpan { return $this->span; } public function accept(ModifiableCssVisitor $visitor) { return $visitor->visitCssImport($this); } } PKCA#]�9���Lsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/CssKeyframeBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; /** * A block within a `@keyframes` rule. * * For example, `10% {opacity: 0.5}`. * * @internal */ interface CssKeyframeBlock extends CssParentNode { /** * The selector for this block. * * @return CssValue<list<string>> */ public function getSelector(): CssValue; } PKCA#]!5���Hsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/CssStyleRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\Ast\Selector\SelectorList; /** * A plain CSS style rule. * * * * This applies style declarations to elements that match a given selector. * * Note that this isn't *strictly* plain CSS, since {@see getSelector} may still * * contain placeholder selectors. * * @internal */ interface CssStyleRule extends CssParentNode { /** * The selector for this rule. */ public function getSelector(): SelectorList; /** * The selector for this rule, before any extensions were applied. */ public function getOriginalSelector(): SelectorList; /** * Whether this style rule was originally defined in a plain CSS stylesheet. * * @internal */ public function isFromPlainCss(): bool; } PKCA#]���m m Jsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/CssDeclaration.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\StackTrace\Trace; use ScssPhp\ScssPhp\Value\Value; use SourceSpan\FileSpan; /** * A plain CSS declaration (that is, a `name: value` pair). * * @internal */ interface CssDeclaration extends CssNode { /** * The name of this declaration. * * @return CssValue<string> */ public function getName(): CssValue; /** * The value of this declaration. * * @return CssValue<Value> */ public function getValue(): CssValue; /** * A list of style rules that appeared before this declaration in the Sass * input but after it in the CSS output. * * These are used to emit mixed declaration deprecation warnings during * serialization, so we can check based on specificity whether the warnings * are really necessary without worrying about `@extend` potentially changing * things up. * * @return list<CssStyleRule> */ public function getInterleavedRules(): array; /** * The stack trace indicating where this node was created. * * This is used to emit interleaved declaration warnings, and only needs to be set if * {@see getInterleavedRules} isn't empty. */ public function getTrace(): ?Trace; /** * The span for {@see getValue} that should be emitted to the source map. * * When the declaration's expression is just a variable, this is the span * where that variable was declared whereas `$this->getValue()->getSpan()` is the span where * the variable was used. Otherwise, this is identical to `$this->getValue()->getSpan()`. */ public function getValueSpanForMap(): FileSpan; /** * Returns whether this is a CSS Custom Property declaration. */ public function isCustomProperty(): bool; /** * Whether this was originally parsed as a custom property declaration, as * opposed to using something like `#{--foo}: ...` to cause it to be parsed * as a normal Sass declaration. * * If this is `true`, {@see isCustomProperty} will also be `true` and {@see getValue} will * contain a {@see SassString}. */ public function isParsedAsCustomProperty(): bool; } PKCA#]k�m��Ssystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssParentNode.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; /** * A modifiable version of {@see CssParentNode} for use in the evaluation step. * * @internal */ abstract class ModifiableCssParentNode extends ModifiableCssNode implements CssParentNode { /** * @var list<ModifiableCssNode> */ private array $children; /** * @param list<ModifiableCssNode> $children */ public function __construct(array $children = []) { $this->children = $children; } /** * @return list<ModifiableCssNode> */ public function getChildren(): array { return $this->children; } public function isChildless(): bool { return false; } /** * Returns whether $this is equal to $other, ignoring their child nodes. */ abstract public function equalsIgnoringChildren(ModifiableCssNode $other): bool; /** * Returns a copy of $this with an empty {@see children} list. * * This is *not* a deep copy. If other parts of this node are modifiable, * they are shared between the new and old nodes. */ abstract public function copyWithoutChildren(): ModifiableCssParentNode; public function addChild(ModifiableCssNode $child): void { $child->setParent($this, \count($this->children)); $this->children[] = $child; } /** * @internal */ public function removeChildAt(int $index): void { array_splice($this->children, $index, 1); } /** * Destructively removes all elements from {@see children}. */ public function clearChildren(): void { foreach ($this->children as $child) { $child->resetParentReferences(); } $this->children = []; } } PKCA#]i�+��Nsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/IsInvisibleVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\Visitor\EveryCssVisitor; /** * The visitor used to implement {@see CssNode::isInvisible} * * @internal */ final class IsInvisibleVisitor extends EveryCssVisitor { /** * Whether to consider selectors with bogus combinators invisible. */ private readonly bool $includeBogus; /** * Whether to consider comments invisible. */ private readonly bool $includeComments; public function __construct(bool $includeBogus, bool $includeComments) { $this->includeBogus = $includeBogus; $this->includeComments = $includeComments; } public function visitCssAtRule(CssAtRule $node): bool { // An unknown at-rule is never invisible. Because we don't know the semantics // of unknown rules, we can't guarantee that (for example) `@foo {}` isn't // meaningful. return false; } public function visitCssComment(CssComment $node): bool { return $this->includeComments && !$node->isPreserved(); } public function visitCssStyleRule(CssStyleRule $node): bool { return ($this->includeBogus ? $node->getSelector()->isInvisible() : $node->getSelector()->isInvisibleOtherThanBogusCombinators()) || parent::visitCssStyleRule($node); } } PKCA#]ѥ�=77Esystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/CssAtRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; /** * An unknown plain CSS at-rule. * * @internal */ interface CssAtRule extends CssParentNode { /** * The name of this rule. * * @return CssValue<string> */ public function getName(): CssValue; /** * The value of this rule. * * @return CssValue<string>|null */ public function getValue(): ?CssValue; } PKCA#]�=Isystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/CssParentNode.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; /** * A {@see CssNode} that can have child statements. * * @internal */ interface CssParentNode extends CssNode { /** * The child statements of this node. * * @return list<CssNode> */ public function getChildren(): array; /** * Whether the rule has no children and should be emitted without curly * braces. * * This implies `children.isEmpty`, but the reverse is not true—for a rule * like `@foo {}`, {@see getChildren} is empty but {@see isChildless} is `false`. */ public function isChildless(): bool; } PKCA#]�D����Hsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/CssMediaRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; /** * A plain CSS `@media` rule. * * @internal */ interface CssMediaRule extends CssParentNode { /** * The queries for this rule. * * This is never empty. * * @return list<CssMediaQuery> */ public function getQueries(): array; } PKCA#]@~�Usystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssSupportsRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Visitor\ModifiableCssVisitor; use SourceSpan\FileSpan; /** * A modifiable version of {@see CssSupportsRule} for use in the evaluation step. * * @internal */ final class ModifiableCssSupportsRule extends ModifiableCssParentNode implements CssSupportsRule { /** * @var CssValue<string> */ private readonly CssValue $condition; private readonly FileSpan $span; /** * @param CssValue<string> $condition */ public function __construct(CssValue $condition, FileSpan $span) { parent::__construct(); $this->condition = $condition; $this->span = $span; } public function getCondition(): CssValue { return $this->condition; } public function getSpan(): FileSpan { return $this->span; } public function accept(ModifiableCssVisitor $visitor) { return $visitor->visitCssSupportsRule($this); } public function equalsIgnoringChildren(ModifiableCssNode $other): bool { return $other instanceof ModifiableCssSupportsRule && EquatableUtil::equals($this->condition, $other->condition); } public function copyWithoutChildren(): ModifiableCssSupportsRule { return new ModifiableCssSupportsRule($this->condition, $this->span); } } PKCA#]�nVp��Csystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/CssNode.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\Ast\AstNode; use ScssPhp\ScssPhp\Visitor\CssVisitor; /** * A statement in a plain CSS syntax tree. * * @internal */ interface CssNode extends AstNode { /** * The node that contains this, or `null` for the root {@see CssStylesheet} node. */ public function getParent(): ?CssParentNode; /** * Whether this was generated from the last node in a nested Sass tree that * got flattened during evaluation. */ public function isGroupEnd(): bool; /** * Calls the appropriate visit method on $visitor. * * @template T * * @param CssVisitor<T> $visitor * * @return T */ public function accept(CssVisitor $visitor); /** * Whether this is invisible and won't be emitted to the compiled stylesheet. * * Note that this doesn't consider nodes that contain loud comments to be * invisible even though they're omitted in compressed mode. */ public function isInvisible(): bool; /** * Whether this node would be invisible even if style rule selectors within it * didn't have bogus combinators. * * Note that this doesn't consider nodes that contain loud comments to be * invisible even though they're omitted in compressed mode. */ public function isInvisibleOtherThanBogusCombinators(): bool; /** * Whether this node will be invisible when loud comments are stripped. */ public function isInvisibleHidingComments(): bool; } PKCA#]��7B��Tsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssDeclaration.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\StackTrace\Trace; use ScssPhp\ScssPhp\Value\SassString; use ScssPhp\ScssPhp\Value\Value; use ScssPhp\ScssPhp\Visitor\ModifiableCssVisitor; use SourceSpan\FileSpan; /** * A modifiable version of {@see CssDeclaration} for use in the evaluation step. * * @internal */ final class ModifiableCssDeclaration extends ModifiableCssNode implements CssDeclaration { /** * @var CssValue<string> */ private readonly CssValue $name; /** * @var CssValue<Value> */ private readonly CssValue $value; /** * @var list<CssStyleRule> */ private readonly array $interleavedRules; private readonly ?Trace $trace; private readonly bool $parsedAsCustomProperty; private readonly FileSpan $valueSpanForMap; private readonly FileSpan $span; /** * @param CssValue<string> $name * @param CssValue<Value> $value * @param list<CssStyleRule> $interleavedRules */ public function __construct(CssValue $name, CssValue $value, FileSpan $span, bool $parsedAsCustomProperty, array $interleavedRules = [], ?Trace $trace = null, ?FileSpan $valueSpanForMap = null) { $this->name = $name; $this->value = $value; $this->parsedAsCustomProperty = $parsedAsCustomProperty; $this->interleavedRules = $interleavedRules; $this->trace = $trace; $this->valueSpanForMap = $valueSpanForMap ?? $value->getSpan(); $this->span = $span; if ($parsedAsCustomProperty) { if (!$this->isCustomProperty()) { throw new \InvalidArgumentException('parsedAsCustomProperty must be false if name doesn\'t begin with "--".'); } if (!$value->getValue() instanceof SassString) { throw new \InvalidArgumentException(sprintf('If parsedAsCustomProperty is true, value must contain a SassString (was %s).', get_debug_type($value->getValue()))); } } } public function getName(): CssValue { return $this->name; } public function getValue(): CssValue { return $this->value; } public function getInterleavedRules(): array { return $this->interleavedRules; } public function getTrace(): ?Trace { return $this->trace; } public function isParsedAsCustomProperty(): bool { return $this->parsedAsCustomProperty; } public function getValueSpanForMap(): FileSpan { return $this->valueSpanForMap; } public function getSpan(): FileSpan { return $this->span; } public function isCustomProperty(): bool { return str_starts_with($this->name->getValue(), '--'); } public function accept(ModifiableCssVisitor $visitor) { return $visitor->visitCssDeclaration($this); } } PKCA#]ښr���Ksystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/CssSupportsRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; /** * A plain CSS `@supports` rule. * * @internal */ interface CssSupportsRule extends CssParentNode { /** * The supports condition. * * @return CssValue<string> */ public function getCondition(): CssValue; } PKCA#]sA�66Msystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssNode.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\Serializer\Serializer; use ScssPhp\ScssPhp\Visitor\ModifiableCssVisitor; /** * A modifiable version of {@see CssNode}. * * Almost all CSS nodes are the modifiable classes under the covers. However, * modification should only be done within the evaluation step, so the * unmodifiable types are used elsewhere to enforce that constraint. * * @internal */ abstract class ModifiableCssNode implements CssNode { private ?ModifiableCssParentNode $parent = null; /** * The index of `$this` in parent's children. * * This makes {@see remove} more efficient. */ private ?int $indexInParent = null; private bool $groupEnd = false; public function getParent(): ?ModifiableCssParentNode { return $this->parent; } protected function setParent(ModifiableCssParentNode $parent, int $indexInParent): void { $this->parent = $parent; $this->indexInParent = $indexInParent; } public function isGroupEnd(): bool { return $this->groupEnd; } public function setGroupEnd(bool $groupEnd): void { $this->groupEnd = $groupEnd; } /** * Whether this node has a visible sibling after it. */ public function hasFollowingSibling(): bool { $parent = $this->parent; if ($parent === null) { return false; } assert($this->indexInParent !== null); $siblings = $parent->getChildren(); for ($i = $this->indexInParent + 1; $i < \count($siblings); $i++) { $sibling = $siblings[$i]; if (!$sibling->isInvisible()) { return true; } } return false; } public function isInvisible(): bool { return $this->accept(new IsInvisibleVisitor(true, false)); } public function isInvisibleOtherThanBogusCombinators(): bool { return $this->accept(new IsInvisibleVisitor(false, false)); } public function isInvisibleHidingComments(): bool { return $this->accept(new IsInvisibleVisitor(true, true)); } /** * Calls the appropriate visit method on $visitor. * * @template T * * @param ModifiableCssVisitor<T> $visitor * * @return T */ abstract public function accept(ModifiableCssVisitor $visitor); /** * Removes $this from {@see parent}'s child list. * * @throws \LogicException if {@see parent} is `null`. */ public function remove(): void { $parent = $this->parent; if ($parent === null) { throw new \LogicException("Can't remove a node without a parent."); } assert($this->indexInParent !== null); $parent->removeChildAt($this->indexInParent); $children = $parent->getChildren(); for ($i = $this->indexInParent; $i < \count($children); $i++) { $child = $children[$i]; assert($child->indexInParent !== null); $child->indexInParent = $child->indexInParent - 1; } $this->parent = null; $this->indexInParent = null; } /** * @internal */ protected function resetParentReferences(): void { $this->parent = null; $this->indexInParent = null; } public function __toString(): string { return Serializer::serialize($this, true)->css; } } PKCA#]Pk<���Rsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssStyleRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\Ast\Selector\SelectorList; use ScssPhp\ScssPhp\Util\Box; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Visitor\ModifiableCssVisitor; use SourceSpan\FileSpan; /** * A modifiable version of {@see CssStyleRule} for use in the evaluation step. * * @internal */ final class ModifiableCssStyleRule extends ModifiableCssParentNode implements CssStyleRule { /** * A reference to the modifiable selector list provided by the extension * store, which may update it over time as new extensions are applied. * * @var Box<SelectorList> */ private readonly Box $selector; private readonly SelectorList $originalSelector; private readonly FileSpan $span; private readonly bool $fromPlainCss; /** * @param Box<SelectorList> $selector */ public function __construct(Box $selector, FileSpan $span, ?SelectorList $originalSelector = null, bool $fromPlainCss = false) { parent::__construct(); $this->selector = $selector; $this->originalSelector = $originalSelector ?? $selector->getValue(); $this->span = $span; $this->fromPlainCss = $fromPlainCss; } public function getSelector(): SelectorList { return $this->selector->getValue(); } public function getOriginalSelector(): SelectorList { return $this->originalSelector; } public function isFromPlainCss(): bool { return $this->fromPlainCss; } public function getSpan(): FileSpan { return $this->span; } public function accept(ModifiableCssVisitor $visitor) { return $visitor->visitCssStyleRule($this); } public function equalsIgnoringChildren(ModifiableCssNode $other): bool { return $other instanceof ModifiableCssStyleRule && EquatableUtil::equals($this->selector, $other->selector); } public function copyWithoutChildren(): ModifiableCssStyleRule { return new ModifiableCssStyleRule($this->selector, $this->span, $this->originalSelector); } } PKCA#]n'j���Ssystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssStylesheet.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\Visitor\ModifiableCssVisitor; use SourceSpan\FileSpan; /** * A modifiable version of {@see CssStylesheet} for use in the evaluation step. * * @internal */ final class ModifiableCssStylesheet extends ModifiableCssParentNode implements CssStylesheet { private readonly FileSpan $span; /** * @param list<ModifiableCssNode> $children */ public function __construct(FileSpan $span, array $children = []) { parent::__construct($children); $this->span = $span; } public function getSpan(): FileSpan { return $this->span; } public function accept(ModifiableCssVisitor $visitor) { return $visitor->visitCssStylesheet($this); } public function equalsIgnoringChildren(ModifiableCssNode $other): bool { return $other instanceof ModifiableCssStylesheet; } public function copyWithoutChildren(): ModifiableCssStylesheet { return new ModifiableCssStylesheet($this->span); } } PKCA#]35wPsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssComment.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\Visitor\ModifiableCssVisitor; use SourceSpan\FileSpan; /** * A modifiable version of {@see CssComment} for use in the evaluation step. * * @internal */ final class ModifiableCssComment extends ModifiableCssNode implements CssComment { private readonly string $text; private readonly FileSpan $span; public function __construct(string $text, FileSpan $span) { $this->text = $text; $this->span = $span; } public function getText(): string { return $this->text; } public function getSpan(): FileSpan { return $this->span; } public function isPreserved(): bool { return $this->text[2] === '!'; } public function accept(ModifiableCssVisitor $visitor) { return $visitor->visitCssComment($this); } } PKCA#]��v���Osystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssAtRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Visitor\ModifiableCssVisitor; use SourceSpan\FileSpan; /** * A modifiable version of {@see CssAtRule} for use in the evaluation step. * * @internal */ final class ModifiableCssAtRule extends ModifiableCssParentNode implements CssAtRule { /** * @var CssValue<string> */ private readonly CssValue $name; /** * @var CssValue<string>|null */ private readonly ?CssValue $value; private readonly bool $childless; private readonly FileSpan $span; /** * @param CssValue<string> $name * @param CssValue<string>|null $value */ public function __construct(CssValue $name, FileSpan $span, bool $childless = false, ?CssValue $value = null) { parent::__construct(); $this->name = $name; $this->value = $value; $this->childless = $childless; $this->span = $span; } public function getName(): CssValue { return $this->name; } public function getValue(): ?CssValue { return $this->value; } public function isChildless(): bool { return $this->childless; } public function getSpan(): FileSpan { return $this->span; } public function accept(ModifiableCssVisitor $visitor) { return $visitor->visitCssAtRule($this); } public function equalsIgnoringChildren(ModifiableCssNode $other): bool { return $other instanceof ModifiableCssAtRule && EquatableUtil::equals($this->name, $other->name) && EquatableUtil::equals($this->value, $other->value) && $this->childless === $other->childless; } public function copyWithoutChildren(): ModifiableCssAtRule { return new ModifiableCssAtRule($this->name, $this->span, $this->childless, $this->value); } public function addChild(ModifiableCssNode $child): void { if ($this->childless) { throw new \LogicException('Cannot add a child in a childless at-rule.'); } parent::addChild($child); } } PKCA#]��]�SSZsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/MediaQuerySingletonMergeResult.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; /** * @internal */ enum MediaQuerySingletonMergeResult implements MediaQueryMergeResult { case empty; case unrepresentable; } PKCA#]f�x�yyIsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/CssStylesheet.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; /** * A plain CSS stylesheet. * * This is the root plain CSS node. It contains top-level statements. * * @internal */ interface CssStylesheet extends CssParentNode { } PKCA#]��E�{{Qsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/MediaQueryMergeResult.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use JiriPudil\SealedClasses\Sealed; /** * @internal */ #[Sealed(permits: [CssMediaQuery::class, MediaQuerySingletonMergeResult::class])] interface MediaQueryMergeResult { } PKCA#]���__Dsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/CssValue.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\Ast\AstNode; use ScssPhp\ScssPhp\Ast\Selector\Combinator; use ScssPhp\ScssPhp\Util\Equatable; use ScssPhp\ScssPhp\Util\EquatableUtil; use SourceSpan\FileSpan; /** * A value in a plain CSS tree. * * This is used to associate a span with a value that doesn't otherwise track * its span. It has value equality semantics. * * @template-covariant T of string|\Stringable|array<string|\Stringable>|Combinator|null * * @internal */ final class CssValue implements AstNode, Equatable { /** * @var T */ private readonly mixed $value; private readonly FileSpan $span; /** * @param T $value */ public function __construct(mixed $value, FileSpan $span) { $this->value = $value; $this->span = $span; } /** * @return T */ public function getValue(): mixed { return $this->value; } public function getSpan(): FileSpan { return $this->span; } public function equals(object $other): bool { return $other instanceof CssValue && EquatableUtil::equals($this->value, $other->value); } public function __toString(): string { if ($this->value instanceof Combinator) { return $this->value->getText(); } if (\is_array($this->value)) { return implode($this->value); } return (string) $this->value; } } PKCA#]�u�P99Vsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssKeyframeBlock.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Visitor\ModifiableCssVisitor; use SourceSpan\FileSpan; /** * A modifiable version of {@see CssKeyframeBlock} for use in the evaluation step. * * @internal */ final class ModifiableCssKeyframeBlock extends ModifiableCssParentNode implements CssKeyframeBlock { /** * @var CssValue<list<string>> */ private readonly CssValue $selector; private readonly FileSpan $span; /** * @param CssValue<list<string>> $selector */ public function __construct(CssValue $selector, FileSpan $span) { parent::__construct(); $this->selector = $selector; $this->span = $span; } public function getSelector(): CssValue { return $this->selector; } public function getSpan(): FileSpan { return $this->span; } public function accept(ModifiableCssVisitor $visitor) { return $visitor->visitCssKeyframeBlock($this); } public function equalsIgnoringChildren(ModifiableCssNode $other): bool { return $other instanceof ModifiableCssKeyframeBlock && EquatableUtil::listEquals($this->selector->getValue(), $other->selector->getValue()); } public function copyWithoutChildren(): ModifiableCssKeyframeBlock { return new ModifiableCssKeyframeBlock($this->selector, $this->span); } } PKCA#]� ���Rsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssMediaRule.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Visitor\ModifiableCssVisitor; use SourceSpan\FileSpan; /** * A modifiable version of {@see CssMediaRule} for use in the evaluation step. * * @internal */ final class ModifiableCssMediaRule extends ModifiableCssParentNode implements CssMediaRule { /** * @var list<CssMediaQuery> */ private readonly array $queries; private readonly FileSpan $span; /** * @param list<CssMediaQuery> $queries */ public function __construct(array $queries, FileSpan $span) { parent::__construct(); $this->queries = $queries; $this->span = $span; } public function getQueries(): array { return $this->queries; } public function getSpan(): FileSpan { return $this->span; } public function accept(ModifiableCssVisitor $visitor) { return $visitor->visitCssMediaRule($this); } public function equalsIgnoringChildren(ModifiableCssNode $other): bool { return $other instanceof ModifiableCssMediaRule && EquatableUtil::listEquals($this->queries, $other->queries); } public function copyWithoutChildren(): ModifiableCssMediaRule { return new ModifiableCssMediaRule($this->queries, $this->span); } } PKCA#]r��Ӆ�Esystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/CssImport.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; /** * A plain CSS `@import`. * * @internal */ interface CssImport extends CssNode { /** * The URL being imported. * * This includes quotes. * * @return CssValue<string> */ public function getUrl(): CssValue; /** * The modifiers (such as media or supports queries) attached to this import. * * @return CssValue<string>|null */ public function getModifiers(): ?CssValue; } PKCA#]���hhFsystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/CssComment.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; /** * A plain CSS comment. * * This is always a multi-line comment. * * @internal */ interface CssComment extends CssNode { /** * The contents of this comment, including `/*` and `* /`. */ public function getText(): string; /** * Whether this comment starts with `/*!` and so should be preserved even in * compressed mode. */ public function isPreserved(): bool; } PKCA#]Z=�?##Isystem/helixultimate/vendor/scssphp/scssphp/src/Ast/Css/CssMediaQuery.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Css; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Parser\InterpolationMap; use ScssPhp\ScssPhp\Parser\MediaQueryParser; use ScssPhp\ScssPhp\Util\Equatable; /** * A plain CSS media query, as used in `@media` and `@import`. * * @internal */ final class CssMediaQuery implements MediaQueryMergeResult, Equatable { /** * The modifier, probably either "not" or "only". * * This may be `null` if no modifier is in use. */ private readonly ?string $modifier; /** * The media type, for example "screen" or "print". * * This may be `null`. If so, {@see $conditions} will not be empty. */ private readonly ?string $type; /** * Whether {@see $conditions} is a conjunction or a disjunction. * * In other words, if this is `true` this query matches when _all_ * {@see $conditions} are met, and if it's `false` this query matches when _any_ * condition in {@see $conditions} is met. * * If this is `false`, {@see $modifier} and {@see $type} will both be `null`. */ private readonly bool $conjunction; /** * Media conditions, including parentheses. * * This is anything that can appear in the [`<media-in-parens>`] production. * * [`<media-in-parens>`]: https://drafts.csswg.org/mediaqueries-4/#typedef-media-in-parens * * @var list<string> */ private readonly array $conditions; /** * Parses a media query from $contents. * * If passed, $url is the name of the file from which $contents comes. * * @return list<CssMediaQuery> * * @throws SassFormatException if parsing fails */ public static function parseList(string $contents, ?LoggerInterface $logger = null, ?UriInterface $url = null, ?InterpolationMap $interpolationMap = null): array { return (new MediaQueryParser($contents, $logger, $url, $interpolationMap))->parse(); } /** * @param list<string> $conditions */ private function __construct(array $conditions = [], bool $conjunction = true, ?string $type = null, ?string $modifier = null) { $this->modifier = $modifier; $this->type = $type; $this->conditions = $conditions; $this->conjunction = $conjunction; } /** * Creates a media query specifies a type and, optionally, conditions. * * This always sets {@see $conjunction} to `true`. * * @param list<string> $conditions */ public static function type(?string $type, ?string $modifier = null, array $conditions = []): CssMediaQuery { return new CssMediaQuery($conditions, true, $type, $modifier); } /** * Creates a media query that matches $conditions according to * $conjunction. * * The $conjunction argument may not be null if $conditions is longer than * a single element. * * @param list<string> $conditions */ public static function condition(array $conditions, ?bool $conjunction = null): CssMediaQuery { if (\count($conditions) > 1 && $conjunction === null) { throw new \InvalidArgumentException('If conditions is longer than one element, conjunction may not be null.'); } return new CssMediaQuery($conditions, $conjunction ?? true); } public function getModifier(): ?string { return $this->modifier; } public function getType(): ?string { return $this->type; } public function isConjunction(): bool { return $this->conjunction; } /** * @return list<string> */ public function getConditions(): array { return $this->conditions; } /** * Whether this media query matches all media types. */ public function matchesAllTypes(): bool { return $this->type === null || strtolower($this->type) === 'all'; } /** * Merges this with $other to return a query that matches the intersection * of both inputs. */ public function merge(CssMediaQuery $other): MediaQueryMergeResult { if (!$this->conjunction || !$other->conjunction) { return MediaQuerySingletonMergeResult::unrepresentable; } $ourModifier = $this->modifier !== null ? strtolower($this->modifier) : null; $ourType = $this->type !== null ? strtolower($this->type) : null; $theirModifier = $other->modifier !== null ? strtolower($other->modifier) : null; $theirType = $other->type !== null ? strtolower($other->type) : null; if ($ourType === null && $theirType === null) { return self::condition(array_merge($this->conditions, $other->conditions), true); } if (($ourModifier === 'not') !== ($theirModifier === 'not')) { if ($ourType === $theirType) { $negativeConditions = $ourModifier === 'not' ? $this->conditions : $other->conditions; $positiveConditions = $ourModifier === 'not' ? $other->conditions : $this->conditions; // If the negative conditions are a subset of the positive conditions, the // query is empty. For example, `not screen and (color)` has no // intersection with `screen and (color) and (grid)`. // // However, `not screen and (color)` *does* intersect with `screen and // (grid)`, because it means `not (screen and (color))` and so it allows // a screen with no color but with a grid. if (empty(array_diff($negativeConditions, $positiveConditions))) { return MediaQuerySingletonMergeResult::empty; } return MediaQuerySingletonMergeResult::unrepresentable; } if ($this->matchesAllTypes() || $other->matchesAllTypes()) { return MediaQuerySingletonMergeResult::unrepresentable; } if ($ourModifier === 'not') { $modifier = $theirModifier; $type = $theirType; $conditions = $other->conditions; } else { $modifier = $ourModifier; $type = $ourType; $conditions = $this->conditions; } } elseif ($ourModifier === 'not') { // CSS has no way of representing "neither screen nor print". if ($ourType !== $theirType) { return MediaQuerySingletonMergeResult::unrepresentable; } $moreConditions = \count($this->conditions) > \count($other->conditions) ? $this->conditions : $other->conditions; $fewerConditions = \count($this->conditions) > \count($other->conditions) ? $other->conditions : $this->conditions; // If one set of features is a superset of the other, use those features // because they're strictly narrower. if (empty(array_diff($fewerConditions, $moreConditions))) { $modifier = $ourModifier; // "not" $type = $ourType; $conditions = $moreConditions; } else { // Otherwise, there's no way to represent the intersection. return MediaQuerySingletonMergeResult::unrepresentable; } } elseif ($this->matchesAllTypes()) { $modifier = $theirModifier; // Omit the type if either input query did, since that indicates that they // aren't targeting a browser that requires "all and". $type = $other->matchesAllTypes() && $ourType === null ? null : $theirType; $conditions = array_merge($this->conditions, $other->conditions); } elseif ($other->matchesAllTypes()) { $modifier = $ourModifier; $type = $ourType; $conditions = array_merge($this->conditions, $other->conditions); } elseif ($ourType !== $theirType) { return MediaQuerySingletonMergeResult::empty; } else { $modifier = $ourModifier ?? $theirModifier; $type = $ourType; $conditions = array_merge($this->conditions, $other->conditions); } return CssMediaQuery::type( $type === $ourType ? $this->type : $other->type, $modifier === $ourModifier ? $this->modifier : $other->modifier, $conditions ); } public function equals(object $other): bool { return $other instanceof CssMediaQuery && $other->modifier === $this->modifier && $other->type === $this->type && $other->conditions === $this->conditions; } } PKCA#]�M7�rr?system/helixultimate/vendor/scssphp/scssphp/src/Ast/AstNode.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast; use SourceSpan\FileSpan; /** * A node in an abstract syntax tree. * * @internal */ interface AstNode extends \Stringable { public function getSpan(): FileSpan; } PKCA#]���@ =system/helixultimate/vendor/scssphp/scssphp/src/Util/Path.phpnu�[���<?php namespace ScssPhp\ScssPhp\Util; use League\Uri\Contracts\UriInterface; use League\Uri\Uri; use Symfony\Component\Filesystem\Exception\InvalidArgumentException; use Symfony\Component\Filesystem\Path as SymfonyPath; /** * @internal */ final class Path { /** * @var array<string, string> */ private static array $realCaseCache = []; public static function toUri(string $path): UriInterface { if (\DIRECTORY_SEPARATOR === '\\') { return Uri::fromWindowsPath($path); } return Uri::fromUnixPath($path); } public static function fromUri(UriInterface $uri): string { if (!$uri instanceof Uri) { $uri = Uri::new($uri); } if (\DIRECTORY_SEPARATOR === '\\') { return $uri->toWindowsPath() ?? throw new \InvalidArgumentException("Uri $uri must have scheme 'file:'."); } return $uri->toUnixPath() ?? throw new \InvalidArgumentException("Uri $uri must have scheme 'file:'."); } public static function isAbsolute(string $path): bool { if ($path === '') { return false; } if ($path[0] === '/') { return true; } if (\DIRECTORY_SEPARATOR === '\\') { return self::isWindowsAbsolute($path); } return false; } /** * Canonicalizes $path. * * This is guaranteed to return the same path for two different input paths * if and only if both input paths point to the same location. Unlike * {@see normalize}, it returns absolute paths when possible and canonicalizes * ASCII case on Windows. * * Note that this does not resolve symlinks. */ public static function canonicalize(string $path): string { return self::realCasePath(self::normalize(self::absolute($path))); } /** * Normalizes $path, simplifying it by handling `..`, and `.`, and * removing redundant path separators whenever possible. * * Note that this is *not* guaranteed to return the same result for two * equivalent input paths. */ public static function normalize(string $path): string { $normalized = SymfonyPath::canonicalize($path); // The Symfony Path class always uses / as separator, while we want to use the platform one to get a real path if (\DIRECTORY_SEPARATOR === '\\') { $normalized = str_replace('/', '\\', $normalized); } return $normalized; } /** * Attempts to convert $path to an equivalent relative path from $from. * * Since there is no relative path from one drive letter to another on Windows, * this will return an absolute path in those cases. */ public static function relative(string $path, string $from): string { try { $relativePath = SymfonyPath::makeRelative($path, $from); } catch (InvalidArgumentException) { return $path; } // The Symfony Path class always uses / as separator, while we want to use the platform one to get a real path if (\DIRECTORY_SEPARATOR === '\\') { $relativePath = str_replace('/', '\\', $relativePath); } return $relativePath; } private static function realCasePath(string $path): string { if (!(\PHP_OS_FAMILY === 'Windows' || \PHP_OS_FAMILY === 'Darwin')) { return $path; } if (\PHP_OS_FAMILY === 'Windows') { // Drive names are *always* case-insensitive, so convert them to uppercase. if (self::isAbsolute($path) && Character::isAlphabetic($path[0])) { $path = strtoupper(substr($path, 0, 3)) . substr($path, 3); } } return self::realCasePathHelper($path); } private static function realCasePathHelper(string $path): string { $dirname = dirname($path); if ($dirname === $path || $dirname === '.') { return $path; } return self::$realCaseCache[$path] ??= self::computeRealCasePath($path); } private static function computeRealCasePath(string $path): string { $realDirname = self::realCasePathHelper(dirname($path)); $basename = basename($path); $files = @scandir($realDirname); if ($files === false) { // If there's an error listing a directory, it's likely because we're // trying to reach too far out of the current directory into something // we don't have permissions for. In that case, just assume we have the // real path. return $path; } $matches = array_values(array_filter($files, fn ($realPath) => StringUtil::equalsIgnoreCase(basename($realPath), $basename))); if (\count($matches) === 1) { return self::join($realDirname, $matches[0]); } // If the file doesn't exist, or if there are multiple options // (meaning the filesystem isn't actually case-insensitive), use // `basename` as-is. return self::join($realDirname, $basename); } public static function isWindowsAbsolute(string $path): bool { if ($path === '') { return false; } if ($path[0] === '/') { return true; } if ($path[0] === '\\') { return true; } if (\strlen($path) < 3) { return false; } if ($path[1] !== ':') { return false; } if ($path[2] !== '/' && $path[2] !== '\\') { return false; } if (!preg_match('/^[A-Za-z]$/', $path[0])) { return false; } return true; } public static function join(string $part1, string $part2): string { if ($part1 === '' || self::isAbsolute($part2)) { return $part2; } if ($part2 === '') { return $part1; } $last = $part1[\strlen($part1) - 1]; $separator = \DIRECTORY_SEPARATOR; if ($last === '/' || $last === \DIRECTORY_SEPARATOR) { $separator = ''; } return $part1 . $separator . $part2; } public static function absolute(string $path): string { $cwd = getcwd(); if ($cwd === false) { return $path; } return self::join($cwd, $path); } /** * Gets the file extension of $path: the portion of basename from the last * `.` to the end (including the `.` itself). * * If the file name starts with a `.`, then that is not considered the * extension */ public static function extension(string $path): string { $basename = basename($path); $lastDot = strrpos($basename, '.'); if ($lastDot === false || $lastDot === 0) { return ''; } return substr($basename, $lastDot); } public static function withoutExtension(string $path): string { $extension = self::extension($path); if ($extension === '') { return $path; } return substr($path, 0, -\strlen($extension)); } /** * Returns a pretty URI for a path */ public static function prettyUri(string|UriInterface $path): string { if ($path instanceof UriInterface) { if ($path->getScheme() !== 'file') { return (string) $path; } $path = self::fromUri($path); } $normalizedPath = $path; $normalizedRootDirectory = getcwd() . '/'; if (\DIRECTORY_SEPARATOR === '\\') { $normalizedRootDirectory = str_replace('\\', '/', $normalizedRootDirectory); $normalizedPath = str_replace('\\', '/', $path); } // TODO add support for returning a relative path using ../ in some cases, like Dart's path.prettyUri method if (str_starts_with($normalizedPath, $normalizedRootDirectory)) { return substr($path, \strlen($normalizedRootDirectory)); } return $path; } } PKCA#]}��Bsystem/helixultimate/vendor/scssphp/scssphp/src/Util/Character.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; /** * @internal */ final class Character { /** * The difference between upper- and lowercase ASCII letters. * * `0b100000` can be bitwise-ORed with uppercase ASCII letters to get their * lowercase equivalents. */ private const ASCII_CASE_BIT = 0x20; /** * Returns whether $character is an ASCII whitespace character. */ public static function isWhitespace(?string $character): bool { return $character === ' ' || $character === "\t" || $character === "\n" || $character === "\r" || $character === "\f"; } /** * Returns whether $character is a space or a tab character. */ public static function isSpaceOrTab(?string $character): bool { return $character === ' ' || $character === "\t"; } /** * Returns whether $character is an ASCII newline character. */ public static function isNewline(?string $character): bool { return $character === "\n" || $character === "\r" || $character === "\f"; } /** * Returns whether $character is a letter or a number. */ public static function isAlphanumeric(string $character): bool { return self::isAlphabetic($character) || self::isDigit($character); } /** * Returns whether $character is a letter. */ public static function isAlphabetic(string $character): bool { $charCode = \ord($character[0]); return ($charCode >= \ord('a') && $charCode <= \ord('z')) || ($charCode >= \ord('A') && $charCode <= \ord('Z')); } /** * Returns whether $character is a digit. */ public static function isDigit(?string $character): bool { if ($character === null) { return false; } $charCode = \ord($character[0]); return $charCode >= \ord('0') && $charCode <= \ord('9'); } /** * Returns whether $character is legal as the start of a Sass identifier. */ public static function isNameStart(string $character): bool { return $character === '_' || self::isAlphabetic($character) || \ord($character[0]) >= 0x80; } /** * Returns whether $character is legal in the body of a Sass identifier. */ public static function isName(string $character): bool { return self::isNameStart($character) || self::isDigit($character) || $character === '-'; } /** * Returns whether $character is a hexadecimal digit. */ public static function isHex(?string $character): bool { if ($character === null) { return false; } if (self::isDigit($character)) { return true; } $charCode = \ord($character[0]); if ($charCode >= \ord('a') && $charCode <= \ord('f')) { return true; } if ($charCode >= \ord('A') && $charCode <= \ord('F')) { return true; } return false; } /** * Returns whether $identifier is module-private. * * Assumes $identifier is a valid Sass identifier. */ public static function isPrivate(string $identifier): bool { $first = $identifier[0]; return $first === '-' || $first === '_'; } /** * Assumes that $character is a left-hand brace-like character, and returns * the right-hand version. */ public static function opposite(string $character): string { return match ($character) { '(' => ')', '{' => '}', '[' => ']', default => throw new \InvalidArgumentException(sprintf('Expected a brace character. Got "%s"', $character)), }; } public static function equalsIgnoreCase(string $character1, string $character2): bool { if ($character1 === $character2) { return true; } // If this check fails, the characters are definitely different. If it // succeeds *and* either character is an ASCII letter, they're equivalent. if ((\ord($character1[0]) ^ \ord($character2[0])) !== self::ASCII_CASE_BIT) { return false; } // Now we just need to verify that one of the characters is an ASCII letter. $upperCase1 = \ord($character1[0]) & ~self::ASCII_CASE_BIT; return $upperCase1 >= \ord('A') && $upperCase1 <= \ord('Z'); } } PKCA#]`cY*��Asystem/helixultimate/vendor/scssphp/scssphp/src/Util/SpanUtil.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Parser\StringScanner; use SourceSpan\FileSpan; use SourceSpan\SourceFile; /** * @internal */ final class SpanUtil { public static function bogusSpan(): FileSpan { return SourceFile::fromString('')->span(0); } /** * Returns this span with all whitespace trimmed from both sides. */ public static function trim(FileSpan $span): FileSpan { return self::trimRight(self::trimLeft($span)); } /** * Returns this span with all leading whitespace trimmed. */ public static function trimLeft(FileSpan $span): FileSpan { $start = 0; $text = $span->getText(); $textLength = \strlen($text); while ($start < $textLength && Character::isWhitespace($text[$start])) { $start++; } return $span->subspan($start); } /** * Returns this span with all trailing whitespace trimmed. */ public static function trimRight(FileSpan $span): FileSpan { $text = $span->getText(); $end = \strlen($text) - 1; while ($end >= 0 && Character::isWhitespace($text[$end])) { $end--; } return $span->subspan(0, $end + 1); } /** * Returns the span of the identifier at the start of this span. * * If $includeLeading is greater than 0, that many additional characters * will be included from the start of this span before looking for an * identifier. */ public static function initialIdentifier(FileSpan $span, int $includeLeading = 0): FileSpan { $scanner = new StringScanner($span->getText()); for ($i = 0; $i < $includeLeading; $i++) { $scanner->readUtf8Char(); } self::scanIdentifier($scanner); return $span->subspan(0, $scanner->getPosition()); } /** * Returns a subspan excluding the identifier at the start of this span. */ public static function withoutInitialIdentifier(FileSpan $span): FileSpan { $scanner = new StringScanner($span->getText()); self::scanIdentifier($scanner); return $span->subspan($scanner->getPosition()); } /** * Returns a subspan excluding a namespace and `.` at the start of this span. */ public static function withoutNamespace(FileSpan $span): FileSpan { return self::withoutInitialIdentifier($span)->subspan(1); } /** * Returns a subspan excluding an initial at-rule and any whitespace after * it. */ public static function withoutInitialAtRule(FileSpan $span): FileSpan { $scanner = new StringScanner($span->getText()); $scanner->expectChar('@'); self::scanIdentifier($scanner); return self::trimLeft($span->subspan($scanner->getPosition())); } /** * Whether $span contains the $target FileSpan. * * Validates the FileSpans to be in the same file and for the $target to be * within $span FileSpan inclusive range [start,end]. */ public static function contains(FileSpan $span, FileSpan $target): bool { return $span->getFile() === $target->getFile() && $span->getStart()->getOffset() <= $target->getStart()->getOffset() && $span->getEnd()->getOffset() >= $target->getEnd()->getOffset(); } /** * Consumes an identifier from $scanner. */ private static function scanIdentifier(StringScanner $scanner): void { while (!$scanner->isDone()) { $char = $scanner->peekChar(); if ($char === '\\') { ParserUtil::consumeEscapedCharacter($scanner); } elseif ($char !== null && Character::isName($char)) { $scanner->readUtf8Char(); } else { break; } } } } PKCA#]�wj��@system/helixultimate/vendor/scssphp/scssphp/src/Util/AstUtil.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Ast\Sass\ArgumentInvocation; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression\FunctionExpression; /** * @internal */ final class AstUtil { /** * Converts $expression to an equivalent `calc()`. * * This assumes that $expression already returns a number. It's intended for * use in end-user messaging, and may not produce directly evaluable * expressions. */ public static function expressionToCalc(Expression $expression): FunctionExpression { return new FunctionExpression( 'calc', new ArgumentInvocation([$expression->accept(new MakeExpressionCalculationSafe())], [], $expression->getSpan()), $expression->getSpan() ); } } PKCA#]���� � Vsystem/helixultimate/vendor/scssphp/scssphp/src/Util/MakeExpressionCalculationSafe.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Ast\Sass\ArgumentInvocation; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression\BinaryOperationExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\BinaryOperator; use ScssPhp\ScssPhp\Ast\Sass\Expression\FunctionExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\InterpolatedFunctionExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\NumberExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\UnaryOperationExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\UnaryOperator; use ScssPhp\ScssPhp\Visitor\ReplaceExpressionVisitor; /** * A visitor that replaces constructs that can't be used in a calculation with * those that can. * * @internal */ final class MakeExpressionCalculationSafe extends ReplaceExpressionVisitor { public function visitBinaryOperationExpression(BinaryOperationExpression $node): Expression { // `calc()` doesn't support `%` for modulo but Sass doesn't yet support the // `mod()` calculation function because there's no browser support, so we have // to work around it by wrapping the call in a Sass function. if ($node->getOperator() === BinaryOperator::MODULO) { return new FunctionExpression('max', new ArgumentInvocation([$node], [], $node->getSpan()), $node->getSpan(), 'math'); } return parent::visitBinaryOperationExpression($node); } public function visitInterpolatedFunctionExpression(InterpolatedFunctionExpression $node): Expression { return $node; } public function visitUnaryOperationExpression(UnaryOperationExpression $node): Expression { switch ($node->getOperator()) { // `calc()` doesn't support unary operations. case UnaryOperator::PLUS: return $node->getOperand(); case UnaryOperator::MINUS: return new BinaryOperationExpression( BinaryOperator::TIMES, new NumberExpression(-1, $node->getSpan()), $node->getOperand() ); // Other unary operations don't produce numbers, so keep them as-is to // give the user a more useful syntax error after serialization. default: return parent::visitUnaryOperationExpression($node); } } } PKCA#]�kU���Fsystem/helixultimate/vendor/scssphp/scssphp/src/Util/EquatableUtil.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; /** * @internal */ final class EquatableUtil { /** * @param iterable<mixed> $list */ public static function iterableContains(iterable $list, Equatable $item): bool { foreach ($list as $listItem) { if (!\is_object($listItem)) { continue; } if ($item === $listItem) { return true; } if ($item->equals($listItem)) { return true; } } return false; } /** * Checks whether 2 values are equals, using the Equatable semantic to compare objects if possible. * * When compared values don't implement {@see Equatable}, they are compared * using `===`. * Values implementing {@see Equatable} are still compared with `===` first to * optimize comparisons to the same object, as an object is always expected to * be equal to itself. */ public static function equals(mixed $item1, mixed $item2): bool { if ($item1 === $item2) { return true; } if ($item1 instanceof Equatable && $item2 instanceof Equatable) { return $item1->equals($item2); } return false; } /** * Checks whether 2 lists are equals, using the Equatable semantic to compare objects if possible. * * @param list<mixed> $list1 * @param list<mixed> $list2 */ public static function listEquals(array $list1, array $list2): bool { if (\count($list1) !== \count($list2)) { return false; } foreach ($list1 as $i => $item1) { $item2 = $list2[$i]; if (self::equals($item1, $item2)) { continue; } return false; } return true; } } PKCA#]juzo''Csystem/helixultimate/vendor/scssphp/scssphp/src/Util/LoggerUtil.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\Logger\DeprecationProcessingLogger; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\StackTrace\Trace; use SourceSpan\FileSpan; /** * @internal */ final class LoggerUtil { public static function warnForDeprecation(LoggerInterface $logger, Deprecation $deprecation, string $message, ?FileSpan $span = null, ?Trace $trace = null): void { if ($deprecation->isFuture() && !$logger instanceof DeprecationProcessingLogger) { return; } $logger->warn($message, $deprecation, $span, $trace); } } PKCA#]��k&&Bsystem/helixultimate/vendor/scssphp/scssphp/src/Util/Equatable.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; /** * @internal */ interface Equatable { public function equals(object $other): bool; } PKCA#]"�2T Bsystem/helixultimate/vendor/scssphp/scssphp/src/Util/ErrorUtil.phpnu�[���<?php /** * SCSSPHP * * @copyright 2018-2020 Anthon Pang * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\StackTrace\Trace; use SourceSpan\FileSpan; /** * @internal */ final class ErrorUtil { /** * @throws \OutOfRangeException */ public static function checkIntInInterval(int $value, int $minValue, int $maxValue, ?string $name = null): void { if ($value < $minValue || $value > $maxValue) { $nameDisplay = $name ? " $name" : ''; throw new \OutOfRangeException("Invalid value:$nameDisplay must be between $minValue and $maxValue: $value."); } } public static function formatErrorMessage(string $message, FileSpan $span, Trace $sassTrace): string { $formattedMessage = $message . "\n" . $span->highlight(); foreach (explode("\n", $sassTrace->getFormattedTrace()) as $frame) { if ($frame === '') { continue; } $formattedMessage .= "\n"; $formattedMessage .= ' ' . $frame; } return $formattedMessage; } /** * @param array<string, FileSpan> $secondarySpans */ public static function formatErrorMessageMultiple(string $message, FileSpan $span, string $primaryLabel, array $secondarySpans, Trace $sassTrace): string { $formattedMessage = $message . "\n" . $span->highlightMultiple($primaryLabel, $secondarySpans); foreach (explode("\n", $sassTrace->getFormattedTrace()) as $frame) { if ($frame === '') { continue; } $formattedMessage .= "\n"; $formattedMessage .= ' ' . $frame; } return $formattedMessage; } } PKCA#]ً�JJCsystem/helixultimate/vendor/scssphp/scssphp/src/Util/ParserUtil.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Parser\StringScanner; /** * @internal */ final class ParserUtil { /** * Consumes an escape sequence from $scanner and returns the character it * represents. */ public static function consumeEscapedCharacter(StringScanner $scanner): string { // See https://drafts.csswg.org/css-syntax-3/#consume-escaped-code-point. $scanner->expectChar('\\'); $first = $scanner->peekChar(); if ($first === null) { return "\u{FFFD}"; } if (Character::isNewline($first)) { $scanner->error('Expected escape sequence.'); } if (Character::isHex($first)) { $value = 0; for ($i = 0; $i < 6; $i++) { $next = $scanner->peekChar(); if ($next === null || !Character::isHex($next)) { break; } $value *= 16; $value += hexdec($scanner->readChar()); assert(\is_int($value)); } if (Character::isWhitespace($scanner->peekChar())) { $scanner->readChar(); } if ($value === 0 || ($value >= 0xD800 && $value <= 0xDFFF) || $value >= 0x10FFFF) { return "\u{FFFD}"; } return mb_chr($value, 'UTF-8'); } return $scanner->readUtf8Char(); } } PKCA#]�`��Esystem/helixultimate/vendor/scssphp/scssphp/src/Util/IterableUtil.phpnu�[���<?php /** * SCSSPHP * * @copyright 2018-2020 Anthon Pang * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; /** * @internal */ final class IterableUtil { /** * @template T * * @param iterable<T> $list * @param callable(T): bool $callback * * @param-immediately-invoked-callable $callback */ public static function any(iterable $list, callable $callback): bool { foreach ($list as $item) { if ($callback($item)) { return true; } } return false; } /** * @template T * * @param iterable<T> $list * @param callable(T): bool $callback * * @param-immediately-invoked-callable $callback */ public static function every(iterable $list, callable $callback): bool { foreach ($list as $item) { if (!$callback($item)) { return false; } } return true; } /** * @template T * * @param iterable<T> $iterable * @return T|null */ public static function firstOrNull(iterable $iterable): mixed { foreach ($iterable as $item) { return $item; } return null; } /** * Returns the first `T` returned by $callback for an element of $iterable, * or `null` if it returns `null` for every element. * * @template T * @template E * @param iterable<E> $iterable * @param callable(E): (T|null) $callback * * @return T|null * * @param-immediately-invoked-callable $callback */ public static function search(iterable $iterable, callable $callback) { foreach ($iterable as $element) { $value = $callback($element); if ($value !== null) { return $value; } } return null; } } PKCA#]אu(~~Csystem/helixultimate/vendor/scssphp/scssphp/src/Util/StringUtil.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; /** * @internal */ final class StringUtil { /** * @param non-empty-array<string> $iter */ public static function toSentence(array $iter, string $conjunction = 'and'): string { if (\count($iter) === 1) { return $iter[array_key_first($iter)]; } $last = array_pop($iter); return implode(', ', $iter) . ' ' . $conjunction . ' ' . $last; } /** * Returns $name if $number is 1, or the plural of $name otherwise. * * By default, this just adds "s" to the end of $name to get the plural. If * $plural is passed, that's used instead. */ public static function pluralize(string $name, int $number, ?string $plural = null): string { if ($number === 1) { return $name; } if ($plural !== null) { return $plural; } return $name . 's'; } public static function trimAscii(string $string, bool $excludeEscape = false): string { $start = self::firstNonWhitespace($string); if ($start === null) { return ''; } $end = self::lastNonWhitespace($string, $excludeEscape); assert($end !== null); return substr($string, $start, $end + 1); } public static function trimAsciiRight(string $string, bool $excludeEscape = false): string { $end = self::lastNonWhitespace($string, $excludeEscape); if ($end === null) { return ''; } return substr($string, 0, $end + 1); } /** * Returns the index of the first character in $string that's not ASCII * whitespace, or `null` if $string is entirely spaces. * * If $excludeEscape is `true`, this doesn't move past whitespace that's * included in a CSS escape. */ private static function firstNonWhitespace(string $string): ?int { for ($i = 0; $i < \strlen($string); $i++) { $char = $string[$i]; if (!Character::isWhitespace($char)) { return $i; } } return null; } /** * Returns the index of the last character in $string that's not ASCII * whitespace, or `null` if $string is entirely spaces. * * If $excludeEscape is `true`, this doesn't move past whitespace that's * included in a CSS escape. */ private static function lastNonWhitespace(string $string, bool $excludeEscape = false): ?int { for ($i = \strlen($string) - 1; $i >= 0; $i--) { $char = $string[$i]; if (!Character::isWhitespace($char)) { if ($excludeEscape && $i !== 0 && $i !== \strlen($string) && $char === '\\') { return $i + 1; } return $i; } } return null; } /** * Returns whether $string1 and $string2 are equal, ignoring ASCII case. */ public static function equalsIgnoreCase(?string $string1, string $string2): bool { if ($string1 === $string2) { return true; } if ($string1 === null) { return false; } return self::toAsciiLowerCase($string1) === self::toAsciiLowerCase($string2); } /** * Returns whether $string starts with $prefix, ignoring ASCII case. */ public static function startsWithIgnoreCase(string $string, string $prefix): bool { if (\strlen($string) < \strlen($prefix)) { return false; } for ($i = 0; $i < \strlen($prefix); $i++) { if (!Character::equalsIgnoreCase($string[$i], $prefix[$i])) { return false; } } return true; } /** * Converts all ASCII chars to lowercase in the input string. * * This does not use `strtolower` because `strtolower` is locale-dependant * rather than operating on ASCII. * Passing an input string in an encoding that it is not ASCII compatible is * unsupported, and will probably generate garbage. */ public static function toAsciiLowerCase(string $string): string { return strtr($string, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); } /** * Converts all ASCII chars to uppercase in the input string. * * This does not use `strtoupper` because `strtoupper` is locale-dependant * rather than operating on ASCII. * Passing an input string in an encoding that it is not ASCII compatible is * unsupported, and will probably generate garbage. */ public static function toAsciiUpperCase(string $string): string { return strtr($string, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'); } } PKCA#]��{��<system/helixultimate/vendor/scssphp/scssphp/src/Util/Box.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; /** * An unmodifiable reference to a value that may be mutated elsewhere. * * This uses reference equality based on the underlying {@see ModifiableBox}, even * when the underlying type uses value equality. * * @template T * * @internal */ final class Box implements Equatable { /** * @var ModifiableBox<T> */ private readonly ModifiableBox $inner; /** * @param ModifiableBox<T> $inner */ public function __construct(ModifiableBox $inner) { $this->inner = $inner; } /** * @return T */ public function getValue() { return $this->inner->getValue(); } public function equals(object $other): bool { return $other instanceof Box && $this->inner === $other->inner; } } PKCA#]�b����Bsystem/helixultimate/vendor/scssphp/scssphp/src/Util/ArrayUtil.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; /** * @internal */ final class ArrayUtil { /** * Reduces a collection to a single value by iteratively combining elements * of the collection using the provided function. * * The array must have at least one element. * If it has only one element, that element is returned. * * Otherwise this method starts with the first element from the array, * and then combines it with the remaining elements in iteration order. * * @template T * * @param non-empty-array<T> $items * @param callable(T, T): T $combine * @return T * * @param-immediately-invoked-callable $combine */ public static function reduce(array $items, callable $combine) { if (\count($items) === 0) { throw new \LogicException('Cannot reduce an empty array'); } $first = array_shift($items); return array_reduce($items, $combine, $first); } } PKCA#]a,�DDFsystem/helixultimate/vendor/scssphp/scssphp/src/Util/ModifiableBox.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; /** * A mutable reference to a (presumably immutable) value. * * This always uses reference equality, even when the underlying type uses * value equality. * * @template T * * @internal */ final class ModifiableBox { /** * @var T */ private mixed $value; /** * @param T $value */ public function __construct(mixed $value) { $this->value = $value; } /** * @return T */ public function getValue() { return $this->value; } /** * @param T $value */ public function setValue(mixed $value): void { $this->value = $value; } /** * Returns an unmodifiable reference to this box. * * The underlying modifiable box may still be modified. * * @return Box<T> */ public function seal(): Box { return new Box($this); } } PKCA#]gA����Asystem/helixultimate/vendor/scssphp/scssphp/src/Util/ListUtil.phpnu�[���<?php /** * SCSSPHP * * @copyright 2018-2020 Anthon Pang * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; /** * @internal */ final class ListUtil { /** * Flattens the first level of nested arrays in $queues. * * The return value is ordered first by index in the nested iterable, then by * the index *of* that iterable in $queues. For example, * `flattenVertically([["1a", "1b"], ["2a", "2b"]])` returns `["1a", "2a", * "1b", "2b"]`. * * @template T * * @param list<list<T>> $queues * * @return list<T> */ public static function flattenVertically(array $queues): array { if (\count($queues) === 1) { return $queues[0]; } $result = []; while (!empty($queues)) { foreach ($queues as $i => &$queue) { $item = array_shift($queue); if ($item === null) { unset($queues[$i]); } else { $result[] = $item; } } unset($queue); } return $result; } /** * Returns the longest common subsequence between $list1 and $list2. * * If there are more than one equally long common subsequence, returns the one * which starts first in $list1. * * If $select is passed, it's used to check equality between elements in each * list. If it returns `null`, the elements are considered unequal; otherwise, * it should return the element to include in the return value. * * @template T * * @param list<T> $list1 * @param list<T> $list2 * @param (callable(T, T): (T|null))|null $select * * @return list<T> */ public static function longestCommonSubsequence(array $list1, array $list2, ?callable $select = null): array { if ($select === null) { $select = fn($element1, $element2) => EquatableUtil::equals($element1, $element2) ? $element1 : null; } $lengths = array_fill(0, \count($list1) + 1, array_fill(0, \count($list2) + 1, 0)); $selections = array_fill(0, \count($list1) + 1, array_fill(0, \count($list2) + 1, null)); for ($i = 0; $i < \count($list1); $i++) { for ($j = 0; $j < \count($list2); $j++) { $selection = $select($list1[$i], $list2[$j]); $selections[$i][$j] = $selection; $lengths[$i + 1][$j + 1] = $selection === null ? max($lengths[$i + 1][$j], $lengths[$i][$j + 1]) : $lengths[$i][$j] + 1; } } /** * @param int<-1, max> $i * @param int<-1, max> $j * @return list<T> */ $backtrack = function (int $i, int $j) use ($selections, $lengths, &$backtrack) { if ($i === -1 || $j === -1) { return []; } \assert($i >= 0); \assert($j >= 0); $selection = $selections[$i][$j]; if ($selection !== null) { $selected = $backtrack($i - 1, $j - 1); $selected[] = $selection; return $selected; } return $lengths[$i + 1][$j] > $lengths[$i][$j + 1] ? $backtrack($i, $j - 1) : $backtrack($i - 1, $j); }; return $backtrack(\count($list1) - 1, \count($list2) - 1); } /** * @template T * * @param list<T> $list * * @return T */ public static function last(array $list) { $count = count($list); if ($count === 0) { throw new \LogicException('The list may not be empty.'); } return $list[$count - 1]; } /** * @template T * * @param list<T> $list * * @return list<T> */ public static function exceptLast(array $list): array { $count = count($list); if ($count === 0) { throw new \LogicException('The list may not be empty.'); } return array_slice($list, 0, $count - 1); } } PKCA#]h,�Q��@system/helixultimate/vendor/scssphp/scssphp/src/Util/UriUtil.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; use League\Uri\Contracts\UriInterface; use League\Uri\Uri; use League\Uri\UriString; /** * @internal */ final class UriUtil { public static function resolve(UriInterface $baseUrl, string $reference): UriInterface { return self::resolveUri($baseUrl, Uri::new($reference)); } public static function resolveUri(UriInterface $baseUrl, UriInterface $url): UriInterface { if ($baseUrl->getScheme() !== null) { // non-RFC3986 behavior in Dart-Sass when resolving relative reference with a base url with no authority and a relative path (where they consider the base path as absolute) if ($baseUrl->getAuthority() === null && $baseUrl->getPath() !== '' && $baseUrl->getPath()[0] !== '/' && $url->getScheme() === null && $url->getAuthority() === null && $url->getPath() !== '' && $url->getPath()[0] !== '/') { return self::resolveLeagueUri($baseUrl->withPath('/' . $baseUrl->getPath()), $url); } return self::resolveLeagueUri($baseUrl, $url); } if ($url->getScheme() !== null) { return $url->withPath(UriString::removeDotSegments($url->getPath())); } if ($baseUrl->getAuthority() !== null || $url->getAuthority() !== null) { return self::resolveLeagueUri($baseUrl->withScheme('scssphp-resolve'), $url)->withScheme(null); } if ($url->getPath() === '') { if ($url->getQuery() !== null) { return $baseUrl->withQuery($url->getQuery())->withFragment($url->getFragment()); } if ($url->getFragment() !== null) { return $baseUrl->withFragment($url->getFragment()); } return $baseUrl; } if ($url->getPath()[0] === '/') { return $url->withPath(UriString::removeDotSegments($url->getPath())); } if ($baseUrl->getPath() === '') { return $url; } if ($baseUrl->getPath()[0] !== '/') { // Pure path resolution between 2 relative path URLs $mergedPath = self::normalizeRelativePath(self::mergePaths($baseUrl->getPath(), $url->getPath())); return $url->withPath($mergedPath); } return self::resolveLeagueUri($baseUrl->withScheme('scssphp-resolve')->withHost('localhost'), $url)->withScheme(null)->withHost(null); } private static function resolveLeagueUri(UriInterface $baseUrl, UriInterface $url): UriInterface { // Custom implementations of UriInterface might not implement the resolve method yet, until version 8.0 of the interface. if (!$baseUrl instanceof Uri && !method_exists($baseUrl, 'resolve')) { $baseUrl = Uri::new($baseUrl); } return $baseUrl->resolve($url); } /** * @param non-empty-string $base * @param non-empty-string $reference * * @return non-empty-string */ private static function mergePaths(string $base, string $reference): string { \assert($reference[0] !== '/'); $baseEnd = strrpos($base, '/'); if ($baseEnd === false) { return $reference; } return substr($base, 0, $baseEnd + 1) . $reference; } /** * Removes all `.` segments and any non-leading `..` segments. * * Removing the ".." from a "bar/foo/.." sequence results in "bar/" * (trailing "/"). If the entire path is removed (because it contains as * many ".." segments as real segments), the result is "./". * This is different from an empty string, which represents "no path" * when you resolve it against a base URI with a path with a non-empty * final segment. * * @param non-empty-string $path */ private static function normalizeRelativePath(string $path): string { \assert($path[0] !== '/'); if ($path[0] !== '.' && !str_contains($path, '/.')) { return $path; } $output = []; $appendSlash = false; foreach (explode('/', $path) as $segment) { $appendSlash = false; if ('..' === $segment) { if ($output !== [] && ListUtil::last($output) !== '..') { array_pop($output); $appendSlash = true; } else { $output[] = '..'; } } elseif ('.' === $segment) { $appendSlash = true; } else { $output[] = $segment; } } if ($output === [] || $output === ['']) { return './'; } if ($appendSlash || ListUtil::last($output) === '..') { $output[] = ''; } return implode('/', $output); } } PKCA#]|VO�)!)!Csystem/helixultimate/vendor/scssphp/scssphp/src/Util/NumberUtil.phpnu�[���<?php /** * SCSSPHP * * @copyright 2018-2020 Anthon Pang * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Value\SassNumber; /** * Utilities to deal with numbers with fuzziness for the Sass precision * * @internal */ final class NumberUtil { /** * The power of ten to which to round Sass numbers to determine if they're * fuzzy equal to one another * * This is also the minimum distance such that `a - b > EPSILON` implies that * `a` isn't fuzzy-equal to `b`. Note that the inverse implication is not * necessarily true! For example, if `a = 5.1e-11` and `b = 4.4e-11`, then * `a - b < 1e-11` but `a` fuzzy-equals 5e-11 and b fuzzy-equals 4e-11. * * @see https://github.com/sass/sass/blob/main/spec/types/number.md#fuzzy-equality */ private const EPSILON = 10 ** (-SassNumber::PRECISION - 1); private const INVERSE_EPSILON = 10 ** (SassNumber::PRECISION + 1); public static function clamp(float $value, float $lowerLimit, float $upperLimit): float { if ($value < $lowerLimit) { return $lowerLimit; } if ($value > $upperLimit) { return $upperLimit; } return $value; } public static function fuzzyEquals(float $number1, float $number2): bool { if ($number1 == $number2) { return true; } return abs($number1 - $number2) <= self::EPSILON && round($number1 * self::INVERSE_EPSILON) === round($number2 * self::INVERSE_EPSILON); } public static function fuzzyLessThan(float $number1, float $number2): bool { return $number1 < $number2 && !self::fuzzyEquals($number1, $number2); } public static function fuzzyLessThanOrEquals(float $number1, float $number2): bool { return $number1 <= $number2 || self::fuzzyEquals($number1, $number2); } public static function fuzzyGreaterThan(float $number1, float $number2): bool { return $number1 > $number2 && !self::fuzzyEquals($number1, $number2); } public static function fuzzyGreaterThanOrEquals(float $number1, float $number2): bool { return $number1 >= $number2 || self::fuzzyEquals($number1, $number2); } public static function fuzzyIsInt(float $number): bool { if (is_infinite($number) || is_nan($number)) { return false; } return self::fuzzyEquals($number, round($number)); } public static function fuzzyAsInt(float $number): ?int { if (is_infinite($number) || is_nan($number)) { return null; } if ($number > \PHP_INT_MAX || $number < \PHP_INT_MIN) { return null; } $rounded = (int) round($number); return self::fuzzyEquals($number, $rounded) ? $rounded : null; } public static function fuzzyRound(float $number): int { if ($number > 0) { return intval(self::fuzzyLessThan(fmod($number, 1), 0.5) ? floor($number) : ceil($number)); } return intval(self::fuzzyLessThanOrEquals(fmod($number, 1), 0.5) ? floor($number) : ceil($number)); } public static function fuzzyCheckRange(float $number, float $min, float $max): ?float { if (self::fuzzyEquals($number, $min)) { return $min; } if (self::fuzzyEquals($number, $max)) { return $max; } if ($number > $min && $number < $max) { return $number; } return null; } /** * @throws \OutOfRangeException */ public static function fuzzyAssertRange(float $number, float $min, float $max, ?string $name = null): float { $result = self::fuzzyCheckRange($number, $min, $max); if (!\is_null($result)) { return $result; } $nameDisplay = $name ? " $name" : ''; throw new \OutOfRangeException("Invalid value:$nameDisplay must be between $min and $max: $number."); } /** * Returns $num1 / $num2, using Sass's division semantic. * * Sass allows dividing by 0. */ public static function divideLikeSass(float $num1, float $num2): float { if ($num2 == 0) { if ($num1 == 0) { return NAN; } if ($num1 > 0) { return INF; } return -INF; } return $num1 / $num2; } /** * Return $num1 modulo $num2, using Sass's [floored division] modulo * semantics, which it inherited from Ruby and which differ from Dart's. * * [floored division]: https://en.wikipedia.org/wiki/Modulo_operation#Variants_of_the_definition */ public static function moduloLikeSass(float $num1, float $num2): float { if (is_infinite($num1)) { return NAN; } if (is_infinite($num2)) { return self::signIncludingZero($num1) === self::sign($num2) ? $num1 : NAN; } if ($num2 == 0) { return NAN; } $result = fmod($num1, $num2); if ($result == 0) { return 0; } // PHP's fdiv has a different semantic when the 2 numbers have a different sign. if ($num2 < 0 xor $num1 < 0) { $result += $num2; } return $result; } public static function sqrt(SassNumber $number): SassNumber { $number->assertNoUnits('number'); return SassNumber::create(sqrt($number->getValue())); } public static function sin(SassNumber $number): SassNumber { return SassNumber::create(sin($number->coerceValueToUnit('rad', 'number'))); } public static function cos(SassNumber $number): SassNumber { return SassNumber::create(cos($number->coerceValueToUnit('rad', 'number'))); } public static function tan(SassNumber $number): SassNumber { return SassNumber::create(tan($number->coerceValueToUnit('rad', 'number'))); } public static function atan(SassNumber $number): SassNumber { $number->assertNoUnits('number'); return self::radiansToDegrees(atan($number->getValue())); } public static function asin(SassNumber $number): SassNumber { $number->assertNoUnits('number'); return self::radiansToDegrees(asin($number->getValue())); } public static function acos(SassNumber $number): SassNumber { $number->assertNoUnits('number'); return self::radiansToDegrees(acos($number->getValue())); } public static function abs(SassNumber $number): SassNumber { return SassNumber::create(abs($number->getValue()))->coerceToMatch($number); } public static function log(SassNumber $number, ?SassNumber $base): SassNumber { if ($base !== null) { return SassNumber::create(self::divideLikeSass(log($number->getValue()), log($base->getValue()))); } return SassNumber::create(log($number->getValue())); } public static function pow(SassNumber $base, SassNumber $exponent): SassNumber { $base->assertNoUnits('base'); $exponent->assertNoUnits('exponent'); if (\PHP_VERSION_ID >= 80400) { $value = fpow($base->getValue(), $exponent->getValue()); } else { $value = $base->getValue() ** $exponent->getValue(); } return SassNumber::create($value); } public static function atan2(SassNumber $y, SassNumber $x): SassNumber { return self::radiansToDegrees(atan2($y->getValue(), $x->convertValueToMatch($y, 'x', 'y'))); } private static function radiansToDegrees(float $radians): SassNumber { return SassNumber::withUnits($radians * (180 / \M_PI), ['deg']); } public static function sign(float $num): int { if ($num > 0) { return 1; } if ($num < 0) { return -1; } return 0; } public static function signIncludingZero(float $num): int { // In PHP, negative 0 and positive 0 are equal even for strict equality, so we need a different detection if ($num === 0.0) { if ('-0' === (string) $num) { return -1; } return 1; } return self::sign($num); } } PKCA#]ptOP��Msystem/helixultimate/vendor/scssphp/scssphp/src/Value/CalculationOperator.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; /** * An enumeration of possible operators for {@see CalculationOperation}. */ enum CalculationOperator { case PLUS; case MINUS; case TIMES; case DIVIDED_BY; public function getOperator(): string { return match ($this) { self::PLUS => '+', self::MINUS => '-', self::TIMES => '*', self::DIVIDED_BY => '/', }; } /** * The precedence of the operator * * An operator with higher precedence binds tighter. * * @internal */ public function getPrecedence(): int { return match ($this) { self::PLUS, self::MINUS => 1, self::TIMES, self::DIVIDED_BY => 2, }; } } PKCA#]��&:��Lsystem/helixultimate/vendor/scssphp/scssphp/src/Value/UnitlessSassNumber.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use ScssPhp\ScssPhp\Util\NumberUtil; /** * A specialized subclass of {@see SassNumber} for numbers that have no units. * * @internal */ final class UnitlessSassNumber extends SassNumber { /** * @param array{SassNumber, SassNumber}|null $asSlash */ public function __construct(float $value, ?array $asSlash = null) { parent::__construct($value, $asSlash); } public function getNumeratorUnits(): array { return []; } public function getDenominatorUnits(): array { return []; } public function hasUnits(): bool { return false; } public function hasComplexUnits(): bool { return false; } protected function withValue(float $value): SassNumber { return new self($value); } public function withSlash(SassNumber $numerator, SassNumber $denominator): SassNumber { return new self($this->getValue(), array($numerator, $denominator)); } public function hasUnit(string $unit): bool { return false; } public function hasCompatibleUnits(SassNumber $other): bool { return $other instanceof UnitlessSassNumber; } public function hasPossiblyCompatibleUnits(SassNumber $other): bool { return $other instanceof UnitlessSassNumber; } public function compatibleWithUnit(string $unit): bool { return true; } public function coerceToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): SassNumber { return $other->withValue($this->getValue()); } public function coerceValueToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): float { return $this->getValue(); } public function convertToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): SassNumber { if (!$other->hasUnits()) { return $this; } // Call the parent to generate a consistent error message. return parent::convertToMatch($other, $name, $otherName); } public function convertValueToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): float { if (!$other->hasUnits()) { return $this->getValue(); } // Call the parent to generate a consistent error message. return parent::convertValueToMatch($other, $name, $otherName); } public function coerce(array $newNumeratorUnits, array $newDenominatorUnits, ?string $name = null): SassNumber { return SassNumber::withUnits($this->getValue(), $newNumeratorUnits, $newDenominatorUnits); } public function coerceValue(array $newNumeratorUnits, array $newDenominatorUnits, ?string $name = null): float { return $this->getValue(); } public function coerceValueToUnit(string $unit, ?string $name = null): float { return $this->getValue(); } public function greaterThan(Value $other): SassBoolean { if ($other instanceof SassNumber) { return SassBoolean::create(NumberUtil::fuzzyGreaterThan($this->getValue(), $other->getValue())); } return parent::greaterThan($other); } public function greaterThanOrEquals(Value $other): SassBoolean { if ($other instanceof SassNumber) { return SassBoolean::create(NumberUtil::fuzzyGreaterThanOrEquals($this->getValue(), $other->getValue())); } return parent::greaterThanOrEquals($other); } public function lessThan(Value $other): SassBoolean { if ($other instanceof SassNumber) { return SassBoolean::create(NumberUtil::fuzzyLessThan($this->getValue(), $other->getValue())); } return parent::lessThan($other); } public function lessThanOrEquals(Value $other): SassBoolean { if ($other instanceof SassNumber) { return SassBoolean::create(NumberUtil::fuzzyLessThanOrEquals($this->getValue(), $other->getValue())); } return parent::lessThanOrEquals($other); } public function modulo(Value $other): SassNumber { if ($other instanceof SassNumber) { return $other->withValue(NumberUtil::moduloLikeSass($this->getValue(), $other->getValue())); } return parent::modulo($other); } public function plus(Value $other): Value { if ($other instanceof SassNumber) { return $other->withValue($this->getValue() + $other->getValue()); } return parent::plus($other); } public function minus(Value $other): Value { if ($other instanceof SassNumber) { return $other->withValue($this->getValue() - $other->getValue()); } return parent::minus($other); } public function times(Value $other): Value { if ($other instanceof SassNumber) { return $other->withValue($this->getValue() * $other->getValue()); } return parent::times($other); } public function dividedBy(Value $other): Value { if ($other instanceof SassNumber) { $value = NumberUtil::divideLikeSass($this->getValue(), $other->getValue()); if ($other->hasUnits()) { return SassNumber::withUnits($value, $other->getDenominatorUnits(), $other->getNumeratorUnits()); } return new self($value); } return parent::dividedBy($other); } public function unaryMinus(): Value { return new self(-$this->getValue()); } public function equals(object $other): bool { return $other instanceof UnitlessSassNumber && NumberUtil::fuzzyEquals($this->getValue(), $other->getValue()); } } PKCA#]�%0��Jsystem/helixultimate/vendor/scssphp/scssphp/src/Value/SassArgumentList.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; /** * A SassScript argument list. * * An argument list comes from a rest argument. It's distinct from a normal * {@see SassList} in that it may contain a keyword map as well as the positional * arguments. */ final class SassArgumentList extends SassList { /** * @var array<string, Value> */ private readonly array $keywords; private bool $keywordAccessed = false; /** * SassArgumentList constructor. * * @param list<Value> $contents * @param array<string, Value> $keywords */ public function __construct(array $contents, array $keywords, ListSeparator $separator) { parent::__construct($contents, $separator); $this->keywords = $keywords; } /** * @return array<string, Value> */ public function getKeywords(): array { $this->keywordAccessed = true; return $this->keywords; } /** * @internal */ public function wereKeywordAccessed(): bool { return $this->keywordAccessed; } } PKCA#]5�%�*�*Nsystem/helixultimate/vendor/scssphp/scssphp/src/Value/SingleUnitSassNumber.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use ScssPhp\ScssPhp\Util\NumberUtil; /** * A specialized subclass of {@see SassNumber} for numbers that have exactly one numerator unit. * * @internal */ final class SingleUnitSassNumber extends SassNumber { private const COMPATIBLE_LENGTH_UNITS = ['em', 'rem', 'ex', 'rex', 'cap', 'rcap', 'ch', 'rch', 'ic', 'ric', 'lh', 'rlh', 'vw', 'lvw', 'svw', 'dvw', 'vh', 'lvh', 'svh', 'dvh', 'vi', 'lvi', 'svi', 'dvi', 'vb', 'lvb', 'svb', 'dvb', 'vmin', 'lvmin', 'svmin', 'dvmin', 'vmax', 'lvmax', 'svmax', 'dvmax', 'cqw', 'cqh', 'cqi', 'cqb', 'cqmin', 'cqmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px']; private const KNOWN_COMPATIBILITIES_BY_UNIT = [ // length 'em' => self::COMPATIBLE_LENGTH_UNITS, 'rem' => self::COMPATIBLE_LENGTH_UNITS, 'ex' => self::COMPATIBLE_LENGTH_UNITS, 'rex' => self::COMPATIBLE_LENGTH_UNITS, 'cap' => self::COMPATIBLE_LENGTH_UNITS, 'rcap' => self::COMPATIBLE_LENGTH_UNITS, 'ch' => self::COMPATIBLE_LENGTH_UNITS, 'rch' => self::COMPATIBLE_LENGTH_UNITS, 'ic' => self::COMPATIBLE_LENGTH_UNITS, 'ric' => self::COMPATIBLE_LENGTH_UNITS, 'lh' => self::COMPATIBLE_LENGTH_UNITS, 'rlh' => self::COMPATIBLE_LENGTH_UNITS, 'vw' => self::COMPATIBLE_LENGTH_UNITS, 'lvw' => self::COMPATIBLE_LENGTH_UNITS, 'svw' => self::COMPATIBLE_LENGTH_UNITS, 'dvw' => self::COMPATIBLE_LENGTH_UNITS, 'vh' => self::COMPATIBLE_LENGTH_UNITS, 'lvh' => self::COMPATIBLE_LENGTH_UNITS, 'svh' => self::COMPATIBLE_LENGTH_UNITS, 'dvh' => self::COMPATIBLE_LENGTH_UNITS, 'vi' => self::COMPATIBLE_LENGTH_UNITS, 'lvi' => self::COMPATIBLE_LENGTH_UNITS, 'svi' => self::COMPATIBLE_LENGTH_UNITS, 'dvi' => self::COMPATIBLE_LENGTH_UNITS, 'vb' => self::COMPATIBLE_LENGTH_UNITS, 'lvb' => self::COMPATIBLE_LENGTH_UNITS, 'svb' => self::COMPATIBLE_LENGTH_UNITS, 'dvb' => self::COMPATIBLE_LENGTH_UNITS, 'vmin' => self::COMPATIBLE_LENGTH_UNITS, 'lvmin' => self::COMPATIBLE_LENGTH_UNITS, 'svmin' => self::COMPATIBLE_LENGTH_UNITS, 'dvmin' => self::COMPATIBLE_LENGTH_UNITS, 'vmax' => self::COMPATIBLE_LENGTH_UNITS, 'lvmax' => self::COMPATIBLE_LENGTH_UNITS, 'svmax' => self::COMPATIBLE_LENGTH_UNITS, 'dvmax' => self::COMPATIBLE_LENGTH_UNITS, 'cqw' => self::COMPATIBLE_LENGTH_UNITS, 'cqh' => self::COMPATIBLE_LENGTH_UNITS, 'cqi' => self::COMPATIBLE_LENGTH_UNITS, 'cqb' => self::COMPATIBLE_LENGTH_UNITS, 'cqmin' => self::COMPATIBLE_LENGTH_UNITS, 'cqmax' => self::COMPATIBLE_LENGTH_UNITS, 'cm' => self::COMPATIBLE_LENGTH_UNITS, 'mm' => self::COMPATIBLE_LENGTH_UNITS, 'q' => self::COMPATIBLE_LENGTH_UNITS, 'in' => self::COMPATIBLE_LENGTH_UNITS, 'pc' => self::COMPATIBLE_LENGTH_UNITS, 'pt' => self::COMPATIBLE_LENGTH_UNITS, 'px' => self::COMPATIBLE_LENGTH_UNITS, // angle 'deg' => ['deg', 'grad', 'rad', 'turn'], 'grad' => ['deg', 'grad', 'rad', 'turn'], 'rad' => ['deg', 'grad', 'rad', 'turn'], 'turn' => ['deg', 'grad', 'rad', 'turn'], // time 's' => ['s', 'ms'], 'ms' => ['s', 'ms'], // frequency 'hz' => ['hz', 'khz'], 'khz' => ['hz', 'khz'], // pixel density 'dpi' => ['dpi', 'dpcm', 'dppx'], 'dpcm' => ['dpi', 'dpcm', 'dppx'], 'dppx' => ['dpi', 'dpcm', 'dppx'], ]; private readonly string $unit; /** * @param array{SassNumber, SassNumber}|null $asSlash */ public function __construct(float $value, string $unit, ?array $asSlash = null) { parent::__construct($value, $asSlash); $this->unit = $unit; } public function getNumeratorUnits(): array { return [$this->unit]; } public function getDenominatorUnits(): array { return []; } public function hasUnits(): bool { return true; } public function hasComplexUnits(): bool { return false; } protected function withValue(float $value): SassNumber { return new self($value, $this->unit); } public function withSlash(SassNumber $numerator, SassNumber $denominator): SassNumber { return new self($this->getValue(), $this->unit, array($numerator, $denominator)); } public function hasUnit(string $unit): bool { return $unit === $this->unit; } public function hasCompatibleUnits(SassNumber $other): bool { return $other instanceof SingleUnitSassNumber && $this->compatibleWithUnit($other->unit); } public function hasPossiblyCompatibleUnits(SassNumber $other): bool { if (!$other instanceof SingleUnitSassNumber) { return false; } $knownCompatibilities = self::KNOWN_COMPATIBILITIES_BY_UNIT[strtolower($this->unit)] ?? null; if ($knownCompatibilities === null) { return true; } $otherUnit = strtolower($other->unit); return !isset(self::KNOWN_COMPATIBILITIES_BY_UNIT[$otherUnit]) || \in_array($otherUnit, $knownCompatibilities, true); } public function compatibleWithUnit(string $unit): bool { return self::getConversionFactor($this->unit, $unit) !== null; } public function coerceToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): SassNumber { if ($other instanceof SingleUnitSassNumber) { $coerced = $this->tryCoerceToUnit($other->unit); if ($coerced !== null) { return $coerced; } } // Call the parent to generate a consistent error message. return parent::coerceToMatch($other, $name, $otherName); } public function coerceValueToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): float { if ($other instanceof SingleUnitSassNumber) { $coerced = $this->tryCoerceValueToUnit($other->unit); if ($coerced !== null) { return $coerced; } } // Call the parent to generate a consistent error message. return parent::coerceValueToMatch($other, $name, $otherName); } public function convertToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): SassNumber { if ($other instanceof SingleUnitSassNumber) { $coerced = $this->tryCoerceToUnit($other->unit); if ($coerced !== null) { return $coerced; } } // Call the parent to generate a consistent error message. return parent::convertToMatch($other, $name, $otherName); } public function convertValueToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): float { if ($other instanceof SingleUnitSassNumber) { $coerced = $this->tryCoerceValueToUnit($other->unit); if ($coerced !== null) { return $coerced; } } // Call the parent to generate a consistent error message. return parent::convertValueToMatch($other, $name, $otherName); } public function coerce(array $newNumeratorUnits, array $newDenominatorUnits, ?string $name = null): SassNumber { if (\count($newNumeratorUnits) === 1 && \count($newDenominatorUnits) === 0) { $coerced = $this->tryCoerceToUnit($newNumeratorUnits[0]); if ($coerced !== null) { return $coerced; } } // Call the parent to generate a consistent error message. return parent::coerce($newNumeratorUnits, $newDenominatorUnits, $name); } public function coerceValue(array $newNumeratorUnits, array $newDenominatorUnits, ?string $name = null): float { if (\count($newNumeratorUnits) === 1 && \count($newDenominatorUnits) === 0) { $coerced = $this->tryCoerceValueToUnit($newNumeratorUnits[0]); if ($coerced !== null) { return $coerced; } } // Call the parent to generate a consistent error message. return parent::coerceValue($newNumeratorUnits, $newDenominatorUnits, $name); } public function coerceValueToUnit(string $unit, ?string $name = null): float { $coerced = $this->tryCoerceValueToUnit($unit); if ($coerced !== null) { return $coerced; } // Call the parent to generate a consistent error message. return parent::coerceValueToUnit($unit, $name); } public function unaryMinus(): Value { return new self(-$this->getValue(), $this->unit); } public function equals(object $other): bool { if ($other instanceof SingleUnitSassNumber) { $factor = self::getConversionFactor($other->unit, $this->unit); return $factor !== null && NumberUtil::fuzzyEquals($this->getValue() * $factor, $other->getValue()); } return false; } /** * @param list<string> $otherNumerators * @param list<string> $otherDenominators */ protected function multiplyUnits(float $value, array $otherNumerators, array $otherDenominators): SassNumber { $newNumerators = $otherNumerators; $removed = false; foreach ($otherDenominators as $key => $denominator) { $conversionFactor = self::getConversionFactor($denominator, $this->unit); if (\is_null($conversionFactor)) { continue; } $value *= $conversionFactor; unset($otherDenominators[$key]); $removed = true; break; } if (!$removed) { array_unshift($newNumerators, $this->unit); } return SassNumber::withUnits($value, $newNumerators, array_values($otherDenominators)); } private function tryCoerceToUnit(string $unit): ?SassNumber { if ($unit === $this->unit) { return $this; } $factor = self::getConversionFactor($unit, $this->unit); if ($factor === null) { return null; } return new SingleUnitSassNumber($this->getValue() * $factor, $unit); } private function tryCoerceValueToUnit(string $unit): ?float { $factor = self::getConversionFactor($unit, $this->unit); if ($factor === null) { return null; } return $this->getValue() * $factor; } } PKCA#]8����Dsystem/helixultimate/vendor/scssphp/scssphp/src/Value/SassString.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Visitor\ValueVisitor; /** * A SassScript string. * * Strings can either be quoted or unquoted. Unquoted strings are usually CSS * identifiers, but they may contain any text. */ final class SassString extends Value { /** * The contents of the string. * * For quoted strings, this is the semantic content—any escape sequences that * were been written in the source text are resolved to their Unicode values. * For unquoted strings, though, escape sequences are preserved as literal * backslashes. * * This difference allows us to distinguish between identifiers with escapes, * such as `url\u28 http://example.com\u29`, and unquoted strings that * contain characters that aren't valid in identifiers, such as * `url(http://example.com)`. Unfortunately, it also means that we don't * consider `foo` and `f\6F\6F` the same string. */ private readonly string $text; /** * Whether this string has quotes. */ private readonly bool $quotes; public function __construct(string $text, bool $quotes = true) { $this->text = $text; $this->quotes = $quotes; } public function getText(): string { return $this->text; } public function hasQuotes(): bool { return $this->quotes; } public function getSassLength(): int { return mb_strlen($this->text, 'UTF-8'); } public function isSpecialNumber(): bool { if ($this->quotes) { return false; } if (\strlen($this->text) < \strlen('min(_)')) { return false; } $first = $this->text[0]; if ($first === 'c' || $first === 'C') { $second = $this->text[1]; if ($second === 'l' || $second === 'L') { return ($this->text[2] === 'a' || $this->text[2] === 'A') && ($this->text[3] === 'm' || $this->text[3] === 'M') && ($this->text[4] === 'p' || $this->text[4] === 'P') && $this->text[5] === '('; } if ($second === 'a' || $second === 'A') { return ($this->text[2] === 'l' || $this->text[2] === 'L') && ($this->text[3] === 'c' || $this->text[3] === 'C') && $this->text[4] === '('; } return false; } if ($first === 'v' || $first === 'V') { return ($this->text[1] === 'a' || $this->text[1] === 'A') && ($this->text[2] === 'r' || $this->text[2] === 'R') && $this->text[3] === '('; } if ($first === 'e' || $first === 'E') { return ($this->text[1] === 'n' || $this->text[1] === 'N') && ($this->text[2] === 'v' || $this->text[2] === 'V') && $this->text[3] === '('; } if ($first === 'm' || $first === 'M') { $second = $this->text[1]; if ($second === 'a' || $second === 'A') { return ($this->text[2] === 'x' || $this->text[2] === 'X') && $this->text[3] === '('; } if ($second === 'i' || $second === 'I') { return ($this->text[2] === 'n' || $this->text[2] === 'N') && $this->text[3] === '('; } return false; } return false; } public function isVar(): bool { if ($this->quotes) { return false; } if (\strlen($this->text) < \strlen('var(--_)')) { return false; } return ($this->text[0] === 'v' || $this->text[0] === 'V') && ($this->text[1] === 'a' || $this->text[1] === 'A') && ($this->text[2] === 'r' || $this->text[2] === 'R') && $this->text[3] === '('; } public function isBlank(): bool { return !$this->quotes && $this->text === ''; } /** * Converts $sassIndex into a PHP-style index into {@see text}. * * Sass indexes are one-based, while PHP indexes are zero-based. Sass * indexes may also be negative in order to index from the end of the string. * * In addition, Sass indices refer to Unicode code points while PHP string * indices refer to bytes. For example, the character U+1F60A, * Smiling Face With Smiling Eyes, is a single Unicode code point but is * represented in UTF-8 as several bytes (`0xF0`, `0x9F`, `0x98` and `0x8A`). So in * PHP, `substr("a😊b", 1, 1)` returns `"\xF0"`, whereas in Sass * `str-slice("a😊b", 1, 1)` returns `"😊"`. * * @throws SassScriptException if $sassIndex isn't a number, if that * number isn't an integer, or if that integer isn't a valid index for this * string. If $sassIndex came from a function argument, $name is the * argument name (without the `$`). It's used for error reporting. */ public function sassIndexToStringIndex(Value $sassIndex, ?string $name = null): int { $codepointIndex = $this->sassIndexToCodePointIndex($sassIndex, $name); if ($codepointIndex === 0) { return 0; } return \strlen(mb_substr($this->text, 0, $codepointIndex, 'UTF-8')); } /** * Converts $sassIndex into a PHP-style index into codepoints. * * This index is suitable to use with functions dealing with codepoints * (i.e. the mbstring functions). * * Sass indexes are one-based, while PHP indexes are zero-based. Sass * indexes may also be negative in order to index from the end of the string. * * See also {@see sassIndexToStringIndex}, which is an index into {@see getText} directly. * * @throws SassScriptException if $sassIndex isn't a number, if that * number isn't an integer, or if that integer isn't a valid index for this * string. If $sassIndex came from a function argument, $name is the * argument name (without the `$`). It's used for error reporting. */ public function sassIndexToCodePointIndex(Value $sassIndex, ?string $name = null): int { $index = $sassIndex->assertNumber($name)->assertInt($name); if ($index === 0) { throw SassScriptException::forArgument('String index may not be 0.', $name); } $sassLength = $this->getSassLength(); if (abs($index) > $sassLength) { throw SassScriptException::forArgument("Invalid index $sassIndex for a string with $sassLength characters.", $name); } return $index < 0 ? $sassLength + $index : $index - 1; } public function accept(ValueVisitor $visitor) { return $visitor->visitString($this); } public function assertString(?string $name = null): SassString { return $this; } public function plus(Value $other): Value { if ($other instanceof SassString) { return new SassString($this->text . $other->getText(), $this->quotes); } return new SassString($this->text . $other->toCssString(), $this->quotes); } public function equals(object $other): bool { return $other instanceof SassString && $this->text === $other->text; } } PKCA#]|��O�O?system/helixultimate/vendor/scssphp/scssphp/src/Value/Value.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use JiriPudil\SealedClasses\Sealed; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelector; use ScssPhp\ScssPhp\Ast\Selector\CompoundSelector; use ScssPhp\ScssPhp\Ast\Selector\SelectorList; use ScssPhp\ScssPhp\Ast\Selector\SimpleSelector; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Serializer\Serializer; use ScssPhp\ScssPhp\Util\Equatable; use ScssPhp\ScssPhp\Visitor\ValueVisitor; use ScssPhp\ScssPhp\Warn; /** * A SassScript value. * * All SassScript values are unmodifiable. New values can be constructed using * subclass constructors like `new SassString`. Untyped values can be cast to * particular types using `assert*()` functions like {@see assertString}, which * throw user-friendly error messages if they fail. */ #[Sealed(permits: [SassBoolean::class, SassCalculation::class, SassColor::class, SassFunction::class, SassList::class, SassMap::class, SassMixin::class, SassNull::class, SassNumber::class, SassString::class])] abstract class Value implements Equatable, \Stringable { /** * Whether the value counts as `true` in an `@if` statement and other contexts */ public function isTruthy(): bool { return true; } /** * The separator for this value as a list. * * All SassScript values can be used as lists. Maps count as lists of pairs, * and all other values count as single-value lists. */ public function getSeparator(): ListSeparator { return ListSeparator::UNDECIDED; } /** * Whether this value as a list has brackets. * * All SassScript values can be used as lists. Maps count as lists of pairs, * and all other values count as single-value lists. */ public function hasBrackets(): bool { return false; } /** * This value as a list. * * All SassScript values can be used as lists. Maps count as lists of pairs, * and all other values count as single-value lists. * * @return list<Value> */ public function asList(): array { return [$this]; } /** * The length of {@see asList}. * * This is used to compute {@see sassIndexToListIndex} without allocating a new * list. */ protected function getLengthAsList(): int { return 1; } /** * Calls the appropriate visit method on $visitor. * * @template T * * @param ValueVisitor<T> $visitor * * @return T * * @internal */ abstract public function accept(ValueVisitor $visitor); /** * Converts $sassIndex into a PHP-style index into the list returned by * {@see asList}. * * Sass indexes are one-based, while PHP indexes are zero-based. Sass * indexes may also be negative in order to index from the end of the list. * * @throws SassScriptException if $sassIndex isn't a number, if that * number isn't an integer, or if that integer isn't a valid index for * {@see asList}. If $sassIndex came from a function argument, $name is the * argument name (without the `$`). It's used for error reporting. */ public function sassIndexToListIndex(Value $sassIndex, ?string $name = null): int { $indexValue = $sassIndex->assertNumber($name); if ($indexValue->hasUnits()) { $message = <<<WARNING \$$name: Passing a number with unit {$indexValue->getUnitString()} is deprecated. To preserve current behavior: {$indexValue->unitSuggestion($name ?? 'index')} More info: https://sass-lang.com/d/function-units WARNING; Warn::forDeprecation($message, Deprecation::functionUnits); } $index = $indexValue->assertInt($name); if ($index === 0) { throw SassScriptException::forArgument('List index may not be 0.', $name); } $lengthAsList = $this->getLengthAsList(); if (abs($index) > $lengthAsList) { throw SassScriptException::forArgument("Invalid index $sassIndex for a list with $lengthAsList elements.", $name); } return $index < 0 ? $lengthAsList + $index : $index - 1; } /** * Throws a {@see SassScriptException} if $this isn't a boolean. * * Note that generally, functions should use {@see isTruthy} rather than requiring * a literal boolean. * * If this came from a function argument, $name is the argument name * (without the `$`). It's used for error reporting. * * @throws SassScriptException */ public function assertBoolean(?string $name = null): SassBoolean { throw SassScriptException::forArgument("$this is not a boolean.", $name); } /** * Throws a {@see SassScriptException} if $this isn't a calculation. * * If this came from a function argument, $name is the argument name * (without the `$`). It's used for error reporting. * * @throws SassScriptException */ public function assertCalculation(?string $name = null): SassCalculation { throw SassScriptException::forArgument("$this is not a calculation.", $name); } /** * Throws a {@see SassScriptException} if $this isn't a color. * * If this came from a function argument, $name is the argument name * (without the `$`). It's used for error reporting. * * @throws SassScriptException */ public function assertColor(?string $name = null): SassColor { throw SassScriptException::forArgument("$this is not a color.", $name); } /** * Throws a {@see SassScriptException} if $this isn't a function reference. * * If this came from a function argument, $name is the argument name * (without the `$`). It's used for error reporting. * * @throws SassScriptException */ public function assertFunction(?string $name = null): SassFunction { throw SassScriptException::forArgument("$this is not a function reference.", $name); } /** * Throws a {@see SassScriptException} if $this isn't a mixin reference. * * If this came from a function argument, $name is the argument name * (without the `$`). It's used for error reporting. * * @throws SassScriptException */ public function assertMixin(?string $name = null): SassMixin { throw SassScriptException::forArgument("$this is not a mixin reference.", $name); } /** * Throws a {@see SassScriptException} if $this isn't a map. * * If this came from a function argument, $name is the argument name * (without the `$`). It's used for error reporting. * * @throws SassScriptException */ public function assertMap(?string $name = null): SassMap { throw SassScriptException::forArgument("$this is not a map.", $name); } /** * Return $this as a SassMap if it is one (including empty lists) or null otherwise. */ public function tryMap(): ?SassMap { return null; } /** * Throws a {@see SassScriptException} if $this isn't a number. * * If this came from a function argument, $name is the argument name * (without the `$`). It's used for error reporting. * * @throws SassScriptException */ public function assertNumber(?string $name = null): SassNumber { throw SassScriptException::forArgument("$this is not a number.", $name); } /** * Throws a {@see SassScriptException} if $this isn't a string. * * If this came from a function argument, $name is the argument name * (without the `$`). It's used for error reporting. * * @throws SassScriptException */ public function assertString(?string $name = null): SassString { throw SassScriptException::forArgument("$this is not a string.", $name); } /** * Parses $this as a selector list, in the same manner as the * `selector-parse()` function. * * @throws SassScriptException if this isn't a type that can be parsed as a * selector, or if parsing fails. If $allowParent is `true`, this allows * {@see ParentSelector}s. Otherwise, they're considered parse errors. * * If this came from a function argument, $name is the argument name * (without the `$`). It's used for error reporting. * * @internal */ public function assertSelector(?string $name = null, bool $allowParent = false): SelectorList { $string = $this->selectorString($name); try { return SelectorList::parse($string, null, null, null, $allowParent); } catch (SassFormatException $e) { throw SassScriptException::forArgument($e->getMessage(), $name, $e); } } /** * Parses $this as a simple selector, in the same manner as the * `selector-parse()` function. * * @throws SassScriptException if this isn't a type that can be parsed as a * selector, or if parsing fails. If $allowParent is `true`, this allows * {@see ParentSelector}s. Otherwise, they're considered parse errors. * * If this came from a function argument, $name is the argument name * (without the `$`). It's used for error reporting. * * @internal */ public function assertSimpleSelector(?string $name = null, bool $allowParent = false): SimpleSelector { $string = $this->selectorString($name); try { return SimpleSelector::parse($string, null, null, $allowParent); } catch (SassFormatException $e) { throw SassScriptException::forArgument($e->getMessage(), $name, $e); } } /** * Parses $this as a compound selector, in the same manner as the * `selector-parse()` function. * * @throws SassScriptException if this isn't a type that can be parsed as a * selector, or if parsing fails. If $allowParent is `true`, this allows * {@see ParentSelector}s. Otherwise, they're considered parse errors. * * If this came from a function argument, $name is the argument name * (without the `$`). It's used for error reporting. * * @internal */ public function assertCompoundSelector(?string $name = null, bool $allowParent = false): CompoundSelector { $string = $this->selectorString($name); try { return CompoundSelector::parse($string, null, null, $allowParent); } catch (SassFormatException $e) { throw SassScriptException::forArgument($e->getMessage(), $name, $e); } } /** * Parses $this as a complex selector, in the same manner as the * `selector-parse()` function. * * @throws SassScriptException if this isn't a type that can be parsed as a * selector, or if parsing fails. If $allowParent is `true`, this allows * {@see ParentSelector}s. Otherwise, they're considered parse errors. * * If this came from a function argument, $name is the argument name * (without the `$`). It's used for error reporting. * * @internal */ public function assertComplexSelector(?string $name = null, bool $allowParent = false): ComplexSelector { $string = $this->selectorString($name); try { return ComplexSelector::parse($string, null, null, $allowParent); } catch (SassFormatException $e) { throw SassScriptException::forArgument($e->getMessage(), $name, $e); } } /** * Converts a `selector-parse()`-style input into a string that can be * parsed. * * @throws SassScriptException if $this isn't a type or a structure that * can be parsed as a selector. */ private function selectorString(?string $name): string { $string = $this->selectorStringOrNull(); if ($string !== null) { return $string; } throw SassScriptException::forArgument("$this is not a valid selector: it must be a string,\na list of strings, or a list of lists of strings.", $name); } /** * Converts a `selector-parse()`-style input into a string that can be * parsed. * * Returns `null` if $this isn't a type or a structure that can be parsed as * a selector. */ private function selectorStringOrNull(): ?string { if ($this instanceof SassString) { return $this->getText(); } if (!$this instanceof SassList) { return null; } $list = $this; if (\count($list->asList()) === 0) { return null; } $result = []; switch ($list->getSeparator()) { case ListSeparator::COMMA: foreach ($list->asList() as $complex) { if ($complex instanceof SassString) { $result[] = $complex->getText(); } elseif ($complex instanceof SassList && $complex->getSeparator() === ListSeparator::SPACE) { $string = $complex->selectorStringOrNull(); if ($string === null) { return null; } $result[] = $string; } else { return null; } } break; case ListSeparator::SLASH: return null; default: foreach ($list->asList() as $compound) { if ($compound instanceof SassString) { $result[] = $compound->getText(); } else { return null; } } break; } return implode($list->getSeparator() === ListSeparator::COMMA ? ', ' : ' ', $result); } /** * Whether the value will be represented in CSS as the empty string. * * @internal */ public function isBlank(): bool { return false; } /** * Whether this is a value that CSS may treat as a number, such as `calc()` or `var()`. * * Functions that shadow plain CSS functions need to gracefully handle when * these arguments are passed in. * * @internal */ public function isSpecialNumber(): bool { return false; } /** * Whether this is a call to `var()`, which may be substituted in CSS for a custom property value. * * Functions that shadow plain CSS functions need to gracefully handle when * these arguments are passed in. * * @internal */ public function isVar(): bool { return false; } /** * Returns PHP's `null` value if this is Sass null, and returns `$this` otherwise */ public function realNull(): ?Value { return $this; } /** * Returns a new list containing $contents that defaults to this value's * separator and brackets. * * @param list<Value> $contents */ public function withListContents(array $contents, ?ListSeparator $separator = null, ?bool $brackets = null): SassList { return new SassList($contents, $separator ?? $this->getSeparator(), $brackets ?? $this->hasBrackets()); } /** * The SassScript = operation * * @internal */ public function singleEquals(Value $other): Value { return new SassString(sprintf('%s=%s', $this->toCssString(), $other->toCssString()), false); } /** * The SassScript `>` operation. * * @internal */ public function greaterThan(Value $other): SassBoolean { throw new SassScriptException("Undefined operation \"$this > $other\"."); } /** * The SassScript `>=` operation. * * @internal */ public function greaterThanOrEquals(Value $other): SassBoolean { throw new SassScriptException("Undefined operation \"$this >= $other\"."); } /** * The SassScript `<` operation. * * @internal */ public function lessThan(Value $other): SassBoolean { throw new SassScriptException("Undefined operation \"$this < $other\"."); } /** * The SassScript `<=` operation. * * @internal */ public function lessThanOrEquals(Value $other): SassBoolean { throw new SassScriptException("Undefined operation \"$this <= $other\"."); } /** * The SassScript `*` operation. * * @internal */ public function times(Value $other): Value { throw new SassScriptException("Undefined operation \"$this * $other\"."); } /** * The SassScript `%` operation. * * @internal */ public function modulo(Value $other): Value { throw new SassScriptException("Undefined operation \"$this % $other\"."); } /** * The SassScript `+` operation. * * @internal */ public function plus(Value $other): Value { if ($other instanceof SassString) { return new SassString($this->toCssString() . $other->getText(), $other->hasQuotes()); } if ($other instanceof SassCalculation) { throw new SassScriptException("Undefined operation \"$this + $other\"."); } return new SassString($this->toCssString() . $other->toCssString(), false); } /** * The SassScript `-` operation. * * @internal */ public function minus(Value $other): Value { if ($other instanceof SassCalculation) { throw new SassScriptException("Undefined operation \"$this - $other\"."); } return new SassString(sprintf('%s-%s', $this->toCssString(), $other->toCssString()), false); } /** * The SassScript `/` operation. * * @internal */ public function dividedBy(Value $other): Value { return new SassString(sprintf('%s/%s', $this->toCssString(), $other->toCssString()), false); } /** * The SassScript unary `+` operation. * * @internal */ public function unaryPlus(): Value { return new SassString(sprintf('+%s', $this->toCssString()), false); } /** * The SassScript unary `-` operation. * * @internal */ public function unaryMinus(): Value { return new SassString(sprintf('-%s', $this->toCssString()), false); } /** * The SassScript unary `/` operation. * * @internal */ public function unaryDivide(): Value { return new SassString(sprintf('/%s', $this->toCssString()), false); } /** * The SassScript unary `not` operation. * * @internal */ public function unaryNot(): Value { return SassBoolean::create(false); } /** * Returns a copy of $this without {@see SassNumber::$asSlash} set. * * If this isn't a SassNumber, return it as-is. * * @internal */ public function withoutSlash(): Value { return $this; } /** * Returns a valid CSS representation of $this. * * Use {@see toString} instead to get a string representation even if this * isn't valid CSS. * * Internal-only: If $quote is `false`, quoted strings are emitted without * quotes. * * @throws SassScriptException if $this cannot be represented in plain CSS. */ final public function toCssString(bool $quote = true): string { return Serializer::serializeValue($this, false, $quote); } /** * Returns a Sass representation of $this. * * Note that this is equivalent to calling `inspect()` on the value, and thus * won't reflect the user's output settings. {@see toCssString} should be used * instead to convert $this to CSS. */ final public function __toString(): string { return Serializer::serializeValue($this, true); } } PKCA#]���.�.Csystem/helixultimate/vendor/scssphp/scssphp/src/Value/SassColor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Util\ErrorUtil; use ScssPhp\ScssPhp\Util\NumberUtil; use ScssPhp\ScssPhp\Visitor\ValueVisitor; /** * A SassScript color. */ final class SassColor extends Value { /** * This color's red channel, between `0` and `255`. */ private ?int $red; /** * This color's blue channel, between `0` and `255`. */ private ?int $blue; /** * This color's green channel, between `0` and `255`. */ private ?int $green; /** * This color's hue, between `0` and `360`. */ private ?float $hue; /** * This color's saturation, a percentage between `0` and `100`. */ private ?float $saturation; /** * This color's lightness, a percentage between `0` and `100`. */ private ?float $lightness; /** * This color's alpha channel, between `0` and `1`. */ private readonly float $alpha; private readonly ?ColorFormat $format; /** * Creates a RGB color * * @throws \OutOfRangeException if values are outside the expected range. */ public static function rgb(int $red, int $green, int $blue, float $alpha = 1.0): SassColor { return self::rgbInternal($red, $green, $blue, $alpha); } /** * Like {@see rgb} but also takes a color format. * * @internal * * @throws \OutOfRangeException if values are outside the expected range. */ public static function rgbInternal(int $red, int $green, int $blue, float $alpha = 1.0, ?ColorFormat $format = null): SassColor { $alpha = NumberUtil::fuzzyAssertRange($alpha, 0, 1, 'alpha'); ErrorUtil::checkIntInInterval($red, 0, 255, 'red'); ErrorUtil::checkIntInInterval($green, 0, 255, 'green'); ErrorUtil::checkIntInInterval($blue, 0, 255, 'blue'); return new self($red, $green, $blue, null, null, null, $alpha, $format); } /** * @throws \OutOfRangeException if values are outside the expected range. */ public static function hsl(float $hue, float $saturation, float $lightness, float $alpha = 1.0): SassColor { return self::hslInternal($hue, $saturation, $lightness, $alpha); } /** * Like {@see hsl} but also takes a color format. * * @internal * * @throws \OutOfRangeException if values are outside the expected range. */ public static function hslInternal(float $hue, float $saturation, float $lightness, float $alpha = 1.0, ?ColorFormat $format = null): SassColor { $alpha = NumberUtil::fuzzyAssertRange($alpha, 0, 1, 'alpha'); $hue = fmod($hue, 360); if ($hue < 0) { $hue += 360; } $saturation = NumberUtil::fuzzyAssertRange($saturation, 0, 100, 'saturation'); $lightness = NumberUtil::fuzzyAssertRange($lightness, 0, 100, 'lightness'); return new self(null, null, null, $hue, $saturation, $lightness, $alpha, $format); } public static function hwb(float $hue, float $whiteness, float $blackness, float $alpha = 1.0): SassColor { $hue = fmod($hue, 360); if ($hue < 0) { $hue += 360; } $scaledHue = $hue / 360; $scaledWhiteness = NumberUtil::fuzzyAssertRange($whiteness, 0, 100, 'whiteness') / 100; $scaledBlackness = NumberUtil::fuzzyAssertRange($blackness, 0, 100, 'blackness') / 100; $sum = $scaledWhiteness + $scaledBlackness; if ($sum > 1) { $scaledWhiteness /= $sum; $scaledBlackness /= $sum; } $factor = 1 - $scaledWhiteness - $scaledBlackness; $toRgb = function (float $hue) use ($factor, $scaledWhiteness) { $channel = self::hueToRgb(0, 1, $hue) * $factor + $scaledWhiteness; return NumberUtil::fuzzyRound($channel * 255); }; return self::rgb($toRgb($scaledHue + 1 / 3), $toRgb($scaledHue), $toRgb($scaledHue - 1 / 3), $alpha); } /** * This must always provide non-null values for either RGB or HSL values. * If they are all provided, they are expected to be in sync and this not * revalidated. This constructor does not revalidate ranges either. * Use named factories when this cannot be guaranteed. */ private function __construct(?int $red, ?int $green, ?int $blue, ?float $hue, ?float $saturation, ?float $lightness, float $alpha, ?ColorFormat $format = null) { $this->red = $red; $this->green = $green; $this->blue = $blue; $this->hue = $hue; $this->saturation = $saturation; $this->lightness = $lightness; $this->alpha = $alpha; $this->format = $format; } public function getRed(): int { if (\is_null($this->red)) { $this->hslToRgb(); assert(!\is_null($this->red)); } return $this->red; } public function getGreen(): int { if (\is_null($this->green)) { $this->hslToRgb(); assert(!\is_null($this->green)); } return $this->green; } public function getBlue(): int { if (\is_null($this->blue)) { $this->hslToRgb(); assert(!\is_null($this->blue)); } return $this->blue; } public function getHue(): float { if (\is_null($this->hue)) { $this->rgbToHsl(); assert(!\is_null($this->hue)); } return $this->hue; } public function getSaturation(): float { if (\is_null($this->saturation)) { $this->rgbToHsl(); assert(!\is_null($this->saturation)); } return $this->saturation; } public function getLightness(): float { if (\is_null($this->lightness)) { $this->rgbToHsl(); assert(!\is_null($this->lightness)); } return $this->lightness; } public function getWhiteness(): float { return min($this->getRed(), $this->getGreen(), $this->getBlue()) / 255 * 100; } public function getBlackness(): float { return 100 - max($this->getRed(), $this->getGreen(), $this->getBlue()) / 255 * 100; } public function getAlpha(): float { return $this->alpha; } /** * The format in which this color was originally written and should be * serialized in expanded mode, or `null` if the color wasn't written in a * supported format. * * @internal */ public function getFormat(): ?ColorFormat { return $this->format; } public function accept(ValueVisitor $visitor) { return $visitor->visitColor($this); } public function assertColor(?string $name = null): SassColor { return $this; } public function changeRgb(?int $red = null, ?int $green = null, ?int $blue = null, ?float $alpha = null): SassColor { return self::rgb($red ?? $this->getRed(), $green ?? $this->getGreen(), $blue ?? $this->getBlue(), $alpha ?? $this->alpha); } public function changeHsl(?float $hue = null, ?float $saturation = null, ?float $lightness = null, ?float $alpha = null): SassColor { return self::hsl($hue ?? $this->getHue(), $saturation ?? $this->getSaturation(), $lightness ?? $this->getLightness(), $alpha ?? $this->alpha); } public function changeHwb(?float $hue = null, ?float $whiteness = null, ?float $blackness = null, ?float $alpha = null): SassColor { return self::hwb($hue ?? $this->getHue(), $whiteness ?? $this->getWhiteness(), $blackness ?? $this->getBlackness(), $alpha ?? $this->alpha); } public function changeAlpha(float $alpha): SassColor { return new self( $this->red, $this->green, $this->blue, $this->hue, $this->saturation, $this->lightness, NumberUtil::fuzzyAssertRange($alpha, 0, 1, 'alpha') ); } public function plus(Value $other): Value { if (!$other instanceof SassColor && !$other instanceof SassNumber) { return parent::plus($other); } throw new SassScriptException("Undefined operation \"$this + $other\"."); } public function minus(Value $other): Value { if (!$other instanceof SassColor && !$other instanceof SassNumber) { return parent::minus($other); } throw new SassScriptException("Undefined operation \"$this - $other\"."); } public function dividedBy(Value $other): Value { if (!$other instanceof SassColor && !$other instanceof SassNumber) { return parent::dividedBy($other); } throw new SassScriptException("Undefined operation \"$this / $other\"."); } public function modulo(Value $other): Value { if (!$other instanceof SassColor && !$other instanceof SassNumber) { return parent::modulo($other); } throw new SassScriptException("Undefined operation \"$this % $other\"."); } public function equals(object $other): bool { return $other instanceof SassColor && $this->getRed() === $other->getRed() && $this->getGreen() === $other->getGreen() && $this->getBlue() === $other->getBlue() && $this->alpha === $other->alpha; } private function rgbToHsl(): void { $scaledRed = $this->getRed() / 255; $scaledGreen = $this->getGreen() / 255; $scaledBlue = $this->getBlue() / 255; $min = min($scaledRed, $scaledGreen, $scaledBlue); $max = max($scaledRed, $scaledGreen, $scaledBlue); $delta = $max - $min; if ($delta == 0) { $this->hue = 0; } elseif ($max == $scaledRed) { $this->hue = fmod(60 * ($scaledGreen - $scaledBlue) / $delta, 360); } elseif ($max == $scaledGreen) { $this->hue = fmod(120 + 60 * ($scaledBlue - $scaledRed) / $delta, 360); } else { $this->hue = fmod(240 + 60 * ($scaledRed - $scaledGreen) / $delta, 360); } if ($this->hue < 0) { $this->hue += 360; } $this->lightness = 50 * ($max + $min); if ($max == $min) { $this->saturation = 0; } elseif ($this->lightness < 50) { $this->saturation = 100 * $delta / ($max + $min); } else { $this->saturation = 100 * $delta / (2 - $max - $min); } } private function hslToRgb(): void { $scaledHue = $this->getHue() / 360; $scaledSaturation = $this->getSaturation() / 100; $scaledLightness = $this->getLightness() / 100; if ($scaledLightness <= 0.5) { $m2 = $scaledLightness * ($scaledSaturation + 1); } else { $m2 = $scaledLightness + $scaledSaturation - $scaledLightness * $scaledSaturation; } $m1 = $scaledLightness * 2 - $m2; $this->red = NumberUtil::fuzzyRound(self::hueToRgb($m1, $m2, $scaledHue + 1 / 3) * 255); $this->green = NumberUtil::fuzzyRound(self::hueToRgb($m1, $m2, $scaledHue) * 255); $this->blue = NumberUtil::fuzzyRound(self::hueToRgb($m1, $m2, $scaledHue - 1 / 3) * 255); } private static function hueToRgb(float $m1, float $m2, float $hue): float { if ($hue < 0) { $hue += 1; } elseif ($hue > 1) { $hue -= 1; } if ($hue < 1 / 6) { return $m1 + ($m2 - $m1) * $hue * 6; } if ($hue < 1 / 2) { return $m2; } if ($hue < 2 / 3) { return $m1 + ($m2 - $m1) * (2 / 3 - $hue) * 6; } return $m1; } } PKCA#]�G�Ю�Nsystem/helixultimate/vendor/scssphp/scssphp/src/Value/CalculationOperation.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use ScssPhp\ScssPhp\Serializer\Serializer; use ScssPhp\ScssPhp\Util\Equatable; /** * A binary operation that can appear in a {@see SassCalculation}. */ final class CalculationOperation implements Equatable, \Stringable { private readonly CalculationOperator $operator; /** * The left-hand operand. * * This is either a {@see SassNumber}, a {@see SassCalculation}, an unquoted * {@see SassString}, or a {@see CalculationOperation}. */ private readonly object $left; /** * The right-hand operand. * * This is either a {@see SassNumber}, a {@see SassCalculation}, an unquoted * {@see SassString}, or a {@see CalculationOperation}. */ private readonly object $right; public function __construct(CalculationOperator $operator, object $left, object $right) { $this->operator = $operator; $this->left = $left; $this->right = $right; } public function getOperator(): CalculationOperator { return $this->operator; } public function getLeft(): object { return $this->left; } public function getRight(): object { return $this->right; } public function equals(object $other): bool { assert($this->left instanceof Equatable); assert($this->right instanceof Equatable); return $other instanceof CalculationOperation && $this->operator === $other->operator && $this->left->equals($other->left) && $this->right->equals($other->right); } public function __toString(): string { $parenthesized = Serializer::serializeValue(SassCalculation::unsimplified('', [$this]), true); return substr($parenthesized, 1, \strlen($parenthesized) - 2); } } PKCA#]��%��Csystem/helixultimate/vendor/scssphp/scssphp/src/Value/SassMixin.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use ScssPhp\ScssPhp\SassCallable\SassCallable; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Visitor\ValueVisitor; /** * A SassScript mixin reference. * * A mixin reference captures a mixin from the local environment so that * it may be passed between modules. */ final class SassMixin extends Value { private readonly SassCallable $callable; /** * @internal */ public function __construct(SassCallable $callable) { $this->callable = $callable; } /** * @internal */ public function getCallable(): SassCallable { return $this->callable; } /** * @internal */ public function accept(ValueVisitor $visitor) { return $visitor->visitMixin($this); } public function assertMixin(?string $name = null): SassMixin { return $this; } public function equals(object $other): bool { return $other instanceof SassMixin && EquatableUtil::equals($this->callable, $other->callable); } } PKCA#]�c���Dsystem/helixultimate/vendor/scssphp/scssphp/src/Value/SassNumber.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use JiriPudil\SealedClasses\Sealed; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Util\NumberUtil; use ScssPhp\ScssPhp\Util\StringUtil; use ScssPhp\ScssPhp\Visitor\ValueVisitor; /** * A SassScript number. * * Numbers can have units. Although there's no literal syntax for it, numbers * support scientific-style numerator and denominator units (for example, * `miles/hour`). These are expected to be resolved before being emitted to * CSS. */ #[Sealed(permits: [UnitlessSassNumber::class, SingleUnitSassNumber::class, ComplexSassNumber::class])] abstract class SassNumber extends Value { final const PRECISION = 10; /** * @see https://www.w3.org/TR/css-values-3/ */ private const CONVERSIONS = [ 'in' => [ 'in' => 1.0, 'pc' => 6.0, 'pt' => 72.0, 'px' => 96.0, 'cm' => 2.54, 'mm' => 25.4, 'q' => 101.6, ], 'deg' => [ 'deg' => 360.0, 'grad' => 400.0, 'rad' => 2 * M_PI, 'turn' => 1.0, ], 's' => [ 's' => 1.0, 'ms' => 1000.0, ], 'Hz' => [ 'Hz' => 1.0, 'kHz' => 0.001, ], 'dpi' => [ 'dpi' => 1.0, 'dpcm' => 1 / 2.54, 'dppx' => 1 / 96, ], ]; /** * A map from human-readable names of unit types to the convertible units that * fall into those types. */ private const UNITS_BY_TYPE = [ 'length' => ['in', 'cm', 'pc', 'mm', 'q', 'pt', 'px'], 'angle' => ['deg', 'grad', 'rad', 'turn'], 'time' => ['s', 'ms'], 'frequency' => ['Hz', 'kHz'], 'pixel density' => ['dpi', 'dpcm', 'dppx'] ]; /** * A map from units to the human-readable names of those unit types. */ private const TYPES_BY_UNIT = [ 'in' => 'length', 'cm' => 'length', 'pc' => 'length', 'mm' => 'length', 'q' => 'length', 'pt' => 'length', 'px' => 'length', 'deg' => 'angle', 'grad' => 'angle', 'rad' => 'angle', 'turn' => 'angle', 's' => 'time', 'ms' => 'time', 'Hz' => 'frequency', 'kHz' => 'frequency', 'dpi' => 'pixel density', 'dpcm' => 'pixel density', 'dppx' => 'pixel density', ]; private readonly float $value; /** * The representation of this number as two slash-separated numbers, if it has one. * * @var array{SassNumber, SassNumber}|null * @internal */ private readonly ?array $asSlash; /** * @param array{SassNumber, SassNumber}|null $asSlash */ protected function __construct(float $value, ?array $asSlash = null) { $this->value = $value; $this->asSlash = $asSlash; } /** * Creates a number, optionally with a single numerator unit. * * This matches the numbers that can be written as literals. * {@see SassNumber::withUnits} can be used to construct more complex units. */ final public static function create(float $value, ?string $unit = null): SassNumber { if ($unit === null) { return new UnitlessSassNumber($value); } return new SingleUnitSassNumber($value, $unit); } /** * Creates a number with full $numeratorUnits and $denominatorUnits. * * @param list<string> $numeratorUnits * @param list<string> $denominatorUnits */ final public static function withUnits(float $value, array $numeratorUnits = [], array $denominatorUnits = []): SassNumber { if (empty($numeratorUnits) && empty($denominatorUnits)) { return new UnitlessSassNumber($value); } if (empty($denominatorUnits) && \count($numeratorUnits) === 1) { return new SingleUnitSassNumber($value, $numeratorUnits[0]); } if (empty($numeratorUnits)) { return new ComplexSassNumber($value, $numeratorUnits, $denominatorUnits); } $numerators = $numeratorUnits; $unsimplifiedDenominators = $denominatorUnits; $denominators = []; foreach ($unsimplifiedDenominators as $denominator) { $simplifiedAway = false; foreach ($numerators as $i => $numerator) { $factor = self::getConversionFactor($denominator, $numerator); if ($factor === null) { continue; } $value *= $factor; unset($numerators[$i]); $simplifiedAway = true; break; } if (!$simplifiedAway) { $denominators[] = $denominator; } } $numerators = array_values($numerators); if (empty($denominators)) { if (empty($numerators)) { return new UnitlessSassNumber($value); } if (\count($numerators) === 1) { return new SingleUnitSassNumber($value, $numerators[0]); } } return new ComplexSassNumber($value, $numerators, $denominators); } /** * The value of this number. * * Note that due to details of floating-point arithmetic, this may be a * float even if $this represents an int from Sass's perspective. Use * {@see isInt} to determine whether this is an integer, {@see asInt} to get its * integer value, or {@see assertInt} to do both at once. */ public function getValue(): float { return $this->value; } /** * @return list<string> */ abstract public function getNumeratorUnits(): array; /** * @return list<string> */ abstract public function getDenominatorUnits(): array; /** * @return array{SassNumber, SassNumber}|null * * @internal */ final public function getAsSlash(): ?array { return $this->asSlash; } public function accept(ValueVisitor $visitor) { return $visitor->visitNumber($this); } /** * Returns a SassNumber with this value and the same units. */ abstract protected function withValue(float $value): SassNumber; /** * @internal */ abstract public function withSlash(SassNumber $numerator, SassNumber $denominator): SassNumber; public function withoutSlash(): SassNumber { if ($this->asSlash === null) { return $this; } return $this->withValue($this->value); } public function assertNumber(?string $name = null): SassNumber { return $this; } /** * Returns a human-readable string representation of this number's units. */ public function getUnitString(): string { return $this->hasUnits() ? self::buildUnitString($this->getNumeratorUnits(), $this->getDenominatorUnits()) : ''; } /** * Whether $this is an integer, according to {@see NumberUtil::fuzzyEquals}. * * The int value can be accessed using {@see asInt} or {@see assertInt}. Note that * this may return `false` for very large doubles even though they may be * mathematically integers, because not all platforms have a valid * representation for integers that large. */ public function isInt(): bool { return NumberUtil::fuzzyIsInt($this->value); } /** * If $this is an integer according to {@see isInt}, returns {@see value} as an int. * * Otherwise, returns `null`. */ public function asInt(): ?int { return NumberUtil::fuzzyAsInt($this->value); } /** * Returns the value as an int, if it's an integer value according to * {@see isInt}. * * @throws SassScriptException if the value isn't an integer. If this came * from a function argument, $name is the argument name (without the `$`). * It's used for error reporting. */ public function assertInt(?string $name = null): int { $integer = NumberUtil::fuzzyAsInt($this->value); if ($integer !== null) { return $integer; } throw SassScriptException::forArgument("$this is not an int.", $name); } /** * If {@see value} is between $min and $max, returns it. * * If {@see value} is {@see NumberUtil::fuzzyEquals} to $min or $max, it's clamped to the * appropriate value. Otherwise, this throws a {@see SassScriptException}. If this * came from a function argument, $name is the argument name (without the * `$`). It's used for error reporting. * * @throws SassScriptException if the value is outside the range */ public function valueInRange(float $min, float $max, ?string $name = null): float { $result = NumberUtil::fuzzyCheckRange($this->value, $min, $max); if ($result !== null) { return $result; } $unitString = $this->getUnitString(); throw SassScriptException::forArgument("Expected $this to be within $min$unitString and $max$unitString.", $name); } /** * Like {@see valueInRange}, but with an explicit unit for the expected upper and * lower bounds. * * This exists to solve the confusing error message in https://github.com/sass/dart-sass/issues/1745, * and should be removed once https://github.com/sass/sass/issues/3374 fully lands and unitless values * are required in these positions. * * @throws SassScriptException if the value is outside the range * * @internal */ public function valueInRangeWithUnit(float $min, float $max, string $name, string $unit): float { $result = NumberUtil::fuzzyCheckRange($this->value, $min, $max); if ($result !== null) { return $result; } throw SassScriptException::forArgument("Expected $this to be within $min$unit and $max$unit.", $name); } /** * Returns true if the number has units. */ abstract public function hasUnits(): bool; /** * Whether $this has more than one numerator unit, or any denominator units. * * This is `true` for numbers whose units make them unrepresentable as CSS * lengths. */ abstract public function hasComplexUnits(): bool; /** * Returns whether $this has $unit as its only unit (and as a numerator). */ abstract public function hasUnit(string $unit): bool; /** * Returns whether $this has units that are compatible with $other. * * Unlike {@see isComparableTo}, unitless numbers are only considered compatible * with other unitless numbers. */ public function hasCompatibleUnits(SassNumber $other): bool { if (\count($this->getNumeratorUnits()) !== \count($other->getNumeratorUnits())) { return false; } if (\count($this->getDenominatorUnits()) !== \count($other->getDenominatorUnits())) { return false; } return $this->isComparableTo($other); } /** * Returns whether $this has units that are possibly-compatible with * $other, as defined by the Sass spec. * * @internal */ abstract public function hasPossiblyCompatibleUnits(SassNumber $other): bool; /** * Returns whether $this can be coerced to the given unit. * * This always returns `true` for a unitless number. */ abstract public function compatibleWithUnit(string $unit): bool; /** * Throws a SassScriptException unless $this has $unit as its only unit * (and as a numerator). * * If this came from a function argument, $name is the argument name * (without the `$`). It's used for error reporting. * * @throws SassScriptException */ public function assertUnit(string $unit, ?string $varName = null): void { if ($this->hasUnit($unit)) { return; } throw SassScriptException::forArgument(sprintf('Expected %s to have unit "%s".', $this, $unit), $varName); } /** * Throws a SassScriptException unless $this has no units. * * If this came from a function argument, $name is the argument name * (without the `$`). It's used for error reporting. * * @throws SassScriptException */ public function assertNoUnits(?string $varName = null): void { if (!$this->hasUnits()) { return; } throw SassScriptException::forArgument(sprintf('Expected %s to have no units.', $this), $varName); } /** * Returns a copy of this number, converted to the units represented by $newNumeratorUnits and $newDenominatorUnits. * * Note that {@see convertValue} is generally more efficient if the value * is going to be accessed directly. * * @param list<string> $newNumeratorUnits * @param list<string> $newDenominatorUnits * * @throws SassScriptException if this number's units are not compatible with $newNumeratorUnits and $newDenominatorUnits, or if either number is unitless but the other is not. */ public function convert(array $newNumeratorUnits, array $newDenominatorUnits, ?string $name = null): SassNumber { return self::withUnits($this->convertValue($newNumeratorUnits, $newDenominatorUnits, $name), $newNumeratorUnits, $newDenominatorUnits); } /** * Returns {@see value}, converted to the units represented by $newNumeratorUnits and $newDenominatorUnits. * * @param list<string> $newNumeratorUnits * @param list<string> $newDenominatorUnits * * @throws SassScriptException if this number's units are not compatible with $newNumeratorUnits and $newDenominatorUnits, or if either number is unitless but the other is not. */ public function convertValue(array $newNumeratorUnits, array $newDenominatorUnits, ?string $name = null): float { return $this->convertOrCoerceValue($newNumeratorUnits, $newDenominatorUnits, false, $name); } /** * Returns a copy of this number, converted to the same units as $other. * * Note that {@see convertValueToMatch} is generally more efficient if the value * is going to be accessed directly. * * @param string|null $name The argument name if this is a function argument * @param string|null $otherName The argument name for $other if this is a function argument * * @throws SassScriptException if the units are not compatible or if either number is unitless but the other is not. */ public function convertToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): SassNumber { return self::withUnits($this->convertValueToMatch($other, $name, $otherName), $other->getNumeratorUnits(), $other->getDenominatorUnits()); } /** * Returns {@see value}, converted to the same units as $other. * * @param string|null $name The argument name if this is a function argument * @param string|null $otherName The argument name for $other if this is a function argument * * @throws SassScriptException if the units are not compatible or if either number is unitless but the other is not. */ public function convertValueToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): float { return $this->convertOrCoerceValue($other->getNumeratorUnits(), $other->getDenominatorUnits(), false, $name, $other, $otherName); } /** * Returns a copy of this number, converted to the units represented by $newNumeratorUnits and $newDenominatorUnits. * * This does not throw an error if this number is unitless and * $newNumeratorUnits/$newDenominatorUnits are not empty, or vice versa. Instead, * it treats all unitless numbers as convertible to and from all units without * changing the value. * * Note that {@see coerceValue} is generally more efficient if the value * is going to be accessed directly. * * @param list<string> $newNumeratorUnits * @param list<string> $newDenominatorUnits * * @throws SassScriptException if this number's units are not compatible with $newNumeratorUnits and $newDenominatorUnits */ public function coerce(array $newNumeratorUnits, array $newDenominatorUnits, ?string $name = null): SassNumber { return self::withUnits($this->coerceValue($newNumeratorUnits, $newDenominatorUnits, $name), $newNumeratorUnits, $newDenominatorUnits); } /** * Returns {@see value}, converted to the units represented by $newNumeratorUnits and $newDenominatorUnits. * * This does not throw an error if this number is unitless and * $newNumeratorUnits/$newDenominatorUnits are not empty, or vice versa. Instead, * it treats all unitless numbers as convertible to and from all units without * changing the value. * * @param list<string> $newNumeratorUnits * @param list<string> $newDenominatorUnits * * @throws SassScriptException if this number's units are not compatible with $newNumeratorUnits and $newDenominatorUnits */ public function coerceValue(array $newNumeratorUnits, array $newDenominatorUnits, ?string $name = null): float { return $this->convertOrCoerceValue($newNumeratorUnits, $newDenominatorUnits, true, $name); } /** * A shorthand for {@see coerceValue} with a single unit */ public function coerceValueToUnit(string $unit, ?string $name = null): float { return $this->coerceValue([$unit], [], $name); } /** * Returns a copy of this number, converted to the same units as $other. * * Unlike {@see convertToMatch}, this does not throw an error if this number is * unitless and $other is not, or vice versa. Instead, it treats all unitless * numbers as convertible to and from all units without changing the value. * * Note that {@see coerceValueToMatch} is generally more efficient if the value * is going to be accessed directly. * * @param string|null $name The argument name if this is a function argument * @param string|null $otherName The argument name for $other if this is a function argument * * @throws SassScriptException if the units are not compatible */ public function coerceToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): SassNumber { return self::withUnits($this->coerceValueToMatch($other, $name, $otherName), $other->getNumeratorUnits(), $other->getDenominatorUnits()); } /** * Returns {@see value}, converted to the same units as $other. * * Unlike {@see convertValueToMatch}, this does not throw an error if this number * is unitless and $other is not, or vice versa. Instead, it treats all unitless * numbers as convertible to and from all units without changing the value. * * @param string|null $name The argument name if this is a function argument * @param string|null $otherName The argument name for $other if this is a function argument * * @throws SassScriptException if the units are not compatible */ public function coerceValueToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): float { return $this->convertOrCoerceValue($other->getNumeratorUnits(), $other->getDenominatorUnits(), true, $name, $other, $otherName); } /** * Returns whether this number can be compared to $other. * * Two numbers can be compared if they have compatible units, or if either * number has no units. * * @internal */ public function isComparableTo(SassNumber $other): bool { if (!$this->hasUnits() || !$other->hasUnits()) { return true; } try { $this->greaterThan($other); return true; } catch (SassScriptException) { return false; } } public function greaterThan(Value $other): SassBoolean { if ($other instanceof SassNumber) { // Not using a first-class callable for NumberUtil::fuzzyGreaterThan(), // because of a PHP 8.1 bug that results in a segmentation // fault, when an Exception is thrown from a function taking the FCC as // a parameter. // // see: https://github.com/php/php-src/commit/b3e26c3036a54e9821ea7119c26cdabe484fe36d // see: https://github.com/scssphp/scssphp/issues/752#issuecomment-2423857568 return SassBoolean::create($this->coerceUnits($other, [NumberUtil::class, 'fuzzyGreaterThan'])); } throw new SassScriptException("Undefined operation \"$this > $other\"."); } public function greaterThanOrEquals(Value $other): SassBoolean { if ($other instanceof SassNumber) { return SassBoolean::create($this->coerceUnits($other, NumberUtil::fuzzyGreaterThanOrEquals(...))); } throw new SassScriptException("Undefined operation \"$this >= $other\"."); } public function lessThan(Value $other): SassBoolean { if ($other instanceof SassNumber) { return SassBoolean::create($this->coerceUnits($other, NumberUtil::fuzzyLessThan(...))); } throw new SassScriptException("Undefined operation \"$this < $other\"."); } public function lessThanOrEquals(Value $other): SassBoolean { if ($other instanceof SassNumber) { return SassBoolean::create($this->coerceUnits($other, NumberUtil::fuzzyLessThanOrEquals(...))); } throw new SassScriptException("Undefined operation \"$this <= $other\"."); } public function modulo(Value $other): SassNumber { if ($other instanceof SassNumber) { return $this->withValue($this->coerceUnits($other, NumberUtil::moduloLikeSass(...))); } throw new SassScriptException("Undefined operation \"$this % $other\"."); } public function plus(Value $other): Value { if ($other instanceof SassNumber) { return $this->withValue($this->coerceUnits($other, fn($num1, $num2) => $num1 + $num2)); } if (!$other instanceof SassColor) { return parent::plus($other); } throw new SassScriptException("Undefined operation \"$this + $other\"."); } public function minus(Value $other): Value { if ($other instanceof SassNumber) { return $this->withValue($this->coerceUnits($other, fn($num1, $num2) => $num1 - $num2)); } if (!$other instanceof SassColor) { return parent::minus($other); } throw new SassScriptException("Undefined operation \"$this - $other\"."); } public function times(Value $other): Value { if ($other instanceof SassNumber) { if (!$other->hasUnits()) { return $this->withValue($this->value * $other->value); } return $this->multiplyUnits($this->value * $other->value, $other->getNumeratorUnits(), $other->getDenominatorUnits()); } throw new SassScriptException("Undefined operation \"$this * $other\"."); } public function dividedBy(Value $other): Value { if ($other instanceof SassNumber) { $value = NumberUtil::divideLikeSass($this->value, $other->value); if (!$other->hasUnits()) { return $this->withValue($value); } return $this->multiplyUnits($value, $other->getDenominatorUnits(), $other->getNumeratorUnits()); } return parent::dividedBy($other); } public function unaryPlus(): Value { return $this; } public function equals(object $other): bool { if (!$other instanceof SassNumber) { return false; } if (\count($this->getNumeratorUnits()) !== \count($other->getNumeratorUnits()) || \count($this->getDenominatorUnits()) !== \count($other->getDenominatorUnits())) { return false; } // In Sass, neither NaN nor Infinity are equal to themselves, while PHP defines INF==INF if (is_nan($this->value) || is_nan($other->value) || !is_finite($this->value) || !is_finite($other->value)) { return false; } if (!$this->hasUnits()) { return NumberUtil::fuzzyEquals($this->value, $other->value); } if ( self::canonicalizeUnitList($this->getNumeratorUnits()) !== self::canonicalizeUnitList($other->getNumeratorUnits()) || self::canonicalizeUnitList($this->getDenominatorUnits()) !== self::canonicalizeUnitList($other->getDenominatorUnits()) ) { return false; } return NumberUtil::fuzzyEquals( $this->value * self::getCanonicalMultiplier($this->getNumeratorUnits()) / self::getCanonicalMultiplier($this->getDenominatorUnits()), $other->value * self::getCanonicalMultiplier($other->getNumeratorUnits()) / self::getCanonicalMultiplier($other->getDenominatorUnits()) ); } /** * @param list<string> $units */ private static function getCanonicalMultiplier(array $units): float { return array_reduce($units, fn($multiplier, $unit) => $multiplier * self::getCanonicalMultiplierForUnit($unit), 1.0); } private static function getCanonicalMultiplierForUnit(string $unit): float { foreach (self::CONVERSIONS as $canonicalUnit => $conversions) { if (isset($conversions[$unit])) { \assert(isset($conversions[$canonicalUnit])); return $conversions[$canonicalUnit] / $conversions[$unit]; } } return 1.0; } /** * @param list<string> $units * * @return list<string> */ private static function canonicalizeUnitList(array $units): array { if (\count($units) === 0) { return $units; } if (\count($units) === 1) { if (isset(self::TYPES_BY_UNIT[$units[0]])) { $type = self::TYPES_BY_UNIT[$units[0]]; return [self::UNITS_BY_TYPE[$type][0]]; } return $units; } $canonicalUnits = []; foreach ($units as $unit) { if (isset(self::TYPES_BY_UNIT[$unit])) { $type = self::TYPES_BY_UNIT[$unit]; $canonicalUnits[] = self::UNITS_BY_TYPE[$type][0]; } else { $canonicalUnits[] = $unit; } } sort($canonicalUnits); return $canonicalUnits; } /** * @template T * * @param callable(float, float): T $operation * * @return T * * @param-immediately-invoked-callable $operation */ private function coerceUnits(SassNumber $other, callable $operation) { try { return \call_user_func($operation, $this->value, $other->coerceValueToMatch($this)); } catch (SassScriptException $e) { // If the conversion fails, re-run it in the other direction. This will // generate an error message that prints $this before $other, which is // more readable. $this->coerceValueToMatch($other); throw $e; // Should be unreadable as the coercion should throw. } } /** * @param list<string> $newNumeratorUnits * @param list<string> $newDenominatorUnits * @param string|null $name The argument name if this is a function argument * @param string|null $otherName The argument name for $other if this is a function argument * * @throws SassScriptException if this number's units are not compatible with $newNumeratorUnits and $newDenominatorUnits */ private function convertOrCoerceValue(array $newNumeratorUnits, array $newDenominatorUnits, bool $coerceUnitless, ?string $name = null, ?SassNumber $other = null, ?string $otherName = null): float { assert($other === null || ($other->getNumeratorUnits() === $newNumeratorUnits && $other->getDenominatorUnits() === $newDenominatorUnits), sprintf("Expected %s to have units %s.", $other, self::buildUnitString($newNumeratorUnits, $newDenominatorUnits))); if ($this->getNumeratorUnits() === $newNumeratorUnits && $this->getDenominatorUnits() === $newDenominatorUnits) { return $this->value; } $otherHasUnits = !empty($newNumeratorUnits) || !empty($newDenominatorUnits); if ($coerceUnitless && (!$otherHasUnits || !$this->hasUnits())) { return $this->value; } $value = $this->value; $oldNumerators = $this->getNumeratorUnits(); foreach ($newNumeratorUnits as $newNumerator) { foreach ($oldNumerators as $key => $oldNumerator) { $conversionFactor = self::getConversionFactor($newNumerator, $oldNumerator); if (\is_null($conversionFactor)) { continue; } $value *= $conversionFactor; unset($oldNumerators[$key]); continue 2; } throw $this->compatibilityException($otherHasUnits, $newNumeratorUnits, $newDenominatorUnits, $name, $other, $otherName); } $oldDenominators = $this->getDenominatorUnits(); foreach ($newDenominatorUnits as $newDenominator) { foreach ($oldDenominators as $key => $oldDenominator) { $conversionFactor = self::getConversionFactor($newDenominator, $oldDenominator); if (\is_null($conversionFactor)) { continue; } $value /= $conversionFactor; unset($oldDenominators[$key]); continue 2; } throw $this->compatibilityException($otherHasUnits, $newNumeratorUnits, $newDenominatorUnits, $name, $other, $otherName); } if (\count($oldNumerators) || \count($oldDenominators)) { throw $this->compatibilityException($otherHasUnits, $newNumeratorUnits, $newDenominatorUnits, $name, $other, $otherName); } return $value; } /** * @param list<string> $newNumeratorUnits * @param list<string> $newDenominatorUnits */ private function compatibilityException(bool $otherHasUnits, array $newNumeratorUnits, array $newDenominatorUnits, ?string $name, ?SassNumber $other = null, ?string $otherName = null): SassScriptException { if ($other !== null) { $message = "$this and"; if ($otherName !== null) { $message .= " \$$otherName:"; } $message .= " $other have incompatible units"; if (!$this->hasUnits() || !$otherHasUnits) { $message .= " (one has units and the other doesn't)"; } return SassScriptException::forArgument("$message.", $name); } if (!$otherHasUnits) { return SassScriptException::forArgument("Expected $this to have no units.", $name); } if (\count($newNumeratorUnits) === 1 && \count($newDenominatorUnits) === 0 && isset(self::TYPES_BY_UNIT[$newNumeratorUnits[0]])) { $type = self::TYPES_BY_UNIT[$newNumeratorUnits[0]]; $article = \in_array($type[0], ['a', 'e', 'i', 'o', 'u'], true) ? 'an' : 'a'; $supportedUnits = implode(', ', self::UNITS_BY_TYPE[$type]); return SassScriptException::forArgument("Expected $this to have $article $type unit ($supportedUnits).", $name); } return SassScriptException::forArgument(sprintf('Expected %s to have %s %s.', $this, StringUtil::pluralize('unit', \count($newNumeratorUnits) + \count($newDenominatorUnits)), self::buildUnitString($newNumeratorUnits, $newDenominatorUnits)), $name); } /** * @param list<string> $otherNumerators * @param list<string> $otherDenominators */ protected function multiplyUnits(float $value, array $otherNumerators, array $otherDenominators): SassNumber { $newNumerators = array(); foreach ($this->getNumeratorUnits() as $numerator) { foreach ($otherDenominators as $key => $denominator) { $conversionFactor = self::getConversionFactor($numerator, $denominator); if (\is_null($conversionFactor)) { continue; } $value /= $conversionFactor; unset($otherDenominators[$key]); continue 2; } $newNumerators[] = $numerator; } $denominators = $this->getDenominatorUnits(); foreach ($otherNumerators as $numerator) { foreach ($denominators as $key => $denominator) { $conversionFactor = self::getConversionFactor($numerator, $denominator); if (\is_null($conversionFactor)) { continue; } $value /= $conversionFactor; unset($denominators[$key]); continue 2; } $newNumerators[] = $numerator; } $newDenominators = array_values(array_merge($denominators, $otherDenominators)); return self::withUnits($value, $newNumerators, $newDenominators); } /** * Returns the number of [unit1]s per [unit2]. * * Equivalently, `1unit2 * conversionFactor(unit1, unit2) = 1unit1`. */ protected static function getConversionFactor(string $unit1, string $unit2): ?float { if ($unit1 === $unit2) { return 1; } foreach (self::CONVERSIONS as $unitVariants) { if (isset($unitVariants[$unit1]) && isset($unitVariants[$unit2])) { return $unitVariants[$unit1] / $unitVariants[$unit2]; } } return null; } /** * Returns unit(s) as the product of numerator units divided by the product of denominator units * * @param list<string> $numerators * @param list<string> $denominators */ private static function buildUnitString(array $numerators, array $denominators): string { if (!\count($numerators)) { if (\count($denominators) === 0) { return 'no units'; } if (\count($denominators) === 1) { return $denominators[0] . '^-1'; } return '(' . implode('*', $denominators) . ')^-1'; } return implode('*', $numerators) . (\count($denominators) ? '/' . implode('*', $denominators) : ''); } /** * Returns a suggested Sass snippet for converting a variable named $name * (without `%`) containing this number into a number with the same value and * the given $unit. * * If $unit is null, this forces the number to be unitless. * * This is used for deprecation warnings when restricting which units are * allowed for a given function. * * @internal */ public function unitSuggestion(string $name, ?string $unit = null): string { $result = "\$$name" . implode(array_map(fn($unit) => " * 1$unit", $this->getDenominatorUnits())) . implode(array_map(fn($unit) => " / 1$unit", $this->getNumeratorUnits())) . ($unit === null ? '' : " * 1$unit"); return $this->getNumeratorUnits() === [] ? $result : "calc($result)"; } } PKCA#]�T��Fsystem/helixultimate/vendor/scssphp/scssphp/src/Value/SassFunction.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use ScssPhp\ScssPhp\SassCallable\SassCallable; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Visitor\ValueVisitor; /** * A SassScript function reference. * * A function reference captures a function from the local environment so that * it may be passed between modules. */ final class SassFunction extends Value { private readonly SassCallable $callable; /** * @internal */ public function __construct(SassCallable $callable) { $this->callable = $callable; } /** * @internal */ public function getCallable(): SassCallable { return $this->callable; } public function accept(ValueVisitor $visitor) { return $visitor->visitFunction($this); } public function assertFunction(?string $name = null): SassFunction { return $this; } public function equals(object $other): bool { return $other instanceof SassFunction && EquatableUtil::equals($this->callable, $other->callable); } } PKCA#]�E���Isystem/helixultimate/vendor/scssphp/scssphp/src/Value/ColorFormatEnum.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; /** * @internal */ enum ColorFormatEnum implements ColorFormat { /** * A color defined using the `rgb()` or `rgba()` functions. */ case rgbFunction; /** * A color defined using the `hsl()` or `hsla()` functions. */ case hslFunction; } PKCA#]�"ybbEsystem/helixultimate/vendor/scssphp/scssphp/src/Value/ColorFormat.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use JiriPudil\SealedClasses\Sealed; /** * @internal */ #[Sealed(permits: [ColorFormatEnum::class, SpanColorFormat::class])] interface ColorFormat { } PKCA#]�t�)??Bsystem/helixultimate/vendor/scssphp/scssphp/src/Value/SassList.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use JiriPudil\SealedClasses\Sealed; use ScssPhp\ScssPhp\Visitor\ValueVisitor; /** * A SassScript list. */ #[Sealed(permits: [SassArgumentList::class])] class SassList extends Value { /** * @var list<Value> */ private readonly array $contents; private readonly ListSeparator $separator; private readonly bool $brackets; public static function createEmpty(ListSeparator $separator = ListSeparator::UNDECIDED, bool $brackets = false): SassList { return new self(array(), $separator, $brackets); } /** * @param list<Value> $contents */ public function __construct(array $contents, ListSeparator $separator, bool $brackets = false) { if ($separator === ListSeparator::UNDECIDED && count($contents) > 1) { throw new \InvalidArgumentException('A list with more than one element must have an explicit separator.'); } $this->contents = $contents; $this->separator = $separator; $this->brackets = $brackets; } public function getSeparator(): ListSeparator { return $this->separator; } public function hasBrackets(): bool { return $this->brackets; } public function isBlank(): bool { if ($this->brackets) { return false; } foreach ($this->contents as $element) { if (!$element->isBlank()) { return false; } } return true; } public function asList(): array { return $this->contents; } protected function getLengthAsList(): int { return \count($this->contents); } public function accept(ValueVisitor $visitor) { return $visitor->visitList($this); } public function assertMap(?string $name = null): SassMap { if (\count($this->contents) === 0) { return SassMap::createEmpty(); } return parent::assertMap($name); } public function tryMap(): ?SassMap { if (\count($this->contents) === 0) { return SassMap::createEmpty(); } return null; } public function equals(object $other): bool { if ($other instanceof SassMap) { return \count($this->contents) === 0 && \count($other->asList()) === 0; } if (!$other instanceof SassList) { return false; } if ($this->separator !== $other->separator || $this->brackets !== $other->brackets) { return false; } $otherContent = $other->contents; $length = \count($this->contents); if ($length !== \count($otherContent)) { return false; } for ($i = 0; $i < $length; ++$i) { if (!$this->contents[$i]->equals($otherContent[$i])) { return false; } } return true; } } PKCA#]Yؑ$Isystem/helixultimate/vendor/scssphp/scssphp/src/Value/SpanColorFormat.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use SourceSpan\FileSpan; /** * @internal */ final class SpanColorFormat implements ColorFormat { private readonly FileSpan $span; public function __construct(FileSpan $span) { $this->span = $span; } public function getOriginal(): string { return $this->span->getText(); } } PKCA#]���[R R Ksystem/helixultimate/vendor/scssphp/scssphp/src/Value/ComplexSassNumber.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; /** * A specialized subclass of {@see SassNumber} for numbers that are neither {@see UnitlessSassNumber} nor {@see SingleUnitSassNumber}. * * @internal */ final class ComplexSassNumber extends SassNumber { /** * @var list<string> */ private readonly array $numeratorUnits; /** * @var list<string> */ private readonly array $denominatorUnits; /** * @param list<string> $numeratorUnits * @param list<string> $denominatorUnits * @param array{SassNumber, SassNumber}|null $asSlash */ public function __construct(float $value, array $numeratorUnits, array $denominatorUnits, ?array $asSlash = null) { assert(\count($numeratorUnits) > 1 || \count($denominatorUnits) > 0); parent::__construct($value, $asSlash); $this->numeratorUnits = $numeratorUnits; $this->denominatorUnits = $denominatorUnits; } public function getNumeratorUnits(): array { return $this->numeratorUnits; } public function getDenominatorUnits(): array { return $this->denominatorUnits; } public function hasUnits(): bool { return true; } public function hasComplexUnits(): bool { return true; } public function hasUnit(string $unit): bool { return false; } public function compatibleWithUnit(string $unit): bool { return false; } public function hasPossiblyCompatibleUnits(SassNumber $other): bool { // This logic is well-defined, and we could implement it in principle. // However, it would be fairly complex and there's no clear need for it yet. throw new \BadMethodCallException(__METHOD__ . 'is not implemented.'); } protected function withValue(float $value): SassNumber { return new self($value, $this->numeratorUnits, $this->denominatorUnits); } public function withSlash(SassNumber $numerator, SassNumber $denominator): SassNumber { return new self($this->getValue(), $this->numeratorUnits, $this->denominatorUnits, array($numerator, $denominator)); } } PKCA#]�P88Gsystem/helixultimate/vendor/scssphp/scssphp/src/Value/ListSeparator.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; /** * An enum of list separator types. */ enum ListSeparator { case COMMA; case SPACE; case SLASH; case UNDECIDED; public function getSeparator(): ?string { return match ($this) { self::COMMA => ',', self::SPACE => ' ', self::SLASH => '/', self::UNDECIDED => null, }; } } PKCA#]eg[� Asystem/helixultimate/vendor/scssphp/scssphp/src/Value/SassMap.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use ScssPhp\ScssPhp\Collection\Map; use ScssPhp\ScssPhp\Visitor\ValueVisitor; /** * A SassScript map. */ final class SassMap extends Value { /** * @var Map<Value> */ private readonly Map $contents; /** * @param Map<Value> $contents */ private function __construct(Map $contents) { $this->contents = Map::unmodifiable($contents); } public static function createEmpty(): SassMap { return new self(new Map()); } /** * @param Map<Value> $contents */ public static function create(Map $contents): SassMap { return new self($contents); } /** * The returned Map is unmodifiable. * * @return Map<Value> */ public function getContents(): Map { return $this->contents; } public function getSeparator(): ListSeparator { return \count($this->contents) === 0 ? ListSeparator::UNDECIDED : ListSeparator::COMMA; } public function asList(): array { $result = []; foreach ($this->contents as $key => $value) { $result[] = new SassList([$key, $value], ListSeparator::SPACE); } return $result; } protected function getLengthAsList(): int { return \count($this->contents); } public function accept(ValueVisitor $visitor) { return $visitor->visitMap($this); } public function assertMap(?string $name = null): SassMap { return $this; } public function tryMap(): ?SassMap { return $this; } public function equals(object $other): bool { if ($other instanceof SassList) { return \count($this->contents) === 0 && \count($other->asList()) === 0; } if (!$other instanceof SassMap) { return false; } if ($this->contents === $other->contents) { return true; } if (\count($this->contents) !== \count($other->contents)) { return false; } foreach ($this->contents as $key => $value) { $otherValue = $other->contents->get($key); if ($otherValue === null) { return false; } if (!$value->equals($otherValue)) { return false; } } return true; } } PKCA#]B��Bsystem/helixultimate/vendor/scssphp/scssphp/src/Value/SassNull.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use ScssPhp\ScssPhp\Visitor\ValueVisitor; /** * The SassScript `null` value. */ final class SassNull extends Value { private static SassNull $instance; public static function create(): SassNull { return self::$instance ??= new self(); } private function __construct() { } public function isTruthy(): bool { return false; } public function isBlank(): bool { return true; } public function realNull(): ?Value { return null; } public function accept(ValueVisitor $visitor) { return $visitor->visitNull(); } public function equals(object $other): bool { return $other instanceof SassNull; } public function unaryNot(): Value { return SassBoolean::create(true); } } PKCA#]6�ō��Esystem/helixultimate/vendor/scssphp/scssphp/src/Value/SassBoolean.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use ScssPhp\ScssPhp\Visitor\ValueVisitor; /** * A SassScript boolean value. */ final class SassBoolean extends Value { private static SassBoolean $trueInstance; private static SassBoolean $falseInstance; private readonly bool $value; public static function create(bool $value): SassBoolean { if ($value) { return self::$trueInstance ??= new self(true); } return self::$falseInstance ??= new self(false); } private function __construct(bool $value) { $this->value = $value; } public function getValue(): bool { return $this->value; } public function isTruthy(): bool { return $this->value; } public function accept(ValueVisitor $visitor) { return $visitor->visitBoolean($this); } public function assertBoolean(?string $name = null): SassBoolean { return $this; } public function unaryNot(): Value { return self::create(!$this->value); } public function equals(object $other): bool { if (!$other instanceof SassBoolean) { return false; } return $this->value === $other->value; } } PKCA#]��<4��Isystem/helixultimate/vendor/scssphp/scssphp/src/Value/SassCalculation.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Value; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Util\Character; use ScssPhp\ScssPhp\Util\Equatable; use ScssPhp\ScssPhp\Util\NumberUtil; use ScssPhp\ScssPhp\Util\StringUtil; use ScssPhp\ScssPhp\Visitor\ValueVisitor; use ScssPhp\ScssPhp\Warn; /** * A SassScript calculation. * * Although calculations can in principle have any name or any number of * arguments, this class only exposes the specific calculations that are * supported by the Sass spec. This ensures that all calculations that the user * works with are always fully simplified. */ final class SassCalculation extends Value { /** * The calculation's name, such as `"calc"`. */ private readonly string $name; /** * The calculation's arguments. * * Each argument is either a {@see SassNumber}, a {@see SassCalculation}, an unquoted * {@see SassString}, or a {@see CalculationOperation}. * * @var list<object> */ private readonly array $arguments; /** * Creates a new calculation with the given $name and $arguments * that will not be simplified. * * @param list<object> $arguments * * @internal */ public static function unsimplified(string $name, array $arguments): SassCalculation { return new SassCalculation($name, $arguments); } /** * Creates a `calc()` calculation with the given $argument. * * The $argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. * * @throws SassScriptException */ public static function calc(object $argument): Value { $argument = self::simplify($argument); if ($argument instanceof SassNumber) { return $argument; } if ($argument instanceof SassCalculation) { return $argument; } return new SassCalculation('calc', [$argument]); } /** * Creates a `min()` calculation with the given $arguments. * * Each argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. It must be passed at * least one argument. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. * * @param list<object> $arguments * * @throws SassScriptException */ public static function min(array $arguments): Value { $args = self::simplifyArguments($arguments); if (!$args) { throw new \InvalidArgumentException('min() must have at least one argument.'); } /** @var SassNumber|null $minimum */ $minimum = null; foreach ($args as $arg) { if (!$arg instanceof SassNumber || $minimum !== null && !$minimum->isComparableTo($arg)) { $minimum = null; break; } if ($minimum === null || $minimum->greaterThan($arg)->isTruthy()) { $minimum = $arg; } } if ($minimum !== null) { return $minimum; } self::verifyCompatibleNumbers($args); return new SassCalculation('min', $args); } /** * Creates a `max()` calculation with the given $arguments. * * Each argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. It must be passed at * least one argument. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. * * @param list<object> $arguments * * @throws SassScriptException */ public static function max(array $arguments): Value { $args = self::simplifyArguments($arguments); if (!$args) { throw new \InvalidArgumentException('max() must have at least one argument.'); } /** @var SassNumber|null $maximum */ $maximum = null; foreach ($args as $arg) { if (!$arg instanceof SassNumber || $maximum !== null && !$maximum->isComparableTo($arg)) { $maximum = null; break; } if ($maximum === null || $maximum->lessThan($arg)->isTruthy()) { $maximum = $arg; } } if ($maximum !== null) { return $maximum; } self::verifyCompatibleNumbers($args); return new SassCalculation('max', $args); } /** * Creates a `hypot()` calculation with the given $arguments. * * Each argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. It must be passed at * least one argument. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. * * @param list<object> $arguments */ public static function hypot(array $arguments): Value { $args = self::simplifyArguments($arguments); if (!$args) { throw new \InvalidArgumentException('hypot() must have at least one argument.'); } self::verifyCompatibleNumbers($args); $subTotal = 0.0; $first = $args[0]; if (!$first instanceof SassNumber || $first->hasUnit('%')) { return new SassCalculation('hypot', $args); } foreach ($args as $i => $number) { if (!$number instanceof SassNumber || !$number->hasCompatibleUnits($first)) { return new SassCalculation('hypot', $args); } $sassIndex = $i + 1; $value = $number->convertValueToMatch($first, "number[$sassIndex]", 'numbers[1]'); $subTotal += $value * $value; } return SassNumber::withUnits(sqrt($subTotal), $first->getNumeratorUnits(), $first->getDenominatorUnits()); } /** * Creates a `sqrt()` calculation with the given $argument. * * The $argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. */ public static function sqrt(object $argument): Value { return self::singleArgument('sqrt', $argument, NumberUtil::class . '::sqrt', true); } /** * Creates a `sin()` calculation with the given $argument. * * The $argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. */ public static function sin(object $argument): Value { return self::singleArgument('sin', $argument, NumberUtil::class . '::sin'); } /** * Creates a `cos()` calculation with the given $argument. * * The $argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. */ public static function cos(object $argument): Value { return self::singleArgument('cos', $argument, NumberUtil::class . '::cos'); } /** * Creates a `tan()` calculation with the given $argument. * * The $argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. */ public static function tan(object $argument): Value { return self::singleArgument('tan', $argument, NumberUtil::class . '::tan'); } /** * Creates an `atan()` calculation with the given $argument. * * The $argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. */ public static function atan(object $argument): Value { return self::singleArgument('atan', $argument, NumberUtil::class . '::atan', true); } /** * Creates an `asin()` calculation with the given $argument. * * The $argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. */ public static function asin(object $argument): Value { return self::singleArgument('asin', $argument, NumberUtil::class . '::asin', true); } /** * Creates an `acos()` calculation with the given $argument. * * The $argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. */ public static function acos(object $argument): Value { return self::singleArgument('acos', $argument, NumberUtil::class . '::acos', true); } /** * Creates an `abs()` calculation with the given $argument. * * The $argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. */ public static function abs(object $argument): Value { $argument = self::simplify($argument); if (!$argument instanceof SassNumber) { return new SassCalculation('abs', [$argument]); } if ($argument->hasUnit('%')) { $message = <<<WARNING Passing percentage units to the global abs() function is deprecated. In the future, this will emit a CSS abs() function to be resolved by the browser. To preserve current behavior: math.abs($argument) To emit a CSS abs() now: abs(#{{$argument}}) More info: https://sass-lang.com/d/abs-percent WARNING; Warn::forDeprecation($message, Deprecation::absPercent); } return NumberUtil::abs($argument); } /** * Creates an `exp()` calculation with the given $argument. * * The $argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. */ public static function exp(object $argument): Value { $argument = self::simplify($argument); if (!$argument instanceof SassNumber) { return new SassCalculation('exp', [$argument]); } $argument->assertNoUnits(); return NumberUtil::pow(SassNumber::create(M_E), $argument); } /** * Creates a `sign()` calculation with the given $argument. * * The $argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. */ public static function sign(object $argument): Value { $argument = self::simplify($argument); if (!$argument instanceof SassNumber) { return new SassCalculation('sign', [$argument]); } if (!$argument->hasUnits() && (is_nan($argument->getValue()) || $argument->getValue() === 0.0)) { return $argument; } if (!$argument->hasUnit('%')) { return SassNumber::create(NumberUtil::sign($argument->getValue()))->coerceToMatch($argument); } return new SassCalculation('sign', [$argument]); } /** * Creates a `clamp()` calculation with the given $min, $value, and $max. * * Each argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. * * This may be passed fewer than three arguments, but only if one of the * arguments is an unquoted `var()` string. * * @throws SassScriptException */ public static function clamp(object $min, ?object $value = null, ?object $max = null): Value { if ($value === null && $max !== null) { throw new \InvalidArgumentException('If value is null, max must also be null.'); } $min = self::simplify($min); if ($value !== null) { $value = self::simplify($value); } if ($max !== null) { $max = self::simplify($max); } if ($min instanceof SassNumber && $value instanceof SassNumber && $max instanceof SassNumber && $min->hasCompatibleUnits($value) && $min->hasCompatibleUnits($max)) { if ($value->lessThanOrEquals($min)->isTruthy()) { return $min; } if ($value->greaterThanOrEquals($max)->isTruthy()) { return $max; } return $value; } $args = array_values(array_filter([$min, $value, $max])); self::verifyCompatibleNumbers($args); self::verifyLength($args, 3); return new SassCalculation('clamp', $args); } /** * Creates a `pow()` calculation with the given $base and $exponent. * * Each argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. * * This may be passed fewer than two arguments, but only if one of the * arguments is an unquoted `var()` string. */ public static function pow(object $base, ?object $exponent): Value { $args = [$base]; if ($exponent !== null) { $args[] = $exponent; } self::verifyLength($args, 2); $base = self::simplify($base); if ($exponent !== null) { $exponent = self::simplify($exponent); } if (!$base instanceof SassNumber || !$exponent instanceof SassNumber) { return new SassCalculation('pow', $args); } $base->assertNoUnits(); $exponent->assertNoUnits(); return NumberUtil::pow($base, $exponent); } /** * Creates a `log()` calculation with the given $number and $base. * * Each argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. * * If arguments contains exactly a single argument, the base is set to * `math.e` by default. */ public static function log(object $number, ?object $base): Value { $number = self::simplify($number); $args = [$number]; if ($base !== null) { $base = self::simplify($base); $args[] = $base; } if (!$number instanceof SassNumber || ($base !== null && !$base instanceof SassNumber)) { return new SassCalculation('log', $args); } $number->assertNoUnits(); if ($base instanceof SassNumber) { $base->assertNoUnits(); return NumberUtil::log($number, $base); } return NumberUtil::log($number, null); } /** * Creates a `atan2()` calculation for $y and $x. * * Each argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. * * This may be passed fewer than two arguments, but only if one of the * arguments is an unquoted `var()` string. */ public static function atan2(object $y, ?object $x): Value { $y = self::simplify($y); $args = [$y]; if ($x !== null) { $x = self::simplify($x); $args[] = $x; } self::verifyLength($args, 2); self::verifyCompatibleNumbers($args); if (!$y instanceof SassNumber || !$x instanceof SassNumber || $y->hasUnit('%') || $x->hasUnit('%') || !$y->hasCompatibleUnits($x)) { return new SassCalculation('atan2', $args); } return NumberUtil::atan2($y, $x); } /** * Creates a `rem()` calculation with the given $dividend and $modulus. * * Each argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. * * This may be passed fewer than two arguments, but only if one of the * arguments is an unquoted `var()` string. */ public static function rem(object $dividend, ?object $modulus): Value { $dividend = self::simplify($dividend); $args = [$dividend]; if ($modulus !== null) { $modulus = self::simplify($modulus); $args[] = $modulus; } self::verifyLength($args, 2); self::verifyCompatibleNumbers($args); if (!$dividend instanceof SassNumber || !$modulus instanceof SassNumber || !$dividend->hasCompatibleUnits($modulus)) { return new SassCalculation('rem', $args); } $result = $dividend->modulo($modulus); if (NumberUtil::signIncludingZero($modulus->getValue()) !== NumberUtil::signIncludingZero($dividend->getValue())) { if (is_infinite($modulus->getValue())) { return $dividend; } if ($result->getValue() === 0.0) { return $result->unaryMinus(); } return $result->minus($modulus); } return $result; } /** * Creates a `mod()` calculation with the given $dividend and $modulus. * * Each argument must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. * * This may be passed fewer than two arguments, but only if one of the * arguments is an unquoted `var()` string. */ public static function mod(object $dividend, ?object $modulus): Value { $dividend = self::simplify($dividend); $args = [$dividend]; if ($modulus !== null) { $modulus = self::simplify($modulus); $args[] = $modulus; } self::verifyLength($args, 2); self::verifyCompatibleNumbers($args); if (!$dividend instanceof SassNumber || !$modulus instanceof SassNumber || !$dividend->hasCompatibleUnits($modulus)) { return new SassCalculation('mod', $args); } return $dividend->modulo($modulus); } /** * Creates a `round()` calculation with the given $strategyOrNumber, * $numberOrStep, and $step. Strategy must be either nearest, up, down or * to-zero. * * Number and step must be either a {@see SassNumber}, a {@see SassCalculation}, an * unquoted {@see SassString}, or a {@see CalculationOperation}. * * This automatically simplifies the calculation, so it may return a * {@see SassNumber} rather than a {@see SassCalculation}. It throws an exception if it * can determine that the calculation will definitely produce invalid CSS. * * This may be passed fewer than two arguments, but only if one of the * arguments is an unquoted `var()` string. */ public static function round(object $strategyOrNumber, ?object $numberOrStep = null, ?object $step = null): Value { $strategyOrNumber = self::simplify($strategyOrNumber); if ($numberOrStep !== null) { $numberOrStep = self::simplify($numberOrStep); } if ($step !== null) { $step = self::simplify($step); } switch (true) { case $strategyOrNumber instanceof SassNumber && $numberOrStep === null && $step === null: return self::matchUnits(round($strategyOrNumber->getValue()), $strategyOrNumber); case $strategyOrNumber instanceof SassNumber && $numberOrStep instanceof SassNumber && $step === null: self::verifyCompatibleNumbers([$strategyOrNumber, $numberOrStep]); if (!$strategyOrNumber->hasCompatibleUnits($numberOrStep)) { return new SassCalculation('round', [$strategyOrNumber, $numberOrStep]); } return self::roundWithStep('nearest', $strategyOrNumber, $numberOrStep); case $strategyOrNumber instanceof SassString && \in_array($strategyOrNumber->getText(), ['nearest', 'up', 'down', 'to-zero'], true) && $numberOrStep instanceof SassNumber && $step instanceof SassNumber: self::verifyCompatibleNumbers([$numberOrStep, $step]); if (!$numberOrStep->hasCompatibleUnits($step)) { return new SassCalculation('round', [$strategyOrNumber, $numberOrStep, $step]); } return self::roundWithStep($strategyOrNumber->getText(), $numberOrStep, $step); case $strategyOrNumber instanceof SassString && \in_array($strategyOrNumber->getText(), ['nearest', 'up', 'down', 'to-zero'], true) && $numberOrStep instanceof SassString && $step === null: return new SassCalculation('round', [$strategyOrNumber, $numberOrStep]); case $strategyOrNumber instanceof SassString && \in_array($strategyOrNumber->getText(), ['nearest', 'up', 'down', 'to-zero'], true) && $numberOrStep !== null && $step === null: throw new SassScriptException('If strategy is not null, step is required.'); case $strategyOrNumber instanceof SassString && \in_array($strategyOrNumber->getText(), ['nearest', 'up', 'down', 'to-zero'], true) && $numberOrStep === null && $step === null: throw new SassScriptException('Number to round and step arguments are required.'); case $strategyOrNumber instanceof SassString && $numberOrStep === null && $step === null: return new SassCalculation('round', [$strategyOrNumber]); case $numberOrStep === null && $step === null: throw new SassScriptException("Single argument $strategyOrNumber expected to be simplifiable."); case $step === null: return new SassCalculation('round', [$strategyOrNumber, $numberOrStep]); case $strategyOrNumber instanceof SassString && (\in_array($strategyOrNumber->getText(), ['nearest', 'up', 'down', 'to-zero'], true) || $strategyOrNumber->isVar()) && $numberOrStep !== null: return new SassCalculation('round', [$strategyOrNumber, $numberOrStep, $step]); case $numberOrStep !== null: throw new SassScriptException("$strategyOrNumber must be either nearest, up, down or to-zero."); default: throw new SassScriptException('Invalid parameters.'); } } /** * Creates and simplifies a {@see CalculationOperation} with the given $operator, * $left, and $right. * * This automatically simplifies the operation, so it may return a * {@see SassNumber} rather than a {@see CalculationOperation}. * * Each of $left and $right must be either a {@see SassNumber}, a * {@see SassCalculation}, an unquoted {@see SassString}, or a {@see CalculationOperation}. * * @throws SassScriptException */ public static function operate(CalculationOperator $operator, object $left, object $right): object { return self::operateInternal($operator, $left, $right, false, true); } /** * Like {@see operate}, but with the internal-only $inLegacySassFunction parameter. * * If $inLegacySassFunction is `true`, this allows unitless numbers to be added and * subtracted with numbers with units, for backwards-compatibility with the * old global `min()` and `max()` functions. * * If $simplify is `false`, no simplification will be done. * * @return SassNumber|CalculationOperation|SassString|SassCalculation|Value * * @throws SassScriptException * * @internal */ public static function operateInternal(CalculationOperator $operator, object $left, object $right, bool $inLegacySassFunction, bool $simplify): object { if (!$simplify) { return new CalculationOperation($operator, $left, $right); } $left = self::simplify($left); $right = self::simplify($right); if ($operator === CalculationOperator::PLUS || $operator === CalculationOperator::MINUS) { if ($left instanceof SassNumber && $right instanceof SassNumber && ($inLegacySassFunction ? $left->isComparableTo($right) : $left->hasCompatibleUnits($right))) { return $operator === CalculationOperator::PLUS ? $left->plus($right) : $left->minus($right); } self::verifyCompatibleNumbers([$left, $right]); if ($right instanceof SassNumber && NumberUtil::fuzzyLessThan($right->getValue(), 0)) { $right = $right->times(SassNumber::create(-1)); $operator = $operator === CalculationOperator::PLUS ? CalculationOperator::MINUS : CalculationOperator::PLUS; } return new CalculationOperation($operator, $left, $right); } if ($left instanceof SassNumber && $right instanceof SassNumber) { return $operator === CalculationOperator::TIMES ? $left->times($right) : $left->dividedBy($right); } return new CalculationOperation($operator, $left, $right); } /** * An internal constructor that doesn't perform any validation or * simplification. * * @param list<object> $arguments */ private function __construct(string $name, array $arguments) { $this->name = $name; $this->arguments = $arguments; } public function getName(): string { return $this->name; } public function isSpecialNumber(): bool { return true; } /** * @return list<object> */ public function getArguments(): array { return $this->arguments; } public function accept(ValueVisitor $visitor) { return $visitor->visitCalculation($this); } public function assertCalculation(?string $name = null): SassCalculation { return $this; } public function plus(Value $other): Value { if ($other instanceof SassString) { return parent::plus($other); } throw new SassScriptException("Undefined operation \"$this + $other\"."); } public function minus(Value $other): Value { throw new SassScriptException("Undefined operation \"$this - $other\"."); } public function unaryPlus(): Value { throw new SassScriptException("Undefined operation \"+$this\"."); } public function unaryMinus(): Value { throw new SassScriptException("Undefined operation \"-$this\"."); } public function equals(object $other): bool { if (!$other instanceof SassCalculation || $this->name !== $other->name) { return false; } if (\count($this->arguments) !== \count($other->arguments)) { return false; } foreach ($this->arguments as $i => $argument) { assert($argument instanceof Equatable); $otherArgument = $other->arguments[$i]; if (!$argument->equals($otherArgument)) { return false; } } return true; } /** * Returns $value coerced to $number's units. */ private static function matchUnits(float $value, SassNumber $number): SassNumber { return SassNumber::withUnits($value, $number->getNumeratorUnits(), $number->getDenominatorUnits()); } /** * Returns a rounded $number based on a selected rounding $strategy, * to the nearest integer multiple of $step. */ private static function roundWithStep(string $strategy, SassNumber $number, SassNumber $step): SassNumber { if (!\in_array($strategy, ['nearest', 'up', 'down', 'to-zero'], true)) { throw new \InvalidArgumentException('$strategy must be either nearest, up, down or to-zero.'); } if (is_infinite($number->getValue()) && is_infinite($step->getValue()) || $step->getValue() === 0.0 || is_nan($number->getValue()) || is_nan($step->getValue())) { return self::matchUnits(NAN, $number); } if (is_infinite($number->getValue())) { return $number; } if (is_infinite($step->getValue())) { if ($number->getValue() === 0.0) { return $number; } switch ($strategy) { case 'nearest': case 'to-zero': if ($number->getValue() > 0) { return self::matchUnits(0.0, $number); } return self::matchUnits(-0.0, $number); case 'up': if ($number->getValue() > 0) { return self::matchUnits(INF, $number); } return self::matchUnits(-0.0, $number); case 'down': if ($number->getValue() < 0) { return self::matchUnits(-INF, $number); } return self::matchUnits(0.0, $number); } } $stepWithNumberUnit = $step->convertValueToMatch($number); switch ($strategy) { case 'nearest': return self::matchUnits(round($number->getValue() / $stepWithNumberUnit) * $stepWithNumberUnit, $number); case 'up': return self::matchUnits(($step->getValue() < 0 ? floor($number->getValue() / $stepWithNumberUnit) : ceil($number->getValue() / $stepWithNumberUnit)) * $stepWithNumberUnit, $number); case 'down': return self::matchUnits(($step->getValue() < 0 ? ceil($number->getValue() / $stepWithNumberUnit) : floor($number->getValue() / $stepWithNumberUnit)) * $stepWithNumberUnit, $number); case 'to-zero': if ($number->getValue() < 0) { return self::matchUnits(ceil($number->getValue() / $stepWithNumberUnit) * $stepWithNumberUnit, $number); } return self::matchUnits(floor($number->getValue() / $stepWithNumberUnit) * $stepWithNumberUnit, $number); default: return self::matchUnits(NAN, $number); } } /** * @param list<object> $args * * @return list<object> * * @throws SassScriptException */ private static function simplifyArguments(array $args): array { return array_map([self::class, 'simplify'], $args); } /** * @return SassNumber|CalculationOperation|SassString|SassCalculation * * @throws SassScriptException */ private static function simplify(object $arg): object { if ($arg instanceof SassNumber || $arg instanceof CalculationOperation) { return $arg; } if ($arg instanceof SassString) { if (!$arg->hasQuotes()) { return $arg; } throw new SassScriptException("Quoted string $arg can't be used in a calculation."); } if ($arg instanceof SassCalculation) { if ($arg->getName() === 'calc') { $argument = $arg->getArguments()[0]; if ($argument instanceof SassString && !$argument->hasQuotes() && self::needsParentheses($argument->getText())) { return new SassString("({$argument->getText()})", false); } \assert($argument instanceof SassNumber || $argument instanceof SassString || $argument instanceof SassCalculation || $argument instanceof CalculationOperation); return $argument; } return $arg; } if ($arg instanceof Value) { throw new SassScriptException("Value $arg can't be used in a calculation."); } throw new \InvalidArgumentException(sprintf('Unexpected calculation argument %s.', get_debug_type($arg))); } /** * Returns whether $text needs parentheses if it's the contents of a * `calc()` being embedded in another calculation. */ private static function needsParentheses(string $text): bool { $first = $text[0]; if (self::charNeedsParentheses($first)) { return true; } $couldBeVar = \strlen($text) > 4 && ($first === 'v' || $first === 'V'); if (\strlen($text) < 2) { return false; } $second = $text[1]; if (self::charNeedsParentheses($second)) { return true; } $couldBeVar = $couldBeVar && ($second === 'a' || $second === 'A'); if (\strlen($text) < 3) { return false; } $third = $text[2]; if (self::charNeedsParentheses($third)) { return true; } $couldBeVar = $couldBeVar && ($third === 'r' || $third === 'R'); if (\strlen($text) < 4) { return false; } $fourth = $text[3]; if ($couldBeVar && $fourth === '(') { return true; } if (self::charNeedsParentheses($fourth)) { return true; } for ($i = 4; $i < \strlen($text); ++$i) { if (self::charNeedsParentheses($text[$i])) { return true; } } return false; } /** * Returns whether $character intrinsically needs parentheses if it appears * in the unquoted string argument of a `calc()` being embedded in another * calculation. */ private static function charNeedsParentheses(string $character): bool { return $character === '/' || $character === '*' || Character::isWhitespace($character); } /** * Verifies that all the numbers in $args aren't known to be incompatible * with one another, and that they don't have units that are too complex for * calculations. * * @param list<object> $args * * @throws SassScriptException */ private static function verifyCompatibleNumbers(array $args): void { foreach ($args as $arg) { if (!$arg instanceof SassNumber) { continue; } if (\count($arg->getNumeratorUnits()) > 1 || \count($arg->getDenominatorUnits())) { throw new SassScriptException("Number $arg isn't compatible with CSS calculations."); } } for ($i = 0; $i < \count($args); $i++) { $number1 = $args[$i]; if (!$number1 instanceof SassNumber) { continue; } for ($j = $i + 1; $j < \count($args); $j++) { $number2 = $args[$j]; if (!$number2 instanceof SassNumber) { continue; } if ($number1->hasPossiblyCompatibleUnits($number2)) { continue; } throw new SassScriptException("$number1 and $number2 are incompatible."); } } } /** * Throws a {@see SassScriptException} if $args isn't $expectedLength *and* * doesn't contain either a {@see SassString}. * * @param list<object> $args * * @throws SassScriptException */ private static function verifyLength(array $args, int $expectedLength): void { if (\count($args) === $expectedLength) { return; } foreach ($args as $arg) { if ($arg instanceof SassString) { return; } } $length = \count($args); $verb = StringUtil::pluralize('was', $length, 'were'); throw new SassScriptException("$expectedLength arguments required, but only $length $verb passed."); } /** * @param callable(SassNumber): SassNumber $mathFunc * * @param-immediately-invoked-callable $mathFunc */ private static function singleArgument(string $name, object $argument, callable $mathFunc, bool $forbidUnits = false): Value { $argument = self::simplify($argument); if (!$argument instanceof SassNumber) { return new SassCalculation($name, [$argument]); } if ($forbidUnits) { $argument->assertNoUnits(); } return $mathFunc($argument); } } PKCA#]Ht����Qsystem/helixultimate/vendor/scssphp/scssphp/src/SassCallable/PlainCssCallable.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\SassCallable; use ScssPhp\ScssPhp\Util\Equatable; /** * A callable that emits a plain CSS function. * * This can't be used for mixins. * * @internal */ final class PlainCssCallable implements SassCallable, Equatable { private readonly string $name; public function __construct(string $name) { $this->name = $name; } public function getName(): string { return $this->name; } public function equals(object $other): bool { return $other instanceof PlainCssCallable && $this->name === $other->name; } } PKCA#]����44Msystem/helixultimate/vendor/scssphp/scssphp/src/SassCallable/SassCallable.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\SassCallable; use ScssPhp\ScssPhp\Value\SassNumber; use ScssPhp\ScssPhp\Value\Value; /** * An interface for functions and mixins that can be invoked from Sass by * passing in arguments. * * When writing custom functions, it's important to make them as user-friendly * and as close to the standards set by Sass's core functions as possible. Some * good guidelines to follow include: * * * Use `Value.assert*` methods, like {@see Value::assertString}, to cast untyped * {@see Value} objects to more specific types. For values from the argument list, * pass in the argument name as well. This ensures that the user gets good * error messages when they pass in the wrong type to your function. * * * Individual classes may have more specific `assert*` methods, like * {@see SassNumber::assertInt}, which should be used when possible. * * * In Sass, every value counts as a list. Functions should avoid casting * values to the `SassList` type, and should use the {@see Value::asList} method * instead. * * * When manipulating values like lists, strings, and numbers that have * metadata (comma versus space separated, bracketed versus unbracketed, * quoted versus unquoted, units), the output metadata should match the input * metadata. For lists, the {@see Value::withListContents} method can be used to do * this automatically. * * * When in doubt, lists should default to comma-separated, strings should * default to quoted, and number should default to unitless. * * * In Sass, lists and strings use one-based indexing and use negative indices * to index from the end of value. Functions should follow these conventions. * The {@see Value::sassIndexToListIndex} and {@see SassString::sassIndexToStringIndex} * methods can be used to do this automatically. * * * String indexes in Sass refer to Unicode code points while PHP string * indices refer to bytes. For example, the character U+1F60A, * Smiling Face With Smiling Eyes, is a single Unicode code point but is * represented in UTF-8 as several bytes (`0xF0`, `0x9F`, `0x98` and `0x8A`). So in * PHP, `substr("a😊b", 1, 1)` returns `"\xF0"`, whereas in Sass * `str-slice("a😊b", 1, 1)` returns `"😊"`. Functions should follow this * convention. The {@see SassString::sassIndexToStringIndex} and * {@see SassString::sassIndexToCodePointIndex} methods can be used to do this * automatically, and the {@see SassString::getSassLength} getter can be used to * access a string's length in code points. * * @internal */ interface SassCallable { /** * The callable's name */ public function getName(): string; } PKCA#]Ua���Psystem/helixultimate/vendor/scssphp/scssphp/src/SassCallable/BuiltInCallable.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\SassCallable; use League\Uri\Contracts\UriInterface; use ScssPhp\ScssPhp\Ast\Sass\ArgumentDeclaration; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Value\SassNull; use ScssPhp\ScssPhp\Value\Value; /** * A callable defined in PHP code. * * Unlike user-defined callables, built-in callables support overloads. They * may declare multiple different callbacks with multiple different sets of * arguments. When the callable is invoked, the first callback with matching * arguments is invoked. * * @internal */ class BuiltInCallable implements SassCallable { private readonly string $name; /** * @var list<array{ArgumentDeclaration, callable(list<Value>): Value}> */ private readonly array $overloads; private readonly bool $acceptsContent; /** * Creates a function with a single $arguments declaration and a single * $callback. * * The argument declaration is parsed from $arguments, which should not * include parentheses. Throws a {@see SassFormatException} if parsing fails. * * If passed, $url is the URL of the module in which the function is * defined. * * @param callable(list<Value>): Value $callback * * @throws SassFormatException */ public static function function(string $name, string $arguments, callable $callback, ?UriInterface $url = null): BuiltInCallable { return self::parsed( $name, ArgumentDeclaration::parse("@function $name($arguments) {", url: $url), $callback ); } /** * Creates a mixin with a single $arguments declaration and a single * $callback. * * The argument declaration is parsed from $arguments, which should not * include parentheses. Throws a {@see SassFormatException} if parsing fails. * * If passed, $url is the URL of the module in which the mixin is * defined. * * @param callable(list<Value>): void $callback * * @throws SassFormatException */ public static function mixin(string $name, string $arguments, callable $callback, ?UriInterface $url = null, bool $acceptsContent = false): BuiltInCallable { return self::parsed( $name, ArgumentDeclaration::parse("@mixin $name($arguments) {", url: $url), function ($arguments) use ($callback) { $callback($arguments); return SassNull::create(); }, $acceptsContent ); } /** * Creates a function with multiple implementations. * * Each key/value pair in $overloads defines the argument declaration for * the overload (which should not include parentheses), and the callback to * execute if that argument declaration matches. Throws a * {@see SassFormatException} if parsing fails. * * If passed, $url is the URL of the module in which the function is * defined. * * @param array<string, callable(list<Value>): Value> $overloads * * @throws SassFormatException */ public static function overloadedFunction(string $name, array $overloads, ?UriInterface $url = null): BuiltInCallable { $processedOverloads = []; foreach ($overloads as $args => $callback) { $processedOverloads[] = [ ArgumentDeclaration::parse("@function $name($args) {", url: $url), $callback, ]; } return new BuiltInCallable($name, $processedOverloads, false); } /** * Creates a callable with a single $arguments declaration and a single $callback. * * @param callable(list<Value>): Value $callback */ private static function parsed(string $name, ArgumentDeclaration $arguments, callable $callback, bool $acceptsContent = false): BuiltInCallable { return new BuiltInCallable($name, [[$arguments, $callback]], $acceptsContent); } /** * @param list<array{ArgumentDeclaration, callable(list<Value>): Value}> $overloads */ private function __construct(string $name, array $overloads, bool $acceptsContent) { $this->name = $name; $this->overloads = $overloads; $this->acceptsContent = $acceptsContent; } public function getName(): string { return $this->name; } public function acceptsContent(): bool { return $this->acceptsContent; } /** * Returns the argument declaration and PHP callback for the given * positional and named arguments. * * If no exact match is found, finds the closest approximation. Note that this * doesn't guarantee that $positional and $names are valid for the returned * {@see ArgumentDeclaration}. * * @param array<string, mixed> $names Only the keys are relevant * * @return array{ArgumentDeclaration, callable(list<Value>): Value} */ public function callbackFor(int $positional, array $names): array { $fuzzyMatch = null; $minMismatchDistance = null; foreach ($this->overloads as $overload) { // Ideally, find an exact match. if ($overload[0]->matches($positional, $names)) { return $overload; } $mismatchDistance = \count($overload[0]->getArguments()) - $positional; if ($minMismatchDistance !== null) { if (abs($mismatchDistance) > abs($minMismatchDistance)) { continue; } // If two overloads have the same mismatch distance, favor the overload // that has more arguments. if (abs($mismatchDistance) === abs($minMismatchDistance) && $mismatchDistance < 0) { continue; } } $minMismatchDistance = $mismatchDistance; $fuzzyMatch = $overload; } if ($fuzzyMatch !== null) { return $fuzzyMatch; } throw new \LogicException("BuiltInCallable {$this->name} may not have empty overloads."); } /** * Returns a copy of this callable with the given $name. */ public function withName(string $name): BuiltInCallable { return new BuiltInCallable($name, $this->overloads, $this->acceptsContent); } } PKCA#]'䲵��Tsystem/helixultimate/vendor/scssphp/scssphp/src/SassCallable/UserDefinedCallable.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\SassCallable; use ScssPhp\ScssPhp\Ast\Sass\Statement\CallableDeclaration; use ScssPhp\ScssPhp\Evaluation\Environment; /** * A callback defined in the user's Sass stylesheet. * * @internal */ final class UserDefinedCallable implements SassCallable { private readonly CallableDeclaration $declaration; private readonly Environment $environment; private readonly bool $inDependency; public function __construct(CallableDeclaration $declaration, Environment $environment, bool $inDependency) { $this->declaration = $declaration; $this->environment = $environment; $this->inDependency = $inDependency; } public function getDeclaration(): CallableDeclaration { return $this->declaration; } public function getEnvironment(): Environment { return $this->environment; } public function isInDependency(): bool { return $this->inDependency; } public function getName(): string { return $this->declaration->getName(); } } PKCA#]����Hsystem/helixultimate/vendor/scssphp/scssphp/src/Compiler/Environment.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Compiler; /** * Compiler environment * * @author Anthon Pang <anthon.pang@gmail.com> * * @internal */ class Environment { /** * @var \ScssPhp\ScssPhp\Block|null */ public $block; /** * @var \ScssPhp\ScssPhp\Compiler\Environment|null */ public $parent; /** * @var Environment|null */ public $declarationScopeParent; /** * @var Environment|null */ public $parentStore; /** * @var array|null */ public $selectors; /** * @var string|null */ public $marker; /** * @var array */ public $store; /** * @var array */ public $storeUnreduced; /** * @var int */ public $depth; } PKCA#]�)�r r Osystem/helixultimate/vendor/scssphp/scssphp/src/Compiler/LegacyValueVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Compiler; use ScssPhp\ScssPhp\Compiler; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Node\Number; use ScssPhp\ScssPhp\Type; use ScssPhp\ScssPhp\Util\NumberUtil; use ScssPhp\ScssPhp\Value\SassArgumentList; use ScssPhp\ScssPhp\Value\SassBoolean; use ScssPhp\ScssPhp\Value\SassCalculation; use ScssPhp\ScssPhp\Value\SassColor; use ScssPhp\ScssPhp\Value\SassFunction; use ScssPhp\ScssPhp\Value\SassList; use ScssPhp\ScssPhp\Value\SassMap; use ScssPhp\ScssPhp\Value\SassMixin; use ScssPhp\ScssPhp\Value\SassNumber; use ScssPhp\ScssPhp\Value\SassString; use ScssPhp\ScssPhp\Visitor\ValueVisitor; /** * Converts values to the legacy representation. * * @internal * @template-implements ValueVisitor<array|Number> */ final class LegacyValueVisitor implements ValueVisitor { public function visitBoolean(SassBoolean $value) { return $value->getValue() ? Compiler::$true : Compiler::$false; } public function visitCalculation(SassCalculation $value) { return [Type::T_STRING, '', $value->toCssString()]; } public function visitColor(SassColor $value) { if (NumberUtil::fuzzyEquals($value->getAlpha(), 1)) { return [Type::T_COLOR, $value->getRed(), $value->getGreen(), $value->getBlue()]; } return [Type::T_COLOR, $value->getRed(), $value->getGreen(), $value->getBlue(), $value->getAlpha()]; } public function visitFunction(SassFunction $value) { throw new SassScriptException('Functions are not supported by the legacy value API. Migrate your custom function to the new API to accept mixins as arguments.'); } public function visitMixin(SassMixin $value) { throw new SassScriptException('Mixins are not supported by the legacy value API. Migrate your custom function to the new API to accept mixins as arguments.'); } public function visitList(SassList $value) { $items = []; foreach ($value->asList() as $item) { $items[] = $item->accept($this); } $list = [Type::T_LIST, $value->getSeparator()->getSeparator() ?? '', $items]; if ($value->hasBrackets()) { $list['enclosing'] = 'bracket'; } if ($value instanceof SassArgumentList) { $keywords = []; foreach ($value->getKeywords() as $keywordName => $keywordValue) { $keywords[$keywordName] = $keywordValue->accept($this); } $list[3] = $keywords; } return $list; } public function visitMap(SassMap $value) { $keys = []; $values = []; foreach ($value->getContents() as $key => $item) { $keys[] = $key->accept($this); $values[] = $item->accept($this); } return [Type::T_MAP, $keys, $values]; } public function visitNull() { return Compiler::$null; } public function visitNumber(SassNumber $value) { return new Number($value->getValue(), $value->getNumeratorUnits(), $value->getDenominatorUnits()); } public function visitString(SassString $value) { return [Type::T_STRING, $value->hasQuotes() ? '"' : '', [$value->getText()]]; } } PKCA#]���..Isystem/helixultimate/vendor/scssphp/scssphp/src/Compiler/CachedResult.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Compiler; use ScssPhp\ScssPhp\CompilationResult; /** * @internal */ class CachedResult { /** * @var CompilationResult */ private $result; /** * @var array<string, int> */ private $parsedFiles; /** * @var array * @phpstan-var list<array{currentDir: string|null, path: string, filePath: string}> */ private $resolvedImports; /** * @param CompilationResult $result * @param array<string, int> $parsedFiles * @param array $resolvedImports * * @phpstan-param list<array{currentDir: string|null, path: string, filePath: string}> $resolvedImports */ public function __construct(CompilationResult $result, array $parsedFiles, array $resolvedImports) { $this->result = $result; $this->parsedFiles = $parsedFiles; $this->resolvedImports = $resolvedImports; } /** * @return CompilationResult */ public function getResult() { return $this->result; } /** * @return array<string, int> */ public function getParsedFiles() { return $this->parsedFiles; } /** * @return array * * @phpstan-return list<array{currentDir: string|null, path: string, filePath: string}> */ public function getResolvedImports() { return $this->resolvedImports; } } PKCA#]^~�/Wsystem/helixultimate/vendor/scssphp/scssphp/src/Evaluation/VisitorEvaluationContext.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Evaluation; use ScssPhp\ScssPhp\Ast\AstNode; use ScssPhp\ScssPhp\Deprecation; use SourceSpan\FileSpan; /** * @internal */ final class VisitorEvaluationContext extends EvaluationContext { private readonly EvaluateVisitor $visitor; private readonly AstNode $defaultWarnNodeWithSpan; public function __construct(EvaluateVisitor $visitor, AstNode $defaultWarnNodeWithSpan) { $this->visitor = $visitor; $this->defaultWarnNodeWithSpan = $defaultWarnNodeWithSpan; } public function getCurrentCallableSpan(): FileSpan { $callableNode = $this->visitor->getCallableNode(); if ($callableNode !== null) { return $callableNode->getSpan(); } throw new \LogicException('No Sass callable is currently being evaluated.'); } public function warn(string $message, ?Deprecation $deprecation = null): void { $span = $this->visitor->getImportSpan() ?? $this->maybeCurrentCallableSpan() ?? $this->defaultWarnNodeWithSpan->getSpan(); $this->visitor->warn($message, $span, $deprecation); } private function maybeCurrentCallableSpan(): ?FileSpan { $callableNode = $this->visitor->getCallableNode(); if ($callableNode !== null) { return $callableNode->getSpan(); } return null; } } PKCA#]\�� � Nsystem/helixultimate/vendor/scssphp/scssphp/src/Evaluation/EvaluateVisitor.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Evaluation; use League\Uri\Uri; use ScssPhp\ScssPhp\Ast\AstNode; use ScssPhp\ScssPhp\Ast\Css\CssAtRule; use ScssPhp\ScssPhp\Ast\Css\CssComment; use ScssPhp\ScssPhp\Ast\Css\CssKeyframeBlock; use ScssPhp\ScssPhp\Ast\Css\CssMediaQuery; use ScssPhp\ScssPhp\Ast\Css\CssMediaRule; use ScssPhp\ScssPhp\Ast\Css\CssNode; use ScssPhp\ScssPhp\Ast\Css\CssStyleRule; use ScssPhp\ScssPhp\Ast\Css\CssStylesheet; use ScssPhp\ScssPhp\Ast\Css\CssValue; use ScssPhp\ScssPhp\Ast\Css\MediaQuerySingletonMergeResult; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssAtRule; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssComment; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssDeclaration; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssImport; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssKeyframeBlock; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssMediaRule; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssNode; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssParentNode; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssStyleRule; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssStylesheet; use ScssPhp\ScssPhp\Ast\Css\ModifiableCssSupportsRule; use ScssPhp\ScssPhp\Ast\FakeAstNode; use ScssPhp\ScssPhp\Ast\Sass\ArgumentDeclaration; use ScssPhp\ScssPhp\Ast\Sass\ArgumentInvocation; use ScssPhp\ScssPhp\Ast\Sass\AtRootQuery; use ScssPhp\ScssPhp\Ast\Sass\CallableInvocation; use ScssPhp\ScssPhp\Ast\Sass\Expression; use ScssPhp\ScssPhp\Ast\Sass\Expression\BinaryOperationExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\BinaryOperator; use ScssPhp\ScssPhp\Ast\Sass\Expression\BooleanExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\ColorExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\FunctionExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\IfExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\InterpolatedFunctionExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\IsCalculationSafeVisitor; use ScssPhp\ScssPhp\Ast\Sass\Expression\ListExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\MapExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\NullExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\NumberExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\ParenthesizedExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\SelectorExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\StringExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\SupportsExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\UnaryOperationExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\UnaryOperator; use ScssPhp\ScssPhp\Ast\Sass\Expression\ValueExpression; use ScssPhp\ScssPhp\Ast\Sass\Expression\VariableExpression; use ScssPhp\ScssPhp\Ast\Sass\Import\DynamicImport; use ScssPhp\ScssPhp\Ast\Sass\Import\StaticImport; use ScssPhp\ScssPhp\Ast\Sass\Interpolation; use ScssPhp\ScssPhp\Ast\Sass\Statement; use ScssPhp\ScssPhp\Ast\Sass\Statement\AtRootRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\AtRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ContentBlock; use ScssPhp\ScssPhp\Ast\Sass\Statement\ContentRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\DebugRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\Declaration; use ScssPhp\ScssPhp\Ast\Sass\Statement\EachRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ErrorRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ExtendRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ForRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\FunctionRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\IfRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ImportRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\IncludeRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\LoudComment; use ScssPhp\ScssPhp\Ast\Sass\Statement\MediaRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\MixinRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\ReturnRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\SilentComment; use ScssPhp\ScssPhp\Ast\Sass\Statement\StyleRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\Stylesheet; use ScssPhp\ScssPhp\Ast\Sass\Statement\SupportsRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\VariableDeclaration; use ScssPhp\ScssPhp\Ast\Sass\Statement\WarnRule; use ScssPhp\ScssPhp\Ast\Sass\Statement\WhileRule; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsAnything; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsDeclaration; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsFunction; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsInterpolation; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsNegation; use ScssPhp\ScssPhp\Ast\Sass\SupportsCondition\SupportsOperation; use ScssPhp\ScssPhp\Ast\Selector\SelectorList; use ScssPhp\ScssPhp\Ast\Selector\SimpleSelector; use ScssPhp\ScssPhp\Collection\Map; use ScssPhp\ScssPhp\Colors; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\Exception\MultiSpanSassRuntimeException; use ScssPhp\ScssPhp\Exception\SassException; use ScssPhp\ScssPhp\Exception\SassRuntimeException; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Exception\SimpleSassException; use ScssPhp\ScssPhp\Exception\SimpleSassFormatException; use ScssPhp\ScssPhp\Exception\SimpleSassRuntimeException; use ScssPhp\ScssPhp\Extend\ConcreteExtensionStore; use ScssPhp\ScssPhp\Extend\Extension; use ScssPhp\ScssPhp\Extend\ExtensionStore; use ScssPhp\ScssPhp\Function\FunctionRegistry; use ScssPhp\ScssPhp\Importer\ImportCache; use ScssPhp\ScssPhp\Importer\Importer; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Parser\InterpolationMap; use ScssPhp\ScssPhp\Parser\KeyframeSelectorParser; use ScssPhp\ScssPhp\SassCallable\BuiltInCallable; use ScssPhp\ScssPhp\SassCallable\PlainCssCallable; use ScssPhp\ScssPhp\SassCallable\SassCallable; use ScssPhp\ScssPhp\SassCallable\UserDefinedCallable; use ScssPhp\ScssPhp\SourceSpan\MultiSpan; use ScssPhp\ScssPhp\StackTrace\Frame; use ScssPhp\ScssPhp\StackTrace\Trace; use ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Util\AstUtil; use ScssPhp\ScssPhp\Util\Character; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Util\IterableUtil; use ScssPhp\ScssPhp\Util\ListUtil; use ScssPhp\ScssPhp\Util\LoggerUtil; use ScssPhp\ScssPhp\Util\SpanUtil; use ScssPhp\ScssPhp\Util\StringUtil; use ScssPhp\ScssPhp\Value\CalculationOperation; use ScssPhp\ScssPhp\Value\CalculationOperator; use ScssPhp\ScssPhp\Value\ListSeparator; use ScssPhp\ScssPhp\Value\SassArgumentList; use ScssPhp\ScssPhp\Value\SassBoolean; use ScssPhp\ScssPhp\Value\SassCalculation; use ScssPhp\ScssPhp\Value\SassColor; use ScssPhp\ScssPhp\Value\SassFunction; use ScssPhp\ScssPhp\Value\SassList; use ScssPhp\ScssPhp\Value\SassMap; use ScssPhp\ScssPhp\Value\SassMixin; use ScssPhp\ScssPhp\Value\SassNull; use ScssPhp\ScssPhp\Value\SassNumber; use ScssPhp\ScssPhp\Value\SassString; use ScssPhp\ScssPhp\Value\Value; use ScssPhp\ScssPhp\Visitor\ExpressionVisitor; use ScssPhp\ScssPhp\Visitor\StatementVisitor; use ScssPhp\ScssPhp\Warn; use SourceSpan\FileSpan; use SourceSpan\SourceFile; use SourceSpan\SimpleSourceLocation; /** * A visitor that executes Sass code to produce a CSS tree. * * @template-implements StatementVisitor<Value|null> * @template-implements ExpressionVisitor<Value> * * @internal */ class EvaluateVisitor implements StatementVisitor, ExpressionVisitor { /** * The import cache used to import other stylesheets. */ private readonly ImportCache $importCache; /** * @var array<string, SassCallable> */ private array $builtInFunctions = []; private readonly LoggerInterface $logger; /** * A set of message/location pairs for warnings that have been emitted via * {@see warn}. * * We only want to emit one warning per location, to avoid blowing up users' * consoles with redundant warnings. * * @var array<string, array<string, true>> */ private array $warningsEmitted = []; /** * Whether to avoid emitting warnings for files loaded from dependencies. */ private readonly bool $quietDeps; /** * Whether to track source map information. */ private readonly bool $sourceMap; /** * The current lexical environment. */ private Environment $environment; /** * The style rule that defines the current parent selector, if any. * * This doesn't take into consideration any intermediate `@at-root` rules. In * the common case where those rules are relevant, use {@see getStyleRule} instead. */ private ?ModifiableCssStyleRule $styleRuleIgnoringAtRoot = null; /** * The current media queries, if any. * * @var list<CssMediaQuery>|null */ private ?array $mediaQueries = null; /** * The set of media queries that were merged together to create * {@see $mediaQueries}. * * This will be non-null if and only if {@see $mediaQueries} is non-null, but it * will be empty if {@see $mediaQueries} isn't the result of a merge. * * @var CssMediaQuery[]|null */ private ?array $mediaQuerySources = null; private ?ModifiableCssParentNode $parent = null; /** * The name of the current declaration parent. */ private ?string $declarationName = null; /** * The human-readable name of the current stack frame. */ private string $member = "root stylesheet"; /** * The innermost user-defined callable that's being invoked. */ private ?UserDefinedCallable $currentCallable = null; /** * The node for the innermost callable that's being invoked. * * This is used to produce warnings for function calls. It's stored as an * {@see AstNode} rather than a {@see FileSpan} so we can avoid calling {@see AstNode::getSpan} * if the span isn't required, since some nodes need to do real work to * manufacture a source span. */ private ?AstNode $callableNode = null; /** * The span for the current import that's being resolved. * * This is used to produce warnings for importers. */ private ?FileSpan $importSpan = null; /** * Whether we're currently executing a function. */ private bool $inFunction = false; /** * Whether we're currently building the output of an unknown at rule. */ private bool $inUnknownAtRule = false; /** * Whether we're directly within an `@at-root` rule that excludes style rules. */ private bool $atRootExcludingStyleRule = false; /** * Whether we're currently building the output of a `@keyframes` rule. */ private bool $inKeyFrames = false; /** * Whether we're currently evaluating a {@see SupportsDeclaration}. * * When this is true, calculations will not be simplified. */ private bool $inSupportsDeclaration = false; /** * The canonical URLs of all stylesheets loaded during compilation. * * @var array<string, true> */ private array $loadedUrls = []; /** * A map from canonical URLs for modules (or imported files) that are * currently being evaluated to AST nodes whose spans indicate the original * loads for those modules. * * Map values may be `null`, which indicates an active module that doesn't * have a source span associated with its original load (such as the * entrypoint module). * * This is used to ensure that we don't get into an infinite load loop. * * @var array<string, AstNode|null> */ private array $activeModules = []; /** * The dynamic call stack representing function invocations, mixin * invocations, and imports surrounding the current context. * * Each member is a tuple of the span where the stack trace starts and the * name of the member being invoked. * * This stores {@see AstNode}s rather than {@see FileSpan}s so it can avoid calling * {@see AstNode::getSpan} if the span isn't required, since some nodes need to do * real work to manufacture a source span. * * @var list<array{string, AstNode}> */ private array $stack = []; /** * The importer that's currently being used to resolve relative imports. * * If this is `null`, relative imports aren't supported in the current * stylesheet. */ private ?Importer $importer = null; /** * Whether we're in a dependency. * * A dependency is defined as a stylesheet imported by an importer other than * the original. */ private bool $inDependency = false; private ?Stylesheet $stylesheet = null; private ?ModifiableCssStylesheet $root = null; private ?int $endOfImports = null; /** * Plain-CSS imports that didn't appear in the initial block of CSS imports. * * These are added to the initial CSS import block by {@see visitStylesheet} after * the stylesheet has been fully performed. * * This is `null` unless there are any out-of-order imports in the current * stylesheet. * * @var list<ModifiableCssImport>|null */ private ?array $outOfOrderImports = null; private ?ExtensionStore $extensionStore = null; /** * @param SassCallable[] $functions */ public function __construct(ImportCache $importCache, array $functions, LoggerInterface $logger, bool $quietDeps = false, bool $sourceMap = false) { $this->importCache = $importCache; $this->logger = $logger; $this->quietDeps = $quietDeps; $this->sourceMap = $sourceMap; $this->environment = Environment::create(); $sassMetaUri = Uri::new('sass:meta'); // These functions are defined in the context of the evaluator because // they need access to the environment or other local state. // When adding a new function here, its name must also be added in {@see FunctionRegistry::SPECIAL_META_GLOBAL_FUNCTIONS}. $metaFunctions = [ BuiltInCallable::function('global-variable-exists', '$name, $module: null', function ($arguments) { $variable = $arguments[0]->assertString('name'); $module = $arguments[1]->realNull()?->assertString('module'); if ($module !== null) { // TODO remove this when implementing modules throw new SassScriptException('Sass modules are not implemented yet.'); } return SassBoolean::create($this->environment->globalVariableExists(str_replace('_', '-', $variable->getText()))); }, $sassMetaUri), BuiltInCallable::function('variable-exists', '$name', function ($arguments) { $variable = $arguments[0]->assertString('name'); return SassBoolean::create($this->environment->variableExists(str_replace('_', '-', $variable->getText()))); }, $sassMetaUri), BuiltInCallable::function('function-exists', '$name, $module: null', function ($arguments) { $variable = $arguments[0]->assertString('name'); $module = $arguments[1]->realNull()?->assertString('module'); if ($module !== null) { // TODO remove this when implementing modules throw new SassScriptException('Sass modules are not implemented yet.'); } return SassBoolean::create($this->environment->functionExists(str_replace('_', '-', $variable->getText())) || isset($this->builtInFunctions[$variable->getText()]) || FunctionRegistry::has($variable->getText())); }, $sassMetaUri), BuiltInCallable::function('mixin-exists', '$name, $module: null', function ($arguments) { $variable = $arguments[0]->assertString('name'); $module = $arguments[1]->realNull()?->assertString('module'); if ($module !== null) { // TODO remove this when implementing modules throw new SassScriptException('Sass modules are not implemented yet.'); } return SassBoolean::create($this->environment->mixinExists(str_replace('_', '-', $variable->getText()))); }, $sassMetaUri), BuiltInCallable::function('content-exists', '', function ($arguments) { if (! $this->environment->isInMixin()) { throw new SassScriptException('content-exists() may only be called within a mixin.'); } return SassBoolean::create($this->environment->getContent() !== null); }, $sassMetaUri), BuiltInCallable::function('get-function', '$name, $css: false, $module: null', function ($arguments) { $name = $arguments[0]->assertString('name'); $css = $arguments[1]->isTruthy(); $module = $arguments[2]->realNull()?->assertString('module'); if ($css) { if ($module !== null) { throw new SassScriptException('$css and $module may not both be passed at once.'); } return new SassFunction(new PlainCssCallable($name->getText())); } \assert($this->callableNode !== null); $callable = $this->addExceptionSpan($this->callableNode, function () use ($name, $module) { $normalizedName = str_replace('_', '-', $name->getText()); $namespace = $module?->getText(); if ($namespace !== null) { // TODO remove this when implementing modules throw new SassScriptException('Sass modules are not implemented yet.'); } $local = $this->environment->getFunction($normalizedName); if ($local !== null) { return $local; } return $this->getBuiltinFunction($normalizedName); }); if ($callable === null) { throw new SassScriptException("Function not found: $name"); } return new SassFunction($callable); }, $sassMetaUri), BuiltInCallable::function('get-mixin', '$name, $module: null', function ($arguments) { $name = $arguments[0]->assertString('name'); $module = $arguments[1]->realNull()?->assertString('module'); \assert($this->callableNode !== null); $callable = $this->addExceptionSpan($this->callableNode, function () use ($name, $module) { if ($module !== null) { // TODO remove this when implementing modules throw new SassScriptException('Sass modules are not implemented yet.'); } return $this->environment->getMixin(str_replace('_', '-', $name->getText())); }); if ($callable === null) { throw new SassScriptException("Mixin not found: $name"); } return new SassMixin($callable); }, $sassMetaUri), BuiltInCallable::function('call', '$function, $args...', function ($arguments) { $function = $arguments[0]; $args = $arguments[1]; \assert($args instanceof SassArgumentList); $callableNode = $this->callableNode; \assert($callableNode !== null); if (\count($args->getKeywords()) === 0) { $keywordRest = null; } else { $keywordArgs = new Map(); foreach ($args->getKeywords() as $name => $value) { $keywordArgs->put(new SassString($name, false), $value); } $keywordRest = new ValueExpression(SassMap::create($keywordArgs), $callableNode->getSpan()); } $invocation = new ArgumentInvocation([], [], $callableNode->getSpan(), new ValueExpression($args, $callableNode->getSpan()), $keywordRest); if ($function instanceof SassString) { Warn::forDeprecation("Passing a string to call() is deprecated and will be illegal in Dart Sass 2.0.0.\n\nRecommendation: call(get-function($function))", Deprecation::callString); $expression = new FunctionExpression($function->getText(), $invocation, $callableNode->getSpan()); return $expression->accept($this); } $callable = $function->assertFunction('function')->getCallable(); return $this->runFunctionCallable($invocation, $callable, $callableNode); }, $sassMetaUri), ]; foreach ($functions as $function) { $this->builtInFunctions[str_replace('_', '-', $function->getName())] = $function; } foreach ($metaFunctions as $function) { $this->builtInFunctions[$function->getName()] = $function; } } public function getCallableNode(): ?AstNode { return $this->callableNode; } public function getImportSpan(): ?FileSpan { return $this->importSpan; } /** * The current parent node in the output CSS tree. */ private function getParent(): ModifiableCssParentNode { if ($this->parent === null) { throw new \LogicException('Cannot access "getParent" outside of a module.'); } return $this->parent; } private function getStyleRule(): ?ModifiableCssStyleRule { return $this->atRootExcludingStyleRule ? null : $this->styleRuleIgnoringAtRoot; } /** * The stylesheet that's currently being evaluated. */ private function getStylesheet(): Stylesheet { if ($this->stylesheet === null) { throw new \LogicException('Cannot access "getStylesheet" outside of a module.'); } return $this->stylesheet; } /** * The root stylesheet node. */ private function getRoot(): ModifiableCssStylesheet { if ($this->root === null) { throw new \LogicException('Cannot access "getRoot" outside of a module.'); } return $this->root; } /** * The first index in `$this->getRoot()->getChildren()` after the initial block of CSS imports. */ private function getEndOfImports(): int { if ($this->endOfImports === null) { throw new \LogicException('Cannot access "getEndOfImports" outside of a module.'); } return $this->endOfImports; } /** * The extension store that tracks extensions and style rules for the current * module. */ private function getExtensionStore(): ExtensionStore { if ($this->extensionStore === null) { throw new \LogicException('Cannot access "getExtensionStore" outside of a module.'); } return $this->extensionStore; } /** * @param array<string, Value> $initialVariables */ public function run(?Importer $importer, Stylesheet $node, array $initialVariables = []): EvaluateResult { return EvaluationContext::withEvaluationContext(new VisitorEvaluationContext($this, $node), function () use ($importer, $node, $initialVariables) { $url = $node->getSpan()->getSourceUrl(); if ($url !== null) { $urlString = (string) $url; $this->activeModules[$urlString] = null; // TODO check how to handle stdin $this->loadedUrls[$urlString] = true; } /** @var ExtensionStore $extensionStore */ [$css, $extensionStore] = $this->addExceptionTrace(fn() => $this->execute($importer, $node, $initialVariables)); $selectors = $extensionStore->getSimpleSelectors(); $unsatisfiedExtension = IterableUtil::firstOrNull($extensionStore->extensionsWhereTarget(fn (SimpleSelector $target) => !EquatableUtil::iterableContains($selectors, $target))); if ($unsatisfiedExtension !== null) { $this->throwForUnsatisfiedExtension($unsatisfiedExtension); } return new EvaluateResult($css, array_keys($this->loadedUrls)); }); } /** * @param array<string, Value> $initialVariables * * @return array{CssStylesheet, ExtensionStore} */ private function execute(?Importer $importer, Stylesheet $stylesheet, array $initialVariables = []): array { $environment = Environment::create(); foreach ($initialVariables as $variableName => $initialVariable) { $environment->setVariable($variableName, $initialVariable, new FakeAstNode(fn () => SourceFile::fromString('')->span(0))); } $css = null; $extensionStore = ConcreteExtensionStore::create(); $this->withEnvironment($environment, function () use ($importer, $stylesheet, $extensionStore, &$css) { $oldImporter = $this->importer; $oldStylesheet = $this->stylesheet; $oldRoot = $this->root; $oldParent = $this->parent; $oldEndOfImports = $this->endOfImports; $oldOutOfOrderImports = $this->outOfOrderImports; $oldExtensionStore = $this->extensionStore; $oldStyleRule = $this->getStyleRule(); $oldMediaQueries = $this->mediaQueries; $oldDeclarationName = $this->declarationName; $oldInUnknownAtRule = $this->inUnknownAtRule; $oldAtRootExcludingStyleRule = $this->atRootExcludingStyleRule; $oldInKeyframes = $this->inKeyFrames; $this->importer = $importer; $this->stylesheet = $stylesheet; $this->root = $root = new ModifiableCssStylesheet($stylesheet->getSpan()); $this->parent = $root; $this->endOfImports = 0; $this->outOfOrderImports = null; $this->extensionStore = $extensionStore; $this->styleRuleIgnoringAtRoot = null; $this->mediaQueries = null; $this->declarationName = null; $this->inUnknownAtRule = false; $this->atRootExcludingStyleRule = false; $this->inKeyFrames = false; $this->visitStylesheet($stylesheet); $css = $this->outOfOrderImports === null ? $root : new ModifiableCssStylesheet($stylesheet->getSpan(), $this->addOutOfOrderImports()); $this->importer = $oldImporter; $this->stylesheet = $oldStylesheet; $this->root = $oldRoot; $this->parent = $oldParent; $this->endOfImports = $oldEndOfImports; $this->outOfOrderImports = $oldOutOfOrderImports; $this->extensionStore = $oldExtensionStore; $this->styleRuleIgnoringAtRoot = $oldStyleRule; $this->mediaQueries = $oldMediaQueries; $this->declarationName = $oldDeclarationName; $this->inUnknownAtRule = $oldInUnknownAtRule; $this->atRootExcludingStyleRule = $oldAtRootExcludingStyleRule; $this->inKeyFrames = $oldInKeyframes; }); assert($css instanceof CssStylesheet); return [$css, $extensionStore]; } /** * Returns a copy of `$this->getRoot()->getChildren` with {@see outOfOrderImports} inserted * after {@see endOfImports}, if necessary. * * @return list<ModifiableCssNode> */ private function addOutOfOrderImports(): array { if ($this->outOfOrderImports === null) { return $this->getRoot()->getChildren(); } $children = $this->getRoot()->getChildren(); array_splice($children, $this->getEndOfImports(), 0, $this->outOfOrderImports); return array_values($children); } /** * Throws an exception indicating that $extension is unsatisfied. */ private function throwForUnsatisfiedExtension(Extension $extension): never { throw new SimpleSassException( "The target selector was not found.\nUse \"@extend $extension->target !optional\" to avoid this error.", $extension->span, ); } /** * @phpstan-impure */ public function visitStylesheet(Stylesheet $node): ?Value { foreach ($node->getChildren() as $child) { $child->accept($this); } return null; } public function visitAtRootRule(AtRootRule $node): ?Value { $unparsedQuery = $node->getQuery(); if ($unparsedQuery !== null) { [$resolved, $map] = $this->performInterpolationWithMap($unparsedQuery, true); $query = AtRootQuery::parse($resolved, $this->logger, null, $map); } else { $query = AtRootQuery::getDefault(); } $parent = $this->getParent(); /** @var ModifiableCssParentNode[] $included */ $included = []; while (!$parent instanceof CssStylesheet) { if (!$query->excludes($parent)) { $included[] = $parent; } $grandParent = $parent->getParent(); if ($grandParent === null) { throw new \LogicException('CssNodes must have a CssStylesheet transitive parent node.'); } $parent = $grandParent; } $root = $this->trimIncluded($included); // If we didn't exclude any rules, we don't need to use the copies we might // have created. if ($root === $this->getParent()) { $this->environment->scope(function () use ($node) { foreach ($node->getChildren() as $child) { $child->accept($this); } }, $node->hasDeclarations()); return null; } $innerCopy = $root; if (!empty($included)) { $innerCopy = $included[0]->copyWithoutChildren(); $outerCopy = $innerCopy; foreach (array_slice($included, 1) as $includedNode) { $copy = $includedNode->copyWithoutChildren(); $copy->addChild($outerCopy); $outerCopy = $copy; } $root->addChild($outerCopy); } $scope = $this->scopeForAtRoot($node, $innerCopy, $query, $included); $scope(function () use ($node) { foreach ($node->getChildren() as $child) { $child->accept($this); } }); return null; } /** * Returns a scope callback for $query. * * This returns a callback that adjusts various instance variables for its * duration, based on which rules are excluded by $query. It always assigns * {@see parent} to $newParent. * * @param ModifiableCssParentNode[] $included * * @return callable((callable(): void)): void */ private function scopeForAtRoot(AtRootRule $node, ModifiableCssParentNode $newParent, AtRootQuery $query, array $included): callable { $scope = function (callable $callback) use ($newParent, $node) { // We can't use *rent here because it'll add the node to the tree // in the wrong place. $oldParent = $this->parent; $this->parent = $newParent; $this->environment->scope($callback, $node->hasDeclarations()); $this->parent = $oldParent; }; if ($query->excludesStyleRules()) { $innerScope = $scope; $scope = function (callable $callback) use ($innerScope) { $oldAtRootExcludingStyleRule = $this->atRootExcludingStyleRule; $this->atRootExcludingStyleRule = true; $innerScope($callback); $this->atRootExcludingStyleRule = $oldAtRootExcludingStyleRule; }; } if ($this->mediaQueries !== null && $query->excludesName('media')) { $innerScope = $scope; $scope = function (callable $callback) use ($innerScope) { $this->withMediaQueries(null, null, function () use ($innerScope, $callback) { $innerScope($callback); }); }; } if ($this->inKeyFrames && $query->excludesName('keyframes')) { $innerScope = $scope; $scope = function (callable $callback) use ($innerScope) { $wasInKeyframes = $this->inKeyFrames; $this->inKeyFrames = false; $innerScope($callback); $this->inKeyFrames = $wasInKeyframes; }; } if ($this->inUnknownAtRule && !IterableUtil::any($included, fn($parent) => $parent instanceof CssAtRule)) { $innerScope = $scope; $scope = function (callable $callback) use ($innerScope) { $wasInUnknownAtRule = $this->inUnknownAtRule; $this->inUnknownAtRule = false; $innerScope($callback); $this->inUnknownAtRule = $wasInUnknownAtRule; }; } return $scope; } /** * Destructively trims a trailing sublist from $nodes that matches the * current list of parents. * * $nodes should be a list of parents included by an `@at-root` rule, from * innermost to outermost. If it contains a trailing sublist that's * contiguous—meaning that each node is a direct parent of the node before * it—and whose final node is a direct child of {@see getRoot}, this removes that * sublist and returns the innermost removed parent. * * Otherwise, this leaves $nodes as-is and returns {@see getRoot}. * * @param ModifiableCssParentNode[] $nodes */ private function trimIncluded(array &$nodes): ModifiableCssParentNode { if (empty($nodes)) { return $this->getRoot(); } $parent = $this->getParent(); $innermostContiguous = null; foreach ($nodes as $i => $node) { while ($parent !== $node) { $innermostContiguous = null; $grandParent = $parent->getParent(); if ($grandParent === null) { throw new \LogicException('Expected the node to be an ancestor.'); } $parent = $grandParent; } $innermostContiguous = $innermostContiguous ?? $i; $grandParent = $parent->getParent(); if ($grandParent === null) { throw new \LogicException('Expected the node to be an ancestor.'); } $parent = $grandParent; } if ($parent !== $this->getRoot()) { return $this->getRoot(); } $root = $nodes[$innermostContiguous]; array_splice($nodes, $innermostContiguous); return $root; } public function visitContentBlock(ContentBlock $node): ?Value { throw new \BadMethodCallException('Evaluation handles @include and its content block together.'); } public function visitContentRule(ContentRule $node): ?Value { $content = $this->environment->getContent(); if ($content === null) { return null; } $this->runUserDefinedCallable($node->getArguments(), $content, $node, function () use ($content) { foreach ($content->getDeclaration()->getChildren() as $statement) { $statement->accept($this); } return null; }); return null; } public function visitDebugRule(DebugRule $node): ?Value { $value = $node->getExpression()->accept($this); $this->logger->debug($value instanceof SassString ? $value->getText() : (string) $value, $node->getSpan()); return null; } public function visitDeclaration(Declaration $node): ?Value { if ($this->getStyleRule() === null && !$this->inUnknownAtRule && !$this->inKeyFrames) { throw $this->exception('Declarations may only be used within style rules.', $node->getSpan()); } if ($this->declarationName !== null && $node->isCustomProperty()) { throw $this->exception('Declarations whose names begin with "--" may not be nested.', $node->getSpan()); } \assert($this->getParent()->getParent() !== null); $siblings = $this->getParent()->getParent()->getChildren(); $interleavedRules = []; if ( ListUtil::last($siblings) !== $this->getParent() // Reproduce this condition from {@see warn} so that we don't add anything to // $interleavedRules for declarations in dependencies. && !($this->quietDeps && ($this->inDependency || ($this->currentCallable?->isInDependency() ?? false))) ) { $parentOffset = array_search($this->getParent(), $siblings, true); if ($parentOffset === false) { $parentOffset = -1; } foreach (array_slice($siblings, $parentOffset + 1) as $sibling) { if ($sibling instanceof CssComment) { continue; } if ($sibling instanceof CssStyleRule) { $interleavedRules[] = $sibling; continue; } // Always warn for siblings that aren't style rules, because they // add no specificity and they're nested in the same parent as this // declaration. $this->warn( <<<'MESSAGE' Sass's behavior for declarations that appear after nested rules will be changing to match the behavior specified by CSS in an upcoming version. To keep the existing behavior, move the declaration above the nested rule. To opt into the new behavior, wrap the declaration in `& {}`. More info: https://sass-lang.com/d/mixed-decls MESSAGE, new MultiSpan($node->getSpan(), 'declaration', [ 'nested rule' => $sibling->getSpan(), ]), Deprecation::mixedDecls ); $interleavedRules = []; } } $name = $this->interpolationToValue($node->getName(), true); if ($this->declarationName !== null) { $name = new CssValue($this->declarationName . '-' . $name->getValue(), $name->getSpan()); } $expression = $node->getValue(); if ($expression !== null) { $value = $expression->accept($this); // If the value is an empty list, preserve it, because converting it to CSS // will throw an error that we want the user to see. if (!$value->isBlank() || empty($value->asList())) { $valueSpanForMap = null; if ($this->sourceMap && $node->getValue() !== null) { $valueSpanForMap = $this->expressionNode($node->getValue())->getSpan(); } $this->getParent()->addChild(new ModifiableCssDeclaration( $name, new CssValue($value, $expression->getSpan()), $node->getSpan(), $node->isCustomProperty(), $interleavedRules, $interleavedRules === [] ? null : $this->stackTrace($node->getSpan()), $valueSpanForMap, )); } elseif (str_starts_with($name->getValue(), '--')) { throw $this->exception('Custom property values may not be empty.', $expression->getSpan()); } } $children = $node->getChildren(); if ($children !== null) { $oldDeclarationName = $this->declarationName; $this->declarationName = $name->getValue(); $this->environment->scope(function () use ($children) { foreach ($children as $child) { $child->accept($this); } }, $node->hasDeclarations()); $this->declarationName = $oldDeclarationName; } return null; } public function visitEachRule(EachRule $node): ?Value { $list = $node->getList()->accept($this); $nodeWithSpan = $this->expressionNode($node->getList()); if (\count($node->getVariables()) === 1) { $variableName = $node->getVariables()[0]; $setVariables = function (Value $value) use ($variableName, $nodeWithSpan) { $this->environment->setLocalVariable($variableName, $this->withoutSlash($value, $nodeWithSpan), $nodeWithSpan); }; } else { $variables = $node->getVariables(); $setVariables = function (Value $value) use ($variables, $nodeWithSpan) { $this->setMultipleVariables($variables, $value, $nodeWithSpan); }; } return $this->environment->scope(function () use ($list, $setVariables, $node) { return $this->handleReturn($list->asList(), function ($element) use ($setVariables, $node) { $setVariables($element); return $this->handleReturn($node->getChildren(), fn(Statement $child) => $child->accept($this)); }); }, true, true); } /** * Destructures $value and assigns it to $variables, as in an `@each` * statement. * * @param list<string> $variables */ private function setMultipleVariables(array $variables, Value $value, AstNode $nodeWithSpan): void { $list = $value->asList(); $minLength = min(\count($variables), \count($list)); for ($i = 0; $i < $minLength; $i++) { $this->environment->setLocalVariable($variables[$i], $this->withoutSlash($list[$i], $nodeWithSpan), $nodeWithSpan); } for ($i = $minLength; $i < \count($variables); $i++) { $this->environment->setLocalVariable($variables[$i], SassNull::create(), $nodeWithSpan); } } public function visitErrorRule(ErrorRule $node): ?Value { throw $this->exception((string) $node->getExpression()->accept($this), $node->getSpan()); } public function visitExtendRule(ExtendRule $node): ?Value { $styleRule = $this->getStyleRule(); if ($styleRule === null || $this->declarationName !== null) { throw $this->exception('@extend may only be used within style rules.', $node->getSpan()); } foreach ($styleRule->getOriginalSelector()->getComponents() as $complex) { if (!$complex->isBogus()) { continue; } $selectorString = trim($complex); $verb = $complex->isUseless() ? "can't" : "shouldn't"; $this->warn( "The selector \"$selectorString\" is invalid CSS and $verb be an extender.\nThis will be an error in Dart Sass 2.0.0.\n\nMore info: https://sass-lang.com/d/bogus-combinators", new MultiSpan(SpanUtil::trimRight($complex->getSpan()), 'invalid selector', [ '@extend rule' => $node->getSpan(), ]), Deprecation::bogusCombinators ); } [$targetText, $targetMap] = $this->performInterpolationWithMap($node->getSelector(), true); $list = SelectorList::parse(StringUtil::trimAscii($targetText, true), $this->logger, $targetMap, null, false); foreach ($list->getComponents() as $complex) { $compound = $complex->getSingleCompound(); if ($compound === null) { // If the selector was a compound selector but not a simple // selector, emit a more explicit error. throw new SimpleSassFormatException('complex selectors may not be extended.', $complex->getSpan()); } $simple = $compound->getSingleSimple(); if ($simple === null) { $alternativeString = implode(', ', $compound->getComponents()); throw new SimpleSassFormatException("compound selectors may no longer be extended.\nConsider `@extend $alternativeString` instead.\nSee https://sass-lang.com/d/extend-compound for details.\n", $compound->getSpan()); } $this->getExtensionStore()->addExtension($styleRule->getSelector(), $simple, $node, $this->mediaQueries); } return null; } public function visitAtRule(AtRule $node): ?Value { if ($this->declarationName !== null) { throw $this->exception('At-rules may not be used within nested declarations.', $node->getSpan()); } $name = $this->interpolationToValue($node->getName()); $value = $node->getValue() !== null ? $this->interpolationToValue($node->getValue(), true, true) : null; $children = $node->getChildren(); if ($children === null) { $this->getParent()->addChild(new ModifiableCssAtRule($name, $node->getSpan(), true, $value)); return null; } $wasInKeyframes = $this->inKeyFrames; $wasInUnknownAtRule = $this->inUnknownAtRule; if (Util::unvendor($name->getValue()) === 'keyframes') { $this->inKeyFrames = true; } else { $this->inUnknownAtRule = true; } $this->withParent( new ModifiableCssAtRule($name, $node->getSpan(), false, $value), function () use ($children, $name) { $styleRule = $this->getStyleRule(); if ($styleRule === null || $this->inKeyFrames || $name->getValue() === 'font-face') { // Special-cased at-rules within style blocks are pulled out to the // root. Equivalent to prepending "@at-root" on them. foreach ($children as $child) { $child->accept($this); } } else { // If we're in a style rule, copy it into the at-rule so that // declarations immediately inside it have somewhere to go. // // For example, "a {@foo {b: c}}" should produce "@foo {a {b: c}}". $this->withParent($styleRule->copyWithoutChildren(), function () use ($children) { foreach ($children as $child) { $child->accept($this); } }, null, false); } }, function ($node) { return $node instanceof CssStyleRule; }, $node->hasDeclarations() ); $this->inUnknownAtRule = $wasInUnknownAtRule; $this->inKeyFrames = $wasInKeyframes; return null; } public function visitForRule(ForRule $node): ?Value { /** @var SassNumber $fromNumber */ $fromNumber = $this->addExceptionSpan($node->getFrom(), function () use ($node) { return $node->getFrom()->accept($this)->assertNumber(); }); /** @var SassNumber $toNumber */ $toNumber = $this->addExceptionSpan($node->getTo(), function () use ($node) { return $node->getTo()->accept($this)->assertNumber(); }); $from = $this->addExceptionSpan($node->getFrom(), function () use ($fromNumber) { return $fromNumber->assertInt(); }); $to = $this->addExceptionSpan($node->getTo(), function () use ($toNumber, $fromNumber) { return $toNumber->coerce($fromNumber->getNumeratorUnits(), $fromNumber->getDenominatorUnits())->assertInt(); }); $direction = $from > $to ? -1 : 1; if (!$node->isExclusive()) { $to += $direction; } if ($from === $to) { return null; } return $this->environment->scope(function () use ($node, $from, $to, $direction, $fromNumber) { $nodeWithSpan = $this->expressionNode($node->getFrom()); for ($i = $from; $i !== $to; $i += $direction) { $this->environment->setLocalVariable($node->getVariable(), SassNumber::withUnits($i, $fromNumber->getNumeratorUnits(), $fromNumber->getDenominatorUnits()), $nodeWithSpan); $result = $this->handleReturn($node->getChildren(), function (Statement $child) { return $child->accept($this); }); if ($result !== null) { return $result; } } return null; }, true, true); } public function visitFunctionRule(FunctionRule $node): ?Value { $this->environment->setFunction(new UserDefinedCallable($node, $this->environment->closure(), $this->inDependency)); return null; } public function visitIfRule(IfRule $node): ?Value { $clause = $node->getLastClause(); foreach ($node->getClauses() as $clauseToCheck) { if ($clauseToCheck->getExpression()->accept($this)->isTruthy()) { $clause = $clauseToCheck; break; } } if ($clause === null) { return null; } return $this->environment->scope(function () use ($clause) { return $this->handleReturn($clause->getChildren(), function (Statement $child) { return $child->accept($this); }); }, $clause->hasDeclarations(), true); } public function visitImportRule(ImportRule $node): ?Value { foreach ($node->getImports() as $import) { if ($import instanceof DynamicImport) { $this->visitDynamicImport($import); } else { assert($import instanceof StaticImport); $this->visitStaticImport($import); } } return null; } /** * Adds the stylesheet imported by $import to the current document. */ private function visitDynamicImport(DynamicImport $import): void { $this->withStackFrame('@import', $import, function () use ($import) { $result = $this->loadStylesheet($import->getUrlString(), $import->getSpan(), true); $stylesheet = $result->getStylesheet(); $url = $stylesheet->getSpan()->getSourceUrl(); if ($url !== null) { $urlString = (string) $url; if (array_key_exists($urlString, $this->activeModules)) { $previousLoad = $this->activeModules[$urlString]; if ($previousLoad !== null) { throw $this->multiSpanException('This file is already being loaded.', 'new load', ['original load' => $previousLoad->getSpan()]); } throw $this->exception('This file is already being loaded.'); } $this->activeModules[$urlString] = $import; } $oldImporter = $this->importer; $oldStylesheet = $this->stylesheet; $oldInDependency = $this->inDependency; $this->importer = $result->getImporter(); $this->stylesheet = $stylesheet; $this->inDependency = $result->isDependency(); $this->visitStylesheet($stylesheet); $this->importer = $oldImporter; $this->stylesheet = $oldStylesheet; $this->inDependency = $oldInDependency; if ($url !== null) { unset($this->activeModules[(string) $url]); } }); } private function loadStylesheet(string $url, FileSpan $span, bool $forImport = false): LoadedStylesheet { try { assert($this->importSpan === null); $this->importSpan = $span; $baseUrlString = $this->getStylesheet()->getSpan()->getSourceUrl(); $baseUrl = $baseUrlString === null ? null : Uri::new($baseUrlString); $result = $this->importCache->canonicalize(Uri::new($url), $this->importer, $baseUrl, $forImport); if ($result !== null) { $canonicalUrl = $result->canonicalUrl; $importer = $result->importer; $originalUrl = $result->originalUrl; // Make sure we record the canonical URL as "loaded" even if the // actual load fails, because watchers should watch it to see if it // changes in a way that allows the load to succeed. $this->loadedUrls[$canonicalUrl->toString()] = true; $isDependency = $this->inDependency || $importer !== $this->importer; $stylesheet = $this->importCache->importCanonical($importer, $canonicalUrl, $originalUrl, $this->quietDeps && $isDependency); if ($stylesheet !== null) { return new LoadedStylesheet($stylesheet, $importer, $isDependency); } } throw new \Exception("Can't find stylesheet to import."); } catch (SassException $e) { throw $e; } catch (\Throwable $e) { throw $this->exception($e->getMessage(), null, $e); } finally { $this->importSpan = null; } } /** * Adds a CSS import for $import. */ private function visitStaticImport(StaticImport $import): void { $url = $this->interpolationToValue($import->getUrl()); $modifiers = $import->getModifiers() !== null ? $this->interpolationToValue($import->getModifiers()) : null; $node = new ModifiableCssImport($url, $import->getSpan(), $modifiers); if ($this->getParent() !== $this->getRoot()) { $this->getParent()->addChild($node); } elseif ($this->getEndOfImports() === \count($this->getRoot()->getChildren())) { $this->getRoot()->addChild($node); $this->endOfImports++; } else { $this->outOfOrderImports[] = $node; } } /** * Evaluate a given $mixin with $arguments and $contentCallable */ private function applyMixin(?SassCallable $mixin, ?UserDefinedCallable $contentCallable, ArgumentInvocation $arguments, AstNode $nodeWithSpan, AstNode $nodeWithSpanWithoutContent): void { if ($mixin === null) { throw $this->exception('Undefined mixin.', $nodeWithSpan->getSpan()); } if ($mixin instanceof BuiltInCallable && !$mixin->acceptsContent() && $contentCallable !== null) { $evaluated = $this->evaluateArguments($arguments); /** @var ArgumentDeclaration $overload */ [$overload,] = $mixin->callbackFor(\count($evaluated->getPositional()), $evaluated->getNamed()); throw new MultiSpanSassRuntimeException( "Mixin doesn't accept a content block.", $nodeWithSpanWithoutContent->getSpan(), 'invocation', ['declaration' => $overload->getSpanWithName()], $this->stackTrace($nodeWithSpanWithoutContent->getSpan()) ); } if ($mixin instanceof BuiltInCallable) { $this->environment->withContent($contentCallable, fn() => $this->environment->asMixin(function () use ($arguments, $mixin, $nodeWithSpanWithoutContent) { $this->runBuiltInCallable($arguments, $mixin, $nodeWithSpanWithoutContent); })); } elseif ($mixin instanceof UserDefinedCallable) { $declaration = $mixin->getDeclaration(); assert($declaration instanceof MixinRule); if ($contentCallable !== null && !$declaration->hasContent()) { throw new MultiSpanSassRuntimeException( "Mixin doesn't accept a content block.", $nodeWithSpanWithoutContent->getSpan(), 'invocation', ['declaration' => $mixin->getDeclaration()->getArguments()->getSpanWithName()], $this->stackTrace($nodeWithSpanWithoutContent->getSpan()) ); } $this->runUserDefinedCallable($arguments, $mixin, $nodeWithSpanWithoutContent, function () use ($contentCallable, $declaration, $nodeWithSpanWithoutContent) { $this->environment->withContent($contentCallable, fn() => $this->environment->asMixin(function () use ($declaration, $nodeWithSpanWithoutContent) { foreach ($declaration->getChildren() as $statement) { $this->addErrorSpan($nodeWithSpanWithoutContent, fn() => $statement->accept($this)); } })); return null; }); } else { throw new \LogicException('Unknown callable type ' . get_class($mixin)); } } public function visitIncludeRule(IncludeRule $node): ?Value { $mixin = $this->addExceptionSpan($node, function () use ($node) { return $this->environment->getMixin($node->getName()); }); if (str_starts_with($node->getOriginalName(), '--') && $mixin instanceof UserDefinedCallable && !str_starts_with($mixin->getDeclaration()->getOriginalName(), '--')) { $this->warn("Sass @mixin names beginning with -- are deprecated for forward-compatibility with plain CSS mixins.\n\nFor details, see https://sass-lang.com/d/css-function-mixin", $node->getNameSpan(), Deprecation::cssFunctionMixin); } $contentCallable = null; if ($node->getContent() !== null) { $contentCallable = new UserDefinedCallable($node->getContent(), $this->environment->closure(), $this->inDependency); } $nodeWithSpanWithoutContent = new FakeAstNode(function () use ($node) { return $node->getSpanWithoutContent(); }); $this->applyMixin($mixin, $contentCallable, $node->getArguments(), $node, $nodeWithSpanWithoutContent); return null; } public function visitMixinRule(MixinRule $node): ?Value { $this->environment->setMixin(new UserDefinedCallable($node, $this->environment->closure(), $this->inDependency)); return null; } public function visitLoudComment(LoudComment $node): ?Value { if ($this->inFunction) { return null; } // Comments are allowed to appear between CSS imports. if ($this->getParent() === $this->getRoot() && $this->getEndOfImports() === \count($this->getRoot()->getChildren())) { $this->endOfImports++; } $text = $this->performInterpolation($node->getText()); // Indented syntax doesn't require */ if (!str_ends_with($text, '*/')) { $text .= ' */'; } $this->getParent()->addChild(new ModifiableCssComment($text, $node->getSpan())); return null; } public function visitMediaRule(MediaRule $node): ?Value { if ($this->declarationName !== null) { throw $this->exception('Media rules may not be used within nested declarations.', $node->getSpan()); } $queries = $this->visitMediaQueries($node->getQuery()); $mergedQueries = $this->mediaQueries !== null ? $this->mergeMediaQueries($this->mediaQueries, $queries) : null; if ($mergedQueries === []) { return null; } if ($mergedQueries === null) { $mergedSources = []; } else { assert($this->mediaQuerySources !== null); assert($this->mediaQueries !== null); $mergedSources = array_merge($this->mediaQuerySources, $this->mediaQueries, $queries); } $this->withParent( new ModifiableCssMediaRule($mergedQueries ?? $queries, $node->getSpan()), function () use ($mergedQueries, $mergedSources, $queries, $node) { $this->withMediaQueries($mergedQueries ?? $queries, $mergedSources, function () use ($node) { $styleRule = $this->getStyleRule(); if ($styleRule !== null) { // If we're in a style rule, copy it into the media query so that // declarations immediately inside @media have somewhere to go. // // For example, "a {@media screen {b: c}}" should produce // "@media screen {a {b: c}}". $this->withParent($styleRule->copyWithoutChildren(), function () use ($node) { foreach ($node->getChildren() as $child) { $child->accept($this); } }, null, false); } else { foreach ($node->getChildren() as $child) { $child->accept($this); } } }); }, function ($node) use ($mergedSources) { if ($node instanceof CssStyleRule) { return true; } if ($mergedSources !== [] && $node instanceof CssMediaRule) { return IterableUtil::every($node->getQueries(), function (CssMediaQuery $query) use ($mergedSources) { return \in_array($query, $mergedSources, true); }); } return false; }, $node->hasDeclarations() ); return null; } /** * @param Interpolation $interpolation * * @return list<CssMediaQuery> */ private function visitMediaQueries(Interpolation $interpolation): array { [$resolved, $map] = $this->performInterpolationWithMap($interpolation, true); return CssMediaQuery::parseList($resolved, $this->logger, null, $map); } /** * Returns a list of queries that selects for contexts that match both * $queries1 and $queries2. * * Returns the empty list if there are no contexts that match both $queries1 * and $queries2, or `null` if there are contexts that can't be represented * by media queries. * * @param CssMediaQuery[] $queries1 * @param CssMediaQuery[] $queries2 * * @return list<CssMediaQuery>|null */ private function mergeMediaQueries(array $queries1, array $queries2): ?array { $queries = []; foreach ($queries1 as $query1) { foreach ($queries2 as $query2) { $result = $query1->merge($query2); if ($result === MediaQuerySingletonMergeResult::empty) { continue; } if ($result === MediaQuerySingletonMergeResult::unrepresentable) { return null; } // Always true but not detected due to https://github.com/jiripudil/phpstan-sealed-classes/issues/2 \assert($result instanceof CssMediaQuery); $queries[] = $result; } } return $queries; } public function visitReturnRule(ReturnRule $node): ?Value { return $this->withoutSlash($node->getExpression()->accept($this), $node->getExpression()); } public function visitSilentComment(SilentComment $node): ?Value { return null; } public function visitStyleRule(StyleRule $node): ?Value { if ($this->declarationName !== null) { throw $this->exception('Style rules may not be used within nested declarations.', $node->getSpan()); } if ($this->inKeyFrames && $this->getParent() instanceof CssKeyframeBlock) { throw $this->exception('Style rules may not be used within keyframe blocks.', $node->getSpan()); } [$selectorText, $selectorMap] = $this->performInterpolationWithMap($node->getSelector(), true); if ($this->inKeyFrames) { $parsedSelector = (new KeyframeSelectorParser($selectorText, $this->logger, null, $selectorMap))->parse(); $rule = new ModifiableCssKeyframeBlock(new CssValue($parsedSelector, $node->getSelector()->getSpan()), $node->getSpan()); $this->withParent( $rule, function () use ($node) { foreach ($node->getChildren() as $child) { $child->accept($this); } }, function ($node) { return $node instanceof CssStyleRule; }, $node->hasDeclarations() ); return null; } $parsedSelector = SelectorList::parse($selectorText, $this->logger, $selectorMap, plainCss: $this->getStylesheet()->isPlainCss()); $nest = !($this->getStyleRule()?->isFromPlainCss() ?? false); if ($nest) { if ($this->getStylesheet()->isPlainCss()) { foreach ($parsedSelector->getComponents() as $complex) { if (\count($complex->getLeadingCombinators()) > 0) { throw $this->exception("Top-level leading combinators aren't allowed in plain CSS.", $complex->getLeadingCombinators()[0]->getSpan()); } } } $parsedSelector = $parsedSelector->nestWithin( $this->styleRuleIgnoringAtRoot?->getOriginalSelector(), !$this->atRootExcludingStyleRule, $this->getStylesheet()->isPlainCss() ); } $selector = $this->getExtensionStore()->addSelector($parsedSelector, $this->mediaQueries); $rule = new ModifiableCssStyleRule($selector, $node->getSpan(), $parsedSelector, $this->getStylesheet()->isPlainCss()); $oldAtRootExcludingStyleRule = $this->atRootExcludingStyleRule; $this->atRootExcludingStyleRule = false; $this->withParent( $rule, function () use ($rule, $node) { $this->withStyleRule($rule, function () use ($node) { foreach ($node->getChildren() as $child) { $child->accept($this); } }); }, $nest ? fn($node) => $node instanceof CssStyleRule : null, $node->hasDeclarations() ); $this->atRootExcludingStyleRule = $oldAtRootExcludingStyleRule; $this->warnForBogusCombinators($rule); if ($this->getStyleRule() === null && \count($this->getParent()->getChildren()) > 0) { $lastChild = ListUtil::last($this->getParent()->getChildren()); $lastChild->setGroupEnd(true); } return null; } private function warnForBogusCombinators(CssStyleRule $rule): void { if (!$rule->isInvisibleOtherThanBogusCombinators()) { foreach ($rule->getSelector()->getComponents() as $complex) { if (!$complex->isBogus()) { continue; } $selectorString = trim($complex); if ($complex->isUseless()) { $this->warn( "The selector \"$selectorString\" is invalid CSS. It will be omitted from the generated CSS.\nThis will be an error in Dart Sass 2.0.0.\n\nMore info: https://sass-lang.com/d/bogus-combinators", SpanUtil::trimRight($complex->getSpan()), Deprecation::bogusCombinators ); } elseif (\count($complex->getLeadingCombinators()) > 0) { if (!$this->getStylesheet()->isPlainCss()) { $this->warn( "The selector \"$selectorString\" is invalid CSS.\nThis will be an error in Dart Sass 2.0.0.\n\nMore info: https://sass-lang.com/d/bogus-combinators", SpanUtil::trimRight($complex->getSpan()), Deprecation::bogusCombinators ); } } else { $omittedMessage = $complex->isBogusOtherThanLeadingCombinator() ? ' It will be omitted from the generated CSS.' : ''; $suffix = IterableUtil::every($rule->getChildren(), fn (CssNode $child) => $child instanceof CssComment) ? "\n(try converting to a //-style comment)" : ''; $this->warn( "The selector \"$selectorString\" is only valid for nesting and shouldn't\nhave children other than style rules.$omittedMessage\nThis will be an error in Dart Sass 2.0.0.\n\nMore info: https://sass-lang.com/d/bogus-combinators", new MultiSpan(SpanUtil::trimRight($complex->getSpan()), 'invalid selector', [ 'this is not a style rule' . $suffix => $rule->getChildren()[0]->getSpan(), ]), Deprecation::bogusCombinators ); } } } } public function visitSupportsRule(SupportsRule $node): ?Value { if ($this->declarationName !== null) { throw $this->exception('Supports rules may not be used within nested declarations.', $node->getSpan()); } $condition = new CssValue($this->visitSupportsCondition($node->getCondition()), $node->getCondition()->getSpan()); $this->withParent( new ModifiableCssSupportsRule($condition, $node->getSpan()), function () use ($node) { $styleRule = $this->getStyleRule(); if ($styleRule !== null) { // If we're in a style rule, copy it into the supports rule so that // declarations immediately inside @supports have somewhere to go. // // For example, "a {@supports (a: b) {b: c}}" should produce "@supports // (a: b) {a {b: c}}". $this->withParent($styleRule->copyWithoutChildren(), function () use ($node) { foreach ($node->getChildren() as $child) { $child->accept($this); } }); } else { foreach ($node->getChildren() as $child) { $child->accept($this); } } }, function ($node) { return $node instanceof CssStyleRule; }, $node->hasDeclarations() ); return null; } private function visitSupportsCondition(SupportsCondition $condition): string { if ($condition instanceof SupportsOperation) { return sprintf('%s %s %s', $this->parenthesize($condition->getLeft(), $condition->getOperator()), $condition->getOperator(), $this->parenthesize($condition->getRight(), $condition->getOperator())); } if ($condition instanceof SupportsNegation) { return 'not ' . $this->parenthesize($condition->getCondition()); } if ($condition instanceof SupportsInterpolation) { return $this->evaluateToCss($condition->getExpression(), false); } if ($condition instanceof SupportsDeclaration) { return $this->withSupportsDeclaration(function () use ($condition) { return sprintf('(%s:%s%s)', $this->evaluateToCss($condition->getName()), $condition->isCustomProperty() ? '' : ' ', $this->evaluateToCss($condition->getValue())); }); } if ($condition instanceof SupportsFunction) { return sprintf('%s(%s)', $this->performInterpolation($condition->getName()), $this->performInterpolation($condition->getArguments())); } if ($condition instanceof SupportsAnything) { return '(' . $this->performInterpolation($condition->getContents()) . ')'; } throw new \InvalidArgumentException('Unknown supports condition type ' . get_class($condition)); } /** * Runs $callback in a context where {@see $inSupportsDeclaration} is true. * * @template T * * @param callable(): T $callback * @return T * * @param-immediately-invoked-callable $callback */ private function withSupportsDeclaration(callable $callback) { $oldInSupportsDeclaration = $this->inSupportsDeclaration; $this->inSupportsDeclaration = true; try { return $callback(); } finally { $this->inSupportsDeclaration = $oldInSupportsDeclaration; } } private function parenthesize(SupportsCondition $condition, ?string $operator = null): string { if ($condition instanceof SupportsNegation || $condition instanceof SupportsOperation && $operator !== $condition->getOperator()) { return '(' . $this->visitSupportsCondition($condition) . ')'; } return $this->visitSupportsCondition($condition); } public function visitVariableDeclaration(VariableDeclaration $node): ?Value { if ($node->isGuarded()) { $value = $this->addExceptionSpan($node, function () use ($node) { return $this->environment->getVariable($node->getName()); }); if ($value !== null && $value !== SassNull::create()) { return null; } } if ($node->isGlobal() && !$this->environment->globalVariableExists($node->getName())) { $this->warn( $this->environment->atRoot() ? "As of Dart Sass 2.0.0, !global assignments won't be able to declare new variables.\n\nSince this assignment is at the root of the stylesheet, the !global flag is\nunnecessary and can safely be removed." : "As of Dart Sass 2.0.0, !global assignments won't be able to declare new variables.\n\nRecommendation: add `{$node->getOriginalName()}: null` at the stylesheet root.", $node->getSpan(), Deprecation::newGlobal ); } $value = $this->withoutSlash($node->getExpression()->accept($this), $node->getExpression()); $this->addExceptionSpan($node, function () use ($value, $node) { $this->environment->setVariable($node->getName(), $value, $this->expressionNode($node->getExpression()), $node->isGlobal()); }); return null; } public function visitWarnRule(WarnRule $node): ?Value { $value = $this->addExceptionSpan($node, function () use ($node) { return $node->getExpression()->accept($this); }); $this->logger->warn($value instanceof SassString ? $value->getText() : $this->serialize($value, $node->getExpression()), null, null, $this->stackTrace($node->getSpan())); return null; } public function visitWhileRule(WhileRule $node): ?Value { return $this->environment->scope(function () use ($node) { while ($node->getCondition()->accept($this)->isTruthy()) { $result = $this->handleReturn($node->getChildren(), function (Statement $child) { return $child->accept($this); }); if ($result !== null) { return $result; } } return null; }, $node->hasDeclarations(), true); } // ## Expressions public function visitBinaryOperationExpression(BinaryOperationExpression $node): Value { if ($this->getStylesheet()->isPlainCss() && $node->getOperator() !== BinaryOperator::SINGLE_EQUALS && $node->getOperator() !== BinaryOperator::DIVIDED_BY) { throw $this->exception("Operators aren't allowed in plain CSS.", $node->getOperatorSpan()); } return $this->addExceptionSpan($node, function () use ($node) { $left = $node->getLeft()->accept($this); return match ($node->getOperator()) { BinaryOperator::SINGLE_EQUALS => $left->singleEquals($node->getRight()->accept($this)), BinaryOperator::OR => $left->isTruthy() ? $left : $node->getRight()->accept($this), BinaryOperator::AND => $left->isTruthy() ? $node->getRight()->accept($this) : $left, BinaryOperator::EQUALS => SassBoolean::create($left->equals($node->getRight()->accept($this))), BinaryOperator::NOT_EQUALS => SassBoolean::create(!$left->equals($node->getRight()->accept($this))), BinaryOperator::GREATER_THAN => $left->greaterThan($node->getRight()->accept($this)), BinaryOperator::GREATER_THAN_OR_EQUALS => $left->greaterThanOrEquals($node->getRight()->accept($this)), BinaryOperator::LESS_THAN => $left->lessThan($node->getRight()->accept($this)), BinaryOperator::LESS_THAN_OR_EQUALS => $left->lessThanOrEquals($node->getRight()->accept($this)), BinaryOperator::PLUS => $left->plus($node->getRight()->accept($this)), BinaryOperator::MINUS => $left->minus($node->getRight()->accept($this)), BinaryOperator::TIMES => $left->times($node->getRight()->accept($this)), BinaryOperator::DIVIDED_BY => $this->slash($left, $node->getRight()->accept($this), $node), BinaryOperator::MODULO => $left->modulo($node->getRight()->accept($this)), }; }); } /** * Returns the result of the SassScript `/` operation between $left and * $right in $node. */ private function slash(Value $left, Value $right, BinaryOperationExpression $node): Value { $result = $left->dividedBy($right); if ($left instanceof SassNumber && $right instanceof SassNumber && $node->allowsSlash() && $this->operandAllowsSlash($node->getLeft()) && $this->operandAllowsSlash($node->getRight())) { assert($result instanceof SassNumber); return $result->withSlash($left, $right); } if ($left instanceof SassNumber && $right instanceof SassNumber) { $recommendation = function (Expression $expression) use (&$recommendation): string { if ($expression instanceof BinaryOperationExpression && $expression->getOperator() === BinaryOperator::DIVIDED_BY) { $leftRecommendation = $recommendation($expression->getLeft()); $rightRecommendation = $recommendation($expression->getRight()); return "math.div($leftRecommendation, $rightRecommendation)"; } if ($expression instanceof ParenthesizedExpression) { return (string) $expression->getExpression(); } return (string) $expression; }; $calcRecommendation = AstUtil::expressionToCalc($node); $message = <<<WARNING Using / for division outside of calc() is deprecated and will be removed in Dart Sass 2.0.0. Recommendation: {$recommendation($node)} or $calcRecommendation More info and automated migrator: https://sass-lang.com/d/slash-div WARNING; $this->warn($message, $node->getSpan(), Deprecation::slashDiv); return $result; } return $result; } /** * Returns whether $node can be used as a component of a slash-separated * number. * * Although this logic is mostly resolved at parse-time, we can't tell * whether operands will be evaluated as calculations until evaluation-time. */ private function operandAllowsSlash(Expression $node): bool { if (!$node instanceof FunctionExpression) { return true; } if ($node->getNamespace() !== null) { return false; } return \in_array(strtolower($node->getName()), ['calc', 'clamp', 'hypot', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'sqrt', 'exp', 'sign', 'mod', 'rem', 'atan2', 'pow', 'log'], true) && $this->environment->getFunction($node->getName()) === null; } public function visitValueExpression(ValueExpression $node): Value { return $node->getValue(); } public function visitVariableExpression(VariableExpression $node): Value { $result = $this->addExceptionSpan($node, function () use ($node) { return $this->environment->getVariable($node->getName()); }); if ($result !== null) { return $result; } throw $this->exception('Undefined variable.', $node->getSpan()); } public function visitUnaryOperationExpression(UnaryOperationExpression $node): Value { $operand = $node->getOperand()->accept($this); return $this->addExceptionSpan($node, fn() => match ($node->getOperator()) { UnaryOperator::PLUS => $operand->unaryPlus(), UnaryOperator::MINUS => $operand->unaryMinus(), UnaryOperator::DIVIDE => $operand->unaryDivide(), UnaryOperator::NOT => $operand->unaryNot(), }); } public function visitBooleanExpression(BooleanExpression $node): Value { return SassBoolean::create($node->getValue()); } public function visitIfExpression(IfExpression $node): Value { [$positional, $named] = $this->evaluateMacroArguments($node); $this->verifyArguments(\count($positional), $named, IfExpression::getDeclaration(), $node); $condition = $positional[0] ?? $named['condition']; $ifTrue = $positional[1] ?? $named['if-true']; $ifFalse = $positional[2] ?? $named['if-false']; $result = $condition->accept($this)->isTruthy() ? $ifTrue : $ifFalse; return $this->withoutSlash($result->accept($this), $this->expressionNode($result)); } public function visitNullExpression(NullExpression $node): Value { return SassNull::create(); } public function visitNumberExpression(NumberExpression $node): Value { return SassNumber::create($node->getValue(), $node->getUnit()); } public function visitParenthesizedExpression(ParenthesizedExpression $node): Value { if ($this->getStylesheet()->isPlainCss()) { throw $this->exception("Parentheses aren't allowed in plain CSS.", $node->getSpan()); } return $node->getExpression()->accept($this); } public function visitColorExpression(ColorExpression $node): Value { return $node->getValue(); } public function visitListExpression(ListExpression $node): Value { return new SassList(array_map(function (Expression $expression) { return $expression->accept($this); }, $node->getContents()), $node->getSeparator(), $node->hasBrackets()); } public function visitMapExpression(MapExpression $node): Value { /** @var Map<Value> $map */ $map = new Map(); /** @var Map<AstNode> $keyNodes */ $keyNodes = new Map(); foreach ($node->getPairs() as $pair) { $keyValue = $pair[0]->accept($this); $valueValue = $pair[1]->accept($this); $oldValue = $map->get($keyValue); if ($oldValue !== null) { $oldValueSpan = $keyNodes->get($keyValue)?->getSpan(); throw new MultiSpanSassRuntimeException( 'Duplicate key.', $pair[0]->getSpan(), 'second key', $oldValueSpan !== null ? ['first key' => $oldValueSpan] : [], $this->stackTrace($pair[0]->getSpan()) ); } $map->put($keyValue, $valueValue); $keyNodes->put($keyValue, $pair[0]); } return SassMap::create($map); } private function getBuiltinFunction(string $name): ?SassCallable { if (!isset($this->builtInFunctions[$name]) && FunctionRegistry::has($name)) { $this->builtInFunctions[$name] = FunctionRegistry::get($name); } return $this->builtInFunctions[$name] ?? null; } public function visitFunctionExpression(FunctionExpression $node): Value { $function = $this->getStylesheet()->isPlainCss() ? null : $this->addExceptionSpan($node, function () use ($node) { return $this->environment->getFunction($node->getName()); }); if ($function === null) { if ($node->getNamespace() !== null) { throw $this->exception('Undefined function.', $node->getSpan()); } switch (strtolower($node->getName())) { case 'min': case 'max': case 'round': case 'abs': if ( $node->getArguments()->getNamed() === [] && $node->getArguments()->getRest() === null && IterableUtil::every($node->getArguments()->getPositional(), function (Expression $argument) { return $argument->accept(new IsCalculationSafeVisitor()); }) ) { return $this->visitCalculation($node, true); } break; case 'calc': case 'clamp': case 'hypot': case 'sin': case 'cos': case 'tan': case 'asin': case 'acos': case 'atan': case 'sqrt': case 'exp': case 'sign': case 'mod': case 'rem': case 'atan2': case 'pow': case 'log': return $this->visitCalculation($node); } $function = ($this->getStylesheet()->isPlainCss() ? null : $this->getBuiltinFunction($node->getName())) ?? new PlainCssCallable($node->getOriginalName()); } if (str_starts_with($node->getOriginalName(), '--') && $function instanceof UserDefinedCallable && !str_starts_with($function->getDeclaration()->getOriginalName(), '--')) { $this->warn("Sass @function names beginning with -- are deprecated for forward-compatibility with plain CSS functions.\n\nFor details, see https://sass-lang.com/d/css-function-mixin", $node->getNameSpan(), Deprecation::cssFunctionMixin); } $oldInFunction = $this->inFunction; $this->inFunction = true; $result = $this->addErrorSpan($node, function () use ($function, $node) { return $this->runFunctionCallable($node->getArguments(), $function, $node); }); $this->inFunction = $oldInFunction; return $result; } private function visitCalculation(FunctionExpression $node, bool $inLegacySassFunction = false): Value { if ($node->getArguments()->getNamed() !== []) { throw $this->exception("Keyword arguments can't be used with calculations.", $node->getSpan()); } if ($node->getArguments()->getRest() !== null) { throw $this->exception("Rest arguments can't be used with calculations.", $node->getSpan()); } $this->checkCalculationArguments($node); $arguments = array_map(function ($argument) use ($inLegacySassFunction) { return $this->visitCalculationExpression($argument, $inLegacySassFunction); }, $node->getArguments()->getPositional()); if ($this->inSupportsDeclaration) { return SassCalculation::unsimplified($node->getName(), $arguments); } $oldCallableNode = $this->callableNode; $this->callableNode = $node; try { return match (strtolower($node->getName())) { 'calc' => SassCalculation::calc($arguments[0]), 'sqrt' => SassCalculation::sqrt($arguments[0]), 'sin' => SassCalculation::sin($arguments[0]), 'cos' => SassCalculation::cos($arguments[0]), 'tan' => SassCalculation::tan($arguments[0]), 'asin' => SassCalculation::asin($arguments[0]), 'acos' => SassCalculation::acos($arguments[0]), 'atan' => SassCalculation::atan($arguments[0]), 'abs' => SassCalculation::abs($arguments[0]), 'exp' => SassCalculation::exp($arguments[0]), 'sign' => SassCalculation::sign($arguments[0]), 'min' => SassCalculation::min($arguments), 'max' => SassCalculation::max($arguments), 'hypot' => SassCalculation::hypot($arguments), 'pow' => SassCalculation::pow($arguments[0], $arguments[1] ?? null), 'atan2' => SassCalculation::atan2($arguments[0], $arguments[1] ?? null), 'log' => SassCalculation::log($arguments[0], $arguments[1] ?? null), 'mod' => SassCalculation::mod($arguments[0], $arguments[1] ?? null), 'rem' => SassCalculation::rem($arguments[0], $arguments[1] ?? null), 'round' => SassCalculation::round($arguments[0], $arguments[1] ?? null, $arguments[2] ?? null), 'clamp' => SassCalculation::clamp($arguments[0], $arguments[1] ?? null, $arguments[2] ?? null), default => throw new \UnexpectedValueException(sprintf('Unknown calculation name "%s".', $node->getName())), }; } catch (SassScriptException $e) { // The simplification logic in the SassCalculation static methods will // throw an error if the arguments aren't compatible, but we have access // to the original spans so we can throw a more informative error. if (str_contains($e->getMessage(), 'compatible')) { $this->verifyCompatibleNumbers($arguments, $node->getArguments()->getPositional()); } throw $this->exception($e->getMessage(), $node->getSpan(), $e); } finally { $this->callableNode = $oldCallableNode; } } private function checkCalculationArguments(FunctionExpression $node): void { $check = function (?int $maxArgs = null) use ($node) { if ($node->getArguments()->getPositional() === []) { throw $this->exception('Missing argument.', $node->getSpan()); } if ($maxArgs !== null && \count($node->getArguments()->getPositional()) > $maxArgs) { throw $this->exception(sprintf( 'Only %d %s allowed, but %d %s passed.', $maxArgs, StringUtil::pluralize('argument', $maxArgs), \count($node->getArguments()->getPositional()), StringUtil::pluralize('was', \count($node->getArguments()->getPositional()), 'were') ), $node->getSpan()); } }; switch (strtolower($node->getName())) { case 'calc': case 'sqrt': case 'sin': case 'cos': case 'tan': case 'asin': case 'acos': case 'atan': case 'abs': case 'exp': case 'sign': $check(1); break; case 'min': case 'max': case 'hypot': $check(); break; case 'pow': case 'atan2': case 'log': case 'mod': case 'rem': $check(2); break; case 'round': case 'clamp': $check(3); break; default: throw new \UnexpectedValueException(sprintf('Unknown calculation name "%s".', $node->getName())); } } /** * Verifies that $args all have compatible units that can be used for CSS * calculations, and throws a {@see SassException} if not. * * The $nodesWithSpans should correspond to the spans for $args. * * @param object[] $args * @param AstNode[] $nodesWithSpans * * @throws SassException */ private function verifyCompatibleNumbers(array $args, array $nodesWithSpans): void { for ($i = 0; $i < \count($args); $i++) { $arg = $args[$i]; if ($arg instanceof SassNumber && $arg->hasComplexUnits()) { throw $this->exception("Number $arg isn't compatible with CSS calculations.", $nodesWithSpans[$i]->getSpan()); } } for ($i = 0; $i < \count($args); $i++) { $number1 = $args[$i]; if (!$number1 instanceof SassNumber) { continue; } for ($j = $i + 1; $j < \count($args); $j++) { $number2 = $args[$j]; if (!$number2 instanceof SassNumber) { continue; } if ($number1->hasPossiblyCompatibleUnits($number2)) { continue; } throw new MultiSpanSassRuntimeException( "$number1 and $number2 are incompatible.", $nodesWithSpans[$i]->getSpan(), (string) $number1, [(string) $number2 => $nodesWithSpans[$j]->getSpan()], $this->stackTrace($nodesWithSpans[$i]->getSpan()) ); } } } /** * Evaluates $node as a component of a calculation. * * If $inLegacySassFunction is `true`, this allows unitless numbers to be added and * subtracted with numbers with units, for backwards-compatibility with the * old global `min()`, `max()`, `round()` and `abs()` functions. * * @return SassNumber|CalculationOperation|SassString|SassCalculation|Value */ private function visitCalculationExpression(Expression $node, bool $inLegacySassFunction): object { if ($node instanceof ParenthesizedExpression) { $result = $this->visitCalculationExpression($node->getExpression(), $inLegacySassFunction); return $result instanceof SassString ? new SassString('(' . $result->getText() . ')', false) : $result; } if ($node instanceof StringExpression) { if (!$node->accept(new IsCalculationSafeVisitor())) { throw $this->exception("This expression can't be used in a calculation.", $node->getSpan()); } assert(!$node->hasQuotes()); $text = $node->getText()->getAsPlain(); if ($text === null) { return new SassString($this->performInterpolation($node->getText()), false); } return match (strtolower($text)) { 'pi' => SassNumber::create(M_PI), 'e' => SassNumber::create(M_E), 'infinity' => SassNumber::create(INF), '-infinity' => SassNumber::create(-INF), 'nan' => SassNumber::create(NAN), default => new SassString($text, false), }; } if ($node instanceof BinaryOperationExpression) { $this->checkWhitespaceAroundCalculationOperator($node); return $this->addExceptionSpan($node, function () use ($node, $inLegacySassFunction) { return SassCalculation::operateInternal( $this->binaryOperatorToCalculationOperator($node->getOperator(), $node), $this->visitCalculationExpression($node->getLeft(), $inLegacySassFunction), $this->visitCalculationExpression($node->getRight(), $inLegacySassFunction), $inLegacySassFunction, !$this->inSupportsDeclaration ); }); } if ($node instanceof NumberExpression || $node instanceof VariableExpression || $node instanceof FunctionExpression || $node instanceof IfExpression) { $result = $node->accept($this); if ($result instanceof SassNumber || $result instanceof SassCalculation) { return $result; } if ($result instanceof SassString && !$result->hasQuotes()) { return $result; } throw $this->exception("Value $result can't be used in a calculation.", $node->getSpan()); } if ($node instanceof ListExpression && !$node->hasBrackets() && $node->getSeparator() === ListSeparator::SPACE && \count($node->getContents()) > 1) { $elements = []; foreach ($node->getContents() as $element) { $elements[] = $this->visitCalculationExpression($element, $inLegacySassFunction); } $this->checkAdjacentCalculationValues($elements, $node); foreach ($elements as $i => $element) { if ($element instanceof CalculationOperation && $node->getContents()[$i] instanceof ParenthesizedExpression) { $elements[$i] = new SassString("($element)", false); } } return new SassString(implode(' ', $elements), false); } \assert(!$node->accept(new IsCalculationSafeVisitor())); throw $this->exception("This expression can't be used in a calculation.", $node->getSpan()); } /** * Throws an error if $node requires whitespace around its operator in a * calculation but doesn't have it. */ private function checkWhitespaceAroundCalculationOperator(BinaryOperationExpression $node): void { if ($node->getOperator() !== BinaryOperator::PLUS && $node->getOperator() !== BinaryOperator::MINUS) { return; } // We _should_ never be able to violate these conditions since we always // parse binary operations from a single file, but it's better to be safe // than have this crash bizarrely. if ($node->getLeft()->getSpan()->getFile() !== $node->getRight()->getSpan()->getFile()) { return; } if ($node->getLeft()->getSpan()->getEnd()->getOffset() >= $node->getRight()->getSpan()->getStart()->getOffset()) { return; } $textBetweenOperands = $node->getLeft()->getSpan()->getFile()->getText($node->getLeft()->getSpan()->getEnd()->getOffset(), $node->getRight()->getSpan()->getStart()->getOffset()); $first = $textBetweenOperands[0]; $last = $textBetweenOperands[\strlen($textBetweenOperands) - 1]; if (!(Character::isWhitespace($first) || $first === '/') || !(Character::isWhitespace($last) || $last === '/')) { throw $this->exception('"+" and "-" must be surrounded by whitespace in calculations.', $node->getOperatorSpan()); } } /** * Returns the {@see CalculationOperator} that corresponds to $operator. */ private function binaryOperatorToCalculationOperator(BinaryOperator $operator, BinaryOperationExpression $node): CalculationOperator { return match ($operator) { BinaryOperator::PLUS => CalculationOperator::PLUS, BinaryOperator::MINUS => CalculationOperator::MINUS, BinaryOperator::TIMES => CalculationOperator::TIMES, BinaryOperator::DIVIDED_BY => CalculationOperator::DIVIDED_BY, default => throw $this->exception("This operation can't be used in a calculation.", $node->getOperatorSpan()), }; } /** * @param list<object> $elements */ private function checkAdjacentCalculationValues(array $elements, ListExpression $node): void { \assert(\count($elements) > 1); for ($i = 1; $i < \count($elements); $i++) { $previous = $elements[$i - 1]; $current = $elements[$i]; if ($previous instanceof SassString || $current instanceof SassString) { continue; } $previousNode = $node->getContents()[$i - 1]; $currentNode = $node->getContents()[$i]; if ( $currentNode instanceof UnaryOperationExpression && ($currentNode->getOperator() === UnaryOperator::MINUS || $currentNode->getOperator() === UnaryOperator::PLUS) || $currentNode instanceof NumberExpression && $currentNode->getValue() < 0 ) { // `calc(1 -2)` parses as a space-separated list whose second value is a // unary operator or a negative number, but just saying it's an invalid // expression doesn't help the user understand what's going wrong. We // add special case error handling to help clarify the issue. throw $this->exception('"+" and "-" must be surrounded by whitespace in calculations.', $currentNode->getSpan()->subspan(0, 1)); } throw $this->exception('Missing math operator.', $previousNode->getSpan()->expand($currentNode->getSpan())); } } public function visitInterpolatedFunctionExpression(InterpolatedFunctionExpression $node): Value { $function = new PlainCssCallable($this->performInterpolation($node->getName())); $oldInFunction = $this->inFunction; $this->inFunction = true; $result = $this->addErrorSpan($node, function () use ($function, $node) { return $this->runFunctionCallable($node->getArguments(), $function, $node); }); $this->inFunction = $oldInFunction; return $result; } /** * @template V of Value|null * * @param callable(): V $run * * @return V * * @param-immediately-invoked-callable $run */ private function runUserDefinedCallable(ArgumentInvocation $arguments, UserDefinedCallable $callable, AstNode $nodeWithSpan, callable $run): ?Value { $evaluated = $this->evaluateArguments($arguments); $name = $callable->getName(); if ($name !== '@content') { $name .= '()'; } $oldCallable = $this->currentCallable; $this->currentCallable = $callable; $result = $this->withStackFrame($name, $nodeWithSpan, function () use ($callable, $evaluated, $nodeWithSpan, $run) { // Add an extra closure() call so that modifications to the environment // don't affect the underlying environment closure. return $this->withEnvironment($callable->getEnvironment()->closure(), function () use ($callable, $evaluated, $nodeWithSpan, $run) { return $this->environment->scope(function () use ($callable, $evaluated, $nodeWithSpan, $run) { $this->verifyArguments(\count($evaluated->getPositional()), $evaluated->getNamed(), $callable->getDeclaration()->getArguments(), $nodeWithSpan); $declaredArguments = $callable->getDeclaration()->getArguments()->getArguments(); $minLength = min(\count($evaluated->getPositional()), \count($declaredArguments)); for ($i = 0; $i < $minLength; $i++) { $this->environment->setLocalVariable($declaredArguments[$i]->getName(), $evaluated->getPositional()[$i], $evaluated->getPositionalNodes()[$i]); } $named = $evaluated->getNamed(); $namedNodes = $evaluated->getNamedNodes(); for ($i = \count($evaluated->getPositional()); $i < \count($declaredArguments); $i++) { $argument = $declaredArguments[$i]; if (isset($named[$argument->getName()])) { $value = $named[$argument->getName()]; unset($named[$argument->getName()]); $nodeForSpan = $namedNodes[$argument->getName()]; } else { assert($argument->getDefaultValue() !== null); $value = $this->withoutSlash($argument->getDefaultValue()->accept($this), $this->expressionNode($argument->getDefaultValue())); $nodeForSpan = $this->expressionNode($argument->getDefaultValue()); } $this->environment->setLocalVariable($argument->getName(), $value, $nodeForSpan); } $argumentList = null; $restArgument = $callable->getDeclaration()->getArguments()->getRestArgument(); if ($restArgument !== null) { $rest = array_values(array_slice($evaluated->getPositional(), \count($declaredArguments))); $argumentList = new SassArgumentList($rest, $named, $evaluated->getSeparator() === ListSeparator::UNDECIDED ? ListSeparator::COMMA : $evaluated->getSeparator()); $this->environment->setLocalVariable($restArgument, $argumentList, $nodeWithSpan); } $result = $run(); if ($argumentList === null) { return $result; } if ($named === []) { return $result; } if ($argumentList->wereKeywordAccessed()) { return $result; } $unknownNames = array_keys($named); $lastName = array_pop($unknownNames); $message = sprintf( 'No argument%s named $%s%s.', $unknownNames ? 's' : '', $unknownNames ? implode(', $', $unknownNames) . ' or $' : '', $lastName ); throw new MultiSpanSassRuntimeException( $message, $nodeWithSpan->getSpan(), 'invocation', ['declaration' => $callable->getDeclaration()->getArguments()->getSpanWithName()], $this->stackTrace($nodeWithSpan->getSpan()) ); }); }); }); $this->currentCallable = $oldCallable; return $result; } private function runFunctionCallable(ArgumentInvocation $arguments, ?SassCallable $callable, AstNode $nodeWithSpan): Value { if ($callable instanceof BuiltInCallable) { return $this->withoutSlash($this->runBuiltInCallable($arguments, $callable, $nodeWithSpan), $nodeWithSpan); } if ($callable instanceof UserDefinedCallable) { return $this->runUserDefinedCallable($arguments, $callable, $nodeWithSpan, function () use ($callable) { foreach ($callable->getDeclaration()->getChildren() as $statement) { $returnValue = $statement->accept($this); if ($returnValue instanceof Value) { return $returnValue; } } throw $this->exception('Function finished without @return.', $callable->getDeclaration()->getSpan()); }); } if ($callable instanceof PlainCssCallable) { if (\count($arguments->getNamed()) > 0 || $arguments->getKeywordRest() !== null) { throw $this->exception("Plain CSS functions don't support keyword arguments.", $nodeWithSpan->getSpan()); } $buffer = $callable->getName() . '('; try { $first = true; foreach ($arguments->getPositional() as $argument) { if ($first) { $first = false; } else { $buffer .= ', '; } $buffer .= $this->evaluateToCss($argument); } $restArg = $arguments->getRest(); if ($restArg !== null) { $rest = $restArg->accept($this); if (!$first) { $buffer .= ', '; } $buffer .= $this->serialize($rest, $restArg); } } catch (SassRuntimeException $e) { if (!str_ends_with($e->getOriginalMessage(), "isn't a valid CSS value.")) { throw $e; } throw new MultiSpanSassRuntimeException( $e->getOriginalMessage(), $e->getSpan(), 'value', ['unknown function treated as plain CSS' => $nodeWithSpan->getSpan()], $e->getSassTrace() ); } $buffer .= ')'; return new SassString($buffer, false); } throw new \InvalidArgumentException('Unknown callable type ' . (\is_object($callable) ? get_class($callable) : gettype($callable) ) . '.'); } private function runBuiltInCallable(ArgumentInvocation $arguments, BuiltInCallable $callable, AstNode $nodeWithSpan): Value { $evaluated = $this->evaluateArguments($arguments); $oldCallableNode = $this->callableNode; $this->callableNode = $nodeWithSpan; /** @var ArgumentDeclaration $overload */ [$overload, $callback] = $callable->callbackFor(\count($evaluated->getPositional()), $evaluated->getNamed()); $this->addExceptionSpan($nodeWithSpan, function () use ($overload, $evaluated) { $overload->verify(\count($evaluated->getPositional()), $evaluated->getNamed()); }); $declaredArguments = $overload->getArguments(); $positional = $evaluated->getPositional(); $named = $evaluated->getNamed(); for ($i = \count($positional); $i < \count($declaredArguments); $i++) { $argument = $declaredArguments[$i]; if (isset($named[$argument->getName()])) { $positional[] = $named[$argument->getName()]; unset($named[$argument->getName()]); } else { assert($argument->getDefaultValue() !== null); $positional[] = $this->withoutSlash($argument->getDefaultValue()->accept($this), $argument->getDefaultValue()); } } $argumentList = null; if ($overload->getRestArgument() !== null) { $rest = array_values(array_splice($positional, \count($declaredArguments))); \assert(array_is_list($positional)); $argumentList = new SassArgumentList($rest, $named, $evaluated->getSeparator() === ListSeparator::UNDECIDED ? ListSeparator::COMMA : $evaluated->getSeparator()); $positional[] = $argumentList; } try { $result = $this->addExceptionSpan($nodeWithSpan, function () use ($callback, $positional) { return $callback($positional); }); } catch (SassException $e) { throw $e; } catch (\Throwable $e) { throw $this->exception($e->getMessage(), $nodeWithSpan->getSpan(), $e); } $this->callableNode = $oldCallableNode; if ($argumentList === null) { return $result; } if ($named === []) { return $result; } if ($argumentList->wereKeywordAccessed()) { return $result; } $unknownNames = array_keys($named); $lastName = array_pop($unknownNames); $message = sprintf( 'No argument%s named $%s%s.', $unknownNames ? 's' : '', $unknownNames ? implode(', $', $unknownNames) . ' or $' : '', $lastName ); throw new MultiSpanSassRuntimeException( $message, $nodeWithSpan->getSpan(), 'invocation', ['declaration' => $overload->getSpanWithName()], $this->stackTrace($nodeWithSpan->getSpan()) ); } private function evaluateArguments(ArgumentInvocation $arguments): ArgumentResults { $positional = []; $positionalNodes = []; foreach ($arguments->getPositional() as $expression) { $nodeForSpan = $this->expressionNode($expression); $positional[] = $this->withoutSlash($expression->accept($this), $nodeForSpan); $positionalNodes[] = $nodeForSpan; } $named = []; $namedNodes = []; foreach ($arguments->getNamed() as $key => $value) { $nodeForSpan = $this->expressionNode($value); $named[$key] = $this->withoutSlash($value->accept($this), $nodeForSpan); $namedNodes[$key] = $nodeForSpan; } $restArgs = $arguments->getRest(); if ($restArgs === null) { return new ArgumentResults($positional, $positionalNodes, $named, $namedNodes, ListSeparator::UNDECIDED); } $rest = $restArgs->accept($this); $restNodeForSpan = $this->expressionNode($restArgs); $separator = ListSeparator::UNDECIDED; if ($rest instanceof SassMap) { $this->addRestMap($named, $rest, $restArgs, fn($value) => $value); foreach ($rest->getContents() as $key => $_) { assert($key instanceof SassString); $namedNodes[$key->getText()] = $restNodeForSpan; } } elseif ($rest instanceof SassList) { foreach ($rest->asList() as $value) { $positional[] = $this->withoutSlash($value, $restNodeForSpan); $positionalNodes[] = $restNodeForSpan; $separator = $rest->getSeparator(); } if ($rest instanceof SassArgumentList) { foreach ($rest->getKeywords() as $key => $value) { $named[$key] = $this->withoutSlash($value, $restNodeForSpan); $namedNodes[$key] = $restNodeForSpan; } } } else { $positional[] = $this->withoutSlash($rest, $restNodeForSpan); $positionalNodes[] = $restNodeForSpan; } $keywordRestArgs = $arguments->getKeywordRest(); if ($keywordRestArgs === null) { return new ArgumentResults($positional, $positionalNodes, $named, $namedNodes, $separator); } $keywordRest = $keywordRestArgs->accept($this); $keywordRestNodeForSpan = $this->expressionNode($keywordRestArgs); if ($keywordRest instanceof SassMap) { $this->addRestMap($named, $keywordRest, $keywordRestArgs, fn($value) => $value); foreach ($keywordRest->getContents() as $key => $_) { assert($key instanceof SassString); $namedNodes[$key->getText()] = $keywordRestNodeForSpan; } return new ArgumentResults($positional, $positionalNodes, $named, $namedNodes, $separator); } throw $this->exception("Variable keyword arguments must be a map (was $keywordRest).", $keywordRestArgs->getSpan()); } /** * Evaluates the arguments in [arguments] only as much as necessary to * separate out positional and named arguments. * * Returns the arguments as expressions so that they can be lazily evaluated * for macros such as `if()`. * * @return array{list<Expression>, array<string, Expression>} */ private function evaluateMacroArguments(CallableInvocation $invocation): array { $restArgs = $invocation->getArguments()->getRest(); if ($restArgs === null) { return [$invocation->getArguments()->getPositional(), $invocation->getArguments()->getNamed()]; } $positional = $invocation->getArguments()->getPositional(); $named = $invocation->getArguments()->getNamed(); $rest = $restArgs->accept($this); $restNodeForSpan = $this->expressionNode($restArgs); if ($rest instanceof SassMap) { $this->addRestMap($named, $rest, $restArgs, function ($value) use ($restArgs) { return new ValueExpression($value, $restArgs->getSpan()); }); } elseif ($rest instanceof SassList) { foreach ($rest->asList() as $value) { $positional[] = new ValueExpression($this->withoutSlash($value, $restNodeForSpan), $restArgs->getSpan()); } if ($rest instanceof SassArgumentList) { foreach ($rest->getKeywords() as $key => $value) { $named[$key] = new ValueExpression($this->withoutSlash($value, $restNodeForSpan), $restArgs->getSpan()); } } } else { $positional[] = new ValueExpression($this->withoutSlash($rest, $restNodeForSpan), $restArgs->getSpan()); } $keywordRestArgs = $invocation->getArguments()->getKeywordRest(); if ($keywordRestArgs === null) { return [$positional, $named]; } $keywordRest = $keywordRestArgs->accept($this); $keywordRestNodeForSpan = $this->expressionNode($keywordRestArgs); if ($keywordRest instanceof SassMap) { $this->addRestMap($named, $keywordRest, $keywordRestArgs, function ($value) use ($keywordRestArgs, $keywordRestNodeForSpan) { return new ValueExpression($this->withoutSlash($value, $keywordRestNodeForSpan), $keywordRestArgs->getSpan()); }); return [$positional, $named]; } throw $this->exception("Variable keyword arguments must be a map (was $keywordRest).", $keywordRestArgs->getSpan()); } /** * Adds the values in $map to $values. * * Throws a {@see SassRuntimeException} associated with $nodeWithSpan's source * span if any $map keys aren't strings. * * @template T * * @param array<string, T> $values * @param callable(Value): T $convert * * @param-immediately-invoked-callable $convert */ private function addRestMap(array &$values, SassMap $map, AstNode $nodeWithSpan, callable $convert): void { $expressionNode = $this->expressionNode($nodeWithSpan); foreach ($map->getContents() as $key => $value) { if ($key instanceof SassString) { $values[$key->getText()] = $convert($this->withoutSlash($value, $expressionNode)); } else { throw $this->exception("Variable keyword argument map must have string keys.\n$key is not a string in $map.", $nodeWithSpan->getSpan()); } } } /** * @param array<string, mixed> $named * * @throws SassRuntimeException if $positional and $named aren't valid when applied to $arguments. */ private function verifyArguments(int $positional, array $named, ArgumentDeclaration $arguments, AstNode $nodeWithSpan): void { $this->addExceptionSpan($nodeWithSpan, function () use ($positional, $named, $arguments) { $arguments->verify($positional, $named); }); } public function visitSelectorExpression(SelectorExpression $node): Value { if ($this->styleRuleIgnoringAtRoot === null) { return SassNull::create(); } return $this->styleRuleIgnoringAtRoot->getOriginalSelector()->asSassList(); } public function visitStringExpression(StringExpression $node): Value { // Don't use [performInterpolation] here because we need to get the raw text // from strings, rather than the semantic value. $oldInSupportsDeclaration = $this->inSupportsDeclaration; $this->inSupportsDeclaration = false; $result = new SassString(implode('', array_map(function ($value) { if (\is_string($value)) { return $value; } $expression = $value; $result = $expression->accept($this); if ($result instanceof SassString) { return $result->getText(); } return $this->serialize($result, $expression, false); }, $node->getText()->getContents())), $node->hasQuotes()); $this->inSupportsDeclaration = $oldInSupportsDeclaration; return $result; } public function visitSupportsExpression(SupportsExpression $node): Value { return new SassString($this->visitSupportsCondition($node->getCondition()), false); } /** * Runs $callback for each value in $list until it returns a {@see Value}. * * Returns the value returned by $callback, or `null` if it only ever * returned `null`. * * @template T * * @param T[] $list * @param callable(T): ?Value $callback * * @param-immediately-invoked-callable $callback */ private function handleReturn(array $list, callable $callback): ?Value { foreach ($list as $value) { $result = $callback($value); if ($result !== null) { return $result; } } return null; } /** * Runs $callback with $environment as the current environment. * * @template T * * @param Environment $environment * @param callable(): T $callback * * @return T * * @param-immediately-invoked-callable $callback */ private function withEnvironment(Environment $environment, callable $callback) { $oldEnvironment = $this->environment; $this->environment = $environment; $result = $callback(); $this->environment = $oldEnvironment; return $result; } /** * @return CssValue<string> */ private function interpolationToValue(Interpolation $interpolation, bool $warnForColor = false, bool $trim = false): CssValue { $result = $this->performInterpolation($interpolation, $warnForColor); return new CssValue($trim ? StringUtil::trimAscii($result, true) : $result, $interpolation->getSpan()); } /** * Evaluates $interpolation. * * If $warnForColor is `true`, this will emit a warning for any named color * values passed into the interpolation. */ private function performInterpolation(Interpolation $interpolation, bool $warnForColor = false): string { $tuple = $this->performInterpolationHelper($interpolation, false, $warnForColor); return $tuple[0]; } /** * Like {@see performInterpolation}, but also returns a {@see InterpolationMap} that * can map spans from the resulting string back to the original * $interpolation. * * @return array{string, InterpolationMap} */ private function performInterpolationWithMap(Interpolation $interpolation, bool $warnForColor = false): array { $tuple = $this->performInterpolationHelper($interpolation, true, $warnForColor); \assert($tuple[1] !== null); return $tuple; } /** * A helper that implements the core logic of both {@see performInterpolation} * and {@see performInterpolationWithMap}. * * @return array{string, InterpolationMap|null} */ private function performInterpolationHelper(Interpolation $interpolation, bool $sourceMap, bool $warnForColor = false): array { $targetLocations = $sourceMap ? [] : null; $oldInSupportsDeclaration = $this->inSupportsDeclaration; $this->inSupportsDeclaration = false; $buffer = ''; $first = true; foreach ($interpolation->getContents() as $value) { if (!$first && $targetLocations !== null) { $targetLocations[] = new SimpleSourceLocation(\strlen($buffer)); } $first = false; if (\is_string($value)) { $buffer .= $value; continue; } $expression = $value; $result = $expression->accept($this); if ($warnForColor && $result instanceof SassColor && null !== $colorName = Colors::RGBaToColorName($result->getRed(), $result->getGreen(), $result->getBlue(), $result->getAlpha())) { $alternative = new BinaryOperationExpression( BinaryOperator::PLUS, new StringExpression(new Interpolation([''], $interpolation->getSpan()), true), $expression ); $this->warn("You probably don't mean to use the color value $colorName in interpolation here.\nIt may end up represented as $result, which will likely produce invalid CSS.\nAlways quote color names when using them as strings or map keys (for example, \"$colorName\").\nIf you really want to use the color value here, use '$alternative'.", $expression->getSpan()); } $buffer .= $this->serialize($result, $expression, false); } $this->inSupportsDeclaration = $oldInSupportsDeclaration; return [$buffer, $targetLocations === null ? null : new InterpolationMap($interpolation, $targetLocations)]; } /** * Evaluates $expression and calls `toCssString()` and wraps a * {@see SassScriptException} to associate it with its span. */ private function evaluateToCss(Expression $expression, bool $quote = true): string { return $this->serialize($expression->accept($this), $expression, $quote); } /** * Calls `value->toCssString()` and wraps a {@see SassScriptException} to associate * it with $nodeWithSpan's source span. * * This takes an {@see AstNode} rather than a {@see FileSpan} so it can avoid calling * {@see AstNode::getSpan} if the span isn't required, since some nodes need to do * real work to manufacture a source span. */ private function serialize(Value $value, AstNode $nodeWithSpan, bool $quote = true): string { return $this->addExceptionSpan($nodeWithSpan, function () use ($value, $quote) { return $value->toCssString($quote); }); } /** * Runs $callback with $rule as the current style rule. * * @template T * * @param ModifiableCssStyleRule $rule * @param callable(): T $callback * * @return T * * @param-immediately-invoked-callable $callback */ private function withStyleRule(ModifiableCssStyleRule $rule, callable $callback) { $oldRule = $this->styleRuleIgnoringAtRoot; $this->styleRuleIgnoringAtRoot = $rule; $result = $callback(); $this->styleRuleIgnoringAtRoot = $oldRule; return $result; } /** * Runs $callback with $queries as the current media queries. * * This also sets $sources as the current set of media queries that were * merged together to create $queries. This is used to determine when it's * safe to bubble one query through another. * * @template T * * @param list<CssMediaQuery>|null $queries * @param CssMediaQuery[]|null $sources * @param callable(): T $callback * * @return T * * @param-immediately-invoked-callable $callback */ private function withMediaQueries(?array $queries, ?array $sources, callable $callback) { $oldMediaQueries = $this->mediaQueries; $oldSources = $this->mediaQuerySources; $this->mediaQueries = $queries; $this->mediaQuerySources = $sources; $result = $callback(); $this->mediaQueries = $oldMediaQueries; $this->mediaQuerySources = $oldSources; return $result; } /** * Returns the {@see AstNode} whose span should be used for $expression. * * If $expression is a variable reference, {@see AstNode}'s span will be the span * where that variable was originally declared. Otherwise, this will just * return $expression. */ private function expressionNode(AstNode $expression): AstNode { if ($expression instanceof VariableExpression) { return $this->addExceptionSpan($expression, function () use ($expression) { return $this->environment->getVariableNode($expression->getName()) ?? $expression; }); } return $expression; } /** * Adds $node as a child of the current parent, then runs $callback with * $node as the current parent. * * If $through is passed, $node is added as a child of the first parent for * which $through returns `false`. That parent is copied unless it's the * lattermost child of its parent. * * Runs $callback in a new environment scope unless $scopeWhen is false. * * @template S of ModifiableCssParentNode * @template T * * @param S $node * @param callable(): T $callback * @param null|callable(CssNode): bool $through * @param bool $scopeWhen * * @return T * * @param-immediately-invoked-callable $callback * @param-immediately-invoked-callable $through */ private function withParent(ModifiableCssParentNode $node, callable $callback, ?callable $through = null, bool $scopeWhen = true) { $this->addChild($node, $through); $oldParent = $this->parent; $this->parent = $node; $result = $this->environment->scope($callback, $scopeWhen); $this->parent = $oldParent; return $result; } /** * Adds $node as a child of the current parent. * * If $through is passed, $node is added as a child of the first parent for * which $through returns `false` instead. That parent is copied unless it's the * lattermost child of its parent. * * @param null|callable(CssNode): bool $through * * @param-immediately-invoked-callable $through */ private function addChild(ModifiableCssNode $node, ?callable $through = null): void { // Go up through parents that match [through]. $parent = $this->getParent(); if ($through !== null) { while ($through($parent)) { $grandParent = $parent->getParent(); if ($grandParent === null) { throw new \InvalidArgumentException('$through() must return false for at least one parent of the node.'); } $parent = $grandParent; } } // If the parent has a (visible) following sibling, we shouldn't add to // the parent. Instead, we should create a copy and add it after the // interstitial sibling. if ($parent->hasFollowingSibling()) { $grandParent = $parent->getParent(); // A node with siblings must have a parent assert($grandParent !== null); $lastChild = ListUtil::last($grandParent->getChildren()); if ($parent->equalsIgnoringChildren($lastChild)) { \assert($lastChild instanceof ModifiableCssParentNode); $parent = $lastChild; } else { $parent = $parent->copyWithoutChildren(); $grandParent->addChild($parent); } } $parent->addChild($node); } /** * Adds a frame to the stack with the given $member name, and $nodeWithSpan * as the site of the new frame. * * Runs $callback with the new stack. * * This takes an {@see AstNode} rather than a {@see FileSpan} so it can avoid calling * {@see AstNode::getSpan} if the span isn't required, since some nodes need to do * real work to manufacture a source span. * * @template T * * @param callable(): T $callback * * @return T * * @param-immediately-invoked-callable $callback */ private function withStackFrame(string $member, AstNode $nodeWithSpan, callable $callback) { $this->stack[] = [$this->member, $nodeWithSpan]; $oldMember = $this->member; $this->member = $member; $result = $callback(); $this->member = $oldMember; array_pop($this->stack); return $result; } /** * Like {@see Value::withoutSlash}, but produces a deprecation warning if $value * was a slash-separated number. */ private function withoutSlash(Value $value, AstNode $nodeForSpan): Value { if ($value instanceof SassNumber && $value->getAsSlash() !== null) { $recommendation = function (SassNumber $number) use (&$recommendation): string { if ($number->getAsSlash() !== null) { [$before, $after] = $number->getAsSlash(); return "math.div({$recommendation($before)}, {$recommendation($after)})"; } return (string) $number; }; $message = <<<WARNING Using / for division is deprecated and will be removed in Dart Sass 2.0.0. Recommendation: {$recommendation($value)} More info and automated migrator: https://sass-lang.com/d/slash-div WARNING; $this->warn($message, $nodeForSpan->getSpan(), Deprecation::slashDiv); } return $value->withoutSlash(); } /** * Creates a new stack frame with location information from $member$ and * $span. */ private function stackFrame(string $member, FileSpan $span): Frame { $url = $span->getSourceUrl(); if ($url !== null) { $url = $this->importCache->humanize($url); } return Util::frameForSpan($span, $member, $url); } /** * Returns a stack trace at the current point. * * If $span is passed, it's used for the innermost stack frame. */ private function stackTrace(?FileSpan $span = null): Trace { $frames = []; foreach ($this->stack as [$member, $nodeWithSpan]) { $frames[] = $this->stackFrame($member, $nodeWithSpan->getSpan()); } if ($span !== null) { $frames[] = $this->stackFrame($this->member, $span); } return new Trace(array_reverse($frames)); } public function warn(string $message, FileSpan $span, ?Deprecation $deprecation = null): void { if ($this->quietDeps && ($this->inDependency || ($this->currentCallable !== null && $this->currentCallable->isInDependency()))) { return; } $spanString = ($span->getSourceUrl() ?? '') . "\0" . $span->getStart()->getOffset() . "\0" . $span->getEnd()->getOffset(); if (isset($this->warningsEmitted[$message][$spanString])) { return; } $this->warningsEmitted[$message][$spanString] = true; $trace = $this->stackTrace($span); if ($deprecation === null) { $this->logger->warn($message, null, $span, $trace); } else { LoggerUtil::warnForDeprecation($this->logger, $deprecation, $message, $span, $trace); } } /** * Returns a {@see SassRuntimeException} with the given $message. * * If $span is passed, it's used for the innermost stack frame. */ private function exception(string $message, ?FileSpan $span = null, ?\Throwable $previous = null): SassRuntimeException { return new SimpleSassRuntimeException($message, $span ?? ListUtil::last($this->stack)[1]->getSpan(), $this->stackTrace($span), $previous); } /** * Returns a {@see MultiSpanSassRuntimeException} with the given $message, * $primaryLabel, and $secondaryLabels. * * The primary span is taken from the current stack trace span. * * @param array<string, FileSpan> $secondarySpans */ private function multiSpanException(string $message, string $primaryLabel, array $secondarySpans): SassRuntimeException { return new MultiSpanSassRuntimeException($message, ListUtil::last($this->stack)[1]->getSpan(), $primaryLabel, $secondarySpans, $this->stackTrace()); } /** * Runs $callback, and converts any {@see SassScriptException}s it throws to * {@see SassRuntimeException}s with $nodeWithSpan's source span. * * This takes an {@see AstNode} rather than a {@see FileSpan} so it can avoid calling * {@see AstNode::getSpan} if the span isn't required, since some nodes need to do * real work to manufacture a source span. * * If $addStackFrame is true (the default), this will add an innermost stack * frame for $nodeWithSpan. Otherwise, it will use the existing stack as-is. * * @template T * * @param callable(): T $callback * * @return T * * @throws SassRuntimeException * * @param-immediately-invoked-callable $callback */ private function addExceptionSpan(AstNode $nodeWithSpan, callable $callback, bool $addStackFrame = true) { try { return $callback(); } catch (SassScriptException $e) { throw $e->withSpan($nodeWithSpan->getSpan())->withTrace($this->stackTrace($addStackFrame ? $nodeWithSpan->getSpan() : null), $e); } } /** * Runs $callback, and converts any {@see SassException}s that aren't already * {@see SassRuntimeException}s to {@see SassRuntimeException}s with the current stack * trace. * * @template T * * @param callable(): T $callback * @return T * * @param-immediately-invoked-callable $callback */ private function addExceptionTrace(callable $callback) { try { return $callback(); } catch (SassRuntimeException $e) { throw $e; } catch (SassException $e) { throw $e->withTrace($this->stackTrace($e->getSpan()), $e); } } /** * Runs $callback, and converts any {@see SassRuntimeException}s containing an * `@error` to throw a more relevant {@see SassRuntimeException}s with $nodeWithSpan's * source span. * * @template T * * @param AstNode $nodeWithSpan * @param callable(): T $callback * * @return T * * @param-immediately-invoked-callable $callback */ private function addErrorSpan(AstNode $nodeWithSpan, callable $callback) { try { return $callback(); } catch (SassRuntimeException $e) { if (!str_starts_with($e->getSpan()->getText(), '@error')) { throw $e; } throw new SimpleSassRuntimeException($e->getOriginalMessage(), $nodeWithSpan->getSpan(), $this->stackTrace(), $e); } } } PKCA#]�7*x@x@Jsystem/helixultimate/vendor/scssphp/scssphp/src/Evaluation/Environment.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Evaluation; use ScssPhp\ScssPhp\Ast\AstNode; use ScssPhp\ScssPhp\SassCallable\SassCallable; use ScssPhp\ScssPhp\SassCallable\UserDefinedCallable; use ScssPhp\ScssPhp\Value\Value; use SourceSpan\FileSpan; /** * The lexical environment in which Sass is executed. * * This tracks lexically-scoped information, such as variables, functions, and * mixins. * * @internal */ final class Environment { /** * A list of variables defined at each lexical scope level. * * Each scope maps the names of declared variables to their values. * * The first element is the global scope, and each successive element is * deeper in the tree. * * @var array<int, \ArrayObject<string, Value>> */ private array $variables; /** * The nodes where each variable in {@see variables} was defined. * * This stores {@see AstNode}s rather than {@see FileSpan}s so it can avoid calling * {@see AstNode::getSspan} if the span isn't required, since some nodes need to do * real work to manufacture a source span. * * @var array<int, \ArrayObject<string, AstNode>> */ private array $variableNodes; /** * A map of variable names to their indices in {@see variables}. * * This map is filled in as-needed, and may not be complete. * * @var array<string, int> */ private array $variableIndices = []; /** * A list of functions defined at each lexical scope level. * * Each scope maps the names of declared functions to their values. * * The first element is the global scope, and each successive element is * deeper in the tree. * * @var array<int, \ArrayObject<string, SassCallable>> */ private array $functions; /** * A map of function names to their indices in {@see functions}. * * This map is filled in as-needed, and may not be complete. * * @var array<string, int> */ private array $functionIndices = []; /** * A list of mixins defined at each lexical scope level. * * Each scope maps the names of declared mixins to their values. * * The first element is the global scope, and each successive element is * deeper in the tree. * * @var array<int, \ArrayObject<string, SassCallable>> */ private array $mixins; /** * A map of mixin names to their indices in {@see mixins}. * * This map is filled in as-needed, and may not be complete. * * @var array<string, int> */ private array $mixinIndices = []; /** * The content block passed to the lexically-enclosing mixin, or `null` if * this is not in a mixin, or if no content block was passed. */ private ?UserDefinedCallable $content; /** * Whether the environment is lexically within a mixin. */ private bool $inMixin = false; /** * Whether the environment is currently in a global or semi-global scope. * * A semi-global scope can assign to global variables, but it doesn't declare * them by default. */ private bool $inSemiGlobalScope = true; /** * The name of the last variable that was accessed. * * This is cached to speed up repeated references to the same variable, as * well as references to the last variable's {@see FileSpan}. */ private ?string $lastVariableName = null; /** * The index in {@see variables} of the last variable that was accessed. */ private ?int $lastVariableIndex = null; public static function create(): Environment { return new Environment([new \ArrayObject()], [new \ArrayObject()], [new \ArrayObject()], [new \ArrayObject()]); } /** * @param array<int, \ArrayObject<string, Value>> $variables * @param array<int, \ArrayObject<string, AstNode>> $variableNodes * @param array<int, \ArrayObject<string, SassCallable>> $functions * @param array<int, \ArrayObject<string, SassCallable>> $mixins */ private function __construct(array $variables, array $variableNodes, array $functions, array $mixins, ?UserDefinedCallable $content = null) { $this->variables = $variables; $this->variableNodes = $variableNodes; $this->functions = $functions; $this->mixins = $mixins; $this->content = $content; } public function getContent(): ?UserDefinedCallable { return $this->content; } /** * Whether the environment is lexically at the root of the document. */ public function atRoot(): bool { return \count($this->variables) === 1; } public function isInMixin(): bool { return $this->inMixin; } /** * Creates a closure based on this environment. * * Any scope changes in this environment will not affect the closure. * However, any new declarations or assignments in scopes that are visible * when the closure was created will be reflected. */ public function closure(): Environment { return new Environment($this->variables, $this->variableNodes, $this->functions, $this->mixins, $this->content); } /** * Returns a new environment to use for an imported file. * * The returned environment shares this environment's variables, functions, * and mixins, but excludes most modules (except for global modules that * result from importing a file with forwards). */ public function forImport(): Environment { return new Environment($this->variables, $this->variableNodes, $this->functions, $this->mixins, $this->content); } public function getVariable(string $name): ?Value { if ($this->lastVariableName === $name) { assert($this->lastVariableIndex !== null); return $this->variables[$this->lastVariableIndex][$name] ?? null; } $index = $this->variableIndices[$name] ?? null; if ($index !== null) { $this->lastVariableName = $name; $this->lastVariableIndex = $index; return $this->variables[$index][$name] ?? null; } $index = $this->variableIndex($name); if ($index === null) { return null; } $this->lastVariableName = $name; $this->lastVariableIndex = $index; $this->variableIndices[$name] = $index; return $this->variables[$index][$name] ?? null; } public function getVariableNode(string $name): ?AstNode { if ($this->lastVariableName === $name) { assert($this->lastVariableIndex !== null); return $this->variableNodes[$this->lastVariableIndex][$name] ?? null; } $index = $this->variableIndices[$name] ?? null; if ($index !== null) { $this->lastVariableName = $name; $this->lastVariableIndex = $index; return $this->variableNodes[$index][$name] ?? null; } $index = $this->variableIndex($name); if ($index === null) { return null; } $this->lastVariableName = $name; $this->lastVariableIndex = $index; $this->variableIndices[$name] = $index; return $this->variableNodes[$index][$name] ?? null; } /** * Returns whether a variable named $name exists. */ public function variableExists(string $name): bool { return $this->getVariable($name) !== null; } /** * Returns whether a global variable named $name exists. */ public function globalVariableExists(string $name): bool { return isset($this->variables[0][$name]); } /** * Returns the index of the last map in {@see variables} that has a $name key, * or `null` if none exists. */ private function variableIndex(string $name): ?int { for ($i = \count($this->variables) - 1; $i >= 0; $i--) { if (isset($this->variables[$i][$name])) { return $i; } } return null; } /** * Sets the variable named $name to $value. * * If $global is `true`, this sets the variable at the top-level scope. * Otherwise, if the variable was already defined, it'll set it in the * previous scope. If it's undefined, it'll set it in the current scope. */ public function setVariable(string $name, Value $value, AstNode $nodeWithSpan, bool $global = false): void { if ($global || $this->atRoot()) { // Don't set the index if there's already a variable with the given name, // since local accesses should still return the local variable. if (!isset($this->variableIndices[$name])) { $this->lastVariableName = $name; $this->lastVariableIndex = 0; $this->variableIndices[$name] = 0; } $this->variables[0][$name] = $value; $this->variableNodes[0][$name] = $nodeWithSpan; return; } if ($this->lastVariableName === $name) { assert($this->lastVariableIndex !== null); $index = $this->lastVariableIndex; } else { if (!isset($this->variableIndices[$name])) { $this->variableIndices[$name] = $this->variableIndex($name) ?? \count($this->variables) - 1; } $index = $this->variableIndices[$name]; } if (!$this->inSemiGlobalScope && $index === 0) { $index = \count($this->variables) - 1; $this->variableIndices[$name] = $index; } $this->lastVariableName = $name; $this->lastVariableIndex = $index; $this->variables[$index][$name] = $value; $this->variableNodes[$index][$name] = $nodeWithSpan; } /** * Sets the variable named $name to $value. * * Unlike {@see setVariable}, this will declare the variable in the current scope * even if a declaration already exists in an outer scope. */ public function setLocalVariable(string $name, Value $value, AstNode $nodeWithSpan): void { $index = \count($this->variables) - 1; $this->lastVariableName = $name; $this->lastVariableIndex = $index; $this->variableIndices[$name] = $index; $this->variables[$index][$name] = $value; $this->variableNodes[$index][$name] = $nodeWithSpan; } public function getFunction(string $name): ?SassCallable { $index = $this->functionIndices[$name] ?? null; if ($index !== null) { return $this->functions[$index][$name] ?? null; } $index = $this->functionIndex($name); if ($index === null) { return null; } $this->functionIndices[$name] = $index; return $this->functions[$index][$name] ?? null; } /** * Returns the index of the last map in {@see functions} that has a $name key, * or `null` if none exists. */ private function functionIndex(string $name): ?int { for ($i = \count($this->functions) - 1; $i >= 0; $i--) { if (isset($this->functions[$i][$name])) { return $i; } } return null; } /** * Returns whether a function named $name exists. */ public function functionExists(string $name): bool { return $this->getFunction($name) !== null; } public function setFunction(SassCallable $callable): void { $index = \count($this->functions) - 1; $name = $callable->getName(); $this->functionIndices[$name] = $index; $this->functions[$index][$name] = $callable; } public function getMixin(string $name): ?SassCallable { $index = $this->mixinIndices[$name] ?? null; if ($index !== null) { return $this->mixins[$index][$name] ?? null; } $index = $this->mixinIndex($name); if ($index === null) { return null; } $this->mixinIndices[$name] = $index; return $this->mixins[$index][$name] ?? null; } /** * Returns the index of the last map in {@see mixins} that has a $name key, * or `null` if none exists. */ private function mixinIndex(string $name): ?int { for ($i = \count($this->mixins) - 1; $i >= 0; $i--) { if (isset($this->mixins[$i][$name])) { return $i; } } return null; } /** * Returns whether a mixin named $name exists. */ public function mixinExists(string $name): bool { return $this->getMixin($name) !== null; } public function setMixin(SassCallable $callable): void { $index = \count($this->mixins) - 1; $name = $callable->getName(); $this->mixinIndices[$name] = $index; $this->mixins[$index][$name] = $callable; } /** * Sets $content as {@see content} for the duration of $callback. * * @param callable(): void $callback * * @param-immediately-invoked-callable $callback */ public function withContent(?UserDefinedCallable $content, callable $callback): void { $oldContent = $this->content; $this->content = $content; $callback(); $this->content = $oldContent; } /** * Sets {@see inMixin} to `true` for the duration of $callback. * * @param callable(): void $callback * * @param-immediately-invoked-callable $callback */ public function asMixin(callable $callback): void { $oldInMixin = $this->inMixin; $this->inMixin = true; $callback(); $this->inMixin = $oldInMixin; } /** * Runs $callback in a new scope. * * Variables, functions, and mixins declared in a given scope are * inaccessible outside of it. If $semiGlobal is passed, this scope can * assign to global variables without a `!global` declaration. * * If $when is false, this doesn't create a new scope and instead just * executes $callback and returns its result. * * @template T * * @param callable(): T $callback * * @return T * * @param-immediately-invoked-callable $callback */ public function scope(callable $callback, bool $when = true, bool $semiGlobal = false) { // We have to track semi-globalness even if `!$when` so that // // div { // @if ... { // $x: y; // } // } // // doesn't assign to the global scope. $semiGlobal = $semiGlobal && $this->inSemiGlobalScope; $wasInSemiGlobalScope = $this->inSemiGlobalScope; $this->inSemiGlobalScope = $semiGlobal; if (!$when) { try { return $callback(); } finally { $this->inSemiGlobalScope = $wasInSemiGlobalScope; } } $this->variables[] = new \ArrayObject(); $this->variableNodes[] = new \ArrayObject(); $this->functions[] = new \ArrayObject(); $this->mixins[] = new \ArrayObject(); try { return $callback(); } finally { $this->inSemiGlobalScope = $wasInSemiGlobalScope; $this->lastVariableName = null; $this->lastVariableIndex = null; $removedVariables = array_pop($this->variables); assert($removedVariables !== null); foreach ($removedVariables as $name => $_) { unset($this->variableIndices[$name]); } array_pop($this->variableNodes); $removedFunctions = array_pop($this->functions); assert($removedFunctions !== null); foreach ($removedFunctions as $name => $_) { unset($this->functionIndices[$name]); } $removedMixins = array_pop($this->mixins); assert($removedMixins !== null); foreach ($removedMixins as $name => $_) { unset($this->mixinIndices[$name]); } } } } PKCA#].RB��Msystem/helixultimate/vendor/scssphp/scssphp/src/Evaluation/EvaluateResult.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Evaluation; use ScssPhp\ScssPhp\Ast\Css\CssStylesheet; /** * The result of compiling a Sass document to a CSS tree, along with metadata * about the compilation process. * * @internal */ final class EvaluateResult { private readonly CssStylesheet $stylesheet; /** * @var list<string> */ private readonly array $loadedUrls; /** * @param list<string> $loadedUrls */ public function __construct(CssStylesheet $stylesheet, array $loadedUrls) { $this->stylesheet = $stylesheet; $this->loadedUrls = $loadedUrls; } public function getStylesheet(): CssStylesheet { return $this->stylesheet; } /** * @return list<string> */ public function getLoadedUrls(): array { return $this->loadedUrls; } } PKCA#]Mee�PPPsystem/helixultimate/vendor/scssphp/scssphp/src/Evaluation/EvaluationContext.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Evaluation; use ScssPhp\ScssPhp\Deprecation; use SourceSpan\FileSpan; /** * @internal */ abstract class EvaluationContext { private static ?EvaluationContext $evaluationContext = null; /** * The current evaluation context. * * @throws \LogicException if there isn't a Sass stylesheet currently being * evaluated. */ public static function getCurrent(): EvaluationContext { if (self::$evaluationContext !== null) { return self::$evaluationContext; } throw new \LogicException('No Sass stylesheet is currently being evaluated.'); } /** * Runs $callback with $context as {@see EvaluationContext::getCurrent()}. * * @template T * * @param callable(): T $callback * * @return T * * @param-immediately-invoked-callable $callback */ public static function withEvaluationContext(EvaluationContext $context, callable $callback) { $oldContext = self::$evaluationContext; self::$evaluationContext = $context; try { return $callback(); } finally { self::$evaluationContext = $oldContext; } } /** * Returns the span for the currently executing callable. * * For normal exception reporting, this should be avoided in favor of * throwing {@see SassScriptException}s. It should only be used when calling APIs * that require spans. * * @throws \LogicException if there isn't a callable being invoked. */ abstract public function getCurrentCallableSpan(): FileSpan; /** * Prints a warning message associated with the current `@import` or function * call. * * If $deprecation is non-null`, the warning is emitted as a deprecation * warning of that type. */ abstract public function warn(string $message, ?Deprecation $deprecation = null): void; } PKCA#]m�8��Nsystem/helixultimate/vendor/scssphp/scssphp/src/Evaluation/ArgumentResults.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Evaluation; use ScssPhp\ScssPhp\Ast\AstNode; use ScssPhp\ScssPhp\Value\ListSeparator; use ScssPhp\ScssPhp\Value\Value; /** * The result of evaluating arguments to a function or mixin. * * @internal */ final class ArgumentResults { /** * Arguments passed by position. * * @var list<Value> */ private readonly array $positional; /** * The {@see AstNode}s that hold the spans for each {@see positional} argument. * * @var list<AstNode> */ private readonly array $positionalNodes; /** * @var array<string, Value> */ private readonly array $named; /** * The {@see AstNode}s that hold the spans for each {@see named} argument. * * @var array<string, AstNode> */ private readonly array $namedNodes; private readonly ListSeparator $separator; /** * @param list<Value> $positional * @param list<AstNode> $positionalNodes * @param array<string, Value> $named * @param array<string, AstNode> $namedNodes */ public function __construct(array $positional, array $positionalNodes, array $named, array $namedNodes, ListSeparator $separator) { $this->positional = $positional; $this->positionalNodes = $positionalNodes; $this->named = $named; $this->namedNodes = $namedNodes; $this->separator = $separator; } /** * @return list<Value> */ public function getPositional(): array { return $this->positional; } /** * @return list<AstNode> */ public function getPositionalNodes(): array { return $this->positionalNodes; } /** * @return array<string, Value> */ public function getNamed(): array { return $this->named; } /** * @return array<string, AstNode> */ public function getNamedNodes(): array { return $this->namedNodes; } public function getSeparator(): ListSeparator { return $this->separator; } } PKCA#]#y;�!!Osystem/helixultimate/vendor/scssphp/scssphp/src/Evaluation/LoadedStylesheet.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Evaluation; use ScssPhp\ScssPhp\Ast\Sass\Statement\Stylesheet; use ScssPhp\ScssPhp\Importer\Importer; /** * The result of loading a stylesheet via {@see EvaluateVisitor::loadStylesheet}. * * @internal */ final class LoadedStylesheet { /** * The stylesheet itself. */ private readonly Stylesheet $stylesheet; private readonly Importer $importer; /** * Whether this load counts as a dependency. * * That is, whether this was (transitively) loaded through a load path or * importer rather than relative to the entrypoint. */ private readonly bool $dependency; public function __construct(Stylesheet $stylesheet, Importer $importer, bool $dependency) { $this->stylesheet = $stylesheet; $this->importer = $importer; $this->dependency = $dependency; } public function getStylesheet(): Stylesheet { return $this->stylesheet; } public function getImporter(): Importer { return $this->importer; } public function isDependency(): bool { return $this->dependency; } } PKCA#]�%��8system/helixultimate/vendor/scssphp/scssphp/src/Warn.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; use ScssPhp\ScssPhp\Evaluation\EvaluationContext; final class Warn { /** * Prints a warning message associated with the current `@import` or function call. * * This may only be called within a custom function or importer callback. */ public static function warning(string $message): void { self::reportWarning($message, null); } /** * Prints a deprecation warning message associated with the current `@import` or function call. * * This may only be called within a custom function or importer callback. */ public static function deprecation(string $message): void { self::reportWarning($message, Deprecation::userAuthored); } public static function forDeprecation(string $message, Deprecation $deprecation): void { self::reportWarning($message, $deprecation); } private static function reportWarning(string $message, ?Deprecation $deprecation): void { EvaluationContext::getCurrent()->warn($message, $deprecation); } } PKCA#]�>W��?system/helixultimate/vendor/scssphp/scssphp/src/OutputStyle.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; enum OutputStyle: string { case EXPANDED = 'expanded'; case COMPRESSED = 'compressed'; /** * Converts a string to an output style. * * Using this method allows to write code which will support both * versions 1.12+ and 2.0 of Scssphp. In 1.x, OutputStyle was using * string constants. */ public static function fromString(string $string): OutputStyle { return match ($string) { 'expanded' => self::EXPANDED, 'compressed' => self::COMPRESSED, default => throw new \InvalidArgumentException('Invalid output style'), }; } /** * Converts an output style to a string supported by {@see OutputStyle::fromString()}. * * Using this method allows to write code which will support both * versions 1.12+ and 2.0 of Scssphp. * The returned string representation is guaranteed to be compatible * between 1.12 and 2.0. */ public static function toString(OutputStyle $outputStyle): string { return $outputStyle->value; } } PKCA#]}��3��Nsystem/helixultimate/vendor/scssphp/scssphp/src/Extend/EmptyExtensionStore.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Extend; use ScssPhp\ScssPhp\Ast\Sass\Statement\ExtendRule; use ScssPhp\ScssPhp\Ast\Selector\SelectorList; use ScssPhp\ScssPhp\Ast\Selector\SimpleSelector; use ScssPhp\ScssPhp\Extend\ExtensionStore; use ScssPhp\ScssPhp\Util\Box; /** * An {@see ExtensionStore} that contains no extensions and can have no extensions * added. * * @internal */ final class EmptyExtensionStore implements ExtensionStore { public function isEmpty(): bool { return true; } public function getSimpleSelectors(): array { return []; } public function extensionsWhereTarget(callable $callback): iterable { return []; } public function addSelector(SelectorList $selector, ?array $mediaContext): Box { throw new \BadMethodCallException("addSelector() can't be called for a const ExtensionStore."); } public function addExtension(SelectorList $extender, SimpleSelector $target, ExtendRule $extend, ?array $mediaContext): void { throw new \BadMethodCallException("addExtension() can't be called for a const ExtensionStore."); } public function addExtensions(iterable $extensionStores): void { throw new \BadMethodCallException("addExtensions() can't be called for a const ExtensionStore."); } public function clone(): array { /** @var \SplObjectStorage<SelectorList, Box<SelectorList>> $map */ $map = new \SplObjectStorage(); return [new EmptyExtensionStore(), $map]; } } PKCA#]Ͽ�S��Lsystem/helixultimate/vendor/scssphp/scssphp/src/Extend/SimpleSelectorMap.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Extend; use ScssPhp\ScssPhp\Ast\Selector\SimpleSelector; /** * @template T * @template-extends \SplObjectStorage<SimpleSelector, T> * * @internal */ final class SimpleSelectorMap extends \SplObjectStorage { public function getHash(object $object): string { \assert($object instanceof SimpleSelector); // For SimpleSelector, selectors that are equal by value semantic are exactly the ones that have the same string representation. return (string) $object; } } PKCA#]�VEo��Qsystem/helixultimate/vendor/scssphp/scssphp/src/Extend/ConcreteExtensionStore.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Extend; use ScssPhp\ScssPhp\Ast\Css\CssMediaQuery; use ScssPhp\ScssPhp\Ast\Sass\Statement\ExtendRule; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelector; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelectorComponent; use ScssPhp\ScssPhp\Ast\Selector\CompoundSelector; use ScssPhp\ScssPhp\Ast\Selector\PlaceholderSelector; use ScssPhp\ScssPhp\Ast\Selector\PseudoSelector; use ScssPhp\ScssPhp\Ast\Selector\SelectorList; use ScssPhp\ScssPhp\Ast\Selector\SimpleSelector; use ScssPhp\ScssPhp\Exception\SassException; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Exception\SimpleSassException; use ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Util\Box; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Util\IterableUtil; use ScssPhp\ScssPhp\Util\ListUtil; use ScssPhp\ScssPhp\Util\ModifiableBox; use SourceSpan\FileSpan; /** * @internal */ final class ConcreteExtensionStore implements ExtensionStore { /** * A map from all simple selectors in the stylesheet to the selector lists * that contain them. * * This is used to find which selectors an `@extend` applies to and adjust * them. * * @var SimpleSelectorMap<ObjectSet<ModifiableBox<SelectorList>>> */ private readonly SimpleSelectorMap $selectors; /** * A map from all extended simple selectors to the sources of those * extensions. * * @var SimpleSelectorMap<ComplexSelectorMap<Extension>> */ private SimpleSelectorMap $extensions; /** * A map from all simple selectors in extenders to the extensions that those * extenders define. * * @var SimpleSelectorMap<list<Extension>> */ private SimpleSelectorMap $extensionsByExtender; /** * A map from CSS selectors to the media query contexts they're defined in. * * This tracks the contexts in which each selector's style rule is defined. * If a rule is defined at the top level, it doesn't have an entry. * * @var \SplObjectStorage<ModifiableBox<SelectorList>, list<CssMediaQuery>> */ private readonly \SplObjectStorage $mediaContexts; /** * @var \SplObjectStorage<SimpleSelector, int> */ private \SplObjectStorage $sourceSpecificity; /** * @var \SplObjectStorage<ComplexSelector, mixed> */ private readonly \SplObjectStorage $originals; private readonly ExtendMode $mode; /** * Extends $selector with $source extender and $targets extendees. * * This works as though `source {@extend target}` were written in the * stylesheet, with the exception that $target can contain compound * selectors which must be extended as a unit. */ public static function extend(SelectorList $selector, SelectorList $source, SelectorList $targets, FileSpan $span): SelectorList { return self::extendOrReplace($selector, $source, $targets, ExtendMode::allTargets, $span); } /** * Returns a copy of $selector with $targets replaced by $source. */ public static function replace(SelectorList $selector, SelectorList $source, SelectorList $targets, FileSpan $span): SelectorList { return self::extendOrReplace($selector, $source, $targets, ExtendMode::replace, $span); } /** * A helper function for {@see extend} and {@see replace}. */ private static function extendOrReplace(SelectorList $selector, SelectorList $source, SelectorList $targets, ExtendMode $mode, FileSpan $span): SelectorList { $extender = ConcreteExtensionStore::createForMode($mode); if (!$selector->isInvisible()) { foreach ($selector->getComponents() as $component) { $extender->originals->offsetSet($component); } } foreach ($targets->getComponents() as $complex) { $compound = $complex->getSingleCompound(); if ($compound === null) { throw new SassScriptException("Can't extend complex selector $complex."); } $extensions = new SimpleSelectorMap(); foreach ($compound->getComponents() as $simple) { $extensionMap = new ComplexSelectorMap(); foreach ($source->getComponents() as $sourceComplex) { $extensionMap[$sourceComplex] = new Extension($sourceComplex, $simple, $span, optional: true); } $extensions[$simple] = $extensionMap; } $selector = $extender->extendList($selector, $extensions); } return $selector; } /** * @param SimpleSelectorMap<ObjectSet<ModifiableBox<SelectorList>>> $selectors * @param SimpleSelectorMap<ComplexSelectorMap<Extension>> $extensions * @param SimpleSelectorMap<list<Extension>> $extensionsByExtender * @param \SplObjectStorage<ModifiableBox<SelectorList>, list<CssMediaQuery>> $mediaContexts * @param \SplObjectStorage<SimpleSelector, int> $sourceSpecificity * @param \SplObjectStorage<ComplexSelector, mixed> $originals */ private function __construct( SimpleSelectorMap $selectors, SimpleSelectorMap $extensions, SimpleSelectorMap $extensionsByExtender, \SplObjectStorage $mediaContexts, \SplObjectStorage $sourceSpecificity, \SplObjectStorage $originals, ExtendMode $mode, ) { $this->selectors = $selectors; $this->extensions = $extensions; $this->extensionsByExtender = $extensionsByExtender; $this->mediaContexts = $mediaContexts; $this->sourceSpecificity = $sourceSpecificity; $this->originals = $originals; $this->mode = $mode; } public static function create(): self { return self::createForMode(ExtendMode::normal); } private static function createForMode(ExtendMode $mode): self { /** @var \SplObjectStorage<ModifiableBox<SelectorList>, list<CssMediaQuery>> $mediaContexts */ $mediaContexts = new \SplObjectStorage(); /** @var \SplObjectStorage<SimpleSelector, int> $sourceSpecificity */ $sourceSpecificity = new \SplObjectStorage(); /** @var \SplObjectStorage<ComplexSelector, mixed> $originals */ $originals = new \SplObjectStorage(); return new self( new SimpleSelectorMap(), new SimpleSelectorMap(), new SimpleSelectorMap(), $mediaContexts, $sourceSpecificity, $originals, $mode, ); } public function isEmpty(): bool { return \count($this->extensions) === 0; } public function getSimpleSelectors(): array { return iterator_to_array($this->selectors); } public function extensionsWhereTarget(callable $callback): iterable { foreach ($this->extensions as $simple) { if (!$callback($simple)) { continue; } $sources = $this->extensions[$simple]; foreach ($sources->getValues() as $extension) { if ($extension instanceof MergedExtension) { foreach ($extension->unmerge() as $leafExtension) { if (!$leafExtension->isOptional) { yield $leafExtension; } } } elseif (!$extension->isOptional) { yield $extension; } } } } public function addSelector(SelectorList $selector, ?array $mediaContext): Box { $originalSelector = $selector; if (!$originalSelector->isInvisible()) { foreach ($originalSelector->getComponents() as $component) { $this->originals->offsetSet($component); } } if (\count($this->extensions) !== 0) { try { $selector = $this->extendList($originalSelector, $this->extensions, $mediaContext); } catch (SassException $e) { throw new SimpleSassException("From {$e->getSpan()->message('')}\n" . $e->getOriginalMessage(), $e->getSpan(), $e); } } $modifiableSelector = new ModifiableBox($selector); if ($mediaContext !== null) { $this->mediaContexts->offsetSet($modifiableSelector, $mediaContext); } $this->registerSelector($selector, $modifiableSelector); return $modifiableSelector->seal(); } /** * Registers the {@see SimpleSelector}s in $list to point to $selector in * {@see selectors}. * * @param ModifiableBox<SelectorList> $selector */ private function registerSelector(SelectorList $list, ModifiableBox $selector): void { foreach ($list->getComponents() as $complex) { foreach ($complex->getComponents() as $component) { foreach ($component->getSelector()->getComponents() as $simple) { if (!isset($this->selectors[$simple])) { /** @var ObjectSet<ModifiableBox<SelectorList>> $set */ $set = new ObjectSet(); $this->selectors->offsetSet($simple, $set); } $this->selectors[$simple]->add($selector); if ($simple instanceof PseudoSelector && $simple->getSelector() !== null) { $this->registerSelector($simple->getSelector(), $selector); } } } } } public function addExtension(SelectorList $extender, SimpleSelector $target, ExtendRule $extend, ?array $mediaContext): void { $selectors = $this->selectors[$target] ?? null; $existingExtensions = $this->extensionsByExtender[$target] ?? null; $newExtensions = null; $sources = $this->extensions[$target] ??= new ComplexSelectorMap(); foreach ($extender->getComponents() as $complex) { if ($complex->isUseless()) { continue; } $extension = new Extension($complex, $target, $extend->getSpan(), $mediaContext, $extend->isOptional()); $existingExtension = $sources[$complex] ?? null; if ($existingExtension !== null) { // If there's already an extend from $extender to $target, we don't need // to re-run the extension. We may need to mark the extension as // mandatory, though. $sources[$complex] = MergedExtension::merge($existingExtension, $extension); continue; } $sources[$complex] = $extension; foreach ($this->simpleSelectors($complex) as $simple) { $extensionsByExtender = $this->extensionsByExtender[$simple] ?? []; $extensionsByExtender[] = $extension; $this->extensionsByExtender[$simple] = $extensionsByExtender; // Only source specificity for the original selector is relevant. // Selectors generated by `@extend` don't get new specificity. $this->sourceSpecificity[$simple] ??= $complex->getSpecificity(); } if ($selectors !== null || $existingExtensions !== null) { /** @var ComplexSelectorMap<Extension> $newExtensions */ $newExtensions ??= new ComplexSelectorMap(); $newExtensions[$complex] = $extension; } } if ($newExtensions === null) { return; } /** @var SimpleSelectorMap<ComplexSelectorMap<Extension>> $newExtensionsByTarget */ $newExtensionsByTarget = new SimpleSelectorMap(); $newExtensionsByTarget[$target] = $newExtensions; if ($existingExtensions !== null) { // Reload the list of existing extensions as it is an array, not an object. $existingExtensions = $this->extensionsByExtender[$target]; $additionalExtensions = $this->extendExistingExtensions($existingExtensions, $newExtensionsByTarget); if ($additionalExtensions !== null) { Util::mapAddAll2($newExtensionsByTarget, $additionalExtensions); } } if ($selectors !== null) { $this->extendExistingSelectors($selectors, $newExtensionsByTarget); } } /** * Returns an iterable of all simple selectors in $complex. * * @return iterable<SimpleSelector> */ private function simpleSelectors(ComplexSelector $complex): iterable { foreach ($complex->getComponents() as $component) { foreach ($component->getSelector()->getComponents() as $simple) { yield $simple; if ($simple instanceof PseudoSelector && $simple->getSelector() !== null) { foreach ($simple->getSelector()->getComponents() as $pseudoComplex) { yield from $this->simpleSelectors($pseudoComplex); } } } } } /** * Extend $extensions using $newExtensions. * * Note that this does duplicate some work done by * {@see extendExistingSelectors}, but it's necessary to expand each extension's * extender separately without reference to the full selector list, so that * relevant results don't get trimmed too early. * * Returns extensions that should be added to $newExtensions before * extending selectors in order to properly handle extension loops such as: * * .c {x: y; @extend .a} * .x.y.a {@extend .b} * .z.b {@extend .c} * * Returns `null` if there are no extensions to add. * * @param list<Extension> $extensions * @param SimpleSelectorMap<ComplexSelectorMap<Extension>> $newExtensions * @return SimpleSelectorMap<ComplexSelectorMap<Extension>>|null */ private function extendExistingExtensions(array $extensions, SimpleSelectorMap $newExtensions): ?SimpleSelectorMap { $additionalExtensions = null; foreach ($extensions as $extension) { $sources = $this->extensions[$extension->target]; try { $selectors = $this->extendComplex($extension->extender->selector, $newExtensions, $extension->mediaContext); if ($selectors === null) { continue; } } catch (SassException $e) { throw $e->withAdditionalSpan($extension->extender->selector->getSpan(), 'target selector', $e); } // If the output contains the original complex selector, there's no need // to recreate it. $containsExtension = EquatableUtil::equals($selectors[0], $extension->extender->selector); if ($containsExtension) { $selectors = array_slice($selectors, 1); } foreach ($selectors as $complex) { $withExtender = $extension->withExtender($complex); $existingExtension = $sources[$complex] ?? null; if ($existingExtension !== null) { $sources[$complex] = MergedExtension::merge($existingExtension, $withExtender); } else { $sources[$complex] = $withExtender; foreach ($complex->getComponents() as $component) { foreach ($component->getSelector()->getComponents() as $simple) { $extensionsByExtender = $this->extensionsByExtender[$simple] ?? []; $extensionsByExtender[] = $withExtender; $this->extensionsByExtender[$simple] = $extensionsByExtender; } } if ($newExtensions->offsetExists($extension->target)) { /** @var SimpleSelectorMap<ComplexSelectorMap<Extension>> $additionalExtensions */ $additionalExtensions ??= new SimpleSelectorMap(); if (!isset($additionalExtensions[$extension->target])) { /** @var ComplexSelectorMap<Extension> $additionalSources */ $additionalSources = new ComplexSelectorMap(); $additionalExtensions[$extension->target] = $additionalSources; } else { $additionalSources = $additionalExtensions[$extension->target]; } $additionalSources[$complex] = $withExtender; } } } } return $additionalExtensions; } /** * Extend $selectors using $newExtensions. * * @param ObjectSet<ModifiableBox<SelectorList>> $selectors * @param SimpleSelectorMap<ComplexSelectorMap<Extension>> $newExtensions */ private function extendExistingSelectors(ObjectSet $selectors, SimpleSelectorMap $newExtensions): void { foreach ($selectors as $selector) { $oldValue = $selector->getValue(); try { $selector->setValue($this->extendList($selector->getValue(), $newExtensions, $this->mediaContexts[$selector] ?? null)); } catch (SassException $e) { throw new SimpleSassException("From {$oldValue->getSpan()->message('')}\n" . $e->getOriginalMessage(), $e->getSpan(), $e); } // If no extends actually happened (for example because unification // failed), we don't need to re-register the selector. if ($oldValue === $selector->getValue()) { continue; } $this->registerSelector($selector->getValue(), $selector); } } /** * @param iterable<ExtensionStore> $extensionStores */ public function addExtensions(iterable $extensionStores): void { /** @var list<Extension>|null $extensionsToExtend */ $extensionsToExtend = null; $selectorsToExtend = null; $newExtensions = null; foreach ($extensionStores as $extensionStore) { if ($extensionStore->isEmpty()) { continue; } \assert($extensionStore instanceof ConcreteExtensionStore); $this->sourceSpecificity->addAll($extensionStore->sourceSpecificity); foreach ($extensionStore->extensions as $target) { $newSources = $extensionStore->extensions->getInfo(); // Private selectors can't be extended across module boundaries. if ($target instanceof PlaceholderSelector && $target->isPrivate()) { continue; } $extensionsForTarget = $this->extensionsByExtender[$target] ?? null; if ($extensionsForTarget !== null) { $extensionsToExtend ??= []; array_push($extensionsToExtend, ...$extensionsForTarget); } // Find existing selectors to extend. $selectorsForTarget = $this->selectors[$target] ?? null; if ($selectorsForTarget !== null) { if ($selectorsToExtend === null) { /** @var ObjectSet<ModifiableBox<SelectorList>> $selectorsToExtend */ $selectorsToExtend = new ObjectSet(); } $selectorsToExtend->addAll($selectorsForTarget); } $existingSources = $this->extensions[$target] ?? null; if ($existingSources !== null) { foreach ($newSources as $extender) { $extension = $newSources->getInfo(); if (isset($existingSources[$extender])) { $extension = MergedExtension::merge($existingSources[$extender], $extension); } $existingSources[$extender] = $extension; if ($extensionsForTarget !== null || $selectorsForTarget !== null) { /** @var SimpleSelectorMap<ComplexSelectorMap<Extension>> $newExtensions */ $newExtensions ??= new SimpleSelectorMap(); if (!isset($newExtensions[$target])) { /** @var ComplexSelectorMap<Extension> $newMap */ $newMap = new ComplexSelectorMap(); $newExtensions[$target] = $newMap; } $newExtensions[$target][$extender] = $extension; } } } else { $this->extensions[$target] = clone $newSources; if ($extensionsForTarget !== null || $selectorsForTarget !== null) { /** @var SimpleSelectorMap<ComplexSelectorMap<Extension>> $newExtensions */ $newExtensions ??= new SimpleSelectorMap(); $newExtensions[$target] = clone $newSources; } } } } if ($newExtensions !== null) { // We can ignore the return value here because it's only useful for extend // loops, which can't exist across module boundaries. if ($extensionsToExtend !== null) { $this->extendExistingExtensions($extensionsToExtend, $newExtensions); } if ($selectorsToExtend !== null) { $this->extendExistingSelectors($selectorsToExtend, $newExtensions); } } } /** * Extends $list using $extensions. * * @param SimpleSelectorMap<ComplexSelectorMap<Extension>> $extensions * @param list<CssMediaQuery>|null $mediaQueryContext */ private function extendList(SelectorList $list, SimpleSelectorMap $extensions, ?array $mediaQueryContext = null): SelectorList { $extended = null; foreach ($list->getComponents() as $i => $complex) { $result = $this->extendComplex($complex, $extensions, $mediaQueryContext); \assert($result === null || \count($result) > 0, "extendComplex($complex) should return null rather than [] if extension fails."); if ($result === null) { if ($extended !== null) { $extended[] = $complex; } } else { $extended ??= $i === 0 ? [] : array_slice($list->getComponents(), 0, $i); array_push($extended, ...$result); } } if ($extended === null) { return $list; } return new SelectorList($this->trim($extended, $this->originals->offsetExists(...)), $list->getSpan()); } /** * Extends $complex using $extensions, and returns the contents of a * {@see SelectorList}. * * @param SimpleSelectorMap<ComplexSelectorMap<Extension>> $extensions * @param list<CssMediaQuery>|null $mediaQueryContext * @return list<ComplexSelector>|null */ private function extendComplex(ComplexSelector $complex, SimpleSelectorMap $extensions, ?array $mediaQueryContext): ?array { if (\count($complex->getLeadingCombinators()) > 1) { return null; } // The complex selectors that each compound selector in $complex->getComponents() // can expand to. // // For example, given // // .a .b {...} // .x .y {@extend .b} // // this will contain // // [ // [.a], // [.b, .x .y] // ] // $extendedNotExpanded = null; $isOriginal = $this->originals->offsetExists($complex); foreach ($complex->getComponents() as $i => $component) { $extended = $this->extendCompound($component, $extensions, $mediaQueryContext, $isOriginal); \assert($extended === null || \count($extended) > 0, "extendCompound($component) should return null rather than [] if extension fails."); if ($extended === null) { if ($extendedNotExpanded !== null) { $extendedNotExpanded[] = [ new ComplexSelector( [], [$component], $complex->getSpan(), $complex->getLineBreak() ), ]; } } elseif ($extendedNotExpanded !== null) { $extendedNotExpanded[] = $extended; } elseif ($i !== 0) { $extendedNotExpanded = [ [ new ComplexSelector( $complex->getLeadingCombinators(), array_slice($complex->getComponents(), 0, $i), $complex->getSpan(), $complex->getLineBreak(), ), ], $extended, ]; } elseif (\count($complex->getLeadingCombinators()) === 0) { $extendedNotExpanded = [$extended]; } else { $newExtended = []; foreach ($extended as $newComplex) { if ( \count($newComplex->getLeadingCombinators()) === 0 || EquatableUtil::listEquals($complex->getLeadingCombinators(), $newComplex->getLeadingCombinators()) ) { $newExtended[] = new ComplexSelector( $complex->getLeadingCombinators(), $newComplex->getComponents(), $complex->getSpan(), $complex->getLineBreak() || $newComplex->getLineBreak(), ); } } $extendedNotExpanded = [$newExtended]; } } if ($extendedNotExpanded === null) { return null; } $first = true; return iterator_to_array(self::expandIterable(ExtendUtil::paths($extendedNotExpanded), function ($path) use (&$first, $complex) { return array_map(function (ComplexSelector $outputComplex) use (&$first, $complex) { // Make sure that copies of $complex retain their status as "original" // selectors. This includes selectors that are modified because a :not() // was extended into. if ($first && $this->originals->offsetExists($complex)) { $this->originals->offsetSet($outputComplex); } $first = false; return $outputComplex; }, ExtendUtil::weave($path, $complex->getSpan(), $complex->getLineBreak())); }), false); } /** * Extends $component using $extensions, and returns the contents of a * {@see SelectorList}. * * The $inOriginal parameter indicates whether this is in an original * complex selector, meaning that the compound should not be trimmed out. * * @param SimpleSelectorMap<ComplexSelectorMap<Extension>> $extensions * @param list<CssMediaQuery>|null $mediaQueryContext * @return list<ComplexSelector>|null */ private function extendCompound(ComplexSelectorComponent $component, SimpleSelectorMap $extensions, ?array $mediaQueryContext, bool $inOriginal): ?array { // If there's more than one target and they all need to match, we track // which targets are actually extended. $targetsUsed = $this->mode === ExtendMode::normal || \count($extensions) < 2 ? null : new SimpleSelectorMap(); $simples = $component->getSelector()->getComponents(); // The complex selectors produced from each simple selector in the compound selector. $options = null; foreach ($simples as $i => $simple) { $extended = $this->extendSimple($simple, $extensions, $mediaQueryContext, $targetsUsed); \assert($extended === null || \count($extended) > 0, "extendSimple($simple) should return null rather than [] if extension fails."); if ($extended === null) { if ($options !== null) { $options[] = [$this->extenderForSimple($simple)]; } } else { if ($options === null) { $options = []; if ($i !== 0) { $options[] = [$this->extenderForCompound(array_slice($simples, 0, $i), $component->getSpan())]; } } array_push($options, ...$extended); } } if ($options === null) { return null; } /** * If {@see mode} isn't {@see ExtendMode::normal} and we didn't use all the targets in * $extensions, extension fails for $component. */ if ($targetsUsed !== null && \count($targetsUsed) !== \count($extensions)) { return null; } // Optimize for the simple case of a single simple selector that doesn't // need any unification. if (\count($options) === 1) { $extenders = $options[0]; $result = null; foreach ($extenders as $extender) { $extender->assertCompatibleMediaContext($mediaQueryContext); $complex = $extender->selector->withAdditionalCombinators($component->getCombinators()); if ($complex->isUseless()) { continue; } $result ??= []; $result[] = $complex; } return $result; } // Find all paths through $options. In this case, each path represents a // different unification of the base selector. For example, if we have: // // .a.b {...} // .w .x {@extend .a} // .y .z {@extend .b} // // then $options is `[[.a, .w .x], [.b, .y .z]]` and `paths($options)` is // // [ // [.a, .b], // [.a, .y .z], // [.w .x, .b], // [.w .x, .y .z] // ] // // We then unify each path to get a list of complex selectors: // // [ // [.a.b], // [.y .a.z], // [.w .x.b], // [.w .y .x.z, .y .w .x.z] // ] // // And finally flatten them to get: // // [ // .a.b, // .y .a.z, // .w .x.b, // .w .y .x.z, // .y .w .x.z // ] $extenderPaths = ExtendUtil::paths($options); $result = []; if ($this->mode !== ExtendMode::replace) { // The first path is always the original selector. We can't just return // $component directly because selector pseudos may be modified, but we // don't have to do any unification. $result[] = new ComplexSelector([], [new ComplexSelectorComponent( new CompoundSelector(iterator_to_array(self::expandIterable($extenderPaths[0], function (Extender $extender) { \assert(\count($extender->selector->getComponents()) === 1); return ListUtil::last($extender->selector->getComponents())->getSelector()->getComponents(); }), false), $component->getSelector()->getSpan()), $component->getCombinators(), $component->getSpan(), )], $component->getSpan()); } foreach (array_slice($extenderPaths, $this->mode === ExtendMode::replace ? 0 : 1) as $path) { $extended = $this->unifyExtenders($path, $mediaQueryContext, $component->getSpan()); if ($extended === null) { continue; } foreach ($extended as $complex) { $withCombinators = $complex->withAdditionalCombinators($component->getCombinators()); if (!$withCombinators->isUseless()) { $result[] = $withCombinators; } } } // If we're preserving the original selector, mark the first unification as // such so {@see trim} doesn't get rid of it. $isOriginal = fn (ComplexSelector $complex) => false; if ($inOriginal && $this->mode !== ExtendMode::replace) { $original = $result[0]; $isOriginal = fn (ComplexSelector $complex) => EquatableUtil::equals($complex, $original); } return $this->trim($result, $isOriginal); } /** * Returns a list of {@see ComplexSelector}s that match the intersection of * elements matched by all of $extenders' selectors. * * The $span will be used for the new selectors. * * @param list<Extender> $extenders * @param list<CssMediaQuery>|null $mediaQueryContext * @return list<ComplexSelector>|null */ private function unifyExtenders(array $extenders, ?array $mediaQueryContext, FileSpan $span): ?array { $toUnify = []; $originals = null; $originalsLineBreak = false; foreach ($extenders as $extender) { if ($extender->isOriginal) { $originals ??= []; $finalExtenderComponent = ListUtil::last($extender->selector->getComponents()); \assert(\count($finalExtenderComponent->getCombinators()) === 0); foreach ($finalExtenderComponent->getSelector()->getComponents() as $component) { $originals[] = $component; } $originalsLineBreak = $originalsLineBreak || $extender->selector->getLineBreak(); } elseif ($extender->selector->isUseless()) { return null; } else { $toUnify[] = $extender->selector; } } if ($originals !== null) { array_unshift($toUnify, new ComplexSelector([], [ new ComplexSelectorComponent(new CompoundSelector($originals, $span), [], $span), ], $span, $originalsLineBreak)); } $complexes = ExtendUtil::unifyComplex($toUnify, $span); if ($complexes === null) { return null; } foreach ($extenders as $extender) { $extender->assertCompatibleMediaContext($mediaQueryContext); } return $complexes; } /** * @param SimpleSelectorMap<ComplexSelectorMap<Extension>> $extensions * @param list<CssMediaQuery>|null $mediaQueryContext * @param SimpleSelectorMap<mixed>|null $targetsUsed * @return list<list<Extender>>|null */ private function extendSimple(SimpleSelector $simple, SimpleSelectorMap $extensions, ?array $mediaQueryContext, ?SimpleSelectorMap $targetsUsed): ?array { // Extends $simple without extending the contents of any selector pseudos // it contains. $withoutPseudo = function (SimpleSelector $simple) use ($extensions, $targetsUsed) { $extensionsForSimple = $extensions[$simple] ?? null; if ($extensionsForSimple === null) { return null; } $targetsUsed?->offsetSet($simple); $result = []; if ($this->mode !== ExtendMode::replace) { $result[] = $this->extenderForSimple($simple); } /** @var Extension $extension */ foreach ($extensionsForSimple->getValues() as $extension) { $result[] = $extension->extender; } return $result; }; if ($simple instanceof PseudoSelector && $simple->getSelector() !== null) { $extended = $this->extendPseudo($simple, $extensions, $mediaQueryContext); if ($extended !== null) { return array_map(fn ($pseudo) => $withoutPseudo($pseudo) ?? [$this->extenderForSimple($pseudo)], $extended); } } $result = $withoutPseudo($simple); if ($result === null) { return null; } return [$result]; } /** * Returns an {@see Extender} composed solely of a compound selector containing * $simples. * * @param list<SimpleSelector> $simples */ private function extenderForCompound(array $simples, FileSpan $span): Extender { $compound = new CompoundSelector($simples, $span); return Extender::create( new ComplexSelector([], [new ComplexSelectorComponent($compound, [], $span)], $span), $this->sourceSpecificityFor($compound), true, ); } /** * Returns an {@see Extender} composed solely of $simple. */ private function extenderForSimple(SimpleSelector $simple): Extender { return Extender::create( new ComplexSelector([], [new ComplexSelectorComponent( new CompoundSelector([$simple], $simple->getSpan()), [], $simple->getSpan(), )], $simple->getSpan()), $this->sourceSpecificity[$simple] ?? 0, true, ); } /** * Extends $pseudo using $extensions, and returns a list of resulting * pseudo selectors. * * This requires that $pseudo have a selector argument. * * @param SimpleSelectorMap<ComplexSelectorMap<Extension>> $extensions * @param list<CssMediaQuery>|null $mediaQueryContext * @return list<PseudoSelector>|null */ private function extendPseudo(PseudoSelector $pseudo, SimpleSelectorMap $extensions, ?array $mediaQueryContext): ?array { $selector = $pseudo->getSelector(); if ($selector === null) { throw new \InvalidArgumentException("Selector $pseudo must have a selector argument."); } $extended = $this->extendList($selector, $extensions, $mediaQueryContext); if ($extended === $selector) { return null; } // For `:not()`, we usually want to get rid of any complex selectors because // that will cause the selector to fail to parse on all browsers at time of // writing. We can keep them if either the original selector had a complex // selector, or the result of extending has only complex selectors, because // either way we aren't breaking anything that isn't already broken. $complexes = $extended->getComponents(); if ( $pseudo->getNormalizedName() === 'not' && !IterableUtil::any($selector->getComponents(), fn ($complex) => \count($complex->getComponents()) > 1) && IterableUtil::any($extended->getComponents(), fn ($complex) => \count($complex->getComponents()) === 1) ) { $complexes = array_filter($extended->getComponents(), fn ($complex) => \count($complex->getComponents()) <= 1); } $complexes = iterator_to_array(self::expandIterable($complexes, function (ComplexSelector $complex) use ($pseudo) { $innerPseudo = $complex->getSingleCompound()?->getSingleSimple(); if (!$innerPseudo instanceof PseudoSelector) { return [$complex]; } $innerSelector = $innerPseudo->getSelector(); if ($innerSelector === null) { return [$complex]; } switch ($pseudo->getNormalizedName()) { case 'not': // In theory, if there's a `:not` nested within another `:not`, the // inner `:not`'s contents should be unified with the return value. // For example, if `:not(.foo)` extends `.bar`, `:not(.bar)` should // become `.foo:not(.bar)`. However, this is a narrow edge case and // supporting it properly would make this code and the code calling it // a lot more complicated, so it's not supported for now. if (!\in_array($innerPseudo->getNormalizedName(), ['is', 'matches', 'where'], true)) { return []; } return $innerSelector->getComponents(); case 'is': case 'matches': case 'where': case 'any': case 'current': case 'nth-child': case 'nth-last-child': // As above, we could theoretically support :not within :matches, but // doing so would require this method and its callers to handle much // more complex cases that likely aren't worth the pain. if ($innerPseudo->getName() !== $pseudo->getName()) { return []; } if ($innerPseudo->getArgument() !== $pseudo->getArgument()) { return []; } return $innerSelector->getComponents(); case 'has': case 'host': case 'host-context': case 'slotted': // We can't expand nested selectors here, because each layer adds an // additional layer of semantics. For example, `:has(:has(img))` // doesn't match `<div><img></div>` but `:has(img)` does. return [$complex]; default: return []; } }), false); // Older browsers support `:not`, but only with a single complex selector. // In order to support those browsers, we break up the contents of a `:not` // unless it originally contained a selector list. if ($pseudo->getNormalizedName() === 'not' && \count($selector->getComponents()) === 1) { $result = array_map(fn (ComplexSelector $complex) => $pseudo->withSelector(new SelectorList([$complex], $selector->getSpan())), $complexes); return \count($result) === 0 ? null : $result; } return [$pseudo->withSelector(new SelectorList($complexes, $selector->getSpan()))]; } /** * @template E * @template T * @param iterable<E> $elements * @param callable(E): iterable<T> $callback * @return \Traversable<T> * * @param-immediately-invoked-callable $callback */ private static function expandIterable(iterable $elements, callable $callback): \Traversable { foreach ($elements as $element) { yield from $callback($element); } } /** * Removes elements from $selectors if they're subselectors of other * elements. * * The $isOriginal callback indicates which selectors are original to the * document, and thus should never be trimmed. * * @param list<ComplexSelector> $selectors * @param callable(ComplexSelector): bool $isOriginal * @return list<ComplexSelector> * * @param-immediately-invoked-callable $isOriginal */ private function trim(array $selectors, callable $isOriginal): array { // Avoid truly horrific quadratic behavior. if (\count($selectors) > 100) { return $selectors; } // This is n² on the sequences, but only comparing between separate // sequences should limit the quadratic behavior. We iterate from last to // first and reverse the result so that, if two selectors are identical, we // keep the first one. /** @var list<ComplexSelector> $result */ $result = []; $numOriginals = 0; for ($i = \count($selectors) - 1; $i >= 0; $i--) { $complex1 = $selectors[$i]; if ($isOriginal($complex1)) { // Make sure we don't include duplicate originals, which could happen if // a style rule extends a component of its own selector. for ($j = 0; $j < $numOriginals; $j++) { if (EquatableUtil::equals($result[$j], $complex1)) { // Rotates the slice one index higher $element = $result[$j]; for ($k = 0; $k <= $j; $k++) { $next = $result[$k]; $result[$k] = $element; $element = $next; } // Rotating the slice preserves the list status of the array, but phpstan does not recognize it. \assert(array_is_list($result)); continue 2; } } $numOriginals++; array_unshift($result, $complex1); continue; } // The maximum specificity of the sources that caused $complex1 to be // generated. In order for $complex1 to be removed, there must be another // selector that's a superselector of it *and* that has specificity // greater or equal to this. $maxSpecificity = 0; foreach ($complex1->getComponents() as $component) { $maxSpecificity = max($maxSpecificity, $this->sourceSpecificityFor($component->getSelector())); } // Look in $result rather than $selectors for selectors after $i. This // ensures that we aren't comparing against a selector that's already been // trimmed, and thus that if there are two identical selectors only one is // trimmed. if (IterableUtil::any($result, fn (ComplexSelector $complex2) => $complex2->getSpecificity() >= $maxSpecificity && $complex2->isSuperselector($complex1))) { continue; } if (IterableUtil::any(array_slice($selectors, 0, $i), fn (ComplexSelector $complex2) => $complex2->getSpecificity() >= $maxSpecificity && $complex2->isSuperselector($complex1))) { continue; } array_unshift($result, $complex1); } return $result; } /** * Returns the maximum specificity for sources that went into producing * $compound. */ private function sourceSpecificityFor(CompoundSelector $compound): int { $specificity = 0; foreach ($compound->getComponents() as $simple) { $specificity = max($specificity, $this->sourceSpecificity[$simple] ?? 0); } return $specificity; } public function clone(): array { /** @var SimpleSelectorMap<ObjectSet<ModifiableBox<SelectorList>>> $newSelectors */ $newSelectors = new SimpleSelectorMap(); /** @var \SplObjectStorage<ModifiableBox<SelectorList>, list<CssMediaQuery>> $newMediaContexts */ $newMediaContexts = new \SplObjectStorage(); /** @var \SplObjectStorage<SelectorList, Box<SelectorList>> $oldToNewSelectors */ $oldToNewSelectors = new \SplObjectStorage(); foreach ($this->selectors as $simple) { $selectors = $this->selectors->getInfo(); /** @var ObjectSet<ModifiableBox<SelectorList>> $newSelectorSet */ $newSelectorSet = new ObjectSet(); $newSelectors[$simple] = $newSelectorSet; foreach ($selectors as $selector) { $newSelector = new ModifiableBox($selector->getValue()); $newSelectorSet->add($newSelector); $oldToNewSelectors[$selector->getValue()] = $newSelector->seal(); if (isset($this->mediaContexts[$selector])) { $newMediaContexts[$newSelector] = $this->mediaContexts[$selector]; } } } /** @var SimpleSelectorMap<ComplexSelectorMap<Extension>> $newExtensions */ $newExtensions = new SimpleSelectorMap(); foreach ($this->extensions as $simple) { $newExtensions[$simple] = clone $this->extensions->getInfo(); } return [new ConcreteExtensionStore( $newSelectors, $newExtensions, clone $this->extensionsByExtender, $newMediaContexts, clone $this->sourceSpecificity, clone $this->originals, ExtendMode::normal, ), $oldToNewSelectors]; } } PKCA#]V^�*KKDsystem/helixultimate/vendor/scssphp/scssphp/src/Extend/ObjectSet.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Extend; /** * @template T of object * @template-implements \IteratorAggregate<int, T> * * @internal */ final class ObjectSet implements \IteratorAggregate { /** * @var \SplObjectStorage<T, mixed> */ private readonly \SplObjectStorage $storage; public function __construct() { $this->storage = new \SplObjectStorage(); } /** * @param T $value */ public function contains(object $value): bool { return $this->storage->offsetExists($value); } /** * @param T $value */ public function add(object $value): void { $this->storage->offsetSet($value); } /** * @param ObjectSet<T> $set */ public function addAll(self $set): void { $this->storage->addAll($set->storage); } public function getIterator(): \Traversable { return $this->storage; } } PKCA#]MD�Y� � Csystem/helixultimate/vendor/scssphp/scssphp/src/Extend/Extender.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Extend; use ScssPhp\ScssPhp\Ast\Css\CssMediaQuery; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelector; use ScssPhp\ScssPhp\Exception\SimpleSassException; use ScssPhp\ScssPhp\Util\EquatableUtil; /** * A selector that's extending another selector, such as `A` in `A {@extend B}`. * @internal */ final class Extender { public readonly ComplexSelector $selector; /** * The minimum specificity required for any selector generated from this * extender. */ public readonly int $specificity; /** * Whether this extender represents a selector that was originally in the * document, rather than one defined with `@extend`. */ public readonly bool $isOriginal; /** * The extension that created this Extender. * * Not all {@see Extender}s are created by extensions. Some simply represent the * original selectors that exist in the document. */ private readonly ?Extension $extension; private function __construct(ComplexSelector $selector, ?int $specificity = null, bool $original = false, ?Extension $extension = null) { $this->selector = $selector; $this->specificity = $specificity ?? $selector->getSpecificity(); $this->isOriginal = $original; $this->extension = $extension; } public static function create(ComplexSelector $selector, ?int $specificity = null, bool $original = false): self { return new Extender($selector, $specificity, $original); } public static function forExtension(ComplexSelector $selector, Extension $extension): self { return new Extender($selector, extension: $extension); } /** * @param list<CssMediaQuery>|null $mediaContext */ public function assertCompatibleMediaContext(?array $mediaContext): void { if ($this->extension === null) { return; } $expectedMediaContext = $this->extension->mediaContext; if ($expectedMediaContext === null) { return; } if ($mediaContext !== null && EquatableUtil::listEquals($expectedMediaContext, $mediaContext)) { return; } throw new SimpleSassException('You may not @extend selectors across media queries.', $this->extension->span); } } PKCA#]�,QkkIsystem/helixultimate/vendor/scssphp/scssphp/src/Extend/ExtensionStore.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Extend; use ScssPhp\ScssPhp\Ast\Css\CssMediaQuery; use ScssPhp\ScssPhp\Ast\Sass\Statement\ExtendRule; use ScssPhp\ScssPhp\Ast\Selector\SelectorList; use ScssPhp\ScssPhp\Ast\Selector\SimpleSelector; use ScssPhp\ScssPhp\Util\Box; /** * Tracks selectors and extensions, and applies the latter to the former. * * @internal */ interface ExtensionStore { public function isEmpty(): bool; /** * @return SimpleSelector[] */ public function getSimpleSelectors(): array; // TODO check the right representation for this /** * @param callable(SimpleSelector): bool $callback * @return iterable<Extension> * * @param-immediately-invoked-callable $callback */ public function extensionsWhereTarget(callable $callback): iterable; /** * @param list<CssMediaQuery>|null $mediaContext * @return Box<SelectorList> */ public function addSelector(SelectorList $selector, ?array $mediaContext): Box; /** * @param list<CssMediaQuery>|null $mediaContext */ public function addExtension(SelectorList $extender, SimpleSelector $target, ExtendRule $extend, ?array $mediaContext): void; /** * @param iterable<ExtensionStore> $extensionStores */ public function addExtensions(iterable $extensionStores): void; /** * @return array{ExtensionStore, \SplObjectStorage<SelectorList, Box<SelectorList>>} */ public function clone(): array; } PKCA#]�8�7��Dsystem/helixultimate/vendor/scssphp/scssphp/src/Extend/Extension.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Extend; use ScssPhp\ScssPhp\Ast\Css\CssMediaQuery; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelector; use ScssPhp\ScssPhp\Ast\Selector\SimpleSelector; use SourceSpan\FileSpan; /** * The state of an extension for a given extender. * * The target of the extension is represented externally, in the map that * contains this extender. * * @internal */ class Extension { /** * The extender (such as `A` in `A {@extend B}`). */ public readonly Extender $extender; /** * The selector that's being extended. */ public readonly SimpleSelector $target; /** * The media query context to which this extension is restricted, or `null` * if it can apply within any context. * * @var list<CssMediaQuery>|null */ public readonly ?array $mediaContext; public readonly bool $isOptional; public readonly FileSpan $span; /** * @param list<CssMediaQuery>|null $mediaContext */ public function __construct(ComplexSelector $extender, SimpleSelector $target, FileSpan $span, ?array $mediaContext = null, bool $optional = false) { $this->extender = Extender::forExtension($extender, $this); $this->target = $target; $this->mediaContext = $mediaContext; $this->isOptional = $optional; $this->span = $span; } public function withExtender(ComplexSelector $newExtender): Extension { return new Extension($newExtender, $this->target, $this->span, $this->mediaContext, $this->isOptional); } } PKCA#]7�Ae��Esystem/helixultimate/vendor/scssphp/scssphp/src/Extend/ExtendMode.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Extend; /** * Different modes in which extension can run. * * @internal */ enum ExtendMode { /** * Normal mode, used with the `@extend` rule. * * This preserves existing selectors and extends each target individually. */ case normal; /** * Replace mode, used by the `selector-replace()` function. * * This replaces existing selectors and requires every target to match to * extend a given compound selector. */ case replace; /** * All-targets mode, used by the `selector-extend()` function. * * This preserves existing selectors but requires every target to match to * extend a given compound selector. */ case allTargets; } PKCA#]���ssMsystem/helixultimate/vendor/scssphp/scssphp/src/Extend/ComplexSelectorMap.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Extend; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelector; /** * @template T * @template-extends \SplObjectStorage<ComplexSelector, T> * * @internal */ final class ComplexSelectorMap extends \SplObjectStorage { public function getHash(object $object): string { \assert($object instanceof ComplexSelector); // For ComplexSelector, selectors that are equal by value semantic are exactly the ones that have the same string representation. return (string) $object; } /** * @return iterable<T> */ public function getValues(): iterable { foreach ($this as $selector) { yield $this[$selector]; } } } PKCA#]g|/_� � Jsystem/helixultimate/vendor/scssphp/scssphp/src/Extend/MergedExtension.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Extend; use ScssPhp\ScssPhp\Exception\SimpleSassException; use ScssPhp\ScssPhp\Util\EquatableUtil; /** * An {@see Extension} created by merging two {@see Extension}s with the same extender * and target. * * This is used when multiple mandatory extensions exist to ensure that both of * them are marked as resolved. * * @internal */ final class MergedExtension extends Extension { public readonly Extension $left; public readonly Extension $right; private function __construct(Extension $left, Extension $right) { $this->left = $left; $this->right = $right; parent::__construct($left->extender->selector, $left->target, $left->span, $left->mediaContext ?? $right->mediaContext, true); } public static function merge(Extension $left, Extension $right): Extension { if (!EquatableUtil::equals($left->extender->selector, $right->extender->selector) || !EquatableUtil::equals($left->target, $right->target)) { throw new \InvalidArgumentException('$left and $right aren\'t the same extension.'); } if ($left->mediaContext !== null && $right->mediaContext !== null && !EquatableUtil::listEquals($left->mediaContext, $right->mediaContext)) { $location = $left->span->message(''); throw new SimpleSassException("From $location\nYou may not @extend the same selector from within different media queries.", $right->span); } // If one extension is optional and doesn't add a special media context, it // doesn't need to be merged. if ($right->isOptional && $right->mediaContext === null) { return $left; } if ($left->isOptional && $left->mediaContext === null) { return $right; } return new MergedExtension($left, $right); } /** * Returns all leaf-node [Extension]s in the tree of [MergedExtension]s. * * @return \Traversable<Extension> */ public function unmerge(): \Traversable { if ($this->left instanceof MergedExtension) { yield from $this->left->unmerge(); } else { yield $this->left; } if ($this->right instanceof MergedExtension) { yield from $this->right->unmerge(); } else { yield $this->right; } } } PKCA#]T���9�9�Esystem/helixultimate/vendor/scssphp/scssphp/src/Extend/ExtendUtil.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Extend; use ScssPhp\ScssPhp\Ast\Css\CssValue; use ScssPhp\ScssPhp\Ast\Selector\Combinator; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelector; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelectorComponent; use ScssPhp\ScssPhp\Ast\Selector\CompoundSelector; use ScssPhp\ScssPhp\Ast\Selector\IDSelector; use ScssPhp\ScssPhp\Ast\Selector\PlaceholderSelector; use ScssPhp\ScssPhp\Ast\Selector\PseudoSelector; use ScssPhp\ScssPhp\Ast\Selector\QualifiedName; use ScssPhp\ScssPhp\Ast\Selector\SelectorList; use ScssPhp\ScssPhp\Ast\Selector\SimpleSelector; use ScssPhp\ScssPhp\Ast\Selector\TypeSelector; use ScssPhp\ScssPhp\Ast\Selector\UniversalSelector; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Util\IterableUtil; use ScssPhp\ScssPhp\Util\ListUtil; use ScssPhp\ScssPhp\Util\SpanUtil; use SourceSpan\FileSpan; /** * @internal */ final class ExtendUtil { /** * Pseudo-selectors that can only meaningfully appear in the first component of * a complex selector. */ private const ROOTISH_PSEUDO_CLASSES = ['root', 'scope', 'host', 'host-context']; /** * Returns the contents of a {@see SelectorList} that matches only elements that are * matched by every complex selector in $complexes. * * If no such list can be produced, returns `null`. * * @param list<ComplexSelector> $complexes * * @return list<ComplexSelector>|null */ public static function unifyComplex(array $complexes, FileSpan $span): ?array { if (\count($complexes) === 1) { return $complexes; } $unifiedBase = null; $leadingCombinator = null; $trailingCombinator = null; foreach ($complexes as $complex) { if ($complex->isUseless()) { return null; } if (\count($complex->getComponents()) === 1 && \count($complex->getLeadingCombinators()) !== 0) { $newLeadingCombinator = \count($complex->getLeadingCombinators()) === 1 ? $complex->getLeadingCombinators()[0] : null; if ($leadingCombinator !== null && !EquatableUtil::equals($newLeadingCombinator, $leadingCombinator)) { return null; } $leadingCombinator = $newLeadingCombinator; } $base = $complex->getLastComponent(); if (\count($base->getCombinators()) !== 0) { $newTrailingCombinator = \count($base->getCombinators()) === 1 ? $base->getCombinators()[0] : null; if ($trailingCombinator !== null && $newTrailingCombinator !== $trailingCombinator) { return null; } $trailingCombinator = $newTrailingCombinator; } if ($unifiedBase === null) { $unifiedBase = $base->getSelector()->getComponents(); } else { foreach ($base->getSelector()->getComponents() as $simple) { $unifiedBase = $simple->unify($unifiedBase); if ($unifiedBase === null) { return null; } } } } $withoutBases = []; $hasLineBreak = false; foreach ($complexes as $complex) { if (\count($complex->getComponents()) > 1) { $withoutBases[] = new ComplexSelector($complex->getLeadingCombinators(), array_slice($complex->getComponents(), 0, \count($complex->getComponents()) - 1), $complex->getSpan(), $complex->getLineBreak()); } if ($complex->getLineBreak()) { $hasLineBreak = true; } } \assert($unifiedBase !== null); $base = new ComplexSelector( $leadingCombinator === null ? [] : [$leadingCombinator], [new ComplexSelectorComponent(new CompoundSelector($unifiedBase, $span), $trailingCombinator === null ? [] : [$trailingCombinator], $span)], $span, $hasLineBreak ); return self::weave($withoutBases === [] ? [$base] : array_merge(ListUtil::exceptLast($withoutBases), [ListUtil::last($withoutBases)->concatenate($base, $span)]), $span); } /** * Returns a {@see CompoundSelector} that matches only elements that are matched by * both $compound1 and $compound2. * * If no such selector can be produced, returns `null`. */ public static function unifyCompound(CompoundSelector $compound1, CompoundSelector $compound2): ?CompoundSelector { $result = $compound2->getComponents(); foreach ($compound1->getComponents() as $simple) { $unified = $simple->unify($result); if ($unified === null) { return null; } $result = $unified; } return new CompoundSelector($result, $compound1->getSpan()); } /** * Returns a {@see SimpleSelector} that matches only elements that are matched by * both $selector1 and $selector2, which must both be either * {@see UniversalSelector}s or {@see TypeSelector}s. * * If no such selector can be produced, returns `null`. */ public static function unifyUniversalAndElement(SimpleSelector $selector1, SimpleSelector $selector2): ?SimpleSelector { [$namespace1, $name1] = self::namespaceAndName($selector1, 'selector1'); [$namespace2, $name2] = self::namespaceAndName($selector2, 'selector2'); if ($namespace1 === $namespace2 || $namespace2 === '*') { $namespace = $namespace1; } elseif ($namespace1 === '*') { $namespace = $namespace2; } else { return null; } if ($name1 === $name2 || $name2 === null) { $name = $name1; } elseif ($name1 === null) { $name = $name2; } else { return null; } if ($name === null) { return new UniversalSelector($selector1->getSpan(), $namespace); } return new TypeSelector(new QualifiedName($name, $namespace), $selector1->getSpan()); } /** * Returns the namespace and name for $selector, which must be a * {@see UniversalSelector} or a {@see TypeSelector}. * * The $name parameter is used for error reporting. * * @return array{string|null, string|null} The namespace and the name */ private static function namespaceAndName(SimpleSelector $selector, string $name): array { if ($selector instanceof UniversalSelector) { return [$selector->getNamespace(), null]; } if ($selector instanceof TypeSelector) { return [$selector->getName()->getNamespace(), $selector->getName()->getName()]; } throw new \InvalidArgumentException("Argument $name must be a UniversalSelector or a TypeSelector."); } /** * Expands "parenthesized selectors" in $complexes. * * That is, if we have `.A .B {@extend .C}` and `.D .C {...}`, this * conceptually expands into `.D .C, .D (.A .B)`, and this function translates * `.D (.A .B)` into `.D .A .B, .A .D .B`. For thoroughness, `.A.D .B` would * also be required, but including merged selectors results in exponential * output for very little gain. * * The selector `.D (.A .B)` is represented as the list `[.D, .A .B]`. * * The $span will be used for any new combined selectors. * * If $forceLineBreak is `true`, this will mark all returned complex selectors * as having line breaks. * * @param list<ComplexSelector> $complexes * * @return list<ComplexSelector> */ public static function weave(array $complexes, FileSpan $span, bool $forceLineBreak = false): array { if (\count($complexes) === 1) { $complex = $complexes[0]; if (!$forceLineBreak || $complex->getLineBreak()) { return $complexes; } return [ new ComplexSelector($complex->getLeadingCombinators(), $complex->getComponents(), $complex->getSpan(), true), ]; } $prefixes = [$complexes[0]]; foreach (array_slice($complexes, 1) as $complex) { if (\count($complex->getComponents()) === 1) { foreach ($prefixes as $i => $prefix) { $prefixes[$i] = $prefix->concatenate($complex, $span, $forceLineBreak); } continue; } $newPrefixes = []; foreach ($prefixes as $prefix) { foreach (self::weaveParents($prefix, $complex, $span) ?? [] as $parentPrefix) { $newPrefixes[] = $parentPrefix->withAdditionalComponent(ListUtil::last($complex->getComponents()), $span, $forceLineBreak); } } $prefixes = $newPrefixes; } return $prefixes; } /** * Interweaves $prefix's components with $base's components _other than * the last_. * * Returns all possible orderings of the selectors in the inputs (including * using unification) that maintain the relative ordering of the input. For * example, given `.foo .bar` and `.baz .bang div`, this would return `.foo * .bar .baz .bang div`, `.foo .bar.baz .bang div`, `.foo .baz .bar .bang div`, * `.foo .baz .bar.bang div`, `.foo .baz .bang .bar div`, and so on until `.baz * .bang .foo .bar div`. * * Semantically, for selectors `P` and `C`, this returns all selectors `PC_i` * such that the union over all `i` of elements matched by `PC_i` is identical * to the intersection of all elements matched by `C` and all descendants of * elements matched by `P`. Some `PC_i` are elided to reduce the size of the * output. * * The $span will be used for any new combined selectors. * * Returns `null` if this intersection is empty. * * @return list<ComplexSelector>|null */ private static function weaveParents(ComplexSelector $prefix, ComplexSelector $base, FileSpan $span): ?array { $leadingCombinators = self::mergeLeadingCombinators($prefix->getLeadingCombinators(), $base->getLeadingCombinators()); if ($leadingCombinators === null) { return null; } // Make queues of _only_ the parent selectors. The prefix only contains // parents, but the complex selector has a target that we don't want to weave // in. $queue1 = $prefix->getComponents(); $queue2 = ListUtil::exceptLast($base->getComponents()); $finalCombinators = self::mergeTrailingCombinators($queue1, $queue2, $span); if ($finalCombinators === null) { return null; } // Make sure all selectors that are required to be at the root are unified // with one another. $rootish1 = self::firstIfRootish($queue1); $rootish2 = self::firstIfRootish($queue2); if ($rootish1 !== null && $rootish2 !== null) { $rootish = self::unifyCompound($rootish1->getSelector(), $rootish2->getSelector()); if ($rootish === null) { return null; } array_unshift($queue1, new ComplexSelectorComponent($rootish, $rootish1->getCombinators(), $rootish1->getSpan())); array_unshift($queue2, new ComplexSelectorComponent($rootish, $rootish2->getCombinators(), $rootish2->getSpan())); } elseif ($rootish1 !== null || $rootish2 !== null) { // If there's only one rootish selector, it should only appear in the first // position of the resulting selector. We can ensure that happens by adding // it to the beginning of _both_ queues. $rootish = $rootish1 ?? $rootish2; \assert($rootish !== null); array_unshift($queue1, $rootish); array_unshift($queue2, $rootish); } $groups1 = self::groupSelectors($queue1); $groups2 = self::groupSelectors($queue2); /** @var list<list<ComplexSelectorComponent>> $lcs */ $lcs = ListUtil::longestCommonSubsequence($groups2, $groups1, function ($group1, $group2) use ($span) { if (EquatableUtil::listEquals($group1, $group2)) { return $group1; } if (self::complexIsParentSuperselector($group1, $group2)) { return $group2; } if (self::complexIsParentSuperselector($group2, $group1)) { return $group1; } if (!self::mustUnify($group1, $group2)) { return null; } $unified = self::unifyComplex([new ComplexSelector([], $group1, $span), new ComplexSelector([], $group2, $span)], $span); if ($unified === null) { return null; } if (\count($unified) > 1) { return null; } return $unified[0]->getComponents(); }); $choices = []; foreach ($lcs as $group) { $newChoice = []; /** @var list<list<list<ComplexSelectorComponent>>> $chunks */ $chunks = self::chunks($groups1, $groups2, fn($sequence) => self::complexIsParentSuperselector($sequence[0], $group)); foreach ($chunks as $chunk) { $flattened = []; foreach ($chunk as $chunkGroup) { $flattened = array_merge($flattened, $chunkGroup); } $newChoice[] = $flattened; } /** @var list<list<ComplexSelectorComponent>> $groups1 */ /** @var list<list<ComplexSelectorComponent>> $groups2 */ $choices[] = $newChoice; $choices[] = [$group]; array_shift($groups1); array_shift($groups2); } $newChoice = []; /** @var list<list<list<ComplexSelectorComponent>>> $chunks */ $chunks = self::chunks($groups1, $groups2, fn($sequence) => count($sequence) === 0); foreach ($chunks as $chunk) { $flattened = []; foreach ($chunk as $chunkGroup) { $flattened = array_merge($flattened, $chunkGroup); } $newChoice[] = $flattened; } $choices[] = $newChoice; foreach ($finalCombinators as $finalCombinator) { $choices[] = $finalCombinator; } $choices = array_filter($choices, fn($choice) => $choice !== []); $paths = self::paths($choices); return array_map(function (array $path) use ($leadingCombinators, $prefix, $base, $span) { $result = []; foreach ($path as $group) { $result = array_merge($result, $group); } return new ComplexSelector($leadingCombinators, $result, $span, $prefix->getLineBreak() || $base->getLineBreak()); }, $paths); } /** * If the first element of $queue has a `:root` selector, removes and returns * that element. * * @param list<ComplexSelectorComponent> $queue * * @return ComplexSelectorComponent|null */ private static function firstIfRootish(array &$queue): ?ComplexSelectorComponent { if (empty($queue)) { return null; } $first = $queue[0]; foreach ($first->getSelector()->getComponents() as $simple) { if ($simple instanceof PseudoSelector && $simple->isClass() && \in_array($simple->getNormalizedName(), self::ROOTISH_PSEUDO_CLASSES, true)) { array_shift($queue); return $first; } } return null; } /** * Returns a leading combinator list that's compatible with both $combinators1 * and $combinators2. * * Returns `null` if the combinator lists can't be unified. * * @param list<CssValue<Combinator>>|null $combinators1 * @param list<CssValue<Combinator>>|null $combinators2 * * @return list<CssValue<Combinator>>|null */ private static function mergeLeadingCombinators(?array $combinators1, ?array $combinators2): ?array { if ($combinators1 === null) { return null; } if ($combinators2 === null) { return null; } if (\count($combinators1) > 1) { return null; } if (\count($combinators2) > 1) { return null; } if (\count($combinators1) === 0) { return $combinators2; } if (\count($combinators2) === 0) { return $combinators1; } return $combinators1 === $combinators2 ? $combinators1 : null; } /** * Extracts trailing {@see ComplexSelectorComponent}s with trailing combinators from * $components1 and $components2 and merges them together into a single list. * * Each element in the returned list is a set of choices for a particular * position in a complex selector. Each choice is the contents of a complex * selector, which is to say a list of complex selector components. The union * of each path through these choices will match the full set of necessary * elements. * * If there are no combinators to be merged, returns an empty list. If the * sequences can't be merged, returns `null`. * * The $span will be used for any new combined selectors. * * @param list<ComplexSelectorComponent> $components1 * @param list<ComplexSelectorComponent> $components2 * @param list<list<list<ComplexSelectorComponent>>> $result * * @return list<list<list<ComplexSelectorComponent>>>|null */ private static function mergeTrailingCombinators(array &$components1, array &$components2, FileSpan $span, array $result = []): ?array { $combinators1 = \count($components1) === 0 ? [] : ListUtil::last($components1)->getCombinators(); $combinators2 = \count($components2) === 0 ? [] : ListUtil::last($components2)->getCombinators(); if (\count($combinators1) === 0 && \count($combinators2) === 0) { return $result; } if (count($combinators1) > 1 || count($combinators2) > 1) { return null; } // This code looks complicated, but it's actually just a bunch of special // cases for interactions between different combinators. $combinator1 = $combinators1[0] ?? null; $combinator2 = $combinators2[0] ?? null; if ($combinator1 !== null && $combinator2 !== null) { $component1 = array_pop($components1); assert($component1 instanceof ComplexSelectorComponent); $component2 = array_pop($components2); assert($component2 instanceof ComplexSelectorComponent); if ($combinator1->getValue() === Combinator::FOLLOWING_SIBLING && $combinator2->getValue() === Combinator::FOLLOWING_SIBLING) { if ($component1->getSelector()->isSuperselector($component2->getSelector())) { array_unshift($result, [[$component2]]); } elseif ($component2->getSelector()->isSuperselector($component1->getSelector())) { array_unshift($result, [[$component1]]); } else { $choices = [ [$component1, $component2], [$component2, $component1], ]; $unified = self::unifyCompound($component1->getSelector(), $component2->getSelector()); if ($unified !== null) { $choices[] = [new ComplexSelectorComponent($unified, [$combinator1], $span)]; } array_unshift($result, $choices); } } elseif (($combinator1->getValue() === Combinator::FOLLOWING_SIBLING && $combinator2->getValue() === Combinator::NEXT_SIBLING) || ($combinator1->getValue() === Combinator::NEXT_SIBLING && $combinator2->getValue() === Combinator::FOLLOWING_SIBLING)) { $followingSiblingComponent = $combinator1->getValue() === Combinator::FOLLOWING_SIBLING ? $component1 : $component2; $nextSiblingComponent = $combinator1->getValue() === Combinator::FOLLOWING_SIBLING ? $component2 : $component1; if ($followingSiblingComponent->getSelector()->isSuperselector($nextSiblingComponent->getSelector())) { array_unshift($result, [[$nextSiblingComponent]]); } else { $unified = self::unifyCompound($followingSiblingComponent->getSelector(), $nextSiblingComponent->getSelector()); $choices = [ [$followingSiblingComponent, $nextSiblingComponent], ]; if ($unified !== null) { $choices[] = [new ComplexSelectorComponent($unified, $nextSiblingComponent->getCombinators(), $span)]; } array_unshift($result, $choices); } } elseif ($combinator1->getValue() === Combinator::CHILD && ($combinator2->getValue() === Combinator::NEXT_SIBLING || $combinator2->getValue() === Combinator::FOLLOWING_SIBLING)) { array_unshift($result, [[$component2]]); $components1[] = $component1; } elseif ($combinator2->getValue() === Combinator::CHILD && ($combinator1->getValue() === Combinator::NEXT_SIBLING || $combinator1->getValue() === Combinator::FOLLOWING_SIBLING)) { array_unshift($result, [[$component1]]); $components2[] = $component2; } elseif (EquatableUtil::equals($combinator1, $combinator2)) { $unified = self::unifyCompound($component1->getSelector(), $component2->getSelector()); if ($unified === null) { return null; } array_unshift($result, [[new ComplexSelectorComponent($unified, [$combinator1], $span)]]); } else { return null; } return self::mergeTrailingCombinators($components1, $components2, $span, $result); } if ($combinator1 !== null) { $component1 = array_pop($components1); \assert($component1 instanceof ComplexSelectorComponent); if ($combinator1->getValue() === Combinator::CHILD && \count($components2) > 0 && ListUtil::last($components2)->getSelector()->isSuperselector($component1->getSelector())) { array_pop($components2); } array_unshift($result, [[$component1]]); return self::mergeTrailingCombinators($components1, $components2, $span, $result); } $component2 = array_pop($components2); \assert($component2 instanceof ComplexSelectorComponent); assert($combinator2 !== null); if ($combinator2->getValue() === Combinator::CHILD && \count($components1) > 0 && ListUtil::last($components1)->getSelector()->isSuperselector($component2->getSelector())) { array_pop($components1); } array_unshift($result, [[$component2]]); return self::mergeTrailingCombinators($components1, $components2, $span, $result); } /** * Returns whether $complex1 and $complex2 need to be unified to produce a * valid combined selector. * * This is necessary when both selectors contain the same unique simple * selector, such as an ID. * * @param list<ComplexSelectorComponent> $complex1 * @param list<ComplexSelectorComponent> $complex2 */ private static function mustUnify(array $complex1, array $complex2): bool { $uniqueSelectors = []; foreach ($complex1 as $component) { foreach ($component->getSelector()->getComponents() as $simple) { if (self::isUnique($simple)) { $uniqueSelectors[] = $simple; } } } if (\count($uniqueSelectors) === 0) { return false; } foreach ($complex2 as $component) { foreach ($component->getSelector()->getComponents() as $simple) { if (self::isUnique($simple) && EquatableUtil::iterableContains($uniqueSelectors, $simple)) { return true; } } } return false; } /** * Returns whether a {@see CompoundSelector} may contain only one simple selector of * the same type as $simple. */ private static function isUnique(SimpleSelector $simple): bool { return $simple instanceof IDSelector || ($simple instanceof PseudoSelector && $simple->isElement()); } /** * Returns all orderings of initial subsequences of $queue1 and $queue2. * * The $done callback is used to determine the extent of the initial * subsequences. It's called with each queue until it returns `true`. * * This destructively removes the initial subsequences of $queue1 and * $queue2. * * For example, given `(A B C | D E)` and `(1 2 | 3 4 5)` (with `|` denoting * the boundary of the initial subsequence), this would return `[(A B C 1 2), * (1 2 A B C)]`. The queues would then contain `(D E)` and `(3 4 5)`. * * @template T * * @param list<T> $queue1 * @param list<T> $queue2 * @param callable(list<T>): bool $done * * @return list<list<T>> * * @param-immediately-invoked-callable $done */ private static function chunks(array &$queue1, array &$queue2, callable $done): array { $chunk1 = []; while (!$done($queue1)) { $element = array_shift($queue1); if ($element === null) { throw new \LogicException('Cannot remove an element from an empty queue'); } $chunk1[] = $element; } $chunk2 = []; while (!$done($queue2)) { $element = array_shift($queue2); if ($element === null) { throw new \LogicException('Cannot remove an element from an empty queue'); } $chunk2[] = $element; } if (empty($chunk1) && empty($chunk2)) { return []; } if (empty($chunk1)) { return [$chunk2]; } if (empty($chunk2)) { return [$chunk1]; } return [ array_merge($chunk1, $chunk2), array_merge($chunk2, $chunk1), ]; } /** * Returns a list of all possible paths through the given lists. * * For example, given `[[1, 2], [3, 4], [5]]`, this returns: * * ``` * [[1, 3, 5], * [2, 3, 5], * [1, 4, 5], * [2, 4, 5]] * ``` * * @template T * * @param array<list<T>> $choices * * @return list<list<T>> */ public static function paths(array $choices): array { return array_reduce($choices, function (array $paths, array $choice) { $newPaths = []; foreach ($choice as $option) { foreach ($paths as $path) { $path[] = $option; $newPaths[] = $path; } } return $newPaths; }, [[]]); } /** * Returns $complex, grouped into the longest possible sub-lists such that * {@see ComplexSelectorComponent}s without combinators only appear at the end of * sub-lists. * * For example, `(A B > C D + E ~ G)` is grouped into * `[(A) (B > C) (D + E ~ G)]`. * * @param iterable<ComplexSelectorComponent> $complex * * @return list<list<ComplexSelectorComponent>> */ private static function groupSelectors(iterable $complex): array { $groups = []; $group = []; foreach ($complex as $component) { $group[] = $component; if (\count($component->getCombinators()) === 0) { $groups[] = $group; $group = []; } } if ($group !== []) { $groups[] = $group; } return $groups; } /** * Returns whether $list1 is a superselector of $list2. * * That is, whether $list1 matches every element that $list2 matches, as well * as possibly additional elements. * * @param list<ComplexSelector> $list1 * @param list<ComplexSelector> $list2 */ public static function listIsSuperselector(array $list1, array $list2): bool { foreach ($list2 as $complex1) { foreach ($list1 as $complex2) { if ($complex2->isSuperselector($complex1)) { continue 2; } } return false; } return true; } /** * Like {@see complexIsSuperselector}, but compares $complex1 and $complex2 as * though they shared an implicit base {@see SimpleSelector}. * * For example, `B` is not normally a superselector of `B A`, since it doesn't * match elements that match `A`. However, it *is* a parent superselector, * since `B X` is a superselector of `B A X`. * * @param list<ComplexSelectorComponent> $complex1 * @param list<ComplexSelectorComponent> $complex2 */ private static function complexIsParentSuperselector(array $complex1, array $complex2): bool { if (\count($complex1) > \count($complex2)) { return false; } $bogusSpan = SpanUtil::bogusSpan(); $base = new ComplexSelectorComponent(new CompoundSelector([new PlaceholderSelector('<temp>', $bogusSpan)], $bogusSpan), [], $bogusSpan); $complex1[] = $base; $complex2[] = $base; return self::complexIsSuperselector($complex1, $complex2); } /** * Returns whether $complex1 is a superselector of $complex2. * * That is, whether $complex1 matches every element that $complex2 matches, as well * as possibly additional elements. * * @param list<ComplexSelectorComponent> $complex1 * @param list<ComplexSelectorComponent> $complex2 */ public static function complexIsSuperselector(array $complex1, array $complex2): bool { // Selectors with trailing operators are neither superselectors nor // subselectors. if (\count(ListUtil::last($complex1)->getCombinators()) !== 0) { return false; } if (\count(ListUtil::last($complex2)->getCombinators()) !== 0) { return false; } $i1 = 0; $i2 = 0; $previousCombinator = null; while (true) { $remaining1 = \count($complex1) - $i1; $remaining2 = \count($complex2) - $i2; if ($remaining1 === 0 || $remaining2 === 0) { return false; } // More complex selectors are never superselectors of less complex ones. if ($remaining1 > $remaining2) { return false; } $component1 = $complex1[$i1]; if (\count($component1->getCombinators()) > 1) { return false; } if ($remaining1 === 1) { if (IterableUtil::any($complex2, fn (ComplexSelectorComponent $parent) => \count($parent->getCombinators()) > 1)) { return false; } return self::compoundIsSuperselector( $component1->getSelector(), ListUtil::last($complex2)->getSelector(), $component1->getSelector()->hasComplicatedSuperselectorSemantics() ? array_slice($complex2, $i2, -1) : null ); } // Find the first index $endOfSubselector in $complex2 such that // `complex2.sublist(i2, endOfSubselector + 1)` is a subselector of // `$component1->getSelector()`. $endOfSubselector = $i2; while (true) { $component2 = $complex2[$endOfSubselector]; if (\count($component2->getCombinators()) > 1) { return false; } if (self::compoundIsSuperselector($component1->getSelector(), $component2->getSelector(), $component1->getSelector()->hasComplicatedSuperselectorSemantics() ? array_slice($complex2, $i2, $endOfSubselector - $i2) : null)) { break; } $endOfSubselector++; if ($endOfSubselector === \count($complex2) - 1) { // Stop before the superselector would encompass all of $complex2 // because we know $complex1 has more than one element, and consuming // all of $complex2 wouldn't leave anything for the rest of $complex1 // to match. return false; } } if (!self::compatibleWithPreviousCombinator($previousCombinator, array_slice($complex2, $i2, $endOfSubselector - $i2))) { return false; } $component2 = $complex2[$endOfSubselector]; $combinator1 = $component1->getCombinators()[0] ?? null; $combinator2 = $component2->getCombinators()[0] ?? null; if (!self::isSupercombinator($combinator1, $combinator2)) { return false; } $i1++; $i2 = $endOfSubselector + 1; $previousCombinator = $combinator1; if (\count($complex1) - $i1 === 1) { if ($combinator1 !== null && $combinator1->getValue() === Combinator::FOLLOWING_SIBLING) { // The selector `.foo ~ .bar` is only a superselector of selectors that // *exclusively* contain subcombinators of `~`. for ($index = $i2; $index < \count($complex2) - 1; $index++) { $component = $complex2[$index]; if (!self::isSupercombinator($combinator1, $component->getCombinators()[0] ?? null)) { return false; } } } elseif ($combinator1 !== null) { // `.foo > .bar` and `.foo + bar` aren't superselectors of any selectors // with more than one combinator. if (\count($complex2) - $i2 > 1) { return false; } } } } } /** * @param CssValue<Combinator>|null $previous * @param list<ComplexSelectorComponent> $parents */ private static function compatibleWithPreviousCombinator(?CssValue $previous, array $parents): bool { if ($parents === []) { return true; } if ($previous === null) { return true; } // The child and next sibling combinators require that the *immediate* // following component be a superselector. if ($previous->getValue() !== Combinator::FOLLOWING_SIBLING) { return false; } // The following sibling combinator does allow intermediate components, but // only if they're all siblings. foreach ($parents as $component) { $firstCombinator = $component->getCombinators()[0] ?? null; $firstCombinatorValue = $firstCombinator?->getValue(); if ($firstCombinatorValue !== Combinator::FOLLOWING_SIBLING && $firstCombinatorValue !== Combinator::NEXT_SIBLING) { return false; } } return true; } /** * Returns whether $combinator1 is a supercombinator of $combinator2. * * That is, whether `X $combinator1 Y` is a superselector of `X $combinator2 Y`. * * @param CssValue<Combinator>|null $combinator1 * @param CssValue<Combinator>|null $combinator2 */ private static function isSupercombinator(?CssValue $combinator1, ?CssValue $combinator2): bool { return EquatableUtil::equals($combinator1, $combinator2) || ($combinator1 === null && $combinator2 !== null && $combinator2->getValue() === Combinator::CHILD) || ($combinator1 !== null && $combinator1->getValue() === Combinator::FOLLOWING_SIBLING && $combinator2 !== null && $combinator2->getValue() === Combinator::NEXT_SIBLING); } /** * Returns whether $compound1 is a superselector of $compound2. * * That is, whether $compound1 matches every element that $compound2 matches, as well * as possibly additional elements. * * If $parents is passed, it represents the parents of $compound2. This is * relevant for pseudo selectors with selector arguments, where we may need to * know if the parent selectors in the selector argument match $parents. * * @param list<ComplexSelectorComponent>|null $parents */ public static function compoundIsSuperselector(CompoundSelector $compound1, CompoundSelector $compound2, ?array $parents = null): bool { if (!$compound1->hasComplicatedSuperselectorSemantics() && !$compound2->hasComplicatedSuperselectorSemantics()) { if (\count($compound1->getComponents()) > \count($compound2->getComponents())) { return false; } return IterableUtil::every( $compound1->getComponents(), fn (SimpleSelector $simple1) => IterableUtil::any($compound2->getComponents(), $simple1->isSuperselector(...)) ); } // Pseudo elements effectively change the target of a compound selector rather // than narrowing the set of elements to which it applies like other // selectors. As such, if either selector has a pseudo element, they both must // have the _same_ pseudo element. // // In addition, order matters when pseudo-elements are involved. The selectors // before them must $tuple1 = self::findPseudoElementIndexed($compound1); $tuple2 = self::findPseudoElementIndexed($compound2); if ($tuple1 !== null && $tuple2 !== null) { return $tuple1[0]->isSuperselector($tuple2[0]) && self::compoundComponentsIsSuperselector( array_slice($compound1->getComponents(), 0, $tuple1[1]), array_slice($compound2->getComponents(), 0, $tuple2[1]), $parents ) && self::compoundComponentsIsSuperselector( array_slice($compound1->getComponents(), $tuple1[1] + 1), array_slice($compound2->getComponents(), $tuple2[1] + 1), $parents ); } elseif ($tuple1 !== null || $tuple2 !== null) { return false; } // Every selector in `$compound1->getComponents()` must have a matching selector in // `$compound2->getComponents()`. foreach ($compound1->getComponents() as $simple1) { if ($simple1 instanceof PseudoSelector && $simple1->getSelector() !== null) { if (!self::selectorPseudoIsSuperselector($simple1, $compound2, $parents)) { return false; } } else { foreach ($compound2->getComponents() as $simple2) { if ($simple1->isSuperselector($simple2)) { continue 2; } } return false; } } return true; } /** * If $compound contains a pseudo-element, returns it and its index in * `$compound->getComponents()`. * * @return array{PseudoSelector, int}|null */ private static function findPseudoElementIndexed(CompoundSelector $compound): ?array { foreach ($compound->getComponents() as $i => $simple) { if ($simple instanceof PseudoSelector && $simple->isElement()) { return [$simple, $i]; } } return null; } /** * Like {@see compoundIsSuperselector} but operates on the underlying lists of * simple selectors. * * @param list<SimpleSelector> $compound1 * @param list<SimpleSelector> $compound2 * @param list<ComplexSelectorComponent>|null $parents */ private static function compoundComponentsIsSuperselector(array $compound1, array $compound2, ?array $parents = null): bool { if (\count($compound1) === 0) { return true; } $bogusSpan = SpanUtil::bogusSpan(); if (\count($compound2) === 0) { $compound2 = [new UniversalSelector($bogusSpan, '*')]; } return self::compoundIsSuperselector(new CompoundSelector($compound1, $bogusSpan), new CompoundSelector($compound2, $bogusSpan), $parents); } /** * Returns whether $pseudo1 is a superselector of $compound2. * * That is, whether $pseudo1 matches every element that $compound2 matches, as well * as possibly additional elements. * * This assumes that $pseudo1's `selector` argument is not `null`. * * If $parents is passed, it represents the parents of $compound2. This is * relevant for pseudo selectors with selector arguments, where we may need to * know if the parent selectors in the selector argument match $parents. * * @param list<ComplexSelectorComponent>|null $parents */ private static function selectorPseudoIsSuperselector(PseudoSelector $pseudo1, CompoundSelector $compound2, ?array $parents): bool { $selector1 = $pseudo1->getSelector(); if ($selector1 === null) { throw new \InvalidArgumentException("Selector $pseudo1 must have a selector argument."); } switch ($pseudo1->getNormalizedName()) { case 'is': case 'matches': case 'any': case 'where': $selectors = self::selectorPseudoArgs($compound2, $pseudo1->getName()); foreach ($selectors as $selector2) { if ($selector1->isSuperselector($selector2)) { return true; } } $componentWithParents = $parents; $componentWithParents[] = new ComplexSelectorComponent($compound2, [], $compound2->getSpan()); foreach ($selector1->getComponents() as $complex1) { if (\count($complex1->getLeadingCombinators()) === 0 && self::complexIsSuperselector($complex1->getComponents(), $componentWithParents)) { return true; } } return false; case 'has': case 'host': case 'host-context': $selectors = self::selectorPseudoArgs($compound2, $pseudo1->getName()); foreach ($selectors as $selector2) { if ($selector1->isSuperselector($selector2)) { return true; } } return false; case 'slotted': $selectors = self::selectorPseudoArgs($compound2, $pseudo1->getName(), false); foreach ($selectors as $selector2) { if ($selector1->isSuperselector($selector2)) { return true; } } return false; case 'not': foreach ($selector1->getComponents() as $complex) { if ($complex->isBogus()) { return false; } foreach ($compound2->getComponents() as $simple2) { if ($simple2 instanceof TypeSelector) { foreach ($complex->getLastComponent()->getSelector()->getComponents() as $simple1) { if ($simple1 instanceof TypeSelector && !$simple1->equals($simple2)) { continue 3; } } } elseif ($simple2 instanceof IDSelector) { foreach ($complex->getLastComponent()->getSelector()->getComponents() as $simple1) { if ($simple1 instanceof IDSelector && !$simple1->equals($simple2)) { continue 3; } } } elseif ($simple2 instanceof PseudoSelector && $simple2->getName() === $pseudo1->getName()) { $selector2 = $simple2->getSelector(); if ($selector2 === null) { continue; } if (self::listIsSuperselector($selector2->getComponents(), [$complex])) { continue 2; } } } return false; } return true; case 'current': $selectors = self::selectorPseudoArgs($compound2, $pseudo1->getName()); foreach ($selectors as $selector2) { if ($selector1->equals($selector2)) { return true; } } return false; case 'nth-child': case 'nth-last-child': foreach ($compound2->getComponents() as $pseudo2) { if (!$pseudo2 instanceof PseudoSelector) { continue; } if ($pseudo2->getName() !== $pseudo1->getName()) { continue; } if ($pseudo2->getArgument() !== $pseudo1->getArgument()) { continue; } $selector2 = $pseudo2->getSelector(); if ($selector2 === null) { continue; } if ($selector1->isSuperselector($selector2)) { return true; } } return false; default: throw new \LogicException('unreachache'); } } /** * Returns all the selector arguments of pseudo selectors in $compound with * the given $name. * * @return SelectorList[] */ private static function selectorPseudoArgs(CompoundSelector $compound, string $name, bool $isClass = true): array { $selectors = []; foreach ($compound->getComponents() as $simple) { if (!$simple instanceof PseudoSelector) { continue; } if ($simple->isClass() !== $isClass || $simple->getName() !== $name) { continue; } if ($simple->getSelector() === null) { continue; } $selectors[] = $simple->getSelector(); } return $selectors; } } PKCA#]��K0"0"=system/helixultimate/vendor/scssphp/scssphp/src/Formatter.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; use ScssPhp\ScssPhp\Formatter\OutputBlock; use ScssPhp\ScssPhp\SourceMap\SourceMapGenerator; /** * Base formatter * * @author Leaf Corcoran <leafot@gmail.com> * * @internal */ abstract class Formatter { /** * @var int */ public $indentLevel; /** * @var string */ public $indentChar; /** * @var string */ public $break; /** * @var string */ public $open; /** * @var string */ public $close; /** * @var string */ public $tagSeparator; /** * @var string */ public $assignSeparator; /** * @var bool */ public $keepSemicolons; /** * @var \ScssPhp\ScssPhp\Formatter\OutputBlock */ protected $currentBlock; /** * @var int */ protected $currentLine; /** * @var int */ protected $currentColumn; /** * @var \ScssPhp\ScssPhp\SourceMap\SourceMapGenerator|null */ protected $sourceMapGenerator; /** * @var string */ protected $strippedSemicolon; /** * Initialize formatter * * @api */ abstract public function __construct(); /** * Return indentation (whitespace) * * @return string */ protected function indentStr() { return ''; } /** * Return property assignment * * @api * * @param string $name * @param mixed $value * * @return string */ public function property($name, $value) { return rtrim($name) . $this->assignSeparator . $value . ';'; } /** * Return custom property assignment * differs in that you have to keep spaces in the value as is * * @api * * @param string $name * @param mixed $value * * @return string */ public function customProperty($name, $value) { return rtrim($name) . trim($this->assignSeparator) . $value . ';'; } /** * Output lines inside a block * * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block * * @return void */ protected function blockLines(OutputBlock $block) { $inner = $this->indentStr(); $glue = $this->break . $inner; $this->write($inner . implode($glue, $block->lines)); if (! empty($block->children)) { $this->write($this->break); } } /** * Output block selectors * * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block * * @return void */ protected function blockSelectors(OutputBlock $block) { assert(! empty($block->selectors)); $inner = $this->indentStr(); $this->write($inner . implode($this->tagSeparator, $block->selectors) . $this->open . $this->break); } /** * Output block children * * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block * * @return void */ protected function blockChildren(OutputBlock $block) { foreach ($block->children as $child) { $this->block($child); } } /** * Output non-empty block * * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block * * @return void */ protected function block(OutputBlock $block) { if (empty($block->lines) && empty($block->children)) { return; } $this->currentBlock = $block; $pre = $this->indentStr(); if (! empty($block->selectors)) { $this->blockSelectors($block); $this->indentLevel++; } if (! empty($block->lines)) { $this->blockLines($block); } if (! empty($block->children)) { $this->blockChildren($block); } if (! empty($block->selectors)) { $this->indentLevel--; if (! $this->keepSemicolons) { $this->strippedSemicolon = ''; } if (empty($block->children)) { $this->write($this->break); } $this->write($pre . $this->close . $this->break); } } /** * Test and clean safely empty children * * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block * * @return bool */ protected function testEmptyChildren($block) { $isEmpty = empty($block->lines); if ($block->children) { foreach ($block->children as $k => &$child) { if (! $this->testEmptyChildren($child)) { $isEmpty = false; continue; } if ($child->type === Type::T_MEDIA || $child->type === Type::T_DIRECTIVE) { $child->children = []; $child->selectors = null; } } } return $isEmpty; } /** * Entry point to formatting a block * * @api * * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block An abstract syntax tree * @param \ScssPhp\ScssPhp\SourceMap\SourceMapGenerator|null $sourceMapGenerator Optional source map generator * * @return string */ public function format(OutputBlock $block, SourceMapGenerator $sourceMapGenerator = null) { $this->sourceMapGenerator = null; if ($sourceMapGenerator) { $this->currentLine = 1; $this->currentColumn = 0; $this->sourceMapGenerator = $sourceMapGenerator; } $this->testEmptyChildren($block); ob_start(); try { $this->block($block); } catch (\Exception $e) { ob_end_clean(); throw $e; } catch (\Throwable $e) { ob_end_clean(); throw $e; } $out = ob_get_clean(); assert($out !== false); return $out; } /** * Output content * * @param string $str * * @return void */ protected function write($str) { if (! empty($this->strippedSemicolon)) { echo $this->strippedSemicolon; $this->strippedSemicolon = ''; } /* * Maybe Strip semi-colon appended by property(); it's a separator, not a terminator * will be striped for real before a closing, otherwise displayed unchanged starting the next write */ if ( ! $this->keepSemicolons && $str && (strpos($str, ';') !== false) && (substr($str, -1) === ';') ) { $str = substr($str, 0, -1); $this->strippedSemicolon = ';'; } if ($this->sourceMapGenerator) { $lines = explode("\n", $str); $lastLine = array_pop($lines); foreach ($lines as $line) { // If the written line starts is empty, adding a mapping would add it for // a non-existent column as we are at the end of the line if ($line !== '') { assert($this->currentBlock->sourceLine !== null); assert($this->currentBlock->sourceName !== null); $this->sourceMapGenerator->addMapping( $this->currentLine, $this->currentColumn, $this->currentBlock->sourceLine, //columns from parser are off by one $this->currentBlock->sourceColumn > 0 ? $this->currentBlock->sourceColumn - 1 : 0, $this->currentBlock->sourceName ); } $this->currentLine++; $this->currentColumn = 0; } if ($lastLine !== '') { assert($this->currentBlock->sourceLine !== null); assert($this->currentBlock->sourceName !== null); $this->sourceMapGenerator->addMapping( $this->currentLine, $this->currentColumn, $this->currentBlock->sourceLine, //columns from parser are off by one $this->currentBlock->sourceColumn > 0 ? $this->currentBlock->sourceColumn - 1 : 0, $this->currentBlock->sourceName ); } $this->currentColumn += \strlen($lastLine); } echo $str; } } PKCA#]�v���Jsystem/helixultimate/vendor/scssphp/scssphp/src/Function/MathFunctions.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Function; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Value\SassBoolean; use ScssPhp\ScssPhp\Value\SassNull; use ScssPhp\ScssPhp\Value\SassNumber; use ScssPhp\ScssPhp\Value\SassString; use ScssPhp\ScssPhp\Value\Value; use ScssPhp\ScssPhp\Warn; /** * @internal */ final class MathFunctions { /** * @param list<Value> $arguments */ public static function abs(array $arguments): Value { $number = $arguments[0]->assertNumber('number'); // TODO implement the deprecation for the % unit once modules are implemented to provided the replacement return SassNumber::withUnits(abs($number->getValue()), $number->getNumeratorUnits(), $number->getDenominatorUnits()); } /** * @param list<Value> $arguments */ public static function ceil(array $arguments): Value { return self::numberFunction($arguments, ceil(...)); } /** * @param list<Value> $arguments */ public static function floor(array $arguments): Value { return self::numberFunction($arguments, floor(...)); } /** * @param list<Value> $arguments */ public static function max(array $arguments): Value { $max = null; foreach ($arguments[0]->asList() as $value) { $number = $value->assertNumber(); if ($max === null || $max->lessThan($number)->isTruthy()) { $max = $number; } } if ($max !== null) { return $max; } throw new SassScriptException('At least one argument must be passed.'); } /** * @param list<Value> $arguments */ public static function min(array $arguments): Value { $min = null; foreach ($arguments[0]->asList() as $value) { $number = $value->assertNumber(); if ($min === null || $min->greaterThan($number)->isTruthy()) { $min = $number; } } if ($min !== null) { return $min; } throw new SassScriptException('At least one argument must be passed.'); } /** * @param list<Value> $arguments */ public static function round(array $arguments): Value { return self::numberFunction($arguments, round(...)); } /** * @param list<Value> $arguments */ public static function compatible(array $arguments): Value { $number1 = $arguments[0]->assertNumber('number1'); $number2 = $arguments[1]->assertNumber('number2'); return SassBoolean::create($number1->isComparableTo($number2)); } /** * @param list<Value> $arguments */ public static function isUnitless(array $arguments): Value { $number = $arguments[0]->assertNumber('number'); return SassBoolean::create(!$number->hasUnits()); } /** * @param list<Value> $arguments */ public static function unit(array $arguments): Value { $number = $arguments[0]->assertNumber('number'); return new SassString($number->getUnitString(), true); } /** * @param list<Value> $arguments */ public static function percentage(array $arguments): Value { $number = $arguments[0]->assertNumber('number'); $number->assertNoUnits('number'); return SassNumber::create($number->getValue() * 100, '%'); } /** * @param list<Value> $arguments */ public static function random(array $arguments): Value { if ($arguments[0] instanceof SassNull) { // TODO use a better algorithm to generate a random float. $max = mt_getrandmax(); return SassNumber::create(mt_rand(0, $max - 1) / $max); } $limit = $arguments[0]->assertNumber('limit'); if ($limit->hasUnits()) { $unitString = $limit->getUnitString(); // TODO update the message when implementing modules and deprecating division. Warn::forDeprecation( <<<TXT random() will no longer ignore \$limit units ($limit) in a future release. Recommendation: random(\$limit / 1$unitString) * 1$unitString To preserve current behavior: random(\$limit / 1$unitString) More info: https://sass-lang.com/d/function-units TXT, Deprecation::functionUnits ); } $limitScalar = $limit->assertInt('limit'); if ($limitScalar < 1) { throw new SassScriptException("\$limit: Must be greater than 0, was $limit."); } return SassNumber::create(mt_rand(1, $limitScalar)); } /** * Implements a callable that transforms a number's value * using $transform and preserves its units. * * @param list<Value> $arguments * @param callable(float): float $transform * * @param-immediately-invoked-callable $transform */ private static function numberFunction(array $arguments, callable $transform): Value { $number = $arguments[0]->assertNumber('number'); return SassNumber::withUnits($transform($number->getValue()), $number->getNumeratorUnits(), $number->getDenominatorUnits()); } } PKCA#]V.���Jsystem/helixultimate/vendor/scssphp/scssphp/src/Function/ListFunctions.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Function; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Util\IterableUtil; use ScssPhp\ScssPhp\Value\ListSeparator; use ScssPhp\ScssPhp\Value\SassBoolean; use ScssPhp\ScssPhp\Value\SassList; use ScssPhp\ScssPhp\Value\SassNull; use ScssPhp\ScssPhp\Value\SassNumber; use ScssPhp\ScssPhp\Value\SassString; use ScssPhp\ScssPhp\Value\Value; /** * @internal */ class ListFunctions { /** * @param list<Value> $arguments */ public static function length(array $arguments): Value { return SassNumber::create(\count($arguments[0]->asList())); } /** * @param list<Value> $arguments */ public static function nth(array $arguments): Value { $list = $arguments[0]; $index = $arguments[1]; return $list->asList()[$list->sassIndexToListIndex($index, 'n')]; } /** * @param list<Value> $arguments */ public static function setNth(array $arguments): Value { $list = $arguments[0]; $index = $arguments[1]; $value = $arguments[2]; $newList = $list->asList(); $newList[$list->sassIndexToListIndex($index, 'n')] = $value; \assert(array_is_list($newList), 'The mutation is guaranteed to affect an existing index'); return $list->withListContents($newList); } /** * @param list<Value> $arguments */ public static function join(array $arguments): Value { $list1 = $arguments[0]; $list2 = $arguments[1]; $separatorParam = $arguments[2]->assertString('separator'); $bracketedParam = $arguments[3]; $separator = match ($separatorParam->getText()) { 'auto' => self::getAutoJoinSeparator($list1->getSeparator(), $list2->getSeparator()), 'space' => ListSeparator::SPACE, 'comma' => ListSeparator::COMMA, 'slash' => ListSeparator::SLASH, default => throw new SassScriptException('$separator: Must be "space", "comma", "slash", or "auto".') }; $bracketed = $bracketedParam instanceof SassString && $bracketedParam->getText() === 'auto' ? $list1->hasBrackets() : $bracketedParam->isTruthy(); $newList = [...$list1->asList(), ...$list2->asList()]; return new SassList($newList, $separator, $bracketed); } /** * @param list<Value> $arguments */ public static function append(array $arguments): Value { $list = $arguments[0]; $value = $arguments[1]; $separatorParam = $arguments[2]->assertString('separator'); $separator = match ($separatorParam->getText()) { 'auto' => $list->getSeparator() === ListSeparator::UNDECIDED ? ListSeparator::SPACE : $list->getSeparator(), 'space' => ListSeparator::SPACE, 'comma' => ListSeparator::COMMA, 'slash' => ListSeparator::SLASH, default => throw new SassScriptException('$separator: Must be "space", "comma", "slash", or "auto".') }; $newList = [...$list->asList(), $value]; return $list->withListContents($newList, $separator); } /** * @param list<Value> $arguments */ public static function zip(array $arguments): Value { $lists = array_map(fn (Value $list) => $list->asList(), $arguments[0]->asList()); if (\count($lists) === 0) { return SassList::createEmpty(ListSeparator::COMMA); } $i = 0; $results = []; while (IterableUtil::every($lists, fn ($list) => $i !== \count($list))) { $results[] = new SassList(array_map(fn ($list) => $list[$i], $lists), ListSeparator::SPACE); $i++; } return new SassList($results, ListSeparator::COMMA); } /** * @param list<Value> $arguments */ public static function index(array $arguments): Value { $list = $arguments[0]->asList(); $value = $arguments[1]; foreach ($list as $index => $item) { if ($item->equals($value)) { return SassNumber::create($index + 1); } } return SassNull::create(); } /** * @param list<Value> $arguments */ public static function separator(array $arguments): Value { return match ($arguments[0]->getSeparator()) { ListSeparator::COMMA => new SassString('comma', false), ListSeparator::SLASH => new SassString('slash', false), default => new SassString('space', false), }; } /** * @param list<Value> $arguments */ public static function isBracketed(array $arguments): Value { return SassBoolean::create($arguments[0]->hasBrackets()); } private static function getAutoJoinSeparator(ListSeparator $separator1, ListSeparator $separator2): ListSeparator { if ($separator1 === ListSeparator::UNDECIDED && $separator2 === ListSeparator::UNDECIDED) { return ListSeparator::SPACE; } if ($separator1 === ListSeparator::UNDECIDED) { return $separator2; } return $separator1; } } PKCA#]���>>Lsystem/helixultimate/vendor/scssphp/scssphp/src/Function/StringFunctions.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Function; use ScssPhp\ScssPhp\Util\StringUtil; use ScssPhp\ScssPhp\Value\SassNull; use ScssPhp\ScssPhp\Value\SassNumber; use ScssPhp\ScssPhp\Value\SassString; use ScssPhp\ScssPhp\Value\Value; /** * @internal */ final class StringFunctions { private static ?int $previousId = null; /** * @param list<Value> $arguments */ public static function unquote(array $arguments): Value { $string = $arguments[0]->assertString('string'); if (!$string->hasQuotes()) { return $string; } return new SassString($string->getText(), false); } /** * @param list<Value> $arguments */ public static function quote(array $arguments): Value { $string = $arguments[0]->assertString('string'); if ($string->hasQuotes()) { return $string; } return new SassString($string->getText(), true); } /** * @param list<Value> $arguments */ public static function length(array $arguments): Value { $string = $arguments[0]->assertString('string'); return SassNumber::create($string->getSassLength()); } /** * @param list<Value> $arguments */ public static function insert(array $arguments): Value { $string = $arguments[0]->assertString('string'); $insert = $arguments[1]->assertString('insert'); $index = $arguments[2]->assertNumber('index'); $index->assertNoUnits('index'); $indexInt = $index->assertInt('index'); // str-insert has unusual behavior for negative inputs. It guarantees that // the `$insert` string is at `$index` in the result, which means that we // want to insert before `$index` if it's positive and after if it's // negative. if ($indexInt < 0) { // +1 because negative indexes start counting from -1 rather than 0, and // another +1 because we want to insert *after* that index. $indexInt = max($string->getSassLength() + $indexInt + 2, 0); } $codepointIndex = self::codepointForIndex($indexInt, $string->getSassLength()); return new SassString( mb_substr($string->getText(), 0, $codepointIndex) . $insert->getText() . mb_substr($string->getText(), $codepointIndex), $string->hasQuotes() ); } /** * @param list<Value> $arguments */ public static function index(array $arguments): Value { $string = $arguments[0]->assertString('string'); $substring = $arguments[1]->assertString('substring'); $codepointIndex = mb_strpos($string->getText(), $substring->getText()); if ($codepointIndex === false) { return SassNull::create(); } return SassNumber::create($codepointIndex + 1); } /** * @param list<Value> $arguments */ public static function slice(array $arguments): Value { $string = $arguments[0]->assertString('string'); $start = $arguments[1]->assertNumber('start-at'); $end = $arguments[2]->assertNumber('end-at'); $start->assertNoUnits('start-at'); $end->assertNoUnits('end-at'); $lengthInCodepoints = $string->getSassLength(); // No matter what the start index is, an end index of 0 will produce an // empty string. $endInt = $end->assertInt(); if ($endInt === 0) { return new SassString('', $string->hasQuotes()); } $startCodepoint = self::codepointForIndex($start->assertInt(), $lengthInCodepoints); $endCodepoint = self::codepointForIndex($endInt, $lengthInCodepoints, true); if ($endCodepoint === $lengthInCodepoints) { $endCodepoint--; } if ($endCodepoint < $startCodepoint) { return new SassString('', $string->hasQuotes()); } return new SassString( mb_substr($string->getText(), $startCodepoint, $endCodepoint + 1 - $startCodepoint), $string->hasQuotes() ); } /** * @param list<Value> $arguments */ public static function toUpperCase(array $arguments): Value { $string = $arguments[0]->assertString('string'); return new SassString(StringUtil::toAsciiUpperCase($string->getText()), $string->hasQuotes()); } /** * @param list<Value> $arguments */ public static function toLowerCase(array $arguments): Value { $string = $arguments[0]->assertString('string'); return new SassString(StringUtil::toAsciiLowerCase($string->getText()), $string->hasQuotes()); } /** * @param list<Value> $arguments */ public static function uniqueId(array $arguments): Value { if (self::$previousId === null) { self::$previousId = random_int(0, 36 ** 6); } // Make it difficult to guess the next ID by randomizing the increase. self::$previousId += random_int(0, 36) + 1; if (self::$previousId > 36 ** 6) { self::$previousId %= 36 ** 6; } // The leading "u" ensures that the result is a valid identifier. return new SassString('u' . str_pad(base_convert((string) self::$previousId, 10, 36), 6, '0', STR_PAD_LEFT), false); } /** * Converts a Sass string index into a codepoint index into a string which * has length $lengthInCodepoints measured in codepoints (with `mb_strlen`). * * A Sass string index is one-based, and uses negative numbers to count * backwards from the end of the string. * * If $index is negative and it points before the beginning of * $lengthInCodepoints, this will return `0` if $allowNegative is `false` and * the index if it's `true`. */ private static function codepointForIndex(int $index, int $lengthInCodepoints, bool $allowNegative = false): int { if ($index === 0) { return 0; } if ($index > 0) { return min($index - 1, $lengthInCodepoints); } $result = $lengthInCodepoints + $index; if ($result < 0 && !$allowNegative) { return 0; } return $result; } } PKCA#]h933Nsystem/helixultimate/vendor/scssphp/scssphp/src/Function/SelectorFunctions.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Function; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelector; use ScssPhp\ScssPhp\Ast\Selector\ComplexSelectorComponent; use ScssPhp\ScssPhp\Ast\Selector\CompoundSelector; use ScssPhp\ScssPhp\Ast\Selector\ParentSelector; use ScssPhp\ScssPhp\Ast\Selector\SelectorList; use ScssPhp\ScssPhp\Ast\Selector\SimpleSelector; use ScssPhp\ScssPhp\Ast\Selector\TypeSelector; use ScssPhp\ScssPhp\Ast\Selector\UniversalSelector; use ScssPhp\ScssPhp\Evaluation\EvaluationContext; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Extend\ConcreteExtensionStore; use ScssPhp\ScssPhp\Util\ArrayUtil; use ScssPhp\ScssPhp\Value\ListSeparator; use ScssPhp\ScssPhp\Value\SassBoolean; use ScssPhp\ScssPhp\Value\SassList; use ScssPhp\ScssPhp\Value\SassNull; use ScssPhp\ScssPhp\Value\SassString; use ScssPhp\ScssPhp\Value\Value; /** * @internal */ final class SelectorFunctions { /** * @param list<Value> $arguments */ public static function nest(array $arguments): Value { $selectors = $arguments[0]->asList(); if (\count($selectors) === 0) { throw new SassScriptException('$selectors: At least one selector must be passed.'); } $first = true; return ArrayUtil::reduce(array_map(function (Value $selector) use (&$first) { $result = $selector->assertSelector(allowParent: !$first); $first = false; return $result; }, $selectors), fn (SelectorList $parent, SelectorList $child) => $child->nestWithin($parent))->asSassList(); } /** * @param list<Value> $arguments */ public static function append(array $arguments): Value { $selectors = $arguments[0]->asList(); if (\count($selectors) === 0) { throw new SassScriptException('$selectors: At least one selector must be passed.'); } $span = EvaluationContext::getCurrent()->getCurrentCallableSpan(); return ArrayUtil::reduce(array_map(fn(Value $selector) => $selector->assertSelector(), $selectors), function (SelectorList $parent, SelectorList $child) use ($span) { return (new SelectorList(array_map(function (ComplexSelector $complex) use ($span, $parent) { if (\count($complex->getLeadingCombinators()) > 0) { throw new SassScriptException("Can't append $complex to $parent."); } $component = $complex->getComponents()[0]; $rest = array_slice($complex->getComponents(), 1); $newCompound = self::prependParent($component->getSelector()); if ($newCompound === null) { throw new SassScriptException("Can't append $complex to $parent."); } return new ComplexSelector([], [ new ComplexSelectorComponent($newCompound, $component->getCombinators(), $span), ...$rest, ], $span); }, $child->getComponents()), $span))->nestWithin($parent); })->asSassList(); } /** * @param list<Value> $arguments */ public static function extend(array $arguments): Value { $selector = $arguments[0]->assertSelector('selector'); $selector->assertNotBogus('selector'); $target = $arguments[1]->assertSelector('extendee'); $target->assertNotBogus('extendee'); $source = $arguments[2]->assertSelector('extender'); $source->assertNotBogus('extender'); return ConcreteExtensionStore::extend($selector, $source, $target, EvaluationContext::getCurrent()->getCurrentCallableSpan())->asSassList(); } /** * @param list<Value> $arguments */ public static function replace(array $arguments): Value { $selector = $arguments[0]->assertSelector('selector'); $selector->assertNotBogus('selector'); $target = $arguments[1]->assertSelector('original'); $target->assertNotBogus('original'); $source = $arguments[2]->assertSelector('replacement'); $source->assertNotBogus('replacement'); return ConcreteExtensionStore::replace($selector, $source, $target, EvaluationContext::getCurrent()->getCurrentCallableSpan())->asSassList(); } /** * @param list<Value> $arguments */ public static function unify(array $arguments): Value { $selector1 = $arguments[0]->assertSelector('selector1'); $selector1->assertNotBogus('selector1'); $selector2 = $arguments[1]->assertSelector('selector2'); $selector2->assertNotBogus('selector2'); return $selector1->unify($selector2)?->asSassList() ?? SassNull::create(); } /** * @param list<Value> $arguments */ public static function isSuperselector(array $arguments): Value { $selector1 = $arguments[0]->assertSelector('super'); $selector1->assertNotBogus('super'); $selector2 = $arguments[1]->assertSelector('sub'); $selector2->assertNotBogus('sub'); return SassBoolean::create($selector1->isSuperselector($selector2)); } /** * @param list<Value> $arguments */ public static function simpleSelectors(array $arguments): Value { $selector = $arguments[0]->assertCompoundSelector('selector'); return new SassList( array_map(fn (SimpleSelector $simple) => new SassString((string) $simple, false), $selector->getComponents()), ListSeparator::COMMA ); } /** * @param list<Value> $arguments */ public static function parse(array $arguments): Value { return $arguments[0]->assertSelector('selector')->asSassList(); } /** * Adds a {@see ParentSelector} to the beginning of $compound, or returns `null` if * that wouldn't produce a valid selector. */ private static function prependParent(CompoundSelector $compound): ?CompoundSelector { $span = EvaluationContext::getCurrent()->getCurrentCallableSpan(); $firstComponent = $compound->getComponents()[0]; if ($firstComponent instanceof UniversalSelector) { return null; } if ($firstComponent instanceof TypeSelector && $firstComponent->getName()->getNamespace() !== null) { return null; } if ($firstComponent instanceof TypeSelector) { return new CompoundSelector([ new ParentSelector($span, $firstComponent->getName()->getName()), ...array_slice($compound->getComponents(), 1), ], $span); } return new CompoundSelector([ new ParentSelector($span), ...$compound->getComponents(), ], $span); } } PKCA#]�Ӟ%CCIsystem/helixultimate/vendor/scssphp/scssphp/src/Function/MapFunctions.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Function; use ScssPhp\ScssPhp\Collection\Map; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Util\ListUtil; use ScssPhp\ScssPhp\Value\ListSeparator; use ScssPhp\ScssPhp\Value\SassBoolean; use ScssPhp\ScssPhp\Value\SassList; use ScssPhp\ScssPhp\Value\SassMap; use ScssPhp\ScssPhp\Value\SassNull; use ScssPhp\ScssPhp\Value\Value; /** * @internal */ class MapFunctions { /** * @param list<Value> $arguments */ public static function get(array $arguments): Value { $map = $arguments[0]->assertMap('map'); $keys = [$arguments[1], ...$arguments[2]->asList()]; foreach (ListUtil::exceptLast($keys) as $key) { $value = $map->getContents()->get($key); if (!$value instanceof SassMap) { return SassNull::create(); } $map = $value; } return $map->getContents()->get(ListUtil::last($keys)) ?? SassNull::create(); } /** * @param list<Value> $arguments */ public static function mergeTwoArgs(array $arguments): Value { $map1 = $arguments[0]->assertMap('map1'); $map2 = $arguments[1]->assertMap('map2'); $result = Map::of($map1->getContents()); foreach ($map2->getContents() as $key => $value) { $result->put($key, $value); } return SassMap::create($result); } /** * @param list<Value> $arguments */ public static function mergeVariadic(array $arguments): Value { $map1 = $arguments[0]->assertMap('map1'); $args = $arguments[1]->asList(); if ($args === []) { throw new SassScriptException('Expected $args to contain a key.'); } if (\count($args) === 1) { throw new SassScriptException('Expected $args to contain a map.'); } $keys = ListUtil::exceptLast($args); $map2 = ListUtil::last($args)->assertMap('map2'); return self::modify($map1, $keys, function (Value $oldValue) use ($map2) { $nestedMap = $oldValue->tryMap(); if ($nestedMap === null) { return $map2; } $result = Map::of($nestedMap->getContents()); foreach ($map2->getContents() as $key => $value) { $result->put($key, $value); } return SassMap::create($result); }); } /** * @param list<Value> $arguments */ public static function removeNoKeys(array $arguments): Value { return $arguments[0]->assertMap('map'); } /** * @param list<Value> $arguments */ public static function remove(array $arguments): Value { $map = $arguments[0]->assertMap('map'); $keys = [$arguments[1], ...$arguments[2]->asList()]; $mutableMap = Map::of($map->getContents()); foreach ($keys as $key) { $mutableMap->remove($key); } return SassMap::create($mutableMap); } /** * @param list<Value> $arguments */ public static function keys(array $arguments): Value { return new SassList($arguments[0]->assertMap('map')->getContents()->keys(), ListSeparator::COMMA); } /** * @param list<Value> $arguments */ public static function values(array $arguments): Value { return new SassList($arguments[0]->assertMap('map')->getContents()->values(), ListSeparator::COMMA); } /** * @param list<Value> $arguments */ public static function hasKey(array $arguments): Value { $map = $arguments[0]->assertMap('map'); $keys = [$arguments[1], ...$arguments[2]->asList()]; foreach (ListUtil::exceptLast($keys) as $key) { $value = $map->getContents()->get($key); if (!$value instanceof SassMap) { return SassBoolean::create(false); } $map = $value; } return SassBoolean::create($map->getContents()->containsKey(ListUtil::last($keys))); } /** * Updates the specified value in $map by applying the $modify callback to * it, then returns the resulting map. * * If more than one key is provided, this means the map targeted for update is * nested within $map. The multiple $keys form a path of nested maps that * leads to the targeted value, which is passed to $modify. * * If any value along the path (other than the last one) is not a map and * $addNesting is `true`, this creates nested maps to match $keys and passes * {@see SassNull} to $modify. Otherwise, this fails and returns $map with no * changes. * * If no keys are provided, this passes $map directly to modify and returns * the result. * * @param Value[] $keys * @param callable(Value $old): Value $modify * * @param-immediately-invoked-callable $modify */ private static function modify(SassMap $map, array $keys, callable $modify, bool $addNesting = true): Value { $iterator = new \ArrayIterator($keys); $modifyNestedMap = function (SassMap $map) use ($iterator, $modify, $addNesting, &$modifyNestedMap): SassMap { $mutableMap = Map::of($map->getContents()); $key = $iterator->current(); $iterator->next(); if (!$iterator->valid()) { $mutableMap->put($key, $modify($mutableMap->get($key) ?? SassNull::create())); return SassMap::create($mutableMap); } $nestedMap = $mutableMap->get($key)?->tryMap(); if ($nestedMap === null && !$addNesting) { return SassMap::create($mutableMap); } $mutableMap->put($key, $modifyNestedMap($nestedMap ?? SassMap::createEmpty())); return SassMap::create($mutableMap); }; $iterator->rewind(); return $iterator->valid() ? $modifyNestedMap($map) : $modify($map); } } PKCA#]�z�3��Jsystem/helixultimate/vendor/scssphp/scssphp/src/Function/MetaFunctions.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Function; use ScssPhp\ScssPhp\Collection\Map; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Value\SassArgumentList; use ScssPhp\ScssPhp\Value\SassBoolean; use ScssPhp\ScssPhp\Value\SassCalculation; use ScssPhp\ScssPhp\Value\SassColor; use ScssPhp\ScssPhp\Value\SassFunction; use ScssPhp\ScssPhp\Value\SassList; use ScssPhp\ScssPhp\Value\SassMap; use ScssPhp\ScssPhp\Value\SassMixin; use ScssPhp\ScssPhp\Value\SassNull; use ScssPhp\ScssPhp\Value\SassNumber; use ScssPhp\ScssPhp\Value\SassString; use ScssPhp\ScssPhp\Value\Value; use ScssPhp\ScssPhp\Warn; /** * @internal */ final class MetaFunctions { /** * @param list<Value> $arguments */ public static function featureExists(array $arguments): Value { Warn::forDeprecation("The feature-exists() function is deprecated.\n\nMore info: https://sass-lang.com/d/feature-exists", Deprecation::featureExists); $feature = $arguments[0]->assertString('feature'); return SassBoolean::create(\in_array($feature->getText(), ['global-variable-shadowing', 'extend-selector-pseudoclass', 'units-level-3', 'at-error', 'custom-property'], true)); } /** * @param list<Value> $arguments */ public static function inspect(array $arguments): Value { return new SassString((string) $arguments[0], false); } /** * @param list<Value> $arguments */ public static function typeof(array $arguments): Value { $value = $arguments[0]; return new SassString(match (true) { $value instanceof SassArgumentList => 'arglist', $value instanceof SassBoolean => 'bool', $value instanceof SassColor => 'color', $value instanceof SassList => 'list', $value instanceof SassMap => 'map', $value instanceof SassNull => 'null', $value instanceof SassNumber => 'number', $value instanceof SassFunction => 'function', $value instanceof SassMixin => 'mixin', $value instanceof SassCalculation => 'calculation', $value instanceof SassString => 'string', default => throw new SassScriptException("[BUG] Unknown value type $value"), }, false); } /** * @param list<Value> $arguments */ public static function keywords(array $arguments): Value { if ($arguments[0] instanceof SassArgumentList) { $map = new Map(); foreach ($arguments[0]->getKeywords() as $key => $value) { $map->put(new SassString($key, false), $value); } return SassMap::create($map); } throw SassScriptException::forArgument("$arguments[0] is not an argument list.", 'args'); } } PKCA#]�3@b5b5Msystem/helixultimate/vendor/scssphp/scssphp/src/Function/FunctionRegistry.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Function; use League\Uri\Uri; use ScssPhp\ScssPhp\SassCallable\BuiltInCallable; use ScssPhp\ScssPhp\Value\Value; /** * @internal */ class FunctionRegistry { /** * @var array<string, array{overloads: array<string, callable(list<Value>): Value>, url?: string, canonical_name?: string}> */ private const BUILTIN_FUNCTIONS = [ // sass:color 'red' => ['overloads' => ['$color' => [ColorFunctions::class, 'red']], 'url' => 'sass:color'], 'green' => ['overloads' => ['$color' => [ColorFunctions::class, 'green']], 'url' => 'sass:color'], 'blue' => ['overloads' => ['$color' => [ColorFunctions::class, 'blue']], 'url' => 'sass:color'], 'mix' => ['overloads' => ['$color1, $color2, $weight: 50%' => [ColorFunctions::class, 'mix']], 'url' => 'sass:color'], 'rgb' => ['overloads' => [ '$red, $green, $blue, $alpha' => [ColorFunctions::class, 'rgb'], '$red, $green, $blue' => [ColorFunctions::class, 'rgb'], '$color, $alpha' => [ColorFunctions::class, 'rgbTwoArgs'], '$channels' => [ColorFunctions::class, 'rgbOneArgs'], ]], 'rgba' => ['overloads' => [ '$red, $green, $blue, $alpha' => [ColorFunctions::class, 'rgba'], '$red, $green, $blue' => [ColorFunctions::class, 'rgba'], '$color, $alpha' => [ColorFunctions::class, 'rgbaTwoArgs'], '$channels' => [ColorFunctions::class, 'rgbaOneArgs'], ]], 'invert' => ['overloads' => ['$color, $weight: 100%' => [ColorFunctions::class, 'invert']], 'url' => 'sass:color'], 'hue' => ['overloads' => ['$color' => [ColorFunctions::class, 'hue']], 'url' => 'sass:color'], 'saturation' => ['overloads' => ['$color' => [ColorFunctions::class, 'saturation']], 'url' => 'sass:color'], 'lightness' => ['overloads' => ['$color' => [ColorFunctions::class, 'lightness']], 'url' => 'sass:color'], 'complement' => ['overloads' => ['$color' => [ColorFunctions::class, 'complement']], 'url' => 'sass:color'], 'hsl' => ['overloads' => [ '$hue, $saturation, $lightness, $alpha' => [ColorFunctions::class, 'hsl'], '$hue, $saturation, $lightness' => [ColorFunctions::class, 'hsl'], '$hue, $saturation' => [ColorFunctions::class, 'hslTwoArgs'], '$channels' => [ColorFunctions::class, 'hslOneArgs'], ]], 'hsla' => ['overloads' => [ '$hue, $saturation, $lightness, $alpha' => [ColorFunctions::class, 'hsla'], '$hue, $saturation, $lightness' => [ColorFunctions::class, 'hsla'], '$hue, $saturation' => [ColorFunctions::class, 'hslaTwoArgs'], '$channels' => [ColorFunctions::class, 'hslaOneArgs'], ]], 'grayscale' => ['overloads' => ['$color' => [ColorFunctions::class, 'grayscale']], 'url' => 'sass:color'], 'adjust-hue' => ['overloads' => ['$color, $degrees' => [ColorFunctions::class, 'adjustHue']], 'url' => 'sass:color'], 'lighten' => ['overloads' => ['$color, $amount' => [ColorFunctions::class, 'lighten']], 'url' => 'sass:color'], 'darken' => ['overloads' => ['$color, $amount' => [ColorFunctions::class, 'darken']], 'url' => 'sass:color'], 'saturate' => ['overloads' => [ '$amount' => [ColorFunctions::class, 'saturateCss'], '$color, $amount' => [ColorFunctions::class, 'saturate'], ]], 'desaturate' => ['overloads' => ['$color, $amount' => [ColorFunctions::class, 'desaturate']], 'url' => 'sass:color'], 'opacify' => ['overloads' => ['$color, $amount' => [ColorFunctions::class, 'opacify']], 'url' => 'sass:color'], 'fade-in' => ['overloads' => ['$color, $amount' => [ColorFunctions::class, 'opacify']], 'url' => 'sass:color'], 'transparentize' => ['overloads' => ['$color, $amount' => [ColorFunctions::class, 'transparentize']], 'url' => 'sass:color'], 'fade-out' => ['overloads' => ['$color, $amount' => [ColorFunctions::class, 'transparentize']], 'url' => 'sass:color'], 'alpha' => ['overloads' => [ '$color' => [ColorFunctions::class, 'alpha'], '$args...' => [ColorFunctions::class, 'alphaMicrosoft'], ]], 'opacity' => ['overloads' => ['$color' => [ColorFunctions::class, 'opacity']], 'url' => 'sass:color'], 'ie-hex-str' => ['overloads' => ['$color' => [ColorFunctions::class, 'ieHexStr']], 'url' => 'sass:color'], 'adjust-color' => ['overloads' => ['$color, $kwargs...' => [ColorFunctions::class, 'adjust']], 'url' => 'sass:color', 'canonical_name' => 'adjust'], 'scale-color' => ['overloads' => ['$color, $kwargs...' => [ColorFunctions::class, 'scale']], 'url' => 'sass:color', 'canonical_name' => 'scale'], 'change-color' => ['overloads' => ['$color, $kwargs...' => [ColorFunctions::class, 'change']], 'url' => 'sass:color', 'canonical_name' => 'change'], // sass:list 'length' => ['overloads' => ['$list' => [ListFunctions::class, 'length']], 'url' => 'sass:list'], 'nth' => ['overloads' => ['$list, $n' => [ListFunctions::class, 'nth']], 'url' => 'sass:list'], 'set-nth' => ['overloads' => ['$list, $n, $value' => [ListFunctions::class, 'setNth']], 'url' => 'sass:list'], 'join' => ['overloads' => ['$list1, $list2, $separator: auto, $bracketed: auto' => [ListFunctions::class, 'join']], 'url' => 'sass:list'], 'append' => ['overloads' => ['$list, $val, $separator: auto' => [ListFunctions::class, 'append']], 'url' => 'sass:list'], 'zip' => ['overloads' => ['$lists...' => [ListFunctions::class, 'zip']], 'url' => 'sass:list'], 'index' => ['overloads' => ['$list, $value' => [ListFunctions::class, 'index']], 'url' => 'sass:list'], 'is-bracketed' => ['overloads' => ['$list' => [ListFunctions::class, 'isBracketed']], 'url' => 'sass:list'], 'list-separator' => ['overloads' => ['$list' => [ListFunctions::class, 'separator']], 'url' => 'sass:list', 'canonical_name' => 'separator'], // sass:map 'map-get' => ['overloads' => ['$map, $key, $keys...' => [MapFunctions::class, 'get']], 'url' => 'sass:map', 'canonical_name' => 'get'], 'map-merge' => ['overloads' => [ '$map1, $map2' => [MapFunctions::class, 'mergeTwoArgs'], '$map1, $args...' => [MapFunctions::class, 'mergeVariadic'], ], 'canonical_name' => 'merge'], 'map-remove' => ['overloads' => [ // Because the signature below has an explicit `$key` argument, it doesn't // allow zero keys to be passed. We want to allow that case, so we add an // explicit overload for it. '$map' => [MapFunctions::class, 'removeNoKeys'], // The first argument has special handling so that the $key parameter can be // passed by name. '$map, $key, $keys...' => [MapFunctions::class, 'remove'], ], 'canonical_name' => 'remove'], 'map-keys' => ['overloads' => ['$map' => [MapFunctions::class, 'keys']], 'url' => 'sass:map', 'canonical_name' => 'keys'], 'map-values' => ['overloads' => ['$map' => [MapFunctions::class, 'values']], 'url' => 'sass:map', 'canonical_name' => 'values'], 'map-has-key' => ['overloads' => ['$map, $key, $keys...' => [MapFunctions::class, 'hasKey']], 'url' => 'sass:map', 'canonical_name' => 'has-key'], // sass:math 'abs' => ['overloads' => ['$number' => [MathFunctions::class, 'abs']], 'url' => 'sass:math'], 'ceil' => ['overloads' => ['$number' => [MathFunctions::class, 'ceil']], 'url' => 'sass:math'], 'floor' => ['overloads' => ['$number' => [MathFunctions::class, 'floor']], 'url' => 'sass:math'], 'max' => ['overloads' => ['$numbers...' => [MathFunctions::class, 'max']], 'url' => 'sass:math'], 'min' => ['overloads' => ['$numbers...' => [MathFunctions::class, 'min']], 'url' => 'sass:math'], 'random' => ['overloads' => ['$limit: null' => [MathFunctions::class, 'random']], 'url' => 'sass:math'], 'percentage' => ['overloads' => ['$number' => [MathFunctions::class, 'percentage']], 'url' => 'sass:math'], 'round' => ['overloads' => ['$number' => [MathFunctions::class, 'round']], 'url' => 'sass:math'], 'unit' => ['overloads' => ['$number' => [MathFunctions::class, 'unit']], 'url' => 'sass:math'], 'comparable' => ['overloads' => ['$number1, $number2' => [MathFunctions::class, 'compatible']], 'url' => 'sass:math', 'canonical_name' => 'compatible'], 'unitless' => ['overloads' => ['$number' => [MathFunctions::class, 'isUnitless']], 'url' => 'sass:math', 'canonical_name' => 'is-unitless'], // sass:meta 'feature-exists' => ['overloads' => ['$feature' => [MetaFunctions::class, 'featureExists']], 'url' => 'sass:meta'], 'inspect' => ['overloads' => ['$value' => [MetaFunctions::class, 'inspect']], 'url' => 'sass:meta'], 'type-of' => ['overloads' => ['$value' => [MetaFunctions::class, 'typeof']], 'url' => 'sass:meta'], 'keywords' => ['overloads' => ['$args' => [MetaFunctions::class, 'keywords']], 'url' => 'sass:meta'], // sass:selector 'is-superselector' => ['overloads' => ['$super, $sub' => [SelectorFunctions::class, 'isSuperselector']], 'url' => 'sass:selector'], 'simple-selectors' => ['overloads' => ['$selector' => [SelectorFunctions::class, 'simpleSelectors']], 'url' => 'sass:selector'], 'selector-parse' => ['overloads' => ['$selector' => [SelectorFunctions::class, 'parse']], 'url' => 'sass:selector', 'canonical_name' => 'parse'], 'selector-nest' => ['overloads' => ['$selectors...' => [SelectorFunctions::class, 'nest']], 'url' => 'sass:selector', 'canonical_name' => 'nest'], 'selector-append' => ['overloads' => ['$selectors...' => [SelectorFunctions::class, 'append']], 'url' => 'sass:selector', 'canonical_name' => 'append'], 'selector-extend' => ['overloads' => ['$selector, $extendee, $extender' => [SelectorFunctions::class, 'extend']], 'url' => 'sass:selector', 'canonical_name' => 'extend'], 'selector-replace' => ['overloads' => ['$selector, $original, $replacement' => [SelectorFunctions::class, 'replace']], 'url' => 'sass:selector', 'canonical_name' => 'replace'], 'selector-unify' => ['overloads' => ['$selector1, $selector2' => [SelectorFunctions::class, 'unify']], 'url' => 'sass:selector', 'canonical_name' => 'unify'], // sass:string 'unquote' => ['overloads' => ['$string' => [StringFunctions::class, 'unquote']], 'url' => 'sass:string'], 'quote' => ['overloads' => ['$string' => [StringFunctions::class, 'quote']], 'url' => 'sass:string'], 'to-upper-case' => ['overloads' => ['$string' => [StringFunctions::class, 'toUpperCase']], 'url' => 'sass:string'], 'to-lower-case' => ['overloads' => ['$string' => [StringFunctions::class, 'toLowerCase']], 'url' => 'sass:string'], 'unique-id' => ['overloads' => ['' => [StringFunctions::class, 'uniqueId']], 'url' => 'sass:string'], 'str-length' => ['overloads' => ['$string' => [StringFunctions::class, 'length']], 'url' => 'sass:string', 'canonical_name' => 'length'], 'str-insert' => ['overloads' => ['$string, $insert, $index' => [StringFunctions::class, 'insert']], 'url' => 'sass:string', 'canonical_name' => 'insert'], 'str-index' => ['overloads' => ['$string, $substring' => [StringFunctions::class, 'index']], 'url' => 'sass:string', 'canonical_name' => 'index'], 'str-slice' => ['overloads' => ['$string, $start-at, $end-at: -1' => [StringFunctions::class, 'slice']], 'url' => 'sass:string', 'canonical_name' => 'slice'], // special // This is only invoked using `call()`. Hand-authored `if()`s are parsed as IfExpression. 'if' => ['overloads' => ['$condition, $if-true, $if-false' => [self::class, 'if']]], ]; /** * Special meta functions defined directly in the {@see EvaluateVisitor} constructor */ private const SPECIAL_META_GLOBAL_FUNCTIONS = [ 'global-variable-exists', 'variable-exists', 'function-exists', 'mixin-exists', 'content-exists', 'get-function', 'get-mixin', 'call', ]; public static function has(string $name): bool { return isset(self::BUILTIN_FUNCTIONS[$name]); } public static function get(string $name): BuiltInCallable { if (!isset(self::BUILTIN_FUNCTIONS[$name])) { throw new \InvalidArgumentException("There is no builtin function named $name."); } $url = isset(self::BUILTIN_FUNCTIONS[$name]['url']) ? Uri::new(self::BUILTIN_FUNCTIONS[$name]['url']) : null; $callable = BuiltInCallable::overloadedFunction(self::BUILTIN_FUNCTIONS[$name]['canonical_name'] ?? $name, self::BUILTIN_FUNCTIONS[$name]['overloads'], $url); if (isset(self::BUILTIN_FUNCTIONS[$name]['canonical_name'])) { $callable = $callable->withName($name); } return $callable; } public static function isBuiltinFunction(string $name): bool { return isset(self::BUILTIN_FUNCTIONS[$name]) || \in_array($name, self::SPECIAL_META_GLOBAL_FUNCTIONS, true); } /** * @param list<Value> $arguments */ public static function if(array $arguments): Value { return $arguments[0]->isTruthy() ? $arguments[1] : $arguments[2]; } } PKCA#]tܦ�t�tKsystem/helixultimate/vendor/scssphp/scssphp/src/Function/ColorFunctions.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Function; use ScssPhp\ScssPhp\Deprecation; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Util\IterableUtil; use ScssPhp\ScssPhp\Util\NumberUtil; use ScssPhp\ScssPhp\Util\StringUtil; use ScssPhp\ScssPhp\Value\ColorFormatEnum; use ScssPhp\ScssPhp\Value\ListSeparator; use ScssPhp\ScssPhp\Value\SassArgumentList; use ScssPhp\ScssPhp\Value\SassColor; use ScssPhp\ScssPhp\Value\SassNumber; use ScssPhp\ScssPhp\Value\SassString; use ScssPhp\ScssPhp\Value\Value; use ScssPhp\ScssPhp\Warn; /** * @internal */ class ColorFunctions { /** * @param list<Value> $arguments */ public static function rgb(array $arguments): Value { return self::rgbImpl('rgb', $arguments); } /** * @param list<Value> $arguments */ public static function rgbTwoArgs(array $arguments): Value { return self::rgbTwoArgsImpl('rgb', $arguments); } /** * @param list<Value> $arguments */ public static function rgbOneArgs(array $arguments): Value { $parsed = self::parseChannels('rgb', ['$red', '$green', '$blue'], $arguments[0]); return $parsed instanceof SassString ? $parsed : self::rgbImpl('rgb', $parsed); } /** * @param list<Value> $arguments */ public static function rgba(array $arguments): Value { return self::rgbImpl('rgba', $arguments); } /** * @param list<Value> $arguments */ public static function rgbaTwoArgs(array $arguments): Value { return self::rgbTwoArgsImpl('rgba', $arguments); } /** * @param list<Value> $arguments */ public static function rgbaOneArgs(array $arguments): Value { $parsed = self::parseChannels('rgba', ['$red', '$green', '$blue'], $arguments[0]); return $parsed instanceof SassString ? $parsed : self::rgbImpl('rgba', $parsed); } /** * @param list<Value> $arguments */ public static function invert(array $arguments): Value { $weight = $arguments[1]->assertNumber('weight'); if ($arguments[0] instanceof SassNumber || $arguments[0]->isSpecialNumber()) { if ($weight->getValue() !== 100.0 || !$weight->hasUnit('%')) { throw new SassScriptException('Only one argument may be passed to the plain-CSS invert() function.'); } // Use the native CSS `invert` filter function. return self::functionString('invert', [$arguments[0]]); } $color = $arguments[0]->assertColor('color'); $inverse = $color->changeRgb(255 - $color->getRed(), 255 - $color->getGreen(), 255 - $color->getBlue()); return self::mixColors($inverse, $color, $weight); } /** * @param list<Value> $arguments */ public static function hsl(array $arguments): Value { return self::hslImpl('hsl', $arguments); } /** * @param list<Value> $arguments */ public static function hslTwoArgs(array $arguments): Value { // hsl(123, var(--foo)) is valid CSS because --foo might be `10%, 20%` and // functions are parsed after variable substitution. if ($arguments[0]->isVar() || $arguments[1]->isVar()) { return self::functionString('hsl', $arguments); } throw new SassScriptException('Missing argument $lightness.'); } /** * @param list<Value> $arguments */ public static function hslOneArgs(array $arguments): Value { $parsed = self::parseChannels('hsl', ['$hue', '$saturation', '$lightness'], $arguments[0]); return $parsed instanceof SassString ? $parsed : self::hslImpl('hsl', $parsed); } /** * @param list<Value> $arguments */ public static function hsla(array $arguments): Value { return self::hslImpl('hsla', $arguments); } /** * @param list<Value> $arguments */ public static function hslaTwoArgs(array $arguments): Value { // hsl(123, var(--foo)) is valid CSS because --foo might be `10%, 20%` and // functions are parsed after variable substitution. if ($arguments[0]->isVar() || $arguments[1]->isVar()) { return self::functionString('hsla', $arguments); } throw new SassScriptException('Missing argument $lightness.'); } /** * @param list<Value> $arguments */ public static function hslaOneArgs(array $arguments): Value { $parsed = self::parseChannels('hsla', ['$hue', '$saturation', '$lightness'], $arguments[0]); return $parsed instanceof SassString ? $parsed : self::hslImpl('hsla', $parsed); } /** * @param list<Value> $arguments */ public static function grayscale(array $arguments): Value { if ($arguments[0] instanceof SassNumber || $arguments[0]->isSpecialNumber()) { // Use the native CSS `grayscale` filter function. return self::functionString('grayscale', $arguments); } $color = $arguments[0]->assertColor('color'); return $color->changeHsl(saturation: 0); } /** * @param list<Value> $arguments */ public static function adjustHue(array $arguments): Value { $color = $arguments[0]->assertColor('color'); $degrees = self::angleValue($arguments[1], 'degrees'); return $color->changeHsl(hue: $color->getHue() + $degrees); } /** * @param list<Value> $arguments */ public static function lighten(array $arguments): Value { $color = $arguments[0]->assertColor('color'); $amount = $arguments[1]->assertNumber('amount'); return $color->changeHsl(lightness: NumberUtil::clamp($color->getLightness() + $amount->valueInRange(0, 100, 'amount'), 0, 100)); } /** * @param list<Value> $arguments */ public static function darken(array $arguments): Value { $color = $arguments[0]->assertColor('color'); $amount = $arguments[1]->assertNumber('amount'); return $color->changeHsl(lightness: NumberUtil::clamp($color->getLightness() - $amount->valueInRange(0, 100, 'amount'), 0, 100)); } /** * @param list<Value> $arguments */ public static function saturateCss(array $arguments): Value { if ($arguments[0] instanceof SassNumber || $arguments[0]->isSpecialNumber()) { // Use the native CSS `saturate` filter function. return self::functionString('saturate', $arguments); } $number = $arguments[0]->assertNumber('amount'); return new SassString('saturate(' . $number->toCssString() . ')', false); } /** * @param list<Value> $arguments */ public static function saturate(array $arguments): Value { $color = $arguments[0]->assertColor('color'); $amount = $arguments[1]->assertNumber('amount'); return $color->changeHsl(saturation: NumberUtil::clamp($color->getSaturation() + $amount->valueInRange(0, 100, 'amount'), 0, 100)); } /** * @param list<Value> $arguments */ public static function desaturate(array $arguments): Value { $color = $arguments[0]->assertColor('color'); $amount = $arguments[1]->assertNumber('amount'); return $color->changeHsl(saturation: NumberUtil::clamp($color->getSaturation() - $amount->valueInRange(0, 100, 'amount'), 0, 100)); } /** * @param list<Value> $arguments */ public static function alpha(array $arguments): Value { $argument = $arguments[0]; if ($argument instanceof SassString && !$argument->hasQuotes() && preg_match('/^[a-zA-Z]+\s*=/', $argument->getText())) { // Support the proprietary Microsoft alpha() function. return self::functionString('alpha', $arguments); } $color = $arguments[0]->assertColor('color'); return SassNumber::create($color->getAlpha()); } /** * @param list<Value> $arguments */ public static function alphaMicrosoft(array $arguments): Value { $argList = $arguments[0]->asList(); $argumentCount = \count($argList); if ($argumentCount > 0 && IterableUtil::every($argList, fn($argument) => $argument instanceof SassString && !$argument->hasQuotes() && preg_match('/^[a-zA-Z]+\s*=/', $argument->getText()))) { // Support the proprietary Microsoft alpha() function. return self::functionString('alpha', $arguments); } \assert($argumentCount !== 1); if ($argumentCount === 0) { throw new SassScriptException('Missing argument $color.'); } throw new SassScriptException("Only 1 argument allowed, but $argumentCount were passed."); } /** * @param list<Value> $arguments */ public static function opacity(array $arguments): Value { if ($arguments[0] instanceof SassNumber || $arguments[0]->isSpecialNumber()) { // Use the native CSS `opacity` filter function. return self::functionString('opacity', $arguments); } $color = $arguments[0]->assertColor('color'); return SassNumber::create($color->getAlpha()); } /** * @param list<Value> $arguments */ public static function red(array $arguments): Value { return SassNumber::create($arguments[0]->assertColor('color')->getRed()); } /** * @param list<Value> $arguments */ public static function green(array $arguments): Value { return SassNumber::create($arguments[0]->assertColor('color')->getGreen()); } /** * @param list<Value> $arguments */ public static function blue(array $arguments): Value { return SassNumber::create($arguments[0]->assertColor('color')->getBlue()); } /** * @param list<Value> $arguments */ public static function mix(array $arguments): Value { $color1 = $arguments[0]->assertColor('color1'); $color2 = $arguments[1]->assertColor('color2'); $weight = $arguments[2]->assertNumber('weight'); return self::mixColors($color1, $color2, $weight); } /** * @param list<Value> $arguments */ public static function hue(array $arguments): Value { return SassNumber::create($arguments[0]->assertColor('color')->getHue(), 'deg'); } /** * @param list<Value> $arguments */ public static function saturation(array $arguments): Value { return SassNumber::create($arguments[0]->assertColor('color')->getSaturation(), '%'); } /** * @param list<Value> $arguments */ public static function lightness(array $arguments): Value { return SassNumber::create($arguments[0]->assertColor('color')->getLightness(), '%'); } /** * @param list<Value> $arguments */ public static function complement(array $arguments): Value { $color = $arguments[0]->assertColor('color'); return $color->changeHsl(hue: $color->getHue() + 180); } /** * @param list<Value> $arguments */ public static function adjust(array $arguments): Value { return self::updateComponents($arguments, adjust: true); } /** * @param list<Value> $arguments */ public static function scale(array $arguments): Value { return self::updateComponents($arguments, scale: true); } /** * @param list<Value> $arguments */ public static function change(array $arguments): Value { return self::updateComponents($arguments, change: true); } /** * @param list<Value> $arguments */ public static function ieHexStr(array $arguments): Value { $color = $arguments[0]->assertColor('color'); return new SassString('#' . self::hexString(NumberUtil::fuzzyRound($color->getAlpha() * 255)) . self::hexString($color->getRed()) . self::hexString($color->getGreen()) . self::hexString($color->getBlue()), false); } private static function hexString(int $component): string { return strtoupper(str_pad(dechex($component), 2, '0', STR_PAD_LEFT)); } /** * @param list<Value> $arguments */ private static function updateComponents(array $arguments, bool $change = false, bool $adjust = false, bool $scale = false): SassColor { \assert(\count(array_filter([$change, $adjust, $scale])) === 1); $color = $arguments[0]->assertColor('color'); $argumentList = $arguments[1]; \assert($argumentList instanceof SassArgumentList); if (\count($argumentList->asList()) > 0) { throw new SassScriptException('Only one positional argument is allowed. All other arguments must be passed by name.'); } $keywords = $argumentList->getKeywords(); $getParam = function (string $name, float $max, bool $checkPercent = false, bool $assertPercent = false, bool $checkUnitless = false) use (&$keywords, $change, $scale): ?float { $number = ($keywords[$name] ?? null)?->assertNumber($name); unset($keywords[$name]); if ($number === null) { return null; } if (!$scale && $checkUnitless) { if ($number->hasUnits()) { Warn::forDeprecation( <<<TXT \$$name: Passing a number with unit {$number->getUnitString()} is deprecated. To preserve current behavior: {$number->unitSuggestion($name)} More info: https://sass-lang.com/d/function-units TXT, Deprecation::functionUnits ); } } if (!$scale && $checkPercent) { self::checkPercent($number, $name); } if ($scale || $assertPercent) { $number->assertUnit('%', $name); } if ($scale) { $max = 100; } return $scale || $assertPercent ? $number->valueInRange($change ? 0 : -$max, $max, $name) : $number->valueInRangeWithUnit($change ? 0 : -$max, $max, $name, $checkPercent ? '%' : ''); }; $alpha = $getParam('alpha', 1, checkUnitless: true); $red = $getParam('red', 255); $green = $getParam('green', 255); $blue = $getParam('blue', 255); if ($scale) { $hue = null; } else { $hueValue = $keywords['hue'] ?? null; unset($keywords['hue']); $hue = $hueValue === null ? null : self::angleValue($hueValue, 'hue'); } $saturation = $getParam('saturation', 100, checkPercent: true); $lightness = $getParam('lightness', 100, checkPercent: true); $whiteness = $getParam('whiteness', 100, assertPercent: true); $blackness = $getParam('blackness', 100, assertPercent: true); if (\count($keywords) > 0) { throw new SassScriptException(sprintf( 'No %s named %s.', StringUtil::pluralize('argument', \count($keywords)), StringUtil::toSentence(array_map(fn($name) => "\$$name", array_keys($keywords)), 'or') )); } $hasRgb = $red !== null || $green !== null || $blue !== null; $hasSL = $saturation !== null || $lightness !== null; $hasWB = $whiteness !== null || $blackness !== null; if ($hasRgb && ($hasSL || $hasWB || $hue !== null)) { $format = $hasWB ? 'HWB' : 'HSL'; throw new SassScriptException("RGB parameters may not be passed along with $format parameters."); } if ($hasSL && $hasWB) { throw new SassScriptException('HSL parameters may not be passed along with HWB parameters.'); } $updateValue = function (float $current, ?float $param, float $max) use ($change, $adjust): float { if ($param === null) { return $current; } if ($change) { return $param; } if ($adjust) { return NumberUtil::clamp($current + $param, 0, $max); } return $current + ($param > 0 ? $max - $current : $current) * $param / 100; }; $updateRgb = function (int $current, ?float $param) use ($updateValue): int { return NumberUtil::fuzzyRound($updateValue($current, $param, 255)); }; if ($hasRgb) { return $color->changeRgb( $updateRgb($color->getRed(), $red), $updateRgb($color->getGreen(), $green), $updateRgb($color->getBlue(), $blue), $updateValue($color->getAlpha(), $alpha, 1) ); } if ($hasWB) { return $color->changeHwb( $change ? $hue : $color->getHue() + ($hue ?? 0), $updateValue($color->getWhiteness(), $whiteness, 100), $updateValue($color->getBlackness(), $blackness, 100), $updateValue($color->getAlpha(), $alpha, 1) ); } if ($hue !== null || $hasSL) { return $color->changeHsl( $change ? $hue : $color->getHue() + ($hue ?? 0), $updateValue($color->getSaturation(), $saturation, 100), $updateValue($color->getLightness(), $lightness, 100), $updateValue($color->getAlpha(), $alpha, 1) ); } if ($alpha !== null) { return $color->changeAlpha($updateValue($color->getAlpha(), $alpha, 1)); } return $color; } /** * Returns a string representation of $name called with $arguments, as though * it were a plain CSS function. * * @param Value[] $arguments */ private static function functionString(string $name, array $arguments): SassString { return new SassString($name . '(' . implode(', ', array_map(fn(Value $argument) => $argument->toCssString(), $arguments)) . ')', false); } /** * @param list<Value> $arguments */ private static function rgbImpl(string $name, array $arguments): Value { $alpha = $arguments[3] ?? null; if ($arguments[0]->isSpecialNumber() || $arguments[1]->isSpecialNumber() || $arguments[2]->isSpecialNumber() || ($alpha?->isSpecialNumber() ?? false)) { return self::functionString($name, $arguments); } $red = $arguments[0]->assertNumber('red'); $green = $arguments[1]->assertNumber('green'); $blue = $arguments[2]->assertNumber('blue'); return SassColor::rgbInternal( NumberUtil::fuzzyRound(self::percentageOrUnitless($red, 255, 'red')), NumberUtil::fuzzyRound(self::percentageOrUnitless($green, 255, 'green')), NumberUtil::fuzzyRound(self::percentageOrUnitless($blue, 255, 'blue')), $alpha !== null ? self::percentageOrUnitless($alpha->assertNumber('alpha'), 1, 'alpha') : 1, ColorFormatEnum::rgbFunction ); } /** * @param list<Value> $arguments */ private static function rgbTwoArgsImpl(string $name, array $arguments): Value { // rgba(var(--foo), 0.5) is valid CSS because --foo might be `123, 456, 789` // and functions are parsed after variable substitution. if ($arguments[0]->isVar() || (!$arguments[0] instanceof SassColor && $arguments[1]->isVar())) { return self::functionString($name, $arguments); } if ($arguments[1]->isSpecialNumber()) { $color = $arguments[0]->assertColor('color'); return new SassString("$name({$color->getRed()}, {$color->getGreen()}, {$color->getBlue()}, {$arguments[1]->toCssString()})", false); } $color = $arguments[0]->assertColor('color'); $alpha = $arguments[1]->assertNumber('alpha'); return $color->changeAlpha(self::percentageOrUnitless($alpha, 1, 'alpha')); } /** * @param list<Value> $arguments */ private static function hslImpl(string $name, array $arguments): Value { $alpha = $arguments[3] ?? null; if ($arguments[0]->isSpecialNumber() || $arguments[1]->isSpecialNumber() || $arguments[2]->isSpecialNumber() || ($alpha?->isSpecialNumber() ?? false)) { return self::functionString($name, $arguments); } $hue = self::angleValue($arguments[0], 'hue'); $saturation = $arguments[1]->assertNumber('saturation'); $lightness = $arguments[2]->assertNumber('lightness'); self::checkPercent($saturation, 'saturation'); self::checkPercent($lightness, 'lightness'); return SassColor::hslInternal( $hue, NumberUtil::clamp($saturation->getValue(), 0, 100), NumberUtil::clamp($lightness->getValue(), 0, 100), $alpha !== null ? self::percentageOrUnitless($alpha->assertNumber('alpha'), 1, 'alpha') : 1, ColorFormatEnum::hslFunction ); } /** * Asserts that $angle is a number and returns its value in degrees. * * Prints a deprecation warning if $angle has a non-angle unit. */ private static function angleValue(Value $angleValue, string $name): float { $angle = $angleValue->assertNumber($name); if ($angle->compatibleWithUnit('deg')) { return $angle->coerceValueToUnit('deg'); } Warn::forDeprecation( <<<TXT \$$name: Passing a unit other than deg ($angle) is deprecated. To preserve current behavior: {$angle->unitSuggestion($name)} See https://sass-lang.com/d/function-units TXT, Deprecation::functionUnits ); return $angle->getValue(); } private static function checkPercent(SassNumber $number, string $name): void { if ($number->hasUnit('%')) { return; } Warn::forDeprecation( <<<TXT \$$name: Passing a number without unit % ($number) is deprecated. To preserve current behavior: {$number->unitSuggestion($name, '%')} More info: https://sass-lang.com/d/function-units TXT, Deprecation::functionUnits ); } /** * @param list<string> $argumentNames * * @return SassString|list<Value> */ private static function parseChannels(string $name, array $argumentNames, Value $channels): SassString|array { if ($channels->isVar()) { return self::functionString($name, [$channels]); } $originalChannels = $channels; $alphaFromSlashList = null; if ($channels->getSeparator() === ListSeparator::SLASH) { $list = $channels->asList(); if (\count($list) !== 2) { throw new SassScriptException(sprintf( 'Only 2 slash-separated elements allowed, but %s %s passed.', \count($list), StringUtil::pluralize('was', \count($list), 'were') )); } $channels = $list[0]; $alphaFromSlashList = $list[1]; if (!$alphaFromSlashList->isSpecialNumber()) { $alphaFromSlashList->assertNumber('alpha'); } if ($list[0]->isVar()) { return self::functionString($name, [$originalChannels]); } } $isCommaSeparated = $channels->getSeparator() === ListSeparator::COMMA; $isBracketed = $channels->hasBrackets(); if ($isCommaSeparated || $isBracketed) { $buffer = '$channels must be'; if ($isBracketed) { $buffer .= ' an unbracketed'; } if ($isCommaSeparated) { $buffer .= $isBracketed ? ',' : ' a'; $buffer .= ' space-separated'; } $buffer .= ' list.'; throw new SassScriptException($buffer); } $list = $channels->asList(); if (\count($list) >= 2 && $list[0] instanceof SassString && !$list[0]->hasQuotes() && StringUtil::equalsIgnoreCase($list[0]->getText(), 'from')) { return self::functionString($name, [$originalChannels]); } if (\count($list) > 3) { throw new SassScriptException(sprintf( 'Only 3 elements allowed, but %s were passed.', \count($list) )); } if (\count($list) < 3) { if (IterableUtil::any($list, fn (Value $value) => $value->isVar()) || (\count($list) > 0 && self::isVarSlash($list[0]))) { return self::functionString($name, [$originalChannels]); } $argument = $argumentNames[\count($list)]; throw new SassScriptException("Missing element $argument."); } if ($alphaFromSlashList !== null) { return [...$list, $alphaFromSlashList]; } if ($list[2] instanceof SassNumber && $list[2]->getAsSlash() !== null) { [$channel3, $alpha] = $list[2]->getAsSlash(); return [$list[0], $list[1], $channel3, $alpha]; } if ($list[2] instanceof SassString && !$list[2]->hasQuotes() && str_contains($list[2]->getText(), '/')) { return self::functionString($name, [$channels]); } return $list; } /** * Returns whether $value is an unquoted string that start with `var(` and * contains `/`. */ private static function isVarSlash(Value $value): bool { return $value instanceof SassString && $value->hasQuotes() && StringUtil::startsWithIgnoreCase($value->getText(), 'var(') && str_contains($value->getText(), '/'); } /** * Asserts that $number is a percentage or has no units, and normalizes the * value. * * If $number has no units, its value is clamped to be greater than `0` or * less than $max and returned. If $number is a percentage, it's scaled to be * within `0` and $max. Otherwise, this throws a {@see SassScriptException}. * * $name is used to identify the argument in the error message. */ private static function percentageOrUnitless(SassNumber $number, float $max, string $name): float { if (!$number->hasUnits()) { $value = $number->getValue(); } elseif ($number->hasUnit('%')) { $value = $max * $number->getValue() / 100; } else { throw new SassScriptException("\$$name: Expected $number to have unit \"%\" or no units."); } return NumberUtil::clamp($value, 0, $max); } private static function mixColors(SassColor $color1, SassColor $color2, SassNumber $weight): SassColor { self::checkPercent($weight, 'weight'); // This algorithm factors in both the user-provided weight (w) and the // difference between the alpha values of the two colors (a) to decide how // to perform the weighted average of the two RGB values. // // It works by first normalizing both parameters to be within [-1, 1], where // 1 indicates "only use color1", -1 indicates "only use color2", and all // values in between indicated a proportionately weighted average. // // Once we have the normalized variables w and a, we apply the formula // (w + a)/(1 + w*a) to get the combined weight (in [-1, 1]) of color1. This // formula has two especially nice properties: // // * When either w or a are -1 or 1, the combined weight is also that // number (cases where w * a == -1 are undefined, and handled as a // special case). // // * When a is 0, the combined weight is w, and vice versa. // // Finally, the weight of color1 is renormalized to be within [0, 1] and the // weight of color2 is given by 1 minus the weight of color1. $weightScale = $weight->valueInRange(0, 100, 'weight') / 100; $normalizedWeight = $weightScale * 2 - 1; $alphaDistance = $color1->getAlpha() - $color2->getAlpha(); $combinedWeight1 = $normalizedWeight * $alphaDistance == -1 ? $normalizedWeight : ($normalizedWeight + $alphaDistance) / (1 + $normalizedWeight * $alphaDistance); $weight1 = ($combinedWeight1 + 1) / 2; $weight2 = 1 - $weight1; return SassColor::rgb( NumberUtil::fuzzyRound($color1->getRed() * $weight1 + $color2->getRed() * $weight2), NumberUtil::fuzzyRound($color1->getGreen() * $weight1 + $color2->getGreen() * $weight2), NumberUtil::fuzzyRound($color1->getBlue() * $weight1 + $color2->getBlue() * $weight2), $color1->getAlpha() * $weightScale + $color2->getAlpha() * (1 - $weightScale) ); } /** * @param list<Value> $arguments */ public static function opacify(array $arguments): SassColor { $color = $arguments[0]->assertColor('color'); $amount = $arguments[1]->assertNumber('amount'); return $color->changeAlpha(NumberUtil::clamp($color->getAlpha() + $amount->valueInRangeWithUnit(0, 1, 'amount', ''), 0, 1)); } /** * @param list<Value> $arguments */ public static function transparentize(array $arguments): SassColor { $color = $arguments[0]->assertColor('color'); $amount = $arguments[1]->assertNumber('amount'); return $color->changeAlpha(NumberUtil::clamp($color->getAlpha() - $amount->valueInRangeWithUnit(0, 1, 'amount', ''), 0, 1)); } } PKCA#]j�||Osystem/helixultimate/vendor/scssphp/scssphp/src/Exception/CompilerException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Exception; /** * Compiler exception * * @author Oleksandr Savchenko <traveltino@gmail.com> * * @internal */ class CompilerException extends \Exception implements SassException { } PKCA#][/ ��Qsystem/helixultimate/vendor/scssphp/scssphp/src/Exception/SassScriptException.phpnu�[���<?php namespace ScssPhp\ScssPhp\Exception; use JiriPudil\SealedClasses\Sealed; use SourceSpan\FileSpan; /** * An exception thrown by SassScript. * * This class does not implement SassException on purpose, as it should * never be returned to the outside code. The compilation will catch it * and replace it with a SassException reporting the location of the * error. */ #[Sealed([MultiSpanSassScriptException::class])] class SassScriptException extends \Exception { /** * Creates a SassScriptException with support for an argument name. * * This helper ensures a consistent handling of argument names in the * error message, without duplicating it. * * @param string|null $name The argument name, without $ */ public static function forArgument(string $message, ?string $name = null, ?\Throwable $previous = null): SassScriptException { $varDisplay = !\is_null($name) ? "\${$name}: " : ''; return new self($varDisplay . $message, 0, $previous); } /** * Converts this to a {@see SassException} with the given $span. * * @internal */ public function withSpan(FileSpan $span): SassException { return new SimpleSassException($this->message, $span, $this); } } PKCA#]Gt�W��[system/helixultimate/vendor/scssphp/scssphp/src/Exception/MultiSpanSassRuntimeException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Exception; use ScssPhp\ScssPhp\StackTrace\Trace; use SourceSpan\FileSpan; /** * @internal */ final class MultiSpanSassRuntimeException extends MultiSpanSassException implements SassRuntimeException { private readonly Trace $sassTrace; /** * @param array<string, FileSpan> $secondarySpans */ public function __construct(string $message, FileSpan $span, string $primaryLabel, array $secondarySpans, Trace $sassTrace, ?\Throwable $previous = null) { $this->sassTrace = $sassTrace; parent::__construct($message, $span, $primaryLabel, $secondarySpans, $previous); } public function getSassTrace(): Trace { return $this->sassTrace; } public function withAdditionalSpan(FileSpan $span, string $label, ?\Throwable $previous = null): MultiSpanSassRuntimeException { return new self($this->getOriginalMessage(), $this->getSpan(), $this->primaryLabel, $this->secondarySpans + [$label => $span], $this->sassTrace, $previous); } } PKCA#]��Ű��Zsystem/helixultimate/vendor/scssphp/scssphp/src/Exception/MultiSpanSassFormatException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Exception; use SourceSpan\FileSpan; /** * @internal */ final class MultiSpanSassFormatException extends MultiSpanSassException implements SassFormatException { public function withAdditionalSpan(FileSpan $span, string $label, ?\Throwable $previous = null): MultiSpanSassFormatException { return new self($this->getOriginalMessage(), $this->getSpan(), $this->primaryLabel, $this->secondarySpans + [$label => $span], $previous); } } PKCA#]T,���Rsystem/helixultimate/vendor/scssphp/scssphp/src/Exception/SassRuntimeException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Exception; use SourceSpan\FileSpan; /** * @internal */ interface SassRuntimeException extends SassException { public function withAdditionalSpan(FileSpan $span, string $label, ?\Throwable $previous = null): MultiSpanSassRuntimeException; } PKCA#]��Msystem/helixultimate/vendor/scssphp/scssphp/src/Exception/ServerException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Exception; @trigger_error(sprintf('The "%s" class is deprecated.', ServerException::class), E_USER_DEPRECATED); /** * Server Exception * * @author Anthon Pang <anthon.pang@gmail.com> * * @deprecated The Scssphp server should define its own exception instead. */ class ServerException extends \Exception implements SassException { } PKCA#]9�w�77Qsystem/helixultimate/vendor/scssphp/scssphp/src/Exception/SimpleSassException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Exception; use ScssPhp\ScssPhp\StackTrace\Trace; use ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Util\ErrorUtil; use SourceSpan\FileSpan; /** * @internal */ final class SimpleSassException extends \Exception implements SassException { private readonly string $originalMessage; private readonly FileSpan $span; public function __construct(string $message, FileSpan $span, ?\Throwable $previous = null) { $this->originalMessage = $message; $this->span = $span; parent::__construct(ErrorUtil::formatErrorMessage($message, $span, $this->getSassTrace()), 0, $previous); } public function getOriginalMessage(): string { return $this->originalMessage; } public function getSpan(): FileSpan { return $this->span; } public function getSassTrace(): Trace { return new Trace([Util::frameForSpan($this->span, 'root stylesheet')]); } public function withAdditionalSpan(FileSpan $span, string $label, ?\Throwable $previous = null): MultiSpanSassException { return new MultiSpanSassException($this->originalMessage, $this->span, '', [$label => $span], $previous); } public function withTrace(Trace $trace, ?\Throwable $previous = null): SassRuntimeException { return new SimpleSassRuntimeException($this->originalMessage, $this->span, $trace, $previous); } } PKCA#]n^�VVTsystem/helixultimate/vendor/scssphp/scssphp/src/Exception/MultiSpanSassException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Exception; use ScssPhp\ScssPhp\StackTrace\Trace; use ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Util\ErrorUtil; use SourceSpan\FileSpan; /** * @internal */ class MultiSpanSassException extends \Exception implements SassException { public readonly string $primaryLabel; /** * @var array<string, FileSpan> */ public readonly array $secondarySpans; private readonly string $originalMessage; private readonly FileSpan $span; /** * @param array<string, FileSpan> $secondarySpans */ public function __construct(string $message, FileSpan $span, string $primaryLabel, array $secondarySpans, ?\Throwable $previous = null) { $this->originalMessage = $message; $this->span = $span; $this->primaryLabel = $primaryLabel; $this->secondarySpans = $secondarySpans; parent::__construct(ErrorUtil::formatErrorMessageMultiple($message, $span, $primaryLabel, $secondarySpans, $this->getSassTrace()), 0, $previous); } /** * Gets the original message without the location info in it. */ public function getOriginalMessage(): string { return $this->originalMessage; } public function getSpan(): FileSpan { return $this->span; } public function getSassTrace(): Trace { return new Trace([Util::frameForSpan($this->span, 'root stylesheet')]); } public function withAdditionalSpan(FileSpan $span, string $label, ?\Throwable $previous = null): MultiSpanSassException { return new self($this->originalMessage, $this->span, $this->primaryLabel, $this->secondarySpans + [$label => $span], $previous); } public function withTrace(Trace $trace, ?\Throwable $previous = null): MultiSpanSassRuntimeException { return new MultiSpanSassRuntimeException($this->originalMessage, $this->span, $this->primaryLabel, $this->secondarySpans, $trace, $previous); } } PKCA#]8چ�Msystem/helixultimate/vendor/scssphp/scssphp/src/Exception/ParserException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Exception; /** * Parser Exception * * @author Oleksandr Savchenko <traveltino@gmail.com> * * @internal */ class ParserException extends \Exception implements SassException { /** * @var array|null * @phpstan-var array{string, int, int}|null */ private $sourcePosition; /** * Get source position * * @api * * @return array|null * @phpstan-return array{string, int, int}|null */ public function getSourcePosition() { return $this->sourcePosition; } /** * Set source position * * @api * * @param array $sourcePosition * * @return void * * @phpstan-param array{string, int, int} $sourcePosition */ public function setSourcePosition($sourcePosition) { $this->sourcePosition = $sourcePosition; } } PKCA#]�N��Wsystem/helixultimate/vendor/scssphp/scssphp/src/Exception/SimpleSassFormatException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Exception; use ScssPhp\ScssPhp\StackTrace\Trace; use ScssPhp\ScssPhp\Util; use ScssPhp\ScssPhp\Util\ErrorUtil; use SourceSpan\FileSpan; /** * @internal */ final class SimpleSassFormatException extends \Exception implements SassFormatException { private readonly string $originalMessage; private readonly FileSpan $span; public function __construct(string $message, FileSpan $span, ?\Throwable $previous = null) { $this->originalMessage = $message; $this->span = $span; parent::__construct(ErrorUtil::formatErrorMessage($message, $span, $this->getSassTrace()), 0, $previous); } /** * Gets the original message without the location info in it. */ public function getOriginalMessage(): string { return $this->originalMessage; } public function getSpan(): FileSpan { return $this->span; } public function getSassTrace(): Trace { return new Trace([Util::frameForSpan($this->span, 'root stylesheet')]); } public function withAdditionalSpan(FileSpan $span, string $label, ?\Throwable $previous = null): MultiSpanSassFormatException { return new MultiSpanSassFormatException($this->originalMessage, $this->span, '', [$label => $span], $previous); } public function withTrace(Trace $trace, ?\Throwable $previous = null): SassRuntimeException { return new SimpleSassRuntimeException($this->originalMessage, $this->span, $trace, $previous); } } PKCA#]��;Qsystem/helixultimate/vendor/scssphp/scssphp/src/Exception/SassFormatException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Exception; /** * @internal */ interface SassFormatException extends SassException { } PKCA#]I&�Xsystem/helixultimate/vendor/scssphp/scssphp/src/Exception/SimpleSassRuntimeException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Exception; use ScssPhp\ScssPhp\StackTrace\Trace; use ScssPhp\ScssPhp\Util\ErrorUtil; use SourceSpan\FileSpan; /** * @internal */ final class SimpleSassRuntimeException extends \Exception implements SassRuntimeException { /** * @var string * @readonly */ private $originalMessage; /** * @var FileSpan * @readonly */ private $span; private readonly Trace $sassTrace; public function __construct(string $message, FileSpan $span, Trace $sassTrace, ?\Throwable $previous = null) { $this->originalMessage = $message; $this->span = $span; $this->sassTrace = $sassTrace; parent::__construct(ErrorUtil::formatErrorMessage($message, $span, $this->sassTrace), 0, $previous); } /** * Gets the original message without the location info in it. */ public function getOriginalMessage(): string { return $this->originalMessage; } public function getSpan(): FileSpan { return $this->span; } public function getSassTrace(): Trace { return $this->sassTrace; } public function withAdditionalSpan(FileSpan $span, string $label, ?\Throwable $previous = null): MultiSpanSassRuntimeException { return new MultiSpanSassRuntimeException($this->originalMessage, $this->span, '', [$label => $span], $this->sassTrace, $previous); } public function withTrace(Trace $trace, ?\Throwable $previous = null): SassRuntimeException { return new SimpleSassRuntimeException($this->originalMessage, $this->span, $trace, $previous); } } PKCA#]Sp���Ksystem/helixultimate/vendor/scssphp/scssphp/src/Exception/SassException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Exception; use ScssPhp\ScssPhp\StackTrace\Trace; use SourceSpan\FileSpan; interface SassException extends \Throwable { /** * The span associated with this exception. */ public function getSpan(): FileSpan; /** * Gets the original message without the location info in it. */ public function getOriginalMessage(): string; /** * The Sass stack trace at the point this exception was thrown. * * This includes {@see getSpan}. */ public function getSassTrace(): Trace; /** * Converts this to a {@see MultiSpanSassException} with the additional $span and * $label. * * @internal */ public function withAdditionalSpan(FileSpan $span, string $label, ?\Throwable $previous = null): MultiSpanSassException; /** * Returns a copy of this as a {@see SassRuntimeException} with $trace as its * Sass stack trace. * * @internal */ public function withTrace(Trace $trace, ?\Throwable $previous = null): SassRuntimeException; } PKCA#]��4looLsystem/helixultimate/vendor/scssphp/scssphp/src/Exception/RangeException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Exception; /** * Range exception * * @author Anthon Pang <anthon.pang@gmail.com> * * @internal */ class RangeException extends \Exception implements SassException { } PKCA#]�TCyyZsystem/helixultimate/vendor/scssphp/scssphp/src/Exception/MultiSpanSassScriptException.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Exception; use SourceSpan\FileSpan; /** * @internal */ final class MultiSpanSassScriptException extends SassScriptException { /** * {@see MultiSpanSassException::$primaryLabel} */ public readonly string $primaryLabel; /** * {@see MultiSpanSassException::$secondarySpans} * * @var array<string, FileSpan> */ public readonly array $secondarySpans; /** * @param array<string, FileSpan> $secondarySpans */ public function __construct(string $message, string $primaryLabel, array $secondarySpans, ?\Throwable $previous = null) { $this->primaryLabel = $primaryLabel; $this->secondarySpans = $secondarySpans; parent::__construct($message, 0, $previous); } public function withSpan(FileSpan $span): MultiSpanSassException { return new MultiSpanSassException($this->message, $span, $this->primaryLabel, $this->secondarySpans, $this); } } PKCA#]�:�-ww9system/helixultimate/vendor/scssphp/scssphp/src/Block.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; /** * Block * * @author Anthon Pang <anthon.pang@gmail.com> * * @internal */ class Block { /** * @var string|null */ public $type; /** * @var Block|null */ public $parent; /** * @var string */ public $sourceName; /** * @var int */ public $sourceIndex; /** * @var int */ public $sourceLine; /** * @var int */ public $sourceColumn; /** * @var array|null */ public $selectors; /** * @var array */ public $comments; /** * @var array */ public $children; /** * @var Block|null */ public $selfParent; } PKCA#]���s s 8system/helixultimate/vendor/scssphp/scssphp/src/Util.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; use League\Uri\Contracts\UriInterface; use League\Uri\Uri; use ScssPhp\ScssPhp\StackTrace\Frame; use ScssPhp\ScssPhp\Util\StringUtil; use SourceSpan\FileSpan; /** * Utility functions * * @author Anthon Pang <anthon.pang@gmail.com> * * @internal */ final class Util { /** * Returns $string with every line indented $indentation spaces. */ public static function indent(string $string, int $indentation): string { return implode("\n", array_map(function ($line) use ($indentation) { return str_repeat(' ', $indentation) . $line; }, explode("\n", $string))); } /** * Encode URI component */ public static function encodeURIComponent(string $string): string { $revert = ['%21' => '!', '%2A' => '*', '%27' => "'", '%28' => '(', '%29' => ')']; return strtr(rawurlencode($string), $revert); } public static function frameForSpan(FileSpan $span, string $member, ?UriInterface $url = null): Frame { return new Frame( $url ?? $span->getSourceUrl() ?? Uri::new('-'), $span->getStart()->getLine() + 1, $span->getStart()->getColumn() + 1, $member ); } /** * Returns the variable name (including the leading `$`) from a $span that * covers a variable declaration, which includes the variable name as well as * the colon and expression following it. * * This isn't particularly efficient, and should only be used for error * messages. */ public static function declarationName(FileSpan $span): string { $text = $span->getText(); $pos = strpos($text, ':'); return StringUtil::trimAsciiRight(substr($text, 0, $pos === false ? null : $pos)); } /** * Returns $name without a vendor prefix. * * If $name has no vendor prefix, it's returned as-is. */ public static function unvendor(string $name): string { $length = \strlen($name); if ($length < 2) { return $name; } if ($name[0] !== '-') { return $name; } if ($name[1] === '-') { return $name; } for ($i = 2; $i < $length; $i++) { if ($name[$i] === '-') { return substr($name, $i + 1); } } return $name; } /** * Like {@see \SplObjectStorage::addAll()}, but for two-layer maps. * * This avoids copying inner maps from $source if possible. * * @template K1 of object * @template K2 of object * @template V * @template Inner of \SplObjectStorage<K2, V> * * @param \SplObjectStorage<K1, Inner> $destination * @param \SplObjectStorage<K1, Inner> $source */ public static function mapAddAll2(\SplObjectStorage $destination, \SplObjectStorage $source): void { foreach ($source as $key) { $inner = $source->getInfo(); $innerDestination = $destination[$key] ?? null; if ($innerDestination !== null) { $innerDestination->addAll($inner); } else { $destination[$key] = $inner; } } } } PKCA#]����k�k<system/helixultimate/vendor/scssphp/scssphp/src/Compiler.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; use League\Uri\Contracts\UriInterface; use League\Uri\Uri; use ScssPhp\ScssPhp\Ast\Css\CssParentNode; use ScssPhp\ScssPhp\Ast\Sass\Statement\Stylesheet; use ScssPhp\ScssPhp\Collection\Map; use ScssPhp\ScssPhp\Compiler\LegacyValueVisitor; use ScssPhp\ScssPhp\Evaluation\EvaluateVisitor; use ScssPhp\ScssPhp\Exception\SassException; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Function\FunctionRegistry; use ScssPhp\ScssPhp\Importer\FilesystemImporter; use ScssPhp\ScssPhp\Importer\ImportCache; use ScssPhp\ScssPhp\Importer\Importer; use ScssPhp\ScssPhp\Importer\LegacyCallbackImporter; use ScssPhp\ScssPhp\Importer\NoOpImporter; use ScssPhp\ScssPhp\Logger\DeprecationProcessingLogger; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Logger\StreamLogger; use ScssPhp\ScssPhp\Node\Number; use ScssPhp\ScssPhp\SassCallable\BuiltInCallable; use ScssPhp\ScssPhp\Serializer\Serializer; use ScssPhp\ScssPhp\Util\Path; use ScssPhp\ScssPhp\Value\ListSeparator; use ScssPhp\ScssPhp\Value\SassArgumentList; use ScssPhp\ScssPhp\Value\SassBoolean; use ScssPhp\ScssPhp\Value\SassColor; use ScssPhp\ScssPhp\Value\SassList; use ScssPhp\ScssPhp\Value\SassMap; use ScssPhp\ScssPhp\Value\SassNull; use ScssPhp\ScssPhp\Value\SassNumber; use ScssPhp\ScssPhp\Value\SassString; use ScssPhp\ScssPhp\Value\Value; use ScssPhp\ScssPhp\Visitor\CssVisitor; final class Compiler { const SOURCE_MAP_NONE = 0; const SOURCE_MAP_INLINE = 1; const SOURCE_MAP_FILE = 2; public static $true = [Type::T_KEYWORD, 'true']; public static $false = [Type::T_KEYWORD, 'false']; public static $null = [Type::T_NULL]; public static $emptyList = [Type::T_LIST, '', []]; public static $emptyMap = [Type::T_MAP, [], []]; public static $emptyString = [Type::T_STRING, '"', []]; /** * @var list<Importer> */ private array $importers = []; /** * @var array<int, string|callable(string): (string|null)> */ private array $importPaths = []; /** * @var array<string, array{0: callable, 1: string[]}> */ private array $userFunctions = []; /** * @var array<string, Value> */ private array $registeredVars = []; /** * @var self::SOURCE_MAP_* */ private int $sourceMap = self::SOURCE_MAP_NONE; /** * @var array{sourceRoot?: string, sourceMapFilename?: string|null, sourceMapURL?: string|null, outputSourceFiles?: bool, sourceMapRootpath?: string, sourceMapBasepath?: string} */ private array $sourceMapOptions = []; private bool $charset = true; private bool $quietDeps = false; /** * Deprecation warnings of these types will be ignored. * * @var Deprecation[] */ private array $silenceDeprecations = []; /** * Deprecation warnings of one of these types will cause an error to be * thrown. * * Future deprecations in this list will still cause an error even if they * are not also in {@see $futureDeprecations}. * * @var Deprecation[] */ private array $fatalDeprecations = []; /** * Future deprecations that the user has explicitly opted into. * * @var Deprecation[] */ private array $futureDeprecations = []; private bool $verbose = false; private OutputStyle $outputStyle = OutputStyle::EXPANDED; private LoggerInterface $logger; public function __construct() { $this->logger = new StreamLogger(fopen('php://stderr', 'w'), true); } /** * Sets an alternative logger. * * Changing the logger in the middle of the compilation is not * supported and will result in an undefined behavior. */ public function setLogger(LoggerInterface $logger): void { $this->logger = $logger; } /** * Replaces variables. * * @param array<string, Value> $variables */ public function replaceVariables(array $variables): void { $this->registeredVars = []; $this->addVariables($variables); } /** * Replaces variables. * * @param array<string, Value> $variables */ public function addVariables(array $variables): void { foreach ($variables as $name => $value) { if (!$value instanceof Value) { throw new \InvalidArgumentException('Passing raw values to as custom variables to the Compiler is not supported anymore. Use "\ScssPhp\ScssPhp\ValueConverter::parseValue" or "\ScssPhp\ScssPhp\ValueConverter::fromPhp" to convert them instead.'); } $this->registeredVars[$name] = $value; } } /** * Unset variable */ public function unsetVariable(string $name): void { unset($this->registeredVars[$name]); } /** * Returns list of variables * * @return array<string, Value> */ public function getVariables(): array { return $this->registeredVars; } public function addImporter(Importer $importer): void { $this->importers[] = $importer; } /** * Add import path * * @param string|callable(string): (string|null) $path */ public function addImportPath(string|callable $path): void { if (! \in_array($path, $this->importPaths)) { $this->importPaths[] = $path; } } /** * Set import paths * * @param string|array<string|callable(string): (string|null)> $path */ public function setImportPaths($path): void { $paths = (array) $path; $actualImportPaths = array_filter($paths, function ($path) { return $path !== ''; }); if (\count($actualImportPaths) !== \count($paths)) { throw new \InvalidArgumentException('Passing an empty string in the import paths to refer to the current working directory is not supported anymore. If that\'s the intended behavior, the value of "getcwd()" should be used directly instead. If this was used for resolving relative imports of the input alongside "chdir" with the source directory, the path of the input file should be passed to "compileString()" instead.'); } $this->importPaths = $actualImportPaths; } /** * Sets the output style. */ public function setOutputStyle(OutputStyle $style): void { $this->outputStyle = $style; } /** * Configures the handling of non-ASCII outputs. * * If $charset is `true`, this will include a `@charset` declaration or a * UTF-8 [byte-order mark][] if the stylesheet contains any non-ASCII * characters. Otherwise, it will never include a `@charset` declaration or a * byte-order mark. * * [byte-order mark]: https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8 */ public function setCharset(bool $charset): void { $this->charset = $charset; } /** * If set to `true`, this will silence compiler warnings emitted for stylesheets loaded through {@see $importers} or {@see $importPaths} */ public function setQuietDeps(bool $quietDeps): void { $this->quietDeps = $quietDeps; } /** * Configures the deprecation warning types that will be ignored. * * @param Deprecation[] $silenceDeprecations */ public function setSilenceDeprecations(array $silenceDeprecations): void { $this->silenceDeprecations = $silenceDeprecations; } /** * Configures the deprecation warning types that will cause an error to be thrown. * * @param Deprecation[] $fatalDeprecations */ public function setFatalDeprecations(array $fatalDeprecations): void { $this->fatalDeprecations = $fatalDeprecations; } /** * Configures the opt-in for future deprecation warning types. * * @param Deprecation[] $futureDeprecations */ public function setFutureDeprecations(array $futureDeprecations): void { $this->futureDeprecations = $futureDeprecations; } /** * Configures the verbosity of deprecation warnings. * * In non-verbose mode, repeated deprecations are hidden once reaching the * threshold, with a summary at the end. In verbose mode, all deprecation * warnings are emitted to the logger. */ public function setVerbose(bool $verbose): void { $this->verbose = $verbose; } /** * Enable/disable source maps * * @param self::SOURCE_MAP_* $sourceMap */ public function setSourceMap(int $sourceMap): void { $this->sourceMap = $sourceMap; } /** * Set source map options * * @param array{sourceRoot?: string, sourceMapFilename?: string|null, sourceMapURL?: string|null, outputSourceFiles?: bool, sourceMapRootpath?: string, sourceMapBasepath?: string} $sourceMapOptions */ public function setSourceMapOptions(array $sourceMapOptions): void { $this->sourceMapOptions = $sourceMapOptions; } /** * Registers a custom function * * @param (callable(list<Value>): Value)|(callable(list<array|Number>): (array|Number)) $callback * @param string[] $argumentDeclaration */ public function registerFunction(string $name, callable $callback, array $argumentDeclaration): void { $normalizedName = $this->normalizeName($name); if (FunctionRegistry::isBuiltinFunction($normalizedName)) { throw new \InvalidArgumentException(sprintf('The "%s" function is a core sass function. Overriding it with a custom implementation through "%s" is not supported .', $name, __METHOD__)); } $this->userFunctions[$normalizedName] = [$callback, $argumentDeclaration]; } /** * Unregisters a custom function */ public function unregisterFunction(string $name): void { unset($this->userFunctions[$this->normalizeName($name)]); } private function normalizeName(string $name): string { return str_replace('-', '_', $name); } /** * Compiles the provided scss file into CSS. * * Imports are resolved by trying, in order: * * * Loading a file relative to $path. * * * Each importer in {@see $importers}. * * * Each load path in {@see $importPaths}. Note that this is a shorthand for adding * {@see FilesystemImporter}s to {@see $importers}. * * @throws SassException when the source fails to compile */ public function compileFile(string $path): CompilationResult { // Force loading the CssParentNode and CssVisitor before using the AST classes because of a weird PHP behavior. class_exists(CssParentNode::class); class_exists(CssVisitor::class); $logger = new DeprecationProcessingLogger($this->logger, $this->silenceDeprecations, $this->fatalDeprecations, $this->futureDeprecations, !$this->verbose); $logger->validate(); $importCache = $this->createImportCache($logger); $importer = new FilesystemImporter(null); $stylesheet = $importCache->importCanonical($importer, Path::toUri(Path::canonicalize($path)), Path::toUri($path)); \assert($stylesheet !== null, 'The filesystem importer never returns null when loading a canonical URL. It either succeeds or throws an error.'); $result = $this->compileStylesheet($stylesheet, $importCache, $logger, $importer); $logger->summarize(); return $result; } /** * Compiles the provided scss source code into CSS. * * Imports are resolved by trying, in order: * * * The given $importer, with the imported URL resolved relative to $url. * * * Each importer in {@see $importers}. * * * Each load path in {@see $importPaths}. Note that this is a shorthand for adding * {@see FilesystemImporter}s to {@see $importers}. * * The $url indicates the location from which $source was loaded. If $importer is * passed, $url must be passed as well and `$importer->load($url)` should * return `$source`. * * @throws SassException when the source fails to compile */ public function compileString(string $source, UriInterface|string|null $url = null, ?Importer $importer = null, Syntax $syntax = Syntax::SCSS): CompilationResult { // Force loading the CssParentNode and CssVisitor before using the AST classes because of a weird PHP behavior. class_exists(CssParentNode::class); class_exists(CssVisitor::class); $logger = new DeprecationProcessingLogger($this->logger, $this->silenceDeprecations, $this->fatalDeprecations, $this->futureDeprecations, !$this->verbose); $logger->validate(); if (\is_string($url)) { @trigger_error('Passing a path to "Compiler::compileString" is deprecated. Use `Compiler::compileFile" or pass a "UriInterface" instead.', E_USER_DEPRECATED); $url = Path::toUri($url); $importer ??= new FilesystemImporter(null); } $importCache = $this->createImportCache($logger); $stylesheet = Stylesheet::parse($source, $syntax, $logger, $url); $importer ??= $url === null ? new NoOpImporter() : new FilesystemImporter(null); $result = $this->compileStylesheet($stylesheet, $importCache, $logger, $importer); $logger->summarize(); return $result; } private function createImportCache(LoggerInterface $logger): ImportCache { $importers = $this->importers; foreach ($this->importPaths as $importPath) { if (\is_string($importPath)) { $importers[] = new FilesystemImporter($importPath); } elseif (is_callable($importPath)) { $importers[] = new LegacyCallbackImporter($importPath(...)); // TODO report deprecation } } return new ImportCache($importers, $logger); } /** * @throws SassException */ private function compileStylesheet(Stylesheet $stylesheet, ImportCache $importCache, LoggerInterface $logger, Importer $importer): CompilationResult { $wantsSourceMap = $this->sourceMap !== self::SOURCE_MAP_NONE; $functions = []; foreach ($this->userFunctions as $name => $userFunction) { $ref = new \ReflectionFunction($userFunction[0](...)); $signature = implode(', ', array_map(fn (string $arg) => '$' . $arg, $userFunction[1])); if ($ref->hasReturnType() && $ref->getReturnType() instanceof \ReflectionNamedType && $ref->getReturnType()->getName() === Value::class) { $callback = $userFunction[0]; } else { $legacyCallback = $userFunction[0]; $callback = function (array $arguments) use ($legacyCallback): Value { $args = []; foreach ($arguments as $argument) { $args[] = $this->valueToLegacyValue($argument); } $result = $legacyCallback($args); if ($result instanceof Value) { return $result; } return $this->legacyValueToValue($result); }; } $functions[] = BuiltInCallable::function($name, $signature, $callback); } $initialVariables = []; foreach ($this->registeredVars as $variableName => $variable) { if ($variableName[0] === '$') { $variableName = substr($variableName, 1); } $variableName = str_replace('_', '-', $variableName); $initialVariables[$variableName] = $variable; } $evaluateResult = (new EvaluateVisitor($importCache, $functions, $logger, $this->quietDeps, sourceMap: $wantsSourceMap))->run($importer, $stylesheet, $initialVariables); $serializeResult = Serializer::serialize($evaluateResult->getStylesheet(), style: $this->outputStyle, sourceMap: $wantsSourceMap, charset: $this->charset, logger: $logger); $css = $serializeResult->css; $sourceMap = null; if ($serializeResult->mapping !== null) { $mapping = $serializeResult->mapping; if (isset($this->sourceMapOptions['sourceMapBasepath']) || isset($this->sourceMapOptions['sourceMapRootpath'])) { $mapping = $mapping->mapUrls(function (string $url) { $uri = Uri::new($url); if ($uri->getScheme() !== null && $uri->getScheme() !== 'file') { return $uri->toString(); } $path = Path::fromUri($uri); if (isset($this->sourceMapOptions['sourceMapBasepath']) && $this->sourceMapOptions['sourceMapBasepath'] !== '') { $path = Path::relative($path, $this->sourceMapOptions['sourceMapBasepath']); } return Path::normalize(Path::join($this->sourceMapOptions['sourceMapRootpath'] ?? '', $path)); }); } if (isset($this->sourceMapOptions['sourceMapFilename'])) { $mapping->targetUrl = $this->sourceMapOptions['sourceMapFilename']; } if (isset($this->sourceMapOptions['sourceRoot'])) { $mapping->sourceRoot = $this->sourceMapOptions['sourceRoot']; } $sourceMap = json_encode($mapping->toJson($this->sourceMapOptions['outputSourceFiles'] ?? false), \JSON_THROW_ON_ERROR); $sourceMapUrl = null; switch ($this->sourceMap) { case self::SOURCE_MAP_INLINE: $sourceMapUrl = 'data:application/json;charset=utf-8,' . Util::encodeURIComponent($sourceMap); break; case self::SOURCE_MAP_FILE: if (isset($this->sourceMapOptions['sourceMapURL'])) { $sourceMapUrl = $this->sourceMapOptions['sourceMapURL']; } break; } if ($sourceMapUrl !== null) { $escapedUrl = str_replace('*/', '%2A/', $sourceMapUrl); $css .= ($this->outputStyle === OutputStyle::COMPRESSED ? '' : "\n\n") . "/*# sourceMappingURL=$escapedUrl */"; } } return new CompilationResult($css, $sourceMap, $evaluateResult->getLoadedUrls()); } /** * Converts a Sass value to its legacy representation. * * @return array|Number */ private function valueToLegacyValue(Value $value) { $visitor = new LegacyValueVisitor(); return $value->accept($visitor); } /** * Converts a legacy Sass value to its modern representation. * * @param array|Number $legacyValue */ private function legacyValueToValue($legacyValue): Value { if ($legacyValue instanceof Number) { return SassNumber::withUnits($legacyValue->getDimension(), $legacyValue->getNumeratorUnits(), $legacyValue->getDenominatorUnits()); } switch ($legacyValue[0]) { case Type::T_KEYWORD: if ($legacyValue === self::$true || $legacyValue === self::$false) { return SassBoolean::create($legacyValue === self::$true); } throw new \UnexpectedValueException('Unsupported value using the "keyword" type. Only boolean values should use it as their representation.'); case Type::T_COLOR: return SassColor::rgb($legacyValue[1], $legacyValue[2], $legacyValue[3], $legacyValue[4] ?? 1.0); case Type::T_STRING: return new SassString($this->getStringText($legacyValue), $legacyValue[1] !== ''); case Type::T_LIST: $items = []; foreach ($legacyValue[2] as $item) { $items[] = $this->legacyValueToValue($item); } $separator = match ($legacyValue[1]) { ',' => ListSeparator::COMMA, ' ' => ListSeparator::SPACE, '/' => ListSeparator::SLASH, '' => ListSeparator::UNDECIDED, default => throw new \LogicException(\sprintf('Unsupported list separator "%s".', $legacyValue[1])) }; if (isset($legacyValue[3]) && \is_array($legacyValue[3])) { $keywords = []; foreach ($legacyValue[3] as $name => $item) { assert(\is_string($name)); $keywords[$name] = $this->legacyValueToValue($item); } return new SassArgumentList($items, $keywords, $separator); } $hasBrackets = ($legacyValue['enclosing'] ?? null) === 'bracket'; return new SassList($items, $separator, $hasBrackets); case Type::T_MAP: $map = new Map(); $keys = $legacyValue[1]; $values = $legacyValue[2]; for ($i = 0, $s = \count($keys); $i < $s; $i++) { $map->put($this->legacyValueToValue($keys[$i]), $this->legacyValueToValue($values[$i])); } return SassMap::create($map); case Type::T_NULL: return SassNull::create(); default: throw new \UnexpectedValueException(sprintf('"Unsupported type "%s" for the value conversion.', $legacyValue[0])); } } /** * Detects whether the import is a CSS import. */ public static function isCssImport(string $url): bool { return 1 === preg_match('~\.css$|^https?://|^//~', $url); } /** * Is truthy? * * @param array|Number $value */ public function isTruthy($value): bool { return $value !== self::$false && $value !== self::$null; } /** * Cast to Sass boolean */ public function toBool(bool $thing): array { return $thing ? self::$true : self::$false; } /** * Gets the text of a Sass string * * Calling this method on anything else than a SassString is unsupported. Use {@see assertString} first * to ensure that the value is indeed a string. */ public function getStringText(array $value): string { if ($value[0] !== Type::T_STRING) { throw new \InvalidArgumentException('The argument is not a sass string. Did you forgot to use "assertString"?'); } return $this->compileStringContent($value); } /** * Compile string content */ private function compileStringContent(array $string): string { $parts = []; foreach ($string[2] as $part) { if (\is_array($part) || $part instanceof Number) { $parts[] = $this->compileValue($part); } else { $parts[] = $part; } } return implode($parts); } /** * Assert value is a string * * This method deals with internal implementation details of the value * representation where unquoted strings can sometimes be stored under * other types. * The returned value is always using the T_STRING type. * * @param array|Number $value * * @throws SassScriptException */ public function assertString($value, ?string $varName = null): array { if ($value[0] === Type::T_STRING) { assert(\is_array($value)); return $value; } $value = $this->compileValue($value); throw SassScriptException::forArgument("$value is not a string.", $varName); } /** * Assert value is a map * * @param array|Number $value * * @throws SassScriptException */ public function assertMap($value, ?string $varName = null): array { $map = $this->tryMap($value); if ($map === null) { $value = $this->compileValue($value); throw SassScriptException::forArgument("$value is not a map.", $varName); } return $map; } /** * Tries to convert an item to a Sass map * * @param Number|array $item */ private function tryMap($item): ?array { if ($item instanceof Number) { return null; } if ($item[0] === Type::T_MAP) { return $item; } if ( $item[0] === Type::T_LIST && $item[2] === [] ) { return self::$emptyMap; } return null; } /** * Gets the keywords of an argument list. * * Keys in the returned array are normalized names (underscores are replaced with dashes) * without the leading `$`. * Calling this helper with anything that an argument list received for a rest argument * of the function argument declaration is not supported. * * @param array|Number $value * * @return array<string, array|Number> */ public function getArgumentListKeywords($value): array { if ($value[0] !== Type::T_LIST || !isset($value[3]) || !\is_array($value[3])) { throw new \InvalidArgumentException('The argument is not a sass argument list.'); } return $value[3]; } /** * Assert value is a color * * @param array|Number $value * * @throws SassScriptException */ public function assertColor($value, ?string $varName = null): array { if ($value[0] === Type::T_COLOR) { assert(\is_array($value)); return $value; } $value = $this->compileValue($value); throw SassScriptException::forArgument("$value is not a color.", $varName); } /** * Assert value is a number * * @param array|Number $value * * @throws SassScriptException */ public function assertNumber($value, ?string $varName = null): Number { if (!$value instanceof Number) { $value = $this->compileValue($value); throw SassScriptException::forArgument("$value is not a number.", $varName); } return $value; } /** * Assert value is a integer * * @param array|Number $value * * @throws SassScriptException */ public function assertInteger($value, ?string $varName = null): int { $value = $this->assertNumber($value, $varName)->getDimension(); if (round($value - \intval($value), Number::PRECISION) > 0) { throw SassScriptException::forArgument("$value is not an integer.", $varName); } return intval($value); } /** * Compiles a primitive value into a string for debugging purposes. * * Values in scssphp are typed by being wrapped in arrays, their format is * typically: * * array(type, contents [, additional_contents]*) * * @param array|Number $value */ public function compileValue($value): string { return (string) $this->legacyValueToValue($value); } } PKCA#]���@����:system/helixultimate/vendor/scssphp/scssphp/src/Parser.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; use ScssPhp\ScssPhp\Block\AtRootBlock; use ScssPhp\ScssPhp\Block\CallableBlock; use ScssPhp\ScssPhp\Block\ContentBlock; use ScssPhp\ScssPhp\Block\DirectiveBlock; use ScssPhp\ScssPhp\Block\EachBlock; use ScssPhp\ScssPhp\Block\ElseBlock; use ScssPhp\ScssPhp\Block\ElseifBlock; use ScssPhp\ScssPhp\Block\ForBlock; use ScssPhp\ScssPhp\Block\IfBlock; use ScssPhp\ScssPhp\Block\MediaBlock; use ScssPhp\ScssPhp\Block\NestedPropertyBlock; use ScssPhp\ScssPhp\Block\WhileBlock; use ScssPhp\ScssPhp\Exception\ParserException; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Logger\QuietLogger; use ScssPhp\ScssPhp\Node\Number; /** * Parser * * @author Leaf Corcoran <leafot@gmail.com> * * @internal */ class Parser { const SOURCE_INDEX = -1; const SOURCE_LINE = -2; const SOURCE_COLUMN = -3; /** * @var array<string, int> */ protected static $precedence = [ '=' => 0, 'or' => 1, 'and' => 2, '==' => 3, '!=' => 3, '<=' => 4, '>=' => 4, '<' => 4, '>' => 4, '+' => 5, '-' => 5, '*' => 6, '/' => 6, '%' => 6, ]; /** * @var string */ protected static $commentPattern; /** * @var string */ protected static $operatorPattern; /** * @var string */ protected static $whitePattern; /** * @var Cache|null */ protected $cache; private $sourceName; private $sourceIndex; /** * @var array<int, int> */ private $sourcePositions; /** * The current offset in the buffer * * @var int */ private $count; /** * @var Block|null */ private $env; /** * @var bool */ private $inParens; /** * @var bool */ private $eatWhiteDefault; /** * @var bool */ private $discardComments; private $allowVars; /** * @var string */ private $buffer; private $utf8; /** * @var string|null */ private $encoding; private $patternModifiers; private $commentsSeen; private $cssOnly; /** * @var LoggerInterface */ private $logger; /** * Constructor * * @api * * @param string|null $sourceName * @param int $sourceIndex * @param string|null $encoding * @param Cache|null $cache * @param bool $cssOnly * @param LoggerInterface|null $logger */ public function __construct($sourceName, $sourceIndex = 0, $encoding = 'utf-8', Cache $cache = null, $cssOnly = false, LoggerInterface $logger = null) { $this->sourceName = $sourceName ?: '(stdin)'; $this->sourceIndex = $sourceIndex; $this->utf8 = ! $encoding || strtolower($encoding) === 'utf-8'; $this->patternModifiers = $this->utf8 ? 'Aisu' : 'Ais'; $this->commentsSeen = []; $this->allowVars = true; $this->cssOnly = $cssOnly; $this->logger = $logger ?: new QuietLogger(); if (empty(static::$operatorPattern)) { static::$operatorPattern = '([*\/%+-]|[!=]\=|\>\=?|\<\=?|and|or)'; $commentSingle = '\/\/'; $commentMultiLeft = '\/\*'; $commentMultiRight = '\*\/'; static::$commentPattern = $commentMultiLeft . '.*?' . $commentMultiRight; static::$whitePattern = $this->utf8 ? '/' . $commentSingle . '[^\n]*\s*|(' . static::$commentPattern . ')\s*|\s+/AisuS' : '/' . $commentSingle . '[^\n]*\s*|(' . static::$commentPattern . ')\s*|\s+/AisS'; } $this->cache = $cache; } /** * Get source file name * * @api * * @return string */ public function getSourceName() { return $this->sourceName; } /** * Throw parser error * * @api * * @param string $msg * * @phpstan-return never-return * * @throws ParserException * * @deprecated use "parseError" and throw the exception in the caller instead. */ public function throwParseError($msg = 'parse error') { @trigger_error( 'The method "throwParseError" is deprecated. Use "parseError" and throw the exception in the caller instead', E_USER_DEPRECATED ); throw $this->parseError($msg); } /** * Creates a parser error * * @api * * @param string $msg * * @return ParserException */ public function parseError($msg = 'parse error') { list($line, $column) = $this->getSourcePosition($this->count); $loc = empty($this->sourceName) ? "line: $line, column: $column" : "$this->sourceName on line $line, at column $column"; if ($this->peek('(.*?)(\n|$)', $m, $this->count)) { $this->restoreEncoding(); $e = new ParserException("$msg: failed at `$m[1]` $loc"); $e->setSourcePosition([$this->sourceName, $line, $column]); return $e; } $this->restoreEncoding(); $e = new ParserException("$msg: $loc"); $e->setSourcePosition([$this->sourceName, $line, $column]); return $e; } /** * Parser buffer * * @api * * @param string $buffer * * @return Block */ public function parse($buffer) { if ($this->cache) { $cacheKey = $this->sourceName . ':' . md5($buffer); $parseOptions = [ 'utf8' => $this->utf8, ]; $v = $this->cache->getCache('parse', $cacheKey, $parseOptions); if (! \is_null($v)) { return $v; } } // strip BOM (byte order marker) if (substr($buffer, 0, 3) === "\xef\xbb\xbf") { $buffer = substr($buffer, 3); } $this->buffer = rtrim($buffer, "\x00..\x1f"); $this->count = 0; $this->env = null; $this->inParens = false; $this->eatWhiteDefault = true; $this->saveEncoding(); $this->extractLineNumbers($buffer); $this->pushBlock(null); // root block $this->whitespace(); $this->pushBlock(null); $this->popBlock(); while ($this->parseChunk()) { ; } if ($this->count !== \strlen($this->buffer)) { throw $this->parseError(); } if (! empty($this->env->parent)) { throw $this->parseError('unclosed block'); } $this->restoreEncoding(); assert($this->env !== null); if ($this->cache) { $this->cache->setCache('parse', $cacheKey, $this->env, $parseOptions); } return $this->env; } /** * Parse a value or value list * * @api * * @param string $buffer * @param string|array $out * * @return bool */ public function parseValue($buffer, &$out) { $this->count = 0; $this->env = null; $this->inParens = false; $this->eatWhiteDefault = true; $this->buffer = (string) $buffer; $this->saveEncoding(); $this->extractLineNumbers($this->buffer); $list = $this->valueList($out); $this->restoreEncoding(); return $list; } /** * Parse a selector or selector list * * @api * * @param string $buffer * @param string|array $out * @param bool $shouldValidate * * @return bool */ public function parseSelector($buffer, &$out, $shouldValidate = true) { $this->count = 0; $this->env = null; $this->inParens = false; $this->eatWhiteDefault = true; $this->buffer = (string) $buffer; $this->saveEncoding(); $this->extractLineNumbers($this->buffer); // discard space/comments at the start $this->discardComments = true; $this->whitespace(); $this->discardComments = false; $selector = $this->selectors($out); $this->restoreEncoding(); if ($shouldValidate && $this->count !== strlen($buffer)) { throw $this->parseError("`" . substr($buffer, $this->count) . "` is not a valid Selector in `$buffer`"); } return $selector; } /** * Parse a media Query * * @api * * @param string $buffer * @param array $out * * @return bool */ public function parseMediaQueryList($buffer, &$out) { $this->count = 0; $this->env = null; $this->inParens = false; $this->eatWhiteDefault = true; $this->buffer = (string) $buffer; $this->saveEncoding(); $this->extractLineNumbers($this->buffer); $isMediaQuery = $this->mediaQueryList($out); $this->restoreEncoding(); return $isMediaQuery; } /** * Parse a single chunk off the head of the buffer and append it to the * current parse environment. * * Returns false when the buffer is empty, or when there is an error. * * This function is called repeatedly until the entire document is * parsed. * * This parser is most similar to a recursive descent parser. Single * functions represent discrete grammatical rules for the language, and * they are able to capture the text that represents those rules. * * Consider the function Compiler::keyword(). (All parse functions are * structured the same.) * * The function takes a single reference argument. When calling the * function it will attempt to match a keyword on the head of the buffer. * If it is successful, it will place the keyword in the referenced * argument, advance the position in the buffer, and return true. If it * fails then it won't advance the buffer and it will return false. * * All of these parse functions are powered by Compiler::match(), which behaves * the same way, but takes a literal regular expression. Sometimes it is * more convenient to use match instead of creating a new function. * * Because of the format of the functions, to parse an entire string of * grammatical rules, you can chain them together using &&. * * But, if some of the rules in the chain succeed before one fails, then * the buffer position will be left at an invalid state. In order to * avoid this, Compiler::seek() is used to remember and set buffer positions. * * Before parsing a chain, use $s = $this->count to remember the current * position into $s. Then if a chain fails, use $this->seek($s) to * go back where we started. * * @return bool */ protected function parseChunk() { $s = $this->count; // the directives if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] === '@') { if ( $this->literal('@at-root', 8) && ($this->selectors($selector) || true) && ($this->map($with) || true) && (($this->matchChar('(') && $this->interpolation($with) && $this->matchChar(')')) || true) && $this->matchChar('{', false) ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); $atRoot = new AtRootBlock(); $this->registerPushedBlock($atRoot, $s); $atRoot->selector = $selector; $atRoot->with = $with; return true; } $this->seek($s); if ( $this->literal('@media', 6) && $this->mediaQueryList($mediaQueryList) && $this->matchChar('{', false) ) { $media = new MediaBlock(); $this->registerPushedBlock($media, $s); $media->queryList = $mediaQueryList[2]; return true; } $this->seek($s); if ( $this->literal('@mixin', 6) && $this->keyword($mixinName) && ($this->argumentDef($args) || true) && $this->matchChar('{', false) ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); $mixin = new CallableBlock(Type::T_MIXIN); $this->registerPushedBlock($mixin, $s); $mixin->name = $mixinName; $mixin->args = $args; return true; } $this->seek($s); if ( ($this->literal('@include', 8) && $this->keyword($mixinName) && ($this->matchChar('(') && ($this->argValues($argValues) || true) && $this->matchChar(')') || true) && ($this->end()) || ($this->literal('using', 5) && $this->argumentDef($argUsing) && ($this->end() || $this->matchChar('{') && $hasBlock = true)) || $this->matchChar('{') && $hasBlock = true) ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); $child = [ Type::T_INCLUDE, $mixinName, isset($argValues) ? $argValues : null, null, isset($argUsing) ? $argUsing : null ]; if (! empty($hasBlock)) { $include = new ContentBlock(); $this->registerPushedBlock($include, $s); $include->child = $child; } else { $this->append($child, $s); } return true; } $this->seek($s); if ( $this->literal('@scssphp-import-once', 20) && $this->valueList($importPath) && $this->end() ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); list($line, $column) = $this->getSourcePosition($s); $file = $this->sourceName; $this->logger->warn("The \"@scssphp-import-once\" directive is deprecated and will be removed in ScssPhp 2.0, in \"$file\", line $line, column $column.", true); $this->append([Type::T_SCSSPHP_IMPORT_ONCE, $importPath], $s); return true; } $this->seek($s); if ( $this->literal('@import', 7) && $this->valueList($importPath) && $importPath[0] !== Type::T_FUNCTION_CALL && $this->end() ) { if ($this->cssOnly) { $this->assertPlainCssValid([Type::T_IMPORT, $importPath], $s); $this->append([Type::T_COMMENT, rtrim(substr($this->buffer, $s, $this->count - $s))]); return true; } $this->append([Type::T_IMPORT, $importPath], $s); return true; } $this->seek($s); if ( $this->literal('@import', 7) && $this->url($importPath) && $this->end() ) { if ($this->cssOnly) { $this->assertPlainCssValid([Type::T_IMPORT, $importPath], $s); $this->append([Type::T_COMMENT, rtrim(substr($this->buffer, $s, $this->count - $s))]); return true; } $this->append([Type::T_IMPORT, $importPath], $s); return true; } $this->seek($s); if ( $this->literal('@extend', 7) && $this->selectors($selectors) && $this->end() ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); // check for '!flag' $optional = $this->stripOptionalFlag($selectors); $this->append([Type::T_EXTEND, $selectors, $optional], $s); return true; } $this->seek($s); if ( $this->literal('@function', 9) && $this->keyword($fnName) && $this->argumentDef($args) && $this->matchChar('{', false) ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); $func = new CallableBlock(Type::T_FUNCTION); $this->registerPushedBlock($func, $s); $func->name = $fnName; $func->args = $args; return true; } $this->seek($s); if ( $this->literal('@return', 7) && ($this->valueList($retVal) || true) && $this->end() ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); $this->append([Type::T_RETURN, isset($retVal) ? $retVal : [Type::T_NULL]], $s); return true; } $this->seek($s); if ( $this->literal('@each', 5) && $this->genericList($varNames, 'variable', ',', false) && $this->literal('in', 2) && $this->valueList($list) && $this->matchChar('{', false) ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); $each = new EachBlock(); $this->registerPushedBlock($each, $s); foreach ($varNames[2] as $varName) { $each->vars[] = $varName[1]; } $each->list = $list; return true; } $this->seek($s); if ( $this->literal('@while', 6) && $this->expression($cond) && $this->matchChar('{', false) ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); while ( $cond[0] === Type::T_LIST && ! empty($cond['enclosing']) && $cond['enclosing'] === 'parent' && \count($cond[2]) == 1 ) { $cond = reset($cond[2]); } $while = new WhileBlock(); $this->registerPushedBlock($while, $s); $while->cond = $cond; return true; } $this->seek($s); if ( $this->literal('@for', 4) && $this->variable($varName) && $this->literal('from', 4) && $this->expression($start) && ($this->literal('through', 7) || ($forUntil = true && $this->literal('to', 2))) && $this->expression($end) && $this->matchChar('{', false) ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); $for = new ForBlock(); $this->registerPushedBlock($for, $s); $for->var = $varName[1]; $for->start = $start; $for->end = $end; $for->until = isset($forUntil); return true; } $this->seek($s); if ( $this->literal('@if', 3) && $this->functionCallArgumentsList($cond, false, '{', false) ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); $if = new IfBlock(); $this->registerPushedBlock($if, $s); while ( $cond[0] === Type::T_LIST && ! empty($cond['enclosing']) && $cond['enclosing'] === 'parent' && \count($cond[2]) == 1 ) { $cond = reset($cond[2]); } $if->cond = $cond; $if->cases = []; return true; } $this->seek($s); if ( $this->literal('@debug', 6) && $this->functionCallArgumentsList($value, false) ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); $this->append([Type::T_DEBUG, $value], $s); return true; } $this->seek($s); if ( $this->literal('@warn', 5) && $this->functionCallArgumentsList($value, false) ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); $this->append([Type::T_WARN, $value], $s); return true; } $this->seek($s); if ( $this->literal('@error', 6) && $this->functionCallArgumentsList($value, false) ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); $this->append([Type::T_ERROR, $value], $s); return true; } $this->seek($s); if ( $this->literal('@content', 8) && ($this->end() || $this->matchChar('(') && $this->argValues($argContent) && $this->matchChar(')') && $this->end()) ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); $this->append([Type::T_MIXIN_CONTENT, isset($argContent) ? $argContent : null], $s); return true; } $this->seek($s); $last = $this->last(); if (isset($last) && $last[0] === Type::T_IF) { list(, $if) = $last; assert($if instanceof IfBlock); if ($this->literal('@else', 5)) { if ($this->matchChar('{', false)) { $else = new ElseBlock(); } elseif ( $this->literal('if', 2) && $this->functionCallArgumentsList($cond, false, '{', false) ) { $else = new ElseifBlock(); $else->cond = $cond; } if (isset($else)) { $this->registerPushedBlock($else, $s); $if->cases[] = $else; return true; } } $this->seek($s); } // only retain the first @charset directive encountered if ( $this->literal('@charset', 8) && $this->valueList($charset) && $this->end() ) { return true; } $this->seek($s); if ( $this->literal('@supports', 9) && ($t1 = $this->supportsQuery($supportQuery)) && ($t2 = $this->matchChar('{', false)) ) { $directive = new DirectiveBlock(); $this->registerPushedBlock($directive, $s); $directive->name = 'supports'; $directive->value = $supportQuery; return true; } $this->seek($s); // doesn't match built in directive, do generic one if ( $this->matchChar('@', false) && $this->mixedKeyword($dirName) && $this->directiveValue($dirValue, '{') ) { if (count($dirName) === 1 && is_string(reset($dirName))) { $dirName = reset($dirName); } else { $dirName = [Type::T_STRING, '', $dirName]; } if ($dirName === 'media') { $directive = new MediaBlock(); } else { $directive = new DirectiveBlock(); $directive->name = $dirName; } $this->registerPushedBlock($directive, $s); if (isset($dirValue)) { ! $this->cssOnly || ($dirValue = $this->assertPlainCssValid($dirValue)); $directive->value = $dirValue; } return true; } $this->seek($s); // maybe it's a generic blockless directive if ( $this->matchChar('@', false) && $this->mixedKeyword($dirName) && ! $this->isKnownGenericDirective($dirName) && ($this->end(false) || ($this->directiveValue($dirValue, '') && $this->end(false))) ) { if (\count($dirName) === 1 && \is_string(\reset($dirName))) { $dirName = \reset($dirName); } else { $dirName = [Type::T_STRING, '', $dirName]; } if ( ! empty($this->env->parent) && $this->env->type && ! \in_array($this->env->type, [Type::T_DIRECTIVE, Type::T_MEDIA]) ) { $plain = \trim(\substr($this->buffer, $s, $this->count - $s)); throw $this->parseError( "Unknown directive `{$plain}` not allowed in `" . $this->env->type . "` block" ); } // blockless directives with a blank line after keeps their blank lines after // sass-spec compliance purpose $s = $this->count; $hasBlankLine = false; if ($this->match('\s*?\n\s*\n', $out, false)) { $hasBlankLine = true; $this->seek($s); } $isNotRoot = ! empty($this->env->parent); $this->append([Type::T_DIRECTIVE, [$dirName, $dirValue, $hasBlankLine, $isNotRoot]], $s); $this->whitespace(); return true; } $this->seek($s); return false; } $inCssSelector = null; if ($this->cssOnly) { $inCssSelector = (! empty($this->env->parent) && ! in_array($this->env->type, [Type::T_DIRECTIVE, Type::T_MEDIA])); } // custom properties : right part is static if (($this->customProperty($name) ) && $this->matchChar(':', false)) { $start = $this->count; // but can be complex and finish with ; or } foreach ([';','}'] as $ending) { if ( $this->openString($ending, $stringValue, '(', ')', false) && $this->end() ) { $end = $this->count; $value = $stringValue; // check if we have only a partial value due to nested [] or { } to take in account $nestingPairs = [['[', ']'], ['{', '}']]; foreach ($nestingPairs as $nestingPair) { $p = strpos($this->buffer, $nestingPair[0], $start); if ($p && $p < $end) { $this->seek($start); if ( $this->openString($ending, $stringValue, $nestingPair[0], $nestingPair[1], false) && $this->end() && $this->count > $end ) { $end = $this->count; $value = $stringValue; } } } $this->seek($end); $this->append([Type::T_CUSTOM_PROPERTY, $name, $value], $s); return true; } } // TODO: output an error here if nothing found according to sass spec } $this->seek($s); // property shortcut // captures most properties before having to parse a selector if ( $this->keyword($name, false) && $this->literal(': ', 2) && $this->valueList($value) && $this->end() ) { $name = [Type::T_STRING, '', [$name]]; $this->append([Type::T_ASSIGN, $name, $value], $s); return true; } $this->seek($s); // variable assigns if ( $this->variable($name) && $this->matchChar(':') && $this->valueList($value) && $this->end() ) { ! $this->cssOnly || $this->assertPlainCssValid(false, $s); // check for '!flag' $assignmentFlags = $this->stripAssignmentFlags($value); $this->append([Type::T_ASSIGN, $name, $value, $assignmentFlags], $s); return true; } $this->seek($s); // opening css block if ( $this->selectors($selectors) && $this->matchChar('{', false) ) { ! $this->cssOnly || ! $inCssSelector || $this->assertPlainCssValid(false); $this->pushBlock($selectors, $s); if ($this->eatWhiteDefault) { $this->whitespace(); $this->append(null); // collect comments at the beginning if needed } return true; } $this->seek($s); // property assign, or nested assign if ( $this->propertyName($name) && $this->matchChar(':') ) { $foundSomething = false; if ($this->valueList($value)) { if (empty($this->env->parent)) { throw $this->parseError('expected "{"'); } $this->append([Type::T_ASSIGN, $name, $value], $s); $foundSomething = true; } if ($this->matchChar('{', false)) { ! $this->cssOnly || $this->assertPlainCssValid(false); $propBlock = new NestedPropertyBlock(); $this->registerPushedBlock($propBlock, $s); $propBlock->prefix = $name; $propBlock->hasValue = $foundSomething; $foundSomething = true; } elseif ($foundSomething) { $foundSomething = $this->end(); } if ($foundSomething) { return true; } } $this->seek($s); // closing a block if ($this->matchChar('}', false)) { $block = $this->popBlock(); if (! isset($block->type) || $block->type !== Type::T_IF) { assert($this->env !== null); if ($this->env->parent) { $this->append(null); // collect comments before next statement if needed } } if ($block instanceof ContentBlock) { $include = $block->child; assert(\is_array($include)); unset($block->child); $include[3] = $block; $this->append($include, $s); } elseif (!$block instanceof ElseBlock && !$block instanceof ElseifBlock) { $type = isset($block->type) ? $block->type : Type::T_BLOCK; $this->append([$type, $block], $s); } // collect comments just after the block closing if needed if ($this->eatWhiteDefault) { $this->whitespace(); assert($this->env !== null); if ($this->env->comments) { $this->append(null); } } return true; } // extra stuff if ($this->matchChar(';')) { return true; } return false; } /** * Push block onto parse tree * * @param array|null $selectors * @param int $pos * * @return Block */ protected function pushBlock($selectors, $pos = 0) { $b = new Block(); $b->selectors = $selectors; $this->registerPushedBlock($b, $pos); return $b; } /** * @param Block $b * @param int $pos * * @return void */ private function registerPushedBlock(Block $b, $pos) { list($line, $column) = $this->getSourcePosition($pos); $b->sourceName = $this->sourceName; $b->sourceLine = $line; $b->sourceColumn = $column; $b->sourceIndex = $this->sourceIndex; $b->comments = []; $b->parent = $this->env; if (! $this->env) { $b->children = []; } elseif (empty($this->env->children)) { $this->env->children = $this->env->comments; $b->children = []; $this->env->comments = []; } else { $b->children = $this->env->comments; $this->env->comments = []; } $this->env = $b; // collect comments at the beginning of a block if needed if ($this->eatWhiteDefault) { $this->whitespace(); assert($this->env !== null); if ($this->env->comments) { $this->append(null); } } } /** * Push special (named) block onto parse tree * * @deprecated * * @param string $type * @param int $pos * * @return Block */ protected function pushSpecialBlock($type, $pos) { $block = $this->pushBlock(null, $pos); $block->type = $type; return $block; } /** * Pop scope and return last block * * @return Block * * @throws \Exception */ protected function popBlock() { assert($this->env !== null); // collect comments ending just before of a block closing if ($this->env->comments) { $this->append(null); } // pop the block $block = $this->env; if (empty($block->parent)) { throw $this->parseError('unexpected }'); } if ($block->type == Type::T_AT_ROOT) { // keeps the parent in case of self selector & $block->selfParent = $block->parent; } $this->env = $block->parent; unset($block->parent); return $block; } /** * Peek input stream * * @param string $regex * @param array $out * @param int $from * * @return int */ protected function peek($regex, &$out, $from = null) { if (! isset($from)) { $from = $this->count; } $r = '/' . $regex . '/' . $this->patternModifiers; $result = preg_match($r, $this->buffer, $out, 0, $from); return $result; } /** * Seek to position in input stream (or return current position in input stream) * * @param int $where * * @return void */ protected function seek($where) { $this->count = $where; } /** * Assert a parsed part is plain CSS Valid * * @param array|false $parsed * @param int $startPos * * @return array * * @throws ParserException */ protected function assertPlainCssValid($parsed, $startPos = null) { $type = ''; if ($parsed) { $type = $parsed[0]; $parsed = $this->isPlainCssValidElement($parsed); } if (! $parsed) { if (! \is_null($startPos)) { $plain = rtrim(substr($this->buffer, $startPos, $this->count - $startPos)); $message = "Error : `{$plain}` isn't allowed in plain CSS"; } else { $message = 'Error: SCSS syntax not allowed in CSS file'; } if ($type) { $message .= " ($type)"; } throw $this->parseError($message); } return $parsed; } /** * Check a parsed element is plain CSS Valid * * @param array $parsed * @param bool $allowExpression * * @return array|false */ protected function isPlainCssValidElement($parsed, $allowExpression = false) { // keep string as is if (is_string($parsed)) { return $parsed; } if ( \in_array($parsed[0], [Type::T_FUNCTION, Type::T_FUNCTION_CALL]) && !\in_array($parsed[1], [ 'alpha', 'attr', 'calc', 'cubic-bezier', 'env', 'grayscale', 'hsl', 'hsla', 'hwb', 'invert', 'linear-gradient', 'min', 'max', 'radial-gradient', 'repeating-linear-gradient', 'repeating-radial-gradient', 'rgb', 'rgba', 'rotate', 'saturate', 'var', ]) && Compiler::isNativeFunction($parsed[1]) ) { return false; } switch ($parsed[0]) { case Type::T_BLOCK: case Type::T_KEYWORD: case Type::T_NULL: case Type::T_NUMBER: case Type::T_MEDIA: return $parsed; case Type::T_COMMENT: if (isset($parsed[2])) { return false; } return $parsed; case Type::T_DIRECTIVE: if (\is_array($parsed[1])) { $parsed[1][1] = $this->isPlainCssValidElement($parsed[1][1]); if (! $parsed[1][1]) { return false; } } return $parsed; case Type::T_IMPORT: if ($parsed[1][0] === Type::T_LIST) { return false; } $parsed[1] = $this->isPlainCssValidElement($parsed[1]); if ($parsed[1] === false) { return false; } return $parsed; case Type::T_STRING: foreach ($parsed[2] as $k => $substr) { if (\is_array($substr)) { $parsed[2][$k] = $this->isPlainCssValidElement($substr); if (! $parsed[2][$k]) { return false; } } } return $parsed; case Type::T_LIST: if (!empty($parsed['enclosing'])) { return false; } foreach ($parsed[2] as $k => $listElement) { $parsed[2][$k] = $this->isPlainCssValidElement($listElement); if (! $parsed[2][$k]) { return false; } } return $parsed; case Type::T_ASSIGN: foreach ([1, 2, 3] as $k) { if (! empty($parsed[$k])) { $parsed[$k] = $this->isPlainCssValidElement($parsed[$k]); if (! $parsed[$k]) { return false; } } } return $parsed; case Type::T_EXPRESSION: list( ,$op, $lhs, $rhs, $inParens, $whiteBefore, $whiteAfter) = $parsed; if (! $allowExpression && ! \in_array($op, ['and', 'or', '/'])) { return false; } $lhs = $this->isPlainCssValidElement($lhs, true); if (! $lhs) { return false; } $rhs = $this->isPlainCssValidElement($rhs, true); if (! $rhs) { return false; } return [ Type::T_STRING, '', [ $this->inParens ? '(' : '', $lhs, ($whiteBefore ? ' ' : '') . $op . ($whiteAfter ? ' ' : ''), $rhs, $this->inParens ? ')' : '' ] ]; case Type::T_CUSTOM_PROPERTY: case Type::T_UNARY: $parsed[2] = $this->isPlainCssValidElement($parsed[2]); if (! $parsed[2]) { return false; } return $parsed; case Type::T_FUNCTION: $argsList = $parsed[2]; foreach ($argsList[2] as $argElement) { if (! $this->isPlainCssValidElement($argElement)) { return false; } } return $parsed; case Type::T_FUNCTION_CALL: $parsed[0] = Type::T_FUNCTION; $argsList = [Type::T_LIST, ',', []]; foreach ($parsed[2] as $arg) { if ($arg[0] || ! empty($arg[2])) { // no named arguments possible in a css function call // nor ... argument return false; } $arg = $this->isPlainCssValidElement($arg[1], $parsed[1] === 'calc'); if (! $arg) { return false; } $argsList[2][] = $arg; } $parsed[2] = $argsList; return $parsed; } return false; } /** * Match string looking for either ending delim, escape, or string interpolation * * {@internal This is a workaround for preg_match's 250K string match limit. }} * * @param array $m Matches (passed by reference) * @param string $delim Delimiter * * @return bool True if match; false otherwise * * @phpstan-impure */ protected function matchString(&$m, $delim) { $token = null; $end = \strlen($this->buffer); // look for either ending delim, escape, or string interpolation foreach (['#{', '\\', "\r", $delim] as $lookahead) { $pos = strpos($this->buffer, $lookahead, $this->count); if ($pos !== false && $pos < $end) { $end = $pos; $token = $lookahead; } } if (! isset($token)) { return false; } $match = substr($this->buffer, $this->count, $end - $this->count); $m = [ $match . $token, $match, $token ]; $this->count = $end + \strlen($token); return true; } /** * Try to match something on head of buffer * * @param string $regex * @param array $out * @param bool $eatWhitespace * * @return bool * * @phpstan-impure */ protected function match($regex, &$out, $eatWhitespace = null) { $r = '/' . $regex . '/' . $this->patternModifiers; if (! preg_match($r, $this->buffer, $out, 0, $this->count)) { return false; } $this->count += \strlen($out[0]); if (! isset($eatWhitespace)) { $eatWhitespace = $this->eatWhiteDefault; } if ($eatWhitespace) { $this->whitespace(); } return true; } /** * Match a single string * * @param string $char * @param bool $eatWhitespace * * @return bool * * @phpstan-impure */ protected function matchChar($char, $eatWhitespace = null) { if (! isset($this->buffer[$this->count]) || $this->buffer[$this->count] !== $char) { return false; } $this->count++; if (! isset($eatWhitespace)) { $eatWhitespace = $this->eatWhiteDefault; } if ($eatWhitespace) { $this->whitespace(); } return true; } /** * Match literal string * * @param string $what * @param int $len * @param bool $eatWhitespace * * @return bool * * @phpstan-impure */ protected function literal($what, $len, $eatWhitespace = null) { if (strcasecmp(substr($this->buffer, $this->count, $len), $what) !== 0) { return false; } $this->count += $len; if (! isset($eatWhitespace)) { $eatWhitespace = $this->eatWhiteDefault; } if ($eatWhitespace) { $this->whitespace(); } return true; } /** * Match some whitespace * * @return bool * * @phpstan-impure */ protected function whitespace() { $gotWhite = false; while (preg_match(static::$whitePattern, $this->buffer, $m, 0, $this->count)) { if (isset($m[1]) && empty($this->commentsSeen[$this->count])) { // comment that are kept in the output CSS $comment = []; $startCommentCount = $this->count; $endCommentCount = $this->count + \strlen($m[1]); // find interpolations in comment $p = strpos($this->buffer, '#{', $this->count); while ($p !== false && $p < $endCommentCount) { $c = substr($this->buffer, $this->count, $p - $this->count); $comment[] = $c; $this->count = $p; $out = null; if ($this->interpolation($out)) { // keep right spaces in the following string part if ($out[3]) { while ($this->buffer[$this->count - 1] !== '}') { $this->count--; } $out[3] = ''; } $comment[] = [Type::T_COMMENT, substr($this->buffer, $p, $this->count - $p), $out]; } else { list($line, $column) = $this->getSourcePosition($this->count); $file = $this->sourceName; if (!$this->discardComments) { $this->logger->warn("Unterminated interpolations in multiline comments are deprecated and will be removed in ScssPhp 2.0, in \"$file\", line $line, column $column.", true); } $comment[] = substr($this->buffer, $this->count, 2); $this->count += 2; } $p = strpos($this->buffer, '#{', $this->count); } // remaining part $c = substr($this->buffer, $this->count, $endCommentCount - $this->count); if (! $comment) { // single part static comment $commentStatement = [Type::T_COMMENT, $c]; } else { $comment[] = $c; $staticComment = substr($this->buffer, $startCommentCount, $endCommentCount - $startCommentCount); $commentStatement = [Type::T_COMMENT, $staticComment, [Type::T_STRING, '', $comment]]; } list($line, $column) = $this->getSourcePosition($startCommentCount); $commentStatement[self::SOURCE_LINE] = $line; $commentStatement[self::SOURCE_COLUMN] = $column; $commentStatement[self::SOURCE_INDEX] = $this->sourceIndex; $this->appendComment($commentStatement); $this->commentsSeen[$startCommentCount] = true; $this->count = $endCommentCount; } else { // comment that are ignored and not kept in the output css $this->count += \strlen($m[0]); // silent comments are not allowed in plain CSS files ! $this->cssOnly || ! \strlen(trim($m[0])) || $this->assertPlainCssValid(false, $this->count - \strlen($m[0])); } $gotWhite = true; } return $gotWhite; } /** * Append comment to current block * * @param array $comment * * @return void */ protected function appendComment($comment) { assert($this->env !== null); if (! $this->discardComments) { $this->env->comments[] = $comment; } } /** * Append statement to current block * * @param array|null $statement * @param int $pos * * @return void */ protected function append($statement, $pos = null) { assert($this->env !== null); if (! \is_null($statement)) { ! $this->cssOnly || ($statement = $this->assertPlainCssValid($statement, $pos)); if (! \is_null($pos)) { list($line, $column) = $this->getSourcePosition($pos); $statement[static::SOURCE_LINE] = $line; $statement[static::SOURCE_COLUMN] = $column; $statement[static::SOURCE_INDEX] = $this->sourceIndex; } $this->env->children[] = $statement; } $comments = $this->env->comments; if ($comments) { $this->env->children = array_merge($this->env->children, $comments); $this->env->comments = []; } } /** * Returns last child was appended * * @return array|null */ protected function last() { assert($this->env !== null); $i = \count($this->env->children) - 1; if (isset($this->env->children[$i])) { return $this->env->children[$i]; } return null; } /** * Parse media query list * * @param array $out * * @return bool */ protected function mediaQueryList(&$out) { return $this->genericList($out, 'mediaQuery', ',', false); } /** * Parse media query * * @param array $out * * @return bool */ protected function mediaQuery(&$out) { $expressions = null; $parts = []; if ( ($this->literal('only', 4) && ($only = true) || $this->literal('not', 3) && ($not = true) || true) && $this->mixedKeyword($mediaType) ) { $prop = [Type::T_MEDIA_TYPE]; if (isset($only)) { $prop[] = [Type::T_KEYWORD, 'only']; } if (isset($not)) { $prop[] = [Type::T_KEYWORD, 'not']; } $media = [Type::T_LIST, '', []]; foreach ((array) $mediaType as $type) { if (\is_array($type)) { $media[2][] = $type; } else { $media[2][] = [Type::T_KEYWORD, $type]; } } $prop[] = $media; $parts[] = $prop; } if (empty($parts) || $this->literal('and', 3)) { $this->genericList($expressions, 'mediaExpression', 'and', false); if (\is_array($expressions)) { $parts = array_merge($parts, $expressions[2]); } } $out = $parts; return true; } /** * Parse supports query * * @param array $out * * @return bool */ protected function supportsQuery(&$out) { $expressions = null; $parts = []; $s = $this->count; $not = false; if ( ($this->literal('not', 3) && ($not = true) || true) && $this->matchChar('(') && ($this->expression($property)) && $this->literal(': ', 2) && $this->valueList($value) && $this->matchChar(')') ) { $support = [Type::T_STRING, '', [[Type::T_KEYWORD, ($not ? 'not ' : '') . '(']]]; $support[2][] = $property; $support[2][] = [Type::T_KEYWORD, ': ']; $support[2][] = $value; $support[2][] = [Type::T_KEYWORD, ')']; $parts[] = $support; $s = $this->count; } else { $this->seek($s); } if ( $this->matchChar('(') && $this->supportsQuery($subQuery) && $this->matchChar(')') ) { $parts[] = [Type::T_STRING, '', [[Type::T_KEYWORD, '('], $subQuery, [Type::T_KEYWORD, ')']]]; $s = $this->count; } else { $this->seek($s); } if ( $this->literal('not', 3) && $this->supportsQuery($subQuery) ) { $parts[] = [Type::T_STRING, '', [[Type::T_KEYWORD, 'not '], $subQuery]]; $s = $this->count; } else { $this->seek($s); } if ( $this->literal('selector(', 9) && $this->selector($selector) && $this->matchChar(')') ) { $support = [Type::T_STRING, '', [[Type::T_KEYWORD, 'selector(']]]; $selectorList = [Type::T_LIST, '', []]; foreach ($selector as $sc) { $compound = [Type::T_STRING, '', []]; foreach ($sc as $scp) { if (\is_array($scp)) { $compound[2][] = $scp; } else { $compound[2][] = [Type::T_KEYWORD, $scp]; } } $selectorList[2][] = $compound; } $support[2][] = $selectorList; $support[2][] = [Type::T_KEYWORD, ')']; $parts[] = $support; $s = $this->count; } else { $this->seek($s); } if ($this->variable($var) or $this->interpolation($var)) { $parts[] = $var; $s = $this->count; } else { $this->seek($s); } if ( $this->literal('and', 3) && $this->genericList($expressions, 'supportsQuery', ' and', false) ) { array_unshift($expressions[2], [Type::T_STRING, '', $parts]); $parts = [$expressions]; $s = $this->count; } else { $this->seek($s); } if ( $this->literal('or', 2) && $this->genericList($expressions, 'supportsQuery', ' or', false) ) { array_unshift($expressions[2], [Type::T_STRING, '', $parts]); $parts = [$expressions]; $s = $this->count; } else { $this->seek($s); } if (\count($parts)) { if ($this->eatWhiteDefault) { $this->whitespace(); } $out = [Type::T_STRING, '', $parts]; return true; } return false; } /** * Parse media expression * * @param array $out * * @return bool */ protected function mediaExpression(&$out) { $s = $this->count; $value = null; if ( $this->matchChar('(') && $this->expression($feature) && ($this->matchChar(':') && $this->expression($value) || true) && $this->matchChar(')') ) { $out = [Type::T_MEDIA_EXPRESSION, $feature]; if ($value) { $out[] = $value; } return true; } $this->seek($s); return false; } /** * Parse argument values * * @param array $out * * @return bool */ protected function argValues(&$out) { $discardComments = $this->discardComments; $this->discardComments = true; if ($this->genericList($list, 'argValue', ',', false)) { $out = $list[2]; $this->discardComments = $discardComments; return true; } $this->discardComments = $discardComments; return false; } /** * Parse argument value * * @param array $out * * @return bool */ protected function argValue(&$out) { $s = $this->count; $keyword = null; if (! $this->variable($keyword) || ! $this->matchChar(':')) { $this->seek($s); $keyword = null; } if ($this->genericList($value, 'expression', '', true)) { $out = [$keyword, $value, false]; $s = $this->count; if ($this->literal('...', 3)) { $out[2] = true; } else { $this->seek($s); } return true; } return false; } /** * Check if a generic directive is known to be able to allow almost any syntax or not * @param mixed $directiveName * @return bool */ protected function isKnownGenericDirective($directiveName) { if (\is_array($directiveName) && \is_string(reset($directiveName))) { $directiveName = reset($directiveName); } if (! \is_string($directiveName)) { return false; } if ( \in_array($directiveName, [ 'at-root', 'media', 'mixin', 'include', 'scssphp-import-once', 'import', 'extend', 'function', 'break', 'continue', 'return', 'each', 'while', 'for', 'if', 'debug', 'warn', 'error', 'content', 'else', 'charset', 'supports', // Todo 'use', 'forward', ]) ) { return true; } return false; } /** * Parse directive value list that considers $vars as keyword * * @param array $out * @param string|false $endChar * * @return bool * * @phpstan-impure */ protected function directiveValue(&$out, $endChar = false) { $s = $this->count; if ($this->variable($out)) { if ($endChar && $this->matchChar($endChar, false)) { return true; } if (! $endChar && $this->end()) { return true; } } $this->seek($s); if (\is_string($endChar) && $this->openString($endChar ? $endChar : ';', $out, null, null, true, ";}{")) { if ($endChar && $this->matchChar($endChar, false)) { return true; } $ss = $this->count; if (!$endChar && $this->end()) { $this->seek($ss); return true; } } $this->seek($s); $allowVars = $this->allowVars; $this->allowVars = false; $res = $this->genericList($out, 'spaceList', ','); $this->allowVars = $allowVars; if ($res) { if ($endChar && $this->matchChar($endChar, false)) { return true; } if (! $endChar && $this->end()) { return true; } } $this->seek($s); if ($endChar && $this->matchChar($endChar, false)) { return true; } return false; } /** * Parse comma separated value list * * @param array $out * * @return bool */ protected function valueList(&$out) { $discardComments = $this->discardComments; $this->discardComments = true; $res = $this->genericList($out, 'spaceList', ','); $this->discardComments = $discardComments; return $res; } /** * Parse a function call, where externals () are part of the call * and not of the value list * * @param array $out * @param bool $mandatoryEnclos * @param null|string $charAfter * @param null|bool $eatWhiteSp * * @return bool */ protected function functionCallArgumentsList(&$out, $mandatoryEnclos = true, $charAfter = null, $eatWhiteSp = null) { $s = $this->count; if ( $this->matchChar('(') && $this->valueList($out) && $this->matchChar(')') && ($charAfter ? $this->matchChar($charAfter, $eatWhiteSp) : $this->end()) ) { return true; } if (! $mandatoryEnclos) { $this->seek($s); if ( $this->valueList($out) && ($charAfter ? $this->matchChar($charAfter, $eatWhiteSp) : $this->end()) ) { return true; } } $this->seek($s); return false; } /** * Parse space separated value list * * @param array $out * * @return bool */ protected function spaceList(&$out) { return $this->genericList($out, 'expression'); } /** * Parse generic list * * @param array $out * @param string $parseItem The name of the method used to parse items * @param string $delim * @param bool $flatten * * @return bool */ protected function genericList(&$out, $parseItem, $delim = '', $flatten = true) { $s = $this->count; $items = []; /** @var array|Number|null $value */ $value = null; while ($this->$parseItem($value)) { $trailing_delim = false; $items[] = $value; if ($delim) { if (! $this->literal($delim, \strlen($delim))) { break; } $trailing_delim = true; } else { assert(\is_array($value) || $value instanceof Number); // if no delim watch that a keyword didn't eat the single/double quote // from the following starting string if ($value[0] === Type::T_KEYWORD) { assert(\is_array($value)); /** @var string $word */ $word = $value[1]; $last_char = substr($word, -1); if ( strlen($word) > 1 && in_array($last_char, [ "'", '"']) && substr($word, -2, 1) !== '\\' ) { // if there is a non escaped opening quote in the keyword, this seems unlikely a mistake $word = str_replace('\\' . $last_char, '\\\\', $word); if (strpos($word, $last_char) < strlen($word) - 1) { continue; } $currentCount = $this->count; // let's try to rewind to previous char and try a parse $this->count--; // in case the keyword also eat spaces while (substr($this->buffer, $this->count, 1) !== $last_char) { $this->count--; } /** @var array|Number|null $nextValue */ $nextValue = null; if ($this->$parseItem($nextValue)) { assert(\is_array($nextValue) || $nextValue instanceof Number); if ($nextValue[0] === Type::T_KEYWORD && $nextValue[1] === $last_char) { // bad try, forget it $this->seek($currentCount); continue; } if ($nextValue[0] !== Type::T_STRING) { // bad try, forget it $this->seek($currentCount); continue; } // OK it was a good idea $value[1] = substr($value[1], 0, -1); array_pop($items); $items[] = $value; $items[] = $nextValue; } else { // bad try, forget it $this->seek($currentCount); continue; } } } } } if (! $items) { $this->seek($s); return false; } if ($trailing_delim) { $items[] = [Type::T_NULL]; } if ($flatten && \count($items) === 1) { $out = $items[0]; } else { $out = [Type::T_LIST, $delim, $items]; } return true; } /** * Parse expression * * @param array $out * @param bool $listOnly * @param bool $lookForExp * * @return bool * * @phpstan-impure */ protected function expression(&$out, $listOnly = false, $lookForExp = true) { $s = $this->count; $discard = $this->discardComments; $this->discardComments = true; $allowedTypes = ($listOnly ? [Type::T_LIST] : [Type::T_LIST, Type::T_MAP]); if ($this->matchChar('(')) { if ($this->enclosedExpression($lhs, $s, ')', $allowedTypes)) { if ($lookForExp) { $out = $this->expHelper($lhs, 0); } else { $out = $lhs; } $this->discardComments = $discard; return true; } $this->seek($s); } if (\in_array(Type::T_LIST, $allowedTypes) && $this->matchChar('[')) { if ($this->enclosedExpression($lhs, $s, ']', [Type::T_LIST])) { if ($lookForExp) { $out = $this->expHelper($lhs, 0); } else { $out = $lhs; } $this->discardComments = $discard; return true; } $this->seek($s); } if (! $listOnly && $this->value($lhs)) { if ($lookForExp) { $out = $this->expHelper($lhs, 0); } else { $out = $lhs; } $this->discardComments = $discard; return true; } $this->discardComments = $discard; return false; } /** * Parse expression specifically checking for lists in parenthesis or brackets * * @param array $out * @param int $s * @param string $closingParen * @param string[] $allowedTypes * * @return bool * * @phpstan-param array<Type::*> $allowedTypes */ protected function enclosedExpression(&$out, $s, $closingParen = ')', $allowedTypes = [Type::T_LIST, Type::T_MAP]) { if ($this->matchChar($closingParen) && \in_array(Type::T_LIST, $allowedTypes)) { $out = [Type::T_LIST, '', []]; switch ($closingParen) { case ')': $out['enclosing'] = 'parent'; // parenthesis list break; case ']': $out['enclosing'] = 'bracket'; // bracketed list break; } return true; } if ( $this->valueList($out) && $this->matchChar($closingParen) && ! ($closingParen === ')' && \in_array($out[0], [Type::T_EXPRESSION, Type::T_UNARY])) && \in_array(Type::T_LIST, $allowedTypes) ) { if ($out[0] !== Type::T_LIST || ! empty($out['enclosing'])) { $out = [Type::T_LIST, '', [$out]]; } switch ($closingParen) { case ')': $out['enclosing'] = 'parent'; // parenthesis list break; case ']': $out['enclosing'] = 'bracket'; // bracketed list break; } return true; } $this->seek($s); if (\in_array(Type::T_MAP, $allowedTypes) && $this->map($out)) { return true; } return false; } /** * Parse left-hand side of subexpression * * @param array $lhs * @param int $minP * * @return array */ protected function expHelper($lhs, $minP) { $operators = static::$operatorPattern; $ss = $this->count; $whiteBefore = isset($this->buffer[$this->count - 1]) && ctype_space($this->buffer[$this->count - 1]); while ($this->match($operators, $m, false) && static::$precedence[$m[1]] >= $minP) { $whiteAfter = isset($this->buffer[$this->count]) && ctype_space($this->buffer[$this->count]); $varAfter = isset($this->buffer[$this->count]) && $this->buffer[$this->count] === '$'; $this->whitespace(); $op = $m[1]; // don't turn negative numbers into expressions if ($op === '-' && $whiteBefore && ! $whiteAfter && ! $varAfter) { break; } if (! $this->value($rhs) && ! $this->expression($rhs, true, false)) { break; } if ($op === '-' && ! $whiteAfter && $rhs[0] === Type::T_KEYWORD) { break; } // consume higher-precedence operators on the right-hand side $rhs = $this->expHelper($rhs, static::$precedence[$op] + 1); $lhs = [Type::T_EXPRESSION, $op, $lhs, $rhs, $this->inParens, $whiteBefore, $whiteAfter]; $ss = $this->count; $whiteBefore = isset($this->buffer[$this->count - 1]) && ctype_space($this->buffer[$this->count - 1]); } $this->seek($ss); return $lhs; } /** * Parse value * * @param array $out * * @return bool */ protected function value(&$out) { if (! isset($this->buffer[$this->count])) { return false; } $s = $this->count; $char = $this->buffer[$this->count]; if ( $this->literal('url(', 4) && $this->match('data:([a-z]+)\/([a-z0-9.+-]+);base64,', $m, false) ) { $len = strspn( $this->buffer, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwyxz0123456789+/=', $this->count ); $this->count += $len; if ($this->matchChar(')')) { $content = substr($this->buffer, $s, $this->count - $s); $out = [Type::T_KEYWORD, $content]; return true; } } $this->seek($s); if ( $this->literal('url(', 4, false) && $this->match('\s*(\/\/[^\s\)]+)\s*', $m) ) { $content = 'url(' . $m[1]; if ($this->matchChar(')')) { $content .= ')'; $out = [Type::T_KEYWORD, $content]; return true; } } $this->seek($s); // not if ($char === 'n' && $this->literal('not', 3, false)) { if ( $this->whitespace() && $this->value($inner) ) { $out = [Type::T_UNARY, 'not', $inner, $this->inParens]; return true; } $this->seek($s); if ($this->parenValue($inner)) { $out = [Type::T_UNARY, 'not', $inner, $this->inParens]; return true; } $this->seek($s); } // addition if ($char === '+') { $this->count++; $follow_white = $this->whitespace(); if ($this->value($inner)) { $out = [Type::T_UNARY, '+', $inner, $this->inParens]; return true; } if ($follow_white) { $out = [Type::T_KEYWORD, $char]; return true; } $this->seek($s); return false; } // negation if ($char === '-') { if ($this->customProperty($out)) { return true; } $this->count++; $follow_white = $this->whitespace(); if ($this->variable($inner) || $this->unit($inner) || $this->parenValue($inner)) { $out = [Type::T_UNARY, '-', $inner, $this->inParens]; return true; } if ( $this->keyword($inner) && ! $this->func($inner, $out) ) { $out = [Type::T_UNARY, '-', $inner, $this->inParens]; return true; } if ($follow_white) { $out = [Type::T_KEYWORD, $char]; return true; } $this->seek($s); } // paren if ($char === '(' && $this->parenValue($out)) { return true; } if ($char === '#') { if ($this->interpolation($out) || $this->color($out)) { return true; } $this->count++; if ($this->keyword($keyword)) { $out = [Type::T_KEYWORD, '#' . $keyword]; return true; } $this->count--; } if ($this->matchChar('&', true)) { $out = [Type::T_SELF]; return true; } if ($char === '$' && $this->variable($out)) { return true; } if ($char === 'p' && $this->progid($out)) { return true; } if (($char === '"' || $char === "'") && $this->string($out)) { return true; } if ($this->unit($out)) { return true; } // unicode range with wildcards if ( $this->literal('U+', 2) && $this->match('\?+|([0-9A-F]+(\?+|(-[0-9A-F]+))?)', $m, false) ) { $unicode = explode('-', $m[0]); if (strlen(reset($unicode)) <= 6 && strlen(end($unicode)) <= 6) { $out = [Type::T_KEYWORD, 'U+' . $m[0]]; return true; } $this->count -= strlen($m[0]) + 2; } if ($this->keyword($keyword, false)) { if ($this->func($keyword, $out)) { return true; } $this->whitespace(); if ($keyword === 'null') { $out = [Type::T_NULL]; } else { $out = [Type::T_KEYWORD, $keyword]; } return true; } return false; } /** * Parse parenthesized value * * @param array $out * * @return bool */ protected function parenValue(&$out) { $s = $this->count; $inParens = $this->inParens; if ($this->matchChar('(')) { if ($this->matchChar(')')) { $out = [Type::T_LIST, '', []]; return true; } $this->inParens = true; if ( $this->expression($exp) && $this->matchChar(')') ) { $out = $exp; $this->inParens = $inParens; return true; } } $this->inParens = $inParens; $this->seek($s); return false; } /** * Parse "progid:" * * @param array $out * * @return bool */ protected function progid(&$out) { $s = $this->count; if ( $this->literal('progid:', 7, false) && $this->openString('(', $fn) && $this->matchChar('(') ) { $this->openString(')', $args, '('); if ($this->matchChar(')')) { $out = [Type::T_STRING, '', [ 'progid:', $fn, '(', $args, ')' ]]; return true; } } $this->seek($s); return false; } /** * Parse function call * * @param string $name * @param array $func * * @return bool */ protected function func($name, &$func) { $s = $this->count; if ($this->matchChar('(')) { if ($name === 'alpha' && $this->argumentList($args)) { $func = [Type::T_FUNCTION, $name, [Type::T_STRING, '', $args]]; return true; } if ($name !== 'expression' && ! preg_match('/^(-[a-z]+-)?calc$/', $name)) { $ss = $this->count; if ( $this->argValues($args) && $this->matchChar(')') ) { $func = [Type::T_FUNCTION_CALL, $name, $args]; return true; } $this->seek($ss); } if ( ($this->openString(')', $str, '(') || true) && $this->matchChar(')') ) { $args = []; if (! empty($str)) { $args[] = [null, [Type::T_STRING, '', [$str]]]; } $func = [Type::T_FUNCTION_CALL, $name, $args]; return true; } } $this->seek($s); return false; } /** * Parse function call argument list * * @param array $out * * @return bool */ protected function argumentList(&$out) { $s = $this->count; $this->matchChar('('); $args = []; while ($this->keyword($var)) { if ( $this->matchChar('=') && $this->expression($exp) ) { $args[] = [Type::T_STRING, '', [$var . '=']]; $arg = $exp; } else { break; } $args[] = $arg; if (! $this->matchChar(',')) { break; } $args[] = [Type::T_STRING, '', [', ']]; } if (! $this->matchChar(')') || ! $args) { $this->seek($s); return false; } $out = $args; return true; } /** * Parse mixin/function definition argument list * * @param array $out * * @return bool */ protected function argumentDef(&$out) { $s = $this->count; $this->matchChar('('); $args = []; while ($this->variable($var)) { $arg = [$var[1], null, false]; $ss = $this->count; if ( $this->matchChar(':') && $this->genericList($defaultVal, 'expression', '', true) ) { $arg[1] = $defaultVal; } else { $this->seek($ss); } $ss = $this->count; if ($this->literal('...', 3)) { $sss = $this->count; if (! $this->matchChar(')')) { throw $this->parseError('... has to be after the final argument'); } $arg[2] = true; $this->seek($sss); } else { $this->seek($ss); } $args[] = $arg; if (! $this->matchChar(',')) { break; } } if (! $this->matchChar(')')) { $this->seek($s); return false; } $out = $args; return true; } /** * Parse map * * @param array $out * * @return bool */ protected function map(&$out) { $s = $this->count; if (! $this->matchChar('(')) { return false; } $keys = []; $values = []; while ( $this->genericList($key, 'expression', '', true) && $this->matchChar(':') && $this->genericList($value, 'expression', '', true) ) { $keys[] = $key; $values[] = $value; if (! $this->matchChar(',')) { break; } } if (! $keys || ! $this->matchChar(')')) { $this->seek($s); return false; } $out = [Type::T_MAP, $keys, $values]; return true; } /** * Parse color * * @param array $out * * @return bool */ protected function color(&$out) { $s = $this->count; if ($this->match('(#([0-9a-f]+)\b)', $m)) { if (\in_array(\strlen($m[2]), [3,4,6,8])) { $out = [Type::T_KEYWORD, $m[0]]; return true; } $this->seek($s); return false; } return false; } /** * Parse number with unit * * @param array $unit * * @return bool */ protected function unit(&$unit) { $s = $this->count; if ($this->match('([0-9]*(\.)?[0-9]+)([%a-zA-Z]+)?', $m, false)) { if (\strlen($this->buffer) === $this->count || ! ctype_digit($this->buffer[$this->count])) { $this->whitespace(); $unit = new Node\Number($m[1], empty($m[3]) ? '' : $m[3]); return true; } $this->seek($s); } return false; } /** * Parse string * * @param array $out * @param bool $keepDelimWithInterpolation * * @return bool */ protected function string(&$out, $keepDelimWithInterpolation = false) { $s = $this->count; if ($this->matchChar('"', false)) { $delim = '"'; } elseif ($this->matchChar("'", false)) { $delim = "'"; } else { return false; } $content = []; $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = false; $hasInterpolation = false; while ($this->matchString($m, $delim)) { if ($m[1] !== '') { $content[] = $m[1]; } if ($m[2] === '#{') { $this->count -= \strlen($m[2]); if ($this->interpolation($inter, false)) { $content[] = $inter; $hasInterpolation = true; } else { $this->count += \strlen($m[2]); $content[] = '#{'; // ignore it } } elseif ($m[2] === "\r") { $content[] = chr(10); // TODO : warning # DEPRECATION WARNING on line x, column y of zzz: # Unescaped multiline strings are deprecated and will be removed in a future version of Sass. # To include a newline in a string, use "\a" or "\a " as in CSS. if ($this->matchChar("\n", false)) { $content[] = ' '; } } elseif ($m[2] === '\\') { if ( $this->literal("\r\n", 2, false) || $this->matchChar("\r", false) || $this->matchChar("\n", false) || $this->matchChar("\f", false) ) { // this is a continuation escaping, to be ignored } elseif ($this->matchEscapeCharacter($c)) { $content[] = $c; } else { throw $this->parseError('Unterminated escape sequence'); } } else { $this->count -= \strlen($delim); break; // delim } } $this->eatWhiteDefault = $oldWhite; if ($this->literal($delim, \strlen($delim))) { if ($hasInterpolation && ! $keepDelimWithInterpolation) { $delim = '"'; } $out = [Type::T_STRING, $delim, $content]; return true; } $this->seek($s); return false; } /** * @param string $out * @param bool $inKeywords * * @return bool */ protected function matchEscapeCharacter(&$out, $inKeywords = false) { $s = $this->count; if ($this->match('[a-f0-9]', $m, false)) { $hex = $m[0]; for ($i = 5; $i--;) { if ($this->match('[a-f0-9]', $m, false)) { $hex .= $m[0]; } else { break; } } // CSS allows Unicode escape sequences to be followed by a delimiter space // (necessary in some cases for shorter sequences to disambiguate their end) $this->matchChar(' ', false); $value = hexdec($hex); if (!$inKeywords && ($value == 0 || ($value >= 0xD800 && $value <= 0xDFFF) || $value >= 0x10FFFF)) { $out = "\xEF\xBF\xBD"; // "\u{FFFD}" but with a syntax supported on PHP 5 } elseif ($value < 0x20) { $out = Util::mbChr($value); } else { $out = Util::mbChr($value); } return true; } if ($this->match('.', $m, false)) { if ($inKeywords && in_array($m[0], ["'",'"','@','&',' ','\\',':','/','%'])) { $this->seek($s); return false; } $out = $m[0]; return true; } return false; } /** * Parse keyword or interpolation * * @param array $out * @param bool $restricted * * @return bool */ protected function mixedKeyword(&$out, $restricted = false) { $parts = []; $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = false; for (;;) { if ($restricted ? $this->restrictedKeyword($key) : $this->keyword($key)) { $parts[] = $key; continue; } if ($this->interpolation($inter)) { $parts[] = $inter; continue; } break; } $this->eatWhiteDefault = $oldWhite; if (! $parts) { return false; } if ($this->eatWhiteDefault) { $this->whitespace(); } $out = $parts; return true; } /** * Parse an unbounded string stopped by $end * * @param string $end * @param array $out * @param string $nestOpen * @param string $nestClose * @param bool $rtrim * @param string $disallow * * @return bool */ protected function openString($end, &$out, $nestOpen = null, $nestClose = null, $rtrim = true, $disallow = null) { $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = false; if ($nestOpen && ! $nestClose) { $nestClose = $end; } $patt = ($disallow ? '[^' . $this->pregQuote($disallow) . ']' : '.'); $patt = '(' . $patt . '*?)([\'"]|#\{|' . $this->pregQuote($end) . '|' . (($nestClose && $nestClose !== $end) ? $this->pregQuote($nestClose) . '|' : '') . static::$commentPattern . ')'; $nestingLevel = 0; $content = []; while ($this->match($patt, $m, false)) { if (isset($m[1]) && $m[1] !== '') { $content[] = $m[1]; if ($nestOpen) { $nestingLevel += substr_count($m[1], $nestOpen); } } $tok = $m[2]; $this->count -= \strlen($tok); if ($tok === $end && ! $nestingLevel) { break; } if ($tok === $nestClose) { $nestingLevel--; } if (($tok === "'" || $tok === '"') && $this->string($str, true)) { $content[] = $str; continue; } if ($tok === '#{' && $this->interpolation($inter)) { $content[] = $inter; continue; } $content[] = $tok; $this->count += \strlen($tok); } $this->eatWhiteDefault = $oldWhite; if (! $content || $tok !== $end) { return false; } // trim the end if ($rtrim && \is_string(end($content))) { $content[\count($content) - 1] = rtrim(end($content)); } $out = [Type::T_STRING, '', $content]; return true; } /** * Parser interpolation * * @param string|array $out * @param bool $lookWhite save information about whitespace before and after * * @return bool */ protected function interpolation(&$out, $lookWhite = true) { $oldWhite = $this->eatWhiteDefault; $allowVars = $this->allowVars; $this->allowVars = true; $this->eatWhiteDefault = true; $s = $this->count; if ( $this->literal('#{', 2) && $this->valueList($value) && $this->matchChar('}', false) ) { if ($value === [Type::T_SELF]) { $out = $value; } else { if ($lookWhite) { $left = ($s > 0 && preg_match('/\s/', $this->buffer[$s - 1])) ? ' ' : ''; $right = ( ! empty($this->buffer[$this->count]) && preg_match('/\s/', $this->buffer[$this->count]) ) ? ' ' : ''; } else { $left = $right = false; } $out = [Type::T_INTERPOLATE, $value, $left, $right]; } $this->eatWhiteDefault = $oldWhite; $this->allowVars = $allowVars; if ($this->eatWhiteDefault) { $this->whitespace(); } return true; } $this->seek($s); $this->eatWhiteDefault = $oldWhite; $this->allowVars = $allowVars; return false; } /** * Parse property name (as an array of parts or a string) * * @param array $out * * @return bool */ protected function propertyName(&$out) { $parts = []; $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = false; for (;;) { if ($this->interpolation($inter)) { $parts[] = $inter; continue; } if ($this->keyword($text)) { $parts[] = $text; continue; } if (! $parts && $this->match('[:.#]', $m, false)) { // css hacks $parts[] = $m[0]; continue; } break; } $this->eatWhiteDefault = $oldWhite; if (! $parts) { return false; } // match comment hack if (preg_match(static::$whitePattern, $this->buffer, $m, 0, $this->count)) { if (! empty($m[0])) { $parts[] = $m[0]; $this->count += \strlen($m[0]); } } $this->whitespace(); // get any extra whitespace $out = [Type::T_STRING, '', $parts]; return true; } /** * Parse custom property name (as an array of parts or a string) * * @param array $out * * @return bool */ protected function customProperty(&$out) { $s = $this->count; if (! $this->literal('--', 2, false)) { return false; } $parts = ['--']; $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = false; for (;;) { if ($this->interpolation($inter)) { $parts[] = $inter; continue; } if ($this->matchChar('&', false)) { $parts[] = [Type::T_SELF]; continue; } if ($this->variable($var)) { $parts[] = $var; continue; } if ($this->keyword($text)) { $parts[] = $text; continue; } break; } $this->eatWhiteDefault = $oldWhite; if (\count($parts) == 1) { $this->seek($s); return false; } $this->whitespace(); // get any extra whitespace $out = [Type::T_STRING, '', $parts]; return true; } /** * Parse comma separated selector list * * @param array $out * @param string|bool $subSelector * * @return bool */ protected function selectors(&$out, $subSelector = false) { $s = $this->count; $selectors = []; while ($this->selector($sel, $subSelector)) { $selectors[] = $sel; if (! $this->matchChar(',', true)) { break; } while ($this->matchChar(',', true)) { ; // ignore extra } } if (! $selectors) { $this->seek($s); return false; } $out = $selectors; return true; } /** * Parse whitespace separated selector list * * @param array $out * @param string|bool $subSelector * * @return bool */ protected function selector(&$out, $subSelector = false) { $selector = []; $discardComments = $this->discardComments; $this->discardComments = true; for (;;) { $s = $this->count; if ($this->match('[>+~]+', $m, true)) { if ( $subSelector && \is_string($subSelector) && strpos($subSelector, 'nth-') === 0 && $m[0] === '+' && $this->match("(\d+|n\b)", $counter) ) { $this->seek($s); } else { $selector[] = [$m[0]]; continue; } } if ($this->selectorSingle($part, $subSelector)) { $selector[] = $part; $this->whitespace(); continue; } break; } $this->discardComments = $discardComments; if (! $selector) { return false; } $out = $selector; return true; } /** * parsing escaped chars in selectors: * - escaped single chars are kept escaped in the selector but in a normalized form * (if not in 0-9a-f range as this would be ambigous) * - other escaped sequences (multibyte chars or 0-9a-f) are kept in their initial escaped form, * normalized to lowercase * * TODO: this is a fallback solution. Ideally escaped chars in selectors should be encoded as the genuine chars, * and escaping added when printing in the Compiler, where/if it's mandatory * - but this require a better formal selector representation instead of the array we have now * * @param string $out * @param bool $keepEscapedNumber * * @return bool */ protected function matchEscapeCharacterInSelector(&$out, $keepEscapedNumber = false) { $s_escape = $this->count; if ($this->match('\\\\', $m)) { $out = '\\' . $m[0]; return true; } if ($this->matchEscapeCharacter($escapedout, true)) { if (strlen($escapedout) === 1) { if (!preg_match(",\w,", $escapedout)) { $out = '\\' . $escapedout; return true; } elseif (! $keepEscapedNumber || ! \is_numeric($escapedout)) { $out = $escapedout; return true; } } $escape_sequence = rtrim(substr($this->buffer, $s_escape, $this->count - $s_escape)); if (strlen($escape_sequence) < 6) { $escape_sequence .= ' '; } $out = '\\' . strtolower($escape_sequence); return true; } if ($this->match('\\S', $m)) { $out = '\\' . $m[0]; return true; } return false; } /** * Parse the parts that make up a selector * * {@internal * div[yes=no]#something.hello.world:nth-child(-2n+1)%placeholder * }} * * @param array $out * @param string|bool $subSelector * * @return bool */ protected function selectorSingle(&$out, $subSelector = false) { $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = false; $parts = []; if ($this->matchChar('*', false)) { $parts[] = '*'; } for (;;) { if (! isset($this->buffer[$this->count])) { break; } $s = $this->count; $char = $this->buffer[$this->count]; // see if we can stop early if ($char === '{' || $char === ',' || $char === ';' || $char === '}' || $char === '@') { break; } // parsing a sub selector in () stop with the closing ) if ($subSelector && $char === ')') { break; } //self switch ($char) { case '&': $parts[] = Compiler::$selfSelector; $this->count++; ! $this->cssOnly || $this->assertPlainCssValid(false, $s); continue 2; case '.': $parts[] = '.'; $this->count++; continue 2; case '|': $parts[] = '|'; $this->count++; continue 2; } // handling of escaping in selectors : get the escaped char if ($char === '\\') { $this->count++; if ($this->matchEscapeCharacterInSelector($escaped, true)) { $parts[] = $escaped; continue; } $this->count--; } if ($char === '%') { $this->count++; if ($this->placeholder($placeholder)) { $parts[] = '%'; $parts[] = $placeholder; ! $this->cssOnly || $this->assertPlainCssValid(false, $s); continue; } break; } if ($char === '#') { if ($this->interpolation($inter)) { $parts[] = $inter; ! $this->cssOnly || $this->assertPlainCssValid(false, $s); continue; } $parts[] = '#'; $this->count++; continue; } // a pseudo selector if ($char === ':') { if ($this->buffer[$this->count + 1] === ':') { $this->count += 2; $part = '::'; } else { $this->count++; $part = ':'; } if ($this->mixedKeyword($nameParts, true)) { $parts[] = $part; foreach ($nameParts as $sub) { $parts[] = $sub; } $ss = $this->count; if ( $nameParts === ['not'] || $nameParts === ['is'] || $nameParts === ['has'] || $nameParts === ['where'] || $nameParts === ['slotted'] || $nameParts === ['nth-child'] || $nameParts === ['nth-last-child'] || $nameParts === ['nth-of-type'] || $nameParts === ['nth-last-of-type'] ) { if ( $this->matchChar('(', true) && ($this->selectors($subs, reset($nameParts)) || true) && $this->matchChar(')') ) { $parts[] = '('; while ($sub = array_shift($subs)) { while ($ps = array_shift($sub)) { foreach ($ps as &$p) { $parts[] = $p; } if (\count($sub) && reset($sub)) { $parts[] = ' '; } } if (\count($subs) && reset($subs)) { $parts[] = ', '; } } $parts[] = ')'; } else { $this->seek($ss); } } elseif ( $this->matchChar('(', true) && ($this->openString(')', $str, '(') || true) && $this->matchChar(')') ) { $parts[] = '('; if (! empty($str)) { $parts[] = $str; } $parts[] = ')'; } else { $this->seek($ss); } continue; } } $this->seek($s); // 2n+1 if ($subSelector && \is_string($subSelector) && strpos($subSelector, 'nth-') === 0) { if ($this->match("(\s*(\+\s*|\-\s*)?(\d+|n|\d+n))+", $counter)) { $parts[] = $counter[0]; //$parts[] = str_replace(' ', '', $counter[0]); continue; } } $this->seek($s); // attribute selector if ( $char === '[' && $this->matchChar('[') && ($this->openString(']', $str, '[') || true) && $this->matchChar(']') ) { $parts[] = '['; if (! empty($str)) { $parts[] = $str; } $parts[] = ']'; continue; } $this->seek($s); // for keyframes if ($this->unit($unit)) { $parts[] = $unit; continue; } if ($this->restrictedKeyword($name, false, true)) { $parts[] = $name; continue; } break; } $this->eatWhiteDefault = $oldWhite; if (! $parts) { return false; } $out = $parts; return true; } /** * Parse a variable * * @param array $out * * @return bool */ protected function variable(&$out) { $s = $this->count; if ( $this->matchChar('$', false) && $this->keyword($name) ) { if ($this->allowVars) { $out = [Type::T_VARIABLE, $name]; } else { $out = [Type::T_KEYWORD, '$' . $name]; } return true; } $this->seek($s); return false; } /** * Parse a keyword * * @param string $word * @param bool $eatWhitespace * @param bool $inSelector * * @return bool */ protected function keyword(&$word, $eatWhitespace = null, $inSelector = false) { $s = $this->count; $match = $this->match( $this->utf8 ? '(([\pL\w\x{00A0}-\x{10FFFF}_\-\*!"\']|\\\\[a-f0-9]{6} ?|\\\\[a-f0-9]{1,5}(?![a-f0-9]) ?|[\\\\].)([\pL\w\x{00A0}-\x{10FFFF}\-_"\']|\\\\[a-f0-9]{6} ?|\\\\[a-f0-9]{1,5}(?![a-f0-9]) ?|[\\\\].)*)' : '(([\w_\-\*!"\']|\\\\[a-f0-9]{6} ?|\\\\[a-f0-9]{1,5}(?![a-f0-9]) ?|[\\\\].)([\w\-_"\']|\\\\[a-f0-9]{6} ?|\\\\[a-f0-9]{1,5}(?![a-f0-9]) ?|[\\\\].)*)', $m, false ); if ($match) { $word = $m[1]; // handling of escaping in keyword : get the escaped char if (strpos($word, '\\') !== false) { $send = $this->count; $escapedWord = []; $this->seek($s); $previousEscape = false; while ($this->count < $send) { $char = $this->buffer[$this->count]; $this->count++; if ( $this->count < $send && $char === '\\' && !$previousEscape && ( $inSelector ? $this->matchEscapeCharacterInSelector($out) : $this->matchEscapeCharacter($out, true) ) ) { $escapedWord[] = $out; } else { if ($previousEscape) { $previousEscape = false; } elseif ($char === '\\') { $previousEscape = true; } $escapedWord[] = $char; } } $word = implode('', $escapedWord); } if (is_null($eatWhitespace) ? $this->eatWhiteDefault : $eatWhitespace) { $this->whitespace(); } return true; } return false; } /** * Parse a keyword that should not start with a number * * @param string $word * @param bool $eatWhitespace * @param bool $inSelector * * @return bool */ protected function restrictedKeyword(&$word, $eatWhitespace = null, $inSelector = false) { $s = $this->count; if ($this->keyword($word, $eatWhitespace, $inSelector) && (\ord($word[0]) > 57 || \ord($word[0]) < 48)) { return true; } $this->seek($s); return false; } /** * Parse a placeholder * * @param string|array $placeholder * * @return bool */ protected function placeholder(&$placeholder) { $match = $this->match( $this->utf8 ? '([\pL\w\-_]+)' : '([\w\-_]+)', $m ); if ($match) { $placeholder = $m[1]; return true; } if ($this->interpolation($placeholder)) { return true; } return false; } /** * Parse a url * * @param array $out * * @return bool */ protected function url(&$out) { if ($this->literal('url(', 4)) { $s = $this->count; if ( ($this->string($out) || $this->spaceList($out)) && $this->matchChar(')') ) { $out = [Type::T_STRING, '', ['url(', $out, ')']]; return true; } $this->seek($s); if ( $this->openString(')', $out) && $this->matchChar(')') ) { $out = [Type::T_STRING, '', ['url(', $out, ')']]; return true; } } return false; } /** * Consume an end of statement delimiter * @param bool $eatWhitespace * * @return bool */ protected function end($eatWhitespace = null) { if ($this->matchChar(';', $eatWhitespace)) { return true; } if ($this->count === \strlen($this->buffer) || $this->buffer[$this->count] === '}') { // if there is end of file or a closing block next then we don't need a ; return true; } return false; } /** * Strip assignment flag from the list * * @param array $value * * @return string[] */ protected function stripAssignmentFlags(&$value) { $flags = []; for ($token = &$value; $token[0] === Type::T_LIST && ($s = \count($token[2])); $token = &$lastNode) { $lastNode = &$token[2][$s - 1]; while ($lastNode[0] === Type::T_KEYWORD && \in_array($lastNode[1], ['!default', '!global'])) { array_pop($token[2]); $node = end($token[2]); $token = $this->flattenList($token); $flags[] = $lastNode[1]; $lastNode = $node; } } return $flags; } /** * Strip optional flag from selector list * * @param array $selectors * * @return bool */ protected function stripOptionalFlag(&$selectors) { $optional = false; $selector = end($selectors); $part = end($selector); if ($part === ['!optional']) { array_pop($selectors[\count($selectors) - 1]); $optional = true; } return $optional; } /** * Turn list of length 1 into value type * * @param array $value * * @return array */ protected function flattenList($value) { if ($value[0] === Type::T_LIST && \count($value[2]) === 1) { return $this->flattenList($value[2][0]); } return $value; } /** * Quote regular expression * * @param string $what * * @return string */ private function pregQuote($what) { return preg_quote($what, '/'); } /** * Extract line numbers from buffer * * @param string $buffer * * @return void */ private function extractLineNumbers($buffer) { $this->sourcePositions = [0 => 0]; $prev = 0; while (($pos = strpos($buffer, "\n", $prev)) !== false) { $this->sourcePositions[] = $pos; $prev = $pos + 1; } $this->sourcePositions[] = \strlen($buffer); if (substr($buffer, -1) !== "\n") { $this->sourcePositions[] = \strlen($buffer) + 1; } } /** * Get source line number and column (given character position in the buffer) * * @param int $pos * * @return array * @phpstan-return array{int, int} */ private function getSourcePosition($pos) { $low = 0; $high = \count($this->sourcePositions); while ($low < $high) { $mid = (int) (($high + $low) / 2); if ($pos < $this->sourcePositions[$mid]) { $high = $mid - 1; continue; } if ($pos >= $this->sourcePositions[$mid + 1]) { $low = $mid + 1; continue; } return [$mid + 1, $pos - $this->sourcePositions[$mid]]; } return [$low + 1, $pos - $this->sourcePositions[$low]]; } /** * Save internal encoding of mbstring * * When mbstring.func_overload is used to replace the standard PHP string functions, * this method configures the internal encoding to a single-byte one so that the * behavior matches the normal behavior of PHP string functions while using the parser. * The existing internal encoding is saved and will be restored when calling {@see restoreEncoding}. * * If mbstring.func_overload is not used (or does not override string functions), this method is a no-op. * * @return void */ private function saveEncoding() { if (\PHP_VERSION_ID < 80000 && \extension_loaded('mbstring') && (2 & (int) ini_get('mbstring.func_overload')) > 0) { $this->encoding = mb_internal_encoding(); mb_internal_encoding('iso-8859-1'); } } /** * Restore internal encoding * * @return void */ private function restoreEncoding() { if (\extension_loaded('mbstring') && $this->encoding) { mb_internal_encoding($this->encoding); } } } PKCA#]�k�hh:system/helixultimate/vendor/scssphp/scssphp/src/Colors.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; use ScssPhp\ScssPhp\Value\SassColor; /** * CSS Colors * * @author Leaf Corcoran <leafot@gmail.com> * * @internal */ final class Colors { /** * CSS Colors * * @see http://www.w3.org/TR/css3-color * * @var array<string, string> */ private const CSS_COLORS = [ 'aliceblue' => '240,248,255', 'antiquewhite' => '250,235,215', 'aqua' => '0,255,255', 'cyan' => '0,255,255', 'aquamarine' => '127,255,212', 'azure' => '240,255,255', 'beige' => '245,245,220', 'bisque' => '255,228,196', 'black' => '0,0,0', 'blanchedalmond' => '255,235,205', 'blue' => '0,0,255', 'blueviolet' => '138,43,226', 'brown' => '165,42,42', 'burlywood' => '222,184,135', 'cadetblue' => '95,158,160', 'chartreuse' => '127,255,0', 'chocolate' => '210,105,30', 'coral' => '255,127,80', 'cornflowerblue' => '100,149,237', 'cornsilk' => '255,248,220', 'crimson' => '220,20,60', 'darkblue' => '0,0,139', 'darkcyan' => '0,139,139', 'darkgoldenrod' => '184,134,11', 'darkgray' => '169,169,169', 'darkgrey' => '169,169,169', 'darkgreen' => '0,100,0', 'darkkhaki' => '189,183,107', 'darkmagenta' => '139,0,139', 'darkolivegreen' => '85,107,47', 'darkorange' => '255,140,0', 'darkorchid' => '153,50,204', 'darkred' => '139,0,0', 'darksalmon' => '233,150,122', 'darkseagreen' => '143,188,143', 'darkslateblue' => '72,61,139', 'darkslategray' => '47,79,79', 'darkslategrey' => '47,79,79', 'darkturquoise' => '0,206,209', 'darkviolet' => '148,0,211', 'deeppink' => '255,20,147', 'deepskyblue' => '0,191,255', 'dimgray' => '105,105,105', 'dimgrey' => '105,105,105', 'dodgerblue' => '30,144,255', 'firebrick' => '178,34,34', 'floralwhite' => '255,250,240', 'forestgreen' => '34,139,34', 'fuchsia' => '255,0,255', 'magenta' => '255,0,255', 'gainsboro' => '220,220,220', 'ghostwhite' => '248,248,255', 'gold' => '255,215,0', 'goldenrod' => '218,165,32', 'gray' => '128,128,128', 'grey' => '128,128,128', 'green' => '0,128,0', 'greenyellow' => '173,255,47', 'honeydew' => '240,255,240', 'hotpink' => '255,105,180', 'indianred' => '205,92,92', 'indigo' => '75,0,130', 'ivory' => '255,255,240', 'khaki' => '240,230,140', 'lavender' => '230,230,250', 'lavenderblush' => '255,240,245', 'lawngreen' => '124,252,0', 'lemonchiffon' => '255,250,205', 'lightblue' => '173,216,230', 'lightcoral' => '240,128,128', 'lightcyan' => '224,255,255', 'lightgoldenrodyellow' => '250,250,210', 'lightgray' => '211,211,211', 'lightgrey' => '211,211,211', 'lightgreen' => '144,238,144', 'lightpink' => '255,182,193', 'lightsalmon' => '255,160,122', 'lightseagreen' => '32,178,170', 'lightskyblue' => '135,206,250', 'lightslategray' => '119,136,153', 'lightslategrey' => '119,136,153', 'lightsteelblue' => '176,196,222', 'lightyellow' => '255,255,224', 'lime' => '0,255,0', 'limegreen' => '50,205,50', 'linen' => '250,240,230', 'maroon' => '128,0,0', 'mediumaquamarine' => '102,205,170', 'mediumblue' => '0,0,205', 'mediumorchid' => '186,85,211', 'mediumpurple' => '147,112,219', 'mediumseagreen' => '60,179,113', 'mediumslateblue' => '123,104,238', 'mediumspringgreen' => '0,250,154', 'mediumturquoise' => '72,209,204', 'mediumvioletred' => '199,21,133', 'midnightblue' => '25,25,112', 'mintcream' => '245,255,250', 'mistyrose' => '255,228,225', 'moccasin' => '255,228,181', 'navajowhite' => '255,222,173', 'navy' => '0,0,128', 'oldlace' => '253,245,230', 'olive' => '128,128,0', 'olivedrab' => '107,142,35', 'orange' => '255,165,0', 'orangered' => '255,69,0', 'orchid' => '218,112,214', 'palegoldenrod' => '238,232,170', 'palegreen' => '152,251,152', 'paleturquoise' => '175,238,238', 'palevioletred' => '219,112,147', 'papayawhip' => '255,239,213', 'peachpuff' => '255,218,185', 'peru' => '205,133,63', 'pink' => '255,192,203', 'plum' => '221,160,221', 'powderblue' => '176,224,230', 'purple' => '128,0,128', 'red' => '255,0,0', 'rosybrown' => '188,143,143', 'royalblue' => '65,105,225', 'saddlebrown' => '139,69,19', 'salmon' => '250,128,114', 'sandybrown' => '244,164,96', 'seagreen' => '46,139,87', 'seashell' => '255,245,238', 'sienna' => '160,82,45', 'silver' => '192,192,192', 'skyblue' => '135,206,235', 'slateblue' => '106,90,205', 'slategray' => '112,128,144', 'slategrey' => '112,128,144', 'snow' => '255,250,250', 'springgreen' => '0,255,127', 'steelblue' => '70,130,180', 'tan' => '210,180,140', 'teal' => '0,128,128', 'thistle' => '216,191,216', 'tomato' => '255,99,71', 'turquoise' => '64,224,208', 'violet' => '238,130,238', 'wheat' => '245,222,179', 'white' => '255,255,255', 'whitesmoke' => '245,245,245', 'yellow' => '255,255,0', 'yellowgreen' => '154,205,50', 'rebeccapurple' => '102,51,153', 'transparent' => '0,0,0,0', ]; public static function colorNameToColor(string $colorName): ?SassColor { $rgba = self::colorNameToRGBa($colorName); if ($rgba === null) { return null; } return SassColor::rgb($rgba[0], $rgba[1], $rgba[2], $rgba[3] ?? 1.0); } /** * Convert named color in a [r,g,b[,a]] array * * @param string $colorName * * @return int[]|null */ private static function colorNameToRGBa(string $colorName): ?array { if (isset(self::CSS_COLORS[$colorName])) { $rgba = explode(',', self::CSS_COLORS[$colorName]); // only case with opacity is transparent, with opacity=0, so we can intval on opacity also return array_map('intval', $rgba); } return null; } /** * Reverse conversion: from RGBA to a color name if possible */ public static function RGBaToColorName(int $r, int $g, int $b, float $a): ?string { static $reverseColorTable = null; if ($a < 1) { return null; } if (\is_null($reverseColorTable)) { $reverseColorTable = []; foreach (self::CSS_COLORS as $name => $rgb_str) { $rgb_str = explode(',', $rgb_str); if ( \count($rgb_str) === 3 && ! isset($reverseColorTable[\intval($rgb_str[0])][\intval($rgb_str[1])][\intval($rgb_str[2])]) ) { $reverseColorTable[\intval($rgb_str[0])][\intval($rgb_str[1])][\intval($rgb_str[2])] = $name; } } } if (isset($reverseColorTable[$r][$g][$b])) { return $reverseColorTable[$r][$g][$b]; } return null; } } PKCA#]���:BB;system/helixultimate/vendor/scssphp/scssphp/src/Version.phpnu�[���<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp; /** * SCSSPHP version * * @author Leaf Corcoran <leafot@gmail.com> */ final class Version { const VERSION = '2.1.0'; } PKCA#]%�C558system/helixultimate/vendor/scssphp/scssphp/scss.inc.phpnu�[���<?php if (version_compare(PHP_VERSION, '5.6') < 0) { throw new \Exception('scssphp requires PHP 5.6 or above'); } if (! class_exists('ScssPhp\ScssPhp\Version')) { spl_autoload_register(function ($class) { if (0 !== strpos($class, 'ScssPhp\ScssPhp\\')) { // Not a ScssPhp class return; } $subClass = substr($class, strlen('ScssPhp\ScssPhp\\')); $path = __DIR__ . '/src/' . str_replace('\\', '/', $subClass) . '.php'; if (file_exists($path)) { require $path; } }); } PKCA#]��3^Q!Q!Esystem/helixultimate/vendor/symfony/polyfill-mbstring/bootstrap72.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Mbstring as p; if (!function_exists('mb_convert_encoding')) { function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); } } if (!function_exists('mb_decode_mimeheader')) { function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); } } if (!function_exists('mb_encode_mimeheader')) { function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); } } if (!function_exists('mb_decode_numericentity')) { function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); } } if (!function_exists('mb_encode_numericentity')) { function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); } } if (!function_exists('mb_convert_case')) { function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); } } if (!function_exists('mb_internal_encoding')) { function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); } } if (!function_exists('mb_language')) { function mb_language($language = null) { return p\Mbstring::mb_language($language); } } if (!function_exists('mb_list_encodings')) { function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } } if (!function_exists('mb_encoding_aliases')) { function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } } if (!function_exists('mb_check_encoding')) { function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); } } if (!function_exists('mb_detect_encoding')) { function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); } } if (!function_exists('mb_detect_order')) { function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); } } if (!function_exists('mb_parse_str')) { function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; } } if (!function_exists('mb_strlen')) { function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); } } if (!function_exists('mb_strpos')) { function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); } } if (!function_exists('mb_strtolower')) { function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); } } if (!function_exists('mb_strtoupper')) { function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); } } if (!function_exists('mb_substitute_character')) { function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); } } if (!function_exists('mb_substr')) { function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); } } if (!function_exists('mb_stripos')) { function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); } } if (!function_exists('mb_stristr')) { function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); } } if (!function_exists('mb_strrchr')) { function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); } } if (!function_exists('mb_strrichr')) { function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); } } if (!function_exists('mb_strripos')) { function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); } } if (!function_exists('mb_strrpos')) { function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); } } if (!function_exists('mb_strstr')) { function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); } } if (!function_exists('mb_get_info')) { function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } } if (!function_exists('mb_http_output')) { function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); } } if (!function_exists('mb_strwidth')) { function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); } } if (!function_exists('mb_substr_count')) { function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); } } if (!function_exists('mb_output_handler')) { function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); } } if (!function_exists('mb_http_input')) { function mb_http_input($type = null) { return p\Mbstring::mb_http_input($type); } } if (!function_exists('mb_convert_variables')) { function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); } } if (!function_exists('mb_ord')) { function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); } } if (!function_exists('mb_chr')) { function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); } } if (!function_exists('mb_scrub')) { function mb_scrub($string, $encoding = null) { return p\Mbstring::mb_scrub($string, $encoding); } } if (!function_exists('mb_str_split')) { function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); } } if (!function_exists('mb_str_pad')) { /** @return string|false */ function mb_str_pad(?string $string, ?int $length, ?string $pad_string = ' ', ?int $pad_type = STR_PAD_RIGHT, ?string $encoding = null) { return p\Mbstring::mb_str_pad((string) $string, (int) $length, (string) $pad_string, (int) $pad_type, $encoding); } } if (!function_exists('mb_ucfirst')) { /** @return string|false */ function mb_ucfirst(?string $string, ?string $encoding = null) { return p\Mbstring::mb_ucfirst((string) $string, $encoding); } } if (!function_exists('mb_lcfirst')) { /** @return string|false */ function mb_lcfirst(?string $string, ?string $encoding = null) { return p\Mbstring::mb_lcfirst((string) $string, $encoding); } } if (!function_exists('mb_trim')) { /** @return string|false */ function mb_trim(?string $string, ?string $characters = null, ?string $encoding = null) { return p\Mbstring::mb_trim((string) $string, $characters, $encoding); } } if (!function_exists('mb_ltrim')) { /** @return string|false */ function mb_ltrim(?string $string, ?string $characters = null, ?string $encoding = null) { return p\Mbstring::mb_ltrim((string) $string, $characters, $encoding); } } if (!function_exists('mb_rtrim')) { /** @return string|false */ function mb_rtrim(?string $string, ?string $characters = null, ?string $encoding = null) { return p\Mbstring::mb_rtrim((string) $string, $characters, $encoding); } } if (extension_loaded('mbstring')) { return; } if (!defined('MB_CASE_UPPER')) { define('MB_CASE_UPPER', 0); } if (!defined('MB_CASE_LOWER')) { define('MB_CASE_LOWER', 1); } if (!defined('MB_CASE_TITLE')) { define('MB_CASE_TITLE', 2); } PKCA#]t1�ʛʛBsystem/helixultimate/vendor/symfony/polyfill-mbstring/Mbstring.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Polyfill\Mbstring; /** * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. * * Implemented: * - mb_chr - Returns a specific character from its Unicode code point * - mb_convert_encoding - Convert character encoding * - mb_convert_variables - Convert character code in variable(s) * - mb_decode_mimeheader - Decode string in MIME header field * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED * - mb_decode_numericentity - Decode HTML numeric string reference to character * - mb_encode_numericentity - Encode character to HTML numeric string reference * - mb_convert_case - Perform case folding on a string * - mb_detect_encoding - Detect character encoding * - mb_get_info - Get internal settings of mbstring * - mb_http_input - Detect HTTP input character encoding * - mb_http_output - Set/Get HTTP output character encoding * - mb_internal_encoding - Set/Get internal character encoding * - mb_list_encodings - Returns an array of all supported encodings * - mb_ord - Returns the Unicode code point of a character * - mb_output_handler - Callback function converts character encoding in output buffer * - mb_scrub - Replaces ill-formed byte sequences with substitute characters * - mb_strlen - Get string length * - mb_strpos - Find position of first occurrence of string in a string * - mb_strrpos - Find position of last occurrence of a string in a string * - mb_str_split - Convert a string to an array * - mb_strtolower - Make a string lowercase * - mb_strtoupper - Make a string uppercase * - mb_substitute_character - Set/Get substitution character * - mb_substr - Get part of string * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive * - mb_stristr - Finds first occurrence of a string within another, case insensitive * - mb_strrchr - Finds the last occurrence of a character in a string within another * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive * - mb_strstr - Finds first occurrence of a string within another * - mb_strwidth - Return width of string * - mb_substr_count - Count the number of substring occurrences * - mb_ucfirst - Make a string's first character uppercase * - mb_lcfirst - Make a string's first character lowercase * - mb_trim - Strip whitespace (or other characters) from the beginning and end of a string * - mb_ltrim - Strip whitespace (or other characters) from the beginning of a string * - mb_rtrim - Strip whitespace (or other characters) from the end of a string * * Not implemented: * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) * - mb_ereg_* - Regular expression with multibyte support * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable * - mb_preferred_mime_name - Get MIME charset string * - mb_regex_encoding - Returns current encoding for multibyte regex as string * - mb_regex_set_options - Set/Get the default options for mbregex functions * - mb_send_mail - Send encoded mail * - mb_split - Split multibyte string using regular expression * - mb_strcut - Get part of string * - mb_strimwidth - Get truncated string with specified width * * @author Nicolas Grekas <p@tchwork.com> * * @internal */ final class Mbstring { public const MB_CASE_FOLD = \PHP_INT_MAX; private const SIMPLE_CASE_FOLD = [ ['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"], ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'], ]; private static $encodingList = ['ASCII', 'UTF-8']; private static $language = 'neutral'; private static $internalEncoding = 'UTF-8'; private static $iconvSupportsIgnore; public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) { if (\is_array($s)) { $r = []; foreach ($s as $str) { $r[] = self::mb_convert_encoding($str, $toEncoding, $fromEncoding); } return $r; } if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) { $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); } else { $fromEncoding = self::getEncoding($fromEncoding); } $toEncoding = self::getEncoding($toEncoding); if ('BASE64' === $fromEncoding) { $s = base64_decode($s); $fromEncoding = $toEncoding; } if ('BASE64' === $toEncoding) { return base64_encode($s); } if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { $fromEncoding = 'Windows-1252'; } if ('UTF-8' !== $fromEncoding) { $s = self::iconv($fromEncoding, 'UTF-8', $s); } return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s); } if ('HTML-ENTITIES' === $fromEncoding) { $decodeControlChars = static function ($m) { $code = '' !== ($m[2] ?? '') ? hexdec($m[2]) : (int) $m[1]; if ($code < 32 || 127 === $code) { return \chr($code); } if (128 <= $code && $code <= 159) { return "\xC2".\chr(0x80 | ($code & 0x3F)); } return $m[0]; }; if (\PHP_VERSION_ID >= 70400) { $s = html_entity_decode($s, \ENT_QUOTES, 'UTF-8'); // html_entity_decode() leaves numeric entities for C0/C1 control // characters as-is (HTML spec), but mb_convert_encoding() decodes // them. Catch what html_entity_decode() missed. if (false !== strpos($s, '&#')) { $s = preg_replace_callback('/&#(?:0*([0-9]++)|[xX]0*([0-9a-fA-F]++));/', $decodeControlChars, $s); } } else { // PHP < 7.4: html_entity_decode() truncates strings at NUL bytes, // so decode the control character entities first then call // html_entity_decode() on each NUL-delimited chunk independently. $s = preg_replace_callback('/&#(?:0*([0-9]++)|[xX]0*([0-9a-fA-F]++));/', $decodeControlChars, $s); $s = implode("\0", array_map(static function ($chunk) { return html_entity_decode($chunk, \ENT_QUOTES, 'UTF-8'); }, explode("\0", $s))); } $fromEncoding = 'UTF-8'; } return self::iconv($fromEncoding, $toEncoding, $s); } public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) { $ok = true; array_walk_recursive($vars, static function (&$v) use (&$ok, $toEncoding, $fromEncoding) { if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) { $ok = false; } }); return $ok ? $fromEncoding : false; } public static function mb_decode_mimeheader($s) { return iconv_mime_decode($s, 2, self::$internalEncoding); } public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) { trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING); } public static function mb_decode_numericentity($s, $convmap, $encoding = null) { if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); return null; } if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { return false; } if (null !== $encoding && !\is_scalar($encoding)) { trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); return ''; // Instead of null (cf. mb_encode_numericentity). } $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { $s = @self::iconv('UTF-8', 'UTF-8', $s); } } else { $s = self::iconv($encoding, 'UTF-8', $s); } $cnt = floor(\count($convmap) / 4) * 4; for ($i = 0; $i < $cnt; $i += 4) { // collector_decode_htmlnumericentity ignores $convmap[$i + 3] $convmap[$i] += $convmap[$i + 2]; $convmap[$i + 1] += $convmap[$i + 2]; } $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))'.(\PHP_VERSION_ID >= 80200 ? '' : '(?!&)').';?/', static function (array $m) use ($cnt, $convmap) { $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1]; for ($i = 0; $i < $cnt; $i += 4) { if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { return self::mb_chr($c - $convmap[$i + 2]); } } return $m[0]; }, $s); if (null === $encoding) { return $s; } return self::iconv('UTF-8', $encoding, $s); } public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) { if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); return null; } if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { return false; } if (null !== $encoding && !\is_scalar($encoding)) { trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); return null; // Instead of '' (cf. mb_decode_numericentity). } if (null !== $is_hex && !\is_scalar($is_hex)) { trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING); return null; } $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { $s = @self::iconv('UTF-8', 'UTF-8', $s); } } else { $s = self::iconv($encoding, 'UTF-8', $s); } static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; $cnt = floor(\count($convmap) / 4) * 4; $i = 0; $len = \strlen($s); $result = ''; while ($i < $len) { $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; $uchr = substr($s, $i, $ulen); $i += $ulen; $c = self::mb_ord($uchr); for ($j = 0; $j < $cnt; $j += 4) { if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3]; $result .= $is_hex ? \sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';'; continue 2; } } $result .= $uchr; } if (null === $encoding) { return $result; } return self::iconv('UTF-8', $encoding, $result); } public static function mb_convert_case($s, $mode, $encoding = null) { $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { $s = @self::iconv('UTF-8', 'UTF-8', $s); } } else { $s = self::iconv($encoding, 'UTF-8', $s); } if (\MB_CASE_TITLE == $mode) { static $titleRegexp = null; if (null === $titleRegexp) { $titleRegexp = self::getData('titleCaseRegexp'); } $s = preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s); } else { if (\MB_CASE_UPPER == $mode) { static $upper = null; if (null === $upper) { $upper = self::getData('upperCase'); } $map = $upper; } else { if (self::MB_CASE_FOLD === $mode) { static $caseFolding = null; if (null === $caseFolding) { $caseFolding = self::getData('caseFolding'); } $s = strtr($s, $caseFolding); } static $lower = null; if (null === $lower) { $lower = self::getData('lowerCase'); } $map = $lower; } static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; $i = 0; $len = \strlen($s); while ($i < $len) { $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; $uchr = substr($s, $i, $ulen); $i += $ulen; if (isset($map[$uchr])) { $uchr = $map[$uchr]; $nlen = \strlen($uchr); if ($nlen == $ulen) { $nlen = $i; do { $s[--$nlen] = $uchr[--$ulen]; } while ($ulen); } else { $s = substr_replace($s, $uchr, $i - $ulen, $ulen); $len += $nlen - $ulen; $i += $nlen - $ulen; } } } } if (null === $encoding) { return $s; } return self::iconv('UTF-8', $encoding, $s); } public static function mb_internal_encoding($encoding = null) { if (null === $encoding) { return self::$internalEncoding; } $normalizedEncoding = self::getEncoding($encoding); if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) { self::$internalEncoding = $normalizedEncoding; return true; } if (80000 > \PHP_VERSION_ID) { return false; } throw new \ValueError(\sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding)); } public static function mb_language($lang = null) { if (null === $lang) { return self::$language; } switch ($normalizedLang = strtolower($lang)) { case 'uni': case 'neutral': self::$language = $normalizedLang; return true; } if (80000 > \PHP_VERSION_ID) { return false; } throw new \ValueError(\sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang)); } public static function mb_list_encodings() { return ['UTF-8']; } public static function mb_encoding_aliases($encoding) { switch (strtoupper($encoding)) { case 'UTF8': case 'UTF-8': return ['utf8']; } return false; } public static function mb_check_encoding($var = null, $encoding = null) { if (null === $encoding) { if (null === $var) { return false; } $encoding = self::$internalEncoding; } if (!\is_array($var)) { return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var); } foreach ($var as $key => $value) { if (!self::mb_check_encoding($key, $encoding)) { return false; } if (!self::mb_check_encoding($value, $encoding)) { return false; } } return true; } public static function mb_detect_encoding($str, $encodingList = null, $strict = false) { if (null === $encodingList) { $encodingList = self::$encodingList; } else { if (!\is_array($encodingList)) { $encodingList = array_map('trim', explode(',', $encodingList)); } $encodingList = array_map('strtoupper', $encodingList); } foreach ($encodingList as $enc) { switch ($enc) { case 'ASCII': if (!preg_match('/[\x80-\xFF]/', $str)) { return $enc; } break; case 'UTF8': case 'UTF-8': if (preg_match('//u', $str)) { return 'UTF-8'; } break; default: if (0 === strncmp($enc, 'ISO-8859-', 9)) { return $enc; } } } return false; } public static function mb_detect_order($encodingList = null) { if (null === $encodingList) { return self::$encodingList; } if (!\is_array($encodingList)) { $encodingList = array_map('trim', explode(',', $encodingList)); } $encodingList = array_map('strtoupper', $encodingList); foreach ($encodingList as $enc) { switch ($enc) { default: if (strncmp($enc, 'ISO-8859-', 9)) { return false; } // no break case 'ASCII': case 'UTF8': case 'UTF-8': } } self::$encodingList = $encodingList; return true; } public static function mb_strlen($s, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return \strlen($s); } if (false !== $len = @iconv_strlen($s, $encoding)) { return $len; } if ('UTF-8' !== $encoding) { return $len; } return preg_match_all('/[\x00-\x7F]|[\xC0-\xDF][\x80-\xBF]?|[\xE0-\xEF][\x80-\xBF]{0,2}|[\xF0-\xF7][\x80-\xBF]{0,3}|[\xF8-\xFB][\x80-\xBF]{0,4}|[\xFC-\xFD][\x80-\xBF]{0,5}|[\x80-\xBF\xFE\xFF]/s', $s); } public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return strpos($haystack, $needle, $offset); } $needle = (string) $needle; if ('' === $needle) { if (80000 > \PHP_VERSION_ID) { trigger_error(__METHOD__.': Empty delimiter', \E_USER_WARNING); return false; } return 0; } return iconv_strpos($haystack, $needle, $offset, $encoding); } public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return strrpos($haystack, $needle, $offset); } if ($offset != (int) $offset) { $offset = 0; } elseif ($offset = (int) $offset) { if ($offset < 0) { if (0 > $offset += self::mb_strlen($needle)) { $haystack = self::mb_substr($haystack, 0, $offset, $encoding); } $offset = 0; } else { $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); } } $pos = '' !== $needle || 80000 > \PHP_VERSION_ID ? iconv_strrpos($haystack, $needle, $encoding) : self::mb_strlen($haystack, $encoding); return false !== $pos ? $offset + $pos : false; } public static function mb_str_split($string, $split_length = 1, $encoding = null) { if (null !== $string && !\is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) { trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING); return null; } if (1 > $split_length = (int) $split_length) { if (80000 > \PHP_VERSION_ID) { trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); return false; } throw new \ValueError('Argument #2 ($length) must be greater than 0'); } if (null === $encoding) { $encoding = mb_internal_encoding(); } if ('UTF-8' === $encoding = self::getEncoding($encoding)) { $rx = '/('; while (65535 < $split_length) { $rx .= '.{65535}'; $split_length -= 65535; } $rx .= '.{'.$split_length.'})/us'; return preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); } $result = []; $length = mb_strlen($string, $encoding); for ($i = 0; $i < $length; $i += $split_length) { $result[] = mb_substr($string, $i, $split_length, $encoding); } return $result; } public static function mb_strtolower($s, $encoding = null) { return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding); } public static function mb_strtoupper($s, $encoding = null) { return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding); } public static function mb_substitute_character($c = null) { if (null === $c) { return 'none'; } if (0 === strcasecmp($c, 'none')) { return true; } if (80000 > \PHP_VERSION_ID) { return false; } if (\is_int($c) || 'long' === $c || 'entity' === $c) { return false; } throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint'); } public static function mb_substr($s, $start, $length = null, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return (string) substr($s, $start, null === $length ? 2147483647 : $length); } if ($start < 0) { $start = iconv_strlen($s, $encoding) + $start; if ($start < 0) { $start = 0; } } if (null === $length) { $length = 2147483647; } elseif ($length < 0) { $length = iconv_strlen($s, $encoding) + $length - $start; if ($length < 0) { return ''; } } return (string) iconv_substr($s, $start, $length, $encoding); } public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { [$haystack, $needle] = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], [ self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding), self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding), ]); return self::mb_strpos($haystack, $needle, $offset, $encoding); } public static function mb_stristr($haystack, $needle, $part = false, $encoding = null) { $pos = self::mb_stripos($haystack, $needle, 0, $encoding); return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { $pos = strrpos($haystack, $needle); } else { $needle = self::mb_substr($needle, 0, 1, $encoding); $pos = iconv_strrpos($haystack, $needle, $encoding); } return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null) { $needle = self::mb_substr($needle, 0, 1, $encoding); $pos = self::mb_strripos($haystack, $needle, $encoding); return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { $haystack = self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding); $needle = self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding); $haystack = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $haystack); $needle = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $needle); return self::mb_strrpos($haystack, $needle, $offset, $encoding); } public static function mb_strstr($haystack, $needle, $part = false, $encoding = null) { $pos = strpos($haystack, $needle); if (false === $pos) { return false; } if ($part) { return substr($haystack, 0, $pos); } return substr($haystack, $pos); } public static function mb_get_info($type = 'all') { $info = [ 'internal_encoding' => self::$internalEncoding, 'http_output' => 'pass', 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)', 'func_overload' => 0, 'func_overload_list' => 'no overload', 'mail_charset' => 'UTF-8', 'mail_header_encoding' => 'BASE64', 'mail_body_encoding' => 'BASE64', 'illegal_chars' => 0, 'encoding_translation' => 'Off', 'language' => self::$language, 'detect_order' => self::$encodingList, 'substitute_character' => 'none', 'strict_detection' => 'Off', ]; if ('all' === $type) { return $info; } if (isset($info[$type])) { return $info[$type]; } return false; } public static function mb_http_input($type = '') { return false; } public static function mb_http_output($encoding = null) { return null !== $encoding ? 'pass' === $encoding : 'pass'; } public static function mb_strwidth($s, $encoding = null) { $encoding = self::getEncoding($encoding); if ('UTF-8' !== $encoding) { $s = self::iconv($encoding, 'UTF-8', $s); } $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); return ($wide << 1) + iconv_strlen($s, 'UTF-8'); } public static function mb_substr_count($haystack, $needle, $encoding = null) { return substr_count($haystack, $needle); } public static function mb_output_handler($contents, $status) { return $contents; } public static function mb_chr($code, $encoding = null) { if (0x80 > $code %= 0x200000) { $s = \chr($code); } elseif (0x800 > $code) { $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); } elseif (0x10000 > $code) { $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); } else { $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); } if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { $s = mb_convert_encoding($s, $encoding, 'UTF-8'); } return $s; } public static function mb_ord($s, $encoding = null) { if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { $s = mb_convert_encoding($s, 'UTF-8', $encoding); } if (1 === \strlen($s)) { return \ord($s); } $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; if (0xF0 <= $code) { return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; } if (0xE0 <= $code) { return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; } if (0xC0 <= $code) { return (($code - 0xC0) << 6) + $s[2] - 0x80; } return $code; } /** @return string|false */ public static function mb_scrub(?string $string, ?string $encoding = null): string { if (null === $encoding) { $encoding = self::mb_internal_encoding(); } elseif (!self::assertEncoding($encoding, 'mb_scrub(): Argument #2 ($encoding) must be a valid encoding, "%s" given')) { return false; } return self::mb_convert_encoding((string) $string, $encoding, $encoding); } /** @return string|false */ public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null) { if (null === $encoding) { $encoding = self::mb_internal_encoding(); } elseif (!self::assertEncoding($encoding, 'mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given')) { return false; } if (self::mb_strlen($pad_string, $encoding) <= 0) { if (\PHP_VERSION_ID < 80000) { trigger_error('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string', \E_USER_WARNING); return false; } throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string'); } if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) { if (\PHP_VERSION_ID < 80000) { trigger_error('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH', \E_USER_WARNING); return false; } throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH'); } $paddingRequired = $length - self::mb_strlen($string, $encoding); if ($paddingRequired < 1) { return $string; } switch ($pad_type) { case \STR_PAD_LEFT: return self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string; case \STR_PAD_RIGHT: return $string.self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding); default: $leftPaddingLength = floor($paddingRequired / 2); $rightPaddingLength = $paddingRequired - $leftPaddingLength; return self::mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.self::mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding); } } /** @return string|false */ public static function mb_ucfirst(string $string, ?string $encoding = null) { if (null === $encoding) { $encoding = self::mb_internal_encoding(); } elseif (!self::assertEncoding($encoding, 'mb_ucfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given')) { return false; } $firstChar = mb_substr($string, 0, 1, $encoding); $firstChar = mb_convert_case($firstChar, \MB_CASE_TITLE, $encoding); return $firstChar.mb_substr($string, 1, null, $encoding); } /** @return string|false */ public static function mb_lcfirst(string $string, ?string $encoding = null) { if (null === $encoding) { $encoding = self::mb_internal_encoding(); } elseif (!self::assertEncoding($encoding, 'mb_lcfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given')) { return false; } $firstChar = mb_substr($string, 0, 1, $encoding); $firstChar = mb_convert_case($firstChar, \MB_CASE_LOWER, $encoding); return $firstChar.mb_substr($string, 1, null, $encoding); } /** @return string|false */ public static function mb_trim(string $string, ?string $characters = null, ?string $encoding = null) { return self::mb_internal_trim('{^[%s]+|[%1$s]+$}Du', $string, $characters, $encoding, __FUNCTION__); } /** @return string|false */ public static function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null) { return self::mb_internal_trim('{^[%s]+}Du', $string, $characters, $encoding, __FUNCTION__); } /** @return string|false */ public static function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null) { return self::mb_internal_trim('{[%s]+$}Du', $string, $characters, $encoding, __FUNCTION__); } private static function getSubpart($pos, $part, $haystack, $encoding) { if (false === $pos) { return false; } if ($part) { return self::mb_substr($haystack, 0, $pos, $encoding); } return self::mb_substr($haystack, $pos, null, $encoding); } private static function html_encoding_callback(array $m) { $i = 1; $entities = ''; $m = unpack('C*', htmlentities($m[0], \ENT_COMPAT, 'UTF-8')); while (isset($m[$i])) { if (0x80 > $m[$i]) { $entities .= \chr($m[$i++]); continue; } if (0xF0 <= $m[$i]) { $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; } elseif (0xE0 <= $m[$i]) { $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; } else { $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80; } $entities .= '&#'.$c.';'; } return $entities; } private static function title_case(array $s) { return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8'); } private static function getData($file) { if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { return require $file; } return false; } private static function getEncoding($encoding) { if (null === $encoding) { return self::$internalEncoding; } if ('UTF-8' === $encoding) { return 'UTF-8'; } $encoding = strtoupper($encoding); if ('8BIT' === $encoding || 'BINARY' === $encoding) { return 'CP850'; } if ('UTF8' === $encoding) { return 'UTF-8'; } if ('UTF-32' === $encoding) { return 'UTF-32BE'; } if ('UTF-16' === $encoding) { return 'UTF-16BE'; } return $encoding; } private static function iconv($fromEncoding, $toEncoding, $s) { if (null === self::$iconvSupportsIgnore) { self::$iconvSupportsIgnore = false !== @iconv('UTF-8', 'UTF-8//IGNORE', ''); } return self::$iconvSupportsIgnore ? iconv($fromEncoding, $toEncoding.'//IGNORE', $s) : iconv($fromEncoding, $toEncoding, $s); } /** @return string|false */ private static function mb_internal_trim(string $regex, string $string, ?string $characters, ?string $encoding, string $function) { if (null === $encoding) { $encoding = self::mb_internal_encoding(); } elseif (!self::assertEncoding($encoding, $function.'(): Argument #3 ($encoding) must be a valid encoding, "%s" given')) { return false; } if ('' === $characters) { return null === $encoding ? $string : self::mb_convert_encoding($string, $encoding); } if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $string)) { $string = @self::iconv('UTF-8', 'UTF-8', $string); } if (null !== $characters && !preg_match('//u', $characters)) { $characters = @self::iconv('UTF-8', 'UTF-8', $characters); } } else { $string = self::iconv($encoding, 'UTF-8', $string); if (null !== $characters) { $characters = self::iconv($encoding, 'UTF-8', $characters); } } if (null === $characters) { $characters = "\\0 \f\n\r\t\v\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{205F}\u{3000}\u{0085}\u{180E}"; } else { $characters = preg_quote($characters); } $string = preg_replace(\sprintf($regex, $characters), '', $string); if (null === $encoding) { return $string; } return self::iconv('UTF-8', $encoding, $string); } private static function assertEncoding(string $encoding, string $errorFormat): bool { try { $validEncoding = @self::mb_check_encoding('', $encoding); } catch (\ValueError $e) { throw new \ValueError(\sprintf($errorFormat, $encoding)); } if (!$validEncoding) { if (80000 > \PHP_VERSION_ID) { trigger_error(\sprintf($errorFormat, $encoding), \E_USER_WARNING); } else { throw new \ValueError(\sprintf($errorFormat, $encoding)); } } return $validEncoding; } } PKCA#]�w*9'9'Esystem/helixultimate/vendor/symfony/polyfill-mbstring/bootstrap80.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Mbstring as p; if (!function_exists('mb_convert_encoding')) { function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null): array|string|false { return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); } } if (!function_exists('mb_decode_mimeheader')) { function mb_decode_mimeheader(?string $string): string { return p\Mbstring::mb_decode_mimeheader((string) $string); } } if (!function_exists('mb_encode_mimeheader')) { function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0): string { return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); } } if (!function_exists('mb_decode_numericentity')) { function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); } } if (!function_exists('mb_encode_numericentity')) { function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = false): string { return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); } } if (!function_exists('mb_convert_case')) { function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); } } if (!function_exists('mb_internal_encoding')) { function mb_internal_encoding(?string $encoding = null): string|bool { return p\Mbstring::mb_internal_encoding($encoding); } } if (!function_exists('mb_language')) { function mb_language(?string $language = null): string|bool { return p\Mbstring::mb_language($language); } } if (!function_exists('mb_list_encodings')) { function mb_list_encodings(): array { return p\Mbstring::mb_list_encodings(); } } if (!function_exists('mb_encoding_aliases')) { function mb_encoding_aliases(?string $encoding): array { return p\Mbstring::mb_encoding_aliases((string) $encoding); } } if (!function_exists('mb_check_encoding')) { function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\Mbstring::mb_check_encoding($value, $encoding); } } if (!function_exists('mb_detect_encoding')) { function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = false): string|false { return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); } } if (!function_exists('mb_detect_order')) { function mb_detect_order(array|string|null $encoding = null): array|bool { return p\Mbstring::mb_detect_order($encoding); } } if (!function_exists('mb_parse_str')) { function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; } } if (!function_exists('mb_strlen')) { function mb_strlen(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strlen((string) $string, $encoding); } } if (!function_exists('mb_strpos')) { function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!function_exists('mb_strtolower')) { function mb_strtolower(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtolower((string) $string, $encoding); } } if (!function_exists('mb_strtoupper')) { function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtoupper((string) $string, $encoding); } } if (!function_exists('mb_substitute_character')) { function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\Mbstring::mb_substitute_character($substitute_character); } } if (!function_exists('mb_substr')) { function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null): string { return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); } } if (!function_exists('mb_stripos')) { function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!function_exists('mb_stristr')) { function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!function_exists('mb_strrchr')) { function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!function_exists('mb_strrichr')) { function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!function_exists('mb_strripos')) { function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!function_exists('mb_strrpos')) { function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!function_exists('mb_strstr')) { function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!function_exists('mb_get_info')) { function mb_get_info(?string $type = 'all'): array|string|int|false|null { return p\Mbstring::mb_get_info((string) $type); } } if (!function_exists('mb_http_output')) { function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); } } if (!function_exists('mb_strwidth')) { function mb_strwidth(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strwidth((string) $string, $encoding); } } if (!function_exists('mb_substr_count')) { function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); } } if (!function_exists('mb_output_handler')) { function mb_output_handler(?string $string, ?int $status): string { return p\Mbstring::mb_output_handler((string) $string, (int) $status); } } if (!function_exists('mb_http_input')) { function mb_http_input(?string $type = null): array|string|false { return p\Mbstring::mb_http_input($type); } } if (!function_exists('mb_convert_variables')) { function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars): string|false { return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); } } if (!function_exists('mb_ord')) { function mb_ord(?string $string, ?string $encoding = null): int|false { return p\Mbstring::mb_ord((string) $string, $encoding); } } if (!function_exists('mb_chr')) { function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); } } if (!function_exists('mb_scrub')) { function mb_scrub(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_scrub($string, $encoding); } } if (!function_exists('mb_str_split')) { function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); } } if (!function_exists('mb_str_pad')) { function mb_str_pad(?string $string, ?int $length, ?string $pad_string = ' ', ?int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad((string) $string, (int) $length, (string) $pad_string, (int) $pad_type, $encoding); } } if (!function_exists('mb_ucfirst')) { function mb_ucfirst(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst((string) $string, $encoding); } } if (!function_exists('mb_lcfirst')) { function mb_lcfirst(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst((string) $string, $encoding); } } if (!function_exists('mb_trim')) { function mb_trim(?string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_trim((string) $string, $characters, $encoding); } } if (!function_exists('mb_ltrim')) { function mb_ltrim(?string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_ltrim((string) $string, $characters, $encoding); } } if (!function_exists('mb_rtrim')) { function mb_rtrim(?string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_rtrim((string) $string, $characters, $encoding); } } if (extension_loaded('mbstring')) { return; } if (!defined('MB_CASE_UPPER')) { define('MB_CASE_UPPER', 0); } if (!defined('MB_CASE_LOWER')) { define('MB_CASE_LOWER', 1); } if (!defined('MB_CASE_TITLE')) { define('MB_CASE_TITLE', 2); } PKCA#]���d�_�_Usystem/helixultimate/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.phpnu�[���<?php return array ( 'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', 'À' => 'à', 'Á' => 'á', 'Â' => 'â', 'Ã' => 'ã', 'Ä' => 'ä', 'Å' => 'å', 'Æ' => 'æ', 'Ç' => 'ç', 'È' => 'è', 'É' => 'é', 'Ê' => 'ê', 'Ë' => 'ë', 'Ì' => 'ì', 'Í' => 'í', 'Î' => 'î', 'Ï' => 'ï', 'Ð' => 'ð', 'Ñ' => 'ñ', 'Ò' => 'ò', 'Ó' => 'ó', 'Ô' => 'ô', 'Õ' => 'õ', 'Ö' => 'ö', 'Ø' => 'ø', 'Ù' => 'ù', 'Ú' => 'ú', 'Û' => 'û', 'Ü' => 'ü', 'Ý' => 'ý', 'Þ' => 'þ', 'Ā' => 'ā', 'Ă' => 'ă', 'Ą' => 'ą', 'Ć' => 'ć', 'Ĉ' => 'ĉ', 'Ċ' => 'ċ', 'Č' => 'č', 'Ď' => 'ď', 'Đ' => 'đ', 'Ē' => 'ē', 'Ĕ' => 'ĕ', 'Ė' => 'ė', 'Ę' => 'ę', 'Ě' => 'ě', 'Ĝ' => 'ĝ', 'Ğ' => 'ğ', 'Ġ' => 'ġ', 'Ģ' => 'ģ', 'Ĥ' => 'ĥ', 'Ħ' => 'ħ', 'Ĩ' => 'ĩ', 'Ī' => 'ī', 'Ĭ' => 'ĭ', 'Į' => 'į', 'İ' => 'i̇', 'IJ' => 'ij', 'Ĵ' => 'ĵ', 'Ķ' => 'ķ', 'Ĺ' => 'ĺ', 'Ļ' => 'ļ', 'Ľ' => 'ľ', 'Ŀ' => 'ŀ', 'Ł' => 'ł', 'Ń' => 'ń', 'Ņ' => 'ņ', 'Ň' => 'ň', 'Ŋ' => 'ŋ', 'Ō' => 'ō', 'Ŏ' => 'ŏ', 'Ő' => 'ő', 'Œ' => 'œ', 'Ŕ' => 'ŕ', 'Ŗ' => 'ŗ', 'Ř' => 'ř', 'Ś' => 'ś', 'Ŝ' => 'ŝ', 'Ş' => 'ş', 'Š' => 'š', 'Ţ' => 'ţ', 'Ť' => 'ť', 'Ŧ' => 'ŧ', 'Ũ' => 'ũ', 'Ū' => 'ū', 'Ŭ' => 'ŭ', 'Ů' => 'ů', 'Ű' => 'ű', 'Ų' => 'ų', 'Ŵ' => 'ŵ', 'Ŷ' => 'ŷ', 'Ÿ' => 'ÿ', 'Ź' => 'ź', 'Ż' => 'ż', 'Ž' => 'ž', 'Ɓ' => 'ɓ', 'Ƃ' => 'ƃ', 'Ƅ' => 'ƅ', 'Ɔ' => 'ɔ', 'Ƈ' => 'ƈ', 'Ɖ' => 'ɖ', 'Ɗ' => 'ɗ', 'Ƌ' => 'ƌ', 'Ǝ' => 'ǝ', 'Ə' => 'ə', 'Ɛ' => 'ɛ', 'Ƒ' => 'ƒ', 'Ɠ' => 'ɠ', 'Ɣ' => 'ɣ', 'Ɩ' => 'ɩ', 'Ɨ' => 'ɨ', 'Ƙ' => 'ƙ', 'Ɯ' => 'ɯ', 'Ɲ' => 'ɲ', 'Ɵ' => 'ɵ', 'Ơ' => 'ơ', 'Ƣ' => 'ƣ', 'Ƥ' => 'ƥ', 'Ʀ' => 'ʀ', 'Ƨ' => 'ƨ', 'Ʃ' => 'ʃ', 'Ƭ' => 'ƭ', 'Ʈ' => 'ʈ', 'Ư' => 'ư', 'Ʊ' => 'ʊ', 'Ʋ' => 'ʋ', 'Ƴ' => 'ƴ', 'Ƶ' => 'ƶ', 'Ʒ' => 'ʒ', 'Ƹ' => 'ƹ', 'Ƽ' => 'ƽ', 'DŽ' => 'dž', 'Dž' => 'dž', 'LJ' => 'lj', 'Lj' => 'lj', 'NJ' => 'nj', 'Nj' => 'nj', 'Ǎ' => 'ǎ', 'Ǐ' => 'ǐ', 'Ǒ' => 'ǒ', 'Ǔ' => 'ǔ', 'Ǖ' => 'ǖ', 'Ǘ' => 'ǘ', 'Ǚ' => 'ǚ', 'Ǜ' => 'ǜ', 'Ǟ' => 'ǟ', 'Ǡ' => 'ǡ', 'Ǣ' => 'ǣ', 'Ǥ' => 'ǥ', 'Ǧ' => 'ǧ', 'Ǩ' => 'ǩ', 'Ǫ' => 'ǫ', 'Ǭ' => 'ǭ', 'Ǯ' => 'ǯ', 'DZ' => 'dz', 'Dz' => 'dz', 'Ǵ' => 'ǵ', 'Ƕ' => 'ƕ', 'Ƿ' => 'ƿ', 'Ǹ' => 'ǹ', 'Ǻ' => 'ǻ', 'Ǽ' => 'ǽ', 'Ǿ' => 'ǿ', 'Ȁ' => 'ȁ', 'Ȃ' => 'ȃ', 'Ȅ' => 'ȅ', 'Ȇ' => 'ȇ', 'Ȉ' => 'ȉ', 'Ȋ' => 'ȋ', 'Ȍ' => 'ȍ', 'Ȏ' => 'ȏ', 'Ȑ' => 'ȑ', 'Ȓ' => 'ȓ', 'Ȕ' => 'ȕ', 'Ȗ' => 'ȗ', 'Ș' => 'ș', 'Ț' => 'ț', 'Ȝ' => 'ȝ', 'Ȟ' => 'ȟ', 'Ƞ' => 'ƞ', 'Ȣ' => 'ȣ', 'Ȥ' => 'ȥ', 'Ȧ' => 'ȧ', 'Ȩ' => 'ȩ', 'Ȫ' => 'ȫ', 'Ȭ' => 'ȭ', 'Ȯ' => 'ȯ', 'Ȱ' => 'ȱ', 'Ȳ' => 'ȳ', 'Ⱥ' => 'ⱥ', 'Ȼ' => 'ȼ', 'Ƚ' => 'ƚ', 'Ⱦ' => 'ⱦ', 'Ɂ' => 'ɂ', 'Ƀ' => 'ƀ', 'Ʉ' => 'ʉ', 'Ʌ' => 'ʌ', 'Ɇ' => 'ɇ', 'Ɉ' => 'ɉ', 'Ɋ' => 'ɋ', 'Ɍ' => 'ɍ', 'Ɏ' => 'ɏ', 'Ͱ' => 'ͱ', 'Ͳ' => 'ͳ', 'Ͷ' => 'ͷ', 'Ϳ' => 'ϳ', 'Ά' => 'ά', 'Έ' => 'έ', 'Ή' => 'ή', 'Ί' => 'ί', 'Ό' => 'ό', 'Ύ' => 'ύ', 'Ώ' => 'ώ', 'Α' => 'α', 'Β' => 'β', 'Γ' => 'γ', 'Δ' => 'δ', 'Ε' => 'ε', 'Ζ' => 'ζ', 'Η' => 'η', 'Θ' => 'θ', 'Ι' => 'ι', 'Κ' => 'κ', 'Λ' => 'λ', 'Μ' => 'μ', 'Ν' => 'ν', 'Ξ' => 'ξ', 'Ο' => 'ο', 'Π' => 'π', 'Ρ' => 'ρ', 'Σ' => 'σ', 'Τ' => 'τ', 'Υ' => 'υ', 'Φ' => 'φ', 'Χ' => 'χ', 'Ψ' => 'ψ', 'Ω' => 'ω', 'Ϊ' => 'ϊ', 'Ϋ' => 'ϋ', 'Ϗ' => 'ϗ', 'Ϙ' => 'ϙ', 'Ϛ' => 'ϛ', 'Ϝ' => 'ϝ', 'Ϟ' => 'ϟ', 'Ϡ' => 'ϡ', 'Ϣ' => 'ϣ', 'Ϥ' => 'ϥ', 'Ϧ' => 'ϧ', 'Ϩ' => 'ϩ', 'Ϫ' => 'ϫ', 'Ϭ' => 'ϭ', 'Ϯ' => 'ϯ', 'ϴ' => 'θ', 'Ϸ' => 'ϸ', 'Ϲ' => 'ϲ', 'Ϻ' => 'ϻ', 'Ͻ' => 'ͻ', 'Ͼ' => 'ͼ', 'Ͽ' => 'ͽ', 'Ѐ' => 'ѐ', 'Ё' => 'ё', 'Ђ' => 'ђ', 'Ѓ' => 'ѓ', 'Є' => 'є', 'Ѕ' => 'ѕ', 'І' => 'і', 'Ї' => 'ї', 'Ј' => 'ј', 'Љ' => 'љ', 'Њ' => 'њ', 'Ћ' => 'ћ', 'Ќ' => 'ќ', 'Ѝ' => 'ѝ', 'Ў' => 'ў', 'Џ' => 'џ', 'А' => 'а', 'Б' => 'б', 'В' => 'в', 'Г' => 'г', 'Д' => 'д', 'Е' => 'е', 'Ж' => 'ж', 'З' => 'з', 'И' => 'и', 'Й' => 'й', 'К' => 'к', 'Л' => 'л', 'М' => 'м', 'Н' => 'н', 'О' => 'о', 'П' => 'п', 'Р' => 'р', 'С' => 'с', 'Т' => 'т', 'У' => 'у', 'Ф' => 'ф', 'Х' => 'х', 'Ц' => 'ц', 'Ч' => 'ч', 'Ш' => 'ш', 'Щ' => 'щ', 'Ъ' => 'ъ', 'Ы' => 'ы', 'Ь' => 'ь', 'Э' => 'э', 'Ю' => 'ю', 'Я' => 'я', 'Ѡ' => 'ѡ', 'Ѣ' => 'ѣ', 'Ѥ' => 'ѥ', 'Ѧ' => 'ѧ', 'Ѩ' => 'ѩ', 'Ѫ' => 'ѫ', 'Ѭ' => 'ѭ', 'Ѯ' => 'ѯ', 'Ѱ' => 'ѱ', 'Ѳ' => 'ѳ', 'Ѵ' => 'ѵ', 'Ѷ' => 'ѷ', 'Ѹ' => 'ѹ', 'Ѻ' => 'ѻ', 'Ѽ' => 'ѽ', 'Ѿ' => 'ѿ', 'Ҁ' => 'ҁ', 'Ҋ' => 'ҋ', 'Ҍ' => 'ҍ', 'Ҏ' => 'ҏ', 'Ґ' => 'ґ', 'Ғ' => 'ғ', 'Ҕ' => 'ҕ', 'Җ' => 'җ', 'Ҙ' => 'ҙ', 'Қ' => 'қ', 'Ҝ' => 'ҝ', 'Ҟ' => 'ҟ', 'Ҡ' => 'ҡ', 'Ң' => 'ң', 'Ҥ' => 'ҥ', 'Ҧ' => 'ҧ', 'Ҩ' => 'ҩ', 'Ҫ' => 'ҫ', 'Ҭ' => 'ҭ', 'Ү' => 'ү', 'Ұ' => 'ұ', 'Ҳ' => 'ҳ', 'Ҵ' => 'ҵ', 'Ҷ' => 'ҷ', 'Ҹ' => 'ҹ', 'Һ' => 'һ', 'Ҽ' => 'ҽ', 'Ҿ' => 'ҿ', 'Ӏ' => 'ӏ', 'Ӂ' => 'ӂ', 'Ӄ' => 'ӄ', 'Ӆ' => 'ӆ', 'Ӈ' => 'ӈ', 'Ӊ' => 'ӊ', 'Ӌ' => 'ӌ', 'Ӎ' => 'ӎ', 'Ӑ' => 'ӑ', 'Ӓ' => 'ӓ', 'Ӕ' => 'ӕ', 'Ӗ' => 'ӗ', 'Ә' => 'ә', 'Ӛ' => 'ӛ', 'Ӝ' => 'ӝ', 'Ӟ' => 'ӟ', 'Ӡ' => 'ӡ', 'Ӣ' => 'ӣ', 'Ӥ' => 'ӥ', 'Ӧ' => 'ӧ', 'Ө' => 'ө', 'Ӫ' => 'ӫ', 'Ӭ' => 'ӭ', 'Ӯ' => 'ӯ', 'Ӱ' => 'ӱ', 'Ӳ' => 'ӳ', 'Ӵ' => 'ӵ', 'Ӷ' => 'ӷ', 'Ӹ' => 'ӹ', 'Ӻ' => 'ӻ', 'Ӽ' => 'ӽ', 'Ӿ' => 'ӿ', 'Ԁ' => 'ԁ', 'Ԃ' => 'ԃ', 'Ԅ' => 'ԅ', 'Ԇ' => 'ԇ', 'Ԉ' => 'ԉ', 'Ԋ' => 'ԋ', 'Ԍ' => 'ԍ', 'Ԏ' => 'ԏ', 'Ԑ' => 'ԑ', 'Ԓ' => 'ԓ', 'Ԕ' => 'ԕ', 'Ԗ' => 'ԗ', 'Ԙ' => 'ԙ', 'Ԛ' => 'ԛ', 'Ԝ' => 'ԝ', 'Ԟ' => 'ԟ', 'Ԡ' => 'ԡ', 'Ԣ' => 'ԣ', 'Ԥ' => 'ԥ', 'Ԧ' => 'ԧ', 'Ԩ' => 'ԩ', 'Ԫ' => 'ԫ', 'Ԭ' => 'ԭ', 'Ԯ' => 'ԯ', 'Ա' => 'ա', 'Բ' => 'բ', 'Գ' => 'գ', 'Դ' => 'դ', 'Ե' => 'ե', 'Զ' => 'զ', 'Է' => 'է', 'Ը' => 'ը', 'Թ' => 'թ', 'Ժ' => 'ժ', 'Ի' => 'ի', 'Լ' => 'լ', 'Խ' => 'խ', 'Ծ' => 'ծ', 'Կ' => 'կ', 'Հ' => 'հ', 'Ձ' => 'ձ', 'Ղ' => 'ղ', 'Ճ' => 'ճ', 'Մ' => 'մ', 'Յ' => 'յ', 'Ն' => 'ն', 'Շ' => 'շ', 'Ո' => 'ո', 'Չ' => 'չ', 'Պ' => 'պ', 'Ջ' => 'ջ', 'Ռ' => 'ռ', 'Ս' => 'ս', 'Վ' => 'վ', 'Տ' => 'տ', 'Ր' => 'ր', 'Ց' => 'ց', 'Ւ' => 'ւ', 'Փ' => 'փ', 'Ք' => 'ք', 'Օ' => 'օ', 'Ֆ' => 'ֆ', 'Ⴀ' => 'ⴀ', 'Ⴁ' => 'ⴁ', 'Ⴂ' => 'ⴂ', 'Ⴃ' => 'ⴃ', 'Ⴄ' => 'ⴄ', 'Ⴅ' => 'ⴅ', 'Ⴆ' => 'ⴆ', 'Ⴇ' => 'ⴇ', 'Ⴈ' => 'ⴈ', 'Ⴉ' => 'ⴉ', 'Ⴊ' => 'ⴊ', 'Ⴋ' => 'ⴋ', 'Ⴌ' => 'ⴌ', 'Ⴍ' => 'ⴍ', 'Ⴎ' => 'ⴎ', 'Ⴏ' => 'ⴏ', 'Ⴐ' => 'ⴐ', 'Ⴑ' => 'ⴑ', 'Ⴒ' => 'ⴒ', 'Ⴓ' => 'ⴓ', 'Ⴔ' => 'ⴔ', 'Ⴕ' => 'ⴕ', 'Ⴖ' => 'ⴖ', 'Ⴗ' => 'ⴗ', 'Ⴘ' => 'ⴘ', 'Ⴙ' => 'ⴙ', 'Ⴚ' => 'ⴚ', 'Ⴛ' => 'ⴛ', 'Ⴜ' => 'ⴜ', 'Ⴝ' => 'ⴝ', 'Ⴞ' => 'ⴞ', 'Ⴟ' => 'ⴟ', 'Ⴠ' => 'ⴠ', 'Ⴡ' => 'ⴡ', 'Ⴢ' => 'ⴢ', 'Ⴣ' => 'ⴣ', 'Ⴤ' => 'ⴤ', 'Ⴥ' => 'ⴥ', 'Ⴧ' => 'ⴧ', 'Ⴭ' => 'ⴭ', 'Ꭰ' => 'ꭰ', 'Ꭱ' => 'ꭱ', 'Ꭲ' => 'ꭲ', 'Ꭳ' => 'ꭳ', 'Ꭴ' => 'ꭴ', 'Ꭵ' => 'ꭵ', 'Ꭶ' => 'ꭶ', 'Ꭷ' => 'ꭷ', 'Ꭸ' => 'ꭸ', 'Ꭹ' => 'ꭹ', 'Ꭺ' => 'ꭺ', 'Ꭻ' => 'ꭻ', 'Ꭼ' => 'ꭼ', 'Ꭽ' => 'ꭽ', 'Ꭾ' => 'ꭾ', 'Ꭿ' => 'ꭿ', 'Ꮀ' => 'ꮀ', 'Ꮁ' => 'ꮁ', 'Ꮂ' => 'ꮂ', 'Ꮃ' => 'ꮃ', 'Ꮄ' => 'ꮄ', 'Ꮅ' => 'ꮅ', 'Ꮆ' => 'ꮆ', 'Ꮇ' => 'ꮇ', 'Ꮈ' => 'ꮈ', 'Ꮉ' => 'ꮉ', 'Ꮊ' => 'ꮊ', 'Ꮋ' => 'ꮋ', 'Ꮌ' => 'ꮌ', 'Ꮍ' => 'ꮍ', 'Ꮎ' => 'ꮎ', 'Ꮏ' => 'ꮏ', 'Ꮐ' => 'ꮐ', 'Ꮑ' => 'ꮑ', 'Ꮒ' => 'ꮒ', 'Ꮓ' => 'ꮓ', 'Ꮔ' => 'ꮔ', 'Ꮕ' => 'ꮕ', 'Ꮖ' => 'ꮖ', 'Ꮗ' => 'ꮗ', 'Ꮘ' => 'ꮘ', 'Ꮙ' => 'ꮙ', 'Ꮚ' => 'ꮚ', 'Ꮛ' => 'ꮛ', 'Ꮜ' => 'ꮜ', 'Ꮝ' => 'ꮝ', 'Ꮞ' => 'ꮞ', 'Ꮟ' => 'ꮟ', 'Ꮠ' => 'ꮠ', 'Ꮡ' => 'ꮡ', 'Ꮢ' => 'ꮢ', 'Ꮣ' => 'ꮣ', 'Ꮤ' => 'ꮤ', 'Ꮥ' => 'ꮥ', 'Ꮦ' => 'ꮦ', 'Ꮧ' => 'ꮧ', 'Ꮨ' => 'ꮨ', 'Ꮩ' => 'ꮩ', 'Ꮪ' => 'ꮪ', 'Ꮫ' => 'ꮫ', 'Ꮬ' => 'ꮬ', 'Ꮭ' => 'ꮭ', 'Ꮮ' => 'ꮮ', 'Ꮯ' => 'ꮯ', 'Ꮰ' => 'ꮰ', 'Ꮱ' => 'ꮱ', 'Ꮲ' => 'ꮲ', 'Ꮳ' => 'ꮳ', 'Ꮴ' => 'ꮴ', 'Ꮵ' => 'ꮵ', 'Ꮶ' => 'ꮶ', 'Ꮷ' => 'ꮷ', 'Ꮸ' => 'ꮸ', 'Ꮹ' => 'ꮹ', 'Ꮺ' => 'ꮺ', 'Ꮻ' => 'ꮻ', 'Ꮼ' => 'ꮼ', 'Ꮽ' => 'ꮽ', 'Ꮾ' => 'ꮾ', 'Ꮿ' => 'ꮿ', 'Ᏸ' => 'ᏸ', 'Ᏹ' => 'ᏹ', 'Ᏺ' => 'ᏺ', 'Ᏻ' => 'ᏻ', 'Ᏼ' => 'ᏼ', 'Ᏽ' => 'ᏽ', 'Ა' => 'ა', 'Ბ' => 'ბ', 'Გ' => 'გ', 'Დ' => 'დ', 'Ე' => 'ე', 'Ვ' => 'ვ', 'Ზ' => 'ზ', 'Თ' => 'თ', 'Ი' => 'ი', 'Კ' => 'კ', 'Ლ' => 'ლ', 'Მ' => 'მ', 'Ნ' => 'ნ', 'Ო' => 'ო', 'Პ' => 'პ', 'Ჟ' => 'ჟ', 'Რ' => 'რ', 'Ს' => 'ს', 'Ტ' => 'ტ', 'Უ' => 'უ', 'Ფ' => 'ფ', 'Ქ' => 'ქ', 'Ღ' => 'ღ', 'Ყ' => 'ყ', 'Შ' => 'შ', 'Ჩ' => 'ჩ', 'Ც' => 'ც', 'Ძ' => 'ძ', 'Წ' => 'წ', 'Ჭ' => 'ჭ', 'Ხ' => 'ხ', 'Ჯ' => 'ჯ', 'Ჰ' => 'ჰ', 'Ჱ' => 'ჱ', 'Ჲ' => 'ჲ', 'Ჳ' => 'ჳ', 'Ჴ' => 'ჴ', 'Ჵ' => 'ჵ', 'Ჶ' => 'ჶ', 'Ჷ' => 'ჷ', 'Ჸ' => 'ჸ', 'Ჹ' => 'ჹ', 'Ჺ' => 'ჺ', 'Ჽ' => 'ჽ', 'Ჾ' => 'ჾ', 'Ჿ' => 'ჿ', 'Ḁ' => 'ḁ', 'Ḃ' => 'ḃ', 'Ḅ' => 'ḅ', 'Ḇ' => 'ḇ', 'Ḉ' => 'ḉ', 'Ḋ' => 'ḋ', 'Ḍ' => 'ḍ', 'Ḏ' => 'ḏ', 'Ḑ' => 'ḑ', 'Ḓ' => 'ḓ', 'Ḕ' => 'ḕ', 'Ḗ' => 'ḗ', 'Ḙ' => 'ḙ', 'Ḛ' => 'ḛ', 'Ḝ' => 'ḝ', 'Ḟ' => 'ḟ', 'Ḡ' => 'ḡ', 'Ḣ' => 'ḣ', 'Ḥ' => 'ḥ', 'Ḧ' => 'ḧ', 'Ḩ' => 'ḩ', 'Ḫ' => 'ḫ', 'Ḭ' => 'ḭ', 'Ḯ' => 'ḯ', 'Ḱ' => 'ḱ', 'Ḳ' => 'ḳ', 'Ḵ' => 'ḵ', 'Ḷ' => 'ḷ', 'Ḹ' => 'ḹ', 'Ḻ' => 'ḻ', 'Ḽ' => 'ḽ', 'Ḿ' => 'ḿ', 'Ṁ' => 'ṁ', 'Ṃ' => 'ṃ', 'Ṅ' => 'ṅ', 'Ṇ' => 'ṇ', 'Ṉ' => 'ṉ', 'Ṋ' => 'ṋ', 'Ṍ' => 'ṍ', 'Ṏ' => 'ṏ', 'Ṑ' => 'ṑ', 'Ṓ' => 'ṓ', 'Ṕ' => 'ṕ', 'Ṗ' => 'ṗ', 'Ṙ' => 'ṙ', 'Ṛ' => 'ṛ', 'Ṝ' => 'ṝ', 'Ṟ' => 'ṟ', 'Ṡ' => 'ṡ', 'Ṣ' => 'ṣ', 'Ṥ' => 'ṥ', 'Ṧ' => 'ṧ', 'Ṩ' => 'ṩ', 'Ṫ' => 'ṫ', 'Ṭ' => 'ṭ', 'Ṯ' => 'ṯ', 'Ṱ' => 'ṱ', 'Ṳ' => 'ṳ', 'Ṵ' => 'ṵ', 'Ṷ' => 'ṷ', 'Ṹ' => 'ṹ', 'Ṻ' => 'ṻ', 'Ṽ' => 'ṽ', 'Ṿ' => 'ṿ', 'Ẁ' => 'ẁ', 'Ẃ' => 'ẃ', 'Ẅ' => 'ẅ', 'Ẇ' => 'ẇ', 'Ẉ' => 'ẉ', 'Ẋ' => 'ẋ', 'Ẍ' => 'ẍ', 'Ẏ' => 'ẏ', 'Ẑ' => 'ẑ', 'Ẓ' => 'ẓ', 'Ẕ' => 'ẕ', 'ẞ' => 'ß', 'Ạ' => 'ạ', 'Ả' => 'ả', 'Ấ' => 'ấ', 'Ầ' => 'ầ', 'Ẩ' => 'ẩ', 'Ẫ' => 'ẫ', 'Ậ' => 'ậ', 'Ắ' => 'ắ', 'Ằ' => 'ằ', 'Ẳ' => 'ẳ', 'Ẵ' => 'ẵ', 'Ặ' => 'ặ', 'Ẹ' => 'ẹ', 'Ẻ' => 'ẻ', 'Ẽ' => 'ẽ', 'Ế' => 'ế', 'Ề' => 'ề', 'Ể' => 'ể', 'Ễ' => 'ễ', 'Ệ' => 'ệ', 'Ỉ' => 'ỉ', 'Ị' => 'ị', 'Ọ' => 'ọ', 'Ỏ' => 'ỏ', 'Ố' => 'ố', 'Ồ' => 'ồ', 'Ổ' => 'ổ', 'Ỗ' => 'ỗ', 'Ộ' => 'ộ', 'Ớ' => 'ớ', 'Ờ' => 'ờ', 'Ở' => 'ở', 'Ỡ' => 'ỡ', 'Ợ' => 'ợ', 'Ụ' => 'ụ', 'Ủ' => 'ủ', 'Ứ' => 'ứ', 'Ừ' => 'ừ', 'Ử' => 'ử', 'Ữ' => 'ữ', 'Ự' => 'ự', 'Ỳ' => 'ỳ', 'Ỵ' => 'ỵ', 'Ỷ' => 'ỷ', 'Ỹ' => 'ỹ', 'Ỻ' => 'ỻ', 'Ỽ' => 'ỽ', 'Ỿ' => 'ỿ', 'Ἀ' => 'ἀ', 'Ἁ' => 'ἁ', 'Ἂ' => 'ἂ', 'Ἃ' => 'ἃ', 'Ἄ' => 'ἄ', 'Ἅ' => 'ἅ', 'Ἆ' => 'ἆ', 'Ἇ' => 'ἇ', 'Ἐ' => 'ἐ', 'Ἑ' => 'ἑ', 'Ἒ' => 'ἒ', 'Ἓ' => 'ἓ', 'Ἔ' => 'ἔ', 'Ἕ' => 'ἕ', 'Ἠ' => 'ἠ', 'Ἡ' => 'ἡ', 'Ἢ' => 'ἢ', 'Ἣ' => 'ἣ', 'Ἤ' => 'ἤ', 'Ἥ' => 'ἥ', 'Ἦ' => 'ἦ', 'Ἧ' => 'ἧ', 'Ἰ' => 'ἰ', 'Ἱ' => 'ἱ', 'Ἲ' => 'ἲ', 'Ἳ' => 'ἳ', 'Ἴ' => 'ἴ', 'Ἵ' => 'ἵ', 'Ἶ' => 'ἶ', 'Ἷ' => 'ἷ', 'Ὀ' => 'ὀ', 'Ὁ' => 'ὁ', 'Ὂ' => 'ὂ', 'Ὃ' => 'ὃ', 'Ὄ' => 'ὄ', 'Ὅ' => 'ὅ', 'Ὑ' => 'ὑ', 'Ὓ' => 'ὓ', 'Ὕ' => 'ὕ', 'Ὗ' => 'ὗ', 'Ὠ' => 'ὠ', 'Ὡ' => 'ὡ', 'Ὢ' => 'ὢ', 'Ὣ' => 'ὣ', 'Ὤ' => 'ὤ', 'Ὥ' => 'ὥ', 'Ὦ' => 'ὦ', 'Ὧ' => 'ὧ', 'ᾈ' => 'ᾀ', 'ᾉ' => 'ᾁ', 'ᾊ' => 'ᾂ', 'ᾋ' => 'ᾃ', 'ᾌ' => 'ᾄ', 'ᾍ' => 'ᾅ', 'ᾎ' => 'ᾆ', 'ᾏ' => 'ᾇ', 'ᾘ' => 'ᾐ', 'ᾙ' => 'ᾑ', 'ᾚ' => 'ᾒ', 'ᾛ' => 'ᾓ', 'ᾜ' => 'ᾔ', 'ᾝ' => 'ᾕ', 'ᾞ' => 'ᾖ', 'ᾟ' => 'ᾗ', 'ᾨ' => 'ᾠ', 'ᾩ' => 'ᾡ', 'ᾪ' => 'ᾢ', 'ᾫ' => 'ᾣ', 'ᾬ' => 'ᾤ', 'ᾭ' => 'ᾥ', 'ᾮ' => 'ᾦ', 'ᾯ' => 'ᾧ', 'Ᾰ' => 'ᾰ', 'Ᾱ' => 'ᾱ', 'Ὰ' => 'ὰ', 'Ά' => 'ά', 'ᾼ' => 'ᾳ', 'Ὲ' => 'ὲ', 'Έ' => 'έ', 'Ὴ' => 'ὴ', 'Ή' => 'ή', 'ῌ' => 'ῃ', 'Ῐ' => 'ῐ', 'Ῑ' => 'ῑ', 'Ὶ' => 'ὶ', 'Ί' => 'ί', 'Ῠ' => 'ῠ', 'Ῡ' => 'ῡ', 'Ὺ' => 'ὺ', 'Ύ' => 'ύ', 'Ῥ' => 'ῥ', 'Ὸ' => 'ὸ', 'Ό' => 'ό', 'Ὼ' => 'ὼ', 'Ώ' => 'ώ', 'ῼ' => 'ῳ', 'Ω' => 'ω', 'K' => 'k', 'Å' => 'å', 'Ⅎ' => 'ⅎ', 'Ⅰ' => 'ⅰ', 'Ⅱ' => 'ⅱ', 'Ⅲ' => 'ⅲ', 'Ⅳ' => 'ⅳ', 'Ⅴ' => 'ⅴ', 'Ⅵ' => 'ⅵ', 'Ⅶ' => 'ⅶ', 'Ⅷ' => 'ⅷ', 'Ⅸ' => 'ⅸ', 'Ⅹ' => 'ⅹ', 'Ⅺ' => 'ⅺ', 'Ⅻ' => 'ⅻ', 'Ⅼ' => 'ⅼ', 'Ⅽ' => 'ⅽ', 'Ⅾ' => 'ⅾ', 'Ⅿ' => 'ⅿ', 'Ↄ' => 'ↄ', 'Ⓐ' => 'ⓐ', 'Ⓑ' => 'ⓑ', 'Ⓒ' => 'ⓒ', 'Ⓓ' => 'ⓓ', 'Ⓔ' => 'ⓔ', 'Ⓕ' => 'ⓕ', 'Ⓖ' => 'ⓖ', 'Ⓗ' => 'ⓗ', 'Ⓘ' => 'ⓘ', 'Ⓙ' => 'ⓙ', 'Ⓚ' => 'ⓚ', 'Ⓛ' => 'ⓛ', 'Ⓜ' => 'ⓜ', 'Ⓝ' => 'ⓝ', 'Ⓞ' => 'ⓞ', 'Ⓟ' => 'ⓟ', 'Ⓠ' => 'ⓠ', 'Ⓡ' => 'ⓡ', 'Ⓢ' => 'ⓢ', 'Ⓣ' => 'ⓣ', 'Ⓤ' => 'ⓤ', 'Ⓥ' => 'ⓥ', 'Ⓦ' => 'ⓦ', 'Ⓧ' => 'ⓧ', 'Ⓨ' => 'ⓨ', 'Ⓩ' => 'ⓩ', 'Ⰰ' => 'ⰰ', 'Ⰱ' => 'ⰱ', 'Ⰲ' => 'ⰲ', 'Ⰳ' => 'ⰳ', 'Ⰴ' => 'ⰴ', 'Ⰵ' => 'ⰵ', 'Ⰶ' => 'ⰶ', 'Ⰷ' => 'ⰷ', 'Ⰸ' => 'ⰸ', 'Ⰹ' => 'ⰹ', 'Ⰺ' => 'ⰺ', 'Ⰻ' => 'ⰻ', 'Ⰼ' => 'ⰼ', 'Ⰽ' => 'ⰽ', 'Ⰾ' => 'ⰾ', 'Ⰿ' => 'ⰿ', 'Ⱀ' => 'ⱀ', 'Ⱁ' => 'ⱁ', 'Ⱂ' => 'ⱂ', 'Ⱃ' => 'ⱃ', 'Ⱄ' => 'ⱄ', 'Ⱅ' => 'ⱅ', 'Ⱆ' => 'ⱆ', 'Ⱇ' => 'ⱇ', 'Ⱈ' => 'ⱈ', 'Ⱉ' => 'ⱉ', 'Ⱊ' => 'ⱊ', 'Ⱋ' => 'ⱋ', 'Ⱌ' => 'ⱌ', 'Ⱍ' => 'ⱍ', 'Ⱎ' => 'ⱎ', 'Ⱏ' => 'ⱏ', 'Ⱐ' => 'ⱐ', 'Ⱑ' => 'ⱑ', 'Ⱒ' => 'ⱒ', 'Ⱓ' => 'ⱓ', 'Ⱔ' => 'ⱔ', 'Ⱕ' => 'ⱕ', 'Ⱖ' => 'ⱖ', 'Ⱗ' => 'ⱗ', 'Ⱘ' => 'ⱘ', 'Ⱙ' => 'ⱙ', 'Ⱚ' => 'ⱚ', 'Ⱛ' => 'ⱛ', 'Ⱜ' => 'ⱜ', 'Ⱝ' => 'ⱝ', 'Ⱞ' => 'ⱞ', 'Ⱡ' => 'ⱡ', 'Ɫ' => 'ɫ', 'Ᵽ' => 'ᵽ', 'Ɽ' => 'ɽ', 'Ⱨ' => 'ⱨ', 'Ⱪ' => 'ⱪ', 'Ⱬ' => 'ⱬ', 'Ɑ' => 'ɑ', 'Ɱ' => 'ɱ', 'Ɐ' => 'ɐ', 'Ɒ' => 'ɒ', 'Ⱳ' => 'ⱳ', 'Ⱶ' => 'ⱶ', 'Ȿ' => 'ȿ', 'Ɀ' => 'ɀ', 'Ⲁ' => 'ⲁ', 'Ⲃ' => 'ⲃ', 'Ⲅ' => 'ⲅ', 'Ⲇ' => 'ⲇ', 'Ⲉ' => 'ⲉ', 'Ⲋ' => 'ⲋ', 'Ⲍ' => 'ⲍ', 'Ⲏ' => 'ⲏ', 'Ⲑ' => 'ⲑ', 'Ⲓ' => 'ⲓ', 'Ⲕ' => 'ⲕ', 'Ⲗ' => 'ⲗ', 'Ⲙ' => 'ⲙ', 'Ⲛ' => 'ⲛ', 'Ⲝ' => 'ⲝ', 'Ⲟ' => 'ⲟ', 'Ⲡ' => 'ⲡ', 'Ⲣ' => 'ⲣ', 'Ⲥ' => 'ⲥ', 'Ⲧ' => 'ⲧ', 'Ⲩ' => 'ⲩ', 'Ⲫ' => 'ⲫ', 'Ⲭ' => 'ⲭ', 'Ⲯ' => 'ⲯ', 'Ⲱ' => 'ⲱ', 'Ⲳ' => 'ⲳ', 'Ⲵ' => 'ⲵ', 'Ⲷ' => 'ⲷ', 'Ⲹ' => 'ⲹ', 'Ⲻ' => 'ⲻ', 'Ⲽ' => 'ⲽ', 'Ⲿ' => 'ⲿ', 'Ⳁ' => 'ⳁ', 'Ⳃ' => 'ⳃ', 'Ⳅ' => 'ⳅ', 'Ⳇ' => 'ⳇ', 'Ⳉ' => 'ⳉ', 'Ⳋ' => 'ⳋ', 'Ⳍ' => 'ⳍ', 'Ⳏ' => 'ⳏ', 'Ⳑ' => 'ⳑ', 'Ⳓ' => 'ⳓ', 'Ⳕ' => 'ⳕ', 'Ⳗ' => 'ⳗ', 'Ⳙ' => 'ⳙ', 'Ⳛ' => 'ⳛ', 'Ⳝ' => 'ⳝ', 'Ⳟ' => 'ⳟ', 'Ⳡ' => 'ⳡ', 'Ⳣ' => 'ⳣ', 'Ⳬ' => 'ⳬ', 'Ⳮ' => 'ⳮ', 'Ⳳ' => 'ⳳ', 'Ꙁ' => 'ꙁ', 'Ꙃ' => 'ꙃ', 'Ꙅ' => 'ꙅ', 'Ꙇ' => 'ꙇ', 'Ꙉ' => 'ꙉ', 'Ꙋ' => 'ꙋ', 'Ꙍ' => 'ꙍ', 'Ꙏ' => 'ꙏ', 'Ꙑ' => 'ꙑ', 'Ꙓ' => 'ꙓ', 'Ꙕ' => 'ꙕ', 'Ꙗ' => 'ꙗ', 'Ꙙ' => 'ꙙ', 'Ꙛ' => 'ꙛ', 'Ꙝ' => 'ꙝ', 'Ꙟ' => 'ꙟ', 'Ꙡ' => 'ꙡ', 'Ꙣ' => 'ꙣ', 'Ꙥ' => 'ꙥ', 'Ꙧ' => 'ꙧ', 'Ꙩ' => 'ꙩ', 'Ꙫ' => 'ꙫ', 'Ꙭ' => 'ꙭ', 'Ꚁ' => 'ꚁ', 'Ꚃ' => 'ꚃ', 'Ꚅ' => 'ꚅ', 'Ꚇ' => 'ꚇ', 'Ꚉ' => 'ꚉ', 'Ꚋ' => 'ꚋ', 'Ꚍ' => 'ꚍ', 'Ꚏ' => 'ꚏ', 'Ꚑ' => 'ꚑ', 'Ꚓ' => 'ꚓ', 'Ꚕ' => 'ꚕ', 'Ꚗ' => 'ꚗ', 'Ꚙ' => 'ꚙ', 'Ꚛ' => 'ꚛ', 'Ꜣ' => 'ꜣ', 'Ꜥ' => 'ꜥ', 'Ꜧ' => 'ꜧ', 'Ꜩ' => 'ꜩ', 'Ꜫ' => 'ꜫ', 'Ꜭ' => 'ꜭ', 'Ꜯ' => 'ꜯ', 'Ꜳ' => 'ꜳ', 'Ꜵ' => 'ꜵ', 'Ꜷ' => 'ꜷ', 'Ꜹ' => 'ꜹ', 'Ꜻ' => 'ꜻ', 'Ꜽ' => 'ꜽ', 'Ꜿ' => 'ꜿ', 'Ꝁ' => 'ꝁ', 'Ꝃ' => 'ꝃ', 'Ꝅ' => 'ꝅ', 'Ꝇ' => 'ꝇ', 'Ꝉ' => 'ꝉ', 'Ꝋ' => 'ꝋ', 'Ꝍ' => 'ꝍ', 'Ꝏ' => 'ꝏ', 'Ꝑ' => 'ꝑ', 'Ꝓ' => 'ꝓ', 'Ꝕ' => 'ꝕ', 'Ꝗ' => 'ꝗ', 'Ꝙ' => 'ꝙ', 'Ꝛ' => 'ꝛ', 'Ꝝ' => 'ꝝ', 'Ꝟ' => 'ꝟ', 'Ꝡ' => 'ꝡ', 'Ꝣ' => 'ꝣ', 'Ꝥ' => 'ꝥ', 'Ꝧ' => 'ꝧ', 'Ꝩ' => 'ꝩ', 'Ꝫ' => 'ꝫ', 'Ꝭ' => 'ꝭ', 'Ꝯ' => 'ꝯ', 'Ꝺ' => 'ꝺ', 'Ꝼ' => 'ꝼ', 'Ᵹ' => 'ᵹ', 'Ꝿ' => 'ꝿ', 'Ꞁ' => 'ꞁ', 'Ꞃ' => 'ꞃ', 'Ꞅ' => 'ꞅ', 'Ꞇ' => 'ꞇ', 'Ꞌ' => 'ꞌ', 'Ɥ' => 'ɥ', 'Ꞑ' => 'ꞑ', 'Ꞓ' => 'ꞓ', 'Ꞗ' => 'ꞗ', 'Ꞙ' => 'ꞙ', 'Ꞛ' => 'ꞛ', 'Ꞝ' => 'ꞝ', 'Ꞟ' => 'ꞟ', 'Ꞡ' => 'ꞡ', 'Ꞣ' => 'ꞣ', 'Ꞥ' => 'ꞥ', 'Ꞧ' => 'ꞧ', 'Ꞩ' => 'ꞩ', 'Ɦ' => 'ɦ', 'Ɜ' => 'ɜ', 'Ɡ' => 'ɡ', 'Ɬ' => 'ɬ', 'Ɪ' => 'ɪ', 'Ʞ' => 'ʞ', 'Ʇ' => 'ʇ', 'Ʝ' => 'ʝ', 'Ꭓ' => 'ꭓ', 'Ꞵ' => 'ꞵ', 'Ꞷ' => 'ꞷ', 'Ꞹ' => 'ꞹ', 'Ꞻ' => 'ꞻ', 'Ꞽ' => 'ꞽ', 'Ꞿ' => 'ꞿ', 'Ꟃ' => 'ꟃ', 'Ꞔ' => 'ꞔ', 'Ʂ' => 'ʂ', 'Ᶎ' => 'ᶎ', 'Ꟈ' => 'ꟈ', 'Ꟊ' => 'ꟊ', 'Ꟶ' => 'ꟶ', 'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', '𐐀' => '𐐨', '𐐁' => '𐐩', '𐐂' => '𐐪', '𐐃' => '𐐫', '𐐄' => '𐐬', '𐐅' => '𐐭', '𐐆' => '𐐮', '𐐇' => '𐐯', '𐐈' => '𐐰', '𐐉' => '𐐱', '𐐊' => '𐐲', '𐐋' => '𐐳', '𐐌' => '𐐴', '𐐍' => '𐐵', '𐐎' => '𐐶', '𐐏' => '𐐷', '𐐐' => '𐐸', '𐐑' => '𐐹', '𐐒' => '𐐺', '𐐓' => '𐐻', '𐐔' => '𐐼', '𐐕' => '𐐽', '𐐖' => '𐐾', '𐐗' => '𐐿', '𐐘' => '𐑀', '𐐙' => '𐑁', '𐐚' => '𐑂', '𐐛' => '𐑃', '𐐜' => '𐑄', '𐐝' => '𐑅', '𐐞' => '𐑆', '𐐟' => '𐑇', '𐐠' => '𐑈', '𐐡' => '𐑉', '𐐢' => '𐑊', '𐐣' => '𐑋', '𐐤' => '𐑌', '𐐥' => '𐑍', '𐐦' => '𐑎', '𐐧' => '𐑏', '𐒰' => '𐓘', '𐒱' => '𐓙', '𐒲' => '𐓚', '𐒳' => '𐓛', '𐒴' => '𐓜', '𐒵' => '𐓝', '𐒶' => '𐓞', '𐒷' => '𐓟', '𐒸' => '𐓠', '𐒹' => '𐓡', '𐒺' => '𐓢', '𐒻' => '𐓣', '𐒼' => '𐓤', '𐒽' => '𐓥', '𐒾' => '𐓦', '𐒿' => '𐓧', '𐓀' => '𐓨', '𐓁' => '𐓩', '𐓂' => '𐓪', '𐓃' => '𐓫', '𐓄' => '𐓬', '𐓅' => '𐓭', '𐓆' => '𐓮', '𐓇' => '𐓯', '𐓈' => '𐓰', '𐓉' => '𐓱', '𐓊' => '𐓲', '𐓋' => '𐓳', '𐓌' => '𐓴', '𐓍' => '𐓵', '𐓎' => '𐓶', '𐓏' => '𐓷', '𐓐' => '𐓸', '𐓑' => '𐓹', '𐓒' => '𐓺', '𐓓' => '𐓻', '𐲀' => '𐳀', '𐲁' => '𐳁', '𐲂' => '𐳂', '𐲃' => '𐳃', '𐲄' => '𐳄', '𐲅' => '𐳅', '𐲆' => '𐳆', '𐲇' => '𐳇', '𐲈' => '𐳈', '𐲉' => '𐳉', '𐲊' => '𐳊', '𐲋' => '𐳋', '𐲌' => '𐳌', '𐲍' => '𐳍', '𐲎' => '𐳎', '𐲏' => '𐳏', '𐲐' => '𐳐', '𐲑' => '𐳑', '𐲒' => '𐳒', '𐲓' => '𐳓', '𐲔' => '𐳔', '𐲕' => '𐳕', '𐲖' => '𐳖', '𐲗' => '𐳗', '𐲘' => '𐳘', '𐲙' => '𐳙', '𐲚' => '𐳚', '𐲛' => '𐳛', '𐲜' => '𐳜', '𐲝' => '𐳝', '𐲞' => '𐳞', '𐲟' => '𐳟', '𐲠' => '𐳠', '𐲡' => '𐳡', '𐲢' => '𐳢', '𐲣' => '𐳣', '𐲤' => '𐳤', '𐲥' => '𐳥', '𐲦' => '𐳦', '𐲧' => '𐳧', '𐲨' => '𐳨', '𐲩' => '𐳩', '𐲪' => '𐳪', '𐲫' => '𐳫', '𐲬' => '𐳬', '𐲭' => '𐳭', '𐲮' => '𐳮', '𐲯' => '𐳯', '𐲰' => '𐳰', '𐲱' => '𐳱', '𐲲' => '𐳲', '𑢠' => '𑣀', '𑢡' => '𑣁', '𑢢' => '𑣂', '𑢣' => '𑣃', '𑢤' => '𑣄', '𑢥' => '𑣅', '𑢦' => '𑣆', '𑢧' => '𑣇', '𑢨' => '𑣈', '𑢩' => '𑣉', '𑢪' => '𑣊', '𑢫' => '𑣋', '𑢬' => '𑣌', '𑢭' => '𑣍', '𑢮' => '𑣎', '𑢯' => '𑣏', '𑢰' => '𑣐', '𑢱' => '𑣑', '𑢲' => '𑣒', '𑢳' => '𑣓', '𑢴' => '𑣔', '𑢵' => '𑣕', '𑢶' => '𑣖', '𑢷' => '𑣗', '𑢸' => '𑣘', '𑢹' => '𑣙', '𑢺' => '𑣚', '𑢻' => '𑣛', '𑢼' => '𑣜', '𑢽' => '𑣝', '𑢾' => '𑣞', '𑢿' => '𑣟', '𖹀' => '𖹠', '𖹁' => '𖹡', '𖹂' => '𖹢', '𖹃' => '𖹣', '𖹄' => '𖹤', '𖹅' => '𖹥', '𖹆' => '𖹦', '𖹇' => '𖹧', '𖹈' => '𖹨', '𖹉' => '𖹩', '𖹊' => '𖹪', '𖹋' => '𖹫', '𖹌' => '𖹬', '𖹍' => '𖹭', '𖹎' => '𖹮', '𖹏' => '𖹯', '𖹐' => '𖹰', '𖹑' => '𖹱', '𖹒' => '𖹲', '𖹓' => '𖹳', '𖹔' => '𖹴', '𖹕' => '𖹵', '𖹖' => '𖹶', '𖹗' => '𖹷', '𖹘' => '𖹸', '𖹙' => '𖹹', '𖹚' => '𖹺', '𖹛' => '𖹻', '𖹜' => '𖹼', '𖹝' => '𖹽', '𖹞' => '𖹾', '𖹟' => '𖹿', '𞤀' => '𞤢', '𞤁' => '𞤣', '𞤂' => '𞤤', '𞤃' => '𞤥', '𞤄' => '𞤦', '𞤅' => '𞤧', '𞤆' => '𞤨', '𞤇' => '𞤩', '𞤈' => '𞤪', '𞤉' => '𞤫', '𞤊' => '𞤬', '𞤋' => '𞤭', '𞤌' => '𞤮', '𞤍' => '𞤯', '𞤎' => '𞤰', '𞤏' => '𞤱', '𞤐' => '𞤲', '𞤑' => '𞤳', '𞤒' => '𞤴', '𞤓' => '𞤵', '𞤔' => '𞤶', '𞤕' => '𞤷', '𞤖' => '𞤸', '𞤗' => '𞤹', '𞤘' => '𞤺', '𞤙' => '𞤻', '𞤚' => '𞤼', '𞤛' => '𞤽', '𞤜' => '𞤾', '𞤝' => '𞤿', '𞤞' => '𞥀', '𞤟' => '𞥁', '𞤠' => '𞥂', '𞤡' => '𞥃', ); PKCA#]>|zK99[system/helixultimate/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.phpnu�[���<?php // from Case_Ignorable in https://unicode.org/Public/UNIDATA/DerivedCoreProperties.txt return '/(?<![\x{0027}\x{002E}\x{003A}\x{005E}\x{0060}\x{00A8}\x{00AD}\x{00AF}\x{00B4}\x{00B7}\x{00B8}\x{02B0}-\x{02C1}\x{02C2}-\x{02C5}\x{02C6}-\x{02D1}\x{02D2}-\x{02DF}\x{02E0}-\x{02E4}\x{02E5}-\x{02EB}\x{02EC}\x{02ED}\x{02EE}\x{02EF}-\x{02FF}\x{0300}-\x{036F}\x{0374}\x{0375}\x{037A}\x{0384}-\x{0385}\x{0387}\x{0483}-\x{0487}\x{0488}-\x{0489}\x{0559}\x{0591}-\x{05BD}\x{05BF}\x{05C1}-\x{05C2}\x{05C4}-\x{05C5}\x{05C7}\x{05F4}\x{0600}-\x{0605}\x{0610}-\x{061A}\x{061C}\x{0640}\x{064B}-\x{065F}\x{0670}\x{06D6}-\x{06DC}\x{06DD}\x{06DF}-\x{06E4}\x{06E5}-\x{06E6}\x{06E7}-\x{06E8}\x{06EA}-\x{06ED}\x{070F}\x{0711}\x{0730}-\x{074A}\x{07A6}-\x{07B0}\x{07EB}-\x{07F3}\x{07F4}-\x{07F5}\x{07FA}\x{07FD}\x{0816}-\x{0819}\x{081A}\x{081B}-\x{0823}\x{0824}\x{0825}-\x{0827}\x{0828}\x{0829}-\x{082D}\x{0859}-\x{085B}\x{08D3}-\x{08E1}\x{08E2}\x{08E3}-\x{0902}\x{093A}\x{093C}\x{0941}-\x{0948}\x{094D}\x{0951}-\x{0957}\x{0962}-\x{0963}\x{0971}\x{0981}\x{09BC}\x{09C1}-\x{09C4}\x{09CD}\x{09E2}-\x{09E3}\x{09FE}\x{0A01}-\x{0A02}\x{0A3C}\x{0A41}-\x{0A42}\x{0A47}-\x{0A48}\x{0A4B}-\x{0A4D}\x{0A51}\x{0A70}-\x{0A71}\x{0A75}\x{0A81}-\x{0A82}\x{0ABC}\x{0AC1}-\x{0AC5}\x{0AC7}-\x{0AC8}\x{0ACD}\x{0AE2}-\x{0AE3}\x{0AFA}-\x{0AFF}\x{0B01}\x{0B3C}\x{0B3F}\x{0B41}-\x{0B44}\x{0B4D}\x{0B56}\x{0B62}-\x{0B63}\x{0B82}\x{0BC0}\x{0BCD}\x{0C00}\x{0C04}\x{0C3E}-\x{0C40}\x{0C46}-\x{0C48}\x{0C4A}-\x{0C4D}\x{0C55}-\x{0C56}\x{0C62}-\x{0C63}\x{0C81}\x{0CBC}\x{0CBF}\x{0CC6}\x{0CCC}-\x{0CCD}\x{0CE2}-\x{0CE3}\x{0D00}-\x{0D01}\x{0D3B}-\x{0D3C}\x{0D41}-\x{0D44}\x{0D4D}\x{0D62}-\x{0D63}\x{0DCA}\x{0DD2}-\x{0DD4}\x{0DD6}\x{0E31}\x{0E34}-\x{0E3A}\x{0E46}\x{0E47}-\x{0E4E}\x{0EB1}\x{0EB4}-\x{0EB9}\x{0EBB}-\x{0EBC}\x{0EC6}\x{0EC8}-\x{0ECD}\x{0F18}-\x{0F19}\x{0F35}\x{0F37}\x{0F39}\x{0F71}-\x{0F7E}\x{0F80}-\x{0F84}\x{0F86}-\x{0F87}\x{0F8D}-\x{0F97}\x{0F99}-\x{0FBC}\x{0FC6}\x{102D}-\x{1030}\x{1032}-\x{1037}\x{1039}-\x{103A}\x{103D}-\x{103E}\x{1058}-\x{1059}\x{105E}-\x{1060}\x{1071}-\x{1074}\x{1082}\x{1085}-\x{1086}\x{108D}\x{109D}\x{10FC}\x{135D}-\x{135F}\x{1712}-\x{1714}\x{1732}-\x{1734}\x{1752}-\x{1753}\x{1772}-\x{1773}\x{17B4}-\x{17B5}\x{17B7}-\x{17BD}\x{17C6}\x{17C9}-\x{17D3}\x{17D7}\x{17DD}\x{180B}-\x{180D}\x{180E}\x{1843}\x{1885}-\x{1886}\x{18A9}\x{1920}-\x{1922}\x{1927}-\x{1928}\x{1932}\x{1939}-\x{193B}\x{1A17}-\x{1A18}\x{1A1B}\x{1A56}\x{1A58}-\x{1A5E}\x{1A60}\x{1A62}\x{1A65}-\x{1A6C}\x{1A73}-\x{1A7C}\x{1A7F}\x{1AA7}\x{1AB0}-\x{1ABD}\x{1ABE}\x{1B00}-\x{1B03}\x{1B34}\x{1B36}-\x{1B3A}\x{1B3C}\x{1B42}\x{1B6B}-\x{1B73}\x{1B80}-\x{1B81}\x{1BA2}-\x{1BA5}\x{1BA8}-\x{1BA9}\x{1BAB}-\x{1BAD}\x{1BE6}\x{1BE8}-\x{1BE9}\x{1BED}\x{1BEF}-\x{1BF1}\x{1C2C}-\x{1C33}\x{1C36}-\x{1C37}\x{1C78}-\x{1C7D}\x{1CD0}-\x{1CD2}\x{1CD4}-\x{1CE0}\x{1CE2}-\x{1CE8}\x{1CED}\x{1CF4}\x{1CF8}-\x{1CF9}\x{1D2C}-\x{1D6A}\x{1D78}\x{1D9B}-\x{1DBF}\x{1DC0}-\x{1DF9}\x{1DFB}-\x{1DFF}\x{1FBD}\x{1FBF}-\x{1FC1}\x{1FCD}-\x{1FCF}\x{1FDD}-\x{1FDF}\x{1FED}-\x{1FEF}\x{1FFD}-\x{1FFE}\x{200B}-\x{200F}\x{2018}\x{2019}\x{2024}\x{2027}\x{202A}-\x{202E}\x{2060}-\x{2064}\x{2066}-\x{206F}\x{2071}\x{207F}\x{2090}-\x{209C}\x{20D0}-\x{20DC}\x{20DD}-\x{20E0}\x{20E1}\x{20E2}-\x{20E4}\x{20E5}-\x{20F0}\x{2C7C}-\x{2C7D}\x{2CEF}-\x{2CF1}\x{2D6F}\x{2D7F}\x{2DE0}-\x{2DFF}\x{2E2F}\x{3005}\x{302A}-\x{302D}\x{3031}-\x{3035}\x{303B}\x{3099}-\x{309A}\x{309B}-\x{309C}\x{309D}-\x{309E}\x{30FC}-\x{30FE}\x{A015}\x{A4F8}-\x{A4FD}\x{A60C}\x{A66F}\x{A670}-\x{A672}\x{A674}-\x{A67D}\x{A67F}\x{A69C}-\x{A69D}\x{A69E}-\x{A69F}\x{A6F0}-\x{A6F1}\x{A700}-\x{A716}\x{A717}-\x{A71F}\x{A720}-\x{A721}\x{A770}\x{A788}\x{A789}-\x{A78A}\x{A7F8}-\x{A7F9}\x{A802}\x{A806}\x{A80B}\x{A825}-\x{A826}\x{A8C4}-\x{A8C5}\x{A8E0}-\x{A8F1}\x{A8FF}\x{A926}-\x{A92D}\x{A947}-\x{A951}\x{A980}-\x{A982}\x{A9B3}\x{A9B6}-\x{A9B9}\x{A9BC}\x{A9CF}\x{A9E5}\x{A9E6}\x{AA29}-\x{AA2E}\x{AA31}-\x{AA32}\x{AA35}-\x{AA36}\x{AA43}\x{AA4C}\x{AA70}\x{AA7C}\x{AAB0}\x{AAB2}-\x{AAB4}\x{AAB7}-\x{AAB8}\x{AABE}-\x{AABF}\x{AAC1}\x{AADD}\x{AAEC}-\x{AAED}\x{AAF3}-\x{AAF4}\x{AAF6}\x{AB5B}\x{AB5C}-\x{AB5F}\x{ABE5}\x{ABE8}\x{ABED}\x{FB1E}\x{FBB2}-\x{FBC1}\x{FE00}-\x{FE0F}\x{FE13}\x{FE20}-\x{FE2F}\x{FE52}\x{FE55}\x{FEFF}\x{FF07}\x{FF0E}\x{FF1A}\x{FF3E}\x{FF40}\x{FF70}\x{FF9E}-\x{FF9F}\x{FFE3}\x{FFF9}-\x{FFFB}\x{101FD}\x{102E0}\x{10376}-\x{1037A}\x{10A01}-\x{10A03}\x{10A05}-\x{10A06}\x{10A0C}-\x{10A0F}\x{10A38}-\x{10A3A}\x{10A3F}\x{10AE5}-\x{10AE6}\x{10D24}-\x{10D27}\x{10F46}-\x{10F50}\x{11001}\x{11038}-\x{11046}\x{1107F}-\x{11081}\x{110B3}-\x{110B6}\x{110B9}-\x{110BA}\x{110BD}\x{110CD}\x{11100}-\x{11102}\x{11127}-\x{1112B}\x{1112D}-\x{11134}\x{11173}\x{11180}-\x{11181}\x{111B6}-\x{111BE}\x{111C9}-\x{111CC}\x{1122F}-\x{11231}\x{11234}\x{11236}-\x{11237}\x{1123E}\x{112DF}\x{112E3}-\x{112EA}\x{11300}-\x{11301}\x{1133B}-\x{1133C}\x{11340}\x{11366}-\x{1136C}\x{11370}-\x{11374}\x{11438}-\x{1143F}\x{11442}-\x{11444}\x{11446}\x{1145E}\x{114B3}-\x{114B8}\x{114BA}\x{114BF}-\x{114C0}\x{114C2}-\x{114C3}\x{115B2}-\x{115B5}\x{115BC}-\x{115BD}\x{115BF}-\x{115C0}\x{115DC}-\x{115DD}\x{11633}-\x{1163A}\x{1163D}\x{1163F}-\x{11640}\x{116AB}\x{116AD}\x{116B0}-\x{116B5}\x{116B7}\x{1171D}-\x{1171F}\x{11722}-\x{11725}\x{11727}-\x{1172B}\x{1182F}-\x{11837}\x{11839}-\x{1183A}\x{11A01}-\x{11A0A}\x{11A33}-\x{11A38}\x{11A3B}-\x{11A3E}\x{11A47}\x{11A51}-\x{11A56}\x{11A59}-\x{11A5B}\x{11A8A}-\x{11A96}\x{11A98}-\x{11A99}\x{11C30}-\x{11C36}\x{11C38}-\x{11C3D}\x{11C3F}\x{11C92}-\x{11CA7}\x{11CAA}-\x{11CB0}\x{11CB2}-\x{11CB3}\x{11CB5}-\x{11CB6}\x{11D31}-\x{11D36}\x{11D3A}\x{11D3C}-\x{11D3D}\x{11D3F}-\x{11D45}\x{11D47}\x{11D90}-\x{11D91}\x{11D95}\x{11D97}\x{11EF3}-\x{11EF4}\x{16AF0}-\x{16AF4}\x{16B30}-\x{16B36}\x{16B40}-\x{16B43}\x{16F8F}-\x{16F92}\x{16F93}-\x{16F9F}\x{16FE0}-\x{16FE1}\x{1BC9D}-\x{1BC9E}\x{1BCA0}-\x{1BCA3}\x{1D167}-\x{1D169}\x{1D173}-\x{1D17A}\x{1D17B}-\x{1D182}\x{1D185}-\x{1D18B}\x{1D1AA}-\x{1D1AD}\x{1D242}-\x{1D244}\x{1DA00}-\x{1DA36}\x{1DA3B}-\x{1DA6C}\x{1DA75}\x{1DA84}\x{1DA9B}-\x{1DA9F}\x{1DAA1}-\x{1DAAF}\x{1E000}-\x{1E006}\x{1E008}-\x{1E018}\x{1E01B}-\x{1E021}\x{1E023}-\x{1E024}\x{1E026}-\x{1E02A}\x{1E8D0}-\x{1E8D6}\x{1E944}-\x{1E94A}\x{1F3FB}-\x{1F3FF}\x{E0001}\x{E0020}-\x{E007F}\x{E0100}-\x{E01EF}])(\pL)(\pL*+)/u'; PKCA#]�P��f�fUsystem/helixultimate/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.phpnu�[���<?php return array ( 'a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', 'µ' => 'Μ', 'à' => 'À', 'á' => 'Á', 'â' => 'Â', 'ã' => 'Ã', 'ä' => 'Ä', 'å' => 'Å', 'æ' => 'Æ', 'ç' => 'Ç', 'è' => 'È', 'é' => 'É', 'ê' => 'Ê', 'ë' => 'Ë', 'ì' => 'Ì', 'í' => 'Í', 'î' => 'Î', 'ï' => 'Ï', 'ð' => 'Ð', 'ñ' => 'Ñ', 'ò' => 'Ò', 'ó' => 'Ó', 'ô' => 'Ô', 'õ' => 'Õ', 'ö' => 'Ö', 'ø' => 'Ø', 'ù' => 'Ù', 'ú' => 'Ú', 'û' => 'Û', 'ü' => 'Ü', 'ý' => 'Ý', 'þ' => 'Þ', 'ÿ' => 'Ÿ', 'ā' => 'Ā', 'ă' => 'Ă', 'ą' => 'Ą', 'ć' => 'Ć', 'ĉ' => 'Ĉ', 'ċ' => 'Ċ', 'č' => 'Č', 'ď' => 'Ď', 'đ' => 'Đ', 'ē' => 'Ē', 'ĕ' => 'Ĕ', 'ė' => 'Ė', 'ę' => 'Ę', 'ě' => 'Ě', 'ĝ' => 'Ĝ', 'ğ' => 'Ğ', 'ġ' => 'Ġ', 'ģ' => 'Ģ', 'ĥ' => 'Ĥ', 'ħ' => 'Ħ', 'ĩ' => 'Ĩ', 'ī' => 'Ī', 'ĭ' => 'Ĭ', 'į' => 'Į', 'ı' => 'I', 'ij' => 'IJ', 'ĵ' => 'Ĵ', 'ķ' => 'Ķ', 'ĺ' => 'Ĺ', 'ļ' => 'Ļ', 'ľ' => 'Ľ', 'ŀ' => 'Ŀ', 'ł' => 'Ł', 'ń' => 'Ń', 'ņ' => 'Ņ', 'ň' => 'Ň', 'ŋ' => 'Ŋ', 'ō' => 'Ō', 'ŏ' => 'Ŏ', 'ő' => 'Ő', 'œ' => 'Œ', 'ŕ' => 'Ŕ', 'ŗ' => 'Ŗ', 'ř' => 'Ř', 'ś' => 'Ś', 'ŝ' => 'Ŝ', 'ş' => 'Ş', 'š' => 'Š', 'ţ' => 'Ţ', 'ť' => 'Ť', 'ŧ' => 'Ŧ', 'ũ' => 'Ũ', 'ū' => 'Ū', 'ŭ' => 'Ŭ', 'ů' => 'Ů', 'ű' => 'Ű', 'ų' => 'Ų', 'ŵ' => 'Ŵ', 'ŷ' => 'Ŷ', 'ź' => 'Ź', 'ż' => 'Ż', 'ž' => 'Ž', 'ſ' => 'S', 'ƀ' => 'Ƀ', 'ƃ' => 'Ƃ', 'ƅ' => 'Ƅ', 'ƈ' => 'Ƈ', 'ƌ' => 'Ƌ', 'ƒ' => 'Ƒ', 'ƕ' => 'Ƕ', 'ƙ' => 'Ƙ', 'ƚ' => 'Ƚ', 'ƞ' => 'Ƞ', 'ơ' => 'Ơ', 'ƣ' => 'Ƣ', 'ƥ' => 'Ƥ', 'ƨ' => 'Ƨ', 'ƭ' => 'Ƭ', 'ư' => 'Ư', 'ƴ' => 'Ƴ', 'ƶ' => 'Ƶ', 'ƹ' => 'Ƹ', 'ƽ' => 'Ƽ', 'ƿ' => 'Ƿ', 'Dž' => 'DŽ', 'dž' => 'DŽ', 'Lj' => 'LJ', 'lj' => 'LJ', 'Nj' => 'NJ', 'nj' => 'NJ', 'ǎ' => 'Ǎ', 'ǐ' => 'Ǐ', 'ǒ' => 'Ǒ', 'ǔ' => 'Ǔ', 'ǖ' => 'Ǖ', 'ǘ' => 'Ǘ', 'ǚ' => 'Ǚ', 'ǜ' => 'Ǜ', 'ǝ' => 'Ǝ', 'ǟ' => 'Ǟ', 'ǡ' => 'Ǡ', 'ǣ' => 'Ǣ', 'ǥ' => 'Ǥ', 'ǧ' => 'Ǧ', 'ǩ' => 'Ǩ', 'ǫ' => 'Ǫ', 'ǭ' => 'Ǭ', 'ǯ' => 'Ǯ', 'Dz' => 'DZ', 'dz' => 'DZ', 'ǵ' => 'Ǵ', 'ǹ' => 'Ǹ', 'ǻ' => 'Ǻ', 'ǽ' => 'Ǽ', 'ǿ' => 'Ǿ', 'ȁ' => 'Ȁ', 'ȃ' => 'Ȃ', 'ȅ' => 'Ȅ', 'ȇ' => 'Ȇ', 'ȉ' => 'Ȉ', 'ȋ' => 'Ȋ', 'ȍ' => 'Ȍ', 'ȏ' => 'Ȏ', 'ȑ' => 'Ȑ', 'ȓ' => 'Ȓ', 'ȕ' => 'Ȕ', 'ȗ' => 'Ȗ', 'ș' => 'Ș', 'ț' => 'Ț', 'ȝ' => 'Ȝ', 'ȟ' => 'Ȟ', 'ȣ' => 'Ȣ', 'ȥ' => 'Ȥ', 'ȧ' => 'Ȧ', 'ȩ' => 'Ȩ', 'ȫ' => 'Ȫ', 'ȭ' => 'Ȭ', 'ȯ' => 'Ȯ', 'ȱ' => 'Ȱ', 'ȳ' => 'Ȳ', 'ȼ' => 'Ȼ', 'ȿ' => 'Ȿ', 'ɀ' => 'Ɀ', 'ɂ' => 'Ɂ', 'ɇ' => 'Ɇ', 'ɉ' => 'Ɉ', 'ɋ' => 'Ɋ', 'ɍ' => 'Ɍ', 'ɏ' => 'Ɏ', 'ɐ' => 'Ɐ', 'ɑ' => 'Ɑ', 'ɒ' => 'Ɒ', 'ɓ' => 'Ɓ', 'ɔ' => 'Ɔ', 'ɖ' => 'Ɖ', 'ɗ' => 'Ɗ', 'ə' => 'Ə', 'ɛ' => 'Ɛ', 'ɜ' => 'Ɜ', 'ɠ' => 'Ɠ', 'ɡ' => 'Ɡ', 'ɣ' => 'Ɣ', 'ɥ' => 'Ɥ', 'ɦ' => 'Ɦ', 'ɨ' => 'Ɨ', 'ɩ' => 'Ɩ', 'ɪ' => 'Ɪ', 'ɫ' => 'Ɫ', 'ɬ' => 'Ɬ', 'ɯ' => 'Ɯ', 'ɱ' => 'Ɱ', 'ɲ' => 'Ɲ', 'ɵ' => 'Ɵ', 'ɽ' => 'Ɽ', 'ʀ' => 'Ʀ', 'ʂ' => 'Ʂ', 'ʃ' => 'Ʃ', 'ʇ' => 'Ʇ', 'ʈ' => 'Ʈ', 'ʉ' => 'Ʉ', 'ʊ' => 'Ʊ', 'ʋ' => 'Ʋ', 'ʌ' => 'Ʌ', 'ʒ' => 'Ʒ', 'ʝ' => 'Ʝ', 'ʞ' => 'Ʞ', 'ͅ' => 'Ι', 'ͱ' => 'Ͱ', 'ͳ' => 'Ͳ', 'ͷ' => 'Ͷ', 'ͻ' => 'Ͻ', 'ͼ' => 'Ͼ', 'ͽ' => 'Ͽ', 'ά' => 'Ά', 'έ' => 'Έ', 'ή' => 'Ή', 'ί' => 'Ί', 'α' => 'Α', 'β' => 'Β', 'γ' => 'Γ', 'δ' => 'Δ', 'ε' => 'Ε', 'ζ' => 'Ζ', 'η' => 'Η', 'θ' => 'Θ', 'ι' => 'Ι', 'κ' => 'Κ', 'λ' => 'Λ', 'μ' => 'Μ', 'ν' => 'Ν', 'ξ' => 'Ξ', 'ο' => 'Ο', 'π' => 'Π', 'ρ' => 'Ρ', 'ς' => 'Σ', 'σ' => 'Σ', 'τ' => 'Τ', 'υ' => 'Υ', 'φ' => 'Φ', 'χ' => 'Χ', 'ψ' => 'Ψ', 'ω' => 'Ω', 'ϊ' => 'Ϊ', 'ϋ' => 'Ϋ', 'ό' => 'Ό', 'ύ' => 'Ύ', 'ώ' => 'Ώ', 'ϐ' => 'Β', 'ϑ' => 'Θ', 'ϕ' => 'Φ', 'ϖ' => 'Π', 'ϗ' => 'Ϗ', 'ϙ' => 'Ϙ', 'ϛ' => 'Ϛ', 'ϝ' => 'Ϝ', 'ϟ' => 'Ϟ', 'ϡ' => 'Ϡ', 'ϣ' => 'Ϣ', 'ϥ' => 'Ϥ', 'ϧ' => 'Ϧ', 'ϩ' => 'Ϩ', 'ϫ' => 'Ϫ', 'ϭ' => 'Ϭ', 'ϯ' => 'Ϯ', 'ϰ' => 'Κ', 'ϱ' => 'Ρ', 'ϲ' => 'Ϲ', 'ϳ' => 'Ϳ', 'ϵ' => 'Ε', 'ϸ' => 'Ϸ', 'ϻ' => 'Ϻ', 'а' => 'А', 'б' => 'Б', 'в' => 'В', 'г' => 'Г', 'д' => 'Д', 'е' => 'Е', 'ж' => 'Ж', 'з' => 'З', 'и' => 'И', 'й' => 'Й', 'к' => 'К', 'л' => 'Л', 'м' => 'М', 'н' => 'Н', 'о' => 'О', 'п' => 'П', 'р' => 'Р', 'с' => 'С', 'т' => 'Т', 'у' => 'У', 'ф' => 'Ф', 'х' => 'Х', 'ц' => 'Ц', 'ч' => 'Ч', 'ш' => 'Ш', 'щ' => 'Щ', 'ъ' => 'Ъ', 'ы' => 'Ы', 'ь' => 'Ь', 'э' => 'Э', 'ю' => 'Ю', 'я' => 'Я', 'ѐ' => 'Ѐ', 'ё' => 'Ё', 'ђ' => 'Ђ', 'ѓ' => 'Ѓ', 'є' => 'Є', 'ѕ' => 'Ѕ', 'і' => 'І', 'ї' => 'Ї', 'ј' => 'Ј', 'љ' => 'Љ', 'њ' => 'Њ', 'ћ' => 'Ћ', 'ќ' => 'Ќ', 'ѝ' => 'Ѝ', 'ў' => 'Ў', 'џ' => 'Џ', 'ѡ' => 'Ѡ', 'ѣ' => 'Ѣ', 'ѥ' => 'Ѥ', 'ѧ' => 'Ѧ', 'ѩ' => 'Ѩ', 'ѫ' => 'Ѫ', 'ѭ' => 'Ѭ', 'ѯ' => 'Ѯ', 'ѱ' => 'Ѱ', 'ѳ' => 'Ѳ', 'ѵ' => 'Ѵ', 'ѷ' => 'Ѷ', 'ѹ' => 'Ѹ', 'ѻ' => 'Ѻ', 'ѽ' => 'Ѽ', 'ѿ' => 'Ѿ', 'ҁ' => 'Ҁ', 'ҋ' => 'Ҋ', 'ҍ' => 'Ҍ', 'ҏ' => 'Ҏ', 'ґ' => 'Ґ', 'ғ' => 'Ғ', 'ҕ' => 'Ҕ', 'җ' => 'Җ', 'ҙ' => 'Ҙ', 'қ' => 'Қ', 'ҝ' => 'Ҝ', 'ҟ' => 'Ҟ', 'ҡ' => 'Ҡ', 'ң' => 'Ң', 'ҥ' => 'Ҥ', 'ҧ' => 'Ҧ', 'ҩ' => 'Ҩ', 'ҫ' => 'Ҫ', 'ҭ' => 'Ҭ', 'ү' => 'Ү', 'ұ' => 'Ұ', 'ҳ' => 'Ҳ', 'ҵ' => 'Ҵ', 'ҷ' => 'Ҷ', 'ҹ' => 'Ҹ', 'һ' => 'Һ', 'ҽ' => 'Ҽ', 'ҿ' => 'Ҿ', 'ӂ' => 'Ӂ', 'ӄ' => 'Ӄ', 'ӆ' => 'Ӆ', 'ӈ' => 'Ӈ', 'ӊ' => 'Ӊ', 'ӌ' => 'Ӌ', 'ӎ' => 'Ӎ', 'ӏ' => 'Ӏ', 'ӑ' => 'Ӑ', 'ӓ' => 'Ӓ', 'ӕ' => 'Ӕ', 'ӗ' => 'Ӗ', 'ә' => 'Ә', 'ӛ' => 'Ӛ', 'ӝ' => 'Ӝ', 'ӟ' => 'Ӟ', 'ӡ' => 'Ӡ', 'ӣ' => 'Ӣ', 'ӥ' => 'Ӥ', 'ӧ' => 'Ӧ', 'ө' => 'Ө', 'ӫ' => 'Ӫ', 'ӭ' => 'Ӭ', 'ӯ' => 'Ӯ', 'ӱ' => 'Ӱ', 'ӳ' => 'Ӳ', 'ӵ' => 'Ӵ', 'ӷ' => 'Ӷ', 'ӹ' => 'Ӹ', 'ӻ' => 'Ӻ', 'ӽ' => 'Ӽ', 'ӿ' => 'Ӿ', 'ԁ' => 'Ԁ', 'ԃ' => 'Ԃ', 'ԅ' => 'Ԅ', 'ԇ' => 'Ԇ', 'ԉ' => 'Ԉ', 'ԋ' => 'Ԋ', 'ԍ' => 'Ԍ', 'ԏ' => 'Ԏ', 'ԑ' => 'Ԑ', 'ԓ' => 'Ԓ', 'ԕ' => 'Ԕ', 'ԗ' => 'Ԗ', 'ԙ' => 'Ԙ', 'ԛ' => 'Ԛ', 'ԝ' => 'Ԝ', 'ԟ' => 'Ԟ', 'ԡ' => 'Ԡ', 'ԣ' => 'Ԣ', 'ԥ' => 'Ԥ', 'ԧ' => 'Ԧ', 'ԩ' => 'Ԩ', 'ԫ' => 'Ԫ', 'ԭ' => 'Ԭ', 'ԯ' => 'Ԯ', 'ա' => 'Ա', 'բ' => 'Բ', 'գ' => 'Գ', 'դ' => 'Դ', 'ե' => 'Ե', 'զ' => 'Զ', 'է' => 'Է', 'ը' => 'Ը', 'թ' => 'Թ', 'ժ' => 'Ժ', 'ի' => 'Ի', 'լ' => 'Լ', 'խ' => 'Խ', 'ծ' => 'Ծ', 'կ' => 'Կ', 'հ' => 'Հ', 'ձ' => 'Ձ', 'ղ' => 'Ղ', 'ճ' => 'Ճ', 'մ' => 'Մ', 'յ' => 'Յ', 'ն' => 'Ն', 'շ' => 'Շ', 'ո' => 'Ո', 'չ' => 'Չ', 'պ' => 'Պ', 'ջ' => 'Ջ', 'ռ' => 'Ռ', 'ս' => 'Ս', 'վ' => 'Վ', 'տ' => 'Տ', 'ր' => 'Ր', 'ց' => 'Ց', 'ւ' => 'Ւ', 'փ' => 'Փ', 'ք' => 'Ք', 'օ' => 'Օ', 'ֆ' => 'Ֆ', 'ა' => 'Ა', 'ბ' => 'Ბ', 'გ' => 'Გ', 'დ' => 'Დ', 'ე' => 'Ე', 'ვ' => 'Ვ', 'ზ' => 'Ზ', 'თ' => 'Თ', 'ი' => 'Ი', 'კ' => 'Კ', 'ლ' => 'Ლ', 'მ' => 'Მ', 'ნ' => 'Ნ', 'ო' => 'Ო', 'პ' => 'Პ', 'ჟ' => 'Ჟ', 'რ' => 'Რ', 'ს' => 'Ს', 'ტ' => 'Ტ', 'უ' => 'Უ', 'ფ' => 'Ფ', 'ქ' => 'Ქ', 'ღ' => 'Ღ', 'ყ' => 'Ყ', 'შ' => 'Შ', 'ჩ' => 'Ჩ', 'ც' => 'Ც', 'ძ' => 'Ძ', 'წ' => 'Წ', 'ჭ' => 'Ჭ', 'ხ' => 'Ხ', 'ჯ' => 'Ჯ', 'ჰ' => 'Ჰ', 'ჱ' => 'Ჱ', 'ჲ' => 'Ჲ', 'ჳ' => 'Ჳ', 'ჴ' => 'Ჴ', 'ჵ' => 'Ჵ', 'ჶ' => 'Ჶ', 'ჷ' => 'Ჷ', 'ჸ' => 'Ჸ', 'ჹ' => 'Ჹ', 'ჺ' => 'Ჺ', 'ჽ' => 'Ჽ', 'ჾ' => 'Ჾ', 'ჿ' => 'Ჿ', 'ᏸ' => 'Ᏸ', 'ᏹ' => 'Ᏹ', 'ᏺ' => 'Ᏺ', 'ᏻ' => 'Ᏻ', 'ᏼ' => 'Ᏼ', 'ᏽ' => 'Ᏽ', 'ᲀ' => 'В', 'ᲁ' => 'Д', 'ᲂ' => 'О', 'ᲃ' => 'С', 'ᲄ' => 'Т', 'ᲅ' => 'Т', 'ᲆ' => 'Ъ', 'ᲇ' => 'Ѣ', 'ᲈ' => 'Ꙋ', 'ᵹ' => 'Ᵹ', 'ᵽ' => 'Ᵽ', 'ᶎ' => 'Ᶎ', 'ḁ' => 'Ḁ', 'ḃ' => 'Ḃ', 'ḅ' => 'Ḅ', 'ḇ' => 'Ḇ', 'ḉ' => 'Ḉ', 'ḋ' => 'Ḋ', 'ḍ' => 'Ḍ', 'ḏ' => 'Ḏ', 'ḑ' => 'Ḑ', 'ḓ' => 'Ḓ', 'ḕ' => 'Ḕ', 'ḗ' => 'Ḗ', 'ḙ' => 'Ḙ', 'ḛ' => 'Ḛ', 'ḝ' => 'Ḝ', 'ḟ' => 'Ḟ', 'ḡ' => 'Ḡ', 'ḣ' => 'Ḣ', 'ḥ' => 'Ḥ', 'ḧ' => 'Ḧ', 'ḩ' => 'Ḩ', 'ḫ' => 'Ḫ', 'ḭ' => 'Ḭ', 'ḯ' => 'Ḯ', 'ḱ' => 'Ḱ', 'ḳ' => 'Ḳ', 'ḵ' => 'Ḵ', 'ḷ' => 'Ḷ', 'ḹ' => 'Ḹ', 'ḻ' => 'Ḻ', 'ḽ' => 'Ḽ', 'ḿ' => 'Ḿ', 'ṁ' => 'Ṁ', 'ṃ' => 'Ṃ', 'ṅ' => 'Ṅ', 'ṇ' => 'Ṇ', 'ṉ' => 'Ṉ', 'ṋ' => 'Ṋ', 'ṍ' => 'Ṍ', 'ṏ' => 'Ṏ', 'ṑ' => 'Ṑ', 'ṓ' => 'Ṓ', 'ṕ' => 'Ṕ', 'ṗ' => 'Ṗ', 'ṙ' => 'Ṙ', 'ṛ' => 'Ṛ', 'ṝ' => 'Ṝ', 'ṟ' => 'Ṟ', 'ṡ' => 'Ṡ', 'ṣ' => 'Ṣ', 'ṥ' => 'Ṥ', 'ṧ' => 'Ṧ', 'ṩ' => 'Ṩ', 'ṫ' => 'Ṫ', 'ṭ' => 'Ṭ', 'ṯ' => 'Ṯ', 'ṱ' => 'Ṱ', 'ṳ' => 'Ṳ', 'ṵ' => 'Ṵ', 'ṷ' => 'Ṷ', 'ṹ' => 'Ṹ', 'ṻ' => 'Ṻ', 'ṽ' => 'Ṽ', 'ṿ' => 'Ṿ', 'ẁ' => 'Ẁ', 'ẃ' => 'Ẃ', 'ẅ' => 'Ẅ', 'ẇ' => 'Ẇ', 'ẉ' => 'Ẉ', 'ẋ' => 'Ẋ', 'ẍ' => 'Ẍ', 'ẏ' => 'Ẏ', 'ẑ' => 'Ẑ', 'ẓ' => 'Ẓ', 'ẕ' => 'Ẕ', 'ẛ' => 'Ṡ', 'ạ' => 'Ạ', 'ả' => 'Ả', 'ấ' => 'Ấ', 'ầ' => 'Ầ', 'ẩ' => 'Ẩ', 'ẫ' => 'Ẫ', 'ậ' => 'Ậ', 'ắ' => 'Ắ', 'ằ' => 'Ằ', 'ẳ' => 'Ẳ', 'ẵ' => 'Ẵ', 'ặ' => 'Ặ', 'ẹ' => 'Ẹ', 'ẻ' => 'Ẻ', 'ẽ' => 'Ẽ', 'ế' => 'Ế', 'ề' => 'Ề', 'ể' => 'Ể', 'ễ' => 'Ễ', 'ệ' => 'Ệ', 'ỉ' => 'Ỉ', 'ị' => 'Ị', 'ọ' => 'Ọ', 'ỏ' => 'Ỏ', 'ố' => 'Ố', 'ồ' => 'Ồ', 'ổ' => 'Ổ', 'ỗ' => 'Ỗ', 'ộ' => 'Ộ', 'ớ' => 'Ớ', 'ờ' => 'Ờ', 'ở' => 'Ở', 'ỡ' => 'Ỡ', 'ợ' => 'Ợ', 'ụ' => 'Ụ', 'ủ' => 'Ủ', 'ứ' => 'Ứ', 'ừ' => 'Ừ', 'ử' => 'Ử', 'ữ' => 'Ữ', 'ự' => 'Ự', 'ỳ' => 'Ỳ', 'ỵ' => 'Ỵ', 'ỷ' => 'Ỷ', 'ỹ' => 'Ỹ', 'ỻ' => 'Ỻ', 'ỽ' => 'Ỽ', 'ỿ' => 'Ỿ', 'ἀ' => 'Ἀ', 'ἁ' => 'Ἁ', 'ἂ' => 'Ἂ', 'ἃ' => 'Ἃ', 'ἄ' => 'Ἄ', 'ἅ' => 'Ἅ', 'ἆ' => 'Ἆ', 'ἇ' => 'Ἇ', 'ἐ' => 'Ἐ', 'ἑ' => 'Ἑ', 'ἒ' => 'Ἒ', 'ἓ' => 'Ἓ', 'ἔ' => 'Ἔ', 'ἕ' => 'Ἕ', 'ἠ' => 'Ἠ', 'ἡ' => 'Ἡ', 'ἢ' => 'Ἢ', 'ἣ' => 'Ἣ', 'ἤ' => 'Ἤ', 'ἥ' => 'Ἥ', 'ἦ' => 'Ἦ', 'ἧ' => 'Ἧ', 'ἰ' => 'Ἰ', 'ἱ' => 'Ἱ', 'ἲ' => 'Ἲ', 'ἳ' => 'Ἳ', 'ἴ' => 'Ἴ', 'ἵ' => 'Ἵ', 'ἶ' => 'Ἶ', 'ἷ' => 'Ἷ', 'ὀ' => 'Ὀ', 'ὁ' => 'Ὁ', 'ὂ' => 'Ὂ', 'ὃ' => 'Ὃ', 'ὄ' => 'Ὄ', 'ὅ' => 'Ὅ', 'ὑ' => 'Ὑ', 'ὓ' => 'Ὓ', 'ὕ' => 'Ὕ', 'ὗ' => 'Ὗ', 'ὠ' => 'Ὠ', 'ὡ' => 'Ὡ', 'ὢ' => 'Ὢ', 'ὣ' => 'Ὣ', 'ὤ' => 'Ὤ', 'ὥ' => 'Ὥ', 'ὦ' => 'Ὦ', 'ὧ' => 'Ὧ', 'ὰ' => 'Ὰ', 'ά' => 'Ά', 'ὲ' => 'Ὲ', 'έ' => 'Έ', 'ὴ' => 'Ὴ', 'ή' => 'Ή', 'ὶ' => 'Ὶ', 'ί' => 'Ί', 'ὸ' => 'Ὸ', 'ό' => 'Ό', 'ὺ' => 'Ὺ', 'ύ' => 'Ύ', 'ὼ' => 'Ὼ', 'ώ' => 'Ώ', 'ᾀ' => 'ἈΙ', 'ᾁ' => 'ἉΙ', 'ᾂ' => 'ἊΙ', 'ᾃ' => 'ἋΙ', 'ᾄ' => 'ἌΙ', 'ᾅ' => 'ἍΙ', 'ᾆ' => 'ἎΙ', 'ᾇ' => 'ἏΙ', 'ᾐ' => 'ἨΙ', 'ᾑ' => 'ἩΙ', 'ᾒ' => 'ἪΙ', 'ᾓ' => 'ἫΙ', 'ᾔ' => 'ἬΙ', 'ᾕ' => 'ἭΙ', 'ᾖ' => 'ἮΙ', 'ᾗ' => 'ἯΙ', 'ᾠ' => 'ὨΙ', 'ᾡ' => 'ὩΙ', 'ᾢ' => 'ὪΙ', 'ᾣ' => 'ὫΙ', 'ᾤ' => 'ὬΙ', 'ᾥ' => 'ὭΙ', 'ᾦ' => 'ὮΙ', 'ᾧ' => 'ὯΙ', 'ᾰ' => 'Ᾰ', 'ᾱ' => 'Ᾱ', 'ᾳ' => 'ΑΙ', 'ι' => 'Ι', 'ῃ' => 'ΗΙ', 'ῐ' => 'Ῐ', 'ῑ' => 'Ῑ', 'ῠ' => 'Ῠ', 'ῡ' => 'Ῡ', 'ῥ' => 'Ῥ', 'ῳ' => 'ΩΙ', 'ⅎ' => 'Ⅎ', 'ⅰ' => 'Ⅰ', 'ⅱ' => 'Ⅱ', 'ⅲ' => 'Ⅲ', 'ⅳ' => 'Ⅳ', 'ⅴ' => 'Ⅴ', 'ⅵ' => 'Ⅵ', 'ⅶ' => 'Ⅶ', 'ⅷ' => 'Ⅷ', 'ⅸ' => 'Ⅸ', 'ⅹ' => 'Ⅹ', 'ⅺ' => 'Ⅺ', 'ⅻ' => 'Ⅻ', 'ⅼ' => 'Ⅼ', 'ⅽ' => 'Ⅽ', 'ⅾ' => 'Ⅾ', 'ⅿ' => 'Ⅿ', 'ↄ' => 'Ↄ', 'ⓐ' => 'Ⓐ', 'ⓑ' => 'Ⓑ', 'ⓒ' => 'Ⓒ', 'ⓓ' => 'Ⓓ', 'ⓔ' => 'Ⓔ', 'ⓕ' => 'Ⓕ', 'ⓖ' => 'Ⓖ', 'ⓗ' => 'Ⓗ', 'ⓘ' => 'Ⓘ', 'ⓙ' => 'Ⓙ', 'ⓚ' => 'Ⓚ', 'ⓛ' => 'Ⓛ', 'ⓜ' => 'Ⓜ', 'ⓝ' => 'Ⓝ', 'ⓞ' => 'Ⓞ', 'ⓟ' => 'Ⓟ', 'ⓠ' => 'Ⓠ', 'ⓡ' => 'Ⓡ', 'ⓢ' => 'Ⓢ', 'ⓣ' => 'Ⓣ', 'ⓤ' => 'Ⓤ', 'ⓥ' => 'Ⓥ', 'ⓦ' => 'Ⓦ', 'ⓧ' => 'Ⓧ', 'ⓨ' => 'Ⓨ', 'ⓩ' => 'Ⓩ', 'ⰰ' => 'Ⰰ', 'ⰱ' => 'Ⰱ', 'ⰲ' => 'Ⰲ', 'ⰳ' => 'Ⰳ', 'ⰴ' => 'Ⰴ', 'ⰵ' => 'Ⰵ', 'ⰶ' => 'Ⰶ', 'ⰷ' => 'Ⰷ', 'ⰸ' => 'Ⰸ', 'ⰹ' => 'Ⰹ', 'ⰺ' => 'Ⰺ', 'ⰻ' => 'Ⰻ', 'ⰼ' => 'Ⰼ', 'ⰽ' => 'Ⰽ', 'ⰾ' => 'Ⰾ', 'ⰿ' => 'Ⰿ', 'ⱀ' => 'Ⱀ', 'ⱁ' => 'Ⱁ', 'ⱂ' => 'Ⱂ', 'ⱃ' => 'Ⱃ', 'ⱄ' => 'Ⱄ', 'ⱅ' => 'Ⱅ', 'ⱆ' => 'Ⱆ', 'ⱇ' => 'Ⱇ', 'ⱈ' => 'Ⱈ', 'ⱉ' => 'Ⱉ', 'ⱊ' => 'Ⱊ', 'ⱋ' => 'Ⱋ', 'ⱌ' => 'Ⱌ', 'ⱍ' => 'Ⱍ', 'ⱎ' => 'Ⱎ', 'ⱏ' => 'Ⱏ', 'ⱐ' => 'Ⱐ', 'ⱑ' => 'Ⱑ', 'ⱒ' => 'Ⱒ', 'ⱓ' => 'Ⱓ', 'ⱔ' => 'Ⱔ', 'ⱕ' => 'Ⱕ', 'ⱖ' => 'Ⱖ', 'ⱗ' => 'Ⱗ', 'ⱘ' => 'Ⱘ', 'ⱙ' => 'Ⱙ', 'ⱚ' => 'Ⱚ', 'ⱛ' => 'Ⱛ', 'ⱜ' => 'Ⱜ', 'ⱝ' => 'Ⱝ', 'ⱞ' => 'Ⱞ', 'ⱡ' => 'Ⱡ', 'ⱥ' => 'Ⱥ', 'ⱦ' => 'Ⱦ', 'ⱨ' => 'Ⱨ', 'ⱪ' => 'Ⱪ', 'ⱬ' => 'Ⱬ', 'ⱳ' => 'Ⱳ', 'ⱶ' => 'Ⱶ', 'ⲁ' => 'Ⲁ', 'ⲃ' => 'Ⲃ', 'ⲅ' => 'Ⲅ', 'ⲇ' => 'Ⲇ', 'ⲉ' => 'Ⲉ', 'ⲋ' => 'Ⲋ', 'ⲍ' => 'Ⲍ', 'ⲏ' => 'Ⲏ', 'ⲑ' => 'Ⲑ', 'ⲓ' => 'Ⲓ', 'ⲕ' => 'Ⲕ', 'ⲗ' => 'Ⲗ', 'ⲙ' => 'Ⲙ', 'ⲛ' => 'Ⲛ', 'ⲝ' => 'Ⲝ', 'ⲟ' => 'Ⲟ', 'ⲡ' => 'Ⲡ', 'ⲣ' => 'Ⲣ', 'ⲥ' => 'Ⲥ', 'ⲧ' => 'Ⲧ', 'ⲩ' => 'Ⲩ', 'ⲫ' => 'Ⲫ', 'ⲭ' => 'Ⲭ', 'ⲯ' => 'Ⲯ', 'ⲱ' => 'Ⲱ', 'ⲳ' => 'Ⲳ', 'ⲵ' => 'Ⲵ', 'ⲷ' => 'Ⲷ', 'ⲹ' => 'Ⲹ', 'ⲻ' => 'Ⲻ', 'ⲽ' => 'Ⲽ', 'ⲿ' => 'Ⲿ', 'ⳁ' => 'Ⳁ', 'ⳃ' => 'Ⳃ', 'ⳅ' => 'Ⳅ', 'ⳇ' => 'Ⳇ', 'ⳉ' => 'Ⳉ', 'ⳋ' => 'Ⳋ', 'ⳍ' => 'Ⳍ', 'ⳏ' => 'Ⳏ', 'ⳑ' => 'Ⳑ', 'ⳓ' => 'Ⳓ', 'ⳕ' => 'Ⳕ', 'ⳗ' => 'Ⳗ', 'ⳙ' => 'Ⳙ', 'ⳛ' => 'Ⳛ', 'ⳝ' => 'Ⳝ', 'ⳟ' => 'Ⳟ', 'ⳡ' => 'Ⳡ', 'ⳣ' => 'Ⳣ', 'ⳬ' => 'Ⳬ', 'ⳮ' => 'Ⳮ', 'ⳳ' => 'Ⳳ', 'ⴀ' => 'Ⴀ', 'ⴁ' => 'Ⴁ', 'ⴂ' => 'Ⴂ', 'ⴃ' => 'Ⴃ', 'ⴄ' => 'Ⴄ', 'ⴅ' => 'Ⴅ', 'ⴆ' => 'Ⴆ', 'ⴇ' => 'Ⴇ', 'ⴈ' => 'Ⴈ', 'ⴉ' => 'Ⴉ', 'ⴊ' => 'Ⴊ', 'ⴋ' => 'Ⴋ', 'ⴌ' => 'Ⴌ', 'ⴍ' => 'Ⴍ', 'ⴎ' => 'Ⴎ', 'ⴏ' => 'Ⴏ', 'ⴐ' => 'Ⴐ', 'ⴑ' => 'Ⴑ', 'ⴒ' => 'Ⴒ', 'ⴓ' => 'Ⴓ', 'ⴔ' => 'Ⴔ', 'ⴕ' => 'Ⴕ', 'ⴖ' => 'Ⴖ', 'ⴗ' => 'Ⴗ', 'ⴘ' => 'Ⴘ', 'ⴙ' => 'Ⴙ', 'ⴚ' => 'Ⴚ', 'ⴛ' => 'Ⴛ', 'ⴜ' => 'Ⴜ', 'ⴝ' => 'Ⴝ', 'ⴞ' => 'Ⴞ', 'ⴟ' => 'Ⴟ', 'ⴠ' => 'Ⴠ', 'ⴡ' => 'Ⴡ', 'ⴢ' => 'Ⴢ', 'ⴣ' => 'Ⴣ', 'ⴤ' => 'Ⴤ', 'ⴥ' => 'Ⴥ', 'ⴧ' => 'Ⴧ', 'ⴭ' => 'Ⴭ', 'ꙁ' => 'Ꙁ', 'ꙃ' => 'Ꙃ', 'ꙅ' => 'Ꙅ', 'ꙇ' => 'Ꙇ', 'ꙉ' => 'Ꙉ', 'ꙋ' => 'Ꙋ', 'ꙍ' => 'Ꙍ', 'ꙏ' => 'Ꙏ', 'ꙑ' => 'Ꙑ', 'ꙓ' => 'Ꙓ', 'ꙕ' => 'Ꙕ', 'ꙗ' => 'Ꙗ', 'ꙙ' => 'Ꙙ', 'ꙛ' => 'Ꙛ', 'ꙝ' => 'Ꙝ', 'ꙟ' => 'Ꙟ', 'ꙡ' => 'Ꙡ', 'ꙣ' => 'Ꙣ', 'ꙥ' => 'Ꙥ', 'ꙧ' => 'Ꙧ', 'ꙩ' => 'Ꙩ', 'ꙫ' => 'Ꙫ', 'ꙭ' => 'Ꙭ', 'ꚁ' => 'Ꚁ', 'ꚃ' => 'Ꚃ', 'ꚅ' => 'Ꚅ', 'ꚇ' => 'Ꚇ', 'ꚉ' => 'Ꚉ', 'ꚋ' => 'Ꚋ', 'ꚍ' => 'Ꚍ', 'ꚏ' => 'Ꚏ', 'ꚑ' => 'Ꚑ', 'ꚓ' => 'Ꚓ', 'ꚕ' => 'Ꚕ', 'ꚗ' => 'Ꚗ', 'ꚙ' => 'Ꚙ', 'ꚛ' => 'Ꚛ', 'ꜣ' => 'Ꜣ', 'ꜥ' => 'Ꜥ', 'ꜧ' => 'Ꜧ', 'ꜩ' => 'Ꜩ', 'ꜫ' => 'Ꜫ', 'ꜭ' => 'Ꜭ', 'ꜯ' => 'Ꜯ', 'ꜳ' => 'Ꜳ', 'ꜵ' => 'Ꜵ', 'ꜷ' => 'Ꜷ', 'ꜹ' => 'Ꜹ', 'ꜻ' => 'Ꜻ', 'ꜽ' => 'Ꜽ', 'ꜿ' => 'Ꜿ', 'ꝁ' => 'Ꝁ', 'ꝃ' => 'Ꝃ', 'ꝅ' => 'Ꝅ', 'ꝇ' => 'Ꝇ', 'ꝉ' => 'Ꝉ', 'ꝋ' => 'Ꝋ', 'ꝍ' => 'Ꝍ', 'ꝏ' => 'Ꝏ', 'ꝑ' => 'Ꝑ', 'ꝓ' => 'Ꝓ', 'ꝕ' => 'Ꝕ', 'ꝗ' => 'Ꝗ', 'ꝙ' => 'Ꝙ', 'ꝛ' => 'Ꝛ', 'ꝝ' => 'Ꝝ', 'ꝟ' => 'Ꝟ', 'ꝡ' => 'Ꝡ', 'ꝣ' => 'Ꝣ', 'ꝥ' => 'Ꝥ', 'ꝧ' => 'Ꝧ', 'ꝩ' => 'Ꝩ', 'ꝫ' => 'Ꝫ', 'ꝭ' => 'Ꝭ', 'ꝯ' => 'Ꝯ', 'ꝺ' => 'Ꝺ', 'ꝼ' => 'Ꝼ', 'ꝿ' => 'Ꝿ', 'ꞁ' => 'Ꞁ', 'ꞃ' => 'Ꞃ', 'ꞅ' => 'Ꞅ', 'ꞇ' => 'Ꞇ', 'ꞌ' => 'Ꞌ', 'ꞑ' => 'Ꞑ', 'ꞓ' => 'Ꞓ', 'ꞔ' => 'Ꞔ', 'ꞗ' => 'Ꞗ', 'ꞙ' => 'Ꞙ', 'ꞛ' => 'Ꞛ', 'ꞝ' => 'Ꞝ', 'ꞟ' => 'Ꞟ', 'ꞡ' => 'Ꞡ', 'ꞣ' => 'Ꞣ', 'ꞥ' => 'Ꞥ', 'ꞧ' => 'Ꞧ', 'ꞩ' => 'Ꞩ', 'ꞵ' => 'Ꞵ', 'ꞷ' => 'Ꞷ', 'ꞹ' => 'Ꞹ', 'ꞻ' => 'Ꞻ', 'ꞽ' => 'Ꞽ', 'ꞿ' => 'Ꞿ', 'ꟃ' => 'Ꟃ', 'ꟈ' => 'Ꟈ', 'ꟊ' => 'Ꟊ', 'ꟶ' => 'Ꟶ', 'ꭓ' => 'Ꭓ', 'ꭰ' => 'Ꭰ', 'ꭱ' => 'Ꭱ', 'ꭲ' => 'Ꭲ', 'ꭳ' => 'Ꭳ', 'ꭴ' => 'Ꭴ', 'ꭵ' => 'Ꭵ', 'ꭶ' => 'Ꭶ', 'ꭷ' => 'Ꭷ', 'ꭸ' => 'Ꭸ', 'ꭹ' => 'Ꭹ', 'ꭺ' => 'Ꭺ', 'ꭻ' => 'Ꭻ', 'ꭼ' => 'Ꭼ', 'ꭽ' => 'Ꭽ', 'ꭾ' => 'Ꭾ', 'ꭿ' => 'Ꭿ', 'ꮀ' => 'Ꮀ', 'ꮁ' => 'Ꮁ', 'ꮂ' => 'Ꮂ', 'ꮃ' => 'Ꮃ', 'ꮄ' => 'Ꮄ', 'ꮅ' => 'Ꮅ', 'ꮆ' => 'Ꮆ', 'ꮇ' => 'Ꮇ', 'ꮈ' => 'Ꮈ', 'ꮉ' => 'Ꮉ', 'ꮊ' => 'Ꮊ', 'ꮋ' => 'Ꮋ', 'ꮌ' => 'Ꮌ', 'ꮍ' => 'Ꮍ', 'ꮎ' => 'Ꮎ', 'ꮏ' => 'Ꮏ', 'ꮐ' => 'Ꮐ', 'ꮑ' => 'Ꮑ', 'ꮒ' => 'Ꮒ', 'ꮓ' => 'Ꮓ', 'ꮔ' => 'Ꮔ', 'ꮕ' => 'Ꮕ', 'ꮖ' => 'Ꮖ', 'ꮗ' => 'Ꮗ', 'ꮘ' => 'Ꮘ', 'ꮙ' => 'Ꮙ', 'ꮚ' => 'Ꮚ', 'ꮛ' => 'Ꮛ', 'ꮜ' => 'Ꮜ', 'ꮝ' => 'Ꮝ', 'ꮞ' => 'Ꮞ', 'ꮟ' => 'Ꮟ', 'ꮠ' => 'Ꮠ', 'ꮡ' => 'Ꮡ', 'ꮢ' => 'Ꮢ', 'ꮣ' => 'Ꮣ', 'ꮤ' => 'Ꮤ', 'ꮥ' => 'Ꮥ', 'ꮦ' => 'Ꮦ', 'ꮧ' => 'Ꮧ', 'ꮨ' => 'Ꮨ', 'ꮩ' => 'Ꮩ', 'ꮪ' => 'Ꮪ', 'ꮫ' => 'Ꮫ', 'ꮬ' => 'Ꮬ', 'ꮭ' => 'Ꮭ', 'ꮮ' => 'Ꮮ', 'ꮯ' => 'Ꮯ', 'ꮰ' => 'Ꮰ', 'ꮱ' => 'Ꮱ', 'ꮲ' => 'Ꮲ', 'ꮳ' => 'Ꮳ', 'ꮴ' => 'Ꮴ', 'ꮵ' => 'Ꮵ', 'ꮶ' => 'Ꮶ', 'ꮷ' => 'Ꮷ', 'ꮸ' => 'Ꮸ', 'ꮹ' => 'Ꮹ', 'ꮺ' => 'Ꮺ', 'ꮻ' => 'Ꮻ', 'ꮼ' => 'Ꮼ', 'ꮽ' => 'Ꮽ', 'ꮾ' => 'Ꮾ', 'ꮿ' => 'Ꮿ', 'a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', '𐐨' => '𐐀', '𐐩' => '𐐁', '𐐪' => '𐐂', '𐐫' => '𐐃', '𐐬' => '𐐄', '𐐭' => '𐐅', '𐐮' => '𐐆', '𐐯' => '𐐇', '𐐰' => '𐐈', '𐐱' => '𐐉', '𐐲' => '𐐊', '𐐳' => '𐐋', '𐐴' => '𐐌', '𐐵' => '𐐍', '𐐶' => '𐐎', '𐐷' => '𐐏', '𐐸' => '𐐐', '𐐹' => '𐐑', '𐐺' => '𐐒', '𐐻' => '𐐓', '𐐼' => '𐐔', '𐐽' => '𐐕', '𐐾' => '𐐖', '𐐿' => '𐐗', '𐑀' => '𐐘', '𐑁' => '𐐙', '𐑂' => '𐐚', '𐑃' => '𐐛', '𐑄' => '𐐜', '𐑅' => '𐐝', '𐑆' => '𐐞', '𐑇' => '𐐟', '𐑈' => '𐐠', '𐑉' => '𐐡', '𐑊' => '𐐢', '𐑋' => '𐐣', '𐑌' => '𐐤', '𐑍' => '𐐥', '𐑎' => '𐐦', '𐑏' => '𐐧', '𐓘' => '𐒰', '𐓙' => '𐒱', '𐓚' => '𐒲', '𐓛' => '𐒳', '𐓜' => '𐒴', '𐓝' => '𐒵', '𐓞' => '𐒶', '𐓟' => '𐒷', '𐓠' => '𐒸', '𐓡' => '𐒹', '𐓢' => '𐒺', '𐓣' => '𐒻', '𐓤' => '𐒼', '𐓥' => '𐒽', '𐓦' => '𐒾', '𐓧' => '𐒿', '𐓨' => '𐓀', '𐓩' => '𐓁', '𐓪' => '𐓂', '𐓫' => '𐓃', '𐓬' => '𐓄', '𐓭' => '𐓅', '𐓮' => '𐓆', '𐓯' => '𐓇', '𐓰' => '𐓈', '𐓱' => '𐓉', '𐓲' => '𐓊', '𐓳' => '𐓋', '𐓴' => '𐓌', '𐓵' => '𐓍', '𐓶' => '𐓎', '𐓷' => '𐓏', '𐓸' => '𐓐', '𐓹' => '𐓑', '𐓺' => '𐓒', '𐓻' => '𐓓', '𐳀' => '𐲀', '𐳁' => '𐲁', '𐳂' => '𐲂', '𐳃' => '𐲃', '𐳄' => '𐲄', '𐳅' => '𐲅', '𐳆' => '𐲆', '𐳇' => '𐲇', '𐳈' => '𐲈', '𐳉' => '𐲉', '𐳊' => '𐲊', '𐳋' => '𐲋', '𐳌' => '𐲌', '𐳍' => '𐲍', '𐳎' => '𐲎', '𐳏' => '𐲏', '𐳐' => '𐲐', '𐳑' => '𐲑', '𐳒' => '𐲒', '𐳓' => '𐲓', '𐳔' => '𐲔', '𐳕' => '𐲕', '𐳖' => '𐲖', '𐳗' => '𐲗', '𐳘' => '𐲘', '𐳙' => '𐲙', '𐳚' => '𐲚', '𐳛' => '𐲛', '𐳜' => '𐲜', '𐳝' => '𐲝', '𐳞' => '𐲞', '𐳟' => '𐲟', '𐳠' => '𐲠', '𐳡' => '𐲡', '𐳢' => '𐲢', '𐳣' => '𐲣', '𐳤' => '𐲤', '𐳥' => '𐲥', '𐳦' => '𐲦', '𐳧' => '𐲧', '𐳨' => '𐲨', '𐳩' => '𐲩', '𐳪' => '𐲪', '𐳫' => '𐲫', '𐳬' => '𐲬', '𐳭' => '𐲭', '𐳮' => '𐲮', '𐳯' => '𐲯', '𐳰' => '𐲰', '𐳱' => '𐲱', '𐳲' => '𐲲', '𑣀' => '𑢠', '𑣁' => '𑢡', '𑣂' => '𑢢', '𑣃' => '𑢣', '𑣄' => '𑢤', '𑣅' => '𑢥', '𑣆' => '𑢦', '𑣇' => '𑢧', '𑣈' => '𑢨', '𑣉' => '𑢩', '𑣊' => '𑢪', '𑣋' => '𑢫', '𑣌' => '𑢬', '𑣍' => '𑢭', '𑣎' => '𑢮', '𑣏' => '𑢯', '𑣐' => '𑢰', '𑣑' => '𑢱', '𑣒' => '𑢲', '𑣓' => '𑢳', '𑣔' => '𑢴', '𑣕' => '𑢵', '𑣖' => '𑢶', '𑣗' => '𑢷', '𑣘' => '𑢸', '𑣙' => '𑢹', '𑣚' => '𑢺', '𑣛' => '𑢻', '𑣜' => '𑢼', '𑣝' => '𑢽', '𑣞' => '𑢾', '𑣟' => '𑢿', '𖹠' => '𖹀', '𖹡' => '𖹁', '𖹢' => '𖹂', '𖹣' => '𖹃', '𖹤' => '𖹄', '𖹥' => '𖹅', '𖹦' => '𖹆', '𖹧' => '𖹇', '𖹨' => '𖹈', '𖹩' => '𖹉', '𖹪' => '𖹊', '𖹫' => '𖹋', '𖹬' => '𖹌', '𖹭' => '𖹍', '𖹮' => '𖹎', '𖹯' => '𖹏', '𖹰' => '𖹐', '𖹱' => '𖹑', '𖹲' => '𖹒', '𖹳' => '𖹓', '𖹴' => '𖹔', '𖹵' => '𖹕', '𖹶' => '𖹖', '𖹷' => '𖹗', '𖹸' => '𖹘', '𖹹' => '𖹙', '𖹺' => '𖹚', '𖹻' => '𖹛', '𖹼' => '𖹜', '𖹽' => '𖹝', '𖹾' => '𖹞', '𖹿' => '𖹟', '𞤢' => '𞤀', '𞤣' => '𞤁', '𞤤' => '𞤂', '𞤥' => '𞤃', '𞤦' => '𞤄', '𞤧' => '𞤅', '𞤨' => '𞤆', '𞤩' => '𞤇', '𞤪' => '𞤈', '𞤫' => '𞤉', '𞤬' => '𞤊', '𞤭' => '𞤋', '𞤮' => '𞤌', '𞤯' => '𞤍', '𞤰' => '𞤎', '𞤱' => '𞤏', '𞤲' => '𞤐', '𞤳' => '𞤑', '𞤴' => '𞤒', '𞤵' => '𞤓', '𞤶' => '𞤔', '𞤷' => '𞤕', '𞤸' => '𞤖', '𞤹' => '𞤗', '𞤺' => '𞤘', '𞤻' => '𞤙', '𞤼' => '𞤚', '𞤽' => '𞤛', '𞤾' => '𞤜', '𞤿' => '𞤝', '𞥀' => '𞤞', '𞥁' => '𞤟', '𞥂' => '𞤠', '𞥃' => '𞤡', 'ß' => 'SS', 'ff' => 'FF', 'fi' => 'FI', 'fl' => 'FL', 'ffi' => 'FFI', 'ffl' => 'FFL', 'ſt' => 'ST', 'st' => 'ST', 'և' => 'ԵՒ', 'ﬓ' => 'ՄՆ', 'ﬔ' => 'ՄԵ', 'ﬕ' => 'ՄԻ', 'ﬖ' => 'ՎՆ', 'ﬗ' => 'ՄԽ', 'ʼn' => 'ʼN', 'ΐ' => 'Ϊ́', 'ΰ' => 'Ϋ́', 'ǰ' => 'J̌', 'ẖ' => 'H̱', 'ẗ' => 'T̈', 'ẘ' => 'W̊', 'ẙ' => 'Y̊', 'ẚ' => 'Aʾ', 'ὐ' => 'Υ̓', 'ὒ' => 'Υ̓̀', 'ὔ' => 'Υ̓́', 'ὖ' => 'Υ̓͂', 'ᾶ' => 'Α͂', 'ῆ' => 'Η͂', 'ῒ' => 'Ϊ̀', 'ΐ' => 'Ϊ́', 'ῖ' => 'Ι͂', 'ῗ' => 'Ϊ͂', 'ῢ' => 'Ϋ̀', 'ΰ' => 'Ϋ́', 'ῤ' => 'Ρ̓', 'ῦ' => 'Υ͂', 'ῧ' => 'Ϋ͂', 'ῶ' => 'Ω͂', 'ᾈ' => 'ἈΙ', 'ᾉ' => 'ἉΙ', 'ᾊ' => 'ἊΙ', 'ᾋ' => 'ἋΙ', 'ᾌ' => 'ἌΙ', 'ᾍ' => 'ἍΙ', 'ᾎ' => 'ἎΙ', 'ᾏ' => 'ἏΙ', 'ᾘ' => 'ἨΙ', 'ᾙ' => 'ἩΙ', 'ᾚ' => 'ἪΙ', 'ᾛ' => 'ἫΙ', 'ᾜ' => 'ἬΙ', 'ᾝ' => 'ἭΙ', 'ᾞ' => 'ἮΙ', 'ᾟ' => 'ἯΙ', 'ᾨ' => 'ὨΙ', 'ᾩ' => 'ὩΙ', 'ᾪ' => 'ὪΙ', 'ᾫ' => 'ὫΙ', 'ᾬ' => 'ὬΙ', 'ᾭ' => 'ὭΙ', 'ᾮ' => 'ὮΙ', 'ᾯ' => 'ὯΙ', 'ᾼ' => 'ΑΙ', 'ῌ' => 'ΗΙ', 'ῼ' => 'ΩΙ', 'ᾲ' => 'ᾺΙ', 'ᾴ' => 'ΆΙ', 'ῂ' => 'ῊΙ', 'ῄ' => 'ΉΙ', 'ῲ' => 'ῺΙ', 'ῴ' => 'ΏΙ', 'ᾷ' => 'Α͂Ι', 'ῇ' => 'Η͂Ι', 'ῷ' => 'Ω͂Ι', ); PKCA#]�|�a a Wsystem/helixultimate/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.phpnu�[���<?php return [ 'İ' => 'i̇', 'µ' => 'μ', 'ſ' => 's', 'ͅ' => 'ι', 'ς' => 'σ', 'ϐ' => 'β', 'ϑ' => 'θ', 'ϕ' => 'φ', 'ϖ' => 'π', 'ϰ' => 'κ', 'ϱ' => 'ρ', 'ϵ' => 'ε', 'ẛ' => 'ṡ', 'ι' => 'ι', 'ß' => 'ss', 'ʼn' => 'ʼn', 'ǰ' => 'ǰ', 'ΐ' => 'ΐ', 'ΰ' => 'ΰ', 'և' => 'եւ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'ẘ' => 'ẘ', 'ẙ' => 'ẙ', 'ẚ' => 'aʾ', 'ẞ' => 'ss', 'ὐ' => 'ὐ', 'ὒ' => 'ὒ', 'ὔ' => 'ὔ', 'ὖ' => 'ὖ', 'ᾀ' => 'ἀι', 'ᾁ' => 'ἁι', 'ᾂ' => 'ἂι', 'ᾃ' => 'ἃι', 'ᾄ' => 'ἄι', 'ᾅ' => 'ἅι', 'ᾆ' => 'ἆι', 'ᾇ' => 'ἇι', 'ᾈ' => 'ἀι', 'ᾉ' => 'ἁι', 'ᾊ' => 'ἂι', 'ᾋ' => 'ἃι', 'ᾌ' => 'ἄι', 'ᾍ' => 'ἅι', 'ᾎ' => 'ἆι', 'ᾏ' => 'ἇι', 'ᾐ' => 'ἠι', 'ᾑ' => 'ἡι', 'ᾒ' => 'ἢι', 'ᾓ' => 'ἣι', 'ᾔ' => 'ἤι', 'ᾕ' => 'ἥι', 'ᾖ' => 'ἦι', 'ᾗ' => 'ἧι', 'ᾘ' => 'ἠι', 'ᾙ' => 'ἡι', 'ᾚ' => 'ἢι', 'ᾛ' => 'ἣι', 'ᾜ' => 'ἤι', 'ᾝ' => 'ἥι', 'ᾞ' => 'ἦι', 'ᾟ' => 'ἧι', 'ᾠ' => 'ὠι', 'ᾡ' => 'ὡι', 'ᾢ' => 'ὢι', 'ᾣ' => 'ὣι', 'ᾤ' => 'ὤι', 'ᾥ' => 'ὥι', 'ᾦ' => 'ὦι', 'ᾧ' => 'ὧι', 'ᾨ' => 'ὠι', 'ᾩ' => 'ὡι', 'ᾪ' => 'ὢι', 'ᾫ' => 'ὣι', 'ᾬ' => 'ὤι', 'ᾭ' => 'ὥι', 'ᾮ' => 'ὦι', 'ᾯ' => 'ὧι', 'ᾲ' => 'ὰι', 'ᾳ' => 'αι', 'ᾴ' => 'άι', 'ᾶ' => 'ᾶ', 'ᾷ' => 'ᾶι', 'ᾼ' => 'αι', 'ῂ' => 'ὴι', 'ῃ' => 'ηι', 'ῄ' => 'ήι', 'ῆ' => 'ῆ', 'ῇ' => 'ῆι', 'ῌ' => 'ηι', 'ῒ' => 'ῒ', 'ῖ' => 'ῖ', 'ῗ' => 'ῗ', 'ῢ' => 'ῢ', 'ῤ' => 'ῤ', 'ῦ' => 'ῦ', 'ῧ' => 'ῧ', 'ῲ' => 'ὼι', 'ῳ' => 'ωι', 'ῴ' => 'ώι', 'ῶ' => 'ῶ', 'ῷ' => 'ῶι', 'ῼ' => 'ωι', 'ff' => 'ff', 'fi' => 'fi', 'fl' => 'fl', 'ffi' => 'ffi', 'ffl' => 'ffl', 'ſt' => 'st', 'st' => 'st', 'ﬓ' => 'մն', 'ﬔ' => 'մե', 'ﬕ' => 'մի', 'ﬖ' => 'վն', 'ﬗ' => 'մխ', ]; PKCA#]��vE��Csystem/helixultimate/vendor/symfony/polyfill-mbstring/composer.jsonnu�[���{ "name": "symfony/polyfill-mbstring", "type": "library", "description": "Symfony polyfill for the Mbstring extension", "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=7.2", "ext-iconv": "*" }, "provide": { "ext-mbstring": "*" }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, "files": [ "bootstrap.php" ] }, "suggest": { "ext-mbstring": "For best performance" }, "minimum-stability": "dev", "extra": { "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } } } PKCA#]АH@kkCsystem/helixultimate/vendor/symfony/polyfill-mbstring/bootstrap.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID >= 80000) { return require __DIR__.'/bootstrap80.php'; } return require __DIR__.'/bootstrap72.php'; PKCA#]j�Q9@@@system/helixultimate/vendor/symfony/polyfill-ctype/bootstrap.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Ctype as p; if (\PHP_VERSION_ID >= 80000) { return require __DIR__.'/bootstrap80.php'; } if (!function_exists('ctype_alnum')) { function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); } } if (!function_exists('ctype_alpha')) { function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); } } if (!function_exists('ctype_cntrl')) { function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); } } if (!function_exists('ctype_digit')) { function ctype_digit($text) { return p\Ctype::ctype_digit($text); } } if (!function_exists('ctype_graph')) { function ctype_graph($text) { return p\Ctype::ctype_graph($text); } } if (!function_exists('ctype_lower')) { function ctype_lower($text) { return p\Ctype::ctype_lower($text); } } if (!function_exists('ctype_print')) { function ctype_print($text) { return p\Ctype::ctype_print($text); } } if (!function_exists('ctype_punct')) { function ctype_punct($text) { return p\Ctype::ctype_punct($text); } } if (!function_exists('ctype_space')) { function ctype_space($text) { return p\Ctype::ctype_space($text); } } if (!function_exists('ctype_upper')) { function ctype_upper($text) { return p\Ctype::ctype_upper($text); } } if (!function_exists('ctype_xdigit')) { function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); } } PKCA#]8����<system/helixultimate/vendor/symfony/polyfill-ctype/Ctype.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Polyfill\Ctype; /** * Ctype implementation through regex. * * @internal * * @author Gert de Pagter <BackEndTea@gmail.com> */ final class Ctype { /** * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. * * @see https://php.net/ctype-alnum * * @param mixed $text * * @return bool */ public static function ctype_alnum($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text); } /** * Returns TRUE if every character in text is a letter, FALSE otherwise. * * @see https://php.net/ctype-alpha * * @param mixed $text * * @return bool */ public static function ctype_alpha($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text); } /** * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. * * @see https://php.net/ctype-cntrl * * @param mixed $text * * @return bool */ public static function ctype_cntrl($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text); } /** * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. * * @see https://php.net/ctype-digit * * @param mixed $text * * @return bool */ public static function ctype_digit($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text); } /** * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. * * @see https://php.net/ctype-graph * * @param mixed $text * * @return bool */ public static function ctype_graph($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text); } /** * Returns TRUE if every character in text is a lowercase letter. * * @see https://php.net/ctype-lower * * @param mixed $text * * @return bool */ public static function ctype_lower($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text); } /** * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. * * @see https://php.net/ctype-print * * @param mixed $text * * @return bool */ public static function ctype_print($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text); } /** * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. * * @see https://php.net/ctype-punct * * @param mixed $text * * @return bool */ public static function ctype_punct($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text); } /** * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. * * @see https://php.net/ctype-space * * @param mixed $text * * @return bool */ public static function ctype_space($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text); } /** * Returns TRUE if every character in text is an uppercase letter. * * @see https://php.net/ctype-upper * * @param mixed $text * * @return bool */ public static function ctype_upper($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text); } /** * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. * * @see https://php.net/ctype-xdigit * * @param mixed $text * * @return bool */ public static function ctype_xdigit($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text); } /** * Converts integers to their char versions according to normal ctype behaviour, if needed. * * If an integer between -128 and 255 inclusive is provided, * it is interpreted as the ASCII value of a single character * (negative values have 256 added in order to allow characters in the Extended ASCII range). * Any other integer is interpreted as a string containing the decimal digits of the integer. * * @param mixed $int * @param string $function * * @return mixed */ private static function convert_int_to_char_for_ctype($int, $function) { if (\PHP_VERSION_ID >= 80100 && !\is_string($int)) { @trigger_error($function.'(): Argument of type '.get_debug_type($int).' will be interpreted as string in the future', \E_USER_DEPRECATED); } if (!\is_int($int)) { return $int; } if ($int < -128 || $int > 255) { return (string) $int; } if ($int < 0) { $int += 256; } return \chr($int); } } PKCA#]��e��@system/helixultimate/vendor/symfony/polyfill-ctype/composer.jsonnu�[���{ "name": "symfony/polyfill-ctype", "type": "library", "description": "Symfony polyfill for ctype functions", "keywords": ["polyfill", "compatibility", "portable", "ctype"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Gert de Pagter", "email": "BackEndTea@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=7.2" }, "provide": { "ext-ctype": "*" }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" }, "files": [ "bootstrap.php" ] }, "suggest": { "ext-ctype": "For best performance" }, "minimum-stability": "dev", "extra": { "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } } } PKCA#]�F)�rrBsystem/helixultimate/vendor/symfony/polyfill-ctype/bootstrap80.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Ctype as p; if (!function_exists('ctype_alnum')) { function ctype_alnum(mixed $text): bool { return p\Ctype::ctype_alnum($text); } } if (!function_exists('ctype_alpha')) { function ctype_alpha(mixed $text): bool { return p\Ctype::ctype_alpha($text); } } if (!function_exists('ctype_cntrl')) { function ctype_cntrl(mixed $text): bool { return p\Ctype::ctype_cntrl($text); } } if (!function_exists('ctype_digit')) { function ctype_digit(mixed $text): bool { return p\Ctype::ctype_digit($text); } } if (!function_exists('ctype_graph')) { function ctype_graph(mixed $text): bool { return p\Ctype::ctype_graph($text); } } if (!function_exists('ctype_lower')) { function ctype_lower(mixed $text): bool { return p\Ctype::ctype_lower($text); } } if (!function_exists('ctype_print')) { function ctype_print(mixed $text): bool { return p\Ctype::ctype_print($text); } } if (!function_exists('ctype_punct')) { function ctype_punct(mixed $text): bool { return p\Ctype::ctype_punct($text); } } if (!function_exists('ctype_space')) { function ctype_space(mixed $text): bool { return p\Ctype::ctype_space($text); } } if (!function_exists('ctype_upper')) { function ctype_upper(mixed $text): bool { return p\Ctype::ctype_upper($text); } } if (!function_exists('ctype_xdigit')) { function ctype_xdigit(mixed $text): bool { return p\Ctype::ctype_xdigit($text); } } PKCA#]�_�+�f�f7system/helixultimate/vendor/symfony/filesystem/Path.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Filesystem; use Symfony\Component\Filesystem\Exception\InvalidArgumentException; use Symfony\Component\Filesystem\Exception\RuntimeException; /** * Contains utility methods for handling path strings. * * The methods in this class are able to deal with both UNIX and Windows paths. * On Windows, backward slashes are normalized to forward slashes. On UNIX, * backward slashes are treated as valid filename characters and are not replaced. * All methods return normalized parts with no excess "." and ".." segments. * * @author Bernhard Schussek <bschussek@gmail.com> * @author Thomas Schulz <mail@king2500.net> * @author Théo Fidry <theo.fidry@gmail.com> */ final class Path { /** * The number of buffer entries that triggers a cleanup operation. */ private const CLEANUP_THRESHOLD = 1250; /** * The buffer size after the cleanup operation. */ private const CLEANUP_SIZE = 1000; /** * Buffers input/output of {@link canonicalize()}. * * @var array<string, string> */ private static array $buffer = []; private static int $bufferSize = 0; /** * Canonicalizes the given path. * * During normalization, all "." and ".." segments are removed as far as * possible. ".." segments at the beginning of relative paths are not removed. * On Windows, backward slashes are replaced by forward slashes ("/"). * * ```php * echo Path::canonicalize("../css/./style.css"); * // => ../css/style.css * ``` * * This method is able to deal with both UNIX and Windows paths. */ public static function canonicalize(string $path): string { if ('' === $path) { return ''; } // This method is called by many other methods in this class. Buffer // the canonicalized paths to make up for the severe performance // decrease. if (isset(self::$buffer[$path])) { return self::$buffer[$path]; } // Replace "~" with user's home directory. if ('~' === $path[0]) { $path = self::getHomeDirectory().substr($path, 1); } $path = self::normalize($path); [$root, $pathWithoutRoot] = self::split($path); $canonicalParts = self::findCanonicalParts($root, $pathWithoutRoot); // Add the root directory again self::$buffer[$path] = $canonicalPath = $root.implode('/', $canonicalParts); ++self::$bufferSize; // Clean up regularly to prevent memory leaks if (self::$bufferSize > self::CLEANUP_THRESHOLD) { self::$buffer = \array_slice(self::$buffer, -self::CLEANUP_SIZE, null, true); self::$bufferSize = self::CLEANUP_SIZE; } return $canonicalPath; } /** * Normalizes the given path. * * On Windows, backward slashes are replaced by forward slashes ("/"). * On UNIX, backward slashes are preserved as they are valid filename characters. * Contrary to {@link canonicalize()}, this method does not remove invalid * or dot path segments. Consequently, it is much more efficient and should * be used whenever the given path is known to be a valid, absolute system * path. */ public static function normalize(string $path): string { return '\\' === \DIRECTORY_SEPARATOR ? str_replace('\\', '/', $path) : $path; } /** * Returns the directory part of the path. * * This method is similar to PHP's dirname(), but handles various cases * where dirname() returns a weird result: * * - dirname() does not accept backslashes on UNIX * - dirname("C:/symfony") returns "C:", not "C:/" * - dirname("C:/") returns ".", not "C:/" * - dirname("C:") returns ".", not "C:/" * - dirname("symfony") returns ".", not "" * - dirname() does not canonicalize the result * * This method fixes these shortcomings and behaves like dirname() * otherwise. * * The result is a canonical path. * * @return string The canonical directory part. Returns the root directory * if the root directory is passed. Returns an empty string * if a relative path is passed that contains no slashes. * Returns an empty string if an empty string is passed. */ public static function getDirectory(string $path): string { if ('' === $path) { return ''; } $path = self::canonicalize($path); // Maintain scheme if (false !== $schemeSeparatorPosition = strpos($path, '://')) { $scheme = substr($path, 0, $schemeSeparatorPosition + 3); $path = substr($path, $schemeSeparatorPosition + 3); } else { $scheme = ''; } if (false === $dirSeparatorPosition = strrpos($path, '/')) { return ''; } // Directory equals root directory "/" if (0 === $dirSeparatorPosition) { return $scheme.'/'; } // Directory equals Windows root "C:/" if (2 === $dirSeparatorPosition && ctype_alpha($path[0]) && ':' === $path[1]) { return $scheme.substr($path, 0, 3); } return $scheme.substr($path, 0, $dirSeparatorPosition); } /** * Returns canonical path of the user's home directory. * * Supported operating systems: * * - UNIX * - Windows8 and upper * * If your operating system or environment isn't supported, an exception is thrown. * * The result is a canonical path. * * @throws RuntimeException If your operating system or environment isn't supported */ public static function getHomeDirectory(): string { // For UNIX support if (getenv('HOME')) { return self::canonicalize(getenv('HOME')); } // For >= Windows8 support if (getenv('HOMEDRIVE') && getenv('HOMEPATH')) { return self::canonicalize(getenv('HOMEDRIVE').getenv('HOMEPATH')); } throw new RuntimeException("Cannot find the home directory path: Your environment or operating system isn't supported."); } /** * Returns the root directory of a path. * * The result is a canonical path. * * @return string The canonical root directory. Returns an empty string if * the given path is relative or empty. */ public static function getRoot(string $path): string { if ('' === $path) { return ''; } // Maintain scheme if (false !== $schemeSeparatorPosition = strpos($path, '://')) { $scheme = substr($path, 0, $schemeSeparatorPosition + 3); $path = substr($path, $schemeSeparatorPosition + 3); } else { $scheme = ''; } $firstCharacter = $path[0]; if ('/' === $firstCharacter) { return $scheme.'/'; } if ('\\' !== \DIRECTORY_SEPARATOR) { return ''; } if ('\\' === $firstCharacter) { return $scheme.'/'; } $length = \strlen($path); // Windows root if ($length > 1 && ':' === $path[1] && ctype_alpha($firstCharacter)) { // Special case: "C:" if (2 === $length) { return $scheme.$path.'/'; } // Normal case: "C:/" or "C:\" if ('/' === $path[2] || '\\' === $path[2]) { return $scheme.$firstCharacter.$path[1].'/'; } } return ''; } /** * Returns the file name without the extension from a file path. * * @param string|null $extension if specified, only that extension is cut * off (may contain leading dot) */ public static function getFilenameWithoutExtension(string $path, ?string $extension = null): string { if ('' === $path) { return ''; } if (null !== $extension) { // remove extension and trailing dot return rtrim(basename($path, $extension), '.'); } return pathinfo($path, \PATHINFO_FILENAME); } /** * Returns the extension from a file path (without leading dot). * * @param bool $forceLowerCase forces the extension to be lower-case */ public static function getExtension(string $path, bool $forceLowerCase = false): string { if ('' === $path) { return ''; } $extension = pathinfo($path, \PATHINFO_EXTENSION); if ($forceLowerCase) { $extension = self::toLower($extension); } return $extension; } /** * Returns whether the path has an (or the specified) extension. * * @param string $path the path string * @param string|string[]|null $extensions if null or not provided, checks if * an extension exists, otherwise * checks for the specified extension * or array of extensions (with or * without leading dot) * @param bool $ignoreCase whether to ignore case-sensitivity */ public static function hasExtension(string $path, $extensions = null, bool $ignoreCase = false): bool { if ('' === $path) { return false; } $actualExtension = self::getExtension($path, $ignoreCase); // Only check if path has any extension if ([] === $extensions || null === $extensions) { return '' !== $actualExtension; } if (\is_string($extensions)) { $extensions = [$extensions]; } foreach ($extensions as $key => $extension) { if ($ignoreCase) { $extension = self::toLower($extension); } // remove leading '.' in extensions array $extensions[$key] = ltrim($extension, '.'); } return \in_array($actualExtension, $extensions, true); } /** * Changes the extension of a path string. * * @param string $path The path string with filename.ext to change. * @param string $extension new extension (with or without leading dot) * * @return string the path string with new file extension */ public static function changeExtension(string $path, string $extension): string { if ('' === $path) { return ''; } $actualExtension = self::getExtension($path); $extension = ltrim($extension, '.'); // No extension for paths if (str_ends_with($path, '/')) { return $path; } // No actual extension in path if (!$actualExtension) { return $path.(str_ends_with($path, '.') ? '' : '.').$extension; } return substr($path, 0, -\strlen($actualExtension)).$extension; } /** * Returns whether the given path is absolute. */ public static function isAbsolute(string $path): bool { if ('' === $path) { return false; } // URLs and stream wrappers are considered absolute if (str_contains($path, '://') && null !== parse_url($path, \PHP_URL_SCHEME)) { return true; } if ('/' === $path[0]) { return true; } if ('\\' !== \DIRECTORY_SEPARATOR) { return false; } if ('\\' === $path[0]) { return true; } // Windows root if (\strlen($path) > 1 && ctype_alpha($path[0]) && ':' === $path[1]) { // Special case: "C:" if (2 === \strlen($path)) { return true; } // Normal case: "C:/" or "C:\" if ('/' === $path[2] || '\\' === $path[2]) { return true; } } return false; } public static function isRelative(string $path): bool { return !self::isAbsolute($path); } /** * Turns a relative path into an absolute path in canonical form. * * Usually, the relative path is appended to the given base path. Dot * segments ("." and "..") are removed/collapsed and all slashes turned * into forward slashes. * * ```php * echo Path::makeAbsolute("../style.css", "/symfony/puli/css"); * // => /symfony/puli/style.css * ``` * * If an absolute path is passed, that path is returned unless its root * directory is different than the one of the base path. In that case, an * exception is thrown. * * ```php * Path::makeAbsolute("/style.css", "/symfony/puli/css"); * // => /style.css * * Path::makeAbsolute("C:/style.css", "C:/symfony/puli/css"); * // => C:/style.css * * Path::makeAbsolute("C:/style.css", "/symfony/puli/css"); * // InvalidArgumentException * ``` * * If the base path is not an absolute path, an exception is thrown. * * The result is a canonical path. * * @param string $basePath an absolute base path * * @throws InvalidArgumentException if the base path is not absolute or if * the given path is an absolute path with * a different root than the base path */ public static function makeAbsolute(string $path, string $basePath): string { if ('' === $basePath) { throw new InvalidArgumentException(\sprintf('The base path must be a non-empty string. Got: "%s".', $basePath)); } if (!self::isAbsolute($basePath)) { throw new InvalidArgumentException(\sprintf('The base path "%s" is not an absolute path.', $basePath)); } if (self::isAbsolute($path)) { return self::canonicalize($path); } if (false !== $schemeSeparatorPosition = strpos($basePath, '://')) { $scheme = substr($basePath, 0, $schemeSeparatorPosition + 3); $basePath = substr($basePath, $schemeSeparatorPosition + 3); } else { $scheme = ''; } return $scheme.self::canonicalize(rtrim($basePath, '/'.\DIRECTORY_SEPARATOR).'/'.$path); } /** * Turns a path into a relative path. * * The relative path is created relative to the given base path: * * ```php * echo Path::makeRelative("/symfony/style.css", "/symfony/puli"); * // => ../style.css * ``` * * If a relative path is passed and the base path is absolute, the relative * path is returned unchanged: * * ```php * Path::makeRelative("style.css", "/symfony/puli/css"); * // => style.css * ``` * * If both paths are relative, the relative path is created with the * assumption that both paths are relative to the same directory: * * ```php * Path::makeRelative("style.css", "symfony/puli/css"); * // => ../../../style.css * ``` * * If both paths are absolute, their root directory must be the same, * otherwise an exception is thrown: * * ```php * Path::makeRelative("C:/symfony/style.css", "/symfony/puli"); * // InvalidArgumentException * ``` * * If the passed path is absolute, but the base path is not, an exception * is thrown as well: * * ```php * Path::makeRelative("/symfony/style.css", "symfony/puli"); * // InvalidArgumentException * ``` * * If the base path is not an absolute path, an exception is thrown. * * The result is a canonical path. * * @throws InvalidArgumentException if the base path is not absolute or if * the given path has a different root * than the base path */ public static function makeRelative(string $path, string $basePath): string { $path = self::canonicalize($path); $basePath = self::canonicalize($basePath); [$root, $relativePath] = self::split($path); [$baseRoot, $relativeBasePath] = self::split($basePath); // If the base path is given as absolute path and the path is already // relative, consider it to be relative to the given absolute path // already if ('' === $root && '' !== $baseRoot) { // If base path is already in its root if ('' === $relativeBasePath) { $relativePath = ltrim($relativePath, './'.\DIRECTORY_SEPARATOR); } return $relativePath; } // If the passed path is absolute, but the base path is not, we // cannot generate a relative path if ('' !== $root && '' === $baseRoot) { throw new InvalidArgumentException(\sprintf('The absolute path "%s" cannot be made relative to the relative path "%s". You should provide an absolute base path instead.', $path, $basePath)); } // Fail if the roots of the two paths are different if ($baseRoot && $root !== $baseRoot) { throw new InvalidArgumentException(\sprintf('The path "%s" cannot be made relative to "%s", because they have different roots ("%s" and "%s").', $path, $basePath, $root, $baseRoot)); } if ('' === $relativeBasePath) { return $relativePath; } // Build a "../../" prefix with as many "../" parts as necessary $parts = explode('/', $relativePath); $baseParts = explode('/', $relativeBasePath); $dotDotPrefix = ''; // Once we found a non-matching part in the prefix, we need to add // "../" parts for all remaining parts $match = true; foreach ($baseParts as $index => $basePart) { if ($match && isset($parts[$index]) && $basePart === $parts[$index]) { unset($parts[$index]); continue; } $match = false; $dotDotPrefix .= '../'; } return rtrim($dotDotPrefix.implode('/', $parts), '/'); } /** * Returns whether the given path is on the local filesystem. */ public static function isLocal(string $path): bool { return '' !== $path && !str_contains($path, '://'); } /** * Returns the longest common base path in canonical form of a set of paths or * `null` if the paths are on different Windows partitions. * * Dot segments ("." and "..") are removed/collapsed and all slashes turned * into forward slashes. * * ```php * $basePath = Path::getLongestCommonBasePath( * '/symfony/css/style.css', * '/symfony/css/..' * ); * // => /symfony * ``` * * The root is returned if no common base path can be found: * * ```php * $basePath = Path::getLongestCommonBasePath( * '/symfony/css/style.css', * '/puli/css/..' * ); * // => / * ``` * * If the paths are located on different Windows partitions, `null` is * returned. * * ```php * $basePath = Path::getLongestCommonBasePath( * 'C:/symfony/css/style.css', * 'D:/symfony/css/..' * ); * // => null * ``` */ public static function getLongestCommonBasePath(string ...$paths): ?string { [$bpRoot, $basePath] = self::split(self::canonicalize(reset($paths))); for (next($paths); null !== key($paths) && '' !== $basePath; next($paths)) { [$root, $path] = self::split(self::canonicalize(current($paths))); // If we deal with different roots (e.g. C:/ vs. D:/), it's time // to quit if ($root !== $bpRoot) { return null; } // Make the base path shorter until it fits into path while (true) { if ('.' === $basePath) { // No more base paths $basePath = ''; // next path continue 2; } // Prevent false positives for common prefixes // see isBasePath() if (str_starts_with($path.'/', $basePath.'/')) { // next path continue 2; } $basePath = \dirname($basePath); } } return $bpRoot.$basePath; } /** * Joins two or more path strings into a canonical path. */ public static function join(string ...$paths): string { $finalPath = null; $wasScheme = false; foreach ($paths as $path) { if ('' === $path) { continue; } if (null === $finalPath) { // For first part we keep slashes, like '/top', 'C:\' or 'phar://' $finalPath = $path; $wasScheme = str_contains($path, '://'); continue; } // Only add slash if previous part didn't end with '/' or '\' (Windows) if ('/' !== substr($finalPath, -1) && \DIRECTORY_SEPARATOR !== substr($finalPath, -1)) { $finalPath .= '/'; } // If first part included a scheme like 'phar://' we allow \current part to start with '/', otherwise trim $finalPath .= $wasScheme ? $path : ltrim($path, '/'); $wasScheme = false; } if (null === $finalPath) { return ''; } return self::canonicalize($finalPath); } /** * Returns whether a path is a base path of another path. * * Dot segments ("." and "..") are removed/collapsed and all slashes turned * into forward slashes. * * ```php * Path::isBasePath('/symfony', '/symfony/css'); * // => true * * Path::isBasePath('/symfony', '/symfony'); * // => true * * Path::isBasePath('/symfony', '/symfony/..'); * // => false * * Path::isBasePath('/symfony', '/puli'); * // => false * ``` */ public static function isBasePath(string $basePath, string $ofPath): bool { $basePath = self::canonicalize($basePath); $ofPath = self::canonicalize($ofPath); // Append slashes to prevent false positives when two paths have // a common prefix, for example /base/foo and /base/foobar. // Don't append a slash for the root "/", because then that root // won't be discovered as common prefix ("//" is not a prefix of // "/foobar/"). return str_starts_with($ofPath.'/', rtrim($basePath, '/').'/'); } /** * @return string[] */ private static function findCanonicalParts(string $root, string $pathWithoutRoot): array { $parts = explode('/', $pathWithoutRoot); $canonicalParts = []; // Collapse "." and "..", if possible foreach ($parts as $part) { if ('.' === $part || '' === $part) { continue; } // Collapse ".." with the previous part, if one exists // Don't collapse ".." if the previous part is also ".." if ('..' === $part && \count($canonicalParts) > 0 && '..' !== $canonicalParts[\count($canonicalParts) - 1]) { array_pop($canonicalParts); continue; } // Only add ".." prefixes for relative paths if ('..' !== $part || '' === $root) { $canonicalParts[] = $part; } } return $canonicalParts; } /** * Splits a canonical path into its root directory and the remainder. * * If the path has no root directory, an empty root directory will be * returned. * * If the root directory is a Windows style partition, the resulting root * will always contain a trailing slash. * * list ($root, $path) = Path::split("C:/symfony") * // => ["C:/", "symfony"] * * list ($root, $path) = Path::split("C:") * // => ["C:/", ""] * * @return array{string, string} an array with the root directory and the remaining relative path */ private static function split(string $path): array { if ('' === $path) { return ['', '']; } // Remember scheme as part of the root, if any if (false !== $schemeSeparatorPosition = strpos($path, '://')) { $root = substr($path, 0, $schemeSeparatorPosition + 3); $path = substr($path, $schemeSeparatorPosition + 3); } else { $root = ''; } $length = \strlen($path); // Remove and remember root directory if (str_starts_with($path, '/')) { $root .= '/'; $path = $length > 1 ? substr($path, 1) : ''; } elseif ('\\' === \DIRECTORY_SEPARATOR && $length > 1 && ctype_alpha($path[0]) && ':' === $path[1]) { if (2 === $length) { // Windows special case: "C:" $root .= $path.'/'; $path = ''; } elseif ('/' === $path[2]) { // Windows normal case: "C:/".. $root .= substr($path, 0, 3); $path = $length > 3 ? substr($path, 3) : ''; } } return [$root, $path]; } private static function toLower(string $string): string { if (false !== $encoding = mb_detect_encoding($string, null, true)) { return mb_strtolower($string, $encoding); } return strtolower($string); } private function __construct() { } } PKCA#]�*����Usystem/helixultimate/vendor/symfony/filesystem/Exception/InvalidArgumentException.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Filesystem\Exception; /** * @author Christian Flothmann <christian.flothmann@sensiolabs.de> */ class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface { } PKCA#]i�Ҫ�Msystem/helixultimate/vendor/symfony/filesystem/Exception/RuntimeException.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Filesystem\Exception; /** * @author Théo Fidry <theo.fidry@gmail.com> */ class RuntimeException extends \RuntimeException implements ExceptionInterface { } PKCA#]'~i���Qsystem/helixultimate/vendor/symfony/filesystem/Exception/IOExceptionInterface.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Filesystem\Exception; /** * IOException interface for file and input/output stream related exceptions thrown by the component. * * @author Christian Gärtner <christiangaertner.film@googlemail.com> */ interface IOExceptionInterface extends ExceptionInterface { /** * Returns the associated path for the exception. */ public function getPath(): ?string; } PKCA#]<\�P��Rsystem/helixultimate/vendor/symfony/filesystem/Exception/FileNotFoundException.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Filesystem\Exception; /** * Exception class thrown when a file couldn't be found. * * @author Fabien Potencier <fabien@symfony.com> * @author Christian Gärtner <christiangaertner.film@googlemail.com> */ class FileNotFoundException extends IOException { public function __construct(?string $message = null, int $code = 0, ?\Throwable $previous = null, ?string $path = null) { if (null === $message) { if (null === $path) { $message = 'File could not be found.'; } else { $message = \sprintf('File "%s" could not be found.', $path); } } parent::__construct($message, $code, $previous, $path); } } PKCA#]�aW���Hsystem/helixultimate/vendor/symfony/filesystem/Exception/IOException.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Filesystem\Exception; /** * Exception class thrown when a filesystem operation failure happens. * * @author Romain Neutron <imprec@gmail.com> * @author Christian Gärtner <christiangaertner.film@googlemail.com> * @author Fabien Potencier <fabien@symfony.com> */ class IOException extends \RuntimeException implements IOExceptionInterface { public function __construct( string $message, int $code = 0, ?\Throwable $previous = null, private ?string $path = null, ) { parent::__construct($message, $code, $previous); } public function getPath(): ?string { return $this->path; } } PKCA#] n�j��Osystem/helixultimate/vendor/symfony/filesystem/Exception/ExceptionInterface.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Filesystem\Exception; /** * Exception interface for all exceptions thrown by the component. * * @author Romain Neutron <imprec@gmail.com> */ interface ExceptionInterface extends \Throwable { } PKCA#]}�gMM<system/helixultimate/vendor/symfony/filesystem/composer.jsonnu�[���{ "name": "symfony/filesystem", "type": "library", "description": "Provides basic utilities for the filesystem", "keywords": [], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { "symfony/process": "^6.4|^7.0|^8.0" }, "autoload": { "psr-4": { "Symfony\\Component\\Filesystem\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "minimum-stability": "dev" } PKCA#]S��u�u=system/helixultimate/vendor/symfony/filesystem/Filesystem.phpnu�[���<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Filesystem; use Symfony\Component\Filesystem\Exception\FileNotFoundException; use Symfony\Component\Filesystem\Exception\InvalidArgumentException; use Symfony\Component\Filesystem\Exception\IOException; /** * Provides basic utility to manipulate the file system. * * @author Fabien Potencier <fabien@symfony.com> */ class Filesystem { private static ?string $lastError = null; /** * Copies a file. * * If the target file is older than the origin file, it's always overwritten. * If the target file is newer, it is overwritten only when the * $overwriteNewerFiles option is set to true. * * @throws FileNotFoundException When originFile doesn't exist * @throws IOException When copy fails */ public function copy(string $originFile, string $targetFile, bool $overwriteNewerFiles = false): void { $originIsLocal = stream_is_local($originFile) || 0 === stripos($originFile, 'file://'); if ($originIsLocal && !is_file($originFile)) { throw new FileNotFoundException(\sprintf('Failed to copy "%s" because file does not exist.', $originFile), 0, null, $originFile); } $this->mkdir(\dirname($targetFile)); $doCopy = true; if (!$overwriteNewerFiles && !parse_url($originFile, \PHP_URL_HOST) && is_file($targetFile)) { $doCopy = filemtime($originFile) > filemtime($targetFile); } if ($doCopy) { // https://bugs.php.net/64634 if (!$source = self::box('fopen', $originFile, 'r')) { throw new IOException(\sprintf('Failed to copy "%s" to "%s" because source file could not be opened for reading: ', $originFile, $targetFile).self::$lastError, 0, null, $originFile); } // Stream context created to allow files overwrite when using FTP stream wrapper - disabled by default if (!$target = self::box('fopen', $targetFile, 'w', false, stream_context_create(['ftp' => ['overwrite' => true]]))) { throw new IOException(\sprintf('Failed to copy "%s" to "%s" because target file could not be opened for writing: ', $originFile, $targetFile).self::$lastError, 0, null, $originFile); } $bytesCopied = stream_copy_to_stream($source, $target); fclose($source); fclose($target); unset($source, $target); if (!is_file($targetFile)) { throw new IOException(\sprintf('Failed to copy "%s" to "%s".', $originFile, $targetFile), 0, null, $originFile); } if ($originIsLocal) { // Like `cp`, preserve the source mode masked by the umask self::box('chmod', $targetFile, fileperms($originFile) & 0o777 & ~umask()); // Like `cp`, preserve the file modification time self::box('touch', $targetFile, filemtime($originFile)); if ($bytesCopied !== $bytesOrigin = filesize($originFile)) { throw new IOException(\sprintf('Failed to copy the whole content of "%s" to "%s" (%g of %g bytes copied).', $originFile, $targetFile, $bytesCopied, $bytesOrigin), 0, null, $originFile); } } } } /** * Creates a directory recursively. * * @throws IOException On any directory creation failure */ public function mkdir(string|iterable $dirs, int $mode = 0o777): void { foreach ($this->toIterable($dirs) as $dir) { if (is_dir($dir)) { continue; } if (!self::box('mkdir', $dir, $mode, true) && !is_dir($dir)) { throw new IOException(\sprintf('Failed to create "%s": ', $dir).self::$lastError, 0, null, $dir); } } } /** * Checks the existence of files or directories. */ public function exists(string|iterable $files): bool { $maxPathLength = \PHP_MAXPATHLEN - 2; foreach ($this->toIterable($files) as $file) { if (\strlen($file) > $maxPathLength) { throw new IOException(\sprintf('Could not check if file exist because path length exceeds %d characters.', $maxPathLength), 0, null, $file); } if (!file_exists($file)) { return false; } } return true; } /** * Sets access and modification time of file. * * @param int|null $time The touch time as a Unix timestamp, if not supplied the current system time is used * @param int|null $atime The access time as a Unix timestamp, if not supplied the current system time is used * * @throws IOException When touch fails */ public function touch(string|iterable $files, ?int $time = null, ?int $atime = null): void { foreach ($this->toIterable($files) as $file) { if (!($time ? self::box('touch', $file, $time, $atime) : self::box('touch', $file))) { throw new IOException(\sprintf('Failed to touch "%s": ', $file).self::$lastError, 0, null, $file); } } } /** * Removes files or directories. * * @throws IOException When removal fails */ public function remove(string|iterable $files): void { if ($files instanceof \Traversable) { $files = iterator_to_array($files, false); } elseif (!\is_array($files)) { $files = [$files]; } self::doRemove($files, false); } private static function doRemove(array $files, bool $isRecursive): void { $files = array_reverse($files); foreach ($files as $file) { if (is_link($file)) { // See https://bugs.php.net/52176 if (!(self::box('unlink', $file) || '\\' !== \DIRECTORY_SEPARATOR || self::box('rmdir', $file)) && file_exists($file)) { throw new IOException(\sprintf('Failed to remove symlink "%s": ', $file).self::$lastError); } } elseif (is_dir($file)) { if (!$isRecursive) { $tmpName = \dirname(realpath($file)).'/.!'.strrev(strtr(base64_encode(random_bytes(2)), '/=', '-!')); if (file_exists($tmpName)) { try { self::doRemove([$tmpName], true); } catch (IOException) { } } if (!file_exists($tmpName) && self::box('rename', $file, $tmpName)) { $origFile = $file; $file = $tmpName; } else { $origFile = null; } } $filesystemIterator = new \FilesystemIterator($file, \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS); self::doRemove(iterator_to_array($filesystemIterator, true), true); if (!self::box('rmdir', $file) && file_exists($file) && !$isRecursive) { $lastError = self::$lastError; if (null !== $origFile && self::box('rename', $file, $origFile)) { $file = $origFile; } throw new IOException(\sprintf('Failed to remove directory "%s": ', $file).$lastError); } } elseif (!self::box('unlink', $file) && ((self::$lastError && str_contains(self::$lastError, 'Permission denied')) || file_exists($file))) { throw new IOException(\sprintf('Failed to remove file "%s": ', $file).self::$lastError); } } } /** * Change mode for an array of files or directories. * * @param int $mode The new mode (octal) * @param int $umask The mode mask (octal) * @param bool $recursive Whether change the mod recursively or not * * @throws IOException When the change fails */ public function chmod(string|iterable $files, int $mode, int $umask = 0o000, bool $recursive = false): void { foreach ($this->toIterable($files) as $file) { if (!self::box('chmod', $file, $mode & ~$umask)) { throw new IOException(\sprintf('Failed to chmod file "%s": ', $file).self::$lastError, 0, null, $file); } if ($recursive && is_dir($file) && !is_link($file)) { $this->chmod(new \FilesystemIterator($file), $mode, $umask, true); } } } /** * Change the owner of an array of files or directories. * * This method always throws on Windows, as the underlying PHP function is not supported. * * @see https://php.net/chown * * @param string|int $user A user name or number * @param bool $recursive Whether change the owner recursively or not * * @throws IOException When the change fails */ public function chown(string|iterable $files, string|int $user, bool $recursive = false): void { foreach ($this->toIterable($files) as $file) { if ($recursive && is_dir($file) && !is_link($file)) { $this->chown(new \FilesystemIterator($file), $user, true); } if (is_link($file) && \function_exists('lchown')) { if (!self::box('lchown', $file, $user)) { throw new IOException(\sprintf('Failed to chown file "%s": ', $file).self::$lastError, 0, null, $file); } } else { if (!self::box('chown', $file, $user)) { throw new IOException(\sprintf('Failed to chown file "%s": ', $file).self::$lastError, 0, null, $file); } } } } /** * Change the group of an array of files or directories. * * This method always throws on Windows, as the underlying PHP function is not supported. * * @see https://php.net/chgrp * * @param string|int $group A group name or number * @param bool $recursive Whether change the group recursively or not * * @throws IOException When the change fails */ public function chgrp(string|iterable $files, string|int $group, bool $recursive = false): void { foreach ($this->toIterable($files) as $file) { if ($recursive && is_dir($file) && !is_link($file)) { $this->chgrp(new \FilesystemIterator($file), $group, true); } if (is_link($file) && \function_exists('lchgrp')) { if (!self::box('lchgrp', $file, $group)) { throw new IOException(\sprintf('Failed to chgrp file "%s": ', $file).self::$lastError, 0, null, $file); } } else { if (!self::box('chgrp', $file, $group)) { throw new IOException(\sprintf('Failed to chgrp file "%s": ', $file).self::$lastError, 0, null, $file); } } } } /** * Renames a file or a directory. * * @throws IOException When target file or directory already exists * @throws IOException When origin cannot be renamed */ public function rename(string $origin, string $target, bool $overwrite = false): void { // we check that target does not exist if (!$overwrite && $this->isReadable($target)) { throw new IOException(\sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target); } if (!self::box('rename', $origin, $target)) { if (is_dir($origin)) { // See https://bugs.php.net/54097 & https://php.net/rename#113943 $this->mirror($origin, $target, null, ['override' => $overwrite, 'delete' => $overwrite]); $this->remove($origin); return; } throw new IOException(\sprintf('Cannot rename "%s" to "%s": ', $origin, $target).self::$lastError, 0, null, $target); } } /** * Tells whether a file exists and is readable. * * @throws IOException When windows path is longer than 258 characters */ private function isReadable(string $filename): bool { $maxPathLength = \PHP_MAXPATHLEN - 2; if (\strlen($filename) > $maxPathLength) { throw new IOException(\sprintf('Could not check if file is readable because path length exceeds %d characters.', $maxPathLength), 0, null, $filename); } return is_readable($filename); } /** * Creates a symbolic link or copy a directory. * * @throws IOException When symlink fails */ public function symlink(string $originDir, string $targetDir, bool $copyOnWindows = false): void { self::assertFunctionExists('symlink'); if ('\\' === \DIRECTORY_SEPARATOR) { $originDir = strtr($originDir, '/', '\\'); $targetDir = strtr($targetDir, '/', '\\'); if ($copyOnWindows) { $this->mirror($originDir, $targetDir); return; } } $this->mkdir(\dirname($targetDir)); if (is_link($targetDir)) { if (readlink($targetDir) === $originDir) { return; } $this->remove($targetDir); } if (!self::box('symlink', $originDir, $targetDir)) { $this->linkException($originDir, $targetDir, 'symbolic'); } } /** * Creates a hard link, or several hard links to a file. * * @param string|string[] $targetFiles The target file(s) * * @throws FileNotFoundException When original file is missing or not a file * @throws IOException When link fails, including if link already exists */ public function hardlink(string $originFile, string|iterable $targetFiles): void { self::assertFunctionExists('link'); if (!$this->exists($originFile)) { throw new FileNotFoundException(null, 0, null, $originFile); } if (!is_file($originFile)) { throw new FileNotFoundException(\sprintf('Origin file "%s" is not a file.', $originFile)); } foreach ($this->toIterable($targetFiles) as $targetFile) { if (is_file($targetFile)) { if (fileinode($originFile) === fileinode($targetFile)) { continue; } $this->remove($targetFile); } if (!self::box('link', $originFile, $targetFile)) { $this->linkException($originFile, $targetFile, 'hard'); } } } /** * @param string $linkType Name of the link type, typically 'symbolic' or 'hard' */ private function linkException(string $origin, string $target, string $linkType): never { if (self::$lastError) { if ('\\' === \DIRECTORY_SEPARATOR && str_contains(self::$lastError, 'error code(1314)')) { throw new IOException(\sprintf('Unable to create "%s" link due to error code 1314: \'A required privilege is not held by the client\'. Do you have the required Administrator-rights?', $linkType), 0, null, $target); } } throw new IOException(\sprintf('Failed to create "%s" link from "%s" to "%s": ', $linkType, $origin, $target).self::$lastError, 0, null, $target); } /** * Resolves links in paths. * * With $canonicalize = false (default) * - if $path does not exist or is not a link, returns null * - if $path is a link, returns the next direct target of the link without considering the existence of the target * * With $canonicalize = true * - if $path does not exist, returns null * - if $path exists, returns its absolute fully resolved final version */ public function readlink(string $path, bool $canonicalize = false): ?string { if (!$canonicalize && !is_link($path)) { return null; } if ($canonicalize) { if (!$this->exists($path)) { return null; } return realpath($path); } return readlink($path); } /** * Given an existing path, convert it to a path relative to a given starting path. */ public function makePathRelative(string $endPath, string $startPath): string { if (!$this->isAbsolutePath($startPath)) { throw new InvalidArgumentException(\sprintf('The start path "%s" is not absolute.', $startPath)); } if (!$this->isAbsolutePath($endPath)) { throw new InvalidArgumentException(\sprintf('The end path "%s" is not absolute.', $endPath)); } $originalEndPath = $endPath; // Normalize separators on Windows if ('\\' === \DIRECTORY_SEPARATOR) { $endPath = str_replace('\\', '/', $endPath); $startPath = str_replace('\\', '/', $startPath); } $splitDriveLetter = static fn ($path) => (\strlen($path) > 2 && ':' === $path[1] && '/' === $path[2] && ctype_alpha($path[0])) ? [substr($path, 2), strtoupper($path[0])] : [$path, null]; $splitPath = static function ($path) { $result = []; foreach (explode('/', trim($path, '/')) as $segment) { if ('..' === $segment) { array_pop($result); } elseif ('.' !== $segment && '' !== $segment) { $result[] = $segment; } } return $result; }; [$endPath, $endDriveLetter] = $splitDriveLetter($endPath); [$startPath, $startDriveLetter] = $splitDriveLetter($startPath); $startPathArr = $splitPath($startPath); $endPathArr = $splitPath($endPath); if ($endDriveLetter && $startDriveLetter && $endDriveLetter != $startDriveLetter) { // End path is on another drive, so no relative path exists return $endDriveLetter.':/'.($endPathArr ? implode('/', $endPathArr).'/' : ''); } // Find for which directory the common path stops $index = 0; while (isset($startPathArr[$index]) && isset($endPathArr[$index]) && $startPathArr[$index] === $endPathArr[$index]) { ++$index; } // Determine how deep the start path is relative to the common path (ie, "web/bundles" = 2 levels) if (1 === \count($startPathArr) && '' === $startPathArr[0]) { $depth = 0; } else { $depth = \count($startPathArr) - $index; } // Repeated "../" for each level need to reach the common path $traverser = str_repeat('../', $depth); $endPathRemainder = implode('/', \array_slice($endPathArr, $index)); // Construct $endPath from traversing to the common path, then to the remaining $endPath $relativePath = $traverser.('' !== $endPathRemainder ? $endPathRemainder.'/' : ''); // Remove ending "/" if $endPath points to an existing file if (str_ends_with($relativePath, '/') && is_file($originalEndPath)) { $relativePath = substr($relativePath, 0, -1); } return '' === $relativePath ? './' : $relativePath; } /** * Mirrors a directory to another. * * Copies files and directories from the origin directory into the target directory. By default: * * - existing files in the target directory will be overwritten, except if they are newer (see the `override` option) * - files in the target directory that do not exist in the source directory will not be deleted (see the `delete` option) * * @param \Traversable|null $iterator Iterator that filters which files and directories to copy, if null a recursive iterator is created * @param array $options An array of boolean options * Valid options are: * - $options['override'] If true, target files newer than origin files are overwritten (see copy(), defaults to false) * - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink(), defaults to false) * - $options['delete'] Whether to delete files that are not in the source directory (defaults to false) * * @throws IOException When file type is unknown */ public function mirror(string $originDir, string $targetDir, ?\Traversable $iterator = null, array $options = []): void { $targetDir = rtrim($targetDir, '/\\'); $originDir = rtrim($originDir, '/\\'); $originDirLen = \strlen($originDir); if (!$this->exists($originDir)) { throw new IOException(\sprintf('The origin directory specified "%s" was not found.', $originDir), 0, null, $originDir); } // Iterate in destination folder to remove obsolete entries if ($this->exists($targetDir) && isset($options['delete']) && $options['delete']) { $deleteIterator = $iterator; if (null === $deleteIterator) { $flags = \FilesystemIterator::SKIP_DOTS; $deleteIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($targetDir, $flags), \RecursiveIteratorIterator::CHILD_FIRST); } $targetDirLen = \strlen($targetDir); foreach ($deleteIterator as $file) { $origin = $originDir.substr($file->getPathname(), $targetDirLen); if (!$this->exists($origin)) { $this->remove($file); } } } $copyOnWindows = $options['copy_on_windows'] ?? false; if (null === $iterator) { $flags = $copyOnWindows ? \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS : \FilesystemIterator::SKIP_DOTS; $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($originDir, $flags), \RecursiveIteratorIterator::SELF_FIRST); } $this->mkdir($targetDir); $filesCreatedWhileMirroring = []; foreach ($iterator as $file) { if ($file->getPathname() === $targetDir || $file->getRealPath() === $targetDir || isset($filesCreatedWhileMirroring[$file->getRealPath()])) { continue; } $target = $targetDir.substr($file->getPathname(), $originDirLen); $filesCreatedWhileMirroring[$target] = true; if (!$copyOnWindows && is_link($file)) { $this->symlink($file->getLinkTarget(), $target); } elseif (is_dir($file)) { $this->mkdir($target); } elseif (is_file($file)) { $this->copy($file, $target, $options['override'] ?? false); } else { throw new IOException(\sprintf('Unable to guess "%s" file type.', $file), 0, null, $file); } } } /** * Returns whether the given path is absolute. */ public function isAbsolutePath(string $file): bool { return Path::isAbsolute($file); } /** * Creates a temporary file with support for custom stream wrappers. * * @param string $prefix The prefix of the generated temporary filename * Note: Windows uses only the first three characters of prefix * @param string $suffix The suffix of the generated temporary filename * * @return string The new temporary filename (with path), or throw an exception on failure */ public function tempnam(string $dir, string $prefix, string $suffix = ''): string { [$scheme, $hierarchy] = $this->getSchemeAndHierarchy($dir); // If no scheme or scheme is "file" or "gs" (Google Cloud) create temp file in local filesystem if ((null === $scheme || 'file' === $scheme || 'gs' === $scheme) && '' === $suffix) { // If tempnam failed or no scheme return the filename otherwise prepend the scheme if ($tmpFile = self::box('tempnam', $hierarchy, $prefix)) { if (null !== $scheme && 'gs' !== $scheme) { return $scheme.'://'.$tmpFile; } return $tmpFile; } throw new IOException('A temporary file could not be created: '.self::$lastError); } // Loop until we create a valid temp file or have reached 10 attempts for ($i = 0; $i < 10; ++$i) { // Create a unique filename $tmpFile = $dir.'/'.$prefix.bin2hex(random_bytes(4)).$suffix; // Use fopen instead of file_exists as some streams do not support stat // Use mode 'x+' to atomically check existence and create to avoid a TOCTOU vulnerability if (!$handle = self::box('fopen', $tmpFile, 'x+')) { continue; } // Close the file if it was successfully opened self::box('fclose', $handle); return $tmpFile; } throw new IOException('A temporary file could not be created: '.self::$lastError); } /** * Atomically dumps content into a file. * * @param string|resource $content The data to write into the file * * @throws IOException if the file cannot be written to */ public function dumpFile(string $filename, $content): void { if (\is_array($content)) { throw new \TypeError(\sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__)); } $dir = \dirname($filename); if (is_link($filename) && $linkTarget = $this->readlink($filename)) { $this->dumpFile(Path::makeAbsolute($linkTarget, $dir), $content); return; } if (!is_dir($dir)) { $this->mkdir($dir); } // Will create a temp file with 0600 access rights // when the filesystem supports chmod. $tmpFile = $this->tempnam($dir, basename($filename)); try { if (false === self::box('file_put_contents', $tmpFile, $content)) { throw new IOException(\sprintf('Failed to write file "%s": ', $filename).self::$lastError, 0, null, $filename); } self::box('chmod', $tmpFile, self::box('fileperms', $filename) ?: 0o666 & ~umask()); $this->rename($tmpFile, $filename, true); } finally { if (file_exists($tmpFile)) { if ('\\' === \DIRECTORY_SEPARATOR && !is_writable($tmpFile)) { self::box('chmod', $tmpFile, self::box('fileperms', $tmpFile) | 0o200); } self::box('unlink', $tmpFile); } } } /** * Appends content to an existing file. * * @param string|resource $content The content to append * @param bool $lock Whether the file should be locked when writing to it * * @throws IOException If the file is not writable */ public function appendToFile(string $filename, $content, bool $lock = false): void { if (\is_array($content)) { throw new \TypeError(\sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__)); } $dir = \dirname($filename); if (!is_dir($dir)) { $this->mkdir($dir); } if (false === self::box('file_put_contents', $filename, $content, \FILE_APPEND | ($lock ? \LOCK_EX : 0))) { throw new IOException(\sprintf('Failed to write file "%s": ', $filename).self::$lastError, 0, null, $filename); } } /** * Returns the content of a file as a string. * * @throws IOException If the file cannot be read */ public function readFile(string $filename): string { if (is_dir($filename)) { throw new IOException(\sprintf('Failed to read file "%s": File is a directory.', $filename)); } $content = self::box('file_get_contents', $filename); if (false === $content) { throw new IOException(\sprintf('Failed to read file "%s": ', $filename).self::$lastError, 0, null, $filename); } return $content; } private function toIterable(string|iterable $files): iterable { return is_iterable($files) ? $files : [$files]; } /** * Gets a 2-tuple of scheme (may be null) and hierarchical part of a filename (e.g. file:///tmp -> [file, tmp]). */ private function getSchemeAndHierarchy(string $filename): array { $components = explode('://', $filename, 2); return 2 === \count($components) ? [$components[0], $components[1]] : [null, $components[0]]; } private static function assertFunctionExists(string $func): void { if (!\function_exists($func)) { throw new IOException(\sprintf('Unable to perform filesystem operation because the "%s()" function has been disabled.', $func)); } } private static function box(string $func, mixed ...$args): mixed { self::assertFunctionExists($func); self::$lastError = null; set_error_handler(self::handleError(...)); try { return $func(...$args); } finally { restore_error_handler(); } } /** * @internal */ public static function handleError(int $type, string $msg): void { self::$lastError = $msg; } } PKCA#]�,F$�X�XCsystem/helixultimate/vendor/tedivm/jshrink/src/JShrink/Minifier.phpnu�[���<?php /* * This file is part of the JShrink package. * * (c) Robert Hafner <tedivm@tedivm.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * JShrink * * * @package JShrink * @author Robert Hafner <tedivm@tedivm.com> */ namespace JShrink; /** * Minifier * * Usage - Minifier::minify($js); * Usage - Minifier::minify($js, $options); * Usage - Minifier::minify($js, array('flaggedComments' => false)); * * @package JShrink * @author Robert Hafner <tedivm@tedivm.com> * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ class Minifier { /** * The input javascript to be minified. * * @var string */ protected $input; /** * Length of input javascript. * * @var int */ protected $len = 0; /** * The location of the character (in the input string) that is next to be * processed. * * @var int */ protected $index = 0; /** * The first of the characters currently being looked at. * * @var string */ protected $a = ''; /** * The next character being looked at (after a); * * @var string */ protected $b = ''; /** * This character is only active when certain look ahead actions take place. * * @var string */ protected $c; /** * This character is only active when certain look ahead actions take place. * * @var string */ protected $last_char; /** * This character is only active when certain look ahead actions take place. * * @var string */ protected $output; /** * Contains the options for the current minification process. * * @var array */ protected $options; /** * These characters are used to define strings. */ protected $stringDelimiters = ['\'' => true, '"' => true, '`' => true]; /** * Contains the default options for minification. This array is merged with * the one passed in by the user to create the request specific set of * options (stored in the $options attribute). * * @var array */ protected static $defaultOptions = ['flaggedComments' => true]; protected static $keywords = ["delete", "do", "for", "in", "instanceof", "return", "typeof", "yield"]; protected $max_keyword_len; /** * Contains lock ids which are used to replace certain code patterns and * prevent them from being minified * * @var array */ protected $locks = []; /** * Takes a string containing javascript and removes unneeded characters in * order to shrink the code without altering it's functionality. * * @param string $js The raw javascript to be minified * @param array $options Various runtime options in an associative array * @throws \Exception * @return bool|string */ public static function minify($js, $options = []) { try { $jshrink = new Minifier(); $js = $jshrink->lock($js); $js = ltrim($jshrink->minifyToString($js, $options)); $js = $jshrink->unlock($js); unset($jshrink); return $js; } catch (\Exception $e) { if (isset($jshrink)) { // Since the breakdownScript function probably wasn't finished // we clean it out before discarding it. $jshrink->clean(); unset($jshrink); } throw $e; } } /** * Processes a javascript string and outputs only the required characters, * stripping out all unneeded characters. * * @param string $js The raw javascript to be minified * @param array $options Various runtime options in an associative array */ protected function minifyToString($js, $options) { $this->initialize($js, $options); $this->loop(); $this->clean(); return $this->output; } /** * Initializes internal variables, normalizes new lines, * * @param string $js The raw javascript to be minified * @param array $options Various runtime options in an associative array */ protected function initialize($js, $options) { $this->options = array_merge(static::$defaultOptions, $options); $this->input = $js; // We add a newline to the end of the script to make it easier to deal // with comments at the bottom of the script- this prevents the unclosed // comment error that can otherwise occur. $this->input .= PHP_EOL; // save input length to skip calculation every time $this->len = strlen($this->input); // Populate "a" with a new line, "b" with the first character, before // entering the loop $this->a = "\n"; $this->b = "\n"; $this->last_char = "\n"; $this->output = ""; $this->max_keyword_len = max(array_map('strlen', static::$keywords)); } /** * Characters that can't stand alone preserve the newline. * * @var array */ protected $noNewLineCharacters = [ '(' => true, '-' => true, '+' => true, '[' => true, '#' => true, '@' => true]; protected function echo($char) { $this->output .= $char; $this->last_char = $char[-1]; } /** * The primary action occurs here. This function loops through the input string, * outputting anything that's relevant and discarding anything that is not. */ protected function loop() { while ($this->a !== false && !is_null($this->a) && $this->a !== '') { switch ($this->a) { // new lines case "\r": case "\n": // if the next line is something that can't stand alone preserve the newline if ($this->b !== false && isset($this->noNewLineCharacters[$this->b])) { $this->echo($this->a); $this->saveString(); break; } // if B is a space we skip the rest of the switch block and go down to the // string/regex check below, resetting $this->b with getReal if ($this->b === ' ') { break; } // otherwise we treat the newline like a space // no break case ' ': if (static::isAlphaNumeric($this->b)) { $this->echo($this->a); } $this->saveString(); break; default: switch ($this->b) { case "\r": case "\n": if (strpos('}])+-"\'', $this->a) !== false) { $this->echo($this->a); $this->saveString(); break; } else { if (static::isAlphaNumeric($this->a)) { $this->echo($this->a); $this->saveString(); } } break; case ' ': if (!static::isAlphaNumeric($this->a)) { break; } // no break default: // check for some regex that breaks stuff if ($this->a === '/' && ($this->b === '\'' || $this->b === '"')) { $this->saveRegex(); continue 3; } $this->echo($this->a); $this->saveString(); break; } } // do reg check of doom $this->b = $this->getReal(); if ($this->b == '/') { $valid_tokens = "(,=:[!&|?\n"; # Find last "real" token, excluding spaces. $last_token = $this->a; if ($last_token == " ") { $last_token = $this->last_char; } if (strpos($valid_tokens, $last_token) !== false) { // Regex can appear unquoted after these symbols $this->saveRegex(); } else if ($this->endsInKeyword()) { // This block checks for the "return" token before the slash. $this->saveRegex(); } } // if (($this->b == '/' && strpos('(,=:[!&|?', $this->a) !== false)) { // $this->saveRegex(); // } } } /** * Resets attributes that do not need to be stored between requests so that * the next request is ready to go. Another reason for this is to make sure * the variables are cleared and are not taking up memory. */ protected function clean() { unset($this->input); $this->len = 0; $this->index = 0; $this->a = $this->b = ''; unset($this->c); unset($this->options); } /** * Returns the next string for processing based off of the current index. * * @return string */ protected function getChar() { // Check to see if we had anything in the look ahead buffer and use that. if (isset($this->c)) { $char = $this->c; unset($this->c); } else { // Otherwise we start pulling from the input. $char = $this->index < $this->len ? $this->input[$this->index] : false; // If the next character doesn't exist return false. if (isset($char) && $char === false) { return false; } // Otherwise increment the pointer and use this char. $this->index++; } # Convert all line endings to unix standard. # `\r\n` converts to `\n\n` and is minified. if ($char == "\r") { $char = "\n"; } // Normalize all whitespace except for the newline character into a // standard space. if ($char !== "\n" && $char < "\x20") { return ' '; } return $char; } /** * This function returns the next character without moving the index forward. * * * @return string The next character * @throws \RuntimeException */ protected function peek() { if ($this->index >= $this->len) { return false; } $char = $this->input[$this->index]; # Convert all line endings to unix standard. # `\r\n` converts to `\n\n` and is minified. if ($char == "\r") { $char = "\n"; } // Normalize all whitespace except for the newline character into a // standard space. if ($char !== "\n" && $char < "\x20") { return ' '; } # Return the next character but don't push the index. return $char; } /** * This function gets the next "real" character. It is essentially a wrapper * around the getChar function that skips comments. This has significant * performance benefits as the skipping is done using native functions (ie, * c code) rather than in script php. * * * @return string Next 'real' character to be processed. * @throws \RuntimeException */ protected function getReal() { $startIndex = $this->index; $char = $this->getChar(); // Check to see if we're potentially in a comment if ($char !== '/') { return $char; } $this->c = $this->getChar(); if ($this->c === '/') { $this->processOneLineComments($startIndex); return $this->getReal(); } elseif ($this->c === '*') { $this->processMultiLineComments($startIndex); return $this->getReal(); } return $char; } /** * Removed one line comments, with the exception of some very specific types of * conditional comments. * * @param int $startIndex The index point where "getReal" function started * @return void */ protected function processOneLineComments($startIndex) { $thirdCommentString = $this->index < $this->len ? $this->input[$this->index] : false; // kill rest of line $this->getNext("\n"); unset($this->c); if ($thirdCommentString == '@') { $endPoint = $this->index - $startIndex; $this->c = "\n" . substr($this->input, $startIndex, $endPoint); } } /** * Skips multiline comments where appropriate, and includes them where needed. * Conditional comments and "license" style blocks are preserved. * * @param int $startIndex The index point where "getReal" function started * @return void * @throws \RuntimeException Unclosed comments will throw an error */ protected function processMultiLineComments($startIndex) { $this->getChar(); // current C $thirdCommentString = $this->getChar(); // Detect a completely empty comment, ie `/**/` if ($thirdCommentString == "*") { $peekChar = $this->peek(); if ($peekChar == "/") { $this->index++; return; } } // kill everything up to the next */ if it's there if ($this->getNext('*/')) { $this->getChar(); // get * $this->getChar(); // get / $char = $this->getChar(); // get next real character // Now we reinsert conditional comments and YUI-style licensing comments if (($this->options['flaggedComments'] && $thirdCommentString === '!') || ($thirdCommentString === '@')) { // If conditional comments or flagged comments are not the first thing in the script // we need to echo a and fill it with a space before moving on. if ($startIndex > 0) { $this->echo($this->a); $this->a = " "; // If the comment started on a new line we let it stay on the new line if ($this->input[($startIndex - 1)] === "\n") { $this->echo("\n"); } } $endPoint = ($this->index - 1) - $startIndex; $this->echo(substr($this->input, $startIndex, $endPoint)); $this->c = $char; return; } } else { $char = false; } if ($char === false) { throw new \RuntimeException('Unclosed multiline comment at position: ' . ($this->index - 2)); } // if we're here c is part of the comment and therefore tossed $this->c = $char; } /** * Pushes the index ahead to the next instance of the supplied string. If it * is found the first character of the string is returned and the index is set * to it's position. * * @param string $string * @return string|false Returns the first character of the string or false. */ protected function getNext($string) { // Find the next occurrence of "string" after the current position. $pos = strpos($this->input, $string, $this->index); // If it's not there return false. if ($pos === false) { return false; } // Adjust position of index to jump ahead to the asked for string $this->index = $pos; // Return the first character of that string. return $this->index < $this->len ? $this->input[$this->index] : false; } /** * When a javascript string is detected this function crawls for the end of * it and saves the whole string. * * @throws \RuntimeException Unclosed strings will throw an error */ protected function saveString() { $startpos = $this->index; // saveString is always called after a gets cleared, so we push b into // that spot. $this->a = $this->b; // If this isn't a string we don't need to do anything. if (!isset($this->stringDelimiters[$this->a])) { return; } // String type is the quote used, " or ' $stringType = $this->a; // Echo out that starting quote $this->echo($this->a); // Loop until the string is done // Grab the very next character and load it into a while (($this->a = $this->getChar()) !== false) { switch ($this->a) { // If the string opener (single or double quote) is used // output it and break out of the while loop- // The string is finished! case $stringType: break 2; // New lines in strings without line delimiters are bad- actual // new lines will be represented by the string \n and not the actual // character, so those will be treated just fine using the switch // block below. case "\n": if ($stringType === '`') { $this->echo($this->a); } else { throw new \RuntimeException('Unclosed string at position: ' . $startpos); } break; // Escaped characters get picked up here. If it's an escaped new line it's not really needed case '\\': // a is a slash. We want to keep it, and the next character, // unless it's a new line. New lines as actual strings will be // preserved, but escaped new lines should be reduced. $this->b = $this->getChar(); // If b is a new line we discard a and b and restart the loop. if ($this->b === "\n") { break; } // echo out the escaped character and restart the loop. $this->echo($this->a . $this->b); break; // Since we're not dealing with any special cases we simply // output the character and continue our loop. default: $this->echo($this->a); } } } /** * When a regular expression is detected this function crawls for the end of * it and saves the whole regex. * * @throws \RuntimeException Unclosed regex will throw an error */ protected function saveRegex() { if ($this->a != " ") { $this->echo($this->a); } $this->echo($this->b); // Flag to make sure that we don't end the regex too early because of // unescaped forward slashes inside a character class. e.g /[/]/ // In non-v-mode, The only characters that cannot appear literally are \, ], and - // In v-mode more characters are reserved and forbidden from appearing literally // including but not limited to [ ] \ / $character_class = false; $character_class_index = null; while (($this->a = $this->getChar()) !== false) { if ($this->a === '/' && !$character_class) { break; } if ($this->a === '[') { $character_class = true; $character_class_index = $this->index; } elseif ($this->a === ']') { $character_class = false; } if ($this->a === '\\') { $this->echo($this->a); $this->a = $this->getChar(); } if ($this->a === "\n") { if ($character_class) { throw new \RuntimeException('Unclosed character class at position: ' . $character_class_index); } throw new \RuntimeException('Unclosed regex pattern at position: ' . $this->index); } $this->echo($this->a); } $this->b = $this->getReal(); } /** * Checks to see if a character is alphanumeric. * * @param string $char Just one character * @return bool */ protected static function isAlphaNumeric($char) { return preg_match('/^[\w\$\pL]$/', $char) === 1 || $char == '/'; } protected function endsInKeyword() { # When this function is called A is not yet assigned to output. # Regular expression only needs to check final part of output for keyword. $testOutput = substr($this->output . $this->a, -1 * ($this->max_keyword_len + 10)); foreach(static::$keywords as $keyword) { if (preg_match('/[^\w]'.$keyword.'[ ]?$/i', $testOutput) === 1) { return true; } } return false; } /** * Replace patterns in the given string and store the replacement * * @param string $js The string to lock * @return bool */ protected function lock($js) { /* lock things like <code>"asd" + ++x;</code> */ $lock = '"LOCK---' . crc32(time()) . '"'; $matches = []; preg_match('/([+-])(\s+)([+-])/S', $js, $matches); if (empty($matches)) { return $js; } $this->locks[$lock] = $matches[2]; $js = preg_replace('/([+-])\s+([+-])/S', "$1{$lock}$2", $js); /* -- */ return $js; } /** * Replace "locks" with the original characters * * @param string $js The string to unlock * @return bool */ protected function unlock($js) { if (empty($this->locks)) { return $js; } foreach ($this->locks as $lock => $replacement) { $js = str_replace($lock, $replacement, $js); } return $js; } } PKCA#]��TMM8system/helixultimate/vendor/tedivm/jshrink/composer.jsonnu�[���{ "name": "tedivm/jshrink", "description": "Javascript Minifier built in PHP", "keywords": [ "minifier", "javascript" ], "homepage": "http://github.com/tedious/JShrink", "type": "library", "license": "BSD-3-Clause", "authors": [ { "name": "Robert Hafner", "email": "tedivm@tedivm.com" } ], "require": { "php": "^7.0|^8.0" }, "require-dev": { "phpunit/phpunit": "^9|^10", "friendsofphp/php-cs-fixer": "^3.14", "php-coveralls/php-coveralls": "^2.5.0" }, "autoload": { "psr-0": { "JShrink": "src/" } } } PKCA#]����N,N,/system/helixultimate/vendor/league/uri/Http.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use Deprecated; use JsonSerializable; use League\Uri\Contracts\Conditionable; use League\Uri\Contracts\Transformable; use League\Uri\Contracts\UriException; use League\Uri\Contracts\UriInterface; use League\Uri\Exceptions\SyntaxError; use League\Uri\UriTemplate\TemplateCanNotBeExpanded; use Psr\Http\Message\UriInterface as Psr7UriInterface; use Stringable; use Uri\Rfc3986\Uri as Rfc3986Uri; use Uri\WhatWg\Url as WhatWgUrl; use function is_bool; use function ltrim; /** * @phpstan-import-type InputComponentMap from UriString */ final class Http implements Stringable, Psr7UriInterface, JsonSerializable, Conditionable, Transformable { private readonly UriInterface $uri; private function __construct(UriInterface $uri) { if (null === $uri->getScheme() && '' === $uri->getHost()) { throw new SyntaxError('An URI without scheme cannot contain an empty host string according to PSR-7: '.$uri); } $port = $uri->getPort(); if (null !== $port && ($port < 0 || $port > 65535)) { throw new SyntaxError('The URI port is outside the established TCP and UDP port ranges: '.$uri); } $this->uri = $this->normalizePsr7Uri($uri); } /** * PSR-7 UriInterface makes the following normalization. * * Safely stringify input when possible for League UriInterface compatibility. * * Query, Fragment and User Info when undefined are normalized to the empty string */ private function normalizePsr7Uri(UriInterface $uri): UriInterface { $components = []; if ('' === $uri->getFragment()) { $components['fragment'] = null; } if ('' === $uri->getQuery()) { $components['query'] = null; } if ('' === $uri->getUserInfo()) { $components['user'] = null; $components['pass'] = null; } return match ($components) { [] => $uri, default => Uri::fromComponents([...$uri->toComponents(), ...$components]), }; } /** * Create a new instance from a string or a stringable object. */ public static function new(Rfc3986Uri|WhatwgUrl|Stringable|string $uri = ''): self { return new self(Uri::new($uri)); } /** * Create a new instance from a string or a stringable structure or returns null on failure. */ public static function tryNew(Rfc3986Uri|WhatwgUrl|Stringable|string $uri = ''): ?self { try { return self::new($uri); } catch (UriException) { return null; } } /** * Create a new instance from a hash of parse_url parts. * * @param InputComponentMap $components a hash representation of the URI similar * to PHP parse_url function result */ public static function fromComponents(array $components): self { $components += [ 'scheme' => null, 'user' => null, 'pass' => null, 'host' => null, 'port' => null, 'path' => '', 'query' => null, 'fragment' => null, ]; if ('' === $components['user']) { $components['user'] = null; } if ('' === $components['pass']) { $components['pass'] = null; } if ('' === $components['query']) { $components['query'] = null; } if ('' === $components['fragment']) { $components['fragment'] = null; } return new self(Uri::fromComponents($components)); } /** * Create a new instance from the environment. */ public static function fromServer(array $server): self { return new self(Uri::fromServer($server)); } /** * Creates a new instance from a template. * * @throws TemplateCanNotBeExpanded if the variables are invalid or missing * @throws UriException if the variables are invalid or missing */ public static function fromTemplate(Stringable|string $template, iterable $variables = []): self { return new self(Uri::fromTemplate($template, $variables)); } /** * Returns a new instance from a URI and a Base URI.or null on failure. * * The returned URI must be absolute if a base URI is provided */ public static function parse(WhatWgUrl|Rfc3986Uri|Stringable|string $uri, WhatWgUrl|Rfc3986Uri|Stringable|string|null $baseUri = null): ?self { return null !== ($uri = Uri::parse($uri, $baseUri)) ? new self($uri) : null; } public function getScheme(): string { return $this->uri->getScheme() ?? ''; } public function getAuthority(): string { return $this->uri->getAuthority() ?? ''; } public function getUserInfo(): string { return $this->uri->getUserInfo() ?? ''; } public function getHost(): string { return $this->uri->getHost() ?? ''; } public function getPort(): ?int { return $this->uri->getPort(); } public function getPath(): string { $path = $this->uri->getPath(); return match (true) { str_starts_with($path, '//') => '/'.ltrim($path, '/'), default => $path, }; } public function getQuery(): string { return $this->uri->getQuery() ?? ''; } public function getFragment(): string { return $this->uri->getFragment() ?? ''; } public function __toString(): string { return $this->uri->toString(); } public function jsonSerialize(): string { return $this->uri->toString(); } /** * Safely stringify input when possible for League UriInterface compatibility. */ private function filterInput(string $str): ?string { return match ('') { $str => null, default => $str, }; } private function newInstance(UriInterface $uri): self { return match ($this->uri->toString()) { $uri->toString() => $this, default => new self($uri), }; } public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): static { if (!is_bool($condition)) { $condition = $condition($this); } return match (true) { $condition => $onSuccess($this), null !== $onFail => $onFail($this), default => $this, } ?? $this; } public function transform(callable $callback): static { return $callback($this); } public function withScheme(string $scheme): self { return $this->newInstance($this->uri->withScheme($this->filterInput($scheme))); } public function withUserInfo(string $user, ?string $password = null): self { return $this->newInstance($this->uri->withUserInfo($this->filterInput($user), $password)); } public function withHost(string $host): self { return $this->newInstance($this->uri->withHost($this->filterInput($host))); } public function withPort(?int $port): self { return $this->newInstance($this->uri->withPort($port)); } public function withPath(string $path): self { return $this->newInstance($this->uri->withPath($path)); } public function withQuery(string $query): self { return $this->newInstance($this->uri->withQuery($this->filterInput($query))); } public function withFragment(string $fragment): self { return $this->newInstance($this->uri->withFragment($this->filterInput($fragment))); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.6.0 * @codeCoverageIgnore * @see Http::parse() * * Create a new instance from a URI and a Base URI. * * The returned URI must be absolute. */ #[Deprecated(message:'use League\Uri\Http::parse() instead', since:'league/uri:7.6.0')] public static function fromBaseUri(Rfc3986Uri|WhatwgUrl|Stringable|string $uri, Rfc3986Uri|WhatwgUrl|Stringable|string|null $baseUri = null): self { return new self(Uri::fromBaseUri($uri, $baseUri)); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.0.0 * @codeCoverageIgnore * @see Http::new() * * Create a new instance from a string. */ #[Deprecated(message:'use League\Uri\Http::new() instead', since:'league/uri:7.0.0')] public static function createFromString(Stringable|string $uri = ''): self { return self::new($uri); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.0.0 * @codeCoverageIgnore * @see Http::fromComponents() * * Create a new instance from a hash of parse_url parts. * * @param InputComponentMap $components a hash representation of the URI similar * to PHP parse_url function result */ #[Deprecated(message:'use League\Uri\Http::fromComponents() instead', since:'league/uri:7.0.0')] public static function createFromComponents(array $components): self { return self::fromComponents($components); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.0.0 * @codeCoverageIgnore * @see Http::fromServer() * * Create a new instance from the environment. */ #[Deprecated(message:'use League\Uri\Http::fromServer() instead', since:'league/uri:7.0.0')] public static function createFromServer(array $server): self { return self::fromServer($server); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.0.0 * @codeCoverageIgnore * @see Http::new() * * Create a new instance from a URI object. */ #[Deprecated(message:'use League\Uri\Http::new() instead', since:'league/uri:7.0.0')] public static function createFromUri(Psr7UriInterface|UriInterface $uri): self { return self::new($uri); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.0.0 * @codeCoverageIgnore * @see Http::fromBaseUri() * * Create a new instance from a URI and a Base URI. * * The returned URI must be absolute. */ #[Deprecated(message:'use League\Uri\Http::fromBaseUri() instead', since:'league/uri:7.0.0')] public static function createFromBaseUri(Stringable|string $uri, Stringable|string|null $baseUri = null): self { return self::fromBaseUri($uri, $baseUri); } } PKCA#]�fId��4system/helixultimate/vendor/league/uri/UriScheme.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use ValueError; /* * Supported schemes and corresponding default port. * * @see https://github.com/python-hyper/hyperlink/blob/master/src/hyperlink/_url.py for the curating list definition * @see https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml * @see https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml */ enum UriScheme: string { case About = 'about'; case Acap = 'acap'; case Bitcoin = 'bitcoin'; case Geo = 'geo'; case Blob = 'blob'; case Afp = 'afp'; case Data = 'data'; case Dict = 'dict'; case Dns = 'dns'; case File = 'file'; case Ftp = 'ftp'; case Git = 'git'; case Gopher = 'gopher'; case Http = 'http'; case Https = 'https'; case Imap = 'imap'; case Imaps = 'imaps'; case Ipp = 'ipp'; case Ipps = 'ipps'; case Irc = 'irc'; case Ircs = 'ircs'; case Javascript = 'javascript'; case Ldap = 'ldap'; case Ldaps = 'ldaps'; case Magnet = 'magnet'; case Mailto = 'mailto'; case Mms = 'mms'; case Msrp = 'msrp'; case Msrps = 'msrps'; case Mtqp = 'mtqp'; case News = 'news'; case Nfs = 'nfs'; case Nntp = 'nntp'; case Nntps = 'nntps'; case Pkcs11 = 'pkcs11'; case Pop = 'pop'; case Prospero = 'prospero'; case Redis = 'redis'; case Rsync = 'rsync'; case Rtsp = 'rtsp'; case Rtsps = 'rtsps'; case Rtspu = 'rtspu'; case Sftp = 'sftp'; case Wss = 'wss'; case Ws = 'ws'; case Sip = 'sip'; case Sips = 'sips'; case Smb = 'smb'; case Smtp = 'smtp'; case Snmp = 'snmp'; case Ssh = 'ssh'; case Steam = 'steam'; case Svn = 'svn'; case Tel = 'tel'; case Telnet = 'telnet'; case Tn3270 = 'tn3270'; case Urn = 'urn'; case Ventrilo = 'ventrilo'; case Vnc = 'vnc'; case Wais = 'wais'; case Xmpp = 'xmpp'; public function port(): ?int { return match ($this) { self::Acap => 674, self::Afp => 548, self::Dict => 2628, self::Dns => 53, self::Ftp => 21, self::Http, self::Ws => 80, self::Https, self::Wss => 443, self::Git => 9418, self::Gopher => 70, self::Imap => 143, self::Imaps => 993, self::Ipp, self::Ipps => 631, self::Irc => 194, self::Ircs => 6697, self::Ldap => 389, self::Ldaps => 636, self::Mms => 1755, self::Msrp, self::Msrps => 2855, self::Mtqp => 1038, self::Nfs => 111, self::Nntp => 119, self::Nntps => 563, self::Pop => 110, self::Prospero => 1525, self::Redis => 6379, self::Rsync => 873, self::Rtsp => 554, self::Rtsps => 322, self::Rtspu => 5005, self::Sftp, self::Ssh => 22, self::Smb => 445, self::Smtp => 25, self::Snmp => 161, self::Svn => 3690, self::Telnet, self::Tn3270 => 23, self::Ventrilo => 3784, self::Vnc => 5900, self::Wais => 210, self::Xmpp => 80, default => null, }; } public function type(): SchemeType { return match ($this) { self::Urn, self::About, self::Bitcoin, self::Blob, self::Data, self::Geo, self::Javascript, self::Magnet, self::Mailto, self::Pkcs11, self::Sip, self::Sips, self::Tel => SchemeType::Opaque, self::File => SchemeType::Hierarchical, self::News => SchemeType::Unknown, default => match (true) { null !== $this->port() => SchemeType::Hierarchical, default => SchemeType::Unknown, }, }; } public function isWhatWgSpecial(): bool { return match ($this) { self::Ftp, self::Http, self::Https, self::Ws, self::Wss => true, default => false, }; } /** * @return list<self> */ public static function fromPort(?int $port): array { null === $port || 0 <= $port || throw new ValueError('The submitted port cannot be negative.'); static $reverse = []; if ([] === $reverse) { foreach (self::cases() as $case) { $defaultPort = $case->port(); if (null === $defaultPort) { continue; } $reverse[$defaultPort] ??= []; $reverse[$defaultPort][] = $case; } } return $reverse[$port] ?? []; } public function builder(): Builder { return new Builder(scheme: $this); } } PKCA#]�Q:���6system/helixultimate/vendor/league/uri/UriResolver.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use Deprecated; use League\Uri\Contracts\UriInterface; use Psr\Http\Message\UriInterface as Psr7UriInterface; /** * @deprecated since version 7.0.0 * @codeCoverageIgnore * @see BaseUri */ final class UriResolver { /** * Resolves a URI against a base URI using RFC3986 rules. * * This method MUST retain the state of the submitted URI instance, and return * a URI instance of the same type that contains the applied modifications. * * This method MUST be transparent when dealing with error and exceptions. * It MUST not alter or silence them apart from validating its own parameters. */ #[Deprecated(message:'use League\Uri\BaseUri::resolve() instead', since:'league/uri:7.0.0')] public static function resolve(Psr7UriInterface|UriInterface $uri, Psr7UriInterface|UriInterface $baseUri): Psr7UriInterface|UriInterface { return BaseUri::from($baseUri)->resolve($uri)->getUri(); } /** * Relativizes a URI according to a base URI. * * This method MUST retain the state of the submitted URI instance, and return * a URI instance of the same type that contains the applied modifications. * * This method MUST be transparent when dealing with error and exceptions. * It MUST not alter or silence them apart from validating its own parameters. */ #[Deprecated(message:'use League\Uri\BaseUri::relativize() instead', since:'league/uri:7.0.0')] public static function relativize(Psr7UriInterface|UriInterface $uri, Psr7UriInterface|UriInterface $baseUri): Psr7UriInterface|UriInterface { return BaseUri::from($baseUri)->relativize($uri)->getUri(); } } PKCA#]khM6system/helixultimate/vendor/league/uri/HttpFactory.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use Psr\Http\Message\UriFactoryInterface; use Psr\Http\Message\UriInterface; final class HttpFactory implements UriFactoryInterface { public function createUri(string $uri = ''): UriInterface { return Http::new($uri); } } PKCA#]̰Q Q 2system/helixultimate/vendor/league/uri/UriInfo.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use Deprecated; use League\Uri\Contracts\UriInterface; use Psr\Http\Message\UriInterface as Psr7UriInterface; /** * @deprecated since version 7.0.0 * @codeCoverageIgnore * @see BaseUri */ final class UriInfo { /** * @codeCoverageIgnore */ private function __construct() { } /** * Tells whether the URI represents an absolute URI. */ #[Deprecated(message:'use League\Uri\BaseUri::isAbsolute() instead', since:'league/uri:7.0.0')] public static function isAbsolute(Psr7UriInterface|UriInterface $uri): bool { return BaseUri::from($uri)->isAbsolute(); } /** * Tell whether the URI represents a network path. */ #[Deprecated(message:'use League\Uri\BaseUri::isNetworkPath() instead', since:'league/uri:7.0.0')] public static function isNetworkPath(Psr7UriInterface|UriInterface $uri): bool { return BaseUri::from($uri)->isNetworkPath(); } /** * Tells whether the URI represents an absolute path. */ #[Deprecated(message:'use League\Uri\BaseUri::isAbsolutePath() instead', since:'league/uri:7.0.0')] public static function isAbsolutePath(Psr7UriInterface|UriInterface $uri): bool { return BaseUri::from($uri)->isAbsolutePath(); } /** * Tell whether the URI represents a relative path. * */ #[Deprecated(message:'use League\Uri\BaseUri::isRelativePath() instead', since:'league/uri:7.0.0')] public static function isRelativePath(Psr7UriInterface|UriInterface $uri): bool { return BaseUri::from($uri)->isRelativePath(); } /** * Tells whether both URI refers to the same document. */ #[Deprecated(message:'use League\Uri\BaseUri::isSameDocument() instead', since:'league/uri:7.0.0')] public static function isSameDocument(Psr7UriInterface|UriInterface $uri, Psr7UriInterface|UriInterface $baseUri): bool { return BaseUri::from($baseUri)->isSameDocument($uri); } /** * Returns the URI origin property as defined by WHATWG URL living standard. * * {@see https://url.spec.whatwg.org/#origin} * * For URI without a special scheme the method returns null * For URI with the file scheme the method will return null (as this is left to the implementation decision) * For URI with a special scheme the method returns the scheme followed by its authority (without the userinfo part) */ #[Deprecated(message:'use League\Uri\BaseUri::origin() instead', since:'league/uri:7.0.0')] public static function getOrigin(Psr7UriInterface|UriInterface $uri): ?string { return BaseUri::from($uri)->origin()?->__toString(); } /** * Tells whether two URI do not share the same origin. * * @see UriInfo::getOrigin() */ #[Deprecated(message:'use League\Uri\BaseUri::isCrossOrigin() instead', since:'league/uri:7.0.0')] public static function isCrossOrigin(Psr7UriInterface|UriInterface $uri, Psr7UriInterface|UriInterface $baseUri): bool { return BaseUri::from($baseUri)->isCrossOrigin($uri); } } PKCA#]�L�v��Asystem/helixultimate/vendor/league/uri/UriTemplate/Expression.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\UriTemplate; use Deprecated; use League\Uri\Exceptions\SyntaxError; use Stringable; use function array_filter; use function array_map; use function array_unique; use function explode; use function implode; /** * @internal The class exposes the internal representation of an Expression and its usage * @link https://www.rfc-editor.org/rfc/rfc6570#section-2.2 */ final class Expression { /** @var array<VarSpecifier> */ private readonly array $varSpecifiers; /** @var array<string> */ public readonly array $variableNames; public readonly string $value; private function __construct(public readonly Operator $operator, VarSpecifier ...$varSpecifiers) { $this->varSpecifiers = $varSpecifiers; $this->variableNames = array_unique( array_map( static fn (VarSpecifier $varSpecifier): string => $varSpecifier->name, $varSpecifiers ) ); $this->value = '{'.$operator->value.implode(',', array_map( static fn (VarSpecifier $varSpecifier): string => $varSpecifier->toString(), $varSpecifiers )).'}'; } /** * @throws SyntaxError if the expression is invalid */ public static function new(Stringable|string $expression): self { $parts = Operator::parseExpression($expression); return new Expression($parts['operator'], ...array_map( static fn (string $varSpec): VarSpecifier => VarSpecifier::new($varSpec), explode(',', $parts['variables']) )); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @throws SyntaxError if the expression is invalid * @see Expression::new() * * @deprecated Since version 7.0.0 * @codeCoverageIgnore */ #[Deprecated(message:'use League\Uri\UriTemplate\Exppression::new() instead', since:'league/uri:7.0.0')] public static function createFromString(Stringable|string $expression): self { return self::new($expression); } public function expand(VariableBag $variables): string { $expanded = implode( $this->operator->separator(), array_filter( array_map( fn (VarSpecifier $varSpecifier): string => $this->operator->expand($varSpecifier, $variables), $this->varSpecifiers ), static fn ($value): bool => '' !== $value ) ); return match ('') { $expanded => '', default => $this->operator->first().$expanded, }; } } PKCA#]ӹ:?system/helixultimate/vendor/league/uri/UriTemplate/Operator.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\UriTemplate; use League\Uri\Encoder; use League\Uri\Exceptions\SyntaxError; use Stringable; use function implode; use function is_array; use function preg_match; use function rawurlencode; use function str_contains; use function substr; /** * Processing behavior according to the expression type operator. * * @internal The class exposes the internal representation of an Operator and its usage * * @link https://www.rfc-editor.org/rfc/rfc6570#section-2.2 * @link https://tools.ietf.org/html/rfc6570#appendix-A */ enum Operator: string { /** * Expression regular expression pattern. * * @link https://tools.ietf.org/html/rfc6570#section-2.2 */ private const REGEXP_EXPRESSION = '/^\{(?:(?<operator>[\.\/;\?&\=,\!@\|\+#])?(?<variables>[^\}]*))\}$/'; /** * Reserved Operator characters. * * @link https://tools.ietf.org/html/rfc6570#section-2.2 */ private const RESERVED_OPERATOR = '=,!@|'; case None = ''; case ReservedChars = '+'; case Label = '.'; case Path = '/'; case PathParam = ';'; case Query = '?'; case QueryPair = '&'; case Fragment = '#'; public function first(): string { return match ($this) { self::None, self::ReservedChars => '', default => $this->value, }; } public function separator(): string { return match ($this) { self::None, self::ReservedChars, self::Fragment => ',', self::Query, self::QueryPair => '&', default => $this->value, }; } public function isNamed(): bool { return match ($this) { self::Query, self::PathParam, self::QueryPair => true, default => false, }; } /** * Removes percent encoding on reserved characters (used with + and # modifiers). */ public function decode(string $var): string { return match ($this) { Operator::ReservedChars, Operator::Fragment => (string) Encoder::encodeQueryOrFragment($var), default => rawurlencode($var), }; } /** * @throws SyntaxError if the expression is invalid * @throws SyntaxError if the operator used in the expression is invalid * @throws SyntaxError if the contained variable specifiers are invalid * * @return array{operator:Operator, variables:string} */ public static function parseExpression(Stringable|string $expression): array { $expression = (string) $expression; if (1 !== preg_match(self::REGEXP_EXPRESSION, $expression, $parts)) { throw new SyntaxError('The expression "'.$expression.'" is invalid.'); } /** @var array{operator:string, variables:string} $parts */ $parts = $parts + ['operator' => '']; if ('' !== $parts['operator'] && str_contains(self::RESERVED_OPERATOR, $parts['operator'])) { throw new SyntaxError('The operator used in the expression "'.$expression.'" is reserved.'); } return [ 'operator' => self::from($parts['operator']), 'variables' => $parts['variables'], ]; } /** * Replaces an expression with the given variables. * * @throws TemplateCanNotBeExpanded if the variables is an array and a ":" modifier needs to be applied * @throws TemplateCanNotBeExpanded if the variables contains nested array values */ public function expand(VarSpecifier $varSpecifier, VariableBag $variables): string { $value = $variables->fetch($varSpecifier->name); if (null === $value) { return ''; } [$expanded, $actualQuery] = $this->inject($value, $varSpecifier); if (!$actualQuery) { return $expanded; } if ('&' !== $this->separator() && '' === $expanded) { return $varSpecifier->name; } return $varSpecifier->name.'='.$expanded; } /** * @param string|array<string> $value * * @return array{0:string, 1:bool} */ private function inject(array|string $value, VarSpecifier $varSpec): array { if (is_array($value)) { return $this->replaceList($value, $varSpec); } if (':' === $varSpec->modifier) { $value = substr($value, 0, $varSpec->position); } return [$this->decode($value), $this->isNamed()]; } /** * Expands an expression using a list of values. * * @param array<string> $value * * @throws TemplateCanNotBeExpanded if the variables is an array and a ":" modifier needs to be applied * * @return array{0:string, 1:bool} */ private function replaceList(array $value, VarSpecifier $varSpec): array { if (':' === $varSpec->modifier) { throw TemplateCanNotBeExpanded::dueToUnableToProcessValueListWithPrefix($varSpec->name); } if ([] === $value) { return ['', false]; } $pairs = []; $isList = array_is_list($value); $useQuery = $this->isNamed(); foreach ($value as $key => $var) { if (!$isList) { $key = rawurlencode((string) $key); } $var = $this->decode($var); if ('*' === $varSpec->modifier) { if (!$isList) { $var = $key.'='.$var; } elseif ($key > 0 && $useQuery) { $var = $varSpec->name.'='.$var; } } $pairs[$key] = $var; } if ('*' === $varSpec->modifier) { if (!$isList) { // Don't prepend the value name when using the `explode` modifier with an associative array. $useQuery = false; } return [implode($this->separator(), $pairs), $useQuery]; } if (!$isList) { // When an associative array is encountered and the `explode` modifier is not set, then // the result must be a comma separated list of keys followed by their respective values. $retVal = []; foreach ($pairs as $offset => $data) { $retVal[$offset] = $offset.','.$data; } $pairs = $retVal; } return [implode(',', $pairs), $useQuery]; } } PKCA#]k8����Csystem/helixultimate/vendor/league/uri/UriTemplate/VarSpecifier.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\UriTemplate; use League\Uri\Exceptions\SyntaxError; use function preg_match; /** * @internal The class exposes the internal representation of a Var Specifier * @link https://www.rfc-editor.org/rfc/rfc6570#section-2.3 */ final class VarSpecifier { /** * Variables specification regular expression pattern. * * @link https://tools.ietf.org/html/rfc6570#section-2.3 */ private const REGEXP_VARSPEC = '/^(?<name>(?:[A-z0-9_\.]|%[0-9a-fA-F]{2})+)(?<modifier>\:(?<position>\d+)|\*)?$/'; private const MODIFIER_POSITION_MAX_POSITION = 10_000; private function __construct( public readonly string $name, public readonly string $modifier, public readonly int $position ) { } public static function new(string $specification): self { 1 === preg_match(self::REGEXP_VARSPEC, $specification, $parsed) || throw new SyntaxError('The variable specification "'.$specification.'" is invalid.'); $properties = ['name' => $parsed['name'], 'modifier' => $parsed['modifier'] ?? '', 'position' => $parsed['position'] ?? '']; if ('' !== $properties['position']) { $properties['position'] = (int) $properties['position']; $properties['modifier'] = ':'; } if ('' === $properties['position']) { $properties['position'] = 0; } if (self::MODIFIER_POSITION_MAX_POSITION <= $properties['position']) { throw new SyntaxError('The variable specification "'.$specification.'" is invalid the position modifier must be lower than 10000.'); } return new self($properties['name'], $properties['modifier'], $properties['position']); } public function toString(): string { return $this->name.$this->modifier.match (true) { 0 < $this->position => $this->position, default => '', }; } } PKCA#]��A��?system/helixultimate/vendor/league/uri/UriTemplate/Template.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\UriTemplate; use BackedEnum; use Deprecated; use League\Uri\Exceptions\SyntaxError; use Stringable; use function array_filter; use function array_map; use function array_reduce; use function array_unique; use function preg_match_all; use function preg_replace; use function str_replace; use function strpbrk; use const PREG_SET_ORDER; /** * @internal The class exposes the internal representation of a Template and its usage */ final class Template implements Stringable { /** * Expression regular expression pattern. */ private const REGEXP_EXPRESSION_DETECTOR = '/(?<expression>\{[^}]*})/x'; /** @var array<Expression> */ private readonly array $expressions; /** @var array<string> */ public readonly array $variableNames; private function __construct(public readonly string $value, Expression ...$expressions) { $this->expressions = $expressions; $this->variableNames = array_unique( array_merge( ...array_map( static fn (Expression $expression): array => $expression->variableNames, $expressions ) ) ); } /** * @throws SyntaxError if the template contains invalid expressions * @throws SyntaxError if the template contains invalid variable specification */ public static function new(BackedEnum|Stringable|string $template): self { if ($template instanceof BackedEnum) { $template = $template->value; } $template = (string) $template; /** @var string $remainder */ $remainder = preg_replace(self::REGEXP_EXPRESSION_DETECTOR, '', $template); false === strpbrk($remainder, '{}') || throw new SyntaxError('The template "'.$template.'" contains invalid expressions.'); preg_match_all(self::REGEXP_EXPRESSION_DETECTOR, $template, $founds, PREG_SET_ORDER); return new self($template, ...array_values( array_reduce($founds, function (array $carry, array $found): array { if (!isset($carry[$found['expression']])) { $carry[$found['expression']] = Expression::new($found['expression']); } return $carry; }, []) )); } /** * @throws TemplateCanNotBeExpanded if the variables are invalid */ public function expand(iterable $variables = []): string { if (!$variables instanceof VariableBag) { $variables = new VariableBag($variables); } return $this->expandAll($variables); } /** * @throws TemplateCanNotBeExpanded if the variables are invalid or missing */ public function expandOrFail(iterable $variables = []): string { if (!$variables instanceof VariableBag) { $variables = new VariableBag($variables); } $missing = array_filter($this->variableNames, fn (string $name): bool => !isset($variables[$name])); if ([] !== $missing) { throw TemplateCanNotBeExpanded::dueToMissingVariables(...$missing); } return $this->expandAll($variables); } private function expandAll(VariableBag $variables): string { return array_reduce( $this->expressions, fn (string $uri, Expression $expr): string => str_replace($expr->value, $expr->expand($variables), $uri), $this->value ); } public function __toString(): string { return $this->value; } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @throws SyntaxError if the template contains invalid expressions * @throws SyntaxError if the template contains invalid variable specification * @deprecated Since version 7.0.0 * @codeCoverageIgnore * @see Template::new() * * Create a new instance from a string. * */ #[Deprecated(message:'use League\Uri\UriTemplate\Template::new() instead', since:'league/uri:7.0.0')] public static function createFromString(Stringable|string $template): self { return self::new($template); } } PKCA#]Mf���Bsystem/helixultimate/vendor/league/uri/UriTemplate/VariableBag.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\UriTemplate; use ArrayAccess; use BackedEnum; use Closure; use Countable; use IteratorAggregate; use League\Uri\StringCoercionMode; use Stringable; use Traversable; use function array_filter; use function array_key_exists; use function array_map; use function count; use function is_array; use const ARRAY_FILTER_USE_BOTH; /** * @internal The class exposes the internal representation of variable bags * * @phpstan-type InputValue string|bool|int|float|array<string|bool|int|float> * * @implements ArrayAccess<string, InputValue> * @implements IteratorAggregate<string, InputValue> */ final class VariableBag implements ArrayAccess, Countable, IteratorAggregate { /** * @var array<string,string|array<string>> */ private array $variables = []; /** * @param iterable<array-key, InputValue> $variables */ public function __construct(iterable $variables = []) { foreach ($variables as $name => $value) { $this->assign((string) $name, $value); } } public function count(): int { return count($this->variables); } public function getIterator(): Traversable { yield from $this->variables; } public function offsetExists(mixed $offset): bool { return array_key_exists($offset, $this->variables); } public function offsetUnset(mixed $offset): void { unset($this->variables[$offset]); } public function offsetSet(mixed $offset, mixed $value): void { $this->assign($offset, $value); /* @phpstan-ignore-line */ } public function offsetGet(mixed $offset): mixed { return $this->fetch($offset); } /** * Tells whether the bag is empty or not. */ public function isEmpty(): bool { return [] === $this->variables; } /** * Tells whether the bag is empty or not. */ public function isNotEmpty(): bool { return [] !== $this->variables; } public function equals(mixed $value): bool { return $value instanceof self && $this->variables === $value->variables; } /** * Fetches the variable value if none found returns null. * * @return null|string|array<string> */ public function fetch(string $name): null|string|array { return $this->variables[$name] ?? null; } /** * @param Stringable|InputValue $value */ public function assign(string $name, BackedEnum|Stringable|string|bool|int|float|array|null $value): void { $this->variables[$name] = self::normalizeValue($value, $name, isNestedListAllowed: true); } /** * @param Stringable|InputValue $value * * @throws TemplateCanNotBeExpanded if the value contains nested list */ private static function normalizeValue( BackedEnum|Stringable|string|bool|int|float|array|null $value, string $name, bool $isNestedListAllowed ): array|string { return match (true) { !is_array($value) => (string) StringCoercionMode::Native->coerce($value), !$isNestedListAllowed => throw TemplateCanNotBeExpanded::dueToNestedListOfValue($name), default => array_map(fn ($var) => self::normalizeValue($var, $name, isNestedListAllowed: false), $value), }; } /** * Replaces elements from passed variables into the current instance. */ public function replace(VariableBag $variables): self { return new self($this->variables + $variables->variables); } /** * Filters elements using the closure. */ public function filter(Closure $fn): self { return new self(array_filter($this->variables, $fn, ARRAY_FILTER_USE_BOTH)); } } PKCA#]�)jGGOsystem/helixultimate/vendor/league/uri/UriTemplate/TemplateCanNotBeExpanded.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\UriTemplate; use InvalidArgumentException; use League\Uri\Contracts\UriException; class TemplateCanNotBeExpanded extends InvalidArgumentException implements UriException { public readonly array $variablesNames; public function __construct(string $message = '', string ...$variableNames) { parent::__construct($message, 0, null); $this->variablesNames = $variableNames; } public static function dueToUnableToProcessValueListWithPrefix(string $variableName): self { return new self('The ":" modifier cannot be applied on "'.$variableName.'" since it is a list of values.', $variableName); } public static function dueToNestedListOfValue(string $variableName): self { return new self('The "'.$variableName.'" cannot be a nested list.', $variableName); } public static function dueToMissingVariables(string ...$variableNames): self { return new self('The following required variables are missing: `'.implode('`, `', $variableNames).'`.', ...$variableNames); } } PKCA#]���'P'P2system/helixultimate/vendor/league/uri/BaseUri.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use Deprecated; use JsonSerializable; use League\Uri\Contracts\UriAccess; use League\Uri\Contracts\UriInterface; use League\Uri\Exceptions\MissingFeature; use League\Uri\Idna\Converter as IdnaConverter; use League\Uri\IPv4\Converter as IPv4Converter; use League\Uri\IPv6\Converter as IPv6Converter; use Psr\Http\Message\UriFactoryInterface; use Psr\Http\Message\UriInterface as Psr7UriInterface; use Stringable; use function array_pop; use function array_reduce; use function count; use function explode; use function implode; use function in_array; use function preg_match; use function rawurldecode; use function sort; use function str_contains; use function str_repeat; use function str_replace; use function strpos; use function substr; /** * @phpstan-import-type ComponentMap from UriInterface * @deprecated since version 7.6.0 * * @see Modifier * @see Uri */ class BaseUri implements Stringable, JsonSerializable, UriAccess { /** @var array<string,int> */ final protected const WHATWG_SPECIAL_SCHEMES = ['ftp' => 1, 'http' => 1, 'https' => 1, 'ws' => 1, 'wss' => 1]; /** @var array<string,int> */ final protected const DOT_SEGMENTS = ['.' => 1, '..' => 1]; protected readonly Psr7UriInterface|UriInterface|null $origin; protected readonly ?string $nullValue; /** * @param UriFactoryInterface|null $uriFactory Deprecated, will be removed in the next major release */ final protected function __construct( protected readonly Psr7UriInterface|UriInterface $uri, protected readonly ?UriFactoryInterface $uriFactory ) { $this->nullValue = $this->uri instanceof Psr7UriInterface ? '' : null; $this->origin = $this->computeOrigin($this->uri, $this->nullValue); } public static function from(Stringable|string $uri, ?UriFactoryInterface $uriFactory = null): static { $uri = static::formatHost(static::filterUri($uri, $uriFactory)); return new static($uri, $uriFactory); } public function withUriFactory(UriFactoryInterface $uriFactory): static { return new static($this->uri, $uriFactory); } public function withoutUriFactory(): static { return new static($this->uri, null); } public function getUri(): Psr7UriInterface|UriInterface { return $this->uri; } public function getUriString(): string { return $this->uri->__toString(); } public function jsonSerialize(): string { return $this->uri->__toString(); } public function __toString(): string { return $this->uri->__toString(); } public function origin(): ?self { return match (null) { $this->origin => null, default => new self($this->origin, $this->uriFactory), }; } /** * Returns the Unix filesystem path. * * The method will return null if a scheme is present and is not the `file` scheme */ public function unixPath(): ?string { return match ($this->uri->getScheme()) { 'file', $this->nullValue => rawurldecode($this->uri->getPath()), default => null, }; } /** * Returns the Windows filesystem path. * * The method will return null if a scheme is present and is not the `file` scheme */ public function windowsPath(): ?string { static $regexpWindowsPath = ',^(?<root>[a-zA-Z]:),'; if (!in_array($this->uri->getScheme(), ['file', $this->nullValue], true)) { return null; } $originalPath = $this->uri->getPath(); $path = $originalPath; if ('/' === ($path[0] ?? '')) { $path = substr($path, 1); } if (1 === preg_match($regexpWindowsPath, $path, $matches)) { $root = $matches['root']; $path = substr($path, strlen($root)); return $root.str_replace('/', '\\', rawurldecode($path)); } $host = $this->uri->getHost(); return match ($this->nullValue) { $host => str_replace('/', '\\', rawurldecode($originalPath)), default => '\\\\'.$host.'\\'.str_replace('/', '\\', rawurldecode($path)), }; } /** * Returns a string representation of a File URI according to RFC8089. * * The method will return null if the URI scheme is not the `file` scheme */ public function toRfc8089(): ?string { $path = $this->uri->getPath(); return match (true) { 'file' !== $this->uri->getScheme() => null, in_array($this->uri->getAuthority(), ['', null, 'localhost'], true) => 'file:'.match (true) { '' === $path, '/' === $path[0] => $path, default => '/'.$path, }, default => (string) $this->uri, }; } /** * Tells whether the `file` scheme base URI represents a local file. */ public function isLocalFile(): bool { return match (true) { 'file' !== $this->uri->getScheme() => false, in_array($this->uri->getAuthority(), ['', null, 'localhost'], true) => true, default => false, }; } /** * Tells whether the URI is opaque or not. * * A URI is opaque if and only if it is absolute * and does not have an authority path. */ public function isOpaque(): bool { return $this->nullValue === $this->uri->getAuthority() && $this->isAbsolute(); } /** * Tells whether two URI do not share the same origin. */ public function isCrossOrigin(Stringable|string $uri): bool { if (null === $this->origin) { return true; } $uri = static::filterUri($uri); $uriOrigin = $this->computeOrigin($uri, $uri instanceof Psr7UriInterface ? '' : null); return match(true) { null === $uriOrigin, $uriOrigin->__toString() !== $this->origin->__toString() => true, default => false, }; } /** * Tells whether the URI is absolute. */ public function isAbsolute(): bool { return $this->nullValue !== $this->uri->getScheme(); } /** * Tells whether the URI is a network path. */ public function isNetworkPath(): bool { return $this->nullValue === $this->uri->getScheme() && $this->nullValue !== $this->uri->getAuthority(); } /** * Tells whether the URI is an absolute path. */ public function isAbsolutePath(): bool { return $this->nullValue === $this->uri->getScheme() && $this->nullValue === $this->uri->getAuthority() && '/' === ($this->uri->getPath()[0] ?? ''); } /** * Tells whether the URI is a relative path. */ public function isRelativePath(): bool { return $this->nullValue === $this->uri->getScheme() && $this->nullValue === $this->uri->getAuthority() && '/' !== ($this->uri->getPath()[0] ?? ''); } /** * Tells whether both URI refers to the same document. */ public function isSameDocument(Stringable|string $uri): bool { return self::normalizedUri($this->uri)->equals(self::normalizedUri($uri)); } private static function normalizedUri(Stringable|string $uri): Uri { // Normalize the URI according to RFC3986 $uri = ($uri instanceof Uri ? $uri : Uri::new($uri))->normalize(); return $uri //Normalization as per WHATWG URL standard //only meaningful for WHATWG Special URI scheme protocol ->when( condition: '' === $uri->getPath() && null !== $uri->getAuthority(), onSuccess: fn (Uri $uri) => $uri->withPath('/'), ) //Sorting as per WHATWG URLSearchParams class //not included on any equivalence algorithm ->when( condition: null !== ($query = $uri->getQuery()) && str_contains($query, '&'), onSuccess: function (Uri $uri) use ($query) { $pairs = explode('&', (string) $query); sort($pairs); return $uri->withQuery(implode('&', $pairs)); } ); } /** * Tells whether the URI contains an Internationalized Domain Name (IDN). */ public function hasIdn(): bool { return IdnaConverter::isIdn($this->uri->getHost()); } /** * Tells whether the URI contains an IPv4 regardless if it is mapped or native. */ public function hasIPv4(): bool { return IPv4Converter::fromEnvironment()->isIpv4($this->uri->getHost()); } /** * Resolves a URI against a base URI using RFC3986 rules. * * This method MUST retain the state of the submitted URI instance, and return * a URI instance of the same type that contains the applied modifications. * * This method MUST be transparent when dealing with error and exceptions. * It MUST not alter or silence them apart from validating its own parameters. */ public function resolve(Stringable|string $uri): static { $resolved = UriString::resolve($uri, $this->uri); return new static(match ($this->uriFactory) { null => Uri::new($resolved), default => $this->uriFactory->createUri($resolved), }, $this->uriFactory); } /** * Relativize a URI according to a base URI. * * This method MUST retain the state of the submitted URI instance, and return * a URI instance of the same type that contains the applied modifications. * * This method MUST be transparent when dealing with error and exceptions. * It MUST not alter of silence them apart from validating its own parameters. */ public function relativize(Stringable|string $uri): static { $uri = static::formatHost(static::filterUri($uri, $this->uriFactory)); if ($this->canNotBeRelativize($uri)) { return new static($uri, $this->uriFactory); } $null = $uri instanceof Psr7UriInterface ? '' : null; $uri = $uri->withScheme($null)->withPort(null)->withUserInfo($null)->withHost($null); $targetPath = $uri->getPath(); $basePath = $this->uri->getPath(); return new static( match (true) { $targetPath !== $basePath => $uri->withPath(static::relativizePath($targetPath, $basePath)), static::componentEquals('query', $uri) => $uri->withPath('')->withQuery($null), $null === $uri->getQuery() => $uri->withPath(static::formatPathWithEmptyBaseQuery($targetPath)), default => $uri->withPath(''), }, $this->uriFactory ); } final protected function computeOrigin(Psr7UriInterface|UriInterface $uri, ?string $nullValue): Psr7UriInterface|UriInterface|null { if ($uri instanceof Uri) { $origin = $uri->getOrigin(); if (null === $origin) { return null; } return Uri::tryNew($origin); } $origin = Uri::tryNew($uri)?->getOrigin(); if (null === $origin) { return null; } $components = UriString::parse($origin); return $uri ->withFragment($nullValue) ->withQuery($nullValue) ->withPath('') ->withScheme('localhost') ->withHost((string) $components['host']) ->withPort($components['port']) ->withScheme((string) $components['scheme']) ->withUserInfo($nullValue); } /** * Input URI normalization to allow Stringable and string URI. */ final protected static function filterUri(Stringable|string $uri, UriFactoryInterface|null $uriFactory = null): Psr7UriInterface|UriInterface { return match (true) { $uri instanceof UriAccess => $uri->getUri(), $uri instanceof Psr7UriInterface, $uri instanceof UriInterface => $uri, $uriFactory instanceof UriFactoryInterface => $uriFactory->createUri((string) $uri), default => Uri::new($uri), }; } /** * Tells whether the component value from both URI object equals. * * @pqram 'query'|'authority'|'scheme' $property */ final protected function componentEquals(string $property, Psr7UriInterface|UriInterface $uri): bool { $getComponent = function (string $property, Psr7UriInterface|UriInterface $uri): ?string { $component = match ($property) { 'query' => $uri->getQuery(), 'authority' => $uri->getAuthority(), default => $uri->getScheme(), }; return match (true) { $uri instanceof UriInterface, '' !== $component => $component, default => null, }; }; return $getComponent($property, $uri) === $getComponent($property, $this->uri); } /** * Filter the URI object. */ final protected static function formatHost(Psr7UriInterface|UriInterface $uri): Psr7UriInterface|UriInterface { $host = $uri->getHost(); try { $converted = IPv4Converter::fromEnvironment()->toDecimal($host); } catch (MissingFeature) { $converted = null; } if (false === filter_var($converted, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { $converted = IPv6Converter::compress($host); } return match (true) { null !== $converted => $uri->withHost($converted), '' === $host, $uri instanceof UriInterface => $uri, default => $uri->withHost((string) Uri::fromComponents(['host' => $host])->getHost()), }; } /** * Tells whether the submitted URI object can be relativized. */ final protected function canNotBeRelativize(Psr7UriInterface|UriInterface $uri): bool { return !static::componentEquals('scheme', $uri) || !static::componentEquals('authority', $uri) || static::from($uri)->isRelativePath(); } /** * Relatives the URI for an authority-less target URI. */ final protected static function relativizePath(string $path, string $basePath): string { $baseSegments = static::getSegments($basePath); $targetSegments = static::getSegments($path); $targetBasename = array_pop($targetSegments); array_pop($baseSegments); foreach ($baseSegments as $offset => $segment) { if (!isset($targetSegments[$offset]) || $segment !== $targetSegments[$offset]) { break; } unset($baseSegments[$offset], $targetSegments[$offset]); } $targetSegments[] = $targetBasename; return static::formatPath( str_repeat('../', count($baseSegments)).implode('/', $targetSegments), $basePath ); } /** * returns the path segments. * * @return string[] */ final protected static function getSegments(string $path): array { return explode('/', match (true) { '' === $path, '/' !== $path[0] => $path, default => substr($path, 1), }); } /** * Formatting the path to keep a valid URI. */ final protected static function formatPath(string $path, string $basePath): string { $colonPosition = strpos($path, ':'); $slashPosition = strpos($path, '/'); return match (true) { '' === $path => match (true) { '' === $basePath, '/' === $basePath => $basePath, default => './', }, false === $colonPosition => $path, false === $slashPosition, $colonPosition < $slashPosition => "./$path", default => $path, }; } /** * Formatting the path to keep a resolvable URI. */ final protected static function formatPathWithEmptyBaseQuery(string $path): string { $targetSegments = static::getSegments($path); $basename = $targetSegments[array_key_last($targetSegments)]; return '' === $basename ? './' : $basename; } /** * Normalizes a URI for comparison; this URI string representation is not suitable for usage as per RFC guidelines. * * @deprecated since version 7.6.0 * * @codeCoverageIgnore */ #[Deprecated(message:'no longer used by the isSameDocument method', since:'league/uri-interfaces:7.6.0')] final protected function normalize(Psr7UriInterface|UriInterface $uri): string { $newUri = $uri->withScheme($uri instanceof Psr7UriInterface ? '' : null); if ('' === $newUri->__toString()) { return ''; } return UriString::normalize($newUri); } /** * Remove dot segments from the URI path as per RFC specification. * * @deprecated since version 7.6.0 * * @codeCoverageIgnore */ #[Deprecated(message:'no longer used by the isSameDocument method', since:'league/uri-interfaces:7.6.0')] final protected function removeDotSegments(string $path): string { if (!str_contains($path, '.')) { return $path; } $reducer = function (array $carry, string $segment): array { if ('..' === $segment) { array_pop($carry); return $carry; } if (!isset(static::DOT_SEGMENTS[$segment])) { $carry[] = $segment; } return $carry; }; $oldSegments = explode('/', $path); $newPath = implode('/', array_reduce($oldSegments, $reducer(...), [])); if (isset(static::DOT_SEGMENTS[$oldSegments[array_key_last($oldSegments)]])) { $newPath .= '/'; } // @codeCoverageIgnoreStart // added because some PSR-7 implementations do not respect RFC3986 if (str_starts_with($path, '/') && !str_starts_with($newPath, '/')) { return '/'.$newPath; } // @codeCoverageIgnoreEnd return $newPath; } /** * Resolves an URI path and query component. * * @return array{0:string, 1:string|null} * * @deprecated since version 7.6.0 * * @codeCoverageIgnore */ #[Deprecated(message:'no longer used by the isSameDocument method', since:'league/uri-interfaces:7.6.0')] final protected function resolvePathAndQuery(Psr7UriInterface|UriInterface $uri): array { $targetPath = $uri->getPath(); $null = $uri instanceof Psr7UriInterface ? '' : null; if (str_starts_with($targetPath, '/')) { return [$targetPath, $uri->getQuery()]; } if ('' === $targetPath) { $targetQuery = $uri->getQuery(); if ($null === $targetQuery) { $targetQuery = $this->uri->getQuery(); } $targetPath = $this->uri->getPath(); //@codeCoverageIgnoreStart //because some PSR-7 Uri implementations allow this RFC3986 forbidden construction if (null !== $this->uri->getAuthority() && !str_starts_with($targetPath, '/')) { $targetPath = '/'.$targetPath; } //@codeCoverageIgnoreEnd return [$targetPath, $targetQuery]; } $basePath = $this->uri->getPath(); if (null !== $this->uri->getAuthority() && '' === $basePath) { $targetPath = '/'.$targetPath; } if ('' !== $basePath) { $segments = explode('/', $basePath); array_pop($segments); if ([] !== $segments) { $targetPath = implode('/', $segments).'/'.$targetPath; } } return [$targetPath, $uri->getQuery()]; } } PKCA#]�V�� � 4system/helixultimate/vendor/league/uri/composer.jsonnu�[���{ "name": "league/uri", "type": "library", "description" : "URI manipulation library", "keywords": [ "url", "uri", "urn", "uri-template", "rfc2141", "rfc3986", "rfc3987", "rfc8141", "rfc6570", "psr-7", "parse_url", "http", "https", "ws", "ftp", "data-uri", "file-uri", "middleware", "parse_str", "query-string", "querystring", "hostname" ], "license": "MIT", "homepage": "https://uri.thephpleague.com", "authors": [ { "name" : "Ignace Nyamagana Butera", "email" : "nyamsprod@gmail.com", "homepage" : "https://nyamsprod.com" } ], "support": { "forum": "https://thephpleague.slack.com", "docs": "https://uri.thephpleague.com", "issues": "https://github.com/thephpleague/uri-src/issues" }, "funding": [ { "type": "github", "url": "https://github.com/sponsors/nyamsprod" } ], "require": { "php": "^8.1", "league/uri-interfaces": "^7.8.1", "psr/http-factory": "^1" }, "autoload": { "psr-4": { "League\\Uri\\": "" } }, "conflict": { "league/uri-schemes": "^1.0" }, "suggest": { "ext-bcmath": "to improve IPV4 host parsing", "ext-dom": "to convert the URI into an HTML anchor tag", "ext-fileinfo": "to create Data URI from file contennts", "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", "ext-uri": "to use the PHP native URI class", "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", "league/uri-components" : "to provide additional tools to manipulate URI objects components", "league/uri-polyfill" : "to backport the PHP URI extension for older versions of PHP", "php-64bit": "to improve IPV4 host parsing", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present", "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification" }, "extra": { "branch-alias": { "dev-master": "7.x-dev" } }, "config": { "sort-packages": true } } PKCA#]S۔ڋ(�(2system/helixultimate/vendor/league/uri/Builder.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use BackedEnum; use League\Uri\Contracts\Conditionable; use League\Uri\Contracts\FragmentDirective; use League\Uri\Contracts\Transformable; use League\Uri\Contracts\UriComponentInterface; use League\Uri\Exceptions\SyntaxError; use SensitiveParameter; use Stringable; use Throwable; use TypeError; use Uri\Rfc3986\Uri as Rfc3986Uri; use Uri\WhatWg\Url as WhatWgUrl; use function is_bool; use function str_replace; use function strpos; final class Builder implements Conditionable, Transformable { private ?string $scheme = null; private ?string $username = null; private ?string $password = null; private ?string $host = null; private ?int $port = null; private ?string $path = null; private ?string $query = null; private ?string $fragment = null; public function __construct( BackedEnum|Stringable|string|null $scheme = null, BackedEnum|Stringable|string|null $username = null, #[SensitiveParameter] BackedEnum|Stringable|string|null $password = null, BackedEnum|Stringable|string|null $host = null, BackedEnum|int|null $port = null, BackedEnum|Stringable|string|null $path = null, BackedEnum|Stringable|string|null $query = null, BackedEnum|Stringable|string|null $fragment = null, ) { $this ->scheme($scheme) ->userInfo($username, $password) ->host($host) ->port($port) ->path($path) ->query($query) ->fragment($fragment); } /** * @throws SyntaxError */ public function scheme(BackedEnum|Stringable|string|null $scheme): self { $scheme = $this->filterString($scheme); if ($scheme !== $this->scheme) { UriString::isValidScheme($scheme) || throw new SyntaxError('The scheme `'.$scheme.'` is invalid.'); $this->scheme = $scheme; } return $this; } /** * @throws SyntaxError */ public function userInfo( BackedEnum|Stringable|string|null $user, #[SensitiveParameter] BackedEnum|Stringable|string|null $password = null ): static { $username = Encoder::encodeUser($this->filterString($user)); $password = Encoder::encodePassword($this->filterString($password)); if ($username !== $this->username || $password !== $this->password) { $this->username = $username; $this->password = $password; } return $this; } /** * @throws SyntaxError */ public function host(BackedEnum|Stringable|string|null $host): self { $host = $this->filterString($host); if ($host !== $this->host) { null === $host || HostRecord::isValid($host) || throw new SyntaxError('The host `'.$host.'` is invalid.'); $this->host = $host; } return $this; } /** * @throws SyntaxError * @throws TypeError */ public function port(BackedEnum|int|null $port): self { if ($port instanceof BackedEnum) { 1 === preg_match('/^\d+$/', (string) $port->value) || throw new TypeError('The port must be a valid BackedEnum containing a number.'); $port = (int) $port->value; } if ($port !== $this->port) { null === $port || ($port >= 0 && $port < 65535) || throw new SyntaxError('The port value must be null or an integer between 0 and 65535.'); $this->port = $port; } return $this; } /** * @throws SyntaxError */ public function authority(BackedEnum|Stringable|string|null $authority): self { ['user' => $user, 'pass' => $pass, 'host' => $host, 'port' => $port] = UriString::parseAuthority($authority); return $this ->userInfo($user, $pass) ->host($host) ->port($port); } /** * @throws SyntaxError */ public function path(BackedEnum|Stringable|string|null $path): self { $path = $this->filterString($path); if ($path !== $this->path) { $this->path = null !== $path ? Encoder::encodePath($path) : null; } return $this; } /** * @throws SyntaxError */ public function query(BackedEnum|Stringable|string|null $query): self { $query = $this->filterString($query); if ($query !== $this->query) { $this->query = Encoder::encodeQueryOrFragment($query); } return $this; } /** * @throws SyntaxError */ public function fragment(BackedEnum|Stringable|string|null $fragment): self { $fragment = $this->filterString($fragment); if ($fragment !== $this->fragment) { $this->fragment = Encoder::encodeQueryOrFragment($fragment); } return $this; } /** * Puts back the Builder in a freshly created state. */ public function reset(): self { $this->scheme = null; $this->username = null; $this->password = null; $this->host = null; $this->port = null; $this->path = null; $this->query = null; $this->fragment = null; return $this; } /** * Executes the given callback with the current instance * and returns the current instance. * * @param callable(self): self $callback */ public function transform(callable $callback): static { return $callback($this); } public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): static { if (!is_bool($condition)) { $condition = $condition($this); } return match (true) { $condition => $onSuccess($this), null !== $onFail => $onFail($this), default => $this, } ?? $this; } /** * @throws SyntaxError if the URI can not be build with the current Builder state */ public function guard(Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string|null $baseUri = null): self { try { $this->build($baseUri); return $this; } catch (Throwable $exception) { throw new SyntaxError('The current builder cannot generate a valid URI.', previous: $exception); } } /** * Tells whether the URI can be built with the current Builder state. */ public function validate(Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string|null $baseUri = null): bool { try { $this->build($baseUri); return true; } catch (Throwable) { return false; } } public function build(Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string|null $baseUri = null): Uri { $authority = $this->buildAuthority(); $path = $this->buildPath($authority); $uriString = UriString::buildUri( $this->scheme, $authority, $path, Encoder::encodeQueryOrFragment($this->query), Encoder::encodeQueryOrFragment($this->fragment) ); return Uri::new(null === $baseUri ? $uriString : UriString::resolve($uriString, match (true) { $baseUri instanceof Rfc3986Uri => $baseUri->toString(), $baseUri instanceof WhatWgUrl => $baseUri->toAsciiString(), default => $baseUri, })); } /** * @throws SyntaxError */ private function buildAuthority(): ?string { if (null === $this->host) { (null === $this->username && null === $this->password && null === $this->port) || throw new SyntaxError('The User Information and/or the Port component(s) are set without a Host component being present.'); return null; } $authority = $this->host; if (null !== $this->username || null !== $this->password) { $userInfo = Encoder::encodeUser($this->username); if (null !== $this->password) { $userInfo .= ':'.Encoder::encodePassword($this->password); } $authority = $userInfo.'@'.$authority; } if (null !== $this->port) { return $authority.':'.$this->port; } return $authority; } /** * @throws SyntaxError */ private function buildPath(?string $authority): ?string { if (null === $this->path || '' === $this->path) { return $this->path; } $path = Encoder::encodePath($this->path); if (null !== $authority) { return str_starts_with($path, '/') ? $path : '/'.$path; } if (str_starts_with($path, '//')) { return '/.'.$path; } $colonPos = strpos($path, ':'); if (false !== $colonPos && null === $this->scheme) { $slashPos = strpos($path, '/'); (false !== $slashPos && $colonPos > $slashPos) || throw new SyntaxError('In absence of the scheme and authority components, the first path segment cannot contain a colon (":") character.'); } return $path; } /** * Filter a string. * * @throws SyntaxError if the submitted data cannot be converted to string */ private function filterString(BackedEnum|Stringable|string|null $str): ?string { $str = match (true) { $str instanceof FragmentDirective => $str->toFragmentValue(), $str instanceof UriComponentInterface => $str->value(), $str instanceof BackedEnum => (string) $str->value, null === $str => null, default => (string) $str, }; if (null === $str) { return null; } $str = str_replace(' ', '%20', $str); return UriString::containsRfc3987Chars($str) ? $str : throw new SyntaxError('The component value `'.$str.'` contains invalid characters.'); } } PKCA#]�gF�H�H.system/helixultimate/vendor/league/uri/Urn.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use BackedEnum; use Closure; use JsonSerializable; use League\Uri\Contracts\Conditionable; use League\Uri\Contracts\Transformable; use League\Uri\Contracts\UriComponentInterface; use League\Uri\Contracts\UriInterface; use League\Uri\Exceptions\SyntaxError; use League\Uri\UriTemplate\Template; use Stringable; use Uri\Rfc3986\Uri as Rfc3986Uri; use Uri\WhatWg\Url as WhatWgUrl; use function is_bool; use function preg_match; use function str_replace; use function strtolower; /** * @phpstan-type UrnSerialize array{0: array{urn: non-empty-string}, 1: array{}} * @phpstan-import-type InputComponentMap from UriString * @phpstan-type UrnMap array{ * scheme: 'urn', * nid: string, * nss: string, * r_component: ?string, * q_component: ?string, * f_component: ?string, * } */ final class Urn implements Conditionable, Stringable, JsonSerializable, Transformable { /** * RFC8141 regular expression URN splitter. * * The regexp does not perform any look-ahead. * Not all invalid URN are caught. Some * post-regexp-validation checks * are mandatory. * * @link https://datatracker.ietf.org/doc/html/rfc8141#section-2 * * @var string */ private const REGEXP_URN_PARTS = '/^ urn: (?<nid>[a-z0-9](?:[a-z0-9-]{0,30}[a-z0-9])?): # NID (?<nss>.*?) # NSS (?<frc>\?\+(?<rcomponent>.*?))? # r-component (?<fqc>\?\=(?<qcomponent>.*?))? # q-component (?:\#(?<fcomponent>.*))? # f-component $/xi'; /** * RFC8141 namespace identifier regular expression. * * @link https://datatracker.ietf.org/doc/html/rfc8141#section-2 * * @var string */ private const REGEX_NID_SEQUENCE = '/^[a-z0-9]([a-z0-9-]{0,30})[a-z0-9]$/xi'; /** @var non-empty-string */ private readonly string $uriString; /** @var non-empty-string */ private readonly string $nid; /** @var non-empty-string */ private readonly string $nss; /** @var non-empty-string|null */ private readonly ?string $rComponent; /** @var non-empty-string|null */ private readonly ?string $qComponent; /** @var non-empty-string|null */ private readonly ?string $fComponent; /** * @param Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string $urn the percent-encoded URN */ public static function parse(Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string $urn): ?Urn { try { return self::fromString($urn); } catch (SyntaxError) { return null; } } /** * @param Rfc3986Uri|WhatWgUrl|Stringable|string $urn the percent-encoded URN * @see self::fromString() * * @throws SyntaxError if the URN is invalid */ public static function new(Rfc3986Uri|WhatWgUrl|Stringable|string $urn): self { return self::fromString($urn); } /** * @param Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string $urn the percent-encoded URN * * @throws SyntaxError if the URN is invalid */ public static function fromString(Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string $urn): self { $urn = match (true) { $urn instanceof Rfc3986Uri => $urn->toRawString(), $urn instanceof WhatWgUrl => $urn->toAsciiString(), $urn instanceof BackedEnum => (string) $urn->value, default => (string) $urn, }; UriString::containsRfc3986Chars($urn) || throw new SyntaxError('The URN is malformed, it contains invalid characters.'); 1 === preg_match(self::REGEXP_URN_PARTS, $urn, $matches) || throw new SyntaxError('The URN string is invalid.'); return new self( nid: $matches['nid'], nss: $matches['nss'], rComponent: (isset($matches['frc']) && '' !== $matches['frc']) ? $matches['rcomponent'] : null, qComponent: (isset($matches['fqc']) && '' !== $matches['fqc']) ? $matches['qcomponent'] : null, fComponent: $matches['fcomponent'] ?? null, ); } /** * Create a new instance from a hash representation of the URI similar * to PHP parse_url function result. * * @param InputComponentMap $components a hash representation of the URI similar to PHP parse_url function result */ public static function fromComponents(array $components = []): self { $components += [ 'scheme' => null, 'user' => null, 'pass' => null, 'host' => null, 'port' => null, 'path' => '', 'query' => null, 'fragment' => null, ]; return self::fromString(UriString::build($components)); } /** * @param Stringable|string $nss the percent-encoded NSS * * @throws SyntaxError if the URN is invalid */ public static function fromRfc2141(BackedEnum|Stringable|string $nid, BackedEnum|Stringable|string $nss): self { if ($nid instanceof BackedEnum) { $nid = $nid->value; } if ($nss instanceof BackedEnum) { $nss = $nss->value; } return new self((string) $nid, (string) $nss); } /** * @param string $nss the percent-encoded NSS * @param ?string $rComponent the percent-encoded r-component * @param ?string $qComponent the percent-encoded q-component * @param ?string $fComponent the percent-encoded f-component * * @throws SyntaxError if one of the URN part is invalid */ private function __construct( string $nid, string $nss, ?string $rComponent = null, ?string $qComponent = null, ?string $fComponent = null, ) { ('' !== $nid && 1 === preg_match(self::REGEX_NID_SEQUENCE, $nid)) || throw new SyntaxError('The URN is malformed, the NID is invalid.'); ('' !== $nss && Encoder::isPathEncoded($nss)) || throw new SyntaxError('The URN is malformed, the NSS is invalid.'); /** @param Closure(string): ?non-empty-string $closure */ $validateComponent = static fn (?string $value, Closure $closure, string $name): ?string => match (true) { null === $value, ('' !== $value && 1 !== preg_match('/[#?]/', $value) && $closure($value)) => $value, default => throw new SyntaxError('The URN is malformed, the `'.$name.'` component is invalid.'), }; $this->nid = $nid; $this->nss = $nss; $this->rComponent = $validateComponent($rComponent, Encoder::isPathEncoded(...), 'r-component'); $this->qComponent = $validateComponent($qComponent, Encoder::isQueryEncoded(...), 'q-component'); $this->fComponent = $validateComponent($fComponent, Encoder::isFragmentEncoded(...), 'f-component'); $this->uriString = $this->setUriString(); } /** * @return non-empty-string */ private function setUriString(): string { $str = $this->toRfc2141(); if (null !== $this->rComponent) { $str .= '?+'.$this->rComponent; } if (null !== $this->qComponent) { $str .= '?='.$this->qComponent; } if (null !== $this->fComponent) { $str .= '#'.$this->fComponent; } return $str; } /** * Returns the NID. * * @return non-empty-string */ public function getNid(): string { return $this->nid; } /** * Returns the percent-encoded NSS. * * @return non-empty-string */ public function getNss(): string { return $this->nss; } /** * Returns the percent-encoded r-component string or null if it is not set. * * @return ?non-empty-string */ public function getRComponent(): ?string { return $this->rComponent; } /** * Returns the percent-encoded q-component string or null if it is not set. * * @return ?non-empty-string */ public function getQComponent(): ?string { return $this->qComponent; } /** * Returns the percent-encoded f-component string or null if it is not set. * * @return ?non-empty-string */ public function getFComponent(): ?string { return $this->fComponent; } /** * Returns the RFC8141 URN string representation. * * @return non-empty-string */ public function toString(): string { return $this->uriString; } /** * Returns the RFC2141 URN string representation. * * @return non-empty-string */ public function toRfc2141(): string { return 'urn:'.$this->nid.':'.$this->nss; } /** * Returns the human-readable string representation of the URN as an IRI. * * @see https://datatracker.ietf.org/doc/html/rfc3987 */ public function toDisplayString(): string { return UriString::toIriString($this->uriString); } /** * Returns the RFC8141 URN string representation. * * @see self::toString() * * @return non-empty-string */ public function __toString(): string { return $this->toString(); } /** * Returns the RFC8141 URN string representation. * @see self::toString() * * @return non-empty-string */ public function jsonSerialize(): string { return $this->toString(); } /** * Returns the RFC3986 representation of the current URN. * * If a template URI is used the following variables as present * {nid} for the namespace identifier * {nss} for the namespace specific string * {r_component} for the r-component without its delimiter * {q_component} for the q-component without its delimiter * {f_component} for the f-component without its delimiter */ public function resolve(UriTemplate|Template|BackedEnum|string|null $template = null): UriInterface { return null !== $template ? Uri::fromTemplate($template, $this->toComponents()) : Uri::new($this->uriString); } public function hasRComponent(): bool { return null !== $this->rComponent; } public function hasQComponent(): bool { return null !== $this->qComponent; } public function hasFComponent(): bool { return null !== $this->fComponent; } public function hasOptionalComponent(): bool { return null !== $this->rComponent || null !== $this->qComponent || null !== $this->fComponent; } /** * Return an instance with the specified NID. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified NID. * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. */ public function withNid(BackedEnum|Stringable|string $nid): self { if ($nid instanceof BackedEnum) { $nid = $nid->value; } $nid = (string) $nid; return $this->nid === $nid ? $this : new self( nid: $nid, nss: $this->nss, rComponent: $this->rComponent, qComponent: $this->qComponent, fComponent: $this->fComponent, ); } /** * Return an instance with the specified NSS. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified NSS. * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. */ public function withNss(BackedEnum|Stringable|string $nss): self { $nss = Encoder::encodePath($nss); return $this->nss === $nss ? $this : new self( nid: $this->nid, nss: $nss, rComponent: $this->rComponent, qComponent: $this->qComponent, fComponent: $this->fComponent, ); } /** * Return an instance with the specified r-component. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified r-component. * * The component is removed if the value is null. * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. */ public function withRComponent(BackedEnum|Stringable|string|null $component): self { if ($component instanceof BackedEnum) { $component = (string) $component->value; } if ($component instanceof UriComponentInterface) { $component = $component->value(); } if (null !== $component) { $component = self::formatComponent(Encoder::encodePath($component)); } return $this->rComponent === $component ? $this : new self( nid: $this->nid, nss: $this->nss, rComponent: $component, qComponent: $this->qComponent, fComponent: $this->fComponent, ); } private static function formatComponent(?string $component): ?string { return null === $component ? null : str_replace(['?', '#'], ['%3F', '%23'], $component); } /** * Return an instance with the specified q-component. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified q-component. * * The component is removed if the value is null. * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. */ public function withQComponent(BackedEnum|Stringable|string|null $component): self { if ($component instanceof UriComponentInterface) { $component = $component->value(); } $component = self::formatComponent(Encoder::encodeQueryOrFragment($component)); return $this->qComponent === $component ? $this : new self( nid: $this->nid, nss: $this->nss, rComponent: $this->rComponent, qComponent: $component, fComponent: $this->fComponent, ); } /** * Return an instance with the specified f-component. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified f-component. * * The component is removed if the value is null. * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. */ public function withFComponent(BackedEnum|Stringable|string|null $component): self { if ($component instanceof UriComponentInterface) { $component = $component->value(); } $component = self::formatComponent(Encoder::encodeQueryOrFragment($component)); return $this->fComponent === $component ? $this : new self( nid: $this->nid, nss: $this->nss, rComponent: $this->rComponent, qComponent: $this->qComponent, fComponent: $component, ); } public function normalize(): self { $copy = new self( nid: strtolower($this->nid), nss: (string) Encoder::normalizePath($this->nss), rComponent: null === $this->rComponent ? $this->rComponent : Encoder::normalizePath($this->rComponent), qComponent: Encoder::normalizeQuery($this->qComponent), fComponent: Encoder::normalizeFragment($this->fComponent), ); return $copy->uriString === $this->uriString ? $this : $copy; } public function equals(Urn|Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string $other, UrnComparisonMode $urnComparisonMode = UrnComparisonMode::ExcludeComponents): bool { if (!$other instanceof Urn) { $other = self::parse($other); } return (null !== $other) && match ($urnComparisonMode) { UrnComparisonMode::ExcludeComponents => $other->normalize()->toRfc2141() === $this->normalize()->toRfc2141(), UrnComparisonMode::IncludeComponents => $other->normalize()->toString() === $this->normalize()->toString(), }; } public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): static { if (!is_bool($condition)) { $condition = $condition($this); } return match (true) { $condition => $onSuccess($this), null !== $onFail => $onFail($this), default => $this, } ?? $this; } public function transform(callable $callback): static { return $callback($this); } /** * @return UrnSerialize */ public function __serialize(): array { return [['urn' => $this->toString()], []]; } /** * @param UrnSerialize $data * * @throws SyntaxError */ public function __unserialize(array $data): void { [$properties] = $data; $uri = self::fromString($properties['urn'] ?? throw new SyntaxError('The `urn` property is missing from the serialized object.')); $this->nid = $uri->nid; $this->nss = $uri->nss; $this->rComponent = $uri->rComponent; $this->qComponent = $uri->qComponent; $this->fComponent = $uri->fComponent; $this->uriString = $uri->uriString; } /** * @return UrnMap */ public function toComponents(): array { return [ 'scheme' => 'urn', 'nid' => $this->nid, 'nss' => $this->nss, 'r_component' => $this->rComponent, 'q_component' => $this->qComponent, 'f_component' => $this->fComponent, ]; } /** * @return UrnMap */ public function __debugInfo(): array { return $this->toComponents(); } } PKCA#]�K����.system/helixultimate/vendor/league/uri/Uri.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use BackedEnum; use Closure; use Deprecated; use finfo; use League\Uri\Contracts\Conditionable; use League\Uri\Contracts\FragmentDirective; use League\Uri\Contracts\Transformable; use League\Uri\Contracts\UriComponentInterface; use League\Uri\Contracts\UriException; use League\Uri\Contracts\UriInterface; use League\Uri\Exceptions\MissingFeature; use League\Uri\Exceptions\SyntaxError; use League\Uri\Idna\Converter as IdnaConverter; use League\Uri\IPv4\Converter as IPv4Converter; use League\Uri\IPv6\Converter as IPv6Converter; use League\Uri\UriTemplate\TemplateCanNotBeExpanded; use Psr\Http\Message\UriInterface as Psr7UriInterface; use RuntimeException; use SensitiveParameter; use SplFileInfo; use SplFileObject; use Stringable; use Throwable; use TypeError; use Uri\Rfc3986\Uri as Rfc3986Uri; use Uri\WhatWg\Url as WhatWgUrl; use function array_filter; use function array_key_last; use function array_map; use function array_pop; use function array_shift; use function base64_decode; use function base64_encode; use function basename; use function count; use function dirname; use function explode; use function fclose; use function feof; use function file_get_contents; use function filter_var; use function fopen; use function fread; use function fwrite; use function gettype; use function implode; use function in_array; use function is_bool; use function is_object; use function is_resource; use function is_string; use function preg_match; use function preg_replace; use function preg_replace_callback; use function rawurldecode; use function rawurlencode; use function restore_error_handler; use function set_error_handler; use function sprintf; use function str_contains; use function str_repeat; use function str_replace; use function str_starts_with; use function strlen; use function strpos; use function strspn; use function strtolower; use function substr; use function trim; use const FILEINFO_MIME; use const FILEINFO_MIME_TYPE; use const FILTER_FLAG_IPV4; use const FILTER_NULL_ON_FAILURE; use const FILTER_VALIDATE_BOOLEAN; use const FILTER_VALIDATE_EMAIL; use const FILTER_VALIDATE_IP; /** * @phpstan-import-type ComponentMap from UriString * @phpstan-import-type InputComponentMap from UriString */ final class Uri implements Conditionable, UriInterface, Transformable { /** * RFC3986 invalid characters. * * @link https://tools.ietf.org/html/rfc3986#section-2.2 * * @var string */ private const REGEXP_INVALID_CHARS = '/[\x00-\x1f\x7f]/'; /** * RFC3986 IPvFuture host and port component. * * @var string */ private const REGEXP_HOST_PORT = ',^(?<host>(\[.*]|[^:])*)(:(?<port>[^/?#]*))?$,x'; /** * Regular expression pattern to for file URI. * <volume> contains the volume but not the volume separator. * The volume separator may be URL-encoded (`|` as `%7C`) by formatPath(), * so we account for that here. * * @var string */ private const REGEXP_FILE_PATH = ',^(?<delim>/)?(?<volume>[a-zA-Z])(?:[:|\|]|%7C)(?<rest>.*)?,'; /** * Mimetype regular expression pattern. * * @link https://tools.ietf.org/html/rfc2397 * * @var string */ private const REGEXP_MIMETYPE = ',^\w+/[-.\w]+(?:\+[-.\w]+)?$,'; /** * Base64 content regular expression pattern. * * @link https://tools.ietf.org/html/rfc2397 * * @var string */ private const REGEXP_BINARY = ',(;|^)base64$,'; /** * Windows filepath regular expression pattern. * <root> contains both the volume and volume separator. * * @var string */ private const REGEXP_WINDOW_PATH = ',^(?<root>[a-zA-Z][:|\|]),'; /** * Maximum number of cached items. * * @var int */ private const MAXIMUM_CACHED_ITEMS = 100; /** * All ASCII letters sorted by typical frequency of occurrence. * * @var string */ private const ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"; private readonly ?string $scheme; private readonly ?string $user; private readonly ?string $pass; private readonly ?string $userInfo; private readonly ?string $host; private readonly ?int $port; private readonly ?string $authority; private readonly string $path; private readonly ?string $query; private readonly ?string $fragment; private readonly string $uriAsciiString; private readonly string $uriUnicodeString; private readonly ?string $origin; private function __construct( ?string $scheme, ?string $user, #[SensitiveParameter] ?string $pass, ?string $host, ?int $port, string $path, ?string $query, ?string $fragment ) { $this->scheme = $this->formatScheme($scheme); $this->user = Encoder::encodeUser($user); $this->pass = Encoder::encodePassword($pass); $this->host = $this->formatHost($host); $this->port = $this->formatPort($port); $this->authority = UriString::buildAuthority([ 'scheme' => $this->scheme, 'user' => $this->user, 'pass' => $this->pass, 'host' => $this->host, 'port' => $this->port, ]); $this->path = $this->formatPath($path); $this->query = Encoder::encodeQueryOrFragment($query); $this->fragment = Encoder::encodeQueryOrFragment($fragment); $this->userInfo = null !== $this->pass ? $this->user.':'.$this->pass : $this->user; $this->uriAsciiString = UriString::buildUri($this->scheme, $this->authority, $this->path, $this->query, $this->fragment); $this->assertValidRfc3986Uri(); $this->assertValidState(); $this->origin = $this->setOrigin(); $host = $this->getUnicodeHost(); $this->uriUnicodeString = $host === $this->host ? $this->uriAsciiString : UriString::buildUri( $this->scheme, UriString::buildAuthority([...$this->toComponents(), ...['host' => $host]]), $this->path, $this->query, $this->fragment ); } /** * Format the Scheme and Host component. * * @throws SyntaxError if the scheme is invalid */ private function formatScheme(?string $scheme): ?string { if (null === $scheme) { return null; } $formattedScheme = strtolower($scheme); static $cache = []; if (isset($cache[$formattedScheme])) { return $formattedScheme; } null !== UriScheme::tryFrom($formattedScheme) || UriString::isValidScheme($formattedScheme) || throw new SyntaxError('The scheme `'.$scheme.'` is invalid.'); $cache[$formattedScheme] = 1; if (self::MAXIMUM_CACHED_ITEMS < count($cache)) { array_shift($cache); } return $formattedScheme; } /** * Validate and Format the Host component. */ private function formatHost(?string $host): ?string { return HostRecord::from($host)->toAscii(); } /** * Format the Port component. * * @throws SyntaxError */ private function formatPort(BackedEnum|int|null $port = null): ?int { if ($port instanceof BackedEnum) { $port = (string) $port->value; 1 === preg_match('/^\d+$/', $port) || throw new SyntaxError('The port `'.$port.'` is invalid.'); $port = (int) $port; } $defaultPort = null !== $this->scheme ? UriScheme::tryFrom($this->scheme)?->port() : null; return match (true) { null === $port, $defaultPort === $port => null, 0 > $port => throw new SyntaxError('The port `'.$port.'` is invalid.'), default => $port, }; } /** * Create a new instance from a string or a stringable structure or returns null on failure. */ public static function tryNew(Rfc3986Uri|WhatWgUrl|Urn|Stringable|string $uri = ''): ?self { try { return self::new($uri); } catch (Throwable) { return null; } } /** * Create a new instance from a string. */ public static function new(Rfc3986Uri|WhatWgUrl|Urn|BackedEnum|Stringable|string $uri = ''): self { if ($uri instanceof Rfc3986Uri) { return new self( $uri->getRawScheme(), $uri->getRawUsername(), $uri->getRawPassword(), $uri->getRawHost(), $uri->getPort(), $uri->getRawPath(), $uri->getRawQuery(), $uri->getRawFragment() ); } if ($uri instanceof WhatWgUrl) { return new self( $uri->getScheme(), $uri->getUsername(), $uri->getPassword(), $uri->getAsciiHost(), $uri->getPort(), $uri->getPath(), $uri->getQuery(), $uri->getFragment(), ); } if ($uri instanceof BackedEnum) { $uri = $uri->value; } $uri = (string) $uri; trim($uri) === $uri || throw new SyntaxError(sprintf('The uri `%s` contains invalid characters', $uri)); return new self(...UriString::parse(str_replace(' ', '%20', $uri))); } /** * Returns a new instance from a URI and a Base URI.or null on failure. * * The returned URI must be absolute if a base URI is provided */ public static function parse(Rfc3986Uri|WhatWgUrl|Urn|BackedEnum|Stringable|string $uri, Rfc3986Uri|WhatWgUrl|Urn|BackedEnum|Stringable|string|null $baseUri = null): ?self { try { if (null === $baseUri) { return self::new($uri); } if ($uri instanceof Rfc3986Uri) { $uri = $uri->toRawString(); } if ($uri instanceof WhatWgUrl) { $uri = $uri->toAsciiString(); } if ($baseUri instanceof Rfc3986Uri) { $baseUri = $baseUri->toRawString(); } if ($baseUri instanceof WhatWgUrl) { $baseUri = $baseUri->toAsciiString(); } return self::new(UriString::resolve($uri, $baseUri)); } catch (Throwable) { return null; } } /** * Creates a new instance from a template. * * @throws TemplateCanNotBeExpanded if the variables are invalid or missing * @throws UriException if the resulting expansion cannot be converted to a UriInterface instance */ public static function fromTemplate(BackedEnum|UriTemplate|Stringable|string $template, iterable $variables = []): self { return match (true) { $template instanceof UriTemplate => self::new($template->expand($variables)), $template instanceof UriTemplate\Template => self::new($template->expand($variables)), default => self::new(UriTemplate\Template::new($template)->expand($variables)), }; } /** * Create a new instance from a hash representation of the URI similar * to PHP parse_url function result. * * @param InputComponentMap $components a hash representation of the URI similar to PHP parse_url function result */ public static function fromComponents(array $components = []): self { $components += [ 'scheme' => null, 'user' => null, 'pass' => null, 'host' => null, 'port' => null, 'path' => '', 'query' => null, 'fragment' => null, ]; if (null === $components['path']) { $components['path'] = ''; } return new self( $components['scheme'], $components['user'], $components['pass'], $components['host'], $components['port'], $components['path'], $components['query'], $components['fragment'] ); } /** * Create a new instance from a data file path. * * @param SplFileInfo|SplFileObject|resource|Stringable|string $path * @param ?resource $context * * @throws MissingFeature If ext/fileinfo is not installed * @throws SyntaxError If the file does not exist or is not readable */ public static function fromFileContents(mixed $path, $context = null): self { FeatureDetection::supportsFileDetection(); $finfo = new finfo(FILEINFO_MIME_TYPE); $bufferSize = 8192; /** @var Closure(SplFileobject): array{0:string, 1:string} $fromFileObject */ $fromFileObject = function (SplFileObject $path) use ($finfo, $bufferSize): array { $raw = $path->fread($bufferSize); false !== $raw || throw new SyntaxError('The file `'.$path.'` does not exist or is not readable.'); $mimetype = (string) $finfo->buffer($raw); while (!$path->eof()) { $raw .= $path->fread($bufferSize); } return [$mimetype, $raw]; }; /** @var Closure(resource): array{0:string, 1:string} $fromResource */ $fromResource = function ($stream) use ($finfo, $path, $bufferSize): array { set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); $raw = fread($stream, $bufferSize); false !== $raw || throw new SyntaxError('The file `'.$path.'` does not exist or is not readable.'); $mimetype = (string) $finfo->buffer($raw); while (!feof($stream)) { $raw .= fread($stream, $bufferSize); } restore_error_handler(); return [$mimetype, $raw]; }; /** @var Closure(Stringable|string, resource|null): array{0:string, 1:string} $fromPath */ $fromPath = function (Stringable|string $path, $context) use ($finfo): array { $path = (string) $path; set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); $raw = file_get_contents(filename: $path, context: $context); restore_error_handler(); false !== $raw || throw new SyntaxError('The file `'.$path.'` does not exist or is not readable.'); $mimetype = (string) $finfo->file(filename: $path, flags: FILEINFO_MIME, context: $context); return [$mimetype, $raw]; }; [$mimetype, $raw] = match (true) { $path instanceof SplFileObject => $fromFileObject($path), $path instanceof SplFileInfo => $fromFileObject($path->openFile(mode: 'rb', context: $context)), is_resource($path) => $fromResource($path), $path instanceof Stringable, is_string($path) => $fromPath($path, $context), default => throw new TypeError('The path `'.$path.'` is not a valid resource.'), }; return Uri::fromComponents([ 'scheme' => 'data', 'path' => str_replace(' ', '', $mimetype.';base64,'.base64_encode($raw)), ]); } /** * Create a new instance from a data URI string. * * @throws SyntaxError If the parameter syntax is invalid */ public static function fromData(BackedEnum|Stringable|string $data, string $mimetype = '', string $parameters = ''): self { static $regexpMimetype = ',^\w+/[-.\w]+(?:\+[-.\w]+)?$,'; $mimetype = match (true) { '' === $mimetype => 'text/plain', 1 === preg_match($regexpMimetype, $mimetype) => $mimetype, default => throw new SyntaxError('Invalid mimeType, `'.$mimetype.'`.'), }; if ($data instanceof BackedEnum) { $data = $data->value; } $data = (string) $data; if ('' === $parameters) { return self::fromComponents([ 'scheme' => 'data', 'path' => self::formatDataPath($mimetype.','.rawurlencode($data)), ]); } $isInvalidParameter = static function (string $parameter): bool { $properties = explode('=', $parameter); return 2 !== count($properties) || 'base64' === strtolower($properties[0]); }; if (str_starts_with($parameters, ';')) { $parameters = substr($parameters, 1); } return match ([]) { array_filter(explode(';', $parameters), $isInvalidParameter) => self::fromComponents([ 'scheme' => 'data', 'path' => self::formatDataPath($mimetype.';'.$parameters.','.rawurlencode($data)), ]), default => throw new SyntaxError(sprintf('Invalid mediatype parameters, `%s`.', $parameters)) }; } /** * Create a new instance from a Unix path string. */ public static function fromUnixPath(BackedEnum|Stringable|string $path): self { if ($path instanceof BackedEnum) { $path = $path->value; } $path = implode('/', array_map(rawurlencode(...), explode('/', (string) $path))); return Uri::fromComponents(match (true) { '/' !== ($path[0] ?? '') => ['path' => $path], default => ['path' => $path, 'scheme' => 'file', 'host' => ''], }); } /** * Create a new instance from a local Windows path string. */ public static function fromWindowsPath(BackedEnum|Stringable|string $path): self { if ($path instanceof BackedEnum) { $path = $path->value; } $root = ''; $path = (string) $path; if (1 === preg_match(self::REGEXP_WINDOW_PATH, $path, $matches)) { $root = substr($matches['root'], 0, -1).':'; $path = substr($path, strlen($root)); } $path = str_replace('\\', '/', $path); $path = implode('/', array_map(rawurlencode(...), explode('/', $path))); //Local Windows absolute path if ('' !== $root) { return Uri::fromComponents(['path' => '/'.$root.$path, 'scheme' => 'file', 'host' => '']); } //UNC Windows Path if (!str_starts_with($path, '//')) { return Uri::fromComponents(['path' => $path]); } [$host, $path] = explode('/', substr($path, 2), 2) + [1 => '']; return Uri::fromComponents(['host' => $host, 'path' => '/'.$path, 'scheme' => 'file']); } /** * Creates a new instance from a RFC8089 compatible URI. * * @see https://datatracker.ietf.org/doc/html/rfc8089 */ public static function fromRfc8089(BackedEnum|Stringable|string $uri): static { if ($uri instanceof BackedEnum) { $uri = $uri->value; } $fileUri = self::new((string) preg_replace(',^(file:/)([^/].*)$,i', 'file:///$2', (string) $uri)); $scheme = $fileUri->getScheme(); return match (true) { 'file' !== $scheme => throw new SyntaxError('As per RFC8089, the URI scheme must be `file`.'), 'localhost' === $fileUri->getAuthority() => $fileUri->withHost(''), default => $fileUri, }; } /** * Create a new instance from the environment. */ public static function fromServer(array $server): self { $components = ['scheme' => self::fetchScheme($server)]; [$components['user'], $components['pass']] = self::fetchUserInfo($server); [$components['host'], $components['port']] = self::fetchHostname($server); [$components['path'], $components['query']] = self::fetchRequestUri($server); return Uri::fromComponents($components); } /** * Returns the environment scheme. */ private static function fetchScheme(array $server): string { $server += ['HTTPS' => '']; return match (true) { false !== filter_var($server['HTTPS'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) => 'https', default => 'http', }; } /** * Returns the environment user info. * * @return non-empty-array {0: ?string, 1: ?string} */ private static function fetchUserInfo(array $server): array { $server += ['PHP_AUTH_USER' => null, 'PHP_AUTH_PW' => null, 'HTTP_AUTHORIZATION' => '']; $user = $server['PHP_AUTH_USER']; $pass = $server['PHP_AUTH_PW']; if (str_starts_with(strtolower($server['HTTP_AUTHORIZATION']), 'basic')) { $userinfo = base64_decode(substr($server['HTTP_AUTHORIZATION'], 6), true); false !== $userinfo || throw new SyntaxError('The user info could not be detected'); [$user, $pass] = explode(':', $userinfo, 2) + [1 => null]; } if (null !== $user) { $user = rawurlencode($user); } if (null !== $pass) { $pass = rawurlencode($pass); } return [$user, $pass]; } /** * Returns the environment host. * * @throws SyntaxError If the host cannot be detected * * @return array{0:string|null, 1:int|null} */ private static function fetchHostname(array $server): array { $server += ['SERVER_PORT' => null]; if (null !== $server['SERVER_PORT']) { $server['SERVER_PORT'] = (int) $server['SERVER_PORT']; } if (isset($server['HTTP_HOST']) && 1 === preg_match(self::REGEXP_HOST_PORT, $server['HTTP_HOST'], $matches)) { $matches += ['host' => null, 'port' => null]; if (null !== $matches['port']) { $matches['port'] = (int) $matches['port']; } return [$matches['host'], $matches['port'] ?? $server['SERVER_PORT']]; } isset($server['SERVER_ADDR']) || throw new SyntaxError('The host could not be detected'); if (false === filter_var($server['SERVER_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { return ['['.$server['SERVER_ADDR'].']', $server['SERVER_PORT']]; } return [$server['SERVER_ADDR'], $server['SERVER_PORT']]; } /** * Returns the environment path. * * @return list<?string> */ private static function fetchRequestUri(array $server): array { $server += ['IIS_WasUrlRewritten' => null, 'UNENCODED_URL' => '', 'PHP_SELF' => '', 'QUERY_STRING' => null]; if ('1' === $server['IIS_WasUrlRewritten'] && '' !== $server['UNENCODED_URL']) { return explode('?', $server['UNENCODED_URL'], 2) + [1 => null]; } if (isset($server['REQUEST_URI'])) { [$path] = explode('?', $server['REQUEST_URI'], 2); $query = ('' !== $server['QUERY_STRING']) ? $server['QUERY_STRING'] : null; return [$path, $query]; } return [$server['PHP_SELF'], $server['QUERY_STRING']]; } /** * Format the Path component. */ private function formatPath(string $path): string { $path = match ($this->scheme) { 'data' => Encoder::encodePath(self::formatDataPath($path)), 'file' => self::formatFilePath(Encoder::encodePath($path)), default => Encoder::encodePath($path), }; if ('' === $path) { return $path; } if (null !== $this->authority) { // If there is an authority, the path must start with a `/` return str_starts_with($path, '/') ? $path : '/'.$path; } // If there is no authority, the path cannot start with `//` if (str_starts_with($path, '//')) { return '/.'.$path; } $colonPos = strpos($path, ':'); if (false !== $colonPos && null === $this->scheme) { // In the absence of a scheme and of an authority, // the first path segment cannot contain a colon (":") character.' $slashPos = strpos($path, '/'); (false !== $slashPos && $colonPos > $slashPos) || throw new SyntaxError( 'In absence of the scheme and authority components, the first path segment cannot contain a colon (":") character.' ); } return $path; } /** * Filter the Path component. * * @link https://tools.ietf.org/html/rfc2397 * * @throws SyntaxError If the path is not compliant with RFC2397 */ private static function formatDataPath(string $path): string { if ('' == $path) { return 'text/plain;charset=us-ascii,'; } if (strlen($path) !== strspn($path, self::ASCII) || !str_contains($path, ',')) { throw new SyntaxError('The path `'.$path.'` is invalid according to RFC2937.'); } $parts = explode(',', $path, 2) + [1 => null]; $mediatype = explode(';', (string) $parts[0], 2) + [1 => null]; $data = (string) $parts[1]; $mimetype = $mediatype[0]; if (null === $mimetype || '' === $mimetype) { $mimetype = 'text/plain'; } $parameters = $mediatype[1]; if (null === $parameters || '' === $parameters) { $parameters = 'charset=us-ascii'; } self::assertValidPath($mimetype, $parameters, $data); return $mimetype.';'.$parameters.','.$data; } /** * Assert the path is a compliant with RFC2397. * * @link https://tools.ietf.org/html/rfc2397 * * @throws SyntaxError If the mediatype or the data are not compliant with the RFC2397 */ private static function assertValidPath(string $mimetype, string $parameters, string $data): void { 1 === preg_match(self::REGEXP_MIMETYPE, $mimetype) || throw new SyntaxError('The path mimetype `'.$mimetype.'` is invalid.'); $isBinary = 1 === preg_match(self::REGEXP_BINARY, $parameters, $matches); if ($isBinary) { $parameters = substr($parameters, 0, - strlen($matches[0])); } $res = array_filter(array_filter(explode(';', $parameters), self::validateParameter(...))); [] === $res || throw new SyntaxError('The path parameters `'.$parameters.'` is invalid.'); if (!$isBinary) { return; } $res = base64_decode($data, true); if (false === $res || $data !== base64_encode($res)) { throw new SyntaxError('The path data `'.$data.'` is invalid.'); } } /** * Validate mediatype parameter. */ private static function validateParameter(string $parameter): bool { $properties = explode('=', $parameter); return 2 != count($properties) || 'base64' === strtolower($properties[0]); } /** * Format the path component for the URI scheme file. */ private static function formatFilePath(string $path): string { return (string) preg_replace_callback( self::REGEXP_FILE_PATH, static fn (array $matches): string => $matches['delim'].$matches['volume'].(isset($matches['rest']) ? ':'.$matches['rest'] : ''), $path ); } /** * assert the URI internal state is valid. * * @link https://tools.ietf.org/html/rfc3986#section-3 * @link https://tools.ietf.org/html/rfc3986#section-3.3 * * @throws SyntaxError if the URI is in an invalid state, according to RFC3986 */ private function assertValidRfc3986Uri(): void { if (null !== $this->authority && ('' !== $this->path && '/' !== $this->path[0])) { throw new SyntaxError('If an authority is present the path must be empty or start with a `/`.'); } if (null === $this->authority && str_starts_with($this->path, '//')) { throw new SyntaxError('If there is no authority the path `'.$this->path.'` cannot start with a `//`.'); } $pos = strpos($this->path, ':'); if (null === $this->authority && null === $this->scheme && false !== $pos && !str_contains(substr($this->path, 0, $pos), '/') ) { throw new SyntaxError('In absence of a scheme and an authority the first path segment cannot contain a colon (":") character.'); } } /** * assert the URI scheme is valid. * * @link https://w3c.github.io/FileAPI/#url * @link https://datatracker.ietf.org/doc/html/rfc2397 * @link https://tools.ietf.org/html/rfc3986#section-3 * @link https://tools.ietf.org/html/rfc3986#section-3.3 * * @throws SyntaxError if the URI is in an invalid state, according to scheme-specific rules */ private function assertValidState(): void { $scheme = UriScheme::tryFrom((string) $this->scheme); if (null === $scheme) { return; } $schemeType = $scheme->type(); match ($scheme) { UriScheme::Blob => $this->isValidBlob(), UriScheme::Mailto => $this->isValidMailto(), UriScheme::Data, UriScheme::About, UriScheme::Javascript => $this->isUriWithSchemeAndPathOnly(), UriScheme::File => $this->isUriWithSchemeHostAndPathOnly(), UriScheme::Ftp, UriScheme::Gopher, UriScheme::Afp, UriScheme::Dict, UriScheme::Msrps, UriScheme::Msrp, UriScheme::Mtqp, UriScheme::Rsync, UriScheme::Ssh, UriScheme::Svn, UriScheme::Snmp => $this->isNonEmptyHostUriWithoutFragmentAndQuery(), UriScheme::Https, UriScheme::Http => $this->isNonEmptyHostUri(), UriScheme::Ws, UriScheme::Wss, UriScheme::Ipp, UriScheme::Ipps => $this->isNonEmptyHostUriWithoutFragment(), UriScheme::Ldap, UriScheme::Ldaps, UriScheme::Acap, UriScheme::Imaps, UriScheme::Imap, UriScheme::Redis => null === $this->fragment, UriScheme::Prospero => null === $this->fragment && null === $this->query && null === $this->userInfo, UriScheme::Urn => null !== Urn::parse($this->uriAsciiString), UriScheme::Telnet, UriScheme::Tn3270 => null === $this->fragment && null === $this->query && in_array($this->path, ['', '/'], true), UriScheme::Vnc => null !== $this->authority && null === $this->fragment && '' === $this->path, default => $schemeType->isUnknown() || ($schemeType->isOpaque() && null === $this->authority) || ($schemeType->isHierarchical() && null !== $this->authority), } || throw new SyntaxError('The uri `'.$this->uriAsciiString.'` is invalid for the `'.$this->scheme.'` scheme.'); } private function isValidBlob(): bool { static $regexpUuidRfc4122 = '/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i'; if (!$this->isUriWithSchemeAndPathOnly() || '' === $this->path || !str_contains($this->path, '/') || str_ends_with($this->path, '/') || 1 !== preg_match($regexpUuidRfc4122, basename($this->path)) ) { return false; } $origin = dirname($this->path); if ('null' === $origin) { return true; } try { $components = UriString::parse($origin); return '' === $components['path'] && null === $components['query'] && null === $components['fragment'] && true === UriScheme::tryFrom((string) $components['scheme'])?->isWhatWgSpecial(); } catch (UriException) { return false; } } private function isValidMailto(): bool { if (null !== $this->authority || null !== $this->fragment || str_contains((string) $this->query, '?')) { return false; } static $mailHeaders = [ 'to', 'cc', 'bcc', 'reply-to', 'from', 'sender', 'resent-to', 'resent-cc', 'resent-bcc', 'resent-from', 'resent-sender', 'return-path', 'delivery-to', 'site-owner', ]; static $headerRegexp = '/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D'; $pairs = QueryString::parseFromValue($this->query); $hasTo = false; foreach ($pairs as [$name, $value]) { $headerName = strtolower($name); if (in_array($headerName, $mailHeaders, true)) { if (null === $value || !self::validateEmailList($value)) { return false; } if (!$hasTo && 'to' === $headerName) { $hasTo = true; } continue; } if (1 !== preg_match($headerRegexp, (string) Encoder::decodeAll($name))) { return false; } } return '' === $this->path ? $hasTo : self::validateEmailList($this->path); } private static function validateEmailList(string $emails): bool { foreach (explode(',', $emails) as $email) { if (false === filter_var((string) Encoder::decodeAll($email), FILTER_VALIDATE_EMAIL)) { return false; } } return '' !== $emails; } /** * Sets the URI origin. * * The origin read-only property of the URL interface returns a string containing * the Unicode serialization of the represented URL. */ private function setOrigin(): ?string { try { if ('blob' !== $this->scheme) { if (!(UriScheme::tryFrom($this->scheme ?? '')?->isWhatWgSpecial() ?? false)) { return null; } $host = $this->host; $converted = $host; if (null !== $converted) { try { $converted = IPv4Converter::fromEnvironment()->toDecimal($host); } catch (MissingFeature) { $converted = null; } if (false === filter_var($converted, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { $converted = IPv6Converter::compress($host); } /** @var string $converted */ if ($converted !== $host) { $converted = Idna\Converter::toAscii($converted)->domain(); } } return $this ->withFragment(null) ->withQuery(null) ->withPath('') ->withUserInfo(null) ->withHost($converted) ->toString(); } $components = UriString::parse($this->path); $scheme = strtolower($components['scheme'] ?? ''); if (! (UriScheme::tryFrom($scheme)?->isWhatWgSpecial() ?? false)) { return null; } return self::fromComponents($components)->origin; } catch (UriException) { return null; } } /** * URI validation for URI schemes which allows only scheme and path components. */ private function isUriWithSchemeAndPathOnly(): bool { return null === $this->authority && null === $this->query && null === $this->fragment; } /** * URI validation for URI schemes which allows only scheme, host and path components. */ private function isUriWithSchemeHostAndPathOnly(): bool { return null === $this->userInfo && null === $this->port && null === $this->query && null === $this->fragment && !('' != $this->scheme && null === $this->host); } /** * URI validation for URI schemes which disallow the empty '' host. */ private function isNonEmptyHostUri(): bool { return '' !== $this->host && !(null !== $this->scheme && null === $this->host); } /** * URI validation for URIs schemes which disallow the empty '' host * and forbids the fragment component. */ private function isNonEmptyHostUriWithoutFragment(): bool { return $this->isNonEmptyHostUri() && null === $this->fragment; } /** * URI validation for URIs schemes which disallow the empty '' host * and forbids fragment and query components. */ private function isNonEmptyHostUriWithoutFragmentAndQuery(): bool { return $this->isNonEmptyHostUri() && null === $this->fragment && null === $this->query; } public function __toString(): string { return $this->toString(); } /** * Returns the string representation as a URI reference. * * @see http://tools.ietf.org/html/rfc3986#section-4.1 * @see ::toString */ public function jsonSerialize(): string { return $this->toString(); } /** * Returns the string representation as a URI reference. * * @see http://tools.ietf.org/html/rfc3986#section-4.1 */ public function toString(): string { return $this->toAsciiString(); } /** * Returns the string representation as a URI reference. * * @see http://tools.ietf.org/html/rfc3986#section-4.1 */ public function toAsciiString(): string { return $this->uriAsciiString; } /** * Returns the string representation as a URI reference. * * The host is converted to its UNICODE representation if available */ public function toUnicodeString(): string { return $this->uriUnicodeString; } /** * Returns the human-readable string representation of the URI as an IRI. * * @see https://datatracker.ietf.org/doc/html/rfc3987 */ public function toDisplayString(): string { return UriString::toIriString($this->toString()); } /** * Returns the Unix filesystem path. * * The method will return null if a scheme is present and is not the `file` scheme */ public function toUnixPath(): ?string { return match ($this->scheme) { 'file', null => rawurldecode($this->path), default => null, }; } /** * Returns the Windows filesystem path. * * The method will return null if a scheme is present and is not the `file` scheme */ public function toWindowsPath(): ?string { static $regexpWindowsPath = ',^(?<root>[a-zA-Z]:),'; if (!in_array($this->scheme, ['file', null], true)) { return null; } $originalPath = $this->path; $path = $originalPath; if ('/' === ($path[0] ?? '')) { $path = substr($path, 1); } if (1 === preg_match($regexpWindowsPath, $path, $matches)) { $root = $matches['root']; $path = substr($path, strlen($root)); return $root.str_replace('/', '\\', rawurldecode($path)); } $host = $this->host; return match (null) { $host => str_replace('/', '\\', rawurldecode($originalPath)), default => '\\\\'.$host.'\\'.str_replace('/', '\\', rawurldecode($path)), }; } /** * Returns a string representation of a File URI according to RFC8089. * * The method will return null if the URI scheme is not the `file` scheme * * @see https://datatracker.ietf.org/doc/html/rfc8089 */ public function toRfc8089(): ?string { $path = $this->path; return match (true) { 'file' !== $this->scheme => null, in_array($this->authority, ['', null, 'localhost'], true) => 'file:'.match (true) { '' === $path, '/' === $path[0] => $path, default => '/'.$path, }, default => $this->toString(), }; } /** * Save the data to a specific file. * * The method returns the number of bytes written to the file * or null for any other scheme except the data scheme * * @param SplFileInfo|SplFileObject|resource|Stringable|string $destination * @param ?resource $context * * @throws RuntimeException if the content cannot be stored. */ public function toFileContents(mixed $destination, $context = null): ?int { if ('data' !== $this->scheme) { return null; } [$mediaType, $document] = explode(',', $this->path, 2) + [0 => '', 1 => null]; null !== $document || throw new RuntimeException('Unable to extract the document part from the URI path.'); $data = match (true) { str_ends_with((string) $mediaType, ';base64') => (string) base64_decode($document, true), default => rawurldecode($document), }; $res = match (true) { $destination instanceof SplFileObject => $destination->fwrite($data), $destination instanceof SplFileInfo => $destination->openFile(mode:'wb', context: $context)->fwrite($data), is_resource($destination) => fwrite($destination, $data), $destination instanceof Stringable, is_string($destination) => (function () use ($destination, $data, $context): int|false { set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); $rsrc = fopen((string) $destination, mode:'wb', context: $context); if (false === $rsrc) { restore_error_handler(); throw new RuntimeException('Unable to open the destination file: '.$destination); } $bytes = fwrite($rsrc, $data); fclose($rsrc); restore_error_handler(); return $bytes; })(), default => throw new TypeError('Unsupported destination type; expected SplFileObject, SplFileInfo, resource or a string; '.(is_object($destination) ? $destination::class : gettype($destination)).' given.'), }; false !== $res || throw new RuntimeException('Unable to write to the destination file.'); return $res; } /** * Returns an associative array containing all the URI components. * * @return ComponentMap */ public function toComponents(): array { return [ 'scheme' => $this->scheme, 'user' => $this->user, 'pass' => $this->pass, 'host' => $this->host, 'port' => $this->port, 'path' => $this->path, 'query' => $this->query, 'fragment' => $this->fragment, ]; } public function getScheme(): ?string { return $this->scheme; } public function getAuthority(): ?string { return $this->authority; } /** * Returns the user component encoded value. * * @see https://wiki.php.net/rfc/url_parsing_api */ public function getUsername(): ?string { return $this->user; } public function getPassword(): ?string { return $this->pass; } public function getUserInfo(): ?string { return $this->userInfo; } public function getHost(): ?string { return $this->host; } public function getUnicodeHost(): ?string { if (null === $this->host) { return null; } $host = IdnaConverter::toUnicode($this->host)->domain(); if ($host === $this->host) { return $this->host; } return $host; } public function isIpv4Host(): bool { return HostRecord::isIpv4($this->host); } public function isIpv6Host(): bool { return HostRecord::isIpv6($this->host); } public function isIpvFutureHost(): bool { return HostRecord::isIpvFuture($this->host); } public function isIpHost(): bool { return HostRecord::isIp($this->host); } public function isRegisteredNameHost(): bool { return HostRecord::isRegisteredName($this->host); } public function isDomainHost(): bool { return HostRecord::isDomain($this->host); } public function getPort(): ?int { return $this->port; } public function getPath(): string { return $this->path; } public function getQuery(): ?string { return $this->query; } public function getFragment(): ?string { return $this->fragment; } public function getOrigin(): ?string { return $this->origin; } public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): static { if (!is_bool($condition)) { $condition = $condition($this); } return match (true) { $condition => $onSuccess($this), null !== $onFail => $onFail($this), default => $this, } ?? $this; } public function transform(callable $callback): static { return $callback($this); } public function withScheme(BackedEnum|Stringable|string|null $scheme): static { $scheme = $this->formatScheme($this->filterString($scheme)); return match ($scheme) { $this->scheme => $this, default => new self($scheme, $this->user, $this->pass, $this->host, $this->port, $this->path, $this->query, $this->fragment), }; } /** * Filter a string. * * @throws SyntaxError if the submitted data cannot be converted to string */ private function filterString(BackedEnum|Stringable|string|null $str): ?string { $str = match (true) { $str instanceof FragmentDirective => $str->toFragmentValue(), $str instanceof UriComponentInterface => $str->value(), $str instanceof BackedEnum => (string) $str->value, null === $str => null, default => (string) $str, }; return match (true) { null === $str => null, 1 === preg_match(self::REGEXP_INVALID_CHARS, $str) => throw new SyntaxError('The component `'.$str.'` contains invalid characters.'), default => $str, }; } public function withUserInfo( BackedEnum|Stringable|string|null $user, #[SensitiveParameter] BackedEnum|Stringable|string|null $password = null ): static { $user = Encoder::encodeUser($this->filterString($user)); $pass = Encoder::encodePassword($this->filterString($password)); $userInfo = $user; if (null !== $password) { $userInfo .= ':'.$pass; } return match ($userInfo) { $this->userInfo => $this, default => new self($this->scheme, $user, $pass, $this->host, $this->port, $this->path, $this->query, $this->fragment), }; } public function withUsername(BackedEnum|Stringable|string|null $user): static { return $this->withUserInfo($user, $this->pass); } public function withPassword(#[SensitiveParameter] BackedEnum|Stringable|string|null $password): static { return $this->withUserInfo($this->user, $password); } public function withHost(BackedEnum|Stringable|string|null $host): static { $host = $this->formatHost($this->filterString($host)); return match ($host) { $this->host => $this, default => new self($this->scheme, $this->user, $this->pass, $host, $this->port, $this->path, $this->query, $this->fragment), }; } public function withPort(BackedEnum|int|null $port): static { $port = $this->formatPort($port); return match ($port) { $this->port => $this, default => new self($this->scheme, $this->user, $this->pass, $this->host, $port, $this->path, $this->query, $this->fragment), }; } public function withPath(BackedEnum|Stringable|string $path): static { $path = $this->formatPath($this->filterString($path) ?? throw new SyntaxError('The path component cannot be null.')); return match ($path) { $this->path => $this, default => new self($this->scheme, $this->user, $this->pass, $this->host, $this->port, $path, $this->query, $this->fragment), }; } public function withQuery(BackedEnum|Stringable|string|null $query): static { $query = Encoder::encodeQueryOrFragment($this->filterString($query)); return match ($query) { $this->query => $this, default => new self($this->scheme, $this->user, $this->pass, $this->host, $this->port, $this->path, $query, $this->fragment), }; } public function withFragment(BackedEnum|Stringable|string|null $fragment): static { $fragment = Encoder::encodeQueryOrFragment($this->filterString($fragment)); return match ($fragment) { $this->fragment => $this, default => new self($this->scheme, $this->user, $this->pass, $this->host, $this->port, $this->path, $this->query, $fragment), }; } /** * Tells whether the `file` scheme base URI represents a local file. */ public function isLocalFile(): bool { return match (true) { 'file' !== $this->scheme => false, in_array($this->authority, ['', null, 'localhost'], true) => true, default => false, }; } /** * Tells whether the URI is opaque or not. * * A URI is opaque if and only if it is absolute * and does not have an authority path. */ public function isOpaque(): bool { return null === $this->authority && null !== $this->scheme; } /** * Tells whether two URI do not share the same origin. */ public function isCrossOrigin(Rfc3986Uri|WhatWgUrl|Urn|Stringable|string $uri): bool { if (null === $this->origin) { return true; } $uri = self::tryNew($uri); if (null === $uri || null === ($origin = $uri->getOrigin())) { return true; } return $this->origin !== $origin; } public function isSameOrigin(Rfc3986Uri|WhatWgUrl|Urn|Stringable|string $uri): bool { return ! $this->isCrossOrigin($uri); } /** * Tells whether the URI is absolute. */ public function isAbsolute(): bool { return null !== $this->scheme; } /** * Tells whether the URI is a network path. */ public function isNetworkPath(): bool { return null === $this->scheme && null !== $this->authority; } /** * Tells whether the URI is an absolute path. */ public function isAbsolutePath(): bool { return null === $this->scheme && null === $this->authority && '/' === ($this->path[0] ?? ''); } /** * Tells whether the URI is a relative path. */ public function isRelativePath(): bool { return null === $this->scheme && null === $this->authority && '/' !== ($this->path[0] ?? ''); } /** * Tells whether both URIs refer to the same document. */ public function isSameDocument(Rfc3986Uri|WhatWgUrl|UriInterface|Stringable|Urn|string $uri): bool { return $this->equals($uri); } public function equals(Rfc3986Uri|WhatWgUrl|UriInterface|Stringable|Urn|string $uri, UriComparisonMode $uriComparisonMode = UriComparisonMode::ExcludeFragment): bool { if (!$uri instanceof UriInterface && !$uri instanceof Rfc3986Uri && !$uri instanceof WhatWgUrl) { $uri = self::tryNew($uri); } if (null === $uri) { return false; } $baseUri = $this; if (UriComparisonMode::ExcludeFragment === $uriComparisonMode) { $uri = $uri->withFragment(null); $baseUri = $baseUri->withFragment(null); } return $baseUri->normalize()->toString() === match (true) { $uri instanceof Rfc3986Uri => $uri->toString(), $uri instanceof WhatWgUrl => $uri->toAsciiString(), default => $uri->normalize()->toString(), }; } /** * Normalize a URI by applying non-destructive and destructive normalization * rules as defined in RFC3986 and RFC3987. */ public function normalize(): static { $uriString = $this->toString(); if ('' === $uriString) { return $this; } $normalizedUriString = UriString::normalize($uriString); $normalizedUri = self::new($normalizedUriString); if (null !== $normalizedUri->getAuthority() && ('' === $normalizedUri->getPath() && (UriScheme::tryFrom($normalizedUri->getScheme() ?? '')?->isWhatWgSpecial() ?? false))) { $normalizedUri = $normalizedUri->withPath('/'); } if ($normalizedUri->toString() === $uriString) { return $this; } return $normalizedUri; } /** * Resolves a URI against a base URI using RFC3986 rules. * * This method MUST retain the state of the submitted URI instance, and return * a URI instance of the same type that contains the applied modifications. * * This method MUST be transparent when dealing with errors and exceptions. * It MUST not alter or silence them apart from validating its own parameters. */ public function resolve(Rfc3986Uri|WhatWgUrl|UriInterface|Stringable|Urn|BackedEnum|string $uri): static { return self::new(UriString::resolve( match (true) { $uri instanceof UriInterface, $uri instanceof Rfc3986Uri => $uri->toString(), $uri instanceof WhatWgUrl => $uri->toAsciiString(), $uri instanceof BackedEnum => (string) $uri->value, default => $uri, }, $this->toString() )); } /** * Relativize a URI according to a base URI. * * This method MUST retain the state of the submitted URI instance, and return * a URI instance of the same type that contains the applied modifications. * * This method MUST be transparent when dealing with error and exceptions. * It MUST not alter of silence them apart from validating its own parameters. */ public function relativize(Rfc3986Uri|WhatWgUrl|UriInterface|Stringable|Urn|BackedEnum|string $uri): static { $uri = self::new($uri); if ( $this->scheme !== $uri->getScheme() || $this->authority !== $uri->getAuthority() || $uri->isRelativePath()) { return $uri; } $targetPath = $uri->getPath(); $basePath = $this->path; $uri = $uri ->withScheme(null) ->withUserInfo(null) ->withPort(null) ->withHost(null); return match (true) { $targetPath !== $basePath => $uri->withPath(self::relativizePath($targetPath, $basePath)), $this->query === $uri->getQuery() => $uri->withPath('')->withQuery(null), null === $uri->getQuery() => $uri->withPath(self::formatPathWithEmptyBaseQuery($targetPath)), default => $uri->withPath(''), }; } /** * Formatting the path to keep a resolvable URI. */ private static function formatPathWithEmptyBaseQuery(string $path): string { $targetSegments = self::getSegments($path); $basename = $targetSegments[array_key_last($targetSegments)]; return '' === $basename ? './' : $basename; } /** * Relatives the URI for an authority-less target URI. */ private static function relativizePath(string $path, string $basePath): string { $baseSegments = self::getSegments($basePath); $targetSegments = self::getSegments($path); $targetBasename = array_pop($targetSegments); array_pop($baseSegments); foreach ($baseSegments as $offset => $segment) { if (!isset($targetSegments[$offset]) || $segment !== $targetSegments[$offset]) { break; } unset($baseSegments[$offset], $targetSegments[$offset]); } $targetSegments[] = $targetBasename; return static::formatRelativePath( str_repeat('../', count($baseSegments)).implode('/', $targetSegments), $basePath ); } /** * Formatting the path to keep a valid URI. */ private static function formatRelativePath(string $path, string $basePath): string { $colonPosition = strpos($path, ':'); $slashPosition = strpos($path, '/'); return match (true) { '' === $path => match (true) { '' === $basePath, '/' === $basePath => $basePath, default => './', }, false === $colonPosition => $path, false === $slashPosition, $colonPosition < $slashPosition => "./$path", default => $path, }; } /** * returns the path segments. * * @return array<string> */ private static function getSegments(string $path): array { return explode('/', match (true) { '' === $path, '/' !== $path[0] => $path, default => substr($path, 1), }); } /** * @return ComponentMap */ public function __debugInfo(): array { return $this->toComponents(); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.6.0 * @codeCoverageIgnore * @see Uri::parse() * * Creates a new instance from a URI and a Base URI. * * The returned URI must be absolute. */ #[Deprecated(message:'use League\Uri\Uri::parse() instead', since:'league/uri:7.6.0')] public static function fromBaseUri(WhatWgUrl|Rfc3986Uri|Stringable|string $uri, WhatWgUrl|Rfc3986Uri|Stringable|string|null $baseUri = null): self { $formatter = fn (WhatWgUrl|Rfc3986Uri|Stringable|string $uri): string => match (true) { $uri instanceof Rfc3986Uri => $uri->toRawString(), $uri instanceof WhatWgUrl => $uri->toAsciiString(), default => str_replace(' ', '%20', (string) $uri), }; return self::new( UriString::resolve( uri: $formatter($uri), baseUri: null !== $baseUri ? $formatter($baseUri) : $baseUri ) ); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.5.0 * @codeCoverageIgnore * @see Uri::toComponents() * * @return ComponentMap */ #[Deprecated(message:'use League\Uri\Uri::toComponents() instead', since:'league/uri:7.5.0')] public function getComponents(): array { return $this->toComponents(); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.0.0 * @codeCoverageIgnore * @see Uri::new() */ #[Deprecated(message:'use League\Uri\Uri::new() instead', since:'league/uri:7.0.0')] public static function createFromString(Stringable|string $uri = ''): self { return self::new($uri); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.0.0 * @codeCoverageIgnore * @see Uri::fromComponents() * * @param InputComponentMap $components a hash representation of the URI similar to PHP parse_url function result */ #[Deprecated(message:'use League\Uri\Uri::fromComponents() instead', since:'league/uri:7.0.0')] public static function createFromComponents(array $components = []): self { return self::fromComponents($components); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @param resource|null $context * * @throws MissingFeature If ext/fileinfo is not installed * @throws SyntaxError If the file does not exist or is not readable * @see Uri::fromFileContents() * * @deprecated Since version 7.0.0 * @codeCoverageIgnore */ #[Deprecated(message:'use League\Uri\Uri::fromDataPath() instead', since:'league/uri:7.0.0')] public static function createFromDataPath(string $path, $context = null): self { return self::fromFileContents($path, $context); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.0.0 * @codeCoverageIgnore * @see Uri::fromBaseUri() * * Creates a new instance from a URI and a Base URI. * * The returned URI must be absolute. */ #[Deprecated(message:'use League\Uri\Uri::fromBaseUri() instead', since:'league/uri:7.0.0')] public static function createFromBaseUri( Stringable|UriInterface|String $uri, Stringable|UriInterface|String|null $baseUri = null ): static { return self::fromBaseUri($uri, $baseUri); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.0.0 * @codeCoverageIgnore * @see Uri::fromUnixPath() * * Create a new instance from a Unix path string. */ #[Deprecated(message:'use League\Uri\Uri::fromUnixPath() instead', since:'league/uri:7.0.0')] public static function createFromUnixPath(string $uri = ''): self { return self::fromUnixPath($uri); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.0.0 * @codeCoverageIgnore * @see Uri::fromWindowsPath() * * Create a new instance from a local Windows path string. */ #[Deprecated(message:'use League\Uri\Uri::fromWindowsPath() instead', since:'league/uri:7.0.0')] public static function createFromWindowsPath(string $uri = ''): self { return self::fromWindowsPath($uri); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.0.0 * @codeCoverageIgnore * @see Uri::new() * * Create a new instance from a URI object. */ #[Deprecated(message:'use League\Uri\Uri::new() instead', since:'league/uri:7.0.0')] public static function createFromUri(Psr7UriInterface|UriInterface $uri): self { return self::new($uri); } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.0.0 * @codeCoverageIgnore * @see Uri::fromServer() * * Create a new instance from the environment. */ #[Deprecated(message:'use League\Uri\Uri::fromServer() instead', since:'league/uri:7.0.0')] public static function createFromServer(array $server): self { return self::fromServer($server); } } PKCA#]��-�-6system/helixultimate/vendor/league/uri/UriTemplate.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use BackedEnum; use Deprecated; use League\Uri\Contracts\UriException; use League\Uri\Contracts\UriInterface; use League\Uri\Exceptions\MissingFeature; use League\Uri\Exceptions\SyntaxError; use League\Uri\UriTemplate\Template; use League\Uri\UriTemplate\TemplateCanNotBeExpanded; use League\Uri\UriTemplate\VariableBag; use Psr\Http\Message\UriFactoryInterface; use Psr\Http\Message\UriInterface as Psr7UriInterface; use Stringable; use Uri\InvalidUriException; use Uri\Rfc3986\Uri as Rfc3986Uri; use Uri\WhatWg\InvalidUrlException; use Uri\WhatWg\Url as WhatWgUrl; use function array_fill_keys; use function array_key_exists; use function class_exists; /** * Defines the URI Template syntax and the process for expanding a URI Template into a URI reference. * * @link https://tools.ietf.org/html/rfc6570 * @package League\Uri * @author Ignace Nyamagana Butera <nyamsprod@gmail.com> * @since 6.1.0 * * @phpstan-import-type InputValue from VariableBag */ final class UriTemplate implements Stringable { private readonly Template $template; private readonly VariableBag $defaultVariables; /** * @throws SyntaxError if the template syntax is invalid * @throws TemplateCanNotBeExpanded if the template or the variables are invalid */ public function __construct(BackedEnum|Stringable|string $template, iterable $defaultVariables = []) { $this->template = $template instanceof Template ? $template : Template::new($template); $this->defaultVariables = $this->filterVariables($defaultVariables); } private function filterVariables(iterable $variables): VariableBag { if (!$variables instanceof VariableBag) { $variables = new VariableBag($variables); } return $variables ->filter(fn ($value, string|int $name) => array_key_exists( $name, array_fill_keys($this->template->variableNames, 1) )); } /** * Returns the string representation of the UriTemplate. */ public function __toString(): string { return $this->template->value; } /** * Returns the distinct variables placeholders used in the template. * * @return array<string> */ public function getVariableNames(): array { return $this->template->variableNames; } /** * @return array<string, InputValue> */ public function getDefaultVariables(): array { return iterator_to_array($this->defaultVariables); } /** * Returns a new instance with the updated default variables. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified default variables. * * If present, variables whose name is not part of the current template * possible variable names are removed. * * @throws TemplateCanNotBeExpanded if the variables are invalid */ public function withDefaultVariables(iterable $defaultVariables): self { $defaultVariables = $this->filterVariables($defaultVariables); if ($this->defaultVariables->equals($defaultVariables)) { return $this; } return new self($this->template, $defaultVariables); } private function templateExpanded(iterable $variables = []): string { return $this->template->expand($this->filterVariables($variables)->replace($this->defaultVariables)); } private function templateExpandedOrFail(iterable $variables = []): string { return $this->template->expandOrFail($this->filterVariables($variables)->replace($this->defaultVariables)); } /** * @throws TemplateCanNotBeExpanded if the variables are invalid * @throws UriException if the resulting expansion cannot be converted to a UriInterface instance */ public function expand(iterable $variables = [], Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string|null $baseUri = null): UriInterface { $expanded = $this->templateExpanded($variables); return null === $baseUri ? Uri::new($expanded) : (Uri::parse($expanded, $baseUri) ?? throw new SyntaxError('Unable to expand URI')); } /** * @throws MissingFeature if no Uri\Rfc3986\Uri class is found * @throws TemplateCanNotBeExpanded if the variables are invalid * @throws InvalidUriException if the base URI cannot be converted to a Uri\Rfc3986\Uri instance * @throws InvalidUriException if the resulting expansion cannot be converted to a Uri\Rfc3986\Uri instance */ public function expandToUri(iterable $variables = [], Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string|null $baseUri = null): Rfc3986Uri { class_exists(Rfc3986Uri::class) || throw new MissingFeature('Support for '.Rfc3986Uri::class.' requires PHP8.5+ or a polyfill. Run "composer require league/uri-polyfill" or use you own polyfill.'); return new Rfc3986Uri($this->templateExpanded($variables), $this->newRfc3986Uri($baseUri)); } /** * @throws MissingFeature if no Uri\Whatwg\Url class is found * @throws TemplateCanNotBeExpanded if the variables are invalid * @throws InvalidUrlException if the base URI cannot be converted to a Uri\Whatwg\Url instance * @throws InvalidUrlException if the resulting expansion cannot be converted to a Uri\Whatwg\Url instance */ public function expandToUrl(iterable $variables = [], Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string|null $baseUrl = null, array|null &$errors = []): WhatWgUrl { class_exists(WhatWgUrl::class) || throw new MissingFeature('Support for '.WhatWgUrl::class.' requires PHP8.5+ or a polyfill. Run "composer require league/uri-polyfill" or use you own polyfill.'); return new WhatWgUrl($this->templateExpanded($variables), $this->newWhatWgUrl($baseUrl), $errors); } /** * @throws TemplateCanNotBeExpanded if the variables are invalid * @throws UriException if the resulting expansion cannot be converted to a UriInterface instance */ public function expandToPsr7Uri( iterable $variables = [], Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string|null $baseUrl = null, UriFactoryInterface $uriFactory = new HttpFactory() ): Psr7UriInterface { $uriString = $this->templateExpandedOrFail($variables); return $uriFactory->createUri( null === $baseUrl ? $uriString : UriString::resolve($uriString, match (true) { $baseUrl instanceof Rfc3986Uri => $baseUrl->toRawString(), $baseUrl instanceof WhatWgUrl => $baseUrl->toUnicodeString(), default => $baseUrl, }) ); } /** * @throws TemplateCanNotBeExpanded if the variables are invalid or missing * @throws UriException if the resulting expansion cannot be converted to a UriInterface instance */ public function expandOrFail(iterable $variables = [], Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string|null $baseUri = null): UriInterface { $expanded = $this->templateExpandedOrFail($variables); return null === $baseUri ? Uri::new($expanded) : (Uri::parse($expanded, $baseUri) ?? throw new SyntaxError('Unable to expand URI')); } /** * @throws MissingFeature if no Uri\Rfc3986\Uri class is found * @throws TemplateCanNotBeExpanded if the variables are invalid * @throws InvalidUriException if the base URI cannot be converted to a Uri\Rfc3986\Uri instance * @throws InvalidUriException if the resulting expansion cannot be converted to a Uri\Rfc3986\Uri instance */ public function expandToUriOrFail(iterable $variables = [], Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string|null $baseUri = null): Rfc3986Uri { class_exists(Rfc3986Uri::class) || throw new MissingFeature('Support for '.Rfc3986Uri::class.' requires PHP8.5+ or a polyfill. Run "composer require league/uri-polyfill" or use you own polyfill.'); return new Rfc3986Uri($this->templateExpandedOrFail($variables), $this->newRfc3986Uri($baseUri)); } /** * @throws MissingFeature if no Uri\Whatwg\Url class is found * @throws TemplateCanNotBeExpanded if the variables are invalid * @throws InvalidUrlException if the base URI cannot be converted to a Uri\Whatwg\Url instance * @throws InvalidUrlException if the resulting expansion cannot be converted to a Uri\Whatwg\Url instance */ public function expandToUrlOrFail(iterable $variables = [], Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string|null $baseUrl = null, array|null &$errors = []): WhatWgUrl { class_exists(WhatWgUrl::class) || throw new MissingFeature('Support for '.WhatWgUrl::class.' requires PHP8.5+ or a polyfill. Run "composer require league/uri-polyfill" or use you own polyfill.'); return new WhatWgUrl($this->templateExpandedOrFail($variables), $this->newWhatWgUrl($baseUrl), $errors); } /** * @throws TemplateCanNotBeExpanded if the variables are invalid * @throws UriException if the resulting expansion cannot be converted to a UriInterface instance */ public function expandToPsr7UriOrFail( iterable $variables = [], Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string|null $baseUrl = null, UriFactoryInterface $uriFactory = new HttpFactory() ): Psr7UriInterface { $uriString = $this->templateExpandedOrFail($variables); return $uriFactory->createUri( null === $baseUrl ? $uriString : UriString::resolve($uriString, match (true) { $baseUrl instanceof Rfc3986Uri => $baseUrl->toRawString(), $baseUrl instanceof WhatWgUrl => $baseUrl->toUnicodeString(), default => $baseUrl, }) ); } /** * @throws InvalidUrlException */ private function newWhatWgUrl(Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string|null $url = null): ?WhatWgUrl { return match (true) { null === $url => null, $url instanceof WhatWgUrl => $url, $url instanceof Rfc3986Uri => new WhatWgUrl($url->toRawString()), $url instanceof BackedEnum => new WhatWgUrl((string) $url->value), default => new WhatWgUrl((string) $url), }; } /** * @throws InvalidUriException */ private function newRfc3986Uri(Rfc3986Uri|WhatWgUrl|BackedEnum|Stringable|string|null $uri = null): ?Rfc3986Uri { return match (true) { null === $uri => null, $uri instanceof Rfc3986Uri => $uri, $uri instanceof WhatWgUrl => new Rfc3986Uri($uri->toAsciiString()), $uri instanceof BackedEnum => new Rfc3986Uri((string) $uri->value), default => new Rfc3986Uri((string) $uri), }; } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.6.0 * @codeCoverageIgnore * @see UriTemplate::toString() * * Create a new instance from the environment. */ #[Deprecated(message:'use League\Uri\UriTemplate::__toString() instead', since:'league/uri:7.6.0')] public function getTemplate(): string { return $this->__toString(); } } PKCA#]ԦSV��5system/helixultimate/vendor/league/uri/SchemeType.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; enum SchemeType { case Opaque; case Hierarchical; case Unknown; public function isOpaque(): bool { return self::Opaque === $this; } public function isHierarchical(): bool { return self::Hierarchical === $this; } public function isUnknown(): bool { return self::Unknown === $this; } } PKCA#]�Yf��Fsystem/helixultimate/vendor/league/uri-interfaces/QueryExtractMode.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; enum QueryExtractMode { /** * Parses the query string using parse_str algorithm. */ case Native; /** * Parses the query string like parse_str without mangling result keys. * * The result is similar to PHP parse_str when used with its second argument, * with the difference that variable names are not mangled. * * Behavior details: * - Empty names are ignored * - If a name is duplicated, the last value overwrites the previous one * - If no "[" is detected, the value is added using the name as the array key * - If "[" is detected but no matching "]" exists, the value is added using the name as the array key * - If bracket usage is malformed, the remaining part is dropped * - "." and " " are NOT converted to "_" * - If no "]" exists, the first "[" is not converted to "_" * - No whitespace trimming is performed on keys * * @see https://www.php.net/parse_str * @see https://wiki.php.net/rfc/on_demand_name_mangling */ case Unmangled; /** * Same as QueryParsingMode::Unmangled and additionally * preserves null values instead of converting them * to empty strings. */ case LossLess; } PKCA#]F]���Ksystem/helixultimate/vendor/league/uri-interfaces/IPv4/NativeCalculator.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\IPv4; use function floor; use function intval; final class NativeCalculator implements Calculator { public function baseConvert(mixed $value, int $base): int { return intval((string) $value, $base); } public function pow(mixed $value, int $exponent) { return $value ** $exponent; } public function compare(mixed $value1, mixed $value2): int { return $value1 <=> $value2; } public function multiply(mixed $value1, mixed $value2): int { return $value1 * $value2; } public function div(mixed $value, mixed $base): int { return (int) floor($value / $base); } public function mod(mixed $value, mixed $base): int { return $value % $base; } public function add(mixed $value1, mixed $value2): int { return $value1 + $value2; } public function sub(mixed $value1, mixed $value2): int { return $value1 - $value2; } } PKCA#]+]���#�#Dsystem/helixultimate/vendor/league/uri-interfaces/IPv4/Converter.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\IPv4; use BackedEnum; use League\Uri\Exceptions\MissingFeature; use League\Uri\FeatureDetection; use Stringable; use function array_pop; use function count; use function explode; use function extension_loaded; use function hexdec; use function long2ip; use function ltrim; use function preg_match; use function str_ends_with; use function substr; use const FILTER_FLAG_IPV4; use const FILTER_FLAG_IPV6; use const FILTER_VALIDATE_IP; final class Converter { private const REGEXP_IPV4_HOST = '/ (?(DEFINE) # . is missing as it is used to separate labels (?<hexadecimal>0x[[:xdigit:]]*) (?<octal>0[0-7]*) (?<decimal>\d+) (?<ipv4_part>(?:(?&hexadecimal)|(?&octal)|(?&decimal))*) ) ^(?:(?&ipv4_part)\.){0,3}(?&ipv4_part)\.?$ /x'; private const REGEXP_IPV4_NUMBER_PER_BASE = [ '/^0x(?<number>[[:xdigit:]]*)$/' => 16, '/^0(?<number>[0-7]*)$/' => 8, '/^(?<number>\d+)$/' => 10, ]; private const IPV6_6TO4_PREFIX = '2002:'; private const IPV4_MAPPED_PREFIX = '::ffff:'; private readonly mixed $maxIPv4Number; public function __construct( private readonly Calculator $calculator ) { $this->maxIPv4Number = $calculator->sub($calculator->pow(2, 32), 1); } /** * Returns an instance using a GMP calculator. */ public static function fromGMP(): self { return new self(new GMPCalculator()); } /** * Returns an instance using a Bcmath calculator. */ public static function fromBCMath(): self { return new self(new BCMathCalculator()); } /** * Returns an instance using a PHP native calculator (requires 64bits PHP). */ public static function fromNative(): self { return new self(new NativeCalculator()); } /** * Returns an instance using a detected calculator depending on the PHP environment. * * @throws MissingFeature If no Calculator implementing object can be used on the platform * * @codeCoverageIgnore */ public static function fromEnvironment(): self { FeatureDetection::supportsIPv4Conversion(); return match (true) { extension_loaded('gmp') => self::fromGMP(), extension_loaded('bcmath') => self::fromBCMath(), default => self::fromNative(), }; } public function isIpv4(BackedEnum|Stringable|string|null $host): bool { if ($host instanceof BackedEnum) { $host = (string) $host->value; } if (null === $host) { return false; } if (null !== $this->toDecimal($host)) { return true; } $host = (string) $host; if (false === filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { return false; } $ipAddress = strtolower((string) inet_ntop((string) inet_pton($host))); if (str_starts_with($ipAddress, self::IPV4_MAPPED_PREFIX)) { return false !== filter_var(substr($ipAddress, 7), FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); } if (!str_starts_with($ipAddress, self::IPV6_6TO4_PREFIX)) { return false; } $hexParts = explode(':', substr($ipAddress, 5, 9)); if (count($hexParts) < 2) { return false; } $ipAddress = long2ip((int) hexdec($hexParts[0]) * 65536 + (int) hexdec($hexParts[1])); return '' !== ''.$ipAddress; } public function toIPv6Using6to4(BackedEnum|Stringable|string|null $host): ?string { $host = $this->toDecimal($host); if (null === $host) { return null; } /** @var array<string> $parts */ $parts = array_map( fn (string $part): string => sprintf('%02x', $part), explode('.', $host) ); return '['.self::IPV6_6TO4_PREFIX.$parts[0].$parts[1].':'.$parts[2].$parts[3].'::]'; } public function toIPv6UsingMapping(BackedEnum|Stringable|string|null $host): ?string { $host = $this->toDecimal($host); if (null === $host) { return null; } return '['.self::IPV4_MAPPED_PREFIX.$host.']'; } public function toOctal(BackedEnum|Stringable|string|null $host): ?string { $host = $this->toDecimal($host); return match (null) { $host => null, default => implode('.', array_map( fn ($value) => str_pad(decoct((int) $value), 4, '0', STR_PAD_LEFT), explode('.', $host) )), }; } public function toHexadecimal(BackedEnum|Stringable|string|null $host): ?string { $host = $this->toDecimal($host); return match (null) { $host => null, default => '0x'.implode('', array_map( fn ($value) => dechex((int) $value), explode('.', $host) )), }; } /** * Tries to convert a IPv4 hexadecimal or a IPv4 octal notation into a IPv4 dot-decimal notation if possible * otherwise returns null. * * @see https://url.spec.whatwg.org/#concept-ipv4-parser */ public function toDecimal(BackedEnum|Stringable|string|null $host): ?string { if ($host instanceof BackedEnum) { $host = $host->value; } $host = (string) $host; if (str_starts_with($host, '[') && str_ends_with($host, ']')) { $host = substr($host, 1, -1); if (false === filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { return null; } $ipAddress = strtolower((string) inet_ntop((string) inet_pton($host))); if (str_starts_with($ipAddress, self::IPV4_MAPPED_PREFIX)) { return substr($ipAddress, 7); } if (!str_starts_with($ipAddress, self::IPV6_6TO4_PREFIX)) { return null; } $hexParts = explode(':', substr($ipAddress, 5, 9)); return (string) match (true) { count($hexParts) < 2 => null, default => long2ip((int) hexdec($hexParts[0]) * 65536 + (int) hexdec($hexParts[1])), }; } if (1 !== preg_match(self::REGEXP_IPV4_HOST, $host)) { return null; } if (str_ends_with($host, '.')) { $host = substr($host, 0, -1); } $numbers = []; foreach (explode('.', $host) as $label) { $number = $this->labelToNumber($label); if (null === $number) { return null; } $numbers[] = $number; } $ipv4 = array_pop($numbers); $max = $this->calculator->pow(256, 6 - count($numbers)); if ($this->calculator->compare($ipv4, $max) > 0) { return null; } foreach ($numbers as $offset => $number) { if ($this->calculator->compare($number, 255) > 0) { return null; } $ipv4 = $this->calculator->add($ipv4, $this->calculator->multiply( $number, $this->calculator->pow(256, 3 - $offset) )); } return $this->long2Ip($ipv4); } /** * Converts a domain label into a IPv4 integer part. * * @see https://url.spec.whatwg.org/#ipv4-number-parser * * @return mixed returns null if it cannot correctly convert the label */ private function labelToNumber(string $label): mixed { foreach (self::REGEXP_IPV4_NUMBER_PER_BASE as $regexp => $base) { if (1 !== preg_match($regexp, $label, $matches)) { continue; } $number = ltrim($matches['number'], '0'); if ('' === $number) { return 0; } $number = $this->calculator->baseConvert($number, $base); if (0 <= $this->calculator->compare($number, 0) && 0 >= $this->calculator->compare($number, $this->maxIPv4Number)) { return $number; } } return null; } /** * Generates the dot-decimal notation for IPv4. * * @see https://url.spec.whatwg.org/#concept-ipv4-parser * * @param mixed $ipAddress the number representation of the IPV4address */ private function long2Ip(mixed $ipAddress): string { $output = ''; for ($offset = 0; $offset < 4; $offset++) { $output = $this->calculator->mod($ipAddress, 256).$output; if ($offset < 3) { $output = '.'.$output; } $ipAddress = $this->calculator->div($ipAddress, 256); } return $output; } } PKCA#]��c|��Ksystem/helixultimate/vendor/league/uri-interfaces/IPv4/BCMathCalculator.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\IPv4; use function bcadd; use function bccomp; use function bcdiv; use function bcmod; use function bcmul; use function bcpow; use function bcsub; use function str_split; final class BCMathCalculator implements Calculator { private const SCALE = 0; private const CONVERSION_TABLE = [ '0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', 'a' => '10', 'b' => '11', 'c' => '12', 'd' => '13', 'e' => '14', 'f' => '15', ]; public function baseConvert(mixed $value, int $base): string { $value = (string) $value; if (10 === $base) { return $value; } $base = (string) $base; $decimal = '0'; foreach (str_split($value) as $char) { $decimal = bcadd($this->multiply($decimal, $base), self::CONVERSION_TABLE[$char], self::SCALE); } return $decimal; } public function pow(mixed $value, int $exponent): string { return bcpow((string) $value, (string) $exponent, self::SCALE); } public function compare(mixed $value1, mixed $value2): int { return bccomp((string) $value1, (string) $value2, self::SCALE); } public function multiply(mixed $value1, mixed $value2): string { return bcmul((string) $value1, (string) $value2, self::SCALE); } public function div(mixed $value, mixed $base): string { return bcdiv((string) $value, (string) $base, self::SCALE); } public function mod(mixed $value, mixed $base): string { return bcmod((string) $value, (string) $base, self::SCALE); } public function add(mixed $value1, mixed $value2): string { return bcadd((string) $value1, (string) $value2, self::SCALE); } public function sub(mixed $value1, mixed $value2): string { return bcsub((string) $value1, (string) $value2, self::SCALE); } } PKCA#]�NS�8 8 Esystem/helixultimate/vendor/league/uri-interfaces/IPv4/Calculator.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\IPv4; interface Calculator { /** * Add numbers. * * @param mixed $value1 a number that will be added to $value2 * @param mixed $value2 a number that will be added to $value1 * * @return mixed the addition result */ public function add(mixed $value1, mixed $value2); /** * Subtract one number from another. * * @param mixed $value1 a number that will be subtracted of $value2 * @param mixed $value2 a number that will be subtracted to $value1 * * @return mixed the subtraction result */ public function sub(mixed $value1, mixed $value2); /** * Multiply numbers. * * @param mixed $value1 a number that will be multiplied by $value2 * @param mixed $value2 a number that will be multiplied by $value1 * * @return mixed the multiplication result */ public function multiply(mixed $value1, mixed $value2); /** * Divide numbers. * * @param mixed $value The number being divided. * @param mixed $base The number that $value is being divided by. * * @return mixed the result of the division */ public function div(mixed $value, mixed $base); /** * Raise an number to the power of exponent. * * @param mixed $value scalar, the base to use * * @return mixed the value raised to the power of exp. */ public function pow(mixed $value, int $exponent); /** * Returns the int point remainder (modulo) of the division of the arguments. * * @param mixed $value The dividend * @param mixed $base The divisor * * @return mixed the remainder */ public function mod(mixed $value, mixed $base); /** * Number comparison. * * @param mixed $value1 the first value * @param mixed $value2 the second value * * @return int Returns < 0 if value1 is less than value2; > 0 if value1 is greater than value2, and 0 if they are equal. */ public function compare(mixed $value1, mixed $value2): int; /** * Get the decimal integer value of a variable. * * @param mixed $value The scalar value being converted to an integer * * @return mixed the integer value */ public function baseConvert(mixed $value, int $base); } PKCA#]����Hsystem/helixultimate/vendor/league/uri-interfaces/IPv4/GMPCalculator.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\IPv4; use GMP; use function gmp_add; use function gmp_cmp; use function gmp_div_q; use function gmp_init; use function gmp_mod; use function gmp_mul; use function gmp_pow; use function gmp_sub; use const GMP_ROUND_MINUSINF; final class GMPCalculator implements Calculator { public function baseConvert(mixed $value, int $base): GMP { return gmp_init($value, $base); } public function pow(mixed $value, int $exponent): GMP { return gmp_pow($value, $exponent); } public function compare(mixed $value1, mixed $value2): int { return gmp_cmp($value1, $value2); } public function multiply(mixed $value1, mixed $value2): GMP { return gmp_mul($value1, $value2); } public function div(mixed $value, mixed $base): GMP { return gmp_div_q($value, $base, GMP_ROUND_MINUSINF); } public function mod(mixed $value, mixed $base): GMP { return gmp_mod($value, $base); } public function add(mixed $value1, mixed $value2): GMP { return gmp_add($value1, $value2); } public function sub(mixed $value1, mixed $value2): GMP { return gmp_sub($value1, $value2); } } PKCA#][�aKKFsystem/helixultimate/vendor/league/uri-interfaces/FeatureDetection.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use finfo; use League\Uri\Exceptions\MissingFeature; use League\Uri\IPv4\Calculator; use function class_exists; use function defined; use function extension_loaded; use function function_exists; use const PHP_INT_SIZE; /** * Allow detecting features needed to make the packages work. */ final class FeatureDetection { public static function supportsFileDetection(): void { static $isSupported = null; $isSupported = $isSupported ?? class_exists(finfo::class); $isSupported || throw new MissingFeature('Support for file type detection requires the `fileinfo` extension.'); } public static function supportsIdn(): void { static $isSupported = null; $isSupported = $isSupported ?? (function_exists('\idn_to_ascii') && defined('\INTL_IDNA_VARIANT_UTS46')); $isSupported || throw new MissingFeature('Support for IDN host requires the `intl` extension for best performance or run "composer require symfony/polyfill-intl-idn" to install a polyfill.'); } public static function supportsIPv4Conversion(): void { static $isSupported = null; $isSupported = $isSupported ?? (extension_loaded('gmp') || extension_loaded('bcmath') || (4 < PHP_INT_SIZE)); $isSupported || throw new MissingFeature('A '.Calculator::class.' implementation could not be automatically loaded. To perform IPv4 conversion use a x.64 PHP build or install one of the following extension GMP or BCMath. You can also ship your own implementation.'); } public static function supportsDom(): void { static $isSupported = null; $isSupported = $isSupported ?? extension_loaded('dom'); $isSupported || throw new MissingFeature('To use a DOM related feature, the DOM extension must be installed in your system.'); } } PKCA#]�E�qqLsystem/helixultimate/vendor/league/uri-interfaces/KeyValuePair/Converter.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\KeyValuePair; use BackedEnum; use League\Uri\Exceptions\SyntaxError; use League\Uri\StringCoercionMode; use Stringable; use function array_combine; use function explode; use function implode; use function is_string; use function preg_match; use function str_replace; use const PHP_QUERY_RFC1738; use const PHP_QUERY_RFC3986; final class Converter { private const REGEXP_INVALID_CHARS = '/[\x00-\x1f\x7f]/'; /** * @param non-empty-string $separator the query string separator * @param array<string> $fromRfc3986 contains all the RFC3986 encoded characters to be converted * @param array<string> $toEncoding contains all the expected encoded characters */ private function __construct( private readonly string $separator, private readonly array $fromRfc3986 = [], private readonly array $toEncoding = [], ) { if ('' === $this->separator) { throw new SyntaxError('The separator character must be a non empty string.'); } } /** * @param non-empty-string $separator */ public static function new(string $separator): self { return new self($separator); } /** * @param non-empty-string $separator */ public static function fromRFC3986(string $separator = '&'): self { return self::new($separator); } /** * @param non-empty-string $separator */ public static function fromRFC1738(string $separator = '&'): self { return self::new($separator) ->withEncodingMap(['%20' => '+']); } /** * @param non-empty-string $separator * * @see https://url.spec.whatwg.org/#application/x-www-form-urlencoded */ public static function fromFormData(string $separator = '&'): self { return self::new($separator) ->withEncodingMap(['%20' => '+', '%2A' => '*']); } public static function fromEncodingType(int $encType): self { return match ($encType) { PHP_QUERY_RFC3986 => self::fromRFC3986(), PHP_QUERY_RFC1738 => self::fromRFC1738(), default => throw new SyntaxError('Unknown or Unsupported encoding.'), }; } /** * @return non-empty-string */ public function separator(): string { return $this->separator; } /** * @return array<string, string> */ public function encodingMap(): array { return array_combine($this->fromRfc3986, $this->toEncoding); } /** * @return array<non-empty-list<string|null>> */ public function toPairs(BackedEnum|Stringable|string|int|float|bool|null $value): array { $value = StringCoercionMode::Native->coerce($value); if (null === $value) { return []; } $value = match (1) { preg_match(self::REGEXP_INVALID_CHARS, $value) => throw new SyntaxError('Invalid query string: `'.$value.'`.'), default => str_replace($this->toEncoding, $this->fromRfc3986, $value), }; return array_map( fn (string $pair): array => explode('=', $pair, 2) + [1 => null], explode($this->separator, $value) ); } /** * @param iterable<array{0:string|null, 1:BackedEnum|Stringable|string|bool|int|float|null}> $pairs */ public function toValue(iterable $pairs): ?string { $filteredPairs = []; foreach ($pairs as $pair) { $filteredPairs[] = match (true) { !is_string($pair[0]) => throw new SyntaxError('the pair key MUST be a string;, `'.gettype($pair[0]).'` given.'), null === $pair[1] => StringCoercionMode::Native->coerce($pair[0]), default => StringCoercionMode::Native->coerce($pair[0]).'='.StringCoercionMode::Native->coerce($pair[1]), }; } return match ([]) { $filteredPairs => null, default => str_replace($this->fromRfc3986, $this->toEncoding, implode($this->separator, $filteredPairs)), }; } /** * @param non-empty-string $separator */ public function withSeparator(string $separator): self { return match ($this->separator) { $separator => $this, default => new self($separator, $this->fromRfc3986, $this->toEncoding), }; } /** * Sets the conversion map. * * Each key from the iterable structure represents the RFC3986 encoded characters as string, * while each value represents the expected output encoded characters */ public function withEncodingMap(iterable $encodingMap): self { $fromRfc3986 = []; $toEncoding = []; foreach ($encodingMap as $from => $to) { [$fromRfc3986[], $toEncoding[]] = match (true) { !is_string($from) => throw new SyntaxError('The encoding output must be a string; `'.gettype($from).'` given.'), $to instanceof Stringable, is_string($to) => [$from, (string) $to], default => throw new SyntaxError('The encoding output must be a string; `'.gettype($to).'` given.'), }; } return match (true) { $fromRfc3986 !== $this->fromRfc3986, $toEncoding !== $this->toEncoding => new self($this->separator, $fromRfc3986, $toEncoding), default => $this, }; } } PKCA#]���DDAsystem/helixultimate/vendor/league/uri-interfaces/QueryString.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use BackedEnum; use League\Uri\Exceptions\SyntaxError; use League\Uri\KeyValuePair\Converter; use ReflectionEnum; use ReflectionException; use SplObjectStorage; use Stringable; use TypeError; use UnitEnum; use ValueError; use function array_is_list; use function array_key_exists; use function array_keys; use function get_debug_type; use function get_object_vars; use function http_build_query; use function implode; use function is_array; use function is_object; use function is_resource; use function is_scalar; use function rawurldecode; use function str_replace; use function strpos; use function substr; use const PHP_QUERY_RFC1738; use const PHP_QUERY_RFC3986; /** * A class to parse the URI query string. * * @see https://tools.ietf.org/html/rfc3986#section-3.4 */ final class QueryString { private const PAIR_VALUE_DECODED = 1; private const PAIR_VALUE_PRESERVED = 2; private const RECURSION_MARKER = "\0__RECURSION_INTERNAL_MARKER__\0"; /** * @codeCoverageIgnore */ private function __construct() { } /** * Build a query string from a list of pairs. * * @see QueryString::buildFromPairs() * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.2 * * @param iterable<array{0:string, 1:mixed}> $pairs * @param non-empty-string $separator * * @throws SyntaxError If the encoding type is invalid * @throws SyntaxError If a pair is invalid */ public static function build(iterable $pairs, string $separator = '&', int $encType = PHP_QUERY_RFC3986, StringCoercionMode $coercionMode = StringCoercionMode::Native): ?string { return self::buildFromPairs($pairs, Converter::fromEncodingType($encType)->withSeparator($separator), $coercionMode); } /** * Build a query string from a list of pairs. * * The method expects the return value from Query::parse to build * a valid query string. This method differs from PHP http_build_query as * it does not modify parameters keys. * * If a reserved character is found in a URI component and * no delimiting role is known for that character, then it must be * interpreted as representing the data octet corresponding to that * character's encoding in US-ASCII. * * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.2 * * @param iterable<array{0:string, 1:mixed}> $pairs * * @throws SyntaxError If the encoding type is invalid * @throws SyntaxError If a pair is invalid */ public static function buildFromPairs(iterable $pairs, ?Converter $converter = null, StringCoercionMode $coercionMode = StringCoercionMode::Native): ?string { $keyValuePairs = []; foreach ($pairs as $pair) { if (!is_array($pair) || [0, 1] !== array_keys($pair)) { throw new SyntaxError('A pair must be a sequential array starting at `0` and containing two elements.'); } [$key, $value] = $pair; $coercionMode->isCoercible($value) || throw new SyntaxError('Converting a type `'.get_debug_type($value).'` into a string is not supported by the '.(StringCoercionMode::Native === $coercionMode ? 'PHP Native' : 'Ecmascript').' coercion mode.'); try { $key = $coercionMode->coerce($key); $value = $coercionMode->coerce($value); } catch (TypeError $typeError) { throw new SyntaxError('The pair can not be converted to build a query string.', previous: $typeError); } $keyValuePairs[] = [(string) Encoder::encodeQueryKeyValue($key), null === $value ? null : Encoder::encodeQueryKeyValue($value)]; } return ($converter ?? Converter::fromRFC3986())->toValue($keyValuePairs); } /** * Build a query string from an object or an array like http_build_query without discarding values. * The method differs from http_build_query for the following behavior: * * - if a resource is used, a TypeError is thrown. * - if a recursion is detected a ValueError is thrown * - the method preserves value with `null` value (http_build_query) skip the key. * - the method does not handle prefix usage * * @param array<array-key, mixed> $data * @param non-empty-string $separator * * @throws TypeError if a resource is found it the input array * @throws ValueError if a recursion is detected */ public static function compose( array|object $data, string $separator = '&', int $encType = PHP_QUERY_RFC1738, QueryComposeMode $composeMode = QueryComposeMode::Native ): ?string { if (QueryComposeMode::Native === $composeMode) { return http_build_query(data: $data, arg_separator: $separator, encoding_type: $encType); } $query = self::composeFromValue($data, Converter::fromEncodingType($encType)->withSeparator($separator), $composeMode); return QueryComposeMode::Safe !== $composeMode ? (string) $query : $query; } public static function composeFromValue( array|object $data, ?Converter $converter = null, QueryComposeMode $composeMode = QueryComposeMode::Native, ): ?string { if (QueryComposeMode::EnumLenient === $composeMode && $data instanceof UnitEnum && !$data instanceof BackedEnum) { return ''; } QueryComposeMode::Safe !== $composeMode || is_array($data) || throw new TypeError('In safe mode only arrays are supported.'); $converter ??= Converter::fromRFC3986(); $pairs = QueryComposeMode::Native !== $composeMode ? self::composeRecursive($composeMode, $data) : self::parseFromValue(http_build_query(data: $data, arg_separator: '&'), Converter::fromRFC1738()); return self::buildFromPairs($pairs, $converter); } /** * @param array<array-key, mixed>|object $data * @param SplObjectStorage<object, null> $seenObjects * * @throws TypeError if a resource is found it the input array * @throws ValueError if a recursion is detected * @throws ReflectionException if reflection is not possible on the Enum * * @return iterable<array{0: array-key, 1: string|int|float|bool|null}> */ private static function composeRecursive( QueryComposeMode $composeMode, array|object $data, string|int $prefix = '', SplObjectStorage $seenObjects = new SplObjectStorage(), ): iterable { QueryComposeMode::Safe !== $composeMode || is_array($data) || throw new TypeError('In safe mode only arrays are supported.'); in_array($composeMode, [QueryComposeMode::EnumCompatible, QueryComposeMode::EnumLenient], true) || !$data instanceof UnitEnum || throw new TypeError('Argument #1 ($data) must not be an enum, '.((new ReflectionEnum($data::class))->isBacked() ? 'Backed' : 'Pure').' given') ; if (is_object($data)) { if ($seenObjects->contains($data)) { QueryComposeMode::Safe !== $composeMode || throw new ValueError('composition failed; circular reference detected.'); return; } $seenObjects->attach($data); $data = get_object_vars($data); } if (self::hasCircularReference($data)) { QueryComposeMode::Safe !== $composeMode || throw new ValueError('composition failed; circular reference detected.'); return; } $stripIndices = QueryComposeMode::Safe === $composeMode && array_is_list($data); foreach ($data as $name => $value) { $name = $stripIndices ? '' : $name; if ('' !== $prefix) { $name = $prefix.'['.$name.']'; } if (is_resource($value)) { QueryComposeMode::Safe !== $composeMode || throw new TypeError('composition failed; a resource has been detected and can not be converted.'); continue; } if (is_scalar($value)) { yield [$name, $value]; continue; } if (null === $value) { if (QueryComposeMode::Safe === $composeMode) { yield [$name, $value]; } continue; } if ($value instanceof BackedEnum) { if (QueryComposeMode::Compatible !== $composeMode) { yield [$name, $value->value]; continue; } $value = get_object_vars($value); } if ($value instanceof UnitEnum) { if (QueryComposeMode::EnumLenient === $composeMode) { continue; } QueryComposeMode::Compatible === $composeMode || throw new TypeError('Unbacked enum '.$value::class.' cannot be converted to a string'); $value = get_object_vars($value); } if (QueryComposeMode::Safe === $composeMode && is_object($value)) { throw new ValueError('In conservative mode only arrays, scalar value or null are supported.'); } yield from self::composeRecursive($composeMode, $value, $name, $seenObjects); } } /** * Array recursion detection. * @see https://stackoverflow.com/questions/9042142/detecting-infinite-array-recursion-in-php */ private static function hasCircularReference(array &$arr): bool { if (isset($arr[self::RECURSION_MARKER])) { return true; } try { $arr[self::RECURSION_MARKER] = true; foreach ($arr as $key => &$value) { if (self::RECURSION_MARKER !== $key && is_array($value) && self::hasCircularReference($value)) { return true; } } return false; } finally { unset($arr[self::RECURSION_MARKER]); } } /** * Parses the query string. * * The result depends on the query parsing mode * * @see QueryString::extractFromValue() * * @param non-empty-string $separator * * @throws SyntaxError */ public static function extract( BackedEnum|Stringable|string|bool|null $query, string $separator = '&', int $encType = PHP_QUERY_RFC3986, QueryExtractMode $extractMode = QueryExtractMode::Unmangled, ): array { return self::extractFromValue( $query, Converter::fromEncodingType($encType)->withSeparator($separator), $extractMode, ); } /** * Parses the query string. * * The result depends on the query parsing mode * * @throws SyntaxError */ public static function extractFromValue( BackedEnum|Stringable|string|bool|null $query, ?Converter $converter = null, QueryExtractMode $extractMode = QueryExtractMode::Unmangled, ): array { $pairs = ($converter ?? Converter::fromRFC3986())->toPairs($query); if (QueryExtractMode::Native === $extractMode) { if ([] === $pairs) { return []; } $data = []; foreach ($pairs as [$key, $value]) { $key = str_replace('&', '%26', (string) $key); $data[] = null === $value ? $key : $key.'='.str_replace('&', '%26', $value); } parse_str(implode('&', $data), $result); return $result; } return self::convert( self::decodePairs($pairs, self::PAIR_VALUE_PRESERVED), $extractMode ); } /** * Parses a query string into a collection of key/value pairs. * * @param non-empty-string $separator * * @throws SyntaxError * * @return array<int, array{0:string, 1:string|null}> */ public static function parse(BackedEnum|Stringable|string|bool|null $query, string $separator = '&', int $encType = PHP_QUERY_RFC3986): array { return self::parseFromValue($query, Converter::fromEncodingType($encType)->withSeparator($separator)); } /** * Parses a query string into a collection of key/value pairs. * * @throws SyntaxError * * @return array<int, array{0:string, 1:string|null}> */ public static function parseFromValue(BackedEnum|Stringable|string|bool|null $query, ?Converter $converter = null): array { return self::decodePairs( ($converter ?? Converter::fromRFC3986())->toPairs($query), self::PAIR_VALUE_DECODED ); } /** * @param array<non-empty-list<string|null>> $pairs * * @return array<int, array{0:string, 1:string|null}> */ private static function decodePairs(array $pairs, int $pairValueState): array { $decodePair = static function (array $pair, int $pairValueState): array { [$key, $value] = $pair; return match ($pairValueState) { self::PAIR_VALUE_PRESERVED => [(string) Encoder::decodeAll($key), $value], default => [(string) Encoder::decodeAll($key), Encoder::decodeAll($value)], }; }; return array_reduce( $pairs, fn (array $carry, array $pair) => [...$carry, $decodePair($pair, $pairValueState)], [] ); } /** * Converts a collection of key/value pairs and returns * the store PHP variables as elements of an array. */ public static function convert(iterable $pairs, QueryExtractMode $extractMode = QueryExtractMode::Unmangled): array { $returnedValue = []; foreach ($pairs as $pair) { $returnedValue = self::extractPhpVariable($returnedValue, $pair, extractMode: $extractMode); } return $returnedValue; } /** * Parses a query pair like parse_str without mangling the results array keys. * * <ul> * <li>empty name are not saved</li> * <li>If the value from name is duplicated its corresponding value will be overwritten</li> * <li>if no "[" is detected the value is added to the return array with the name as index</li> * <li>if no "]" is detected after detecting a "[" the value is added to the return array with the name as index</li> * <li>if there's a mismatch in bracket usage the remaining part is dropped</li> * <li>“.” and “ ” are not converted to “_”</li> * <li>If there is no “]”, then the first “[” is not converted to becomes an “_”</li> * <li>no whitespace trimming is done on the key value</li> * </ul> * * @see https://php.net/parse_str * @see https://wiki.php.net/rfc/on_demand_name_mangling * @see https://github.com/php/php-src/blob/master/ext/standard/tests/strings/parse_str_basic1.phpt * @see https://github.com/php/php-src/blob/master/ext/standard/tests/strings/parse_str_basic2.phpt * @see https://github.com/php/php-src/blob/master/ext/standard/tests/strings/parse_str_basic3.phpt * @see https://github.com/php/php-src/blob/master/ext/standard/tests/strings/parse_str_basic4.phpt * * @param array $data the submitted array * @param array|string $name the pair key * @param string $value the pair value */ private static function extractPhpVariable( array $data, array|string $name, ?string $value = '', QueryExtractMode $extractMode = QueryExtractMode::Unmangled ): array { if (is_array($name)) { [$name, $value] = $name; if (null !== $value || QueryExtractMode::LossLess !== $extractMode) { $value = rawurldecode((string) $value); } } if ('' === $name) { return $data; } $leftBracketPosition = strpos($name, '['); if (false === $leftBracketPosition) { $data[$name] = $value; return $data; } $rightBracketPosition = strpos($name, ']', $leftBracketPosition); if (false === $rightBracketPosition) { $data[$name] = $value; return $data; } $key = substr($name, 0, $leftBracketPosition); if ('' === $key) { $key = '0'; } if (!array_key_exists($key, $data) || !is_array($data[$key])) { $data[$key] = []; } $remaining = substr($name, $rightBracketPosition + 1); if (!str_starts_with($remaining, '[') || !str_contains($remaining, ']')) { $remaining = ''; } $name = substr($name, $leftBracketPosition + 1, $rightBracketPosition - $leftBracketPosition - 1).$remaining; if ('' === $name) { $data[$key][] = $value; return $data; } $data[$key] = self::extractPhpVariable($data[$key], $name, $value, $extractMode); return $data; } } PKCA#]��b���Osystem/helixultimate/vendor/league/uri-interfaces/Exceptions/MissingFeature.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Exceptions; use League\Uri\Contracts\UriException; use RuntimeException; class MissingFeature extends RuntimeException implements UriException { } PKCA#]U�Wt��Qsystem/helixultimate/vendor/league/uri-interfaces/Exceptions/ConversionFailed.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Exceptions; use BackedEnum; use League\Uri\Idna\Error; use League\Uri\Idna\Result; use Stringable; final class ConversionFailed extends SyntaxError { private function __construct( string $message, private readonly string $host, private readonly Result $result ) { parent::__construct($message); } public static function dueToIdnError(BackedEnum|Stringable|string $host, Result $result): self { $reasons = array_map(fn (Error $error): string => $error->description(), $result->errors()); if ($host instanceof BackedEnum) { $host = (string) $host->value; } return new self('Host `'.$host.'` is invalid: '.implode('; ', $reasons).'.', (string) $host, $result); } public function getHost(): string { return $this->host; } public function getResult(): Result { return $this->result; } } PKCA#]d�ccRsystem/helixultimate/vendor/league/uri-interfaces/Exceptions/OffsetOutOfBounds.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Exceptions; class OffsetOutOfBounds extends SyntaxError { } PKCA#]�n�l��Lsystem/helixultimate/vendor/league/uri-interfaces/Exceptions/SyntaxError.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Exceptions; use InvalidArgumentException; use League\Uri\Contracts\UriException; class SyntaxError extends InvalidArgumentException implements UriException { } PKCA#]��"�{{Gsystem/helixultimate/vendor/league/uri-interfaces/UrnComparisonMode.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; enum UrnComparisonMode { case IncludeComponents; case ExcludeComponents; } PKCA#]�7II?system/helixultimate/vendor/league/uri-interfaces/composer.jsonnu�[���{ "name": "league/uri-interfaces", "type": "library", "description" : "Common tools for parsing and resolving RFC3987/RFC3986 URI", "keywords": [ "url", "uri", "rfc3986", "rfc3987", "rfc6570", "psr-7", "parse_url", "http", "https", "ws", "ftp", "data-uri", "file-uri", "parse_str", "query-string", "querystring", "hostname" ], "license": "MIT", "homepage": "https://uri.thephpleague.com", "authors": [ { "name" : "Ignace Nyamagana Butera", "email" : "nyamsprod@gmail.com", "homepage" : "https://nyamsprod.com" } ], "funding": [ { "type": "github", "url": "https://github.com/sponsors/nyamsprod" } ], "require": { "php" : "^8.1", "ext-filter": "*", "psr/http-message": "^1.1 || ^2.0" }, "autoload": { "psr-4": { "League\\Uri\\": "" } }, "suggest": { "ext-bcmath": "to improve IPV4 host parsing", "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", "php-64bit": "to improve IPV4 host parsing", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present", "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification" }, "extra": { "branch-alias": { "dev-master": "7.x-dev" } }, "support": { "forum": "https://thephpleague.slack.com", "docs": "https://uri.thephpleague.com", "issues": "https://github.com/thephpleague/uri-src/issues" }, "config": { "sort-packages": true } } PKCA#]�)"���>system/helixultimate/vendor/league/uri-interfaces/HostType.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; enum HostType { case RegisteredName; case Ipv4; case Ipv6; case IpvFuture; } PKCA#]�E��88Hsystem/helixultimate/vendor/league/uri-interfaces/StringCoercionMode.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use BackedEnum; use DateTimeInterface; use League\Uri\Contracts\UriComponentInterface; use Stringable; use TypeError; use Uri\Rfc3986\Uri as Rfc3986Uri; use Uri\WhatWg\Url as WhatWgUrl; use ValueError; use function array_is_list; use function array_map; use function get_debug_type; use function implode; use function is_array; use function is_float; use function is_infinite; use function is_nan; use function is_object; use function is_resource; use function is_scalar; use function json_encode; use const JSON_PRESERVE_ZERO_FRACTION; enum StringCoercionMode { /** * PHP conversion mode. * * Guarantees that only scalar values, BackedEnum, and null are accepted. * Any object, Non-backed enums, resource, or recursive structure results in an error. * * - null: is not converted and stays the `null` value * - string: used as-is * - bool: converted to string “0” (false) or “1” (true) * - int: converted to numeric string (123 -> “123”) * - float: converted to decimal string (3.14 -> “3.14”) * - Backed Enum: converted to their backing value and then stringify see int and string */ case Native; /** * Ecmascript conversion mode. * * Guarantees that only scalar values, BackedEnum, and null are accepted. * Any resource, or recursive structure results in an error. * * - null: converted to string “null” * - string: used as-is * - bool: converted to string “false” (false) or “true” (true) * - int: converted to numeric string (123 -> “123”) * - float: converted to decimal string (3.14 -> “3.14”), "NaN", "-Infinity" or "Infinity" * - Backed Enum: converted to their backing value and then stringify see int and string * - Array as list are flatten into a string list using the "," character as separator * - Associative array, Non-backed enums, any object without stringification semantics is coerced to "[object Object]". * - DateTimeInterface implementing object are coerce to their string representation using DateTimeInterface::RFC2822 format */ case Ecmascript; private const RECURSION_MARKER = "\0__RECURSION_INTERNAL_MARKER_WHATWG__\0"; public function isCoercible(mixed $value): bool { return self::Ecmascript === $this ? !is_resource($value) : match (true) { $value instanceof Rfc3986Uri, $value instanceof WhatWgUrl, $value instanceof BackedEnum, $value instanceof Stringable, is_scalar($value), null === $value => true, default => false, }; } /** * @throws TypeError if the type is not supported by the specific case * @throws ValueError if circular reference is detected */ public function coerce(mixed $value): ?string { return match ($this) { self::Ecmascript => match (true) { $value instanceof Rfc3986Uri => $value->toString(), $value instanceof WhatWgUrl => $value->toAsciiString(), $value instanceof DateTimeInterface => $value->format(DateTimeInterface::RFC2822), $value instanceof BackedEnum => (string) $value->value, $value instanceof Stringable => $value->__toString(), is_object($value) => '[object Object]', is_array($value) => match (true) { self::hasCircularReference($value) => throw new ValueError('Recursive array structure detected; unable to coerce value.'), array_is_list($value) => implode(',', array_map($this->coerce(...), $value)), default => '[object Object]', }, true === $value => 'true', false === $value => 'false', null === $value => 'null', is_float($value) => match (true) { is_nan($value) => 'NaN', is_infinite($value) => 0 < $value ? 'Infinity' : '-Infinity', default => (string) json_encode($value, JSON_PRESERVE_ZERO_FRACTION), }, is_scalar($value) => (string) $value, default => throw new TypeError('Unable to coerce value of type "'.get_debug_type($value).'" with "'.$this->name.'" coercion.'), }, self::Native => match (true) { $value instanceof UriComponentInterface => $value->value(), $value instanceof WhatWgUrl => $value->toAsciiString(), $value instanceof Rfc3986Uri => $value->toString(), $value instanceof BackedEnum => (string) $value->value, $value instanceof Stringable => $value->__toString(), false === $value => '0', true === $value => '1', null === $value => null, is_scalar($value) => (string) $value, default => throw new TypeError('Unable to coerce value of type "'.get_debug_type($value).'" with "'.$this->name.'" coercion.'), }, }; } /** * Array recursion detection. * @see https://stackoverflow.com/questions/9042142/detecting-infinite-array-recursion-in-php */ private static function hasCircularReference(array &$arr): bool { if (isset($arr[self::RECURSION_MARKER])) { return true; } try { $arr[self::RECURSION_MARKER] = true; foreach ($arr as $key => &$value) { if (self::RECURSION_MARKER !== $key && is_array($value) && self::hasCircularReference($value)) { return true; } } return false; } finally { unset($arr[self::RECURSION_MARKER]); } } } PKCA#]�����Fsystem/helixultimate/vendor/league/uri-interfaces/QueryComposeMode.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; enum QueryComposeMode { /** * Pre-PHP 8.4 Mode. * * Strictly uses get_object_vars on objects (Enum included) * If the value can not be serialized the entry is skipped. * * ie http_build_query behavior before PHP8.4 */ case Compatible; /** * PHP 8.4+ enum-compatible lenient mode. * * Provides stable support for BackedEnum values. * UnitEnum values are skipped. * Uses get_object_vars() for non-enum objects. * Unserializable values are skipped. * * Behaves like {@see QueryComposeMode::EnumCompatible} * but does not throw for UnitEnum values. * * Mirrors http_build_query behavior in PHP 8.4+, * except that error cases are silently ignored * instead of throwing. * * This mode is tolerant by design and skips entries that would otherwise * result in an exception in {@see QueryComposeMode::EnumCompatible}. */ case EnumLenient; /** * PHP 8.4+ mode. * * Provides stable support for BackedEnum values. * Throws for UnitEnum. * Uses get_object_vars() for non-enum objects. * Unserializable values are skipped. * * http_build_query behavior in PHP 8.4+. */ case EnumCompatible; /** * Use PHP version http_build_query algorithm. * * In pre-PHP8.4 you get the same results as `Compatible` * In PHP PHP8.4+ you get the same results as `EnumCompatible` */ case Native; /** * Validation-first mode. * * Guarantees that only scalar values, BackedEnum, and null are accepted. * Any object, UnitEnum, resource, or recursive structure * results in an exception. * * - null: the key name is used but the separator and its content are omitted * - string: used as-is * - bool: converted to string “0” (false) or “1” (true) * - int: converted to numeric string (123 -> “123”) * - float: converted to decimal string (3.14 -> “3.14”) * - Backed Enum: converted to their backing value and then stringify see int and string * - array: empty array: An empty array has zero items, therefore empty arrays are omitted from the query parameter list. * - lists: Becomes a repeated name suffixed with empty brackets (ie "a" with ["foo", false, 1.23] will result in a[]=foo&a[]=0&a[]=1.23) * - maps: Becomes a repeated name suffixed with brackets containing the key (ie "a" with ["b" => "foo", "c" => false, "d" => 1.23] will result in a[b]=foo&a[c]=0&a[d]=1.23) * * This contract is stable and independent of PHP's http_build_query implementation. */ case Safe; } PKCA#]��87^^@system/helixultimate/vendor/league/uri-interfaces/HostFormat.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; enum HostFormat { case Ascii; case Unicode; } PKCA#]��-���Rsystem/helixultimate/vendor/league/uri-interfaces/Contracts/AuthorityInterface.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use League\Uri\Exceptions\MissingFeature; use League\Uri\Exceptions\SyntaxError; use Stringable; interface AuthorityInterface extends UriComponentInterface { /** * Returns the host component of the authority. */ public function getHost(): ?string; /** * Returns the port component of the authority. */ public function getPort(): ?int; /** * Returns the user information component of the authority. */ public function getUserInfo(): ?string; /** * Returns an associative array containing all the Authority components. * * The returned a hashmap similar to PHP's parse_url return value * * @link https://tools.ietf.org/html/rfc3986 * * @return array{user: ?string, pass : ?string, host: ?string, port: ?int} */ public function components(): array; /** * Return an instance with the specified host. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified host. * * A null value provided for the host is equivalent to removing the host * information. * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. * @throws MissingFeature for component or transformations * requiring IDN support when IDN support is not present * or misconfigured. */ public function withHost(Stringable|string|null $host): self; /** * Return an instance with the specified port. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified port. * * A null value provided for the port is equivalent to removing the port * information. * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. */ public function withPort(?int $port): self; /** * Return an instance with the specified user information. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified user information. * * Password is optional, but the user information MUST include the * user; a null value for the user is equivalent to removing user * information. * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. */ public function withUserInfo(Stringable|string|null $user, Stringable|string|null $password = null): self; } PKCA#]E�V���Osystem/helixultimate/vendor/league/uri-interfaces/Contracts/IpHostInterface.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; interface IpHostInterface extends HostInterface { /** * Tells whether the host is an IPv4 address. */ public function isIpv4(): bool; /** * Tells whether the host is an IPv6 address. */ public function isIpv6(): bool; /** * Tells whether the host is an IPv6 address. */ public function isIpFuture(): bool; /** * Tells whether the host has a ZoneIdentifier. * * @see http://tools.ietf.org/html/rfc6874#section-4 */ public function hasZoneIdentifier(): bool; /** * Returns a host without its zone identifier according to RFC6874. * * This method MUST retain the state of the current instance, and return * an instance without the host zone identifier according to RFC6874 * * @see http://tools.ietf.org/html/rfc6874#section-4 */ public function withoutZoneIdentifier(): self; } PKCA#]p@��Msystem/helixultimate/vendor/league/uri-interfaces/Contracts/HostInterface.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; /** * @method string|null encoded() returns RFC3986 encoded host */ interface HostInterface extends UriComponentInterface { /** * Returns the ascii representation. */ public function toAscii(): ?string; /** * Returns the unicode representation. */ public function toUnicode(): ?string; /** * Returns the IP version. * * If the host is a not an IP this method will return null */ public function getIpVersion(): ?string; /** * Returns the IP component If the Host is an IP address. * * If the host is a not an IP this method will return null */ public function getIp(): ?string; /** * Tells whether the host is a domain name. */ public function isDomain(): bool; /** * Tells whether the host is an IP Address. */ public function isIp(): bool; /** * Tells whether the host is a registered name. */ public function isRegisteredName(): bool; } PKCA#]̀�& Qsystem/helixultimate/vendor/league/uri-interfaces/Contracts/UserInfoInterface.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use Stringable; interface UserInfoInterface extends UriComponentInterface { /** * Returns the user component part. */ public function getUser(): ?string; /** * Returns the pass component part. */ public function getPass(): ?string; /** * Returns an associative array containing all the User Info components. * * The returned a hashmap similar to PHP's parse_url return value * * @link https://tools.ietf.org/html/rfc3986 * * @return array{user: ?string, pass : ?string} */ public function components(): array; /** * Returns an instance with the specified user and/or pass. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified new username * otherwise it returns the same instance unchanged. * * A variable equal to null is equivalent to removing the complete user information. */ public function withUser(Stringable|string|null $username): self; /** * Returns an instance with the specified user and/or pass. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified password if the user is specified * otherwise it returns the same instance unchanged. * * An empty user is equivalent to removing the user information. */ public function withPass(Stringable|string|null $password): self; } PKCA#]�<u?0?0Lsystem/helixultimate/vendor/league/uri-interfaces/Contracts/UriInterface.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use JsonSerializable; use League\Uri\Exceptions\MissingFeature; use League\Uri\Exceptions\SyntaxError; use League\Uri\UriString; use Stringable; /** * @phpstan-import-type ComponentMap from UriString * * @method string|null getUsername() returns the user component of the URI. * @method self withUsername(?string $user) returns a new URI instance with the user component updated. * @method string|null getPassword() returns the scheme-specific information about how to gain authorization to access the resource. * @method self withPassword(?string $password) returns a new URI instance with the password component updated. * @method string toAsciiString() returns the string representation of the URI in its RFC3986 form * @method string toUnicodeString() returns the string representation of the URI in its RFC3987 form (the host is in its IDN form) * @method array toComponents() returns an associative array containing all the URI components. * @method self normalize() returns a new URI instance with normalized components * @method self resolve(UriInterface $uri) resolves a URI against a base URI using RFC3986 rules * @method self relativize(UriInterface $uri) relativize a URI against a base URI using RFC3986 rules */ interface UriInterface extends JsonSerializable, Stringable { /** * Returns the string representation as a URI reference. * * @see http://tools.ietf.org/html/rfc3986#section-4.1 */ public function __toString(): string; /** * Returns the string representation as a URI reference. * * @see http://tools.ietf.org/html/rfc3986#section-4.1 */ public function toString(): string; /** * Returns the string representation as a URI reference. * * @see http://tools.ietf.org/html/rfc3986#section-4.1 * @see ::__toString */ public function jsonSerialize(): string; /** * Retrieve the scheme component of the URI. * * If no scheme is present, this method MUST return a null value. * * The value returned MUST be normalized to lowercase, per RFC 3986 * Section 3.1. * * The trailing ":" character is not part of the scheme and MUST NOT be * added. * * @see https://tools.ietf.org/html/rfc3986#section-3.1 */ public function getScheme(): ?string; /** * Retrieve the authority component of the URI. * * If no scheme is present, this method MUST return a null value. * * If the port component is not set or is the standard port for the current * scheme, it SHOULD NOT be included. * * @see https://tools.ietf.org/html/rfc3986#section-3.2 */ public function getAuthority(): ?string; /** * Retrieve the user information component of the URI. * * If no scheme is present, this method MUST return a null value. * * If a user is present in the URI, this will return that value; * additionally, if the password is also present, it will be appended to the * user value, with a colon (":") separating the values. * * The trailing "@" character is not part of the user information and MUST * NOT be added. */ public function getUserInfo(): ?string; /** * Retrieve the host component of the URI. * * If no host is present this method MUST return a null value. * * The value returned MUST be normalized to lowercase, per RFC 3986 * Section 3.2.2. * * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 */ public function getHost(): ?string; /** * Retrieve the port component of the URI. * * If a port is present, and it is non-standard for the current scheme, * this method MUST return it as an integer. If the port is the standard port * used with the current scheme, this method SHOULD return null. * * If no port is present, and no scheme is present, this method MUST return * a null value. * * If no port is present, but a scheme is present, this method MAY return * the standard port for that scheme, but SHOULD return null. */ public function getPort(): ?int; /** * Retrieve the path component of the URI. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * Normally, the empty path "" and absolute path "/" are considered equal as * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically * do this normalization because in contexts with a trimmed base path, e.g. * the front controller, this difference becomes significant. It's the task * of the user to handle both "" and "/". * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.3. * * As an example, if the value should include a slash ("/") not intended as * delimiter between path segments, that value MUST be passed in encoded * form (e.g., "%2F") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.3 */ public function getPath(): string; /** * Retrieve the query string of the URI. * * If no host is present this method MUST return a null value. * * The leading "?" character is not part of the query and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.4. * * As an example, if a value in a key/value pair of the query string should * include an ampersand ("&") not intended as a delimiter between values, * that value MUST be passed in encoded form (e.g., "%26") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.4 */ public function getQuery(): ?string; /** * Retrieve the fragment component of the URI. * * If no host is present this method MUST return a null value. * * The leading "#" character is not part of the fragment and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.5. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.5 */ public function getFragment(): ?string; /** * Returns an associative array containing all the URI components. * * The returned array is similar to PHP's parse_url return value with the following * differences: * * <ul> * <li>All components are present in the returned array</li> * <li>Empty and undefined component are treated differently. And empty component is * set to the empty string while an undefined component is set to the `null` value.</li> * </ul> * * @link https://tools.ietf.org/html/rfc3986 * * @return ComponentMap */ public function getComponents(): array; /** * Return an instance with the specified scheme. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified scheme. * * A null value provided for the scheme is equivalent to removing the scheme * information. * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. */ public function withScheme(Stringable|string|null $scheme): self; /** * Return an instance with the specified user information. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified user information. * * Password is optional, but the user information MUST include the * user; a null value for the user is equivalent to removing user * information. * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. */ public function withUserInfo(Stringable|string|null $user, Stringable|string|null $password = null): self; /** * Return an instance with the specified host. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified host. * * A null value provided for the host is equivalent to removing the host * information. * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. * @throws MissingFeature for component or transformations * requiring IDN support when IDN support is not present * or misconfigured. */ public function withHost(Stringable|string|null $host): self; /** * Return an instance with the specified port. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified port. * * A null value provided for the port is equivalent to removing the port * information. * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. */ public function withPort(?int $port): self; /** * Return an instance with the specified path. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified path. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * Users can provide both encoded and decoded path characters. * Implementations ensure the correct encoding as outlined in getPath(). * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. */ public function withPath(Stringable|string $path): self; /** * Return an instance with the specified query string. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified query string. * * Users can provide both encoded and decoded query characters. * Implementations ensure the correct encoding as outlined in getQuery(). * * A null value provided for the query is equivalent to removing the query * information. * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. */ public function withQuery(Stringable|string|null $query): self; /** * Return an instance with the specified URI fragment. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified URI fragment. * * Users can provide both encoded and decoded fragment characters. * Implementations ensure the correct encoding as outlined in getFragment(). * * A null value provided for the fragment is equivalent to removing the fragment * information. * * @throws SyntaxError for invalid component or transformations * that would result in an object in invalid state. */ public function withFragment(Stringable|string|null $fragment): self; } PKCA#]³����Msystem/helixultimate/vendor/league/uri-interfaces/Contracts/PortInterface.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; interface PortInterface extends UriComponentInterface { /** * Returns the integer representation of the Port. */ public function toInt(): ?int; } PKCA#]�����Msystem/helixultimate/vendor/league/uri-interfaces/Contracts/Transformable.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; interface Transformable { /** * Apply a transformation to this instance and return a new instance. * * This method MUST retain the state of the current instance, and return * a new instance of the same type. * * @param callable(static): static $callback */ public function transform(callable $callback): static; } PKCA#]�EFooLsystem/helixultimate/vendor/league/uri-interfaces/Contracts/UriException.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use Throwable; interface UriException extends Throwable { } PKCA#]��c��Msystem/helixultimate/vendor/league/uri-interfaces/Contracts/PathInterface.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use League\Uri\Exceptions\SyntaxError; /** * @method static normalize() returns the normalized string representation of the component */ interface PathInterface extends UriComponentInterface { /** * Returns the decoded path. */ public function decoded(): string; /** * Tells whether the path is absolute or relative. */ public function isAbsolute(): bool; /** * Tells whether the path has a trailing slash. */ public function hasTrailingSlash(): bool; /** * Returns an instance without dot segments. * * This method MUST retain the state of the current instance, and return * an instance that contains the path component normalized by removing * the dot segment. * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withoutDotSegments(): self; /** * Returns an instance with a leading slash. * * This method MUST retain the state of the current instance, and return * an instance that contains the path component with a leading slash * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withLeadingSlash(): self; /** * Returns an instance without a leading slash. * * This method MUST retain the state of the current instance, and return * an instance that contains the path component without a leading slash * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withoutLeadingSlash(): self; /** * Returns an instance with a trailing slash. * * This method MUST retain the state of the current instance, and return * an instance that contains the path component with a trailing slash * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withTrailingSlash(): self; /** * Returns an instance without a trailing slash. * * This method MUST retain the state of the current instance, and return * an instance that contains the path component without a trailing slash * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withoutTrailingSlash(): self; } PKCA#]�O"_��Msystem/helixultimate/vendor/league/uri-interfaces/Contracts/Conditionable.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; interface Conditionable { /** * Apply the callback if the given "condition" is (or resolves to) true. * * @param (callable(static): bool)|bool $condition * @param callable(static): (static|null) $onSuccess * @param ?callable(static): (static|null) $onFail */ public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): static; } PKCA#]�" � Usystem/helixultimate/vendor/league/uri-interfaces/Contracts/UriComponentInterface.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use JsonSerializable; use Stringable; /** * @method static when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null) conditionally return a new instance * @method bool equals(mixed $value) tells whether the submitted value is equal to the current instance value */ interface UriComponentInterface extends JsonSerializable, Stringable { /** * Returns the instance string representation. * * If the instance is defined, the value returned MUST be percent-encoded, * but MUST NOT double-encode any characters. To determine what characters * to encode, please refer to RFC 3986, Sections 2 and 3. * * If the instance is not defined null is returned */ public function value(): ?string; /** * Returns the instance string representation. * * If the instance is defined, the value returned MUST be percent-encoded, * but MUST NOT double-encode any characters. To determine what characters * to encode, please refer to RFC 3986, Sections 2 and 3. * * If the instance is not defined, an empty string is returned */ public function toString(): string; /** * Returns the instance string representation. * * If the instance is defined, the value returned MUST be percent-encoded, * but MUST NOT double-encode any characters. To determine what characters * to encode, please refer to RFC 3986, Sections 2 and 3. * * If the instance is not defined, an empty string is returned */ public function __toString(): string; /** * Returns the instance json representation. * * If the instance is defined, the value returned MUST be percent-encoded, * but MUST NOT double-encode any characters. To determine what characters * to encode, please refer to RFC 3986 or RFC 1738. * * If the instance is not defined, null is returned */ public function jsonSerialize(): ?string; /** * Returns the instance string representation with its optional URI delimiters. * * The value returned MUST be percent-encoded, but MUST NOT double-encode any * characters. To determine what characters to encode, please refer to RFC 3986, * Sections 2 and 3. * * If the instance is not defined, an empty string is returned */ public function getUriComponent(): string; } PKCA#]2��//Qsystem/helixultimate/vendor/league/uri-interfaces/Contracts/FragmentInterface.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; /** * @method self normalize() returns the normalized string representation of the component */ interface FragmentInterface extends UriComponentInterface { /** * Returns the decoded fragment. */ public function decoded(): ?string; } PKCA#]C��a� � Qsystem/helixultimate/vendor/league/uri-interfaces/Contracts/DataPathInterface.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use SplFileObject; use Stringable; interface DataPathInterface extends PathInterface { /** * Retrieve the data mime type associated to the URI. * * If no mimetype is present, this method MUST return the default mimetype 'text/plain'. * * @see http://tools.ietf.org/html/rfc2397#section-2 */ public function getMimeType(): string; /** * Retrieve the parameters associated with the Mime Type of the URI. * * If no parameters is present, this method MUST return the default parameter 'charset=US-ASCII'. * * @see http://tools.ietf.org/html/rfc2397#section-2 */ public function getParameters(): string; /** * Retrieve the mediatype associated with the URI. * * If no mediatype is present, this method MUST return the default parameter 'text/plain;charset=US-ASCII'. * * @see http://tools.ietf.org/html/rfc2397#section-3 * * @return string The URI scheme. */ public function getMediaType(): string; /** * Retrieves the data string. * * Retrieves the data part of the path. If no data part is provided return * an empty string */ public function getData(): string; /** * Tells whether the data is binary safe encoded. */ public function isBinaryData(): bool; /** * Save the data to a specific file. */ public function save(string $path, string $mode = 'w'): SplFileObject; /** * Returns an instance where the data part is base64 encoded. * * This method MUST retain the state of the current instance, and return * an instance where the data part is base64 encoded */ public function toBinary(): self; /** * Returns an instance where the data part is url encoded following RFC3986 rules. * * This method MUST retain the state of the current instance, and return * an instance where the data part is url encoded */ public function toAscii(): self; /** * Return an instance with the specified mediatype parameters. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified mediatype parameters. * * Users must provide encoded characters. * * An empty parameters value is equivalent to removing the parameter. */ public function withParameters(Stringable|string $parameters): self; } PKCA#]�FFSsystem/helixultimate/vendor/league/uri-interfaces/Contracts/DomainHostInterface.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use BackedEnum; use Countable; use Iterator; use IteratorAggregate; use League\Uri\Exceptions\SyntaxError; use Stringable; /** * @extends IteratorAggregate<int, string> * * @method bool isSubdomainOf(BackedEnum|Stringable|string|null $parentHost) Tells whether the current domain instance is a subdomain of the parent host. * @method bool hasSubdomain(BackedEnum|Stringable|string|null $childHost) Tells whether the submitted host is a subdomain of the current instance. * @method bool isSiblingOf(BackedEnum|Stringable|string|null $siblingHost) Tells whether the submitted host share the same parent domain as the current instance. * @method static commonAncestorWith(BackedEnum|Stringable|string|null $other) Returns the common longest ancestor between 2 domain. The returned domain is empty if no ancestor is found * @method static parentHost() Returns the current parent domain for the current instance. The returned domain is empty if no ancestor is found * @method bool isEmpty() Tells whether the domain contains any label. */ interface DomainHostInterface extends Countable, HostInterface, IteratorAggregate { /** * Returns the labels total number. */ public function count(): int; /** * Iterate over the Domain labels. * * @return Iterator<string> */ public function getIterator(): Iterator; /** * Retrieves a single host label. * * If the label offset has not been set, returns the null value. */ public function get(int $offset): ?string; /** * Returns the associated key for a specific label or all the keys. * * @return int[] */ public function keys(?string $label = null): array; /** * Tells whether the domain is absolute. */ public function isAbsolute(): bool; /** * Prepends a label to the host. */ public function prepend(Stringable|string $label): self; /** * Appends a label to the host. */ public function append(Stringable|string $label): self; /** * Extracts a slice of $length elements starting at position $offset from the host. * * This method MUST retain the state of the current instance, and return * an instance that contains the selected slice. * * If $length is null it returns all elements from $offset to the end of the Domain. */ public function slice(int $offset, ?int $length = null): self; /** * Returns an instance with its Root label. * * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 */ public function withRootLabel(): self; /** * Returns an instance without its Root label. * * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 */ public function withoutRootLabel(): self; /** * Returns an instance with the modified label. * * This method MUST retain the state of the current instance, and return * an instance that contains the new label * * If $key is non-negative, the added label will be the label at $key position from the start. * If $key is negative, the added label will be the label at $key position from the end. * * @throws SyntaxError If the key is invalid */ public function withLabel(int $key, Stringable|string $label): self; /** * Returns an instance without the specified label. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified component * * If $key is non-negative, the removed label will be the label at $key position from the start. * If $key is negative, the removed label will be the label at $key position from the end. * * @throws SyntaxError If the key is invalid */ public function withoutLabel(int ...$keys): self; } PKCA#]��&4+4+Nsystem/helixultimate/vendor/league/uri-interfaces/Contracts/QueryInterface.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use BackedEnum; use Countable; use Deprecated; use Iterator; use IteratorAggregate; use League\Uri\QueryComposeMode; use League\Uri\StringCoercionMode; use Stringable; /** * @extends IteratorAggregate<array{0:string, 1:string|null}> * * @method string|null toFormData() Returns the string representation using the application/www-form-urlencoded rules * @method string|null toRFC3986() Returns the string representation using RFC3986 rules * @method string|null first(string $key) Returns the first value associated with the given name * @method string|null last(string $key) Returns the first value associated with the given name * @method int|null indexOf(string $key, int $nth = 0) Returns the offset of the pair based on its key and its nth occurrence; negative occurrences are supported * @method int|null indexOfValue(?string $value, int $nth = 0) Returns the offset of the pair based on its value and its nth occurrence; negative occurrences are supported * @method array pair(int $offset) Returns the key/value pair at the given numeric offset; negative occurrences are supported * @method int countDistinctKeys() Returns the total number of distinct keys * @method string|null valueAt(int $offset): Returns the value at the given numeric offset; negative occurrences are supported * @method string keyAt(int $offset): Returns the key at the given numeric offset; negative occurrences are supported * @method self normalize() returns the normalized string representation of the component * @method self withoutPairByKey(string ...$keys) Returns an instance without pairs with the specified keys. * @method self withoutPairByValue(array|BackedEnum|Stringable|string|int|bool|null $values, StringCoercionMode $coercionMode = StringCoercionMode::Native) Returns an instance without pairs with the specified values. * @method self withoutPairByKeyValue(string $key, BackedEnum|Stringable|string|int|bool|null $value, StringCoercionMode $coercionMode = StringCoercionMode::Native) Returns an instance without pairs with the specified key/value pair * @method bool hasPair(string $key, ?string $value) Tells whether the pair exists in the query. * @method array getList(string $name) Returns the list associated with the given name or an empty array if it does not exist. * @method bool hasList(string ...$names) Tells whether the parameter list exists in the query. * @method self appendList(string $name, array $values, QueryComposeMode $composeMode = QueryComposeMode::Native) Appends a parameter to the query string * @method self withList(string $name, array $values, QueryComposeMode $composeMode = QueryComposeMode::Native) Adds a new parameter to the query string and remove any previously set values * @method self withoutList(string ...$names) Removes any given list associated with the given names * @method self withoutLists() Removes all lists from the query string * @method self onlyLists() Removes all pairs without a valid PHP's bracket notation */ interface QueryInterface extends Countable, IteratorAggregate, UriComponentInterface { /** * Returns the query separator. * * @return non-empty-string */ public function getSeparator(): string; /** * Returns the number of key/value pairs present in the object. */ public function count(): int; /** * Returns an iterator allowing to go through all key/value pairs contained in this object. * * The pair is represented as an array where the first value is the pair key * and the second value the pair value. * * The key of each pair is a string * The value of each pair is a scalar or the null value * * @return Iterator<int, array{0:string, 1:string|null}> */ public function getIterator(): Iterator; /** * Returns an iterator allowing to go through all key/value pairs contained in this object. * * The return type is as an Iterator where its offset is the pair key and its value the pair value. * * The key of each pair is a string * The value of each pair is a scalar or the null value * * @return iterable<string, string|null> */ public function pairs(): iterable; /** * Tells whether a list of pair with a specific key exists. * * @see https://url.spec.whatwg.org/#dom-urlsearchparams-has */ public function has(string ...$keys): bool; /** * Returns the first value associated to the given pair name. * * If no value is found null is returned * * @see https://url.spec.whatwg.org/#dom-urlsearchparams-get */ public function get(string $key): ?string; /** * Returns all the values associated to the given pair name as an array or all * the instance pairs. * * If no value is found an empty array is returned * * @see https://url.spec.whatwg.org/#dom-urlsearchparams-getall * * @return array<int, string|null> */ public function getAll(string $key): array; /** * Returns the store PHP variables as elements of an array. * * The result is similar as PHP parse_str when used with its * second argument with the difference that variable names are * not mangled. * * @see http://php.net/parse_str * @see https://wiki.php.net/rfc/on_demand_name_mangling * * @return array the collection of stored PHP variables or the empty array if no input is given, */ public function parameters(): array; /** * Returns the value attached to the specific key. * * The result is similar to PHP parse_str with the difference that variable * names are not mangled. * * If a key is submitted it will return the value attached to it or null * * @see http://php.net/parse_str * @see https://wiki.php.net/rfc/on_demand_name_mangling * * @return mixed the collection of stored PHP variables or the empty array if no input is given, * the single value of a stored PHP variable or null if the variable is not present in the collection */ public function parameter(string $name): mixed; /** * Tells whether a list of variable with specific names exists. * * @see https://url.spec.whatwg.org/#dom-urlsearchparams-has */ public function hasParameter(string ...$names): bool; /** * Returns the RFC1738 encoded query. */ public function toRFC1738(): ?string; /** * Returns an instance with a different separator. * * This method MUST retain the state of the current instance, and return * an instance that contains the query component with a different separator */ public function withSeparator(string $separator): self; /** * Returns an instance with the new pairs set to it. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified query * * @see ::withPair */ public function merge(Stringable|string $query): self; /** * Returns an instance with the new pairs appended to it. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified query * * If the pair already exists the value will be added to it. */ public function append(Stringable|string $query): self; /** * Returns a new instance with a specified key/value pair appended as a new pair. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified query */ public function appendTo(string $key, Stringable|string|int|bool|null $value): self; /** * Sorts the query string by offset, maintaining offset to data correlations. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified query * * @see https://url.spec.whatwg.org/#dom-urlsearchparams-sort */ public function sort(): self; /** * Returns an instance without duplicate key/value pair. * * This method MUST retain the state of the current instance, and return * an instance that contains the query component normalized by removing * duplicate pairs whose key/value are the same. */ public function withoutDuplicates(): self; /** * Returns an instance without empty key/value where the value is the null value. * * This method MUST retain the state of the current instance, and return * an instance that contains the query component normalized by removing * empty pairs. * * A pair is considered empty if its value is equal to the null value */ public function withoutEmptyPairs(): self; /** * Returns an instance where numeric indices associated to PHP's array like key are removed. * * This method MUST retain the state of the current instance, and return * an instance that contains the query component normalized so that numeric indexes * are removed from the pair key value. * * i.e.: toto[3]=bar[3]&foo=bar becomes toto[]=bar[3]&foo=bar */ public function withoutNumericIndices(): self; /** * Returns an instance with a new key/value pair added to it. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified query * * If the pair already exists the value will replace the existing value. * * @see https://url.spec.whatwg.org/#dom-urlsearchparams-set */ public function withPair(string $key, Stringable|string|int|float|bool|null $value): self; /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.3.0 * @codeCoverageIgnore * @see QueryInterface::withoutPairByKey() * * Returns an instance without the specified keys. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified component */ #[Deprecated(message:'use League\Uri\Contracts\QueryInterface::withoutPairByKey() instead', since:'league/uri-interfaces:7.3.0')] public function withoutPair(string ...$keys): self; /** * Returns an instance without the specified params. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified component without PHP's value. * PHP's mangled is not taken into account. */ public function withoutParameters(string ...$names): self; } PKCA#]�d% mmIsystem/helixultimate/vendor/league/uri-interfaces/Contracts/UriAccess.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use Psr\Http\Message\UriInterface as Psr7UriInterface; /** * @deprecated since version 7.6.0 */ interface UriAccess { public function getUri(): UriInterface|Psr7UriInterface; /** * Returns the RFC3986 string representation of the complete URI. */ public function getUriString(): string; } PKCA#]�ƷQsystem/helixultimate/vendor/league/uri-interfaces/Contracts/FragmentDirective.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use Stringable; /** * @see https://wicg.github.io/scroll-to-text-fragment/#the-fragment-directive * * @method string toFragmentValue() returns the encoded string representation of the directive as a fragment string */ interface FragmentDirective extends Stringable { /** * The decoded Directive name. * * @return non-empty-string */ public function name(): string; /** * The decoded Directive value. */ public function value(): ?string; /** * The encoded string representation of the directive. */ public function toString(): string; /** * The encoded string representation of the fragment using * the Stringable interface. * * @see FragmentDirective::toString() */ public function __toString(): string; /** * Tells whether the submitted value is equals to the string * representation of the given directive. */ public function equals(mixed $directive): bool; } PKCA#]n��`��Vsystem/helixultimate/vendor/league/uri-interfaces/Contracts/SegmentedPathInterface.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use Countable; use Iterator; use IteratorAggregate; use League\Uri\Exceptions\SyntaxError; use Stringable; /** * @extends IteratorAggregate<string> */ interface SegmentedPathInterface extends Countable, IteratorAggregate, PathInterface { /** * Returns the total number of segments in the path. */ public function count(): int; /** * Iterate over the path segment. * * @return Iterator<string> */ public function getIterator(): Iterator; /** * Returns parent directory's path. */ public function getDirname(): string; /** * Returns the path basename. */ public function getBasename(): string; /** * Returns the basename extension. */ public function getExtension(): string; /** * Retrieves a single path segment. * * If the segment offset has not been set, returns null. */ public function get(int $offset): ?string; /** * Returns the associated key for a specific segment. * * If a value is specified only the keys associated with * the given value will be returned * * @return array<int> */ public function keys(Stringable|string|null $segment = null): array; /** * Appends a segment to the path. */ public function append(Stringable|string $path): self; /** * Extracts a slice of $length elements starting at position $offset from the host. * * This method MUST retain the state of the current instance, and return * an instance that contains the selected slice. * * If $length is null it returns all elements from $offset to the end of the Path. */ public function slice(int $offset, ?int $length = null): self; /** * Prepends a segment to the path. */ public function prepend(Stringable|string $path): self; /** * Returns an instance with the modified segment. * * This method MUST retain the state of the current instance, and return * an instance that contains the new segment * * If $key is non-negative, the added segment will be the segment at $key position from the start. * If $key is negative, the added segment will be the segment at $key position from the end. * * @throws SyntaxError If the key is invalid */ public function withSegment(int $key, Stringable|string $segment): self; /** * Returns an instance without the specified segment. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified component * * If $key is non-negative, the removed segment will be the segment at $key position from the start. * If $key is negative, the removed segment will be the segment at $key position from the end. * * @throws SyntaxError If the key is invalid */ public function withoutSegment(int ...$keys): self; /** * Returns an instance without duplicate delimiters. * * This method MUST retain the state of the current instance, and return * an instance that contains the path component normalized by removing * multiple consecutive empty segment */ public function withoutEmptySegments(): self; /** * Returns an instance with the specified parent directory's path. * * This method MUST retain the state of the current instance, and return * an instance that contains the extension basename modified. */ public function withDirname(Stringable|string $path): self; /** * Returns an instance with the specified basename. * * This method MUST retain the state of the current instance, and return * an instance that contains the extension basename modified. */ public function withBasename(Stringable|string $basename): self; /** * Returns an instance with the specified basename extension. * * This method MUST retain the state of the current instance, and return * an instance that contains the extension basename modified. */ public function withExtension(Stringable|string $extension): self; } PKCA#]�)F�ppDsystem/helixultimate/vendor/league/uri-interfaces/IPv6/Converter.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\IPv6; use BackedEnum; use Stringable; use ValueError; use function filter_var; use function implode; use function inet_pton; use function str_split; use function strtolower; use function unpack; use const FILTER_FLAG_IPV6; use const FILTER_VALIDATE_IP; final class Converter { /** * Significant 10 bits of IP to detect Zone ID regular expression pattern. * * @var string */ private const HOST_ADDRESS_BLOCK = "\xfe\x80"; public static function compressIp(BackedEnum|string $ipAddress): string { if ($ipAddress instanceof BackedEnum) { $ipAddress = (string) $ipAddress->value; } return match (filter_var($ipAddress, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { false => throw new ValueError('The submitted IP is not a valid IPv6 address.'), default => strtolower((string) inet_ntop((string) inet_pton($ipAddress))), }; } public static function expandIp(BackedEnum|string $ipAddress): string { if ($ipAddress instanceof BackedEnum) { $ipAddress = (string) $ipAddress->value; } if (false === filter_var($ipAddress, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { throw new ValueError('The submitted IP is not a valid IPv6 address.'); } $hex = (array) unpack('H*hex', (string) inet_pton($ipAddress)); return implode(':', str_split(strtolower($hex['hex'] ?? ''), 4)); } public static function compress(BackedEnum|Stringable|string|null $host): ?string { $components = self::parse($host); if (null === $components['ipAddress']) { return match (true) { null === $host => $host, $host instanceof BackedEnum => (string) $host->value, default => (string) $host, }; } $components['ipAddress'] = self::compressIp($components['ipAddress']); return self::build($components); } public static function expand(Stringable|string|null $host): ?string { $components = self::parse($host); if (null === $components['ipAddress']) { return match ($host) { null => $host, default => (string) $host, }; } $components['ipAddress'] = self::expandIp($components['ipAddress']); return self::build($components); } public static function build(array $components): string { $components['ipAddress'] ??= null; $components['zoneIdentifier'] ??= null; if (null === $components['ipAddress']) { return ''; } return '['.$components['ipAddress'].match ($components['zoneIdentifier']) { null => '', default => '%'.$components['zoneIdentifier'], }.']'; } /** * @return array{ipAddress:string|null, zoneIdentifier:string|null} */ private static function parse(BackedEnum|Stringable|string|null $host): array { if (null === $host) { return ['ipAddress' => null, 'zoneIdentifier' => null]; } if ($host instanceof BackedEnum) { $host = $host->value; } $host = (string) $host; if ('' === $host) { return ['ipAddress' => null, 'zoneIdentifier' => null]; } if (!str_starts_with($host, '[')) { return ['ipAddress' => null, 'zoneIdentifier' => null]; } if (!str_ends_with($host, ']')) { return ['ipAddress' => null, 'zoneIdentifier' => null]; } [$ipv6, $zoneIdentifier] = explode('%', substr($host, 1, -1), 2) + [1 => null]; if (false === filter_var($ipv6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { return ['ipAddress' => null, 'zoneIdentifier' => null]; } return match (true) { null === $zoneIdentifier, is_string($ipv6) && str_starts_with((string)inet_pton($ipv6), self::HOST_ADDRESS_BLOCK) => ['ipAddress' => $ipv6, 'zoneIdentifier' => $zoneIdentifier], default => ['ipAddress' => null, 'zoneIdentifier' => null], }; } /** * Tells whether the host is an IPv6. */ public static function isIpv6(BackedEnum|Stringable|string|null $host): bool { return null !== self::parse($host)['ipAddress']; } public static function normalize(BackedEnum|Stringable|string|null $host): ?string { if ($host instanceof BackedEnum) { $host = $host->value; } if (null === $host || '' === $host) { return $host; } $host = (string) $host; $components = self::parse($host); if (null === $components['ipAddress']) { return strtolower($host); } $components['ipAddress'] = strtolower($components['ipAddress']); return self::build($components); } } PKCA#]&?&=EcEc?system/helixultimate/vendor/league/uri-interfaces/UriString.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use BackedEnum; use Deprecated; use League\Uri\Exceptions\SyntaxError; use League\Uri\Idna\Converter as IdnaConverter; use Stringable; use Throwable; use function array_map; use function array_merge; use function array_pop; use function array_reduce; use function defined; use function explode; use function filter_var; use function function_exists; use function implode; use function preg_match; use function sprintf; use function str_replace; use function strpos; use function strtolower; use function substr; use const FILTER_FLAG_IPV4; use const FILTER_VALIDATE_IP; /** * A class to parse a URI string according to RFC3986. * * @link https://tools.ietf.org/html/rfc3986 * @package League\Uri * @author Ignace Nyamagana Butera <nyamsprod@gmail.com> * @since 6.0.0 * * @phpstan-type AuthorityMap array{user: ?string, pass: ?string, host: ?string, port: ?int} * @phpstan-type ComponentMap array{scheme: ?string, user: ?string, pass: ?string, host: ?string, port: ?int, path: string, query: ?string, fragment: ?string} * @phpstan-type InputComponentMap array{scheme? : ?string, user? : ?string, pass? : ?string, host? : ?string, port? : ?int, path? : ?string, query? : ?string, fragment? : ?string} */ final class UriString { /** * Default URI component values. * * @var ComponentMap */ private const URI_COMPONENTS = [ 'scheme' => null, 'user' => null, 'pass' => null, 'host' => null, 'port' => null, 'path' => '', 'query' => null, 'fragment' => null, ]; /** * Simple URI which do not need any parsing. * * @var array<string, array<string>> */ private const URI_SHORTCUTS = [ '' => ['path' => ''], '#' => ['fragment' => ''], '?' => ['query' => ''], '?#' => ['query' => '', 'fragment' => ''], '/' => ['path' => '/'], '//' => ['host' => ''], '///' => ['host' => '', 'path' => '/'], ]; /** * Range of invalid characters in URI 3986 string. * * @var string */ private const REGEXP_VALID_URI_RFC3986_CHARS = '/^(?:[A-Za-z0-9\-._~:\/?#[\]@!$&\'()*+,;=%]|%[0-9A-Fa-f]{2})*$/'; /** * Range of invalid characters in URI 3987 string. * * @var string */ private const REGEXP_INVALID_URI_RFC3987_CHARS = '/[\x00-\x1f\x7f\s]/'; /** * RFC3986 regular expression URI splitter. * * @link https://tools.ietf.org/html/rfc3986#appendix-B * @var string */ private const REGEXP_URI_PARTS = ',^ (?<scheme>(?<scontent>[^:/?\#]+):)? # URI scheme component (?<authority>//(?<acontent>[^/?\#]*))? # URI authority part (?<path>[^?\#]*) # URI path component (?<query>\?(?<qcontent>[^\#]*))? # URI query component (?<fragment>\#(?<fcontent>.*))? # URI fragment component ,x'; /** * URI scheme regular expression. * * @link https://tools.ietf.org/html/rfc3986#section-3.1 * @var string */ private const REGEXP_URI_SCHEME = '/^([a-z][a-z\d+.-]*)?$/i'; /** * Invalid path for URI without scheme and authority regular expression. * * @link https://tools.ietf.org/html/rfc3986#section-3.3 * @var string */ private const REGEXP_INVALID_PATH = ',^(([^/]*):)(.*)?/,'; /** * Host and Port splitter regular expression. * * @var string */ private const REGEXP_HOST_PORT = ',^(?<host>\[.*\]|[^:]*)(:(?<port>.*))?$,'; /** @var array<string,int> */ private const DOT_SEGMENTS = ['.' => 1, '..' => 1]; /** * Generate an IRI string representation (RFC3987) from its parsed representation * returned by League\UriString::parse() or PHP's parse_url. * * If you supply your own array, you are responsible for providing * valid components without their URI delimiters. * * @link https://tools.ietf.org/html/rfc3986#section-5.3 * @link https://tools.ietf.org/html/rfc3986#section-7.5 */ public static function toIriString(BackedEnum|Stringable|string $uri): string { $components = self::parse($uri); $port = null; if (isset($components['port'])) { $port = (int) $components['port']; unset($components['port']); } if (null !== $components['host']) { $components['host'] = IdnaConverter::toUnicode($components['host'])->domain(); } $components['path'] = Encoder::decodePath($components['path']); $components['user'] = Encoder::decodeNecessary($components['user']); $components['pass'] = Encoder::decodeNecessary($components['pass']); $components['query'] = Encoder::decodeQuery($components['query']); $components['fragment'] = Encoder::decodeFragment($components['fragment']); return self::build([ ...array_map(fn (?string $value) => match (true) { null === $value, !str_contains($value, '%20') => $value, default => str_replace('%20', ' ', $value), }, $components), ...['port' => $port], ]); } /** * Generate a URI string representation from its parsed representation * returned by League\UriString::parse() or PHP's parse_url. * * If you supply your own array, you are responsible for providing * valid components without their URI delimiters. * * @link https://tools.ietf.org/html/rfc3986#section-5.3 * @link https://tools.ietf.org/html/rfc3986#section-7.5 * * @param InputComponentMap $components */ public static function build(array $components): string { return self::buildUri( $components['scheme'] ?? null, self::buildAuthority($components), $components['path'] ?? null, $components['query'] ?? null, $components['fragment'] ?? null, ); } /** * Generates a URI string representation based on RFC3986 algorithm. * * Valid URI component MUST be provided without their URI delimiters * but properly encoded. * * @link https://tools.ietf.org/html/rfc3986#section-5.3 * @link https://tools.ietf.org/html/rfc3986#section-7.5§ */ public static function buildUri( ?string $scheme = null, ?string $authority = null, ?string $path = null, ?string $query = null, ?string $fragment = null, ): string { self::validateComponents($scheme, $authority, $path); $uri = ''; if (null !== $scheme) { $uri .= $scheme.':'; } if (null !== $authority) { $uri .= '//'.$authority; } $uri .= $path; if (null !== $query) { $uri .= '?'.$query; } if (null !== $fragment) { $uri .= '#'.$fragment; } return $uri; } /** * Generate a URI authority representation from its parsed representation. * * @param InputComponentMap $components */ public static function buildAuthority(array $components): ?string { if (!isset($components['host'])) { (!isset($components['user']) && !isset($components['pass'])) || throw new SyntaxError('The user info component must not be set if the host is not defined.'); !isset($components['port']) || throw new SyntaxError('The port component must not be set if the host is not defined.'); return null; } $userInfo = $components['user'] ?? null; if (isset($components['pass'])) { $userInfo .= ':'.$components['pass']; } $authority = ''; if (isset($userInfo)) { $authority .= $userInfo.'@'; } $authority .= $components['host']; if (isset($components['port'])) { $authority .= ':'.$components['port']; } return $authority; } /** * Parses and normalizes the URI following RFC3986 destructive and non-destructive constraints. * * @throws SyntaxError if the URI is not parsable * * @return ComponentMap */ public static function parseNormalized(Stringable|string $uri): array { $components = self::parse($uri); if (null !== $components['scheme']) { $components['scheme'] = strtolower($components['scheme']); } $components['host'] = self::normalizeHost($components['host']); $path = $components['path']; $authority = self::buildAuthority($components); //dot segment only happens when: // - the path is absolute // - the scheme and/or the authority are defined if ('/' === ($path[0] ?? '') || '' !== $components['scheme'].$authority) { $path = self::removeDotSegments($path); } // if there is an authority, the path must be absolute if ('' !== $path && '/' !== $path[0]) { if (null !== $authority) { $path = '/'.$path; } } $components['path'] = (string) Encoder::normalizePath($path); $components['query'] = Encoder::normalizeQuery($components['query']); $components['fragment'] = Encoder::normalizeFragment($components['fragment']); $components['user'] = Encoder::normalizeUser($components['user']); $components['pass'] = Encoder::normalizePassword($components['pass']); return $components; } /** * Parses and normalizes the URI following RFC3986 destructive and non-destructive constraints. * * @throws SyntaxError if the URI is not parsable */ public static function normalize(Stringable|string $uri): string { return self::build(self::parseNormalized($uri)); } /** * Parses and normalizes the URI following RFC3986 destructive and non-destructive constraints. * * @throws SyntaxError if the URI is not parsable */ public static function normalizeAuthority(Stringable|string|null $authority): ?string { if (null === $authority) { return null; } $components = self::parseAuthority($authority); $components['host'] = self::normalizeHost($components['host'] ?? null); $components['user'] = Encoder::normalizeUser($components['user']); $components['pass'] = Encoder::normalizePassword($components['pass']); return (string) self::buildAuthority($components); } /** * Resolves a URI against a base URI using RFC3986 rules. * * This method MUST retain the state of the submitted URI instance, and return * a URI instance of the same type that contains the applied modifications. * * This method MUST be transparent when dealing with error and exceptions. * It MUST not alter or silence them apart from validating its own parameters. * * @see https://www.rfc-editor.org/rfc/rfc3986.html#section-5 * * @throws SyntaxError if the BaseUri is not absolute or in absence of a BaseUri if the uri is not absolute */ public static function resolve(BackedEnum|Stringable|string $uri, BackedEnum|Stringable|string|null $baseUri = null): string { if ($uri instanceof BackedEnum) { $uri = (string) $uri->value; } if ($baseUri instanceof BackedEnum) { $baseUri = (string) $baseUri->value; } $uri = (string) $uri; if ('' === $uri) { $uri = $baseUri ?? throw new SyntaxError("The uri can not be the empty string when there's no base URI."); } $uriComponents = self::parse($uri); $baseUriComponents = $uriComponents; if (null !== $baseUri && $uri !== (string) $baseUri) { $baseUriComponents = self::parse($baseUri); } null !== $baseUriComponents['scheme'] || throw new SyntaxError('The base URI must be an absolute URI or null; If the base URI is null the URI must be an absolute URI.'); $authority = self::buildAuthority($uriComponents); $path = self::removeDotSegments($uriComponents['path']); if ('' !== $path && '/' !== $path[0] && (null !== $authority || $uriComponents['path'] !== $path)) { $path = '/'.$path; } if (null !== $uriComponents['scheme'] && '' !== $uriComponents['scheme']) { return self::buildUri($uriComponents['scheme'], $authority, $path, $uriComponents['query'], $uriComponents['fragment']); } if (null !== $authority) { return self::buildUri($baseUriComponents['scheme'], $authority, $path, $uriComponents['query'], $uriComponents['fragment']); } [$resolvedPath, $query] = self::resolvePathAndQuery($uriComponents, $baseUriComponents); $baseAuthority = self::buildAuthority($baseUriComponents); $path = self::removeDotSegments($resolvedPath); if ('' !== $path && '/' !== $path[0] && (null !== $baseAuthority || $resolvedPath !== $path)) { $path = '/'.$path; } return self::buildUri($baseUriComponents['scheme'], $baseAuthority, $path, $query, $uriComponents['fragment']); } /** * Filter Dot segment according to RFC3986. * * @see http://tools.ietf.org/html/rfc3986#section-5.2.4 */ public static function removeDotSegments(Stringable|string $path): string { $path = (string) $path; if (!str_contains($path, '.')) { return $path; } $reducer = function (array $carry, string $segment): array { if ('..' === $segment) { array_pop($carry); return $carry; } if (!isset(self::DOT_SEGMENTS[$segment])) { $carry[] = $segment; } return $carry; }; $oldSegments = explode('/', $path); $newPath = implode('/', array_reduce($oldSegments, $reducer(...), [])); if (isset(self::DOT_SEGMENTS[$oldSegments[array_key_last($oldSegments)]])) { $newPath .= '/'; } return $newPath; } /** * Resolves an URI path and query component. * * @param ComponentMap $uri * @param ComponentMap $baseUri * * @return array{0:string, 1:string|null} */ private static function resolvePathAndQuery(array $uri, array $baseUri): array { if (str_starts_with($uri['path'], '/')) { return [$uri['path'], $uri['query']]; } if ('' === $uri['path']) { return [$baseUri['path'], $uri['query'] ?? $baseUri['query']]; } $targetPath = $uri['path']; if (null !== self::buildAuthority($baseUri) && '' === $baseUri['path']) { $targetPath = '/'.$targetPath; } if ('' !== $baseUri['path']) { $segments = explode('/', $baseUri['path']); array_pop($segments); if ([] !== $segments) { $targetPath = implode('/', $segments).'/'.$targetPath; } } return [$targetPath, $uri['query']]; } public static function containsRfc3986Chars(Stringable|string $uri): bool { return 1 === preg_match(self::REGEXP_VALID_URI_RFC3986_CHARS, (string) $uri); } public static function containsRfc3987Chars(Stringable|string $uri): bool { return 1 !== preg_match(self::REGEXP_INVALID_URI_RFC3987_CHARS, (string) $uri); } /** * Parse a URI string into its components. * * This method parses a URI and returns an associative array containing any * of the various components of the URI that are present. * * <code> * $components = UriString::parse('http://foo@test.example.com:42?query#'); * var_export($components); * //will display * array( * 'scheme' => 'http', // the URI scheme component * 'user' => 'foo', // the URI user component * 'pass' => null, // the URI pass component * 'host' => 'test.example.com', // the URI host component * 'port' => 42, // the URI port component * 'path' => '', // the URI path component * 'query' => 'query', // the URI query component * 'fragment' => '', // the URI fragment component * ); * </code> * * The returned array is similar to PHP's parse_url return value with the following * differences: * * <ul> * <li>All components are always present in the returned array</li> * <li>Empty and undefined component are treated differently. And empty component is * set to the empty string while an undefined component is set to the `null` value.</li> * <li>The path component is never undefined</li> * <li>The method parses the URI following the RFC3986 rules, but you are still * required to validate the returned components against its related scheme specific rules.</li> * </ul> * * @link https://tools.ietf.org/html/rfc3986 * * @throws SyntaxError if the URI contains invalid characters * @throws SyntaxError if the URI contains an invalid scheme * @throws SyntaxError if the URI contains an invalid path * * @return ComponentMap */ public static function parse(BackedEnum|Stringable|string|int $uri): array { if ($uri instanceof BackedEnum) { $uri = $uri->value; } $uri = (string) $uri; if (isset(self::URI_SHORTCUTS[$uri])) { /** @var ComponentMap $components */ $components = [...self::URI_COMPONENTS, ...self::URI_SHORTCUTS[$uri]]; return $components; } self::containsRfc3987Chars($uri) || throw new SyntaxError(sprintf('The uri `%s` contains invalid characters', $uri)); //if the first character is a known URI delimiter, parsing can be simplified $first_char = $uri[0]; //The URI is made of the fragment only if ('#' === $first_char) { [, $fragment] = explode('#', $uri, 2); $components = self::URI_COMPONENTS; $components['fragment'] = $fragment; return $components; } //The URI is made of the query and fragment if ('?' === $first_char) { [, $partial] = explode('?', $uri, 2); [$query, $fragment] = explode('#', $partial, 2) + [1 => null]; $components = self::URI_COMPONENTS; $components['query'] = $query; $components['fragment'] = $fragment; return $components; } //use RFC3986 URI regexp to split the URI preg_match(self::REGEXP_URI_PARTS, $uri, $parts); $parts += ['query' => '', 'fragment' => '']; if (':' === ($parts['scheme'] ?? null) || 1 !== preg_match(self::REGEXP_URI_SCHEME, $parts['scontent'] ?? '')) { throw new SyntaxError(sprintf('The uri `%s` contains an invalid scheme', $uri)); } if ('' === ($parts['scheme'] ?? '').($parts['authority'] ?? '') && 1 === preg_match(self::REGEXP_INVALID_PATH, $parts['path'] ?? '')) { throw new SyntaxError(sprintf('The uri `%s` contains an invalid path.', $uri)); } /** @var ComponentMap $components */ $components = array_merge( self::URI_COMPONENTS, '' === ($parts['authority'] ?? null) ? [] : self::parseAuthority($parts['acontent'] ?? null), [ 'path' => $parts['path'] ?? '', 'scheme' => '' === ($parts['scheme'] ?? null) ? null : ($parts['scontent'] ?? null), 'query' => '' === $parts['query'] ? null : ($parts['qcontent'] ?? null), 'fragment' => '' === $parts['fragment'] ? null : ($parts['fcontent'] ?? null), ] ); return $components; } /** * Assert the URI internal state is valid. * * @link https://tools.ietf.org/html/rfc3986#section-3 * @link https://tools.ietf.org/html/rfc3986#section-3.3 * * @throws SyntaxError */ private static function validateComponents(?string $scheme, ?string $authority, ?string $path): void { if (null !== $authority) { if (null !== $path && '' !== $path && '/' !== $path[0]) { throw new SyntaxError('If an authority is present the path must be empty or start with a `/`.'); } return; } if (null === $path || '' === $path) { return; } if (str_starts_with($path, '//')) { throw new SyntaxError('If there is no authority the path `'.$path.'` cannot start with a `//`.'); } if (null !== $scheme || false === ($pos = strpos($path, ':'))) { return; } if (!str_contains(substr($path, 0, $pos), '/')) { throw new SyntaxError('In absence of a scheme and an authority the first path segment cannot contain a colon (":") character.'); } } /** * Parses the URI authority part. * * @link https://tools.ietf.org/html/rfc3986#section-3.2 * * @throws SyntaxError If the port component is invalid * * @return AuthorityMap */ public static function parseAuthority(BackedEnum|Stringable|string|null $authority): array { $components = ['user' => null, 'pass' => null, 'host' => null, 'port' => null]; if (null === $authority) { return $components; } if ($authority instanceof BackedEnum) { $authority = $authority->value; } $authority = (string) $authority; $components['host'] = ''; if ('' === $authority) { return $components; } $parts = explode('@', $authority, 2); if (isset($parts[1])) { [$components['user'], $components['pass']] = explode(':', $parts[0], 2) + [1 => null]; } preg_match(self::REGEXP_HOST_PORT, $parts[1] ?? $parts[0], $matches); $matches += ['port' => '']; $components['port'] = self::filterPort($matches['port']); $components['host'] = self::filterHost($matches['host'] ?? ''); return $components; } /** * Filter and format the port component. * * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 * * @throws SyntaxError if the registered name is invalid */ private static function filterPort(string $port): ?int { return match (true) { '' === $port => null, 1 === preg_match('/^\d*$/', $port) => (int) $port, default => throw new SyntaxError(sprintf('The port `%s` is invalid', $port)), }; } /** * Returns whether a hostname is valid. * * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 * * @throws SyntaxError if the registered name is invalid */ private static function filterHost(Stringable|string|null $host): ?string { try { return HostRecord::from($host)->value; } catch (Throwable) { throw new SyntaxError(sprintf('Host `%s` is invalid : the IP host is malformed', $host)); } } /** * Tells whether the scheme component is valid. */ public static function isValidScheme(BackedEnum|Stringable|string|null $scheme): bool { if ($scheme instanceof BackedEnum) { $scheme = $scheme->value; } return null === $scheme || 1 === preg_match('/^[A-Za-z]([-A-Za-z\d+.]+)?$/', (string) $scheme); } private static function normalizeHost(BackedEnum|Stringable|string|null $host): ?string { if ($host instanceof BackedEnum) { $host = $host->value; } if (null !== $host) { $host = (string) $host; } if (null === $host || false !== filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { return $host; } $host = (string) Encoder::normalizeHost($host); static $isSupported = null; $isSupported ??= (function_exists('\idn_to_ascii') && defined('\INTL_IDNA_VARIANT_UTS46')); if (! $isSupported) { return $host; } $idnaHost = IdnaConverter::toAscii($host); if (!$idnaHost->hasErrors()) { return $idnaHost->domain(); } return $host; } /** * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.6.0 * @codeCoverageIgnore * @see HostRecoord::validate() * * Create a new instance from the environment. */ #[Deprecated(message:'use League\Uri\HostRecord::validate() instead', since:'league/uri:7.6.0')] public static function isValidHost(Stringable|string|null $host): bool { return HostRecord::isValid($host); } } PKCA#]`"��0C0C=system/helixultimate/vendor/league/uri-interfaces/Encoder.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use BackedEnum; use Closure; use Deprecated; use League\Uri\Exceptions\SyntaxError; use League\Uri\IPv6\Converter as IPv6Converter; use SensitiveParameter; use Stringable; use Throwable; use function explode; use function filter_var; use function gettype; use function in_array; use function preg_match; use function preg_replace_callback; use function rawurldecode; use function rawurlencode; use function sprintf; use function str_starts_with; use function strtolower; use function strtoupper; use const FILTER_FLAG_IPV4; use const FILTER_VALIDATE_IP; final class Encoder { private const REGEXP_CHARS_INVALID = '/[\x00-\x1f\x7f]/'; private const REGEXP_CHARS_ENCODED = ',%[A-Fa-f0-9]{2},'; private const REGEXP_CHARS_PREVENTS_DECODING = ',% 2[A-F|1-2|4-9]| 3[0-9|B|D]| 4[1-9|A-F]| 5[0-9|A|F]| 6[1-9|A-F]| 7[0-9|E] ,ix'; private const REGEXP_PART_SUBDELIM = "\!\$&'\(\)\*\+,;\=%"; private const REGEXP_PART_UNRESERVED = 'A-Za-z\d_\-.~'; private const REGEXP_PART_ENCODED = '%(?![A-Fa-f\d]{2})'; /** * Unreserved characters. * * @see https://www.rfc-editor.org/rfc/rfc3986.html#section-2.3 */ private const REGEXP_UNRESERVED_CHARACTERS = ',%(2[DdEe]|3[0-9]|4[1-9A-Fa-f]|5[AaFf]|6[1-9A-Fa-f]|7[0-9A-Ea-e]),'; /** * Tell whether the user component is correctly encoded. */ public static function isUserEncoded(BackedEnum|Stringable|string|null $encoded): bool { static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.']+|'.self::REGEXP_PART_ENCODED.'/'; if ($encoded instanceof BackedEnum) { $encoded = $encoded->value; } return null === $encoded || 1 !== preg_match($pattern, (string) $encoded); } /** * Encode User. * * All generic delimiters MUST be encoded */ public static function encodeUser(BackedEnum|Stringable|string|null $user): ?string { static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.']+|'.self::REGEXP_PART_ENCODED.'/'; return self::encode($user, $pattern); } /** * Normalize user component. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986. */ public static function normalizeUser(BackedEnum|Stringable|string|null $user): ?string { return self::normalize(self::encodeUser(self::decodeUnreservedCharacters($user))); } private static function normalize(?string $component): ?string { if (null === $component) { return null; } return (string) preg_replace_callback( '/%[0-9a-f]{2}/i', static fn (array $found) => strtoupper($found[0]), $component ); } /** * Tell whether the password component is correctly encoded. */ public static function isPasswordEncoded(#[SensitiveParameter] BackedEnum|Stringable|string|null $encoded): bool { static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.':]+|'.self::REGEXP_PART_ENCODED.'/'; if ($encoded instanceof BackedEnum) { $encoded = $encoded->value; } return null === $encoded || 1 !== preg_match($pattern, (string) $encoded); } /** * Encode Password. * * Generic delimiters ":" MUST NOT be encoded */ public static function encodePassword(#[SensitiveParameter] BackedEnum|Stringable|string|null $component): ?string { static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.':]+|'.self::REGEXP_PART_ENCODED.'/'; return self::encode($component, $pattern); } /** * Normalize password component. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986. */ public static function normalizePassword(#[SensitiveParameter] BackedEnum|Stringable|string|null $password): ?string { return self::normalize(self::encodePassword(self::decodeUnreservedCharacters($password))); } /** * Tell whether the userInfo component is correctly encoded. */ public static function isUserInfoEncoded(#[SensitiveParameter] BackedEnum|Stringable|string|null $userInfo): bool { if (null === $userInfo) { return true; } if ($userInfo instanceof BackedEnum) { $userInfo = $userInfo->value; } [$user, $password] = explode(':', (string) $userInfo, 2) + [1 => null]; return self::isUserEncoded($user) && self::isPasswordEncoded($password); } public static function encodeUserInfo(#[SensitiveParameter] BackedEnum|Stringable|string|null $userInfo): ?string { if (null === $userInfo) { return null; } if ($userInfo instanceof BackedEnum) { $userInfo = $userInfo->value; } [$user, $password] = explode(':', (string) $userInfo, 2) + [1 => null]; $userInfo = self::encodeUser($user); if (null === $password) { return $userInfo; } return $userInfo.':'.self::encodePassword($password); } public static function normalizeUserInfo(#[SensitiveParameter] BackedEnum|Stringable|string|null $userInfo): ?string { if (null === $userInfo) { return null; } if ($userInfo instanceof BackedEnum) { $userInfo = $userInfo->value; } [$user, $password] = explode(':', (string) $userInfo, 2) + [1 => null]; $userInfo = self::normalizeUser($user); if (null === $password) { return $userInfo; } return $userInfo.':'.self::normalizePassword($password); } /** * Decodes all the URI component characters. */ public static function decodeAll(BackedEnum|Stringable|string|null $component): ?string { return self::decode($component, static fn (array $matches): string => rawurldecode($matches[0])); } /** * Decodes the URI component without decoding the unreserved characters which are already encoded. */ public static function decodeNecessary(BackedEnum|Stringable|string|int|null $component): ?string { $decoder = static function (array $matches): string { if (1 === preg_match(self::REGEXP_CHARS_PREVENTS_DECODING, $matches[0])) { return strtoupper($matches[0]); } return rawurldecode($matches[0]); }; return self::decode($component, $decoder); } /** * Decodes the component unreserved characters. */ public static function decodeUnreservedCharacters(BackedEnum|Stringable|string|null $str): ?string { if ($str instanceof BackedEnum) { $str = $str->value; } if (null === $str) { return null; } return preg_replace_callback( self::REGEXP_UNRESERVED_CHARACTERS, static fn (array $matches): string => rawurldecode($matches[0]), (string) $str ); } /** * Tell whether the path component is correctly encoded. */ public static function isPathEncoded(BackedEnum|Stringable|string|null $encoded): bool { static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.':@\/]+|'.self::REGEXP_PART_ENCODED.'/'; if ($encoded instanceof BackedEnum) { $encoded = $encoded->value; } return null === $encoded || 1 !== preg_match($pattern, (string) $encoded); } /** * Encode Path. * * Generic delimiters ":", "@", and "/" MUST NOT be encoded */ public static function encodePath(BackedEnum|Stringable|string|null $component): string { static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.':@\/]+|'.self::REGEXP_PART_ENCODED.'/'; return (string) self::encode($component, $pattern); } /** * Decodes the path component while preserving characters that should not be decoded in the context of a full valid URI. */ public static function decodePath(BackedEnum|Stringable|string|null $path): ?string { $decoder = static function (array $matches): string { $encodedChar = strtoupper($matches[0]); return in_array($encodedChar, ['%2F', '%20', '%3F', '%23'], true) ? $encodedChar : rawurldecode($encodedChar); }; return self::decode($path, $decoder); } /** * Normalize path component. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986. */ public static function normalizePath(BackedEnum|Stringable|string|null $component): ?string { return self::normalize(self::encodePath(self::decodePath($component))); } /** * Tell whether the query component is correctly encoded. */ public static function isQueryEncoded(BackedEnum|Stringable|string|null $encoded): bool { static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.'\/?%]+|'.self::REGEXP_PART_ENCODED.'/'; if ($encoded instanceof BackedEnum) { $encoded = $encoded->value; } return null === $encoded || 1 !== preg_match($pattern, (string) $encoded); } /** * Decodes the query component while preserving characters that should not be decoded in the context of a full valid URI. */ public static function decodeQuery(BackedEnum|Stringable|string|null $path): ?string { $decoder = static function (array $matches): string { $encodedChar = strtoupper($matches[0]); return in_array($encodedChar, ['%26', '%3D', '%20', '%23', '%3F'], true) ? $encodedChar : rawurldecode($encodedChar); }; return self::decode($path, $decoder); } /** * Normalize the query component. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986. */ public static function normalizeQuery(BackedEnum|Stringable|string|null $query): ?string { return self::normalize(self::encodeQueryOrFragment(self::decodeQuery($query))); } /** * Tell whether the query component is correctly encoded. */ public static function isFragmentEncoded(BackedEnum|Stringable|string|null $encoded): bool { static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.':@\/?%]|'.self::REGEXP_PART_ENCODED.'/'; if ($encoded instanceof BackedEnum) { $encoded = $encoded->value; } return null === $encoded || 1 !== preg_match($pattern, (string) $encoded); } /** * Decodes the fragment component while preserving characters that should not be decoded in the context of a full valid URI. */ public static function decodeFragment(BackedEnum|Stringable|string|null $path): ?string { return self::decode($path, static fn (array $matches): string => '%20' === $matches[0] ? $matches[0] : rawurldecode($matches[0])); } /** * Normalize the fragment component. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986. */ public static function normalizeFragment(BackedEnum|Stringable|string|null $fragment): ?string { return self::normalize(self::encodeQueryOrFragment(self::decodeFragment($fragment))); } /** * Normalize the host component. * * @see https://www.rfc-editor.org/rfc/rfc3986.html#section-3.2.2 * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986. */ public static function normalizeHost(BackedEnum|Stringable|string|null $host): ?string { if ($host instanceof BackedEnum) { $host = (string) $host->value; } if ($host instanceof Stringable) { $host = (string) $host; } if (null === $host || '' === $host || false !== filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { return $host; } if (str_starts_with($host, '[')) { return IPv6Converter::normalize($host); } $host = strtolower($host); return (!str_contains($host, '%')) ? $host : preg_replace_callback( '/%[a-f0-9]{2}/', fn (array $matches) => 1 === preg_match('/%([0-7][0-9a-f])/', $matches[0]) ? rawurldecode($matches[0]) : strtoupper($matches[0]), $host ); } /** * Encode Query or Fragment. * * Generic delimiters ":", "@", "?", and "/" MUST NOT be encoded */ public static function encodeQueryOrFragment(BackedEnum|Stringable|string|null $component): ?string { static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.':@\/?]+|'.self::REGEXP_PART_ENCODED.'/'; return self::encode($component, $pattern); } public static function encodeQueryKeyValue(mixed $component): ?string { static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.']+|'.self::REGEXP_PART_ENCODED.'/'; $encoder = static fn (array $found): string => 1 === preg_match('/[^'.self::REGEXP_PART_UNRESERVED.']/', rawurldecode($found[0])) ? rawurlencode($found[0]) : $found[0]; $filteredComponent = self::filterComponent($component); return match (true) { null === $filteredComponent => throw new SyntaxError(sprintf('A pair key/value must be a scalar value `%s` given.', gettype($component))), 1 === preg_match(self::REGEXP_CHARS_INVALID, $filteredComponent) => rawurlencode($filteredComponent), default => (string) preg_replace_callback($pattern, $encoder, $filteredComponent), }; } private static function filterComponent(mixed $component): ?string { try { return StringCoercionMode::Native->coerce($component); } catch (Throwable $exception) { throw new SyntaxError( sprintf('The component must be a scalar value `%s` given.', gettype($component)), previous: $exception ); } } /** * Encodes the URI component characters using a regular expression to find which characters need encoding. */ private static function encode(BackedEnum|Stringable|string|int|bool|null $component, string $pattern): ?string { $component = self::filterComponent($component); if (null === $component || '' === $component) { return $component; } return (string) preg_replace_callback( $pattern, static fn (array $found): string => 1 === preg_match('/[^'.self::REGEXP_PART_UNRESERVED.']/', rawurldecode($found[0])) ? rawurlencode($found[0]) : $found[0], $component ); } /** * Decodes the URI component characters using a closure. */ private static function decode(BackedEnum|Stringable|string|int|null $component, Closure $decoder): ?string { $component = self::filterComponent($component); if (null === $component || '' === $component) { return $component; } if (1 === preg_match(self::REGEXP_CHARS_INVALID, $component)) { throw new SyntaxError('Invalid component string: '.$component.'.'); } if (1 === preg_match(self::REGEXP_CHARS_ENCODED, $component)) { return (string) preg_replace_callback(self::REGEXP_CHARS_ENCODED, $decoder, $component); } return $component; } /** * Decodes the URI component without decoding the unreserved characters which are already encoded. * * DEPRECATION WARNING! This method will be removed in the next major point release. * * @deprecated Since version 7.6.0 * @codeCoverageIgnore * @see Encoder::decodeNecessary() * * Create a new instance from the environment. */ #[Deprecated(message:'use League\Uri\Encoder::decodeNecessary() instead', since:'league/uri:7.6.0')] public static function decodePartial(BackedEnum|Stringable|string|int|null $component): ?string { return self::decodeNecessary($component); } } PKCA#]D|���Asystem/helixultimate/vendor/league/uri-interfaces/Idna/Result.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Idna; /** * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html */ final class Result { private function __construct( private readonly string $domain, private readonly bool $isTransitionalDifferent, /** @var array<Error> */ private readonly array $errors ) { } /** * @param array{result:string, isTransitionalDifferent:bool, errors:int} $infos */ public static function fromIntl(array $infos): self { return new self($infos['result'], $infos['isTransitionalDifferent'], Error::filterByErrorBytes($infos['errors'])); } public function domain(): string { return $this->domain; } public function isTransitionalDifferent(): bool { return $this->isTransitionalDifferent; } /** * @return array<Error> */ public function errors(): array { return $this->errors; } public function hasErrors(): bool { return [] !== $this->errors; } public function hasError(Error $error): bool { return in_array($error, $this->errors, true); } } PKCA#]?�L`((@system/helixultimate/vendor/league/uri-interfaces/Idna/Error.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace League\Uri\Idna; enum Error: int { case NONE = 0; case EMPTY_LABEL = 1; case LABEL_TOO_LONG = 2; case DOMAIN_NAME_TOO_LONG = 4; case LEADING_HYPHEN = 8; case TRAILING_HYPHEN = 0x10; case HYPHEN_3_4 = 0x20; case LEADING_COMBINING_MARK = 0x40; case DISALLOWED = 0x80; case PUNYCODE = 0x100; case LABEL_HAS_DOT = 0x200; case INVALID_ACE_LABEL = 0x400; case BIDI = 0x800; case CONTEXTJ = 0x1000; case CONTEXTO_PUNCTUATION = 0x2000; case CONTEXTO_DIGITS = 0x4000; public function description(): string { return match ($this) { self::NONE => 'No error has occurred', self::EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', self::LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', self::DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', self::LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', self::TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', self::HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', self::LEADING_COMBINING_MARK => 'a label starts with a combining mark', self::DISALLOWED => 'a label or domain name contains disallowed characters', self::PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', self::LABEL_HAS_DOT => 'a label contains a dot=full stop', self::INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', self::BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', self::CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', self::CONTEXTO_DIGITS => 'a label does not meet the IDNA CONTEXTO requirements for digits', self::CONTEXTO_PUNCTUATION => 'a label does not meet the IDNA CONTEXTO requirements for punctuation characters. Some punctuation characters "Would otherwise have been DISALLOWED" but are allowed in certain contexts', }; } public static function filterByErrorBytes(int $errors): array { return array_values( array_filter( self::cases(), fn (self $error): bool => 0 !== ($error->value & $errors) ) ); } } PKCA#]��1.��Asystem/helixultimate/vendor/league/uri-interfaces/Idna/Option.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Idna; use ReflectionClass; use ReflectionClassConstant; /** * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html */ final class Option { private const DEFAULT = 0; private const ALLOW_UNASSIGNED = 1; private const USE_STD3_RULES = 2; private const CHECK_BIDI = 4; private const CHECK_CONTEXTJ = 8; private const NONTRANSITIONAL_TO_ASCII = 0x10; private const NONTRANSITIONAL_TO_UNICODE = 0x20; private const CHECK_CONTEXTO = 0x40; private function __construct(private readonly int $value) { } private static function cases(): array { static $assoc; if (null === $assoc) { $assoc = []; $fooClass = new ReflectionClass(self::class); foreach ($fooClass->getConstants(ReflectionClassConstant::IS_PRIVATE) as $name => $value) { $assoc[$name] = $value; } } return $assoc; } public static function new(int $bytes = self::DEFAULT): self { return new self(array_reduce( self::cases(), fn (int $value, int $option) => 0 !== ($option & $bytes) ? ($value | $option) : $value, self::DEFAULT )); } public static function forIDNA2008Ascii(): self { return self::new() ->nonTransitionalToAscii() ->checkBidi() ->useSTD3Rules() ->checkContextJ(); } public static function forIDNA2008Unicode(): self { return self::new() ->nonTransitionalToUnicode() ->checkBidi() ->useSTD3Rules() ->checkContextJ(); } public function toBytes(): int { return $this->value; } /** array<string, int> */ public function list(): array { return array_keys(array_filter( self::cases(), fn (int $value) => 0 !== ($value & $this->value) )); } public function allowUnassigned(): self { return $this->add(self::ALLOW_UNASSIGNED); } public function disallowUnassigned(): self { return $this->remove(self::ALLOW_UNASSIGNED); } public function useSTD3Rules(): self { return $this->add(self::USE_STD3_RULES); } public function prohibitSTD3Rules(): self { return $this->remove(self::USE_STD3_RULES); } public function checkBidi(): self { return $this->add(self::CHECK_BIDI); } public function ignoreBidi(): self { return $this->remove(self::CHECK_BIDI); } public function checkContextJ(): self { return $this->add(self::CHECK_CONTEXTJ); } public function ignoreContextJ(): self { return $this->remove(self::CHECK_CONTEXTJ); } public function checkContextO(): self { return $this->add(self::CHECK_CONTEXTO); } public function ignoreContextO(): self { return $this->remove(self::CHECK_CONTEXTO); } public function nonTransitionalToAscii(): self { return $this->add(self::NONTRANSITIONAL_TO_ASCII); } public function transitionalToAscii(): self { return $this->remove(self::NONTRANSITIONAL_TO_ASCII); } public function nonTransitionalToUnicode(): self { return $this->add(self::NONTRANSITIONAL_TO_UNICODE); } public function transitionalToUnicode(): self { return $this->remove(self::NONTRANSITIONAL_TO_UNICODE); } public function add(Option|int|null $option = null): self { return match (true) { null === $option => $this, $option instanceof self => self::new($this->value | $option->value), default => self::new($this->value | $option), }; } public function remove(Option|int|null $option = null): self { return match (true) { null === $option => $this, $option instanceof self => self::new($this->value & ~$option->value), default => self::new($this->value & ~$option), }; } } PKCA#]����yyDsystem/helixultimate/vendor/league/uri-interfaces/Idna/Converter.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Idna; use BackedEnum; use League\Uri\Exceptions\ConversionFailed; use League\Uri\Exceptions\SyntaxError; use League\Uri\FeatureDetection; use Stringable; use function idn_to_ascii; use function idn_to_utf8; use function rawurldecode; use function strtolower; use const INTL_IDNA_VARIANT_UTS46; /** * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html */ final class Converter { private const REGEXP_IDNA_PATTERN = '/[^\x20-\x7f]/'; private const MAX_DOMAIN_LENGTH = 253; private const MAX_LABEL_LENGTH = 63; /** * General registered name regular expression. * * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 * @see https://regex101.com/r/fptU8V/1 */ private const REGEXP_REGISTERED_NAME = '/ (?(DEFINE) (?<unreserved>[a-z0-9_~\-]) # . is missing as it is used to separate labels (?<sub_delims>[!$&\'()*+,;=]) (?<encoded>%[A-F0-9]{2}) (?<reg_name>(?:(?&unreserved)|(?&sub_delims)|(?&encoded))*) ) ^(?:(?®_name)\.)*(?®_name)\.?$ /ix'; /** * Converts the input to its IDNA ASCII form or throw on failure. * * @see Converter::toAscii() * * @throws SyntaxError if the string cannot be converted to UNICODE using IDN UTS46 algorithm * @throws ConversionFailed if the conversion returns error */ public static function toAsciiOrFail(BackedEnum|Stringable|string $domain, Option|int|null $options = null): string { $result = self::toAscii($domain, $options); return match (true) { $result->hasErrors() => throw ConversionFailed::dueToIdnError($domain, $result), default => $result->domain(), }; } /** * Converts the input to its IDNA ASCII form. * * This method returns the string converted to IDN ASCII form * * @throws SyntaxError if the string cannot be converted to ASCII using IDN UTS46 algorithm */ public static function toAscii(BackedEnum|Stringable|string $domain, Option|int|null $options = null): Result { if ($domain instanceof BackedEnum) { $domain = $domain->value; } $domain = rawurldecode((string) $domain); if (1 === preg_match(self::REGEXP_IDNA_PATTERN, $domain)) { FeatureDetection::supportsIdn(); $flags = match (true) { null === $options => Option::forIDNA2008Ascii(), $options instanceof Option => $options, default => Option::new($options), }; idn_to_ascii($domain, $flags->toBytes(), INTL_IDNA_VARIANT_UTS46, $idnaInfo); if ([] === $idnaInfo) { return Result::fromIntl([ 'result' => strtolower($domain), 'isTransitionalDifferent' => false, 'errors' => self::validateDomainAndLabelLength($domain), ]); } return Result::fromIntl($idnaInfo); } $error = Error::NONE->value; if (1 !== preg_match(self::REGEXP_REGISTERED_NAME, $domain)) { $error |= Error::DISALLOWED->value; } return Result::fromIntl([ 'result' => strtolower($domain), 'isTransitionalDifferent' => false, 'errors' => self::validateDomainAndLabelLength($domain) | $error, ]); } /** * Converts the input to its IDNA UNICODE form or throw on failure. * * @see Converter::toUnicode() * * @throws ConversionFailed if the conversion returns error */ public static function toUnicodeOrFail(BackedEnum|Stringable|string $domain, Option|int|null $options = null): string { $result = self::toUnicode($domain, $options); return match (true) { $result->hasErrors() => throw ConversionFailed::dueToIdnError($domain, $result), default => $result->domain(), }; } /** * Converts the input to its IDNA UNICODE form. * * This method returns the string converted to IDN UNICODE form * * @throws SyntaxError if the string cannot be converted to UNICODE using IDN UTS46 algorithm */ public static function toUnicode(BackedEnum|Stringable|string $domain, Option|int|null $options = null): Result { if ($domain instanceof BackedEnum) { $domain = $domain->value; } $domain = rawurldecode((string) $domain); if (false === stripos($domain, 'xn--')) { return Result::fromIntl(['result' => strtolower($domain), 'isTransitionalDifferent' => false, 'errors' => Error::NONE->value]); } FeatureDetection::supportsIdn(); $flags = match (true) { null === $options => Option::forIDNA2008Unicode(), $options instanceof Option => $options, default => Option::new($options), }; idn_to_utf8($domain, $flags->toBytes(), INTL_IDNA_VARIANT_UTS46, $idnaInfo); if ([] === $idnaInfo) { return Result::fromIntl(['result' => strtolower($domain), 'isTransitionalDifferent' => false, 'errors' => Error::NONE->value]); } return Result::fromIntl($idnaInfo); } /** * Tells whether the submitted host is a valid IDN regardless of its format. * * Returns false if the host is invalid or if its conversion yields the same result */ public static function isIdn(BackedEnum|Stringable|string|null $domain): bool { if ($domain instanceof BackedEnum) { $domain = $domain->value; } $domain = strtolower(rawurldecode((string) $domain)); $result = match (1) { preg_match(self::REGEXP_IDNA_PATTERN, $domain) => self::toAscii($domain), default => self::toUnicode($domain), }; return match (true) { $result->hasErrors() => false, default => $result->domain() !== $domain, }; } /** * Adapted from https://github.com/TRowbotham/idna. * * @see https://github.com/TRowbotham/idna/blob/master/src/Idna.php#L236 */ private static function validateDomainAndLabelLength(string $domain): int { $error = Error::NONE->value; $labels = explode('.', $domain); $maxDomainSize = self::MAX_DOMAIN_LENGTH; $length = count($labels); // If the last label is empty, and it is not the first label, then it is the root label. // Increase the max size by 1, making it 254, to account for the root label's "." // delimiter. This also means we don't need to check the last label's length for being too // long. if ($length > 1 && '' === $labels[$length - 1]) { ++$maxDomainSize; array_pop($labels); } if (strlen($domain) > $maxDomainSize) { $error |= Error::DOMAIN_NAME_TOO_LONG->value; } foreach ($labels as $label) { if (strlen($label) > self::MAX_LABEL_LENGTH) { $error |= Error::LABEL_TOO_LONG->value; break; } } return $error; } } PKCA#]�kwwGsystem/helixultimate/vendor/league/uri-interfaces/UriComparisonMode.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; enum UriComparisonMode { case IncludeFragment; case ExcludeFragment; } PKCA#]�dMHC6C6@system/helixultimate/vendor/league/uri-interfaces/HostRecord.phpnu�[���<?php /** * League.Uri (https://uri.thephpleague.com) * * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use BackedEnum; use Exception; use JsonSerializable; use League\Uri\Contracts\UriComponentInterface; use League\Uri\Exceptions\SyntaxError; use League\Uri\Idna\Converter as IdnConverter; use Stringable; use Throwable; use function array_key_first; use function count; use function explode; use function filter_var; use function get_object_vars; use function in_array; use function inet_pton; use function is_object; use function preg_match; use function rawurldecode; use function strpos; use function strtolower; use function substr; use const FILTER_FLAG_IPV4; use const FILTER_FLAG_IPV6; use const FILTER_VALIDATE_IP; /** * @phpstan-type HostRecordSerializedShape array{0: array{host: ?string}, 1: array{}} */ final class HostRecord implements JsonSerializable { /** * Maximum number of host cached. * * @var int */ private const MAXIMUM_HOST_CACHED = 100; private const REGEXP_NON_ASCII_PATTERN = '/[^\x20-\x7f]/'; /** * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 * * invalid characters in host regular expression */ private const REGEXP_INVALID_HOST_CHARS = '/ [:\/?#\[\]@ ] # gen-delims characters as well as the space character /ix'; /** * General registered name regular expression. * * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 * @see https://regex101.com/r/fptU8V/1 */ private const REGEXP_REGISTERED_NAME = '/ (?(DEFINE) (?<unreserved>[a-z0-9_~\-]) # . is missing as it is used to separate labels (?<sub_delims>[!$&\'()*+,;=]) (?<encoded>%[A-F0-9]{2}) (?<reg_name>(?:(?&unreserved)|(?&sub_delims)|(?&encoded))*) ) ^(?:(?®_name)\.)*(?®_name)\.?$ /ix'; /** * Domain name regular expression. * * Everything but the domain name length is validated * * @see https://tools.ietf.org/html/rfc1034#section-3.5 * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://regex101.com/r/71j6rt/1 */ private const REGEXP_DOMAIN_NAME = '/ (?(DEFINE) (?<let_dig> [a-z0-9]) # alpha digit (?<let_dig_hyp> [a-z0-9-]) # alpha digit and hyphen (?<ldh_str> (?&let_dig_hyp){0,61}(?&let_dig)) # domain label end (?<label> (?&let_dig)((?&ldh_str))?) # domain label (?<domain> (?&label)(\.(?&label)){0,126}\.?) # domain name ) ^(?&domain)$ /ix'; /** * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 * * IPvFuture regular expression */ private const REGEXP_IP_FUTURE = '/^ v(?<version>[A-F\d])+\. (?: (?<unreserved>[a-z\d_~\-\.])| (?<sub_delims>[!$&\'()*+,;=:]) # also include the : character )+ $/ix'; private const REGEXP_GEN_DELIMS = '/[:\/?#\[\]@ ]/'; private const ADDRESS_BLOCK = "\xfe\x80"; private ?bool $isDomainName = null; private ?bool $hasZoneIdentifier = null; private bool $asciiIsLoaded = false; private ?string $hostAsAscii = null; private bool $unicodeIsLoaded = false; private ?string $hostAsUnicode = null; private bool $isIpVersionLoaded = false; private ?string $ipVersion = null; private bool $isIpValueLoaded = false; private ?string $ipValue = null; private function __construct( public readonly ?string $value, public readonly HostType $type, public readonly HostFormat $format ) { } public function hasZoneIdentifier(): bool { return $this->hasZoneIdentifier ??= HostType::Ipv6 === $this->type && str_contains((string) $this->value, '%'); } public function toAscii(): ?string { if (!$this->asciiIsLoaded) { $this->asciiIsLoaded = true; $this->hostAsAscii = (function (): ?string { if (HostType::RegisteredName !== $this->type || null === $this->value) { return $this->value; } $formattedHost = rawurldecode($this->value); if ($formattedHost === $this->value) { return $this->isDomainType() ? IdnConverter::toAscii($this->value)->domain() : strtolower($formattedHost); } return Encoder::normalizeHost($this->value); })(); } return $this->hostAsAscii; } public function toUnicode(): ?string { if (!$this->unicodeIsLoaded) { $this->unicodeIsLoaded = true; $this->hostAsUnicode = $this->isDomainType() && null !== $this->value ? IdnConverter::toUnicode($this->value)->domain() : $this->value; } return $this->hostAsUnicode; } public function isDomainType(): bool { return $this->isDomainName ??= match (true) { HostType::RegisteredName !== $this->type, '' === $this->value => false, null === $this->value => true, default => is_object($result = IdnConverter::toAscii($this->value)) && !$result->hasErrors() && self::isValidDomain($result->domain()), }; } public function ipVersion(): ?string { if (!$this->isIpVersionLoaded) { $this->isIpVersionLoaded = true; $this->ipVersion = match (true) { HostType::Ipv4 === $this->type => '4', HostType::Ipv6 === $this->type => '6', 1 === preg_match(self::REGEXP_IP_FUTURE, substr((string) $this->value, 1, -1), $matches) => $matches['version'], default => null, }; } return $this->ipVersion; } public function ipValue(): ?string { if (!$this->isIpValueLoaded) { $this->isIpValueLoaded = true; $this->ipValue = (function (): ?string { if (HostType::RegisteredName === $this->type) { return null; } if (HostType::Ipv4 === $this->type) { return $this->value; } $ip = substr((string) $this->value, 1, -1); if (HostType::Ipv6 !== $this->type) { return substr($ip, (int) strpos($ip, '.') + 1); } $pos = strpos($ip, '%'); if (false === $pos) { return $ip; } return substr($ip, 0, $pos).'%'.rawurldecode(substr($ip, $pos + 3)); })(); } return $this->ipValue; } public static function isValid(BackedEnum|Stringable|string|null $host): bool { try { HostRecord::from($host); return true; } catch (Throwable) { return false; } } public static function isIpv4(Stringable|string|null $host): bool { try { return HostType::Ipv4 === HostRecord::from($host)->type; } catch (Throwable) { return false; } } public static function isIpv6(Stringable|string|null $host): bool { try { return HostType::Ipv6 === HostRecord::from($host)->type; } catch (Throwable) { return false; } } public static function isIpvFuture(Stringable|string|null $host): bool { try { return HostType::IpvFuture === HostRecord::from($host)->type; } catch (Throwable) { return false; } } public static function isIp(Stringable|string|null $host): bool { return self::isIpv4($host) || self::isIpv6($host) || self::isIpvFuture($host); } public static function isRegisteredName(Stringable|string|null $host): bool { try { return HostType::RegisteredName === HostRecord::from($host)->type; } catch (Throwable) { return false; } } public static function isDomain(Stringable|string|null $host): bool { try { return HostRecord::from($host)->isDomainType(); } catch (Throwable) { return false; } } /** * @throws SyntaxError */ public static function from(BackedEnum|Stringable|string|null $host): self { if ($host instanceof BackedEnum) { $host = $host->value; } if ($host instanceof UriComponentInterface) { $host = $host->value(); } if (null === $host) { return new self( value: null, type: HostType::RegisteredName, format: HostFormat::Ascii, ); } $host = (string) $host; if ('' === $host) { return new self( value: '', type: HostType::RegisteredName, format: HostFormat::Ascii, ); } static $inMemoryCache = []; if (isset($inMemoryCache[$host])) { return $inMemoryCache[$host]; } if (self::MAXIMUM_HOST_CACHED < count($inMemoryCache)) { unset($inMemoryCache[array_key_first($inMemoryCache)]); } if ($host === filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { return $inMemoryCache[$host] = new self( value: $host, type: HostType::Ipv4, format: HostFormat::Ascii, ); } if (str_starts_with($host, '[')) { str_ends_with($host, ']') || throw new SyntaxError('The host '.$host.' is not a valid IPv6 host.'); $ipHost = substr($host, 1, -1); if (1 === preg_match(self::REGEXP_IP_FUTURE, $ipHost, $matches)) { return !in_array($matches['version'], ['4', '6'], true) ? ($inMemoryCache[$host] = new self( value: $host, type: HostType::IpvFuture, format: HostFormat::Ascii, )) : throw new SyntaxError('The host '.$host.' is not a valid IPvFuture host.'); } if (self::isValidIpv6Hostname($ipHost)) { return $inMemoryCache[$host] = new self( value: $host, type: HostType::Ipv6, format: HostFormat::Ascii, ); } throw new SyntaxError('The host '.$host.' is not a valid IPv6 host.'); } $domainName = rawurldecode($host); $format = HostFormat::Unicode; if (1 !== preg_match(self::REGEXP_NON_ASCII_PATTERN, $domainName)) { $domainName = strtolower($domainName); $format = HostFormat::Ascii; } if (1 === preg_match(self::REGEXP_REGISTERED_NAME, $domainName)) { return $inMemoryCache[$host] = new self( value: $host, type: HostType::RegisteredName, format: $format, ); } (HostFormat::Ascii !== $format && 1 !== preg_match(self::REGEXP_INVALID_HOST_CHARS, $domainName)) || throw new SyntaxError('`'.$host.'` is an invalid domain name : the host contains invalid characters.'); IdnConverter::toAsciiOrFail($domainName); return $inMemoryCache[$host] = new self( value: $host, type: HostType::RegisteredName, format: $format, ); } /** * Tells whether the registered name is a valid domain name according to RFC1123. * * @see http://man7.org/linux/man-pages/man7/hostname.7.html * @see https://tools.ietf.org/html/rfc1123#section-2.1 */ private static function isValidDomain(string $hostname): bool { $domainMaxLength = str_ends_with($hostname, '.') ? 254 : 253; return !isset($hostname[$domainMaxLength]) && 1 === preg_match(self::REGEXP_DOMAIN_NAME, $hostname); } /** * Validates an Ipv6 as Host. * * @see http://tools.ietf.org/html/rfc6874#section-2 * @see http://tools.ietf.org/html/rfc6874#section-4 */ private static function isValidIpv6Hostname(string $host): bool { [$ipv6, $scope] = explode('%', $host, 2) + [1 => null]; if (null === $scope) { return (bool) filter_var($ipv6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); } $scope = rawurldecode('%'.$scope); return 1 !== preg_match(self::REGEXP_NON_ASCII_PATTERN, $scope) && 1 !== preg_match(self::REGEXP_GEN_DELIMS, $scope) && false !== filter_var($ipv6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) && str_starts_with((string)inet_pton((string)$ipv6), self::ADDRESS_BLOCK); } public function jsonSerialize(): ?string { return $this->value; } /** * @return HostRecordSerializedShape */ public function __serialize(): array { return [['host' => $this->value], []]; } /** * @param HostRecordSerializedShape $data * * @throws Exception|SyntaxError */ public function __unserialize(array $data): void { [$properties] = $data; $record = self::from($properties['host'] ?? throw new Exception('The `host` property is missing from the serialized object.')); //if the Host computed value are already cache this avoid recomputing them foreach (get_object_vars($record) as $prop => $value) { /* @phpstan-ignore-next-line */ $this->{$prop} = $value; } } } PKCA#]��O:system/helixultimate/vendor/psr/http-factory/composer.jsonnu�[���{ "name": "psr/http-factory", "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "psr", "psr-7", "psr-17", "http", "factory", "message", "request", "response" ], "license": "MIT", "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "support": { "source": "https://github.com/php-fig/http-factory" }, "require": { "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } } } PKCA#]Bj�hhQsystem/helixultimate/vendor/psr/http-factory/src/UploadedFileFactoryInterface.phpnu�[���<?php namespace Psr\Http\Message; interface UploadedFileFactoryInterface { /** * Create a new uploaded file. * * If a size is not provided it will be determined by checking the size of * the file. * * @see http://php.net/manual/features.file-upload.post-method.php * @see http://php.net/manual/features.file-upload.errors.php * * @param StreamInterface $stream Underlying stream representing the * uploaded file content. * @param int|null $size in bytes * @param int $error PHP file upload error * @param string|null $clientFilename Filename as provided by the client, if any. * @param string|null $clientMediaType Media type as provided by the client, if any. * * @return UploadedFileInterface * * @throws \InvalidArgumentException If the file resource is not readable. */ public function createUploadedFile( StreamInterface $stream, ?int $size = null, int $error = \UPLOAD_ERR_OK, ?string $clientFilename = null, ?string $clientMediaType = null ): UploadedFileInterface; } PKCA#]�yۜ��Ksystem/helixultimate/vendor/psr/http-factory/src/StreamFactoryInterface.phpnu�[���<?php namespace Psr\Http\Message; interface StreamFactoryInterface { /** * Create a new stream from a string. * * The stream SHOULD be created with a temporary resource. * * @param string $content String content with which to populate the stream. * * @return StreamInterface */ public function createStream(string $content = ''): StreamInterface; /** * Create a stream from an existing file. * * The file MUST be opened using the given mode, which may be any mode * supported by the `fopen` function. * * The `$filename` MAY be any string supported by `fopen()`. * * @param string $filename Filename or stream URI to use as basis of stream. * @param string $mode Mode with which to open the underlying filename/stream. * * @return StreamInterface * @throws \RuntimeException If the file cannot be opened. * @throws \InvalidArgumentException If the mode is invalid. */ public function createStreamFromFile(string $filename, string $mode = 'r'): StreamInterface; /** * Create a new stream from an existing resource. * * The stream MUST be readable and may be writable. * * @param resource $resource PHP resource to use as basis of stream. * * @return StreamInterface */ public function createStreamFromResource($resource): StreamInterface; } PKCA#]X��""Msystem/helixultimate/vendor/psr/http-factory/src/ResponseFactoryInterface.phpnu�[���<?php namespace Psr\Http\Message; interface ResponseFactoryInterface { /** * Create a new response. * * @param int $code HTTP status code; defaults to 200 * @param string $reasonPhrase Reason phrase to associate with status code * in generated response; if none is provided implementations MAY use * the defaults as suggested in the HTTP specification. * * @return ResponseInterface */ public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface; } PKCA#]BH�A��Rsystem/helixultimate/vendor/psr/http-factory/src/ServerRequestFactoryInterface.phpnu�[���<?php namespace Psr\Http\Message; interface ServerRequestFactoryInterface { /** * Create a new server request. * * Note that server-params are taken precisely as given - no parsing/processing * of the given values is performed, and, in particular, no attempt is made to * determine the HTTP method or URI, which must be provided explicitly. * * @param string $method The HTTP method associated with the request. * @param UriInterface|string $uri The URI associated with the request. If * the value is a string, the factory MUST create a UriInterface * instance based on it. * @param array $serverParams Array of SAPI parameters with which to seed * the generated request instance. * * @return ServerRequestInterface */ public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface; } PKCA#]rT�X��Lsystem/helixultimate/vendor/psr/http-factory/src/RequestFactoryInterface.phpnu�[���<?php namespace Psr\Http\Message; interface RequestFactoryInterface { /** * Create a new request. * * @param string $method The HTTP method associated with the request. * @param UriInterface|string $uri The URI associated with the request. If * the value is a string, the factory MUST create a UriInterface * instance based on it. * * @return RequestInterface */ public function createRequest(string $method, $uri): RequestInterface; } PKCA#]��DhEEHsystem/helixultimate/vendor/psr/http-factory/src/UriFactoryInterface.phpnu�[���<?php namespace Psr\Http\Message; interface UriFactoryInterface { /** * Create a new URI. * * @param string $uri * * @return UriInterface * * @throws \InvalidArgumentException If the given URI cannot be parsed. */ public function createUri(string $uri = ''): UriInterface; } PKCA#]�Lo$ss:system/helixultimate/vendor/psr/http-message/composer.jsonnu�[���{ "name": "psr/http-message", "description": "Common interface for HTTP messages", "keywords": ["psr", "psr-7", "http", "http-message", "request", "response"], "homepage": "https://github.com/php-fig/http-message", "license": "MIT", "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "require": { "php": "^7.2 || ^8.0" }, "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } } } PKCA#]?����Esystem/helixultimate/vendor/psr/http-message/src/MessageInterface.phpnu�[���<?php namespace Psr\Http\Message; /** * HTTP messages consist of requests from a client to a server and responses * from a server to a client. This interface defines the methods common to * each. * * Messages are considered immutable; all methods that might change state MUST * be implemented such that they retain the internal state of the current * message and return an instance that contains the changed state. * * @link http://www.ietf.org/rfc/rfc7230.txt * @link http://www.ietf.org/rfc/rfc7231.txt */ interface MessageInterface { /** * Retrieves the HTTP protocol version as a string. * * The string MUST contain only the HTTP version number (e.g., "1.1", "1.0"). * * @return string HTTP protocol version. */ public function getProtocolVersion(): string; /** * Return an instance with the specified HTTP protocol version. * * The version string MUST contain only the HTTP version number (e.g., * "1.1", "1.0"). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new protocol version. * * @param string $version HTTP protocol version * @return static */ public function withProtocolVersion(string $version): MessageInterface; /** * Retrieves all message header values. * * The keys represent the header name as it will be sent over the wire, and * each value is an array of strings associated with the header. * * // Represent the headers as a string * foreach ($message->getHeaders() as $name => $values) { * echo $name . ": " . implode(", ", $values); * } * * // Emit headers iteratively: * foreach ($message->getHeaders() as $name => $values) { * foreach ($values as $value) { * header(sprintf('%s: %s', $name, $value), false); * } * } * * While header names are not case-sensitive, getHeaders() will preserve the * exact case in which headers were originally specified. * * @return string[][] Returns an associative array of the message's headers. Each * key MUST be a header name, and each value MUST be an array of strings * for that header. */ public function getHeaders(): array; /** * Checks if a header exists by the given case-insensitive name. * * @param string $name Case-insensitive header field name. * @return bool Returns true if any header names match the given header * name using a case-insensitive string comparison. Returns false if * no matching header name is found in the message. */ public function hasHeader(string $name): bool; /** * Retrieves a message header value by the given case-insensitive name. * * This method returns an array of all the header values of the given * case-insensitive header name. * * If the header does not appear in the message, this method MUST return an * empty array. * * @param string $name Case-insensitive header field name. * @return string[] An array of string values as provided for the given * header. If the header does not appear in the message, this method MUST * return an empty array. */ public function getHeader(string $name): array; /** * Retrieves a comma-separated string of the values for a single header. * * This method returns all of the header values of the given * case-insensitive header name as a string concatenated together using * a comma. * * NOTE: Not all header values may be appropriately represented using * comma concatenation. For such headers, use getHeader() instead * and supply your own delimiter when concatenating. * * If the header does not appear in the message, this method MUST return * an empty string. * * @param string $name Case-insensitive header field name. * @return string A string of values as provided for the given header * concatenated together using a comma. If the header does not appear in * the message, this method MUST return an empty string. */ public function getHeaderLine(string $name): string; /** * Return an instance with the provided value replacing the specified header. * * While header names are case-insensitive, the casing of the header will * be preserved by this function, and returned from getHeaders(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new and/or updated header and value. * * @param string $name Case-insensitive header field name. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withHeader(string $name, $value): MessageInterface; /** * Return an instance with the specified header appended with the given value. * * Existing values for the specified header will be maintained. The new * value(s) will be appended to the existing list. If the header did not * exist previously, it will be added. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new header and/or value. * * @param string $name Case-insensitive header field name to add. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withAddedHeader(string $name, $value): MessageInterface; /** * Return an instance without the specified header. * * Header resolution MUST be done without case-sensitivity. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the named header. * * @param string $name Case-insensitive header field name to remove. * @return static */ public function withoutHeader(string $name): MessageInterface; /** * Gets the body of the message. * * @return StreamInterface Returns the body as a stream. */ public function getBody(): StreamInterface; /** * Return an instance with the specified message body. * * The body MUST be a StreamInterface object. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return a new instance that has the * new body stream. * * @param StreamInterface $body Body. * @return static * @throws \InvalidArgumentException When the body is not valid. */ public function withBody(StreamInterface $body): MessageInterface; } PKCA#]жJ���Dsystem/helixultimate/vendor/psr/http-message/src/StreamInterface.phpnu�[���<?php namespace Psr\Http\Message; /** * Describes a data stream. * * Typically, an instance will wrap a PHP stream; this interface provides * a wrapper around the most common operations, including serialization of * the entire stream to a string. */ interface StreamInterface { /** * Reads all data from the stream into a string, from the beginning to end. * * This method MUST attempt to seek to the beginning of the stream before * reading data and read the stream until the end is reached. * * Warning: This could attempt to load a large amount of data into memory. * * This method MUST NOT raise an exception in order to conform with PHP's * string casting operations. * * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring * @return string */ public function __toString(): string; /** * Closes the stream and any underlying resources. * * @return void */ public function close(): void; /** * Separates any underlying resources from the stream. * * After the stream has been detached, the stream is in an unusable state. * * @return resource|null Underlying PHP stream, if any */ public function detach(); /** * Get the size of the stream if known. * * @return int|null Returns the size in bytes if known, or null if unknown. */ public function getSize(): ?int; /** * Returns the current position of the file read/write pointer * * @return int Position of the file pointer * @throws \RuntimeException on error. */ public function tell(): int; /** * Returns true if the stream is at the end of the stream. * * @return bool */ public function eof(): bool; /** * Returns whether or not the stream is seekable. * * @return bool */ public function isSeekable(): bool; /** * Seek to a position in the stream. * * @link http://www.php.net/manual/en/function.fseek.php * @param int $offset Stream offset * @param int $whence Specifies how the cursor position will be calculated * based on the seek offset. Valid values are identical to the built-in * PHP $whence values for `fseek()`. SEEK_SET: Set position equal to * offset bytes SEEK_CUR: Set position to current location plus offset * SEEK_END: Set position to end-of-stream plus offset. * @throws \RuntimeException on failure. */ public function seek(int $offset, int $whence = SEEK_SET): void; /** * Seek to the beginning of the stream. * * If the stream is not seekable, this method will raise an exception; * otherwise, it will perform a seek(0). * * @see seek() * @link http://www.php.net/manual/en/function.fseek.php * @throws \RuntimeException on failure. */ public function rewind(): void; /** * Returns whether or not the stream is writable. * * @return bool */ public function isWritable(): bool; /** * Write data to the stream. * * @param string $string The string that is to be written. * @return int Returns the number of bytes written to the stream. * @throws \RuntimeException on failure. */ public function write(string $string): int; /** * Returns whether or not the stream is readable. * * @return bool */ public function isReadable(): bool; /** * Read data from the stream. * * @param int $length Read up to $length bytes from the object and return * them. Fewer than $length bytes may be returned if underlying stream * call returns fewer bytes. * @return string Returns the data read from the stream, or an empty string * if no bytes are available. * @throws \RuntimeException if an error occurs. */ public function read(int $length): string; /** * Returns the remaining contents in a string * * @return string * @throws \RuntimeException if unable to read or an error occurs while * reading. */ public function getContents(): string; /** * Get stream metadata as an associative array or retrieve a specific key. * * The keys returned are identical to the keys returned from PHP's * stream_get_meta_data() function. * * @link http://php.net/manual/en/function.stream-get-meta-data.php * @param string|null $key Specific metadata to retrieve. * @return array|mixed|null Returns an associative array if no key is * provided. Returns a specific key value if a key is provided and the * value is found, or null if the key is not found. */ public function getMetadata(?string $key = null); } PKCA#]o��22Asystem/helixultimate/vendor/psr/http-message/src/UriInterface.phpnu�[���<?php namespace Psr\Http\Message; /** * Value object representing a URI. * * This interface is meant to represent URIs according to RFC 3986 and to * provide methods for most common operations. Additional functionality for * working with URIs can be provided on top of the interface or externally. * Its primary use is for HTTP requests, but may also be used in other * contexts. * * Instances of this interface are considered immutable; all methods that * might change state MUST be implemented such that they retain the internal * state of the current instance and return an instance that contains the * changed state. * * Typically the Host header will be also be present in the request message. * For server-side requests, the scheme will typically be discoverable in the * server parameters. * * @link http://tools.ietf.org/html/rfc3986 (the URI specification) */ interface UriInterface { /** * Retrieve the scheme component of the URI. * * If no scheme is present, this method MUST return an empty string. * * The value returned MUST be normalized to lowercase, per RFC 3986 * Section 3.1. * * The trailing ":" character is not part of the scheme and MUST NOT be * added. * * @see https://tools.ietf.org/html/rfc3986#section-3.1 * @return string The URI scheme. */ public function getScheme(): string; /** * Retrieve the authority component of the URI. * * If no authority information is present, this method MUST return an empty * string. * * The authority syntax of the URI is: * * <pre> * [user-info@]host[:port] * </pre> * * If the port component is not set or is the standard port for the current * scheme, it SHOULD NOT be included. * * @see https://tools.ietf.org/html/rfc3986#section-3.2 * @return string The URI authority, in "[user-info@]host[:port]" format. */ public function getAuthority(): string; /** * Retrieve the user information component of the URI. * * If no user information is present, this method MUST return an empty * string. * * If a user is present in the URI, this will return that value; * additionally, if the password is also present, it will be appended to the * user value, with a colon (":") separating the values. * * The trailing "@" character is not part of the user information and MUST * NOT be added. * * @return string The URI user information, in "username[:password]" format. */ public function getUserInfo(): string; /** * Retrieve the host component of the URI. * * If no host is present, this method MUST return an empty string. * * The value returned MUST be normalized to lowercase, per RFC 3986 * Section 3.2.2. * * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 * @return string The URI host. */ public function getHost(): string; /** * Retrieve the port component of the URI. * * If a port is present, and it is non-standard for the current scheme, * this method MUST return it as an integer. If the port is the standard port * used with the current scheme, this method SHOULD return null. * * If no port is present, and no scheme is present, this method MUST return * a null value. * * If no port is present, but a scheme is present, this method MAY return * the standard port for that scheme, but SHOULD return null. * * @return null|int The URI port. */ public function getPort(): ?int; /** * Retrieve the path component of the URI. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * Normally, the empty path "" and absolute path "/" are considered equal as * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically * do this normalization because in contexts with a trimmed base path, e.g. * the front controller, this difference becomes significant. It's the task * of the user to handle both "" and "/". * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.3. * * As an example, if the value should include a slash ("/") not intended as * delimiter between path segments, that value MUST be passed in encoded * form (e.g., "%2F") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.3 * @return string The URI path. */ public function getPath(): string; /** * Retrieve the query string of the URI. * * If no query string is present, this method MUST return an empty string. * * The leading "?" character is not part of the query and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.4. * * As an example, if a value in a key/value pair of the query string should * include an ampersand ("&") not intended as a delimiter between values, * that value MUST be passed in encoded form (e.g., "%26") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.4 * @return string The URI query string. */ public function getQuery(): string; /** * Retrieve the fragment component of the URI. * * If no fragment is present, this method MUST return an empty string. * * The leading "#" character is not part of the fragment and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.5. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.5 * @return string The URI fragment. */ public function getFragment(): string; /** * Return an instance with the specified scheme. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified scheme. * * Implementations MUST support the schemes "http" and "https" case * insensitively, and MAY accommodate other schemes if required. * * An empty scheme is equivalent to removing the scheme. * * @param string $scheme The scheme to use with the new instance. * @return static A new instance with the specified scheme. * @throws \InvalidArgumentException for invalid or unsupported schemes. */ public function withScheme(string $scheme): UriInterface; /** * Return an instance with the specified user information. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified user information. * * Password is optional, but the user information MUST include the * user; an empty string for the user is equivalent to removing user * information. * * @param string $user The user name to use for authority. * @param null|string $password The password associated with $user. * @return static A new instance with the specified user information. */ public function withUserInfo(string $user, ?string $password = null): UriInterface; /** * Return an instance with the specified host. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified host. * * An empty host value is equivalent to removing the host. * * @param string $host The hostname to use with the new instance. * @return static A new instance with the specified host. * @throws \InvalidArgumentException for invalid hostnames. */ public function withHost(string $host): UriInterface; /** * Return an instance with the specified port. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified port. * * Implementations MUST raise an exception for ports outside the * established TCP and UDP port ranges. * * A null value provided for the port is equivalent to removing the port * information. * * @param null|int $port The port to use with the new instance; a null value * removes the port information. * @return static A new instance with the specified port. * @throws \InvalidArgumentException for invalid ports. */ public function withPort(?int $port): UriInterface; /** * Return an instance with the specified path. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified path. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * If the path is intended to be domain-relative rather than path relative then * it must begin with a slash ("/"). Paths not starting with a slash ("/") * are assumed to be relative to some base path known to the application or * consumer. * * Users can provide both encoded and decoded path characters. * Implementations ensure the correct encoding as outlined in getPath(). * * @param string $path The path to use with the new instance. * @return static A new instance with the specified path. * @throws \InvalidArgumentException for invalid paths. */ public function withPath(string $path): UriInterface; /** * Return an instance with the specified query string. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified query string. * * Users can provide both encoded and decoded query characters. * Implementations ensure the correct encoding as outlined in getQuery(). * * An empty query string value is equivalent to removing the query string. * * @param string $query The query string to use with the new instance. * @return static A new instance with the specified query string. * @throws \InvalidArgumentException for invalid query strings. */ public function withQuery(string $query): UriInterface; /** * Return an instance with the specified URI fragment. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified URI fragment. * * Users can provide both encoded and decoded fragment characters. * Implementations ensure the correct encoding as outlined in getFragment(). * * An empty fragment value is equivalent to removing the fragment. * * @param string $fragment The fragment to use with the new instance. * @return static A new instance with the specified fragment. */ public function withFragment(string $fragment): UriInterface; /** * Return the string representation as a URI reference. * * Depending on which components of the URI are present, the resulting * string is either a full URI or relative reference according to RFC 3986, * Section 4.1. The method concatenates the various components of the URI, * using the appropriate delimiters: * * - If a scheme is present, it MUST be suffixed by ":". * - If an authority is present, it MUST be prefixed by "//". * - The path can be concatenated without delimiters. But there are two * cases where the path has to be adjusted to make the URI reference * valid as PHP does not allow to throw an exception in __toString(): * - If the path is rootless and an authority is present, the path MUST * be prefixed by "/". * - If the path is starting with more than one "/" and no authority is * present, the starting slashes MUST be reduced to one. * - If a query is present, it MUST be prefixed by "?". * - If a fragment is present, it MUST be prefixed by "#". * * @see http://tools.ietf.org/html/rfc3986#section-4.1 * @return string */ public function __toString(): string; } PKCA#]bY6J J Fsystem/helixultimate/vendor/psr/http-message/src/ResponseInterface.phpnu�[���<?php namespace Psr\Http\Message; /** * Representation of an outgoing, server-side response. * * Per the HTTP specification, this interface includes properties for * each of the following: * * - Protocol version * - Status code and reason phrase * - Headers * - Message body * * Responses are considered immutable; all methods that might change state MUST * be implemented such that they retain the internal state of the current * message and return an instance that contains the changed state. */ interface ResponseInterface extends MessageInterface { /** * Gets the response status code. * * The status code is a 3-digit integer result code of the server's attempt * to understand and satisfy the request. * * @return int Status code. */ public function getStatusCode(): int; /** * Return an instance with the specified status code and, optionally, reason phrase. * * If no reason phrase is specified, implementations MAY choose to default * to the RFC 7231 or IANA recommended reason phrase for the response's * status code. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated status and reason phrase. * * @link http://tools.ietf.org/html/rfc7231#section-6 * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml * @param int $code The 3-digit integer result code to set. * @param string $reasonPhrase The reason phrase to use with the * provided status code; if none is provided, implementations MAY * use the defaults as suggested in the HTTP specification. * @return static * @throws \InvalidArgumentException For invalid status code arguments. */ public function withStatus(int $code, string $reasonPhrase = ''): ResponseInterface; /** * Gets the response reason phrase associated with the status code. * * Because a reason phrase is not a required element in a response * status line, the reason phrase value MAY be null. Implementations MAY * choose to return the default RFC 7231 recommended reason phrase (or those * listed in the IANA HTTP Status Code Registry) for the response's * status code. * * @link http://tools.ietf.org/html/rfc7231#section-6 * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml * @return string Reason phrase; must return an empty string if none present. */ public function getReasonPhrase(): string; } PKCA#]iP:^:(:(Ksystem/helixultimate/vendor/psr/http-message/src/ServerRequestInterface.phpnu�[���<?php namespace Psr\Http\Message; /** * Representation of an incoming, server-side HTTP request. * * Per the HTTP specification, this interface includes properties for * each of the following: * * - Protocol version * - HTTP method * - URI * - Headers * - Message body * * Additionally, it encapsulates all data as it has arrived to the * application from the CGI and/or PHP environment, including: * * - The values represented in $_SERVER. * - Any cookies provided (generally via $_COOKIE) * - Query string arguments (generally via $_GET, or as parsed via parse_str()) * - Upload files, if any (as represented by $_FILES) * - Deserialized body parameters (generally from $_POST) * * $_SERVER values MUST be treated as immutable, as they represent application * state at the time of request; as such, no methods are provided to allow * modification of those values. The other values provide such methods, as they * can be restored from $_SERVER or the request body, and may need treatment * during the application (e.g., body parameters may be deserialized based on * content type). * * Additionally, this interface recognizes the utility of introspecting a * request to derive and match additional parameters (e.g., via URI path * matching, decrypting cookie values, deserializing non-form-encoded body * content, matching authorization headers to users, etc). These parameters * are stored in an "attributes" property. * * Requests are considered immutable; all methods that might change state MUST * be implemented such that they retain the internal state of the current * message and return an instance that contains the changed state. */ interface ServerRequestInterface extends RequestInterface { /** * Retrieve server parameters. * * Retrieves data related to the incoming request environment, * typically derived from PHP's $_SERVER superglobal. The data IS NOT * REQUIRED to originate from $_SERVER. * * @return array */ public function getServerParams(): array; /** * Retrieve cookies. * * Retrieves cookies sent by the client to the server. * * The data MUST be compatible with the structure of the $_COOKIE * superglobal. * * @return array */ public function getCookieParams(): array; /** * Return an instance with the specified cookies. * * The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST * be compatible with the structure of $_COOKIE. Typically, this data will * be injected at instantiation. * * This method MUST NOT update the related Cookie header of the request * instance, nor related values in the server params. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated cookie values. * * @param array $cookies Array of key/value pairs representing cookies. * @return static */ public function withCookieParams(array $cookies): ServerRequestInterface; /** * Retrieve query string arguments. * * Retrieves the deserialized query string arguments, if any. * * Note: the query params might not be in sync with the URI or server * params. If you need to ensure you are only getting the original * values, you may need to parse the query string from `getUri()->getQuery()` * or from the `QUERY_STRING` server param. * * @return array */ public function getQueryParams(): array; /** * Return an instance with the specified query string arguments. * * These values SHOULD remain immutable over the course of the incoming * request. They MAY be injected during instantiation, such as from PHP's * $_GET superglobal, or MAY be derived from some other value such as the * URI. In cases where the arguments are parsed from the URI, the data * MUST be compatible with what PHP's parse_str() would return for * purposes of how duplicate query parameters are handled, and how nested * sets are handled. * * Setting query string arguments MUST NOT change the URI stored by the * request, nor the values in the server params. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated query string arguments. * * @param array $query Array of query string arguments, typically from * $_GET. * @return static */ public function withQueryParams(array $query): ServerRequestInterface; /** * Retrieve normalized file upload data. * * This method returns upload metadata in a normalized tree, with each leaf * an instance of Psr\Http\Message\UploadedFileInterface. * * These values MAY be prepared from $_FILES or the message body during * instantiation, or MAY be injected via withUploadedFiles(). * * @return array An array tree of UploadedFileInterface instances; an empty * array MUST be returned if no data is present. */ public function getUploadedFiles(): array; /** * Create a new instance with the specified uploaded files. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param array $uploadedFiles An array tree of UploadedFileInterface instances. * @return static * @throws \InvalidArgumentException if an invalid structure is provided. */ public function withUploadedFiles(array $uploadedFiles): ServerRequestInterface; /** * Retrieve any parameters provided in the request body. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, this method MUST * return the contents of $_POST. * * Otherwise, this method may return any results of deserializing * the request body content; as parsing returns structured content, the * potential types MUST be arrays or objects only. A null value indicates * the absence of body content. * * @return null|array|object The deserialized body parameters, if any. * These will typically be an array or object. */ public function getParsedBody(); /** * Return an instance with the specified body parameters. * * These MAY be injected during instantiation. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, use this method * ONLY to inject the contents of $_POST. * * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of * deserializing the request body content. Deserialization/parsing returns * structured data, and, as such, this method ONLY accepts arrays or objects, * or a null value if nothing was available to parse. * * As an example, if content negotiation determines that the request data * is a JSON payload, this method could be used to create a request * instance with the deserialized parameters. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param null|array|object $data The deserialized body data. This will * typically be in an array or object. * @return static * @throws \InvalidArgumentException if an unsupported argument type is * provided. */ public function withParsedBody($data): ServerRequestInterface; /** * Retrieve attributes derived from the request. * * The request "attributes" may be used to allow injection of any * parameters derived from the request: e.g., the results of path * match operations; the results of decrypting cookies; the results of * deserializing non-form-encoded message bodies; etc. Attributes * will be application and request specific, and CAN be mutable. * * @return array Attributes derived from the request. */ public function getAttributes(): array; /** * Retrieve a single derived request attribute. * * Retrieves a single derived request attribute as described in * getAttributes(). If the attribute has not been previously set, returns * the default value as provided. * * This method obviates the need for a hasAttribute() method, as it allows * specifying a default value to return if the attribute is not found. * * @see getAttributes() * @param string $name The attribute name. * @param mixed $default Default value to return if the attribute does not exist. * @return mixed */ public function getAttribute(string $name, $default = null); /** * Return an instance with the specified derived request attribute. * * This method allows setting a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated attribute. * * @see getAttributes() * @param string $name The attribute name. * @param mixed $value The value of the attribute. * @return static */ public function withAttribute(string $name, $value): ServerRequestInterface; /** * Return an instance that removes the specified derived request attribute. * * This method allows removing a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the attribute. * * @see getAttributes() * @param string $name The attribute name. * @return static */ public function withoutAttribute(string $name): ServerRequestInterface; } PKCA#]�_8�77Esystem/helixultimate/vendor/psr/http-message/src/RequestInterface.phpnu�[���<?php namespace Psr\Http\Message; /** * Representation of an outgoing, client-side request. * * Per the HTTP specification, this interface includes properties for * each of the following: * * - Protocol version * - HTTP method * - URI * - Headers * - Message body * * During construction, implementations MUST attempt to set the Host header from * a provided URI if no Host header is provided. * * Requests are considered immutable; all methods that might change state MUST * be implemented such that they retain the internal state of the current * message and return an instance that contains the changed state. */ interface RequestInterface extends MessageInterface { /** * Retrieves the message's request target. * * Retrieves the message's request-target either as it will appear (for * clients), as it appeared at request (for servers), or as it was * specified for the instance (see withRequestTarget()). * * In most cases, this will be the origin-form of the composed URI, * unless a value was provided to the concrete implementation (see * withRequestTarget() below). * * If no URI is available, and no request-target has been specifically * provided, this method MUST return the string "/". * * @return string */ public function getRequestTarget(): string; /** * Return an instance with the specific request-target. * * If the request needs a non-origin-form request-target — e.g., for * specifying an absolute-form, authority-form, or asterisk-form — * this method may be used to create an instance with the specified * request-target, verbatim. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * changed request target. * * @link http://tools.ietf.org/html/rfc7230#section-5.3 (for the various * request-target forms allowed in request messages) * @param string $requestTarget * @return static */ public function withRequestTarget(string $requestTarget): RequestInterface; /** * Retrieves the HTTP method of the request. * * @return string Returns the request method. */ public function getMethod(): string; /** * Return an instance with the provided HTTP method. * * While HTTP method names are typically all uppercase characters, HTTP * method names are case-sensitive and thus implementations SHOULD NOT * modify the given string. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * changed request method. * * @param string $method Case-sensitive method. * @return static * @throws \InvalidArgumentException for invalid HTTP methods. */ public function withMethod(string $method): RequestInterface; /** * Retrieves the URI instance. * * This method MUST return a UriInterface instance. * * @link http://tools.ietf.org/html/rfc3986#section-4.3 * @return UriInterface Returns a UriInterface instance * representing the URI of the request. */ public function getUri(): UriInterface; /** * Returns an instance with the provided URI. * * This method MUST update the Host header of the returned request by * default if the URI contains a host component. If the URI does not * contain a host component, any pre-existing Host header MUST be carried * over to the returned request. * * You can opt-in to preserving the original state of the Host header by * setting `$preserveHost` to `true`. When `$preserveHost` is set to * `true`, this method interacts with the Host header in the following ways: * * - If the Host header is missing or empty, and the new URI contains * a host component, this method MUST update the Host header in the returned * request. * - If the Host header is missing or empty, and the new URI does not contain a * host component, this method MUST NOT update the Host header in the returned * request. * - If a Host header is present and non-empty, this method MUST NOT update * the Host header in the returned request. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new UriInterface instance. * * @link http://tools.ietf.org/html/rfc3986#section-4.3 * @param UriInterface $uri New request URI to use. * @param bool $preserveHost Preserve the original state of the Host header. * @return static */ public function withUri(UriInterface $uri, bool $preserveHost = false): RequestInterface; } PKCA#]Z��Jsystem/helixultimate/vendor/psr/http-message/src/UploadedFileInterface.phpnu�[���<?php namespace Psr\Http\Message; /** * Value object representing a file uploaded through an HTTP request. * * Instances of this interface are considered immutable; all methods that * might change state MUST be implemented such that they retain the internal * state of the current instance and return an instance that contains the * changed state. */ interface UploadedFileInterface { /** * Retrieve a stream representing the uploaded file. * * This method MUST return a StreamInterface instance, representing the * uploaded file. The purpose of this method is to allow utilizing native PHP * stream functionality to manipulate the file upload, such as * stream_copy_to_stream() (though the result will need to be decorated in a * native PHP stream wrapper to work with such functions). * * If the moveTo() method has been called previously, this method MUST raise * an exception. * * @return StreamInterface Stream representation of the uploaded file. * @throws \RuntimeException in cases when no stream is available or can be * created. */ public function getStream(): StreamInterface; /** * Move the uploaded file to a new location. * * Use this method as an alternative to move_uploaded_file(). This method is * guaranteed to work in both SAPI and non-SAPI environments. * Implementations must determine which environment they are in, and use the * appropriate method (move_uploaded_file(), rename(), or a stream * operation) to perform the operation. * * $targetPath may be an absolute path, or a relative path. If it is a * relative path, resolution should be the same as used by PHP's rename() * function. * * The original file or stream MUST be removed on completion. * * If this method is called more than once, any subsequent calls MUST raise * an exception. * * When used in an SAPI environment where $_FILES is populated, when writing * files via moveTo(), is_uploaded_file() and move_uploaded_file() SHOULD be * used to ensure permissions and upload status are verified correctly. * * If you wish to move to a stream, use getStream(), as SAPI operations * cannot guarantee writing to stream destinations. * * @see http://php.net/is_uploaded_file * @see http://php.net/move_uploaded_file * @param string $targetPath Path to which to move the uploaded file. * @throws \InvalidArgumentException if the $targetPath specified is invalid. * @throws \RuntimeException on any error during the move operation, or on * the second or subsequent call to the method. */ public function moveTo(string $targetPath): void; /** * Retrieve the file size. * * Implementations SHOULD return the value stored in the "size" key of * the file in the $_FILES array if available, as PHP calculates this based * on the actual size transmitted. * * @return int|null The file size in bytes or null if unknown. */ public function getSize(): ?int; /** * Retrieve the error associated with the uploaded file. * * The return value MUST be one of PHP's UPLOAD_ERR_XXX constants. * * If the file was uploaded successfully, this method MUST return * UPLOAD_ERR_OK. * * Implementations SHOULD return the value stored in the "error" key of * the file in the $_FILES array. * * @see http://php.net/manual/en/features.file-upload.errors.php * @return int One of PHP's UPLOAD_ERR_XXX constants. */ public function getError(): int; /** * Retrieve the filename sent by the client. * * Do not trust the value returned by this method. A client could send * a malicious filename with the intention to corrupt or hack your * application. * * Implementations SHOULD return the value stored in the "name" key of * the file in the $_FILES array. * * @return string|null The filename sent by the client or null if none * was provided. */ public function getClientFilename(): ?string; /** * Retrieve the media type sent by the client. * * Do not trust the value returned by this method. A client could send * a malicious media type with the intention to corrupt or hack your * application. * * Implementations SHOULD return the value stored in the "type" key of * the file in the $_FILES array. * * @return string|null The media type sent by the client or null if none * was provided. */ public function getClientMediaType(): ?string; } PKCA#]�����(system/helixultimate/vendor/autoload.phpnu�[���<?php // autoload.php @generated by Composer if (PHP_VERSION_ID < 50600) { if (!headers_sent()) { header('HTTP/1.1 500 Internal Server Error'); } $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; if (!ini_get('display_errors')) { if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { fwrite(STDERR, $err); } elseif (!headers_sent()) { echo $err; } } throw new RuntimeException($err); } require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInitc22f79d1e33808587d06b3aaf2e312df::getLoader(); PKCA#] u�7��,system/helixultimate/layout/fields/media.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Uri\Uri; /** * Media field. * * @since 1.0.0 */ class HelixultimateFieldMedia { /** * Get input for the field. * * @param string $key * @param array $attr * * @return string * @since 1.0.0 */ public static function getInput($key, $attr) { $className = $attr['class'] ?? ''; $output = '<div class="control-group ' . $className . '">'; $output .= '<label>' . $attr['title'] . '</label>'; if (!empty($attr['desc'])) { $output .= '<span class="hu-help-icon hu-ml-2 fas fa-info-circle"></span>'; $output .= '<p class="hu-control-help">' . $attr['desc'] . '</p>'; } $output .= '<div class="hu-image-holder"></div>'; $output .= '<input type="hidden" class="hu-input hu-input-media" data-attrname="' . $key . '" data-baseurl="' . Uri::root() . '" value="">'; $output .= '<a href="#" class="hu-media-picker hu-btn hu-btn-primary hu-mr-2" data-target="' . $key . '"><span class="fas fa-image" aria-hidden="true"></span> Select Media</a>'; $output .= '<a href="#" class="hu-media-clear hu-btn hu-btn-secondary hide"><span class="fas fa-times" aria-hidden="true"></span> Clear</a>'; $output .= '</div>'; return $output; } } PKCA#]�LE��-system/helixultimate/layout/fields/select.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Settings; /** * Select field * * @since 1.0.0 */ class HelixultimateFieldSelect { /** * Get input for the field. * * @param string $key * @param array $attr * * @return string * @since 1.0.0 */ public static function getInput($key, $attr) { $isMenuBuilder = isset($attr['menu-builder']) && $attr['menu-builder'] === true; $value = !empty($attr['value']) ? $attr['value'] : ''; $options = !empty($attr['options']) ? $attr['options'] : (!empty($attr['values']) ? $attr['values'] : []); $depend = isset($attr['depend']) ? $attr['depend'] : false; $className = $attr['class'] ?? ''; $dataAttrs = ''; $dataShowon = ''; $internal = !empty($attr['internal']) ? ' internal-use-only' : ''; if ($depend) { $showon = Settings::parseShowOnConditions($attr['depend']); $dataShowon = ' data-revealon=\'' . json_encode($showon) . '\' '; } if (!empty($attr['data'])) { foreach ($attr['data'] as $dataName => $dataValue) { $dataAttrs .= ' data-' . $dataName . '=' . $dataValue; } } $output = '<div class="control-group ' . $className . ' ' . $key . '" ' . $dataShowon . '>'; $output .= '<label>' . $attr['title']; $output .= !empty($attr['desc']) ? '<span class="hu-help-icon hu-ml-2 fas fa-info-circle"></span>' : ''; $output .= '</label>'; $output .= !empty($attr['desc']) ? '<p class="hu-control-help">' . $attr['desc'] . '</p>' : ''; if ($isMenuBuilder) { $output .= '<select class="hu-input input-select hu-megamenu-builder-' . $key . $internal . '" name="' . $key . '" ' . $dataAttrs . '>'; } else { $output .= '<select class="hu-input input-select" data-attrname="' . $key . '">'; } foreach ($options as $optKey => $text) { $output .= '<option value="' . $optKey . '" ' . ($optKey === $value ? 'selected="selected"' : '') . '>' . $text . '</option>'; } $output .= '</select>'; $output .= '</div>'; return $output; } } PKCA#]��io��+system/helixultimate/layout/fields/unit.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Settings; /** * Measurement unit field. * * @since 2.0.0 */ class HelixultimateFieldUnit { /** * Get input for the field. * * @param string $key * @param array $attr * * @return string * @since 1.0.0 */ public static function getInput($key, $attr) { $attributes = (isset($attr['placeholder']) && $attr['placeholder']) ? 'placeholder="' . $attr['placeholder'] . '"' : ''; $className = $attr['class'] ?? ''; $value = !empty($attr['value']) ? $attr['value'] : ''; $depend = isset($attr['depend']) ? $attr['depend'] : false; $dataAttrs = ''; $dataShowon = ''; $internal = !empty($attr['internal']) ? ' internal-use-only' : ''; if ($depend) { $showon = Settings::parseShowOnConditions($attr['depend']); $dataShowon = ' data-revealon=\'' . json_encode($showon) . '\' '; } if (!empty($attr['data'])) { foreach ($attr['data'] as $dataName => $dataValue) { $dataAttrs .= ' data-' . $dataName . '=' . $dataValue; } } $output = '<div class="control-group ' . $className . '" ' . $dataShowon . ' >'; $output .= '<label>' . $attr['title'] . '</label>'; if (!empty($attr['desc'])) { $output .= '<span class="hu-help-icon hu-ml-2 fas fa-info-circle"></span>'; $output .= '<p class="hu-control-help">' . $attr['desc'] . '</p>'; } // By default the unit is px. $unit = 'px'; if (isset($value)) { $matches = []; if (preg_match("@^([+-]?(?:\d+|\d*\.\d+))(px|em|rem|%)$@", $value, $matches)) { if (count($matches) >= 3) { $value = $matches[1]; if (isset($matches[2])) { $unit = strtolower($matches[2]); } } } elseif (is_numeric($value)) { $value = (float) $value; } else { $value = ''; } } $value = !isset($value) ? '' : $value; $finalValue = $value !== '' ? $value . $unit : ''; $output .= '<div class="hu-input-group hu-unit-group">'; $output .= '<input type="hidden" class="hu-unit-field-value" name="' . $key . '" value="' . $finalValue . '"/>'; $output .= ' <input type="text" class="hu-field-dimension-width form-control hu-unit-field-input ' . $key . '" value="' . $value . '" />'; $output .= ' <select class="hu-unit-select">'; $output .= ' <option value="px" ' . ($unit === 'px' ? 'selected' : '') . '>px</option>'; $output .= ' <option value="em" ' . ($unit === 'em' ? 'selected' : '') . '>em</option>'; $output .= ' <option value="rem" ' . ($unit === 'rem' ? 'selected' : '') . '>rem</option>'; $output .= ' <option value="%" ' . ($unit === '%' ? 'selected' : '') . '>%</option>'; $output .= ' </select>'; $output .= '</div>'; // End of control group $output .= '</div>'; return $output; } } PKCA#]��A�� � 0system/helixultimate/layout/fields/alignment.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); /** * Text field. * * @since 1.0.0 */ class HelixultimateFieldAlignment { /** * Get input for the field. * * @param string $key * @param array $attr * * @return string * @since 1.0.0 */ public static function getInput($key, $attr) { $value = !empty($attr['value']) ? $attr['value'] : (isset($attr['default']) ? $attr['default'] : ''); $dataAttrs = ''; $internal = !empty($attr['internal']) ? ' internal-use-only' : ''; $className = $attr['class'] ?? ''; if (!empty($attr['data'])) { foreach ($attr['data'] as $dataName => $dataValue) { $dataAttrs .= ' data-' . $dataName . '=' . $dataValue; } } $output = '<div class="control-group hu-field-alignment ' . $className. '">'; $output .= '<label>' . $attr['title'] . '</label>'; if (!empty($attr['desc'])) { $output .= '<span class="hu-help-icon hu-ml-2 fas fa-info-circle"></span>'; $output .= '<p class="hu-control-help">' . $attr['desc'] . '</p>'; } $output .= '<div class="controls">'; $output .= '<div class="hu-switcher hu-switcher-inline hu-switcher-style-tab hu-switcher-style-tab-sm">'; $output .= '<div class="hu-action-group">'; $output .= '<span data-value="left" class="hu-switcher-action ' . ($value === 'left' ? 'active' : '') . '" role="button"><span class="fas fa-align-left" aria-hidden="true"></span></span>'; $output .= '<span data-value="center" class="hu-switcher-action ' . ($value === 'center' ? 'active' : '') . '" role="button"><span class="fas fa-align-center" aria-hidden="true"></span></span>'; $output .= '<span data-value="right" class="hu-switcher-action ' . ($value === 'right' ? 'active' : '') . '" role="button"><span class="fas fa-align-right" aria-hidden="true"></span></span>'; $output .= '<span data-value="justify" class="hu-switcher-action ' . ($value === 'justify' ? 'active' : '') . '" role="button"><span class="fas fa-align-justify" aria-hidden="true"></span></span>'; $output .= '</div>'; $output .= '</div>'; $output .= '</div>'; $output .= '<input type="hidden" class="' . $internal . '" ' . $dataAttrs . ' name="' . $key . '" value="' . $value . '" />'; $output .= '</div>'; return $output; } } PKCA#]G�84��+system/helixultimate/layout/fields/text.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Settings; /** * Text field. * * @since 1.0.0 */ class HelixultimateFieldText { /** * Get input for the field. * * @param string $key * @param array $attr * * @return string * @since 1.0.0 */ public static function getInput($key, $attr) { $isMenuBuilder = isset($attr['menu-builder']) && $attr['menu-builder'] === true; $attributes = (isset($attr['placeholder']) && $attr['placeholder']) ? 'placeholder="' . $attr['placeholder'] . '"' : ''; $className = $attr['class'] ?? ''; $value = !empty($attr['value']) ? $attr['value'] : ''; $depend = isset($attr['depend']) ? $attr['depend'] : false; $dataAttrs = ''; $dataShowon = ''; $internal = !empty($attr['internal']) ? ' internal-use-only' : ''; if ($depend) { $showon = Settings::parseShowOnConditions($attr['depend']); $dataShowon = ' data-revealon=\'' . json_encode($showon) . '\' '; } if (!empty($attr['data'])) { foreach ($attr['data'] as $dataName => $dataValue) { $dataAttrs .= ' data-' . $dataName . '=' . $dataValue; } } $output = '<div class="control-group ' . $className . '" ' . $dataShowon . ' >'; $output .= '<div class="control-group-inner">'; $output .= '<div class="control-label">'; $output .= '<label>' . $attr['title']; $output .= !empty($attr['desc']) ? '<span class="hu-help-icon hu-ml-2 fas fa-info-circle"></span>' : ''; $output .= '</label>'; $output .= '</div>'; $output .= !empty($attr['desc']) ? '<p class="hu-control-help">' . $attr['desc'] . '</p>' : ''; $output .= '</div>'; if ($isMenuBuilder) { $output .= '<input class="hu-input hu-megamenu-builder-' . $key . $internal . '" type="text" ' . $dataAttrs . ' name="' . $key . '" value="' . $value . '" ' . $attributes . ' />'; } else { $output .= '<input class="hu-input addon-' . $key . '" type="text" name="' . $key . '" data-attrname="' . $key . '" value="" ' . $attributes . ' />'; } $output .= '</div>'; return $output; } } PKCA#]q���,system/helixultimate/layout/fields/color.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Settings; /** * Color field * * @since 1.0.0 */ class HelixultimateFieldColor { /** * Get input for the field. * * @param string $key * @param array $attr * * @return string * @since 1.0.0 */ public static function getInput($key, $attr) { $isMenuBuilder = isset($attr['menu-builder']) && $attr['menu-builder'] === true; $value = !empty($attr['value']) ? $attr['value'] : ''; $depend = isset($attr['depend']) ? $attr['depend'] : false; $className = $attr['class'] ?? ''; $dataAttrs = ''; $dataShowon = ''; $internal = !empty($attr['internal']) ? ' internal-use-only' : ''; if ($depend) { $showon = Settings::parseShowOnConditions($attr['depend']); $dataShowon = ' data-revealon=\'' . json_encode($showon) . '\' '; } if (!empty($attr['data'])) { foreach ($attr['data'] as $dataName => $dataValue) { $dataAttrs .= ' data-' . $dataName . '=' . $dataValue; } } $output = '<div class="control-group ' . $className . '">'; $output .= '<label>' . $attr['title'] . '</label>'; if (!empty($attr['desc'])) { $output .= '<span class="hu-help-icon hu-ml-2 fas fa-info-circle"></span>'; $output .= '<p class="hu-control-help">' . $attr['desc'] . '</p>'; } if ($isMenuBuilder) { $output .= '<input type="text" class="hu-input hu-input-color hu-megamenu-builder-' . $key . $internal . '" placeholder="#rrggbb" ' . $dataAttrs . ' name="' . $key . '" value="' . $value . '" />'; } else { $output .= '<input type="text" class="hu-input hu-input-color" data-attrname="' . $key . '" placeholder="#rrggbb" value="">'; } $output .= '</div>'; return $output; } } PKCA#]��a��/system/helixultimate/layout/fields/menutype.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Settings; use Joomla\CMS\Language\Text; /** * Text field. * * @since 1.0.0 */ class HelixultimateFieldMenuType { /** * Get input for the field. * * @param string $key * @param array $attr * * @return string * @since 1.0.0 */ public static function getInput($key, $attr) { $attributes = (isset($attr['placeholder']) && $attr['placeholder']) ? 'placeholder="' . $attr['placeholder'] . '"' : ''; $value = !empty($attr['value']) ? $attr['value'] : ''; $depend = isset($attr['depend']) ? $attr['depend'] : false; $className = $attr['class'] ?? ''; $dataAttrs = ''; $dataShowon = ''; $internal = !empty($attr['internal']) ? ' internal-use-only' : ''; if ($depend) { $showon = Settings::parseShowOnConditions($attr['depend']); $dataShowon = ' data-revealon=\'' . json_encode($showon) . '\' '; } if (!empty($attr['data'])) { foreach ($attr['data'] as $dataName => $dataValue) { $dataAttrs .= ' data-' . $dataName . '=' . $dataValue; } } $output = '<div class="control-group ' . $className . '" ' . $dataShowon . ' >'; $output .= '<label>' . $attr['title'] . '</label>'; if (!empty($attr['desc'])) { $output .= '<span class="hu-help-icon hu-ml-2 fas fa-info-circle"></span>'; $output .= '<p class="hu-control-help">' . $attr['desc'] . '</p>'; } $output .= self::menuTypesField(); $output .= '</div>'; return $output; } private static function menuTypesField() { $html = []; $recordId = 0; $types = self::getMenuTypes(); $tmpl = '1'; $tmpl = "'" . \json_encode($tmpl, \JSON_NUMERIC_CHECK) . "'"; $dropdownText = 'Select Menu Type'; $html[] = '<a href="javascript:" class="hu-btn hu-btn-outline text-start hu-btn-block hu-has-dropdown hu-dropdown-toggle" data-target="#menuTypeDropdown">' . $dropdownText . '</a>'; if (!empty($types)) { $html[] = '<ul class="hu-dropdown" id="menuTypeDropdown">'; foreach ($types as $name => $children) { if (!empty($children)) { $html[] = '<li class="hu-has-submenu">'; $html[] = '<a class="hu-dropdown-item">' . $name . '</a>'; $html[] = '<ul class="hu-submenu">'; foreach ($children as $child) { $menuType = [ 'id' => $recordId, 'title' => isset($child->type) ? $child->type : Text::_($child->title), 'request' => $child->request ]; $menuType = base64_encode(json_encode($menuType)); $html[] = '<li><a class="hu-dropdown-item hu-menu-type-item" href="javascript:" data-menutype="' . $menuType . '" >'; $html[] = '<h4 class="hu-menu-item-title">' . Text::_($child->title) . '</h4>'; $html[] = '<span class="text-mute">' . Text::_($child->description) . '</span>'; $html[] = '</a></li>'; } $html[] = '</ul>'; $html[] = '</li>'; } else { $html[] = '<li><a class="hu-dropdown-item" href="javascript:">' . $name . '</a></li>'; } } $html[] = '</ul>'; } return implode("\n", $html); } public static function getMenuTypes() { $classUrl = JPATH_ADMINISTRATOR . '/components/com_menus/models/menutypes.php'; $helperUrl = JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php'; if (!\class_exists('MenusModelMenutypes')) { require_once $classUrl; } if (!\class_exists('MenusHelper')) { require_once $helperUrl; } $model = new \MenusModelMenutypes; $types = $model->getTypeOptions(); self::addCustomTypes($types); $sortedTypes = []; foreach ($types as $name => $list) { $tmp = []; foreach ($list as $item) { $tmp[Text::_($item->title)] = $item; } \uksort($tmp, function($a, $b) { return \strcasecmp($a, $b); }); $sortedTypes[Text::_($name)] = $tmp; } \uksort($sortedTypes, function($a, $b) { return \strcasecmp($a, $b); }); return $sortedTypes; } private static function addCustomTypes(&$types) { if (empty($types)) { $types = array(); } // Adding System Links $list = array(); $o = new \stdClass; $o->title = 'HELIX_ULTIMATE_TYPE_EXTERNAL_URL'; $o->type = 'url'; $o->description = 'HELIX_ULTIMATE_TYPE_EXTERNAL_URL_DESC'; $o->request = null; $list[] = $o; $o = new \stdClass; $o->title = 'HELIX_ULTIMATE_TYPE_ALIAS'; $o->type = 'alias'; $o->description = 'HELIX_ULTIMATE_TYPE_ALIAS_DESC'; $o->request = null; $list[] = $o; $o = new \stdClass; $o->title = 'HELIX_ULTIMATE_TYPE_SEPARATOR'; $o->type = 'separator'; $o->description = 'HELIX_ULTIMATE_TYPE_SEPARATOR_DESC'; $o->request = null; $list[] = $o; $o = new \stdClass; $o->title = 'HELIX_ULTIMATE_TYPE_HEADING'; $o->type = 'heading'; $o->description = 'HELIX_ULTIMATE_TYPE_HEADING_DESC'; $o->request = null; $list[] = $o; $types['HELIX_ULTIMATE_TYPE_SYSTEM'] = $list; } } PKCA#]2� UU4system/helixultimate/layout/fields/menuHierarchy.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use HelixUltimate\Framework\Platform\Settings; use Joomla\CMS\Language\Text; /** * Text field. * * @since 1.0.0 */ class HelixultimateFieldMenuHierarchy { /** * Get input for the field. * * @param string $key * @param array $attr * * @return string * @since 1.0.0 */ public static function getInput($key, $attr) { $itemId = $attr['itemid']; $dataAttrs = ''; $value = isset($attr['value']) ? $attr['value'] : ''; $depend = isset($attr['depend']) ? $attr['depend'] : false; $className = $attr['class'] ?? ''; $internal = !empty($attr['internal']) ? ' internal-use-only' : ''; if ($depend) { $showon = Settings::parseShowOnConditions($attr['depend']); $dataShowon = ' data-revealon=\'' . json_encode($showon) . '\' '; } if (!empty($value) && \is_string($value)) { $value = json_decode($value ?? "", true); } else { $value = []; } if (!empty($attr['data'])) { foreach ($attr['data'] as $dataName => $dataValue) { $dataAttrs .= ' data-' . $dataName . '=' . $dataValue; } } $html = []; $html[] = '<div class="control-group hu-menu-hierarchy-container ' . $key . ' ' . $className . '" ' . $dataShowon . '>'; $html[] = '<label>' . $attr['title'] . '</label>'; if (!empty($attr['desc'])) { $html[] = '<label class="hu-help-icon hu-ml-2 fas fa-info-circle"></label>'; $html[] = '<p class="hu-control-help">' . $attr['desc'] . '</p>'; } $menuElements = new \stdClass; $menuElements->$itemId = new \stdClass; $menuElements->$itemId->id = $itemId; $menuElements->$itemId->title = 'root'; $menuElements->$itemId->children = []; Helper::getMenuItems($itemId, $menuElements); /** * Calculate the total menu Items for detecting the select all checkbox. */ $totalElements = 0; $children = $menuElements->$itemId->children; $totalElements += count($children); $allElements = []; $allElements = array_merge($allElements, $children); if (empty($children)) { $html[] = '<div><strong>There is not child items for this menu item.</strong></div>'; $value = []; } else { while (count($children)) { $child = array_shift($children); if (!empty($menuElements->$child->children)) { array_unshift($children, ...$menuElements->$child->children); $totalElements += count($menuElements->$child->children); $allElements = array_merge($allElements, $menuElements->$child->children); } } if (!empty($menuElements) && !empty($menuElements->$itemId->children)) { $checkAll = count($value) === $totalElements ? 'checked="checked"' : ''; $elements = ' data-elements=\'' . json_encode($allElements) . '\''; $html[] = '<ul class="hu-menu-hierarchy-list">'; $html[] = '<li class="hu-menu-hierarchy-item level-0">'; $html[] = ' <label class="hu-menu-item-title">'; $html[] = ' <input type="checkbox" class="hu-input hu-menu-item-selector select-all level-0 ' . $internal . '" data-level="0" ' . $checkAll . $elements . '/>'; $html[] = ' <span>' . Text::_('HELIX_ULTIMATE_MENU_HIERARCHY_SELECT_ALL') . '</span>'; $html[] = ' </label>'; $html[] = '</li>'; $children = $menuElements->$itemId->children; while (count($children) > 0) { $child = array_shift($children); $margin = ($menuElements->$child->level - 2) * 10; $level = $menuElements->$child->level - 1; $val = $menuElements->$child->id; $check = \in_array($val, $value) ? 'checked="checked"' : ''; $html[] = '<li class="hu-menu-hierarchy-item level-' . $level . '">'; $html[] = ' <label class="hu-menu-item-title">'; $html[] = ' <input type="checkbox" class="hu-input hu-menu-item-selector level-' . $level . $internal . '" value="' . $val . '" data-level="' . $level . '" ' . $check . ' />'; $html[] = ' <span style="margin-left: ' . $margin . 'px;">' . $menuElements->$child->title . '</span>'; $html[] = ' </label>'; $html[] = '</li>'; if (!empty($menuElements->$child->children)) { array_unshift($children, ...$menuElements->$child->children); } } $html[] = '</ul>'; } } if (\is_array($value)) { $value = json_encode($value); } $html[] = '<input type="hidden" class="' . $internal . '" name="' . $key . '" value=\'' . $value . '\' ' . $dataAttrs . ' />'; $html[] = '</div>'; return implode("\n", $html); } } PKCA#]�O�))/system/helixultimate/layout/fields/checkbox.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); /** * Checkbox field * * @since 1.0.0 */ class HelixultimateFieldCheckbox { /** * Get input for the field. * * @param string $key * @param array $attr * * @return string * @since 1.0.0 */ public static function getInput($key, $attr) { $isMenuBuilder = isset($attr['menu-builder']) && $attr['menu-builder'] === true; $value = !empty($attr['value']) ? $attr['value'] : ''; $dataAttrs = ''; $internal = !empty($attr['internal']) ? ' internal-use-only' : ''; $className = $attr['class'] ?? ''; if (!empty($attr['data'])) { foreach ($attr['data'] as $dataName => $dataValue) { $dataAttrs .= ' data-' . $dataName . '=' . $dataValue; } } $output = '<div class="control-group hu-style-switcher ' . $className . '">'; $output .= '<div class="checkbox clearfix">'; $output .= '<label class="control-label">' . $attr['title']; if (!empty($attr['desc'])) { $output .= '<span class="hu-help-icon hu-ml-2 fas fa-info-circle"></span>'; } if ($isMenuBuilder) { $output .= '<input class="hu-input hu-megamenu-builder-' . $key . $internal . '" type="checkbox" ' . $dataAttrs . ' name="' . $key . '" value="' . $value . '" ' . ($value ? 'checked="checked"' : '') . ' />'; } else { $output .= '<input class="hu-input hu-input-' . $key . '" data-attrname="' . $key . '" type="checkbox">'; } $output .= '</label>'; if (!empty($attr['desc'])) { $output .= '<p class="hu-control-help">' . $attr['desc'] . '</p>'; } $output .= '</div>'; $output .= '</div>'; return $output; } } PKCA#]��\0oo)system/helixultimate/layout/generated.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\Filesystem\Folder; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; defined ('_JEXEC') or die (); $fields = Folder::files( dirname( __FILE__ ) . '/fields', '\.php$', false, true); foreach ($fields as $field) { require_once $field; } require_once 'settings/settings.php'; echo RowColumnSettings::getRowSettings($rowSettings); echo RowColumnSettings::getColumnSettings($columnSettings); $layout_path = JPATH_ROOT .'/plugins/system/helixultimate/layouts'; ?> <div class="hidden"> <div class="save-box"> <div class="mb-3"> <label><?php echo Text::_('HELIX_ENTER_LAYOUT_NAME'); ?></label> <input class="form-control addon-input addon-name" type="text" data-attrname="layout_name" value="" placeholder=""> </div> </div> </div> <div class="hidden"> <?php $lt_section = new FileLayout('backend.section', $layout_path ); $obj = new stdClass; $obj->sectionID = true; echo $lt_section->render($obj); ?> </div> <div class="clearfix"></div> <!-- Layout Builder Section --> <div id="hu-layout-builder" > <?php $output = ''; if ($layout_data) { foreach ($layout_data as $row) { $lt_section = new FileLayout('backend.section', $layout_path ); $output .= $lt_section->render($row); } } echo $output; ?> </div> <div class="clearfix"></div> PKCA#]̉��nn.system/helixultimate/layout/megaMenu/slots.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; extract($displayData); $grids = array( array( 'grid' => '12', 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="51" height="17" fill="none"><rect width="50.78" height="16.927" fill-opacity=".3" rx="2"/></svg>' ), array( 'grid' => '6+6', 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="23.79" height="16.221" fill-opacity=".3" rx="2"/><rect width="23.79" height="16.221" fill-opacity=".7" rx="2"/><rect width="23.79" height="16.221" x="25.681" fill-opacity=".3" rx="2"/></svg>' ), array( 'grid' => '4+4+4', 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="15.139" height="16.221" fill-opacity=".3" rx="2"/><rect width="15.139" height="16.221" x="17.302" fill-opacity=".3" rx="2"/><rect width="15.139" height="16.221" x="17.302" fill-opacity=".7" rx="2"/><rect width="15.139" height="16.221" x="34.605" fill-opacity=".3" rx="2"/></svg>' ), array( 'grid' => '3+3+3+3', 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="51" height="17" fill="none"><rect width="10.814" height="16.221" fill-opacity=".3" rx="2"/><rect width="10.814" height="16.221" x="12.974" fill-opacity=".3" rx="2"/><rect width="10.814" height="16.221" x="12.974" fill-opacity=".7" rx="2"/><rect width="10.814" height="16.221" x="25.95" fill-opacity=".3" rx="2"/><rect width="11.354" height="16.221" x="38.929" fill-opacity=".3" rx="2"/><rect width="11.354" height="16.221" x="38.929" fill-opacity=".7" rx="2"/></svg>' ), array( 'grid' => '4+8', 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="15.139" height="16.221" fill-opacity=".3" rx="2"/><rect width="33" height="16" x="17" fill-opacity=".3" rx="2"/><rect width="33" height="16" x="17" fill-opacity=".7" rx="2"/></svg>' ), array( 'grid' => '3+9', 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="10.814" height="16.221" fill-opacity=".7" rx="2"/><rect width="37" height="16" x="13" fill-opacity=".3" rx="2"/></svg>' ), array( 'grid' => '3+6+3', 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="10.543" height="16.221" fill-opacity=".3" rx="2"/><rect width="11.084" height="16.221" x="38.659" fill-opacity=".3" rx="2"/><rect width="23.79" height="16.221" x="12.704" fill-opacity=".7" rx="2"/></svg>' ), array( 'grid' => '2+6+4', 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="51" height="17" fill="none"><rect width="6.488" height="16.221" x=".143" fill-opacity=".7" rx="2"/><rect width="23.79" height="16.221" x="9" fill-opacity=".3" rx="2"/><rect width="15.139" height="16.221" x="35" fill-opacity=".7" rx="2"/></svg>' ), array( 'grid' => '2+10', 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="6.488" height="16.221" x=".143" fill-opacity=".3" rx="2"/><rect width="41" height="16" x="9" fill-opacity=".7" rx="2"/></svg>' ), array( 'grid' => '5+7', 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="28.927" height="16.221" x="20.653" fill-opacity=".7" rx="2"/><rect width="18.654" height="16.221" fill-opacity=".3" rx="2"/></svg>' ), array( 'grid' => '2+3+7', 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="17" fill="none"><rect width="6.488" height="16.221" x=".143" fill-opacity=".7" rx="2"/><rect width="10" height="16.221" x="8.7" fill-opacity=".3" rx="2"/><rect width="28.927" height="16.221" x="20.653" fill-opacity=".7" rx="2"/></svg>' ) ); ?> <div class="hu-megamenu-columns-layout"> <div class="row"> <?php foreach ($grids as $key => $grid): ?> <div class="col-3"> <a href="#" class="hu-megamenu-column-layout" data-layout="<?php echo $grid['grid']; ?>"> <div class="hu-megamenu-column-layout-preview"> <?php echo $grid['icon']; ?> </div> <span class="hu-megamenu-column-layout-name"><?php echo $grid['grid']; ?></span> </a> </div> <?php endforeach ?> <div class="col-3"> <a href="#" class="hu-megamenu-column-layout hu-megamenu-custom" data-layout="custom"> <div class="hu-megamenu-column-layout-preview"><?php echo Text::_('HELIX_ULTIMATE_CUSTOM_LAYOUT_TEXT'); ?></div> <span class="hu-megamenu-column-layout-name hu-sr-only"><?php echo Text::_('HELIX_ULTIMATE_CUSTOM_LAYOUT_TEXT'); ?></span> </a> </div> </div> <div class="hu-megamenu-custom-layout"> <label><?php echo Text::_('HELIX_ULTIMATE_CUSTOM_LAYOUT_LABEL'); ?></label> <div class="hu-d-flex hu-justify-content-between"> <input type="text" class="hu-megamenu-custom-layout-field" value="6+3+3"> <button class="hu-btn hu-btn-primary hu-megamenu-custom-layout-apply"> <?php echo Text::_('HELIX_ULTIMATE_MEGAMENU_APPLY_TEXT'); ?> </button> </div> </div> </div> PKCA#]zO6)LL-system/helixultimate/layout/megaMenu/grid.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Uri\Uri; extract($displayData); $grid = []; if (!empty($settings) && isset($settings->layout)) { $grid = $settings->layout; } /** * Get missing menu item and push them to the first row first column. * */ $missingItems = $builder->getMissingItems(); if (!empty($missingItems) && isset($grid[0]) && isset($grid[0]->attr[0])) { $items = array_merge($grid[0]->attr[0]->items, $missingItems); $grid[0]->attr[0]->items = $items; } $rowLayout = new FileLayout('megaMenu.row', HELIX_LAYOUT_PATH); $modules = Helper::getModules(); ?> <div class="hu-megamenu-grid"> <div class="hu-megamenu-rows-container"> <?php if (!empty($grid)): ?> <?php foreach ($grid as $key => $row): ?> <?php echo $rowLayout->render([ 'itemId' => $itemId, 'builder' => $builder, 'row' => $row, 'rowId' => $key + 1 ]); ?> <?php endforeach ?> <?php endif ?> </div> <div class="hu-megamenu-add-row"> <a href="#" class="hu-btn hu-btn-primary"> <span class="fas fa-plus-circle" aria-hidden="true"></span> <?php echo Text::_('HELIX_ULTIMATE_MEGAMENU_ADD_NEW_ROW'); ?> </a> </div> <div class="hu-megamenu-add-slots"> <?php echo (new FileLayout('megaMenu.slots', HELIX_LAYOUT_PATH))->render(); ?> </div> </div>PKCA#]l��rr-system/helixultimate/layout/megaMenu/cell.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Uri\Uri; extract($displayData); $badgeText = $cell->type === 'module' ? 'Module' : 'Menu'; ?> <div class="hu-megamenu-cell" data-rowid="<?php echo $rowId; ?>" data-columnid="<?php echo $columnId; ?>" data-cellid="<?php echo $cellId; ?>"> <span><?php echo $builder->getTitle($cell); ?></span> <small class="hu-badge hu-badge-info hu-megamenu-badge"><?php echo $badgeText; ?></small> <button class="hu-btn hu-btn-link hu-megamenu-cell-remove"> <span class="fas fa-times-circle" aria-hidden="true"></span> </button> </div>PKCA#]lŋ8��2system/helixultimate/layout/megaMenu/container.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Uri\Uri; extract($displayData); $sidebarLayout = new FileLayout('megaMenu.sidebar', HELIX_LAYOUT_PATH); $gridLayout = new FileLayout('megaMenu.grid', HELIX_LAYOUT_PATH); $settings = $builder->getMegaMenuSettings(); if (!class_exists('MegaFields')) { require_once __DIR__ . '/megaFields.php'; } ?> <div class="hu-megamenu-container hu-d-flex hu-justify-content-between"> <?php echo $sidebarLayout->render(['itemId' => $itemId, 'builder' => $builder, 'settings' => $settings]); ?> <?php echo $gridLayout->render(['itemId' => $itemId, 'builder' => $builder, 'settings' => $settings]); ?> <div class="hu-megamenu-popover"> <div class="hu-megamenu-popover-heading"> <h5 class="title"><?php echo Text::_('HELIX_ULTIMATE_MENU_MODULE_LIST'); ?></h5> <button class="hu-btn hu-btn-link hu-megamenu-popover-close"> <span class="fas fa-times" aria-hidden="true"></span> </button> </div> <div class="hu-megamenu-popover-body"> <div class="hu-megamenu-search-wrapper"> <span class="fas fa-search" aria-hidden="true"></span> <input type="search" class="hu-input hu-megamenu-module-search" placeholder="<?php echo Text::_('HELIX_ULTIMATE_SEARCH_ITEM'); ?>" /> </div> <div class="hu-megamenu-modules-container"> </div> </div> </div> <input type="hidden" id="hu-megamenu-layout-settings" value='<?php echo json_encode($settings); ?>' /> <input type="hidden" id="hu-base-url" value="<?php echo Uri::root(); ?>" /> <input type="hidden" id="hu-menu-itemid" value="<?php echo $itemId; ?>" /> </div>PKCA#]�4h�44,system/helixultimate/layout/megaMenu/row.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Uri\Uri; extract($displayData); $columns = []; if (!empty($row) && isset($row->attr)) { $columns = $row->attr; } $columnLayout = new FileLayout('megaMenu.column', HELIX_LAYOUT_PATH); $slotLayout = new FileLayout('megaMenu.slots', HELIX_LAYOUT_PATH); ?> <div class="hu-megamenu-row-wrapper" data-rowid="<?php echo $rowId; ?>"> <div class="hu-megamenu-row-toolbar"> <div class="hu-megamenu-row-toolbar-left hu-megamenu-row-drag-handlers"> <svg xmlns="http://www.w3.org/2000/svg" width="15" height="8"><path fill-rule="evenodd" d="M1.5 3a1.5 1.5 0 100-3 1.5 1.5 0 000 3zm0 5a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM9 1.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM7.5 8a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM15 1.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM13.5 8a1.5 1.5 0 100-3 1.5 1.5 0 000 3z" clip-rule="evenodd"></path></svg> <span>Row</span> </div> <div class="hu-megamenu-row-toolbar-right"> <a href="#" class="hu-megamenu-columns"> <svg xmlns="http://www.w3.org/2000/svg" width="13" height="11"><path d="M.996 4.805h3.926c.662 0 1.002-.323 1.002-1.014V1.02C5.924.322 5.584 0 4.922 0H.996C.34 0 0 .322 0 1.02V3.79c0 .691.34 1.014.996 1.014zm6.932 0h3.926c.662 0 1.002-.323 1.002-1.014V1.02c0-.698-.34-1.02-1.002-1.02H7.928c-.657 0-.996.322-.996 1.02V3.79c0 .691.34 1.014.996 1.014zm-6.92-.65c-.252 0-.363-.112-.363-.376V1.02c0-.251.11-.369.363-.369H4.91c.252 0 .363.118.363.37v2.76c0 .263-.11.374-.363.374H1.008zm6.937 0c-.258 0-.369-.112-.369-.376V1.02c0-.251.112-.369.37-.369h3.896c.252 0 .363.118.363.37v2.76c0 .263-.111.374-.363.374H7.945zM.996 10.61h3.926c.662 0 1.002-.322 1.002-1.013V6.826c0-.691-.34-1.013-1.002-1.013H.996C.34 5.813 0 6.135 0 6.825v2.772c0 .691.34 1.013.996 1.013zm6.932 0h3.926c.662 0 1.002-.322 1.002-1.013V6.826c0-.691-.34-1.013-1.002-1.013H7.928c-.657 0-.996.322-.996 1.013v2.772c0 .691.34 1.013.996 1.013zm-6.92-.644c-.252 0-.363-.117-.363-.375v-2.76c0-.258.11-.375.363-.375H4.91c.252 0 .363.117.363.375v2.76c0 .258-.11.375-.363.375H1.008zm6.937 0c-.258 0-.369-.117-.369-.375v-2.76c0-.258.112-.375.37-.375h3.896c.252 0 .363.117.363.375v2.76c0 .258-.111.375-.363.375H7.945z"></path></svg> </a> <a href="#" class="hu-megamenu-remove-row"> <svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><path d="M9.592 11.648l.433-8.748h.844a.335.335 0 00.334-.34.335.335 0 00-.334-.34H8.098V1.3c0-.773-.545-1.3-1.389-1.3h-2.22c-.844 0-1.384.527-1.384 1.3v.92H.34a.348.348 0 00-.34.34c0 .188.158.34.34.34h.844l.433 8.748c.041.75.569 1.266 1.33 1.266h5.315c.756 0 1.295-.516 1.33-1.266zM3.826 1.336c0-.38.281-.662.71-.662h2.132c.422 0 .715.281.715.662v.885H3.826v-.885zm-.82 10.898a.68.68 0 01-.68-.662L1.893 2.9h7.412l-.416 8.672a.682.682 0 01-.686.662H3.006zm4.348-1.148c.158 0 .275-.123.28-.293l.188-6.404c.006-.17-.111-.305-.275-.305-.147 0-.27.135-.27.299l-.193 6.398c0 .17.111.305.27.305zm-3.499 0c.159 0 .276-.135.27-.305l-.193-6.398c0-.164-.13-.299-.276-.299-.158 0-.275.129-.27.305l.194 6.404c.006.17.117.293.275.293zm1.752 0c.153 0 .282-.135.282-.299V4.39c0-.17-.13-.305-.282-.305-.152 0-.28.135-.28.305v6.398c0 .164.128.299.28.299z"></path></svg> </a> <div class="hu-megamenu-row-slots"> <?php echo $slotLayout->render(); ?> </div> </div> </div> <div class="row hu-megamenu-columns-container"> <?php foreach ($columns as $key => $column): ?> <?php echo $columnLayout->render([ 'itemId' => $itemId, 'builder' => $builder, 'column' => $column, 'rowId' => $rowId, 'columnId' => $key + 1 ]); ?> <?php endforeach ?> </div> </div>PKCA#]r��X��3system/helixultimate/layout/megaMenu/megaFields.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Core\Lib\FontawesomeIcons; use Joomla\CMS\Language\Text; /** * Fields definition for the mega menu fields. * * @since 2.0.0 */ class MegaFields { /** * Mega menu settings array. * * @var object The mega menu settings. * @since 2.0.0 */ private $settings = null; /** * Menu Item Id * * @var int $itemId The menu item id. * @since 2.0.0 */ private $itemId = 0; /** * Constructor function for the class. * * @param array $settings The mega menu settings array. * * @since 2.0.0 */ public function __construct($settings, $itemId) { $this->settings = $settings; $this->itemId = $itemId; } /** * Make font awesome options for the listing. * * @return array the options array. * @since 2.0.0 */ private function getFontOptions() { $fontawesome = new FontawesomeIcons; $icons = $fontawesome->getIcons(); $options = []; /** Set an empty option for working the chosen deselect functionality. */ $options[''] = ''; foreach ($icons as $icon) { $iconName = preg_replace("@^fa[sbr]\s+fa-@", '', $icon); $iconName = array_map(function($name) { return ucfirst($name); }, explode('-', $iconName)); $options[$icon] = implode(' ', $iconName); } return $options; } public function getSidebarFields() { return [ 'megamenu' => [ 'type' => 'checkbox', 'title' => Text::_('HELIX_ULTIMATE_ENABLE_MEGA_MENU'), 'menu-builder' => true, 'data' => ['itemid' => $this->itemId], 'value' => $this->settings->megamenu ?? '', 'internal' => true, ], 'width' => [ 'type' => 'unit', 'title' => Text::_('HELIX_ULTIMATE_MEGA_MENU_WIDTH'), 'menu-builder' => true, 'data' => ['itemid' => $this->itemId], 'value' => $this->settings->width ?? '600px', 'internal' => true, ], 'showtitle' => [ 'type' => 'checkbox', 'title' => Text::_('HELIX_ULTIMATE_SHOW_MENU_TITLE'), 'menu-builder' => true, 'data' => ['itemid' => $this->itemId], 'value' => $this->settings->showtitle ?? '0', 'internal' => true, ], 'menualign' => [ 'type' => 'select', 'title' => Text::_('HELIX_ULTIMATE_MEGA_MENU_ALIGNMENT'), 'menu-builder' => true, 'data' => ['itemid' => $this->itemId], 'options' => [ 'left' => Text::_('HELIX_ULTIMATE_GLOBAL_LEFT'), 'center' => Text::_('HELIX_ULTIMATE_GLOBAL_CENTER'), 'right' => Text::_('HELIX_ULTIMATE_GLOBAL_RIGHT'), 'full' => Text::_('HELIX_ULTIMATE_GLOBAL_FULL'), ], 'value' => $this->settings->menualign ?? 'left', 'internal' => true, ], 'faicon' => [ 'type' => 'select', 'title' => Text::_('HELIX_ULTIMATE_MENU_ICON'), 'menu-builder' => true, 'options' => $this->getFontOptions(), 'data' => ['itemid' => $this->itemId, 'husearch' => 1], 'value' => $this->settings->faicon ?? '', 'internal' => true, ], 'dropdown' => [ 'type' => 'select', 'title' => Text::_('HELIX_ULTIMATE_MENU_DROPDOWN_POSITION'), 'menu-builder' => true, 'data' => ['itemid' => $this->itemId], 'options' => [ 'left' => Text::_('HELIX_ULTIMATE_GLOBAL_LEFT'), 'right' => Text::_('HELIX_ULTIMATE_GLOBAL_RIGHT'), ], 'value' => $this->settings->dropdown ?? 'right', 'internal' => true, ], 'customclass' => [ 'type' => 'text', 'title' => Text::_('HELIX_ULTIMATE_MENU_EXTRA_CLASS'), 'placeholder' => Text::_('HELIX_ULTIMATE_MENU_EXTRA_CLASS_PLACEHOLDER'), 'menu-builder' => true, 'data' => ['itemid' => $this->itemId], 'value' => $this->settings->customclass ?? '', 'internal' => true, ], 'badge' => [ 'type' => 'text', 'title' => Text::_('HELIX_ULTIMATE_MENU_BADGE_TEXT'), 'placeholder' => Text::_('HELIX_ULTIMATE_MENU_BADGE_TEXT'), 'menu-builder' => true, 'data' => ['itemid' => $this->itemId], 'value' => $this->settings->badge ?? '', 'internal' => true, ], 'badge_position' => [ 'type' => 'select', 'title' => Text::_('HELIX_ULTIMATE_MENU_BADGE_POSITION'), 'menu-builder' => true, 'data' => ['itemid' => $this->itemId], 'options' => [ 'left' => Text::_('HELIX_ULTIMATE_GLOBAL_LEFT'), 'right' => Text::_('HELIX_ULTIMATE_GLOBAL_RIGHT'), ], 'value' => $this->settings->badge_position ?? 'right', 'internal' => true, ], 'badge_bg_color' => [ 'type' => 'color', 'title' => Text::_('HELIX_ULTIMATE_MENU_BADGE_BACKGROUND'), 'menu-builder' => true, 'data' => ['itemid' => $this->itemId], 'value' => $this->settings->badge_bg_color ?? '', 'internal' => true, ], 'badge_text_color' => [ 'type' => 'color', 'title' => Text::_('HELIX_ULTIMATE_MENU_BADGE_COLOR'), 'menu-builder' => true, 'data' => ['itemid' => $this->itemId], 'value' => $this->settings->badge_text_color ?? '', 'internal' => true, ] ]; } }PKCA#]�a�/system/helixultimate/layout/megaMenu/column.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Uri\Uri; extract($displayData); $cellLayout = new FileLayout('megaMenu.cell', HELIX_LAYOUT_PATH); $cells = []; if (!empty($column->items)) { $cells = $column->items; } ?> <div class="hu-megamenu-col col-<?php echo $column->colGrid; ?>" data-rowid="<?php echo $rowId; ?>" data-columnid="<?php echo $columnId; ?>"> <div class="hu-megamenu-column-contents-wrapper"> <div class="hu-megamenu-column-toolbar hu-megamenu-column-drag-handler"> <svg xmlns="http://www.w3.org/2000/svg" width="15" height="8"><path fill-rule="evenodd" d="M1.5 3a1.5 1.5 0 100-3 1.5 1.5 0 000 3zm0 5a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM9 1.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM7.5 8a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM15 1.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM13.5 8a1.5 1.5 0 100-3 1.5 1.5 0 000 3z" clip-rule="evenodd"></path></svg> <span>Column</span> </div> <div class="hu-megamenu-column-contents"> <?php foreach ($cells as $key => $cell): ?> <?php echo $cellLayout->render([ 'itemId' => $itemId, 'builder' => $builder, 'cell' => $cell, 'rowId' => $rowId, 'columnId' => $columnId, 'cellId' => $key + 1 ]); ?> <?php endforeach ?> </div> <div class="hu-megamenu-add-item-wrapper"> <button class="hu-megamenu-add-new-item" title="Add Module"> <span class="fas fa-plus-circle" aria-hidden="true"></span> </button> <ul class="hu-megamenu-cell-options" style="display: none;"> <li><a href="#" class="hu-megamenu-cell-options-item" data-type="menu"><?php echo Text::_('Menu Item'); ?></a></li> <li><a href="#" class="hu-megamenu-cell-options-item" data-type="module"><?php echo Text::_('Module'); ?></a></li> </ul> </div> </div> </div> PKCA#]xh�0system/helixultimate/layout/megaMenu/modules.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Uri\Uri; extract($displayData); $modules = Helper::getModules($keyword); $children = $children ?? []; ?> <div class="hu-switcher hu-switcher-inline hu-switcher-style-tab hu-switcher-style-tab-sm" style="margin-bottom: 1rem;"> <div class="hu-action-group"> <span id="toggle-module-btn" data-value="module" class="hu-switcher-action active" role="button" onclick="toggleMegaMenuView('module')"> <?php echo Text::_('HELIX_ULTIMATE_MODULES'); ?> </span> <span id="toggle-menu-btn" data-value="menu" class="hu-switcher-action" role="button" onclick="toggleMegaMenuView('menu')"> <?php echo Text::_('HELIX_ULTIMATE_MENU_ITEMS'); ?> </span> </div> </div> <div id="hu-megamenu-module-section" style="display: block;"> <?php if (!empty($modules)): ?> <div class="row"> <?php foreach ($modules as $module): ?> <div class="col-4 hu-megamenu-column"> <div class="hu-megamenu-module-item"> <strong class="hu-megamenu-module-title"><?php echo $module->title; ?></strong> <p class="hu-megamenu-module-desc"><?php echo (strlen($module->desc) > 80 ? substr($module->desc, 0, 80) . '...' : $module->desc); ?></p> <button type="button" role="button" class="hu-btn hu-btn-default hu-megamenu-insert-module" data-module="<?php echo $module->id; ?>"><?php echo Text::_('HELIX_ULTIMATE_MODULE_INSERT'); ?></button> </div> </div> <?php endforeach ?> </div> <?php else: ?> <div class="hu-megamenu-module-not-found"> <h4><?php echo Text::_('HELIX_ULTIMATE_NOTHING_FOUND'); ?></h4> </div> <?php endif ?> </div> <div id="hu-megamenu-menu-section" style="display: none;"> <?php if (!empty($children)): ?> <div class="row"> <?php foreach ($children as $child): ?> <div class="col-4 hu-megamenu-column"> <div class="hu-megamenu-module-item"> <strong class="hu-megamenu-module-title"><?php echo htmlspecialchars($child->title, ENT_QUOTES, 'UTF-8'); ?></strong> <p class="hu-megamenu-module-desc"><?php echo !empty($child->desc) ? (strlen($child->desc) > 80 ? substr($child->desc, 0, 80) . '...' : $child->desc) : ''; ?></p> <button type="button" role="button" class="hu-btn hu-btn-default hu-megamenu-insert-menu" data-child="<?php echo $child->id; ?>"> <?php echo Text::_('HELIX_ULTIMATE_MENU_INSERT'); ?> </button> </div> </div> <?php endforeach; ?> </div> <?php else: ?> <div class="hu-megamenu-module-not-found"> <h4><?php echo Text::_('HELIX_ULTIMATE_NOTHING_FOUND'); ?></h4> </div> <?php endif; ?> </div> <script> function toggleMegaMenuView(type) { const menuSection = document.getElementById('hu-megamenu-menu-section'); const moduleSection = document.getElementById('hu-megamenu-module-section'); const menuBtn = document.getElementById('toggle-menu-btn'); const moduleBtn = document.getElementById('toggle-module-btn'); if (type === 'module') { moduleSection.style.display = 'block'; menuSection.style.display = 'none'; moduleBtn.classList.add('active'); menuBtn.classList.remove('active'); } else { moduleSection.style.display = 'none'; menuSection.style.display = 'block'; moduleBtn.classList.remove('active'); menuBtn.classList.add('active'); } } </script> PKCA#]�Ƀa0system/helixultimate/layout/megaMenu/sidebar.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Uri\Uri; extract($displayData); $megaFields = new MegaFields($settings, $itemId); $fields = $megaFields->getSidebarFields(); $item = $builder->getMenuItem(); ?> <div class="hu-megamenu-sidebar"> <?php if ((int) $item->parent_id === 1): ?> <?php echo $builder->renderFieldElement('megamenu', $fields['megamenu']); ?> <?php endif ?> <div class="hu-megamenu-settings"> <?php if ((int) $item->parent_id === 1): ?> <?php echo $builder->renderFieldElement('width', $fields['width']); ?> <?php endif ?> </div> <?php echo $builder->renderFieldElement('showtitle', $fields['showtitle']); ?> <div class="hu-d-flex hu-justify-content-between"> <?php if ((int) $item->parent_id === 1): ?> <div class="hu-megamenu-alignment"> <?php echo $builder->renderFieldElement('menualign', $fields['menualign']); ?> </div> <?php endif ?> <div class="hu-menuitem-dropdown-position"> <?php echo $builder->renderFieldElement('dropdown', $fields['dropdown']); ?> </div> <?php echo $builder->renderFieldElement('faicon', $fields['faicon']); ?> </div> <?php echo $builder->renderFieldElement('customclass', $fields['customclass']); ?> <hr /> <div class="hu-d-flex hu-justify-content-between"> <?php echo $builder->renderFieldElement('badge', $fields['badge']); ?> <?php echo $builder->renderFieldElement('badge_position', $fields['badge_position']); ?> </div> <?php echo $builder->renderFieldElement('badge_bg_color', $fields['badge_bg_color']); ?> <?php echo $builder->renderFieldElement('badge_text_color', $fields['badge_text_color']); ?> </div>PKCA#]�#��3�31system/helixultimate/layout/settings/settings.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; function column_grid_system($device = 'lg') { $col = array(0 => 'Inherit'); for ($i = 1; $i <= 12; $i++) { if ($device === 'xs') { $col[$i] = 'col-' . $i; } else { $col[$i] = 'col-' . $device . '-' . $i; } } return $col; } $rowSettings = array( 'type' => 'general', 'title' => '', 'attr' => array( 'name' => array( 'type' => 'text', 'group' => 'general', 'title' => Text::_('HELIX_ULTIMATE_SECTION_TITLE'), 'desc' => Text::_('HELIX_ULTIMATE_SECTION_TITLE_DESC') ), 'fluidrow' => array( 'type' => 'checkbox', 'group' => 'general', 'title' => Text::_('HELIX_ULTIMATE_ROW_FULL_WIDTH'), 'desc' => Text::_('HELIX_ULTIMATE_ROW_FULL_WIDTH_DESC') ), 'custom_class' => array( 'type' => 'text', 'group' => 'general', 'title' => Text::_('HELIX_ULTIMATE_CUSTOM_CLASS'), 'desc' => Text::_('HELIX_ULTIMATE_CUSTOM_CLASS_DESC'), 'std' => '' ), 'padding' => array( 'type' => 'text', 'group' => 'style', 'title' => Text::_('HELIX_ULTIMATE_PADDING'), 'placeholder' => '0px 0px 0px 0px' ), 'margin' => array( 'type' => 'text', 'group' => 'style', 'title' => Text::_('HELIX_ULTIMATE_MARGIN'), 'placeholder' => '0px 0px 0px 0px' ), 'color' => array( 'type' => 'color', 'group' => 'style', 'title' => Text::_('HELIX_ULTIMATE_SECTION_TEXT_COLOR') ), 'link_color' => array( 'type' => 'color', 'group' => 'style', 'title' => Text::_('HELIX_ULTIMATE_LINK_COLOR') ), 'link_hover_color' => array( 'type' => 'color', 'group' => 'style', 'title' => Text::_('HELIX_ULTIMATE_LINK_HOVER_COLOR') ), 'background_color' => array( 'type' => 'color', 'group' => 'style', 'title' => Text::_('HELIX_ULTIMATE_SECTION_BACKGROUND_COLOR') ), 'background_image' => array( 'type' => 'media', 'group' => 'style', 'title' => Text::_('HELIX_ULTIMATE_SECTION_BACKGROUND_IMAGE') ), 'background_repeat' => array( 'type' => 'select', 'group' => 'style', 'title' => Text::_('HELIX_ULTIMATE_BACKGROUND_REPEAT'), 'values' => array( 'no-repeat' => Text::_('HELIX_ULTIMATE_BACKGROUND_REPEAT_NO'), 'repeat' => Text::_('HELIX_ULTIMATE_BACKGROUND_REPEAT_ALL'), 'repeat-x' => Text::_('HELIX_ULTIMATE_BACKGROUND_REPEAT_HORIZ'), 'repeat-y' => Text::_('HELIX_ULTIMATE_BACKGROUND_REPEAT_VERTI'), 'inherit' => Text::_('HELIX_ULTIMATE_BACKGROUND_REPEAT_INHERIT'), ) ), 'background_size' => array( 'type' => 'select', 'group' => 'style', 'title' => Text::_('HELIX_ULTIMATE_BACKGROUND_SIZE'), 'values' => array( 'cover' => Text::_('HELIX_ULTIMATE_BACKGROUND_COVER'), 'contain' => Text::_('HELIX_ULTIMATE_BACKGROUND_CONTAIN'), 'inherit' => Text::_('HELIX_ULTIMATE_BACKGROUND_INHERIT'), ) ), 'background_attachment' => array( 'type' => 'select', 'group' => 'style', 'title' => Text::_('HELIX_ULTIMATE_BACKGROUND_ATTACHMENT'), 'values' => array( 'fixed' => Text::_('HELIX_ULTIMATE_BACKGROUND_ATTACHMENT_FIXED'), 'scroll' => Text::_('HELIX_ULTIMATE_BACKGROUND_ATTACHMENT_SCROLL'), 'inherit' => Text::_('HELIX_ULTIMATE_BACKGROUND_ATTACHMENT_INHERIT'), ) ), 'background_position' => array( 'type' => 'select', 'group' => 'style', 'title' => Text::_('HELIX_ULTIMATE_BACKGROUND_POSITION'), 'values' => array( '0 0' => Text::_('HELIX_ULTIMATE_BACKGROUND_POSITION_LEFT_TOP'), '0 50%' => Text::_('HELIX_ULTIMATE_BACKGROUND_POSITION_LEFT_CENTER'), '0 100%' => Text::_('HELIX_ULTIMATE_BACKGROUND_POSITION_LEFT_BOTTOM'), '50% 0' => Text::_('HELIX_ULTIMATE_BACKGROUND_POSITION_CENTER_TOP'), '50% 50%' => Text::_('HELIX_ULTIMATE_BACKGROUND_POSITION_CENTER_CENTER'), '50% 100%' => Text::_('HELIX_ULTIMATE_BACKGROUND_POSITION_CENTER_BOTTOM'), '100% 0' => Text::_('HELIX_ULTIMATE_BACKGROUND_POSITION_RIGHT_TOP'), '100% 50%' => Text::_('HELIX_ULTIMATE_BACKGROUND_POSITION_RIGHT_CENTER'), '100% 100%' => Text::_('HELIX_ULTIMATE_BACKGROUND_POSITION_RIGHT_BOTTOM'), ) ), 'hide_on_phone' => array( 'type' => 'checkbox', 'group' => 'responsive', 'title' => Text::_('HELIX_ULTIMATE_HIDDEN_PHONE') ), 'hide_on_large_phone' => array( 'type' => 'checkbox', 'group' => 'responsive', 'title' => Text::_('HELIX_ULTIMATE_HIDDEN_LARGER_PHONE') ), 'hide_on_tablet' => array( 'type' => 'checkbox', 'group' => 'responsive', 'title' => Text::_('HELIX_ULTIMATE_HIDDEN_TABLET') ), 'hide_on_small_desktop' => array( 'type' => 'checkbox', 'group' => 'responsive', 'title' => Text::_('HELIX_ULTIMATE_HIDDEN_SMALL_DESKTOP') ), 'hide_on_desktop' => array( 'type' => 'checkbox', 'group' => 'responsive', 'title' => Text::_('HELIX_ULTIMATE_HIDDEN_DESKTOP') ), 'hide_on_ex_large_desktop' => array( 'type' => 'checkbox', 'group' => 'responsive', 'title' => Text::_('HELIX_ULTIMATE_HIDDEN_EXTRA_LARGE_DESKTOP') ) ) ); $columnSettings = array( 'type' => 'general', 'title' => '', 'attr' => array( 'column_type' => array( 'type' => 'checkbox', 'group' => 'general', 'title' => Text::_('HELIX_ULTIMATE_COMPONENT'), 'desc' => Text::_('HELIX_ULTIMATE_COMPONENT_DESC'), 'std' => '', ), 'name' => array( 'type' => 'select', 'group' => 'general', 'title' => Text::_('HELIX_ULTIMATE_MODULE_POSITION'), 'desc' => Text::_('HELIX_ULTIMATE_MODULE_POSITION_DESC'), 'values' => array(), 'std' => 'none', ), 'sticky_position' => array( 'type' => 'checkbox', 'group' => 'general', 'title' => Text::_('HELIX_ULTIMATE_STICKY_POSITION'), 'desc' => Text::_('HELIX_ULTIMATE_STICKY_POSITION_DESC'), 'std' => '', ), 'custom_class' => array( 'type' => 'text', 'group' => 'general', 'title' => Text::_('HELIX_ULTIMATE_CUSTOM_CLASS'), 'desc' => Text::_('HELIX_ULTIMATE_CUSTOM_CLASS_DESC'), 'std' => '' ), 'xxl_col' => array( 'type' => 'select', 'group' => 'grid', 'title' => Text::_('HELIX_ULTIMATE_EXTRA_LARGER_DESKTOP_GRID'), 'values' => column_grid_system('xxl'), 'std' => 0, ), 'xl_col' => array( 'type' => 'select', 'group' => 'grid', 'title' => Text::_('HELIX_ULTIMATE_LARGER_DESKTOP_GRID'), 'values' => column_grid_system('xl'), 'std' => 0, ), 'lg_col' => array( 'type' => 'select', 'group' => 'grid', 'title' => Text::_('HELIX_ULTIMATE_SMALLER_DESKTOP_GRID'), 'values' => column_grid_system('lg'), 'std' => 0, ), 'md_col' => array( 'type' => 'select', 'group' => 'grid', 'title' => Text::_('HELIX_ULTIMATE_TABLET_GRID'), 'values' => column_grid_system('md'), 'std' => 0, ), 'sm_col' => array( 'type' => 'select', 'group' => 'grid', 'title' => Text::_('HELIX_ULTIMATE_LARGER_PHONE_GRID'), 'values' => column_grid_system('sm'), 'std' => 0, ), 'xs_col' => array( 'type' => 'select', 'group' => 'grid', 'title' => Text::_('HELIX_ULTIMATE_PHONE_GRID'), 'values' => column_grid_system('xs'), 'std' => 0, ), 'hide_on_phone' => array( 'type' => 'checkbox', 'group' => 'responsive', 'title' => Text::_('HELIX_ULTIMATE_HIDDEN_PHONE') ), 'hide_on_large_phone' => array( 'type' => 'checkbox', 'group' => 'responsive', 'title' => Text::_('HELIX_ULTIMATE_HIDDEN_LARGER_PHONE') ), 'hide_on_tablet' => array( 'type' => 'checkbox', 'group' => 'responsive', 'title' => Text::_('HELIX_ULTIMATE_HIDDEN_TABLET') ), 'hide_on_small_desktop' => array( 'type' => 'checkbox', 'group' => 'responsive', 'title' => Text::_('HELIX_ULTIMATE_HIDDEN_SMALL_DESKTOP') ), 'hide_on_desktop' => array( 'type' => 'checkbox', 'group' => 'responsive', 'title' => Text::_('HELIX_ULTIMATE_HIDDEN_DESKTOP') ), 'hide_on_ex_large_desktop' => array( 'type' => 'checkbox', 'group' => 'responsive', 'title' => Text::_('HELIX_ULTIMATE_HIDDEN_EXTRA_LARGE_DESKTOP') ) ) ); /** * Row colum settings. * * @since 1.0.0 */ class RowColumnSettings { /** * Get the input elements by key attributes. * * @param string $key The field key * @param array $attr Field attributes * * @return string * @since 1.0.0 */ private static function getInputElements($key, $attr) { return call_user_func(array('HelixultimateField' . ucfirst($attr['type']), 'getInput'), $key, $attr); } /** * Get row settings. * * @param array $row_settings Row settings * * @return string Row string * @since 1.0.0 */ static public function getRowSettings($row_settings = array()) { $output = '<div style="display: none;">'; $output .= '<div id="hu-row-settings">'; $options = array(); foreach ($row_settings['attr'] as $key => $rowAttr) { if (isset($rowAttr['group']) && $rowAttr['group']) { $options[$rowAttr['group']][$key] = $rowAttr; unset($rowAttr['group']); } else { $options['general'][$key] = $rowAttr; } } $i = 0; foreach ($options as $key2 => $option_list) { $active = ''; if ((int) $i === 0) { $active = ' active'; } $output .= '<div class="hu-option-group hu-option-group-' . strtolower($key2) . $active . '">'; $output .= '<div class="hu-option-group-title">'; $output .= '<span class="fas fa-angle-right" aria-hidden="true"></span>' . Text::_('HELIX_ULTIMATE_OPTION_GROUP_' . strtoupper($key2)); $output .= '</div>'; $output .= '<div class="hu-option-group-list">'; foreach ($option_list as $key3 => $option) { $output .= self::getInputElements($key3, $option); } $output .= '</div>'; $output .= '</div>'; $i++; } $output .= '</div>'; $output .= '</div>'; return $output; } /** * Get column settings. * * @param array $col_settings Columns settings * * @return string column settings. * @since 1.0.0 */ static public function getColumnSettings($col_settings = array()) { $col_settings['attr']['name']['values'] = self::getPositions(); $output = '<div style="display: none;">'; $output .= '<div id="hu-column-settings">'; $options = array(); foreach ($col_settings['attr'] as $key => $colAttr) { if (isset($colAttr['group']) && $colAttr['group']) { $options[$colAttr['group']][$key] = $colAttr; unset($colAttr['group']); } else { $options['general'][$key] = $colAttr; } } $i = 0; foreach ($options as $key2 => $option_list) { $active = ''; if ((int) $i === 0) { $active = ' active'; } $output .= '<div class="hu-option-group hu-option-group-' . strtolower($key2) . $active . '">'; $output .= '<div class="hu-option-group-title">'; $output .= '<span class="fas fa-angle-right" aria-hidden="true"></span>' . Text::_('HELIX_ULTIMATE_OPTION_GROUP_' . strtoupper($key2)); $output .= '</div>'; $output .= '<div class="hu-option-group-list">'; foreach ($option_list as $key3 => $option) { $output .= self::getInputElements($key3, $option); } $output .= '</div>'; $output .= '</div>'; $i++; } $output .= '</div>'; $output .= '</div>'; return $output; } /** * Get template name * * @return string template name * @since 1.0.0 */ static public function getTemplateName() { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName(array('template'))); $query->from($db->quoteName('#__template_styles')); $query->where($db->quoteName('client_id') . ' = 0'); $query->where($db->quoteName('home') . ' = ' . $db->quote('1', false)); $db->setQuery($query); return $db->loadObject()->template; } /** * Get module positions */ static public function getPositions() { $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName('position')); $query->from($db->quoteName('#__modules')); $query->where($db->quoteName('client_id') . ' = 0'); $query->where($db->quoteName('published') . ' = 1'); $query->group('position'); $query->order('position ASC'); $db->setQuery($query); $dbpositions = $db->loadObjectList(); $template = self::getTemplateName(); $templateXML = JPATH_SITE . '/templates/' . $template . '/templateDetails.xml'; $templateXml = simplexml_load_file($templateXML); $options = array(); foreach ($dbpositions as $positions) { $options[] = $positions->position; } foreach ($templateXml->positions[0] as $position) { $options[] = (string) $position; } ksort($options); $opts = array_unique($options); $options = array(); foreach ($opts as $opt) { $options[$opt] = $opt; } return $options; } /** * Get settings * * @param array $config The configuration array * * @return string settings HTML * @since 1.0.0 */ static public function getSettings($config = null) { $data = ''; if (!empty($config)) { foreach ($config as $key => $value) { $data .= ' data-' . $key . '="' . $value . '"'; } } return $data; } } PKCA#]�����/system/helixultimate/layout/settings/fields.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Filesystem\Folder; /** * Fields helper * * @since 1.0.0 */ class HelixUltimateFieldsHelper { protected function __construct() { $fields = Folder::files(dirname(__FILE__) . '/fields', '\.php$', false, true); foreach ($fields as $field) { require_once $field; } } protected static function getInputElements($key, $attr) { return call_user_func(array('HelixultimateField' . ucfirst($attr['field']), 'getInput'), $key, $attr); } } PKCA#]�F���5system/helixultimate/overrides/mod_search/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Router\Route; ?> <div class="search"> <form action="<?php echo Route::_('index.php'); ?>" method="post"> <?php $output = '<label for="mod-search-searchword' . $module->id . '" class="hide-label">' . $label . '</label> '; $input = '<input name="searchword" id="mod-search-searchword' . $module->id . '" class="form-control" type="search" placeholder="' . $text . '">'; $output .= ''; if ($button) : if ($imagebutton) : $btn_output = '<input type="image" alt="' . $button_text . '" class="btn btn-primary" src="' . $img . '" onclick="this.form.searchword.focus();">'; else : $btn_output = '<button class="btn btn-primary" onclick="this.form.searchword.focus();">' . $button_text . '</button>'; endif; $output .= '<div class="input-group">'; $output .= $input; $output .= '<span class="input-group-btn">'; $output .= $btn_output; $output .= '</span>'; $output .= '</div>'; else : $output .= $input; endif; echo $output; ?> <input type="hidden" name="task" value="search"> <input type="hidden" name="option" value="com_search"> <input type="hidden" name="Itemid" value="<?php echo $mitemid; ?>"> </form> </div> PKCA#]i�̩�*system/helixultimate/overrides/modules.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); function modChrome_sp_xhtml($module, $params, $attribs) { $moduleTag = htmlspecialchars($params->get('module_tag', 'div') ?? "", ENT_QUOTES, 'UTF-8'); $bootstrapSize = (int) $params->get('bootstrap_size', 0); $moduleClass = $bootstrapSize !== 0 ? ' span' . $bootstrapSize : ''; $headerTag = htmlspecialchars($params->get('header_tag', 'h3') ?? "", ENT_QUOTES, 'UTF-8'); $headerClass = htmlspecialchars($params->get('header_class', 'sp-module-title') ?? "", ENT_COMPAT, 'UTF-8'); if ($module->content) { echo '<' . $moduleTag . ' class="sp-module ' . htmlspecialchars($params->get('moduleclass_sfx') ?? "", ENT_COMPAT, 'UTF-8') . $moduleClass . '">'; if ($module->showtitle) { echo '<' . $headerTag . ' class="' . $headerClass . '">' . $module->title . '</' . $headerTag . '>'; } echo '<div class="sp-module-content">'; echo $module->content; echo '</div>'; echo '</' . $moduleTag . '>'; } }PKCA#]�T�3��Asystem/helixultimate/overrides/com_search/search/default_form.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; $lang = Factory::getLanguage(); $upper_limit = $lang->getUpperLimitSearchWord(); ?> <form id="searchForm" action="<?php echo Route::_('index.php?option=com_search'); ?>" method="post"> <div class="mb-3"> <div class="input-group"> <input type="text" name="searchword" placeholder="<?php echo Text::_('COM_SEARCH_SEARCH_KEYWORD'); ?>" id="search-searchword" maxlength="<?php echo $upper_limit; ?>" value="<?php echo $this->escape($this->origkeyword); ?>" class="form-control"> <div class="input-group-text"> <button name="Search" onclick="this.form.submit()" class="btn btn-secondary"> <span class="fas fa-search" aria-hidden="true"></span> <?php echo Text::_('JSEARCH_FILTER_SUBMIT'); ?> </button> </div> </div> <input type="hidden" name="task" value="search"> </div> <div class="mb-3 searchintro<?php echo $this->params->get('pageclass_sfx'); ?>"> <?php if (!empty($this->searchword)) : ?> <p> <?php echo Text::plural('COM_SEARCH_SEARCH_KEYWORD_N_RESULTS', '<span class="badge badge-info">' . $this->total . '</span>'); ?> </p> <?php endif; ?> </div> <?php if ($this->params->get('search_phrases', 1)) : ?> <fieldset> <legend> <?php echo Text::_('COM_SEARCH_FOR'); ?> </legend> <div class="mb-3"> <?php echo $this->lists['searchphrase']; ?> </div> <div class="mb-3"> <label for="ordering" class="me-2"> <?php echo Text::_('COM_SEARCH_ORDERING'); ?> </label> <?php echo $this->lists['ordering']; ?> </div> </fieldset> <hr> <?php endif; ?> <?php if ($this->params->get('search_areas', 1)) : ?> <div class="mb-3"> <fieldset> <legend> <?php echo Text::_('COM_SEARCH_SEARCH_ONLY'); ?> </legend> <?php foreach ($this->searchareas['search'] as $val => $txt) : ?> <div class="form-check form-check-inline"> <?php $checked = is_array($this->searchareas['active']) && in_array($val, $this->searchareas['active']) ? 'checked="checked"' : ''; ?> <input type="checkbox" class="form-check-input" name="areas[]" value="<?php echo $val; ?>" id="area-<?php echo $val; ?>" <?php echo $checked; ?>> <label for="area-<?php echo $val; ?>" class="form-check-label"><?php echo Text::_($txt); ?></label> </div> <?php endforeach; ?> </fieldset> </div> <hr> <?php endif; ?> <?php if ($this->total > 0) : ?> <div class="mb-3"> <div class="d-flex"> <label for="limit" class="me-2"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM'); ?> </label> <?php echo $this->pagination->getLimitBox(); ?> </div> </div> <p><?php echo $this->pagination->getPagesCounter(); ?></p> <?php endif; ?> </form> PKCA#]�10oEEDsystem/helixultimate/overrides/com_search/search/default_results.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; ?> <dl class="search-results"> <?php foreach ($this->results as $result) : ?> <dt class="result-title"> <?php echo $this->pagination->limitstart + $result->count . '. '; ?> <?php if ($result->href) : ?> <a rel="noopener noreferrer" href="<?php echo Route::_($result->href); ?>"<?php if (isset($result->browsernav) && $result->browsernav == 1) : ?> target="_blank"<?php endif; ?>> <?php // $result->title should not be escaped in this case, as it may ?> <?php // contain span HTML tags wrapping the searched terms, if present ?> <?php // in the title. ?> <?php echo $result->title; ?> </a> <?php else : ?> <?php // see above comment: do not escape $result->title ?> <?php echo $result->title; ?> <?php endif; ?> </dt> <?php if (!empty($result->section)) : ?> <dd class="result-category"> <span class="small"> (<?php echo $this->escape($result->section); ?>) </span> </dd> <?php endif; ?> <dd class="result-text"> <?php echo $result->text; ?> </dd> <?php if ($this->params->get('show_date')) : ?> <dd class="result-created"> <?php echo Text::sprintf('JGLOBAL_CREATED_DATE_ON', $result->created); ?> </dd> <?php endif; ?> <?php endforeach; ?> </dl> <div class="w-100"> <?php echo $this->pagination->getPagesLinks(); ?> </div> PKCA#]��,_jj<system/helixultimate/overrides/com_search/search/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); ?> <div class="search"> <?php if ($this->params->get('show_page_heading')) : ?> <h1 class="page-title"> <?php if ($this->escape($this->params->get('page_heading'))) : ?> <?php echo $this->escape($this->params->get('page_heading')); ?> <?php else : ?> <?php echo $this->escape($this->params->get('page_title')); ?> <?php endif; ?> </h1> <?php endif; ?> <?php echo $this->loadTemplate('form'); ?> <?php if ($this->error == null && count($this->results) > 0) : ?> <?php echo $this->loadTemplate('results'); ?> <?php else : ?> <?php echo $this->loadTemplate('error'); ?> <?php endif; ?> </div> PKCA#]Yf:JwwBsystem/helixultimate/overrides/com_search/search/default_error.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); ?> <?php if ($this->error) : ?> <div class="error"> <?php echo $this->escape($this->error); ?> </div> <?php endif; ?> PKCA#]��AM��;system/helixultimate/overrides/mod_menu/default_heading.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; $title = $item->anchor_title ? ' title="' . $item->anchor_title . '"' : ''; $anchor_css = $item->anchor_css ?: ''; $rel = $item->anchor_rel ? ' rel="' . $item->anchor_rel . '" ' : ''; $linktype = $item->title; $isOffcanvasMenu = $params->get('hu_offcanvas', 0, 'INT') === 1; $maxLevel = $params->get('endLevel', 0, 'INT'); $showToggler = $maxLevel === 0 || $item->level < $maxLevel; if ($item->menu_icon) { // If the link is an icon if ($itemParams->get('menu_text', 1)) { $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span>' . $item->title; } else { $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span><span class="visually-hidden">' . $item->title . '</span>'; } } elseif ($item->menu_image) { // If the link is an image, maybe with its own class $image_attributes = []; if ($item->menu_image_css) { $image_attributes['class'] = $item->menu_image_css; } $linktype = HTMLHelper::_('image', $item->menu_image, $item->title, $image_attributes); if ($itemParams->get('menu_text', 1)) { $linktype .= '<span class="menu-image-title image-title">' . $item->title . '</span>'; } } if ($item->parent && $showToggler) { $linktype .= '<span class="menu-toggler"></span>'; } ?> <span class="mod-menu__heading nav-header <?php echo $anchor_css; ?>"<?php echo $title; ?><?php echo $rel; ?>><?php echo $linktype; ?></span> PKCA#]�xG- 3system/helixultimate/overrides/mod_menu/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Helper\ModuleHelper; use Joomla\Registry\Registry; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $app->getDocument()->getWebAssetManager(); $wa->registerAndUseScript('mod_menu', 'mod_menu/menu.min.js', [], ['type' => 'module']); $id = ''; if ($tagId = $params->get('tag_id', '')) { $id = ' id="' . $tagId . '"'; } // The menu class is deprecated. Use nav instead ?> <ul class="mod-menu mod-list menu<?php echo $class_sfx; ?>"<?php echo $id; ?>> <?php foreach ($list as $i => &$item) { $itemParams = $item->getParams(); $layout = \json_decode($itemParams->get('helixultimatemenulayout', '') ?? ""); if (\json_last_error() !== JSON_ERROR_NONE) { $layout = ''; } $helixMenuLayout = new Registry($layout); $customClass = $helixMenuLayout->get('customclass', ''); $class = 'item-' . $item->id; if ($item->id == $default_id) { $class .= ' default'; } if ($item->id == $active_id || ($item->type === 'alias' && $item->getParams()->get('aliasoptions') == $active_id)) { $class .= ' current'; } if (in_array($item->id, $path)) { $class .= ' active'; } elseif ($item->type === 'alias') { $aliasToId = $itemParams->get('aliasoptions'); if (count($path) > 0 && $aliasToId == $path[count($path) - 1]) { $class .= ' active'; } elseif (in_array($aliasToId, $path)) { $class .= ' alias-parent-active'; } } if ($item->type === 'separator') { $class .= ' menu-divider '; } if ($item->deeper) { $class .= ' menu-deeper'; } if ($item->parent) { $class .= ' menu-parent'; } if ($customClass) { $class .= ' ' . $customClass; } echo '<li class="' . htmlspecialchars($class, ENT_QUOTES, 'UTF-8') . '">'; switch ($item->type) : case 'separator': case 'component': case 'heading': case 'url': require ModuleHelper::getLayoutPath('mod_menu', 'default_' . $item->type); break; default: require ModuleHelper::getLayoutPath('mod_menu', 'default_url'); break; endswitch; // The next item is deeper. if ($item->deeper) { echo '<ul class="mod-menu__sub list-unstyled small menu-child">'; } // The next item is shallower. elseif ($item->shallower) { echo '</li>'; echo str_repeat('</ul></li>', $item->level_diff); } // The next item is on the same level. else { echo '</li>'; } } ?></ul> PKCA#]�kc� � 7system/helixultimate/overrides/mod_menu/default_url.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Filter\OutputFilter; use Joomla\CMS\HTML\HTMLHelper; $attributes = []; $isOffcanvasMenu = $params->get('hu_offcanvas', 0, 'INT') === 1; $maxLevel = $params->get('endLevel', 0, 'INT'); $showToggler = $maxLevel === 0 || $item->level < $maxLevel; if ($item->anchor_title) { $attributes['title'] = $item->anchor_title; } if ($item->anchor_css) { $attributes['class'] = $item->anchor_css; } if ($item->anchor_rel) { $attributes['rel'] = $item->anchor_rel; } $linktype = $item->title; if ($item->menu_icon) { // The link is an icon if ($itemParams->get('menu_text', 1)) { // If the link text is to be displayed, the icon is added with aria-hidden $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span>' . $item->title; } else { // If the icon itself is the link, it needs a visually hidden text $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span><span class="visually-hidden">' . $item->title . '</span>'; } } elseif ($item->menu_image) { // The link is an image, maybe with an own class $image_attributes = []; if ($item->menu_image_css) { $image_attributes['class'] = $item->menu_image_css; } $linktype = HTMLHelper::_('image', $item->menu_image, $item->title, $image_attributes); if ($itemParams->get('menu_text', 1)) { $linktype .= '<span class="image-title">' . $item->title . '</span>'; } } if ($item->parent && $showToggler) { $linktype .= '<span class="menu-toggler"></span>'; } if ($item->browserNav == 1) { $attributes['target'] = '_blank'; $attributes['rel'] = 'noopener noreferrer'; if ($item->anchor_rel == 'nofollow') { $attributes['rel'] .= ' nofollow'; } } elseif ($item->browserNav == 2) { $options = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,' . $params->get('window_open'); $attributes['onclick'] = "window.open(this.href, 'targetWindow', '" . $options . "'); return false;"; } echo HTMLHelper::_('link', OutputFilter::ampReplace(htmlspecialchars($item->flink ?? "", ENT_COMPAT, 'UTF-8', false)), $linktype, $attributes); ?> PKCA#]W�t�t t =system/helixultimate/overrides/mod_menu/default_component.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Filter\OutputFilter; use Joomla\CMS\HTML\HTMLHelper; $attributes = []; $isOffcanvasMenu = $params->get('hu_offcanvas', 0, 'INT') === 1; $maxLevel = $params->get('endLevel', 0, 'INT'); $showToggler = $maxLevel === 0 || $item->level < $maxLevel; if ($item->anchor_title) { $attributes['title'] = $item->anchor_title; } if ($item->anchor_css) { $attributes['class'] = $item->anchor_css; } if ($item->anchor_rel) { $attributes['rel'] = $item->anchor_rel; } // Set aria-current attributes based on item state if ($item->id == $active_id) { $attributes['aria-current'] = 'location'; if ($item->current) { $attributes['aria-current'] = 'page'; } } $linktype = $item->title; if ($item->menu_icon) { // The link is an icon if ($itemParams->get('menu_text', 1)) { $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span>' . $item->title; } else { $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span><span class="visually-hidden">' . $item->title . '</span>'; } } elseif ($item->menu_image) { // The link is an image, maybe with its own class $image_attributes = []; if ($item->menu_image_css) { $image_attributes['class'] = $item->menu_image_css; } $linktype = HTMLHelper::_('image', $item->menu_image, $item->title, $image_attributes); if ($itemParams->get('menu_text', 1)) { $linktype .= '<span class="image-title">' . $item->title . '</span>'; } } if ($item->parent && $showToggler) { $linktype .= '<span class="menu-toggler"></span>'; } // Handle browser navigation if ($item->browserNav == 1) { $attributes['target'] = '_blank'; } elseif ($item->browserNav == 2) { $options = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes'; $attributes['onclick'] = "window.open(this.href, 'targetWindow', '" . $options . "'); return false;"; } // Output the link with the correct attributes and content echo HTMLHelper::_('link', OutputFilter::ampReplace(htmlspecialchars($item->flink ?? "", ENT_COMPAT, 'UTF-8', false)), $linktype, $attributes); ?> PKCA#]ٴ]a��<system/helixultimate/overrides/mod_menu/collapse-default.phpnu�[���<?php /** * @package Joomla.Site * @subpackage mod_menu * * @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; HTMLHelper::_('bootstrap.collapse'); ?> <nav class="navbar navbar-expand-md" aria-label="<?php echo htmlspecialchars($module->title, ENT_QUOTES, 'UTF-8'); ?>"> <button class="navbar-toggler navbar-toggler-right" type="button" data-bs-toggle="collapse" data-bs-target="#navbar<?php echo $module->id; ?>" aria-controls="navbar<?php echo $module->id; ?>" aria-expanded="false" aria-label="<?php echo Text::_('MOD_MENU_TOGGLE'); ?>"> <span class="icon-menu" aria-hidden="true"></span> </button> <div class="collapse navbar-collapse" id="navbar<?php echo $module->id; ?>"> <?php require __DIR__ . '/default.php'; ?> </div> </nav> PKCA#]k!P\\=system/helixultimate/overrides/mod_menu/default_separator.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; $title = $item->anchor_title ? ' title="' . $item->anchor_title . '"' : ''; $anchor_css = $item->anchor_css ?: ''; $rel = $item->anchor_rel ? ' rel="' . $item->anchor_rel . '" ' : ''; $isOffcanvasMenu = $params->get('hu_offcanvas', 0, 'INT') === 1; $maxLevel = $params->get('endLevel', 0, 'INT'); $showToggler = $maxLevel === 0 || $item->level < $maxLevel; $linktype = $item->title; if ($item->menu_icon) { // The link is an icon if ($itemParams->get('menu_text', 1)) { // If the link text is to be displayed, the icon is added with aria-hidden $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span>' . $item->title; } else { // If the icon itself is the link, it needs a visually hidden text $linktype = '<span class="pe-2 ' . $item->menu_icon . '" aria-hidden="true"></span><span class="visually-hidden">' . $item->title . '</span>'; } } elseif ($item->menu_image) { // The link is an image, maybe with its own class $image_attributes = []; if ($item->menu_image_css) { $image_attributes['class'] = $item->menu_image_css; } $linktype = HTMLHelper::_('image', $item->menu_image, $item->title, $image_attributes); if ($itemParams->get('menu_text', 1)) { $linktype .= '<span class="menu-image-title">' . $item->title . '</span>'; } } if ($item->parent && $showToggler) { $linktype .= '<span class="menu-toggler"></span>'; } ?> <span class="menu-separator <?php echo $anchor_css; ?>"<?php echo $title; ?><?php echo $rel; ?>><?php echo $linktype; ?></span> PKCA#]r��� � 4system/helixultimate/overrides/com_tags/tag/list.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; // Note that there are certain parts of this layout used only when there is exactly one tag. $n = count($this->items); $htag = $this->params->get('show_page_heading') ? 'h2' : 'h1'; ?> <div class="com-tags-tag-list tag-category"> <?php if ($this->params->get('show_page_heading')) : ?> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> <?php endif; ?> <?php if ($this->params->get('show_tag_title', 1)) : ?> <<?php echo $htag; ?>> <?php echo HTMLHelper::_('content.prepare', $this->tags_title, '', 'com_tags.tag'); ?> </<?php echo $htag; ?>> <?php endif; ?> <?php // We only show a tag description if there is a single tag. ?> <?php if (count($this->item) === 1 && ($this->params->get('tag_list_show_tag_image', 1) || $this->params->get('tag_list_show_tag_description', 1))) : ?> <div class="com-tags-tag-list__description category-desc"> <?php $images = json_decode($this->item[0]->images); ?> <?php if ($this->params->get('tag_list_show_tag_image', 1) == 1 && !empty($images->image_fulltext)) : ?> <?php echo HTMLHelper::_('image', $images->image_fulltext, ''); ?> <?php endif; ?> <?php if ($this->params->get('tag_list_show_tag_description') == 1 && $this->item[0]->description) : ?> <?php echo HTMLHelper::_('content.prepare', $this->item[0]->description, '', 'com_tags.tag'); ?> <?php endif; ?> </div> <?php endif; ?> <?php // If there are multiple tags and a description or image has been supplied use that. ?> <?php if ($this->params->get('tag_list_show_tag_description', 1) || $this->params->get('show_description_image', 1)) : ?> <?php if ($this->params->get('show_description_image', 1) == 1 && $this->params->get('tag_list_image')) : ?> <?php echo HTMLHelper::_('image', $this->params->get('tag_list_image'), empty($this->params->get('tag_list_image_alt')) && empty($this->params->get('tag_list_image_alt_empty')) ? false : $this->params->get('tag_list_image_alt')); ?> <?php endif; ?> <?php if ($this->params->get('tag_list_description', '') > '') : ?> <?php echo HTMLHelper::_('content.prepare', $this->params->get('tag_list_description'), '', 'com_tags.tag'); ?> <?php endif; ?> <?php endif; ?> <?php echo $this->loadTemplate('items'); ?> </div> PKCA#]�/<'��:system/helixultimate/overrides/com_tags/tag/list_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('com_tags.tag-list'); $listOrder = $this->escape($this->state->get('list.ordering')); $listDirn = $this->escape($this->state->get('list.direction')); ?> <div class="com-tags-compact__items"> <form action="<?php echo htmlspecialchars(Uri::getInstance()->toString()); ?>" method="post" name="adminForm" id="adminForm" class="com-tags-tag-list__items"> <?php if ($this->params->get('filter_field')) : ?> <div class="com-tags-tag__filter btn-group"> <label class="filter-search-lbl visually-hidden" for="filter-search"> <?php echo Text::_('COM_TAGS_TITLE_FILTER_LABEL'); ?> </label> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->state->get('list.filter')); ?>" class="inputbox" onchange="document.adminForm.submit();" placeholder="<?php echo Text::_('COM_TAGS_TITLE_FILTER_LABEL'); ?>" > <button type="submit" name="filter_submit" class="btn btn-primary"><?php echo Text::_('JGLOBAL_FILTER_BUTTON'); ?></button> <button type="reset" name="filter-clear-button" class="btn btn-secondary"><?php echo Text::_('JSEARCH_FILTER_CLEAR'); ?></button> </div> <?php endif; ?> <?php if ($this->params->get('show_pagination_limit')) : ?> <div class="btn-group float-end"> <label for="limit" class="visually-hidden"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM'); ?> </label> <?php echo $this->pagination->getLimitBox(); ?> </div> <?php endif; ?> <?php if (empty($this->items)) : ?> <div class="alert alert-info"> <span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span> <?php echo Text::_('COM_TAGS_NO_ITEMS'); ?> </div> <?php else : ?> <table class="com-tags-tag-list__category category table table-striped table-bordered table-hover"> <thead<?php echo $this->params->get('show_headings', '1') ? '' : ' class="visually-hidden"'; ?>> <tr> <th scope="col" id="categorylist_header_title"> <?php echo HTMLHelper::_('grid.sort', 'JGLOBAL_TITLE', 'c.core_title', $listDirn, $listOrder); ?> </th> <?php if ($date = $this->params->get('tag_list_show_date')) : ?> <th scope="col" id="categorylist_header_date"> <?php if ($date === 'created') : ?> <?php echo HTMLHelper::_('grid.sort', 'COM_TAGS_' . $date . '_DATE', 'c.core_created_time', $listDirn, $listOrder); ?> <?php elseif ($date === 'modified') : ?> <?php echo HTMLHelper::_('grid.sort', 'COM_TAGS_' . $date . '_DATE', 'c.core_modified_time', $listDirn, $listOrder); ?> <?php elseif ($date === 'published') : ?> <?php echo HTMLHelper::_('grid.sort', 'COM_TAGS_' . $date . '_DATE', 'c.core_publish_up', $listDirn, $listOrder); ?> <?php endif; ?> </th> <?php endif; ?> </tr> </thead> <tbody> <?php foreach ($this->items as $i => $item) : ?> <?php if ($item->core_state == 0) : ?> <tr class="system-unpublished cat-list-row<?php echo $i % 2; ?>"> <?php else : ?> <tr class="cat-list-row<?php echo $i % 2; ?>" > <?php endif; ?> <th scope="row" class="list-title"> <?php if (($item->type_alias === 'com_users.category') || ($item->type_alias === 'com_banners.category')) : ?> <?php echo $this->escape($item->core_title); ?> <?php else : ?> <a href="<?php echo Route::_($item->link); ?>"> <?php echo $this->escape($item->core_title); ?> </a> <?php endif; ?> <?php if ($item->core_state == 0) : ?> <span class="list-published badge bg-warning text-light"> <?php echo Text::_('JUNPUBLISHED'); ?> </span> <?php endif; ?> </th> <?php if ($this->params->get('tag_list_show_date')) : ?> <td class="list-date"> <?php echo HTMLHelper::_( 'date', $item->displayDate, $this->escape($this->params->get('date_format', Text::_('DATE_FORMAT_LC3'))) ); ?> </td> <?php endif; ?> </tr> <?php endforeach; ?> </tbody> </table> <?php endif; ?> <?php // Add pagination links ?> <?php if (($this->params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> <div class="com-tags-tag-list__pagination w-100"> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <p class="counter float-end pt-3 pe-2"> <?php echo $this->pagination->getPagesCounter(); ?> </p> <?php endif; ?> <?php echo $this->pagination->getPagesLinks(); ?> </div> <?php endif; ?> <input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>"> <input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>"> <input type="hidden" name="limitstart" value=""> <input type="hidden" name="task" value=""> </form> </div> PKCA#]����=system/helixultimate/overrides/com_tags/tag/default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\Component\Tags\Site\Helper\RouteHelper; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('com_tags.tag-default'); // Get the user object. $user = $this->getCurrentUser(); // Check if user is allowed to add/edit based on tags permissions. // Do we really have to make it so people can see unpublished tags??? $canEdit = $user->authorise('core.edit', 'com_tags'); $canCreate = $user->authorise('core.create', 'com_tags'); $canEditState = $user->authorise('core.edit.state', 'com_tags'); ?> <div class="com-tags__items"> <form action="<?php echo htmlspecialchars(Uri::getInstance()->toString()); ?>" method="post" name="adminForm" id="adminForm"> <?php if ($this->params->get('filter_field') || $this->params->get('show_pagination_limit')) : ?> <?php if ($this->params->get('filter_field')) : ?> <div class="com-tags-tags__filter btn-group"> <label class="filter-search-lbl visually-hidden" for="filter-search"> <?php echo Text::_('COM_TAGS_TITLE_FILTER_LABEL'); ?> </label> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->state->get('list.filter')); ?>" class="inputbox" onchange="document.adminForm.submit();" placeholder="<?php echo Text::_('COM_TAGS_TITLE_FILTER_LABEL'); ?>" > <button type="submit" name="filter_submit" class="btn btn-primary"><?php echo Text::_('JGLOBAL_FILTER_BUTTON'); ?></button> <button type="reset" name="filter-clear-button" class="btn btn-secondary"><?php echo Text::_('JSEARCH_FILTER_CLEAR'); ?></button> </div> <?php endif; ?> <?php if ($this->params->get('show_pagination_limit')) : ?> <div class="btn-group float-end"> <label for="limit" class="visually-hidden"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM'); ?> </label> <?php echo $this->pagination->getLimitBox(); ?> </div> <?php endif; ?> <input type="hidden" name="limitstart" value=""> <input type="hidden" name="task" value=""> <?php endif; ?> </form> <?php if (empty($this->items)) : ?> <div class="alert alert-info"> <span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span> <?php echo Text::_('COM_TAGS_NO_ITEMS'); ?> </div> <?php else : ?> <ul class="com-tags-tag__category category list-group"> <?php foreach ($this->items as $i => $item) : ?> <?php if ($item->core_state == 0) : ?> <li class="list-group-item-danger"> <?php else : ?> <li class="list-group-item list-group-item-action"> <?php endif; ?> <?php if (($item->type_alias === 'com_users.category') || ($item->type_alias === 'com_banners.category')) : ?> <h3> <?php echo $this->escape($item->core_title); ?> </h3> <?php else : ?> <h3> <a href="<?php echo Route::_($item->link); ?>"> <?php echo $this->escape($item->core_title); ?> </a> </h3> <?php endif; ?> <?php // Content is generated by content plugin event "onContentAfterTitle" ?> <?php echo $item->event->afterDisplayTitle; ?> <?php $images = json_decode($item->core_images); ?> <?php if ($this->params->get('tag_list_show_item_image', 1) == 1 && !empty($images->image_intro)) : ?> <a href="<?php echo Route::_(RouteHelper::getItemRoute($item->content_item_id, $item->core_alias, $item->core_catid, $item->core_language, $item->type_alias, $item->router)); ?>"> <?php echo HTMLHelper::_('image', $images->image_intro, $images->image_intro_alt); ?> </a> <?php endif; ?> <?php if ($this->params->get('tag_list_show_item_description', 1)) : ?> <?php // Content is generated by content plugin event "onContentBeforeDisplay" ?> <?php echo $item->event->beforeDisplayContent; ?> <span class="tag-body"> <?php echo HTMLHelper::_('string.truncate', $item->core_body, $this->params->get('tag_list_item_maximum_characters')); ?> </span> <?php // Content is generated by content plugin event "onContentAfterDisplay" ?> <?php echo $item->event->afterDisplayContent; ?> <?php endif; ?> </li> <?php endforeach; ?> </ul> <?php endif; ?> </div> PKCA#]XH�� 7system/helixultimate/overrides/com_tags/tag/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; // Note that there are certain parts of this layout used only when there is exactly one tag. $isSingleTag = count($this->item) === 1; $htag = $this->params->get('show_page_heading') ? 'h2' : 'h1'; ?> <div class="com-tags-tag tag-category"> <?php if ($this->params->get('show_page_heading')) : ?> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> <?php endif; ?> <?php if ($this->params->get('show_tag_title', 1)) : ?> <<?php echo $htag; ?>> <?php echo HTMLHelper::_('content.prepare', $this->tags_title, '', 'com_tags.tag'); ?> </<?php echo $htag; ?>> <?php endif; ?> <?php // We only show a tag description if there is a single tag. ?> <?php if (count($this->item) === 1 && ($this->params->get('tag_list_show_tag_image', 1) || $this->params->get('tag_list_show_tag_description', 1))) : ?> <div class="com-tags-tag__description category-desc"> <?php $images = json_decode($this->item[0]->images); ?> <?php if ($this->params->get('tag_list_show_tag_image', 1) == 1 && !empty($images->image_fulltext)) : ?> <?php echo HTMLHelper::_('image', $images->image_fulltext, $images->image_fulltext_alt); ?> <?php endif; ?> <?php if ($this->params->get('tag_list_show_tag_description') == 1 && $this->item[0]->description) : ?> <?php echo HTMLHelper::_('content.prepare', $this->item[0]->description, '', 'com_tags.tag'); ?> <?php endif; ?> </div> <?php endif; ?> <?php // If there are multiple tags and a description or image has been supplied use that. ?> <?php if ($this->params->get('tag_list_show_tag_description', 1) || $this->params->get('show_description_image', 1)) : ?> <?php if ($this->params->get('show_description_image', 1) == 1 && $this->params->get('tag_list_image')) : ?> <?php echo HTMLHelper::_('image', $this->params->get('tag_list_image'), empty($this->params->get('tag_list_image_alt')) && empty($this->params->get('tag_list_image_alt_empty')) ? false : $this->params->get('tag_list_image_alt')); ?> <?php endif; ?> <?php if ($this->params->get('tag_list_description', '') > '') : ?> <?php echo HTMLHelper::_('content.prepare', $this->params->get('tag_list_description'), '', 'com_tags.tag'); ?> <?php endif; ?> <?php endif; ?> <?php echo $this->loadTemplate('items'); ?> <?php if (($this->params->def('show_pagination', 1) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> <div class="com-tags-tag__pagination w-100"> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <p class="counter float-end pt-3 pe-2"> <?php echo $this->pagination->getPagesCounter(); ?> </p> <?php endif; ?> <?php echo $this->pagination->getPagesLinks(); ?> </div> <?php endif; ?> </div> PKCA#]g�P9ii8system/helixultimate/overrides/com_tags/tags/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; // Note that there are certain parts of this layout used only when there is exactly one tag. $description = $this->params->get('all_tags_description'); $descriptionImage = $this->params->get('all_tags_description_image'); ?> <div class="com-tags tag-category"> <?php if ($this->params->get('show_page_heading')) : ?> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> <?php endif; ?> <?php if ($this->params->get('all_tags_show_description_image') && !empty($descriptionImage)) : ?> <div class="com-tags__image"> <?php echo HTMLHelper::_('image', $descriptionImage, empty($this->params->get('all_tags_description_image_alt')) && empty($this->params->get('all_tags_description_image_alt_empty')) ? false : $this->params->get('all_tags_description_image_alt')); ?> </div> <?php endif; ?> <?php if (!empty($description)) : ?> <div class="com-tags__description"> <?php echo $description; ?> </div> <?php endif; ?> <?php echo $this->loadTemplate('items'); ?> </div>PKCA#]�u�:��>system/helixultimate/overrides/com_tags/tags/default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\Component\Tags\Site\Helper\RouteHelper; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('com_tags.tags-default'); // Get the user object. $user = $this->getCurrentUser(); // Check if user is allowed to add/edit based on tags permissions. $canEdit = $user->authorise('core.edit', 'com_tags'); $canCreate = $user->authorise('core.create', 'com_tags'); $canEditState = $user->authorise('core.edit.state', 'com_tags'); $columns = $this->params->get('tag_columns', 1); // Avoid division by 0 and negative columns. if ($columns < 1) { $columns = 1; } $bsspans = floor(12 / $columns); if ($bsspans < 1) { $bsspans = 1; } $bscolumns = min($columns, floor(12 / $bsspans)); $n = count($this->items); ?> <div class="com-tags__items"> <form action="<?php echo htmlspecialchars(Uri::getInstance()->toString()); ?>" method="post" name="adminForm" id="adminForm"> <?php if ($this->params->get('filter_field') || $this->params->get('show_pagination_limit')) : ?> <?php if ($this->params->get('filter_field')) : ?> <div class="com-tags-tags__filter btn-group"> <label class="filter-search-lbl visually-hidden" for="filter-search"> <?php echo Text::_('COM_TAGS_TITLE_FILTER_LABEL'); ?> </label> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->state->get('list.filter')); ?>" class="inputbox" onchange="document.adminForm.submit();" placeholder="<?php echo Text::_('COM_TAGS_TITLE_FILTER_LABEL'); ?>" > <button type="submit" name="filter_submit" class="btn btn-primary"><?php echo Text::_('JGLOBAL_FILTER_BUTTON'); ?></button> <button type="reset" name="filter-clear-button" class="btn btn-secondary"><?php echo Text::_('JSEARCH_FILTER_CLEAR'); ?></button> </div> <?php endif; ?> <?php if ($this->params->get('show_pagination_limit')) : ?> <div class="btn-group float-end"> <label for="limit" class="visually-hidden"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM'); ?> </label> <?php echo $this->pagination->getLimitBox(); ?> </div> <?php endif; ?> <input type="hidden" name="limitstart" value=""> <input type="hidden" name="task" value=""> <?php endif; ?> </form> <?php if ($this->items == false || $n === 0) : ?> <div class="alert alert-info"> <span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span> <?php echo Text::_('COM_TAGS_NO_TAGS'); ?> </div> <?php else : ?> <?php foreach ($this->items as $i => $item) : ?> <?php if ($n === 1 || $i === 0 || $bscolumns === 1 || $i % $bscolumns === 0) : ?> <ul class="com-tags__category category list-group"> <?php endif; ?> <li class="list-group-item list-group-item-action"> <?php if ((!empty($item->access)) && in_array($item->access, $this->user->getAuthorisedViewLevels())) : ?> <h3 class="mb-0"> <a href="<?php echo Route::_(RouteHelper::getComponentTagRoute($item->id . ':' . $item->alias, $item->language)); ?>"> <?php echo $this->escape($item->title); ?> </a> </h3> <?php endif; ?> <?php if ($this->params->get('all_tags_show_tag_image') && !empty($item->images)) : ?> <?php $images = json_decode($item->images); ?> <span class="tag-body"> <?php if (!empty($images->image_intro)) : ?> <?php $imgfloat = empty($images->float_intro) ? $this->params->get('float_intro') : $images->float_intro; ?> <div class="float-<?php echo htmlspecialchars($imgfloat, ENT_QUOTES, 'UTF-8'); ?> item-image"> <?php $imageOptions = []; ?> <?php if ($images->image_intro_caption) : ?> <?php $imageOptions['title'] = $images->image_intro_caption; ?> <?php $imageOptions['class'] = 'caption'; ?> <?php endif; ?> <?php echo HTMLHelper::_('image', $images->image_intro, $images->image_intro_alt, $imageOptions); ?> </div> <?php endif; ?> </span> <?php endif; ?> <?php if (($this->params->get('all_tags_show_tag_description', 1) && !empty($item->description)) || $this->params->get('all_tags_show_tag_hits')) : ?> <div class="caption"> <?php if ($this->params->get('all_tags_show_tag_description', 1) && !empty($item->description)) : ?> <span class="tag-body"> <?php echo HTMLHelper::_('string.truncate', $item->description, $this->params->get('all_tags_tag_maximum_characters')); ?> </span> <?php endif; ?> <?php if ($this->params->get('all_tags_show_tag_hits')) : ?> <span class="list-hits badge bg-info"> <?php echo Text::sprintf('JGLOBAL_HITS_COUNT', $item->hits); ?> </span> <?php endif; ?> </div> <?php endif; ?> </li> <?php if (($i === 0 && $n === 1) || $i === $n - 1 || $bscolumns === 1 || (($i + 1) % $bscolumns === 0)) : ?> </ul> <?php endif; ?> <?php endforeach; ?> <?php endif; ?> <?php // Add pagination links ?> <?php if (!empty($this->items)) : ?> <?php if (($this->params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> <div class="com-tags__pagination w-100"> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <p class="counter float-end pt-3 pe-2"> <?php echo $this->pagination->getPagesCounter(); ?> </p> <?php endif; ?> <?php echo $this->pagination->getPagesLinks(); ?> </div> <?php endif; ?> <?php endif; ?> </div> PKCA#]��g�ff9system/helixultimate/overrides/com_media/file/default.phpnu�[���<?php /** * @package Joomla.Administrator * @subpackage com_media * * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Session\Session; use Joomla\CMS\Uri\Uri; /** @var \Joomla\Component\Media\Administrator\View\File\HtmlView $this */ /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->getDocument()->getWebAssetManager(); $wa->useScript('keepalive') ->useScript('form.validate') ->useStyle('com_media.mediamanager'); $script = $wa->getAsset('script', 'com_media.edit-images')->getUri(true); $params = ComponentHelper::getParams('com_media'); $input = Factory::getApplication()->getInput(); /** @var \Joomla\CMS\Form\Form $form */ $form = $this->form; $tmpl = $input->getCmd('tmpl'); $input->set('hidemainmenu', true); $mediaTypes = $input->getString('mediatypes', '0'); // Populate the media config $config = [ 'apiBaseUrl' => Uri::base() . 'index.php?option=com_media&format=json' . '&mediatypes=' . $mediaTypes, 'csrfToken' => Session::getFormToken(), 'uploadPath' => $this->file->path, 'editViewUrl' => Uri::base() . 'index.php?option=com_media&view=file' . ($tmpl ? '&tmpl=' . $tmpl : '') . '&mediatypes=' . $mediaTypes, 'imagesExtensions' => array_map('trim', explode(',', $params->get('image_extensions', 'bmp,gif,jpg,jpeg,png,webp,avif'))), 'audioExtensions' => array_map('trim', explode(',', $params->get('audio_extensions', 'mp3,m4a,mp4a,ogg'))), 'videoExtensions' => array_map('trim', explode(',', $params->get('video_extensions', 'mp4,mp4v,mpeg,mov,webm'))), 'documentExtensions' => array_map('trim', explode(',', $params->get('doc_extensions', 'doc,odg,odp,ods,odt,pdf,ppt,txt,xcf,xls,csv'))), 'maxUploadSizeMb' => $params->get('upload_maxsize', 10), 'contents' => $this->file->content, ]; $this->getDocument()->addScriptOptions('com_media', $config); $this->useCoreUI = true; ?> <?php if ($tmpl === 'component') : ?> <div class="subhead noshadow mb-3"> <?php echo $this->getDocument()->getToolbar('toolbar')->render(); ?> </div> <?php endif; ?> <form action="#" method="post" name="adminForm" id="media-form" class="form-validate main-card media-form mt-3"> <?php $fieldSets = $form->getFieldsets(); ?> <?php if ($fieldSets) : ?> <?php echo HTMLHelper::_('uitab.startTabSet', 'myTab', ['active' => 'attrib-' . reset($fieldSets)->name, 'breakpoint' => 768]); ?> <?php echo LayoutHelper::render('joomla.edit.params', $this); ?> <?php echo '<div id="media-manager-edit-container" class="media-manager-edit"></div>'; ?> <?php echo HTMLHelper::_('uitab.endTabSet'); ?> <?php endif; ?> <input type="hidden" name="mediatypes" value="<?php echo $this->escape($mediaTypes); ?>"> </form> <script type="module" src="<?php echo $script . '?' . $this->getDocument()->getMediaVersion(); ?>"></script> PKCA#]��#��:system/helixultimate/overrides/com_media/media/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\Session\Session; use Joomla\CMS\Toolbar\Toolbar; use Joomla\CMS\Uri\Uri; $app = Factory::getApplication(); $params = ComponentHelper::getParams('com_media'); $input = $app->getInput(); $user = $app->getIdentity(); /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('keepalive') ->useStyle('com_media.mediamanager') ->useScript('com_media.mediamanager') ->useStyle('webcomponent.joomla-alert') ->useScript('messages'); // Populate the language $this->loadTemplate('texts'); $tmpl = $input->getCmd('tmpl'); // Load the toolbar when we are in an iframe if ($tmpl === 'component') { echo '<div class="subhead noshadow">'; echo Toolbar::getInstance('toolbar')->render(); echo '</div>'; } $mediaTypes = '&mediatypes=' . $input->getString('mediatypes', '0,1,2,3'); // Populate the media config $config = [ 'apiBaseUrl' => Uri::base() . 'index.php?option=com_media&format=json' . $mediaTypes, 'csrfToken' => Session::getFormToken(), 'filePath' => $params->get('file_path', 'images'), 'fileBaseUrl' => Uri::root() . $params->get('file_path', 'images'), 'fileBaseRelativeUrl' => $params->get('file_path', 'images'), 'editViewUrl' => Uri::base() . 'index.php?option=com_media&view=file' . ($tmpl ? '&tmpl=' . $tmpl : '') . $mediaTypes, 'imagesExtensions' => array_map('trim', explode(',', $params->get('image_extensions', 'bmp,gif,jpg,jpeg,png,webp'))), 'audioExtensions' => array_map('trim', explode(',', $params->get('audio_extensions', 'mp3,m4a,mp4a,ogg'))), 'videoExtensions' => array_map('trim', explode(',', $params->get('video_extensions', 'mp4,mp4v,mpeg,mov,webm'))), 'documentExtensions' => array_map('trim', explode(',', $params->get('doc_extensions', 'doc,odg,odp,ods,odt,pdf,ppt,txt,xcf,xls,csv'))), 'maxUploadSizeMb' => $params->get('upload_maxsize', 10), 'providers' => (array) $this->providers, 'currentPath' => $this->currentPath, 'isModal' => $tmpl === 'component', 'canCreate' => $user->authorise('core.create', 'com_media'), 'canEdit' => $user->authorise('core.edit', 'com_media'), 'canDelete' => $user->authorise('core.delete', 'com_media'), ]; $this->document->addScriptOptions('com_media', $config); $this->document->addScriptDeclaration( " jQuery(function($) { let element = '<div id=\"system-message-container\" aria-live=\"polite\"></div>'; $( document ).ready(function() { $('body.com-media').prepend(element); }); }); " ); ?> <div id="com-media"></div> PKCA#]1i6.� � @system/helixultimate/overrides/com_media/media/default_texts.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; $translationStrings = [ 'COM_MEDIA_ACTIONS_TOOLBAR_LABEL', 'COM_MEDIA_ACTION_DELETE', 'COM_MEDIA_ACTION_DOWNLOAD', 'COM_MEDIA_ACTION_EDIT', 'COM_MEDIA_ACTION_PREVIEW', 'COM_MEDIA_ACTION_RENAME', 'COM_MEDIA_ACTION_SHARE', 'COM_MEDIA_BREADCRUMB_LABEL', 'COM_MEDIA_BROWSER_TABLE_CAPTION', 'COM_MEDIA_CHANGE_ORDERING', 'COM_MEDIA_CONFIRM_DELETE_MODAL', 'COM_MEDIA_CONFIRM_DELETE_MODAL_HEADING', 'COM_MEDIA_CREATE_NEW_FOLDER', 'COM_MEDIA_CREATE_NEW_FOLDER_ERROR', 'COM_MEDIA_CREATE_NEW_FOLDER_SUCCESS', 'COM_MEDIA_DECREASE_GRID', 'COM_MEDIA_DELETE_ERROR', 'COM_MEDIA_DELETE_SUCCESS', 'COM_MEDIA_DROP_FILE', 'COM_MEDIA_ERROR', 'COM_MEDIA_ERROR_NOT_AUTHENTICATED', 'COM_MEDIA_ERROR_NOT_AUTHORIZED', 'COM_MEDIA_ERROR_NOT_FOUND', 'COM_MEDIA_ERROR_WARNFILETOOLARGE', 'COM_MEDIA_FILE', 'COM_MEDIA_FILE_EXISTS_AND_OVERRIDE', 'COM_MEDIA_FOLDER', 'COM_MEDIA_FOLDER_NAME', 'COM_MEDIA_INCREASE_GRID', 'COM_MEDIA_MANAGE_ITEM', 'COM_MEDIA_MEDIA_DATE_CREATED', 'COM_MEDIA_MEDIA_DATE_MODIFIED', 'COM_MEDIA_MEDIA_DIMENSION', 'COM_MEDIA_MEDIA_EXTENSION', 'COM_MEDIA_MEDIA_MIME_TYPE', 'COM_MEDIA_MEDIA_NAME', 'COM_MEDIA_MEDIA_SIZE', 'COM_MEDIA_MEDIA_TYPE', 'COM_MEDIA_NAME', 'COM_MEDIA_OPEN_ITEM_ACTIONS', 'COM_MEDIA_ORDER_ASC', 'COM_MEDIA_ORDER_BY', 'COM_MEDIA_ORDER_DESC', 'COM_MEDIA_ORDER_DIRECTION', 'COM_MEDIA_PLEASE_SELECT_ITEM', 'COM_MEDIA_RENAME', 'COM_MEDIA_RENAME_ERROR', 'COM_MEDIA_RENAME_SUCCESS', 'COM_MEDIA_SEARCH', 'COM_MEDIA_SELECT_ALL', 'COM_MEDIA_SERVER_ERROR', 'COM_MEDIA_SHARE', 'COM_MEDIA_SHARE_COPY', 'COM_MEDIA_SHARE_COPY_FAILED_ERROR', 'COM_MEDIA_SHARE_DESC', 'COM_MEDIA_TOGGLE_INFO', 'COM_MEDIA_TOGGLE_LIST_VIEW', 'COM_MEDIA_TOGGLE_SELECT_ITEM', 'COM_MEDIA_TOOLBAR_LABEL', 'COM_MEDIA_UPLOAD_SUCCESS', 'ERROR', 'JACTION_CREATE', 'JAPPLY', 'JCANCEL', 'JGLOBAL_CONFIRM_DELETE', 'JGLOBAL_NO_MATCHING_RESULTS', 'JLIB_FORM_FIELD_REQUIRED_VALUE', 'MESSAGE', ]; foreach ($translationStrings as $string) { Text::script($string); } PKCA#]��_ _ Jsystem/helixultimate/overrides/com_newsfeeds/category/default_children.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Newsfeeds\Site\Helper\RouteHelper; defined('_JEXEC') or die; ?> <?php if ($this->maxLevel != 0 && count($this->children[$this->category->id]) > 0) : ?> <ul> <?php foreach ($this->children[$this->category->id] as $id => $child) : ?> <?php if ($this->params->get('show_empty_categories') || $child->numitems || count($child->getChildren())) : ?> <li> <span class="item-title"> <a href="<?php echo Route::_(RouteHelper::getCategoryRoute($child->id, $child->language)); ?>"> <?php echo $this->escape($child->title); ?> </a> </span> <?php if ($this->params->get('show_subcat_desc') == 1) : ?> <?php if ($child->description) : ?> <div class="category-desc"> <?php echo HTMLHelper::_('content.prepare', $child->description, '', 'com_newsfeeds.category'); ?> </div> <?php endif; ?> <?php endif; ?> <?php if ($this->params->get('show_cat_items') == 1) : ?> <span class="badge bg-info"> <?php echo Text::_('COM_NEWSFEEDS_CAT_NUM'); ?> <?php echo $child->numitems; ?> </span> <?php endif; ?> <?php if (count($child->getChildren()) > 0) : ?> <?php $this->children[$child->id] = $child->getChildren(); ?> <?php $this->category = $child; ?> <?php $this->maxLevel--; ?> <?php echo $this->loadTemplate('children'); ?> <?php $this->category = $child->getParent(); ?> <?php $this->maxLevel++; ?> <?php endif; ?> </li> <?php endif; ?> <?php endforeach; ?> </ul> <?php endif; PKCA#]l�t�hhGsystem/helixultimate/overrides/com_newsfeeds/category/default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\String\PunycodeHelper; use Joomla\CMS\Uri\Uri; use Joomla\Component\Newsfeeds\Site\Helper\RouteHelper; $n = count($this->items); $listOrder = $this->escape($this->state->get('list.ordering')); $listDirn = $this->escape($this->state->get('list.direction')); ?> <div class="com-newsfeeds-category__items"> <?php if (empty($this->items)) : ?> <p><?php echo Text::_('COM_NEWSFEEDS_NO_ARTICLES'); ?></p> <?php else : ?> <form action="<?php echo htmlspecialchars(Uri::getInstance()->toString(), ENT_COMPAT, 'UTF-8'); ?>" method="post" name="adminForm" id="adminForm"> <?php if ($this->params->get('filter_field') !== 'hide' || $this->params->get('show_pagination_limit')) : ?> <fieldset class="com-newsfeeds-category__filters filters"> <?php if ($this->params->get('filter_field') !== 'hide' && $this->params->get('filter_field') == '1') : ?> <div class="btn-group"> <label class="filter-search-lbl visually-hidden" for="filter-search"> <?php echo Text::_('COM_NEWSFEEDS_FILTER_LABEL') . ' '; ?> </label> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->state->get('list.filter')); ?>" class="inputbox" onchange="document.adminForm.submit();" placeholder="<?php echo Text::_('COM_NEWSFEEDS_FILTER_SEARCH_DESC'); ?>"> </div> <?php endif; ?> <?php if ($this->params->get('show_pagination_limit')) : ?> <div class="btn-group float-end"> <label for="limit" class="visually-hidden"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM'); ?> </label> <?php echo $this->pagination->getLimitBox(); ?> </div> <?php endif; ?> </fieldset> <?php endif; ?> <ul class="com-newsfeeds-category__category list-group list-unstyled"> <?php foreach ($this->items as $item) : ?> <li class="list-group-item"> <?php if ($this->params->get('show_articles')) : ?> <span class="list-hits badge bg-info float-end"> <?php echo Text::sprintf('COM_NEWSFEEDS_NUM_ARTICLES_COUNT', $item->numarticles); ?> </span> <?php endif; ?> <span class="list float-start"> <div class="list-title"> <a href="<?php echo Route::_(RouteHelper::getNewsfeedRoute($item->slug, $item->catid)); ?>"> <?php echo $item->name; ?> </a> </div> </span> <?php if ($item->published == 0) : ?> <span class="badge bg-warning text-light"> <?php echo Text::_('JUNPUBLISHED'); ?> </span> <?php endif; ?> <br> <?php if ($this->params->get('show_link')) : ?> <?php $link = PunycodeHelper::urlToUTF8($item->link); ?> <span class="list float-start"> <a href="<?php echo $item->link; ?>"> <?php echo $link; ?> </a> </span> <br> <?php endif; ?> </li> <?php endforeach; ?> </ul> <?php // Add pagination links ?> <?php if (!empty($this->items)) : ?> <?php if (($this->params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> <div class="com-newsfeeds-category__pagination w-100"> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <p class="counter float-end pt-3 pe-2"> <?php echo $this->pagination->getPagesCounter(); ?> </p> <?php endif; ?> <?php echo $this->pagination->getPagesLinks(); ?> </div> <?php endif; ?> <?php endif; ?> </form> <?php endif; ?> </div> PKCA#]���� � Asystem/helixultimate/overrides/com_newsfeeds/category/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Layout\LayoutHelper; $htag = $this->params->get('show_page_heading') ? 'h2' : 'h1'; ?> <div class="com-newsfeeds-category newsfeed-category"> <?php if ($this->params->get('show_page_heading')) : ?> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> <?php endif; ?> <?php if ($this->params->get('show_category_title', 1)) : ?> <<?php echo $htag; ?>> <?php echo HTMLHelper::_('content.prepare', $this->category->title, '', 'com_newsfeeds.category.title'); ?> </<?php echo $htag; ?>> <?php endif; ?> <?php if ($this->params->get('show_tags', 1) && !empty($this->category->tags->itemTags)) : ?> <?php $this->category->tagLayout = new FileLayout('joomla.content.tags'); ?> <?php echo $this->category->tagLayout->render($this->category->tags->itemTags); ?> <?php endif; ?> <?php if ($this->params->get('show_description', 1) || $this->params->def('show_description_image', 1)) : ?> <div class="com-newsfeeds-category__description category-desc"> <?php if ($this->params->get('show_description_image') && $this->category->getParams()->get('image')) : ?> <?php echo LayoutHelper::render( 'joomla.html.image', [ 'src' => $this->category->getParams()->get('image'), 'alt' => empty($this->category->getParams()->get('image_alt')) && empty($this->category->getParams()->get('image_alt_empty')) ? false : $this->category->getParams()->get('image_alt'), ] ); ?> <?php endif; ?> <?php if ($this->params->get('show_description') && $this->category->description) : ?> <?php echo HTMLHelper::_('content.prepare', $this->category->description, '', 'com_newsfeeds.category'); ?> <?php endif; ?> <div class="clr"></div> </div> <?php endif; ?> <?php echo $this->loadTemplate('items'); ?> <?php if ($this->maxLevel != 0 && !empty($this->children[$this->category->id])) : ?> <div class="com-newsfeeds-category__children cat-children"> <h3> <?php echo Text::_('JGLOBAL_SUBCATEGORIES'); ?> </h3> <?php echo $this->loadTemplate('children'); ?> </div> <?php endif; ?> </div> PKCA#]K'6��Isystem/helixultimate/overrides/com_newsfeeds/categories/default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Newsfeeds\Site\Helper\RouteHelper; ?> <?php if ($this->maxLevelcat != 0 && count($this->items[$this->parent->id]) > 0) : ?> <?php foreach ($this->items[$this->parent->id] as $id => $item) : ?> <?php if ($this->params->get('show_empty_categories_cat') || $item->numitems || count($item->getChildren())) : ?> <div class="com-newsfeeds-categories__items"> <h3 class="page-header item-title"> <a href="<?php echo Route::_(RouteHelper::getCategoryRoute($item->id, $item->language)); ?>"> <?php echo $this->escape($item->title); ?> </a> <?php if ($this->params->get('show_cat_items_cat') == 1) : ?> <span class="badge bg-info"> <?php echo Text::_('COM_NEWSFEEDS_NUM_ITEMS'); ?> <?php echo $item->numitems; ?> </span> <?php endif; ?> <?php if (count($item->getChildren()) > 0 && $this->maxLevelcat > 1) : ?> <button type="button" id="category-btn-<?php echo $item->id; ?>" data-bs-target="#category-<?php echo $item->id; ?>" data-bs-toggle="collapse" class="btn btn-secondary btn-sm float-end" aria-label="<?php echo Text::_('JGLOBAL_EXPAND_CATEGORIES'); ?>" > <span class="icon-plus" aria-hidden="true"></span> </button> <?php endif; ?> </h3> <?php if ($this->params->get('show_subcat_desc_cat') == 1) : ?> <?php if ($item->description) : ?> <div class="com-newsfeeds-categories__description category-desc"> <?php echo HTMLHelper::_('content.prepare', $item->description, '', 'com_newsfeeds.categories'); ?> </div> <?php endif; ?> <?php endif; ?> <?php if (count($item->getChildren()) > 0 && $this->maxLevelcat > 1) : ?> <div class="com-newsfeeds-categories__children collapse fade" id="category-<?php echo $item->id; ?>"> <?php $this->items[$item->id] = $item->getChildren(); ?> <?php $this->parent = $item; ?> <?php $this->maxLevelcat--; ?> <?php echo $this->loadTemplate('items'); ?> <?php $this->parent = $item->getParent(); ?> <?php $this->maxLevelcat++; ?> </div> <?php endif; ?> </div> <?php endif; ?> <?php endforeach; ?> <?php endif; ?> PKCA#]��~�jjCsystem/helixultimate/overrides/com_newsfeeds/categories/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; // Add strings for translations in Javascript. Text::script('JGLOBAL_EXPAND_CATEGORIES'); Text::script('JGLOBAL_COLLAPSE_CATEGORIES'); /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->getRegistry()->addExtensionRegistryFile('com_categories'); $wa->useScript('com_categories.shared-categories-accordion'); ?> <div class="com-newsfeeds-categories categories-list"> <?php echo LayoutHelper::render('joomla.content.categories_default', $this); ?> <?php echo $this->loadTemplate('items'); ?> </div> PKCA#]���3��Asystem/helixultimate/overrides/com_newsfeeds/newsfeed/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Layout\LayoutHelper; use Joomla\Filter\OutputFilter; ?> <?php if (!empty($this->msg)) : ?> <?php echo $this->msg; ?> <?php else : ?> <?php $lang = $this->getLanguage(); ?> <?php $myrtl = $this->item->rtl; ?> <?php $direction = ' '; ?> <?php $isRtl = $lang->isRtl(); ?> <?php if ($isRtl && $myrtl == 0) : ?> <?php $direction = ' redirect-rtl'; ?> <?php elseif ($isRtl && $myrtl == 1) : ?> <?php $direction = ' redirect-ltr'; ?> <?php elseif ($isRtl && $myrtl == 2) : ?> <?php $direction = ' redirect-rtl'; ?> <?php elseif ($myrtl == 0) : ?> <?php $direction = ' redirect-ltr'; ?> <?php elseif ($myrtl == 1) : ?> <?php $direction = ' redirect-ltr'; ?> <?php elseif ($myrtl == 2) : ?> <?php $direction = ' redirect-rtl'; ?> <?php endif; ?> <?php $images = json_decode($this->item->images); ?> <div class="com-newsfeeds-newsfeed newsfeed<?php echo $direction; ?>"> <?php if ($this->params->get('display_num')) : ?> <h1 class="<?php echo $direction; ?>"> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> <?php endif; ?> <h2 class="<?php echo $direction; ?>"> <?php if ($this->item->published == 0) : ?> <span class="badge bg-warning text-light"><?php echo Text::_('JUNPUBLISHED'); ?></span> <?php endif; ?> <a href="<?php echo $this->item->link; ?>" target="_blank" rel="noopener"> <?php echo str_replace(''', "'", $this->item->name); ?> </a> </h2> <?php if ($this->params->get('show_tags', 1)) : ?> <?php $this->item->tagLayout = new FileLayout('joomla.content.tags'); ?> <?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?> <?php endif; ?> <!-- Show Images from Component --> <?php if (isset($images->image_first) && !empty($images->image_first)) : ?> <?php $imgfloat = empty($images->float_first) ? $this->params->get('float_first') : $images->float_first; ?> <div class="com-newsfeeds-newsfeed__first-image img-intro-<?php echo $this->escape($imgfloat); ?>"> <figure> <?php echo LayoutHelper::render( 'joomla.html.image', [ 'src' => $images->image_first, 'alt' => empty($images->image_first_alt) && empty($images->image_first_alt_empty) ? false : $images->image_first_alt, ] ); ?> <?php if ($images->image_first_caption) : ?> <figcaption class="caption"><?php echo $this->escape($images->image_first_caption); ?></figcaption> <?php endif; ?> </figure> </div> <?php endif; ?> <?php if (isset($images->image_second) && !empty($images->image_second)) : ?> <?php $imgfloat = empty($images->float_second) ? $this->params->get('float_second') : $images->float_second; ?> <div class="com-newsfeeds-newsfeed__second-image float-<?php echo $this->escape($imgfloat); ?> item-image"> <figure> <?php echo LayoutHelper::render( 'joomla.html.image', [ 'src' => $images->image_second, 'alt' => empty($images->image_second_alt) && empty($images->image_second_alt_empty) ? false : $images->image_second_alt, ] ); ?> <?php if ($images->image_second_caption) : ?> <figcaption class="caption"><?php echo $this->escape($images->image_second_caption); ?></figcaption> <?php endif; ?> </figure> </div> <?php endif; ?> <!-- Show Description from Component --> <?php echo $this->item->description; ?> <!-- Show Feed's Description --> <?php if ($this->params->get('show_feed_description')) : ?> <div class="com-newsfeeds-newsfeed__description feed-description"> <?php echo str_replace(''', "'", $this->rssDoc->description); ?> </div> <?php endif; ?> <!-- Show Image --> <?php if ($this->rssDoc->image && $this->params->get('show_feed_image')) : ?> <div class="com-newsfeeds-newsfeed__feed-image"> <?php echo LayoutHelper::render( 'joomla.html.image', [ 'src' => $this->rssDoc->image->uri, 'alt' => $this->rssDoc->image->title, ] ); ?> </div> <?php endif; ?> <!-- Show items --> <?php if (!empty($this->rssDoc[0])) : ?> <ul class="com-newsfeeds-newsfeed__items"> <?php for ($i = 0; $i < $this->item->numarticles; $i++) : ?> <?php if (empty($this->rssDoc[$i])) : ?> <?php break; ?> <?php endif; ?> <?php $uri = $this->rssDoc[$i]->uri || !$this->rssDoc[$i]->isPermaLink ? trim($this->rssDoc[$i]->uri) : trim($this->rssDoc[$i]->guid); ?> <?php $uri = !$uri || stripos($uri, 'http') !== 0 ? $this->item->link : $uri; ?> <?php $text = $this->rssDoc[$i]->content !== '' ? trim($this->rssDoc[$i]->content) : ''; ?> <li> <?php if (!empty($uri)) : ?> <h3 class="feed-link"> <a href="<?php echo htmlspecialchars($uri); ?>" target="_blank" rel="noopener"> <?php echo trim($this->rssDoc[$i]->title); ?> </a> </h3> <?php else : ?> <h3 class="feed-link"><?php echo trim($this->rssDoc[$i]->title); ?></h3> <?php endif; ?> <?php if ($this->params->get('show_item_description') && $text !== '') : ?> <div class="feed-item-description"> <?php if ($this->params->get('show_feed_image', 0) == 0) : ?> <?php $text = OutputFilter::stripImages($text); ?> <?php endif; ?> <?php $text = HTMLHelper::_('string.truncate', $text, $this->params->get('feed_character_count')); ?> <?php echo str_replace(''', "'", $text); ?> </div> <?php endif; ?> </li> <?php endfor; ?> </ul> <?php endif; ?> </div> <?php endif; ?> PKCA#]@��~� � <system/helixultimate/overrides/layouts/joomla/modal/main.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Layout\LayoutHelper; use Joomla\Utilities\ArrayHelper; /** * This modal/main.php file is not exists at Joomla 4. * So for Joomla 4 don't proceed. */ if (JVERSION >= 4) { return; } // Load bootstrap-tooltip-extended plugin for additional tooltip positions in modal HTMLHelper::_('bootstrap.tooltipExtended'); extract($displayData); /** * Layout variables * ------------------ * @param string $selector Unique DOM identifier for the modal. CSS id without # * @param array $params Modal parameters. Default supported parameters: * - title string The modal title * - backdrop mixed A boolean select if a modal-backdrop element should be included (default = true) * The string 'static' includes a backdrop which doesn't close the modal on click. * - keyboard boolean Closes the modal when escape key is pressed (default = true) * - closeButton boolean Display modal close button (default = true) * - animation boolean Fade in from the top of the page (default = true) * - url string URL of a resource to be inserted as an <iframe> inside the modal body * - height string height of the <iframe> containing the remote resource * - width string width of the <iframe> containing the remote resource * - bodyHeight int Optional height of the modal body in viewport units (vh) * - modalWidth int Optional width of the modal in viewport units (vh) * - footer string Optional markup for the modal footer * @param string $body Markup for the modal body. Appended after the <iframe> if the URL option is set * */ $modalClasses = array('modal', 'hide'); if (!isset($params['animation']) || $params['animation']) { $modalClasses[] = 'fade'; } $modalWidth = isset($params['modalWidth']) ? round((int) $params['modalWidth'], -1) : ''; if ($modalWidth && $modalWidth > 0 && $modalWidth <= 100) { $modalClasses[] = 'jviewport-width' . $modalWidth; } $modalAttributes = array( 'tabindex' => '-1', 'class' => implode(' ', $modalClasses) ); if (isset($params['backdrop'])) { $modalAttributes['data-backdrop'] = (is_bool($params['backdrop']) ? ($params['backdrop'] ? 'true' : 'false') : $params['backdrop']); } if (isset($params['keyboard'])) { $modalAttributes['data-keyboard'] = (is_bool($params['keyboard']) ? ($params['keyboard'] ? 'true' : 'false') : 'true'); } /** * These lines below are for disabling scrolling of parent window. * $('body').addClass('modal-open'); * $('body').removeClass('modal-open') * * Scrolling inside bootstrap modals on small screens (adapt to window viewport and avoid modal off screen). * - max-height .modal-body Max-height for the modal body * When height of the modal is too high for the window viewport height. * - max-height .iframe Max-height for the iframe (Deducting the padding of the modal-body) * When URL option is set and height of the iframe is higher than max-height of the modal body. * * Fix iOS scrolling inside bootstrap modals * - overflow-y .modal-body When max-height is set for modal-body * * Specific hack for Bootstrap 2.3.x */ $script[] = "jQuery(document).ready(function($) {"; $script[] = " $('#" . $selector . "').on('show.bs.modal', function() {"; $script[] = " if ($('#{$selector}').hasClass('hide')) {"; $script[] = " $('#{$selector}').removeClass('hide');"; $script[] = " }"; $script[] = " $('body').addClass('modal-open');"; if (isset($params['url'])) { $iframeHtml = LayoutHelper::render('joomla.modal.iframe', $displayData); // Script for destroying and reloading the iframe $script[] = " var modalBody = $(this).find('.modal-body');"; $script[] = " modalBody.find('iframe').remove();"; $script[] = " modalBody.prepend('" . trim($iframeHtml) . "');"; } else { // Set modalTooltip container to modal ID (selector), and placement to top-left if no data attribute (bootstrap-tooltip-extended.js) $script[] = " $('.modalTooltip').each(function(){;"; $script[] = " var attr = $(this).attr('data-placement');"; $script[] = " if ( attr === undefined || attr === false ) $(this).attr('data-placement', 'auto-dir top-left')"; $script[] = " });"; $script[] = " $('.modalTooltip').tooltip({'html': true, 'container': '#" . $selector . "'});"; } // Adapt modal body max-height to window viewport if needed, when the modal has been made visible to the user. $script[] = " }).on('shown.bs.modal', function() {"; // Get height of the modal elements. $script[] = " var modalHeight = $('div.modal:visible').outerHeight(true),"; $script[] = " modalHeaderHeight = $('div.modal-header:visible').outerHeight(true),"; $script[] = " modalBodyHeightOuter = $('div.modal-body:visible').outerHeight(true),"; $script[] = " modalBodyHeight = $('div.modal-body:visible').height(),"; $script[] = " modalFooterHeight = $('div.modal-footer:visible').outerHeight(true),"; // Get padding top (jQuery position().top not working on iOS devices and webkit browsers, so use of Javascript instead) $script[] = " padding = document.getElementById('" . $selector . "').offsetTop,"; // Calculate max-height of the modal, adapted to window viewport height. $script[] = " maxModalHeight = ($(window).height()-(padding*2)),"; // Calculate max-height for modal-body. $script[] = " modalBodyPadding = (modalBodyHeightOuter-modalBodyHeight),"; $script[] = " maxModalBodyHeight = maxModalHeight-(modalHeaderHeight+modalFooterHeight+modalBodyPadding);"; if (isset($params['url'])) { // Set max-height for iframe if needed, to adapt to viewport height. $script[] = " var iframeHeight = $('.iframe').height();"; $script[] = " if (iframeHeight > maxModalBodyHeight){;"; $script[] = " $('.modal-body').css({'max-height': maxModalBodyHeight, 'overflow-y': 'auto'});"; $script[] = " $('.iframe').css('max-height', maxModalBodyHeight-modalBodyPadding);"; $script[] = " }"; } else { // Set max-height for modal-body if needed, to adapt to viewport height. $script[] = " if (modalHeight > maxModalHeight){;"; $script[] = " $('.modal-body').css({'max-height': maxModalBodyHeight, 'overflow-y': 'auto'});"; $script[] = " }"; } $script[] = " }).on('hide.bs.modal', function () {"; $script[] = " if (!$('#{$selector}').hasClass('hide')) {"; $script[] = " $('#{$selector}').addClass('hide');"; $script[] = " }"; $script[] = " $('body').removeClass('modal-open');"; $script[] = " $('.modal-body').css({'max-height': 'initial', 'overflow-y': 'initial'});"; $script[] = " $('.modalTooltip').tooltip('destroy');"; $script[] = " });"; $script[] = "});"; Factory::getDocument()->addScriptDeclaration(implode("\n", $script)); ?> <div id="<?php echo $selector; ?>" <?php echo ArrayHelper::toString($modalAttributes); ?>> <div class="modal-dialog" role="document" style="max-width: <?php echo $params['width']; ?>; max-height: <?php echo $params['height']; ?>;"> <div class="modal-content"> <?php // Header if (!isset($params['closeButton']) || isset($params['title']) || $params['closeButton']) { echo LayoutHelper::render('joomla.modal.header', $displayData); } // Body echo LayoutHelper::render('joomla.modal.body', $displayData); // Footer if (isset($params['footer'])) { echo LayoutHelper::render('joomla.modal.footer', $displayData); } ?> </div> </div> </div> PKCA#]F:%%Fsystem/helixultimate/overrides/layouts/joomla/links/groupseparator.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; ?> <div class="j-links-separator"></div> PKCA#]�N���Asystem/helixultimate/overrides/layouts/joomla/links/groupopen.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\Filter\OutputFilter; ?> <h2 class="nav-header"><?php echo OutputFilter::ampReplace(Text::_($displayData)); ?></h2> <ul class="j-links-group nav nav-list"> PKCA#]�I،Csystem/helixultimate/overrides/layouts/joomla/links/groupsclose.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; ?> </div> PKCA#]hMs�Bsystem/helixultimate/overrides/layouts/joomla/links/groupsopen.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; ?> <div class="j-links-groups"> PKCA#]��%�Bsystem/helixultimate/overrides/layouts/joomla/links/groupclose.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; ?> </ul> PKCA#]�6I�yy<system/helixultimate/overrides/layouts/joomla/links/link.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\Filter\OutputFilter; $id = empty($displayData['id']) ? '' : (' id="' . $displayData['id'] . '"'); $target = empty($displayData['target']) ? '' : (' target="' . $displayData['target'] . '"'); $rel = empty($displayData['rel']) ? '' : (' rel="' . $displayData['rel'] . '"'); $onclick = empty($displayData['onclick']) ? '' : (' onclick="' . $displayData['onclick'] . '"'); $title = empty($displayData['title']) ? '' : (' title="' . $this->escape($displayData['title']) . '"'); $text = empty($displayData['text']) ? '' : ('<span class="j-links-link">' . $displayData['text'] . '</span>') ?> <li<?php echo $id; ?>> <a href="<?php echo OutputFilter::ampReplace($displayData['link']); ?>"<?php echo $target . $rel . $onclick . $title; ?>> <span class="<?php echo $displayData['image']; ?>" aria-hidden="true"></span> <?php echo $text; ?> </a> </li> PKCA#]���vEEAsystem/helixultimate/overrides/layouts/joomla/pagination/list.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $list = $displayData['list']; $startDisabled = $list['start']['active'] ? '' : ' disabled'; $prevDisabled = $list['previous']['active'] ? '' : ' disabled'; $nextDisabled = $list['next']['active'] ? '' : ' disabled'; $endDisabled = $list['end']['active'] ? '' : ' disabled'; ?> <ul class="pagination ms-0 mb-4"> <?php echo $list['start']['data']; ?> <?php echo $list['previous']['data']; ?> <?php foreach ($list['pages'] as $page) : ?> <?php echo $page['data']; ?> <?php endforeach; ?> <?php echo $list['next']['data']; ?> <?php echo $list['end']['data']; ?> </ul>PKCA#]��Vu u Bsystem/helixultimate/overrides/layouts/joomla/pagination/links.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; use Joomla\Registry\Registry; $list = $displayData['list']; $pages = $list['pages']; $options = new Registry($displayData['options']); $showLimitBox = $options->get('showLimitBox', true); $showPagesLinks = $options->get('showPagesLinks', true); $showLimitStart = $options->get('showLimitStart', true); // Calculate to display range of pages $currentPage = 1; $range = 1; $step = 5; if (!empty($pages['pages'])) { foreach ($pages['pages'] as $k => $page) { if (!$page['active']) { $currentPage = $k; } } } if ($currentPage >= $step) { if ($currentPage % $step === 0) { $range = ceil($currentPage / $step) + 1; } else { $range = ceil($currentPage / $step); } } ?> <div class="pagination pagination-toolbar clearfix" style="text-align: center;"> <?php if ($showLimitBox) : ?> <div class="limit float-end"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM') . $list['limitfield']; ?> </div> <?php endif; ?> <?php if ($showPagesLinks && (!empty($pages))) : ?> <ul class="pagination-list d-flex list-unstyled ms-2"> <?php echo LayoutHelper::render('joomla.pagination.link', $pages['start']); echo LayoutHelper::render('joomla.pagination.link', $pages['previous']); ?> <?php foreach ($pages['pages'] as $k => $page) : ?> <?php $output = LayoutHelper::render('joomla.pagination.link', $page); ?> <?php if (in_array($k, range($range * $step - ($step + 1), $range * $step), true)) : ?> <?php if (($k % $step === 0 || $k === $range * $step - ($step + 1)) && $k !== $currentPage && $k !== $range * $step - $step) : ?> <?php $output = preg_replace('#(<a.*?>).*?(</a>)#', '$1...$2', $output); ?> <?php endif; ?> <?php endif; ?> <?php echo $output; ?> <?php endforeach; ?> <?php echo LayoutHelper::render('joomla.pagination.link', $pages['next']); echo LayoutHelper::render('joomla.pagination.link', $pages['end']); ?> </ul> <?php endif; ?> <?php if ($showLimitStart) : ?> <input type="hidden" name="<?php echo $list['prefix']; ?>limitstart" value="<?php echo $list['limitstart']; ?>"> <?php endif; ?> </div> PKCA#]泉�WWAsystem/helixultimate/overrides/layouts/joomla/pagination/link.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; $item = $displayData['data']; $display = $item->text; $app = Factory::getApplication(); $iconClass = null; $aria = ''; switch ((string) $item->text) { // Start case Text::_('JLIB_HTML_START'): $iconClass = $app->getLanguage()->isRtl() ? 'fas fa-angle-double-right' : 'fas fa-angle-double-left'; $aria = Text::sprintf('JLIB_HTML_GOTO_POSITION', strtolower($item->text)); break; // Previous case Text::_('JPREV'): $item->text = Text::_('JPREVIOUS'); $iconClass = $app->getLanguage()->isRtl() ? 'fas fa-angle-right' : 'fas fa-angle-left'; $aria = Text::sprintf('JLIB_HTML_GOTO_POSITION', strtolower($item->text)); break; // Next case Text::_('JNEXT'): $iconClass = $app->getLanguage()->isRtl() ? 'fas fa-angle-left' : 'fas fa-angle-right'; $aria = Text::sprintf('JLIB_HTML_GOTO_POSITION', strtolower($item->text)); break; // End case Text::_('JLIB_HTML_END'): $iconClass = $app->getLanguage()->isRtl() ? 'fas fa-angle-double-left' : 'fas fa-angle-double-right'; $aria = Text::sprintf('JLIB_HTML_GOTO_POSITION', strtolower($item->text)); break; default: $aria = Text::sprintf('JLIB_HTML_GOTO_PAGE', strtolower($item->text)); break; } // Build link & class for active items if ($displayData['active']) { $limit = ($item->base > 0) ? ('limitstart.value=' . (int) $item->base) : 'limitstart.value=0'; $class = 'active'; if ($app->isClient('administrator')) { $escapedPrefix = htmlspecialchars($item->prefix ?? '', ENT_QUOTES, 'UTF-8'); $link = 'href="#" onclick="document.adminForm.' . $escapedPrefix . $limit . '; Joomla.submitform();return false;"'; } elseif ($app->isClient('site')) { $escapedLink = htmlspecialchars($item->link ?? '', ENT_QUOTES, 'UTF-8'); $link = 'href="' . $escapedLink . '"'; } } else { $class = (property_exists($item, 'active') && $item->active) ? 'active' : 'disabled'; } ?> <?php if ($displayData['active']) : ?> <li class="page-item"> <a aria-label="<?php echo htmlspecialchars($aria, ENT_QUOTES, 'UTF-8'); ?>" <?php echo $link; ?> class="page-link"> <?php if ($iconClass): ?> <span class="<?php echo $iconClass; ?>" aria-hidden="true"></span> <?php else: ?> <?php echo htmlspecialchars($display, ENT_QUOTES, 'UTF-8'); ?> <?php endif; ?> </a> </li> <?php elseif (isset($item->active) && $item->active) : ?> <?php $aria = Text::sprintf('JLIB_HTML_PAGE_CURRENT', strtolower($item->text)); ?> <li class="<?php echo $class; ?> page-item"> <span aria-current="true" aria-label="<?php echo htmlspecialchars($aria, ENT_QUOTES, 'UTF-8'); ?>" class="page-link"> <?php if ($iconClass): ?> <span class="<?php echo $iconClass; ?>" aria-hidden="true"></span> <?php else: ?> <?php echo htmlspecialchars($display, ENT_QUOTES, 'UTF-8'); ?> <?php endif; ?> </span> </li> <?php else : ?> <li class="<?php echo $class; ?> page-item"> <span class="page-link" aria-hidden="true"> <?php if ($iconClass): ?> <span class="<?php echo $iconClass; ?>" aria-hidden="true"></span> <?php else: ?> <?php echo htmlspecialchars($display, ENT_QUOTES, 'UTF-8'); ?> <?php endif; ?> </span> </li> <?php endif; ?> PKCA#]���JTTBsystem/helixultimate/overrides/layouts/joomla/sidebars/submenu.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2012 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\Filter\OutputFilter; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = \Joomla\CMS\Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('core'); ?> <?php if ($displayData->displayMenu || $displayData->displayFilters) : ?> <div id="j-toggle-sidebar-wrapper"> <div id="sidebar" class="sidebar"> <button class="btn btn-sm btn-secondary my-2 options-menu d-md-none" type="button" data-bs-toggle="collapse" data-bs-target=".sidebar-nav" aria-controls="sidebar-nav" aria-expanded="false" aria-label="<?php echo Text::_('JTOGGLE_SIDEBAR_MENU'); ?>"> <span class="icon-align-justify" aria-hidden="true"></span> <?php echo Text::_('JTOGGLE_SIDEBAR_MENU'); ?> </button> <div class="sidebar-nav"> <?php if ($displayData->displayMenu) : ?> <ul class="nav flex-column"> <?php foreach ($displayData->list as $item) : if (isset($item[2]) && $item[2] == 1) : ?> <li class="active"> <?php else : ?> <li> <?php endif; if ($displayData->hide) : ?> <a class="nolink"><?php echo $item[0]; ?></a> <?php else : if ($item[1] !== '') : ?> <a href="<?php echo OutputFilter::ampReplace($item[1]); ?>"><?php echo $item[0]; ?></a> <?php else : ?> <?php echo $item[0]; ?> <?php endif; endif; ?> </li> <?php endforeach; ?> </ul> <?php endif; ?> <?php if ($displayData->displayMenu && $displayData->displayFilters) : ?> <hr> <?php endif; ?> <?php if ($displayData->displayFilters) : ?> <div class="filter-select d-none d-md-block"> <h4 class="page-header"><?php echo Text::_('JSEARCH_FILTER_LABEL'); ?></h4> <?php foreach ($displayData->filters as $filter) : ?> <label for="<?php echo $filter['name']; ?>" class="visually-hidden"><?php echo $filter['label']; ?></label> <select name="<?php echo $filter['name']; ?>" id="<?php echo $filter['name']; ?>" class="form-select" onchange="this.form.submit()"> <?php if (!$filter['noDefault']) : ?> <option value=""><?php echo $filter['label']; ?></option> <?php endif; ?> <?php echo $filter['options']; ?> </select> <hr> <?php endforeach; ?> </div> <?php endif; ?> </div> </div> <div id="j-toggle-sidebar"></div> </div> <?php endif; ?> PKCA#]�gq(��Asystem/helixultimate/overrides/layouts/joomla/html/batch/user.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var boolean $noUser Inject an option for no user? */ $optionNo = ''; if ($noUser) { $optionNo = '<option value="0">' . Text::_('JLIB_HTML_BATCH_USER_NOUSER') . '</option>'; } ?> <label id="batch-user-lbl" for="batch-user-id"> <?php echo Text::_('JLIB_HTML_BATCH_USER_LABEL'); ?> </label> <select name="batch[user_id]" class="form-select" id="batch-user-id"> <option value=""><?php echo Text::_('JLIB_HTML_BATCH_USER_NOCHANGE'); ?></option> <?php echo $optionNo; ?> <?php echo HTMLHelper::_('select.options', HTMLHelper::_('user.userlist'), 'value', 'text'); ?> </select> PKCA#]�ڮ�44Asystem/helixultimate/overrides/layouts/joomla/html/batch/item.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var string $extension The extension name */ // Create the copy/move options. $options = [ HTMLHelper::_('select.option', 'c', Text::_('JLIB_HTML_BATCH_COPY')), HTMLHelper::_('select.option', 'm', Text::_('JLIB_HTML_BATCH_MOVE')) ]; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('joomla.batch-copymove'); ?> <label id="batch-choose-action-lbl" for="batch-category-id"> <?php echo Text::_('JLIB_HTML_BATCH_MENU_LABEL'); ?> </label> <div id="batch-choose-action" class="control-group"> <select name="batch[category_id]" class="form-select" id="batch-category-id"> <option value=""><?php echo Text::_('JLIB_HTML_BATCH_NO_CATEGORY'); ?></option> <?php if (isset($addRoot) && $addRoot) : ?> <?php echo HTMLHelper::_('select.options', HTMLHelper::_('category.categories', $extension)); ?> <?php else : ?> <?php echo HTMLHelper::_('select.options', HTMLHelper::_('category.options', $extension)); ?> <?php endif; ?> </select> </div> <div id="batch-copy-move" class="control-group radio"> <fieldset id="batch-copy-move-id"> <legend> <?php echo Text::_('JLIB_HTML_BATCH_MOVE_QUESTION'); ?> </legend> <?php echo HTMLHelper::_('select.radiolist', $options, 'batch[move_copy]', '', 'value', 'text', 'm'); ?> </fieldset> </div> PKCA#]TӪ���Csystem/helixultimate/overrides/layouts/joomla/html/batch/access.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; ?> <label id="batch-access-lbl" for="batch-access"> <?php echo Text::_('JLIB_HTML_BATCH_ACCESS_LABEL'); ?> </label> <?php echo HTMLHelper::_( 'access.assetgrouplist', 'batch[assetgroup_id]', '', 'class="form-select"', [ 'title' => Text::_('JLIB_HTML_BATCH_NOCHANGE'), 'id' => 'batch-access' ] ); PKCA#].���Esystem/helixultimate/overrides/layouts/joomla/html/batch/language.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; ?> <label id="batch-language-lbl" for="batch-language-id"> <?php echo Text::_('JLIB_HTML_BATCH_LANGUAGE_LABEL'); ?> </label> <select name="batch[language_id]" class="form-select" id="batch-language-id"> <option value=""><?php echo Text::_('JLIB_HTML_BATCH_LANGUAGE_NOCHANGE'); ?></option> <?php echo HTMLHelper::_('select.options', HTMLHelper::_('contentlanguage.existing', true, true), 'value', 'text'); ?> </select> PKCA#]�UB��Jsystem/helixultimate/overrides/layouts/joomla/html/batch/adminlanguage.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; ?> <label id="batch-language-lbl" for="batch-language-id"> <?php echo Text::_('JLIB_HTML_BATCH_LANGUAGE_LABEL'); ?> </label> <select name="batch[language_id]" class="form-select" id="batch-language-id"> <option value=""><?php echo Text::_('JLIB_HTML_BATCH_LANGUAGE_NOCHANGE'); ?></option> <?php echo HTMLHelper::_('select.options', HTMLHelper::_('adminlanguage.existing', true, true), 'value', 'text'); ?> </select> PKCA#]��g�@system/helixultimate/overrides/layouts/joomla/html/batch/tag.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; // Create the add/remove tag options. $options = [ HTMLHelper::_('select.option', 'a', Text::_('JLIB_HTML_BATCH_TAG_ADD')), HTMLHelper::_('select.option', 'r', Text::_('JLIB_HTML_BATCH_TAG_REMOVE')) ]; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('joomla.batch-tag-addremove'); ?> <label id="batch-tag-choose-action-lbl" for="batch-tag-id"> <?php echo Text::_('JLIB_HTML_BATCH_TAG_LABEL'); ?> </label> <div id="batch-tag-choose-action" class="control-group"> <select name="batch[tag]" class="form-select" id="batch-tag-id"> <option value=""><?php echo Text::_('JLIB_HTML_BATCH_TAG_NOCHANGE'); ?></option> <?php echo HTMLHelper::_('select.options', HTMLHelper::_('tag.tags', ['filter.published' => [1]]), 'value', 'text'); ?> </select> </div> <div id="batch-tag-addremove" class="control-group radio"> <fieldset id="batch-tag-addremove-id"> <legend> <?php echo Text::_('JLIB_HTML_BATCH_TAG_ADDREMOVE_QUESTION'); ?> </legend> <?php echo HTMLHelper::_('select.radiolist', $options, 'batch[tag_addremove]', '', 'value', 'text', 'a'); ?> </fieldset> </div> PKCA#]Ď�LLLJsystem/helixultimate/overrides/layouts/joomla/html/batch/workflowstage.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; ?> <label id="batch-workflowstage-lbl" for="batch-workflowstage-id"> <?php echo Text::_('JLIB_HTML_BATCH_WORKFLOW_STAGE_LABEL'); ?> </label> <?php $attr = [ 'id' => 'batch-workflowstage-id', 'group.label' => 'text', 'group.items' => null, 'list.attr' => [ 'class' => 'form-select' ] ]; $groups = HTMLHelper::_('workflowstage.existing', ['title' => Text::_('JLIB_HTML_BATCH_WORKFLOW_STAGE_NOCHANGE')]); echo HTMLHelper::_('select.groupedlist', $groups, 'batch[workflowstage_id]', $attr); PKCA#]2��;55Asystem/helixultimate/overrides/layouts/joomla/html/treeprefix.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var integer $level The level of the item in the tree like structure. * * @since 3.6.0 */ if ($level > 1) { echo '<span class="text-muted">' . str_repeat('⋮ ', (int) $level - 2) . '</span>– '; } PKCA#]�M`���<system/helixultimate/overrides/layouts/joomla/html/image.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\Utilities\ArrayHelper; $img = HTMLHelper::_('cleanImageURL', $displayData['src']); $displayData['src'] = $this->escape($img->url); if (isset($displayData['alt'])) { if ($displayData['alt'] === false) { unset($displayData['alt']); } else { $displayData['alt'] = $this->escape($displayData['alt']); } } if ($img->attributes['width'] > 0 && $img->attributes['height'] > 0) { $displayData['width'] = $img->attributes['width']; $displayData['height'] = $img->attributes['height']; if (empty($displayData['loading'])) { $displayData['loading'] = 'lazy'; } } echo '<img ' . ArrayHelper::toString($displayData) . '>'; PKCA#]Q2�C��Csystem/helixultimate/overrides/layouts/joomla/edit/associations.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; $form = $displayData->getForm(); $options = [ 'formControl' => $form->getFormControl(), 'hidden' => (int) ($form->getValue('language', null, '*') === '*'), ]; // Load JavaScript message titles Text::script('ERROR'); Text::script('WARNING'); Text::script('NOTICE'); Text::script('MESSAGE'); Text::script('JGLOBAL_ASSOC_NOT_POSSIBLE'); Text::script('JGLOBAL_ASSOCIATIONS_RESET_WARNING'); /** @var \Joomla\CMS\Document\HtmlDocument $doc */ $doc = Factory::getApplication()->getDocument(); $wa = $doc->getWebAssetManager(); $wa->getRegistry()->addExtensionRegistryFile('com_associations'); $wa->useScript('com_associations.associations-edit'); $doc->addScriptOptions('system.associations.edit', $options); // JLayout for standard handling of associations fields in the administrator items edit screens. echo $form->renderFieldset('item_associations'); PKCA#]�N"���?system/helixultimate/overrides/layouts/joomla/edit/fieldset.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; $app = Factory::getApplication(); $form = $displayData->getForm(); $name = $displayData->get('fieldset'); $fieldSet = $form->getFieldset($name); if (empty($fieldSet)) { return; } $ignoreFields = $displayData->get('ignore_fields') ? : []; $extraFields = $displayData->get('extra_fields') ? : []; if (!empty($displayData->showOptions) || $displayData->get('show_options', 1)) { if (isset($extraFields[$name])) { foreach ($extraFields[$name] as $f) { if (in_array($f, $ignoreFields)) { continue; } if ($form->getField($f)) { $fieldSet[] = $form->getField($f); } } } $html = []; foreach ($fieldSet as $field) { $html[] = $field->renderField(); } echo implode('', $html); } else { $html = []; $html[] = '<div class="hidden">'; foreach ($fieldSet as $field) { $html[] = $field->input; } $html[] = '</div>'; echo implode('', $html); } PKCA#]�� Ksystem/helixultimate/overrides/layouts/joomla/edit/frontediting_modules.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; // JLayout for standard handling of the edit modules: $moduleHtml = &$displayData['moduleHtml']; $mod = $displayData['module']; $position = $displayData['position']; $menusEditing = $displayData['menusediting']; $parameters = ComponentHelper::getParams('com_modules'); $redirectUri = '&return=' . urlencode(base64_encode(Uri::getInstance()->toString())); $target = '_blank'; $itemid = Factory::getApplication()->getInput()->get('Itemid', '0', 'int'); $editUrl = Uri::base() . 'administrator/index.php?option=com_modules&task=module.edit&id=' . (int) $mod->id; // If Module editing site if ($parameters->get('redirect_edit', 'site') === 'site') { $editUrl = Uri::base() . 'index.php?option=com_config&view=modules&id=' . (int) $mod->id . '&Itemid=' . $itemid . $redirectUri; $target = '_self'; } // Add link for editing the module $count = 0; $moduleHtml = preg_replace( // Find first tag of module '/^(\s*<(?:div|span|nav|ul|ol|h\d|section|aside|address|article|form) [^>]*>)/', // Create and add the edit link and tooltip '\\1 <a class="btn btn-link jmodedit" href="' . $editUrl . '" target="' . $target . '" aria-describedby="tip-' . (int) $mod->id . '"> <span class="icon-edit" aria-hidden="true"></span><span class="visually-hidden">' . Text::_('JGLOBAL_EDIT') . '</span></a> <div role="tooltip" id="tip-' . (int) $mod->id . '">' . Text::_('JLIB_HTML_EDIT_MODULE') . '<br>' . htmlspecialchars($mod->title, ENT_COMPAT, 'UTF-8') . '<br>' . sprintf(Text::_('JLIB_HTML_EDIT_MODULE_IN_POSITION'), htmlspecialchars($position, ENT_COMPAT, 'UTF-8')) . '</div>', $moduleHtml, 1, $count ); // If menu editing is enabled and allowed and it's a menu module add link for editing if ($menusEditing && $mod->module === 'mod_menu') { // find the menu item id $regex = '/\bitem-(\d+)\b/'; preg_match_all($regex, $moduleHtml, $menuItemids); if ($menuItemids) { foreach ($menuItemids[1] as $menuItemid) { $menuitemEditUrl = Uri::base() . 'administrator/index.php?option=com_menus&view=item&client_id=0&layout=edit&id=' . (int) $menuItemid; $moduleHtml = preg_replace( // Find the link '/(<li.*?\bitem-' . $menuItemid . '.*?>)/', // Create and add the edit link '\\1 <a class="jmenuedit small" href="' . $menuitemEditUrl . '" target="' . $target . '" title="' . Text::_('JLIB_HTML_EDIT_MENU_ITEM') . ' ' . sprintf(Text::_('JLIB_HTML_EDIT_MENU_ITEM_ID'), (int) $menuItemid) . '"> <span class="icon-edit" aria-hidden="true"></span></a>', $moduleHtml ); } } } PKCA#]ݰC��Asystem/helixultimate/overrides/layouts/joomla/edit/item_title.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); $title = $displayData->getForm()->getValue('title'); $name = $displayData->getForm()->getValue('name'); ?> <?php if ($title) : ?> <h4><?php echo $title; ?></h4> <?php endif; ?> <?php if ($name) : ?> <h4><?php echo $name; ?></h4> <?php endif; PKCA#]];^W��Dsystem/helixultimate/overrides/layouts/joomla/edit/admin_modules.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Helper\ModuleHelper; $app = Factory::getApplication(); $form = $displayData->getForm(); $input = $app->getInput(); $fields = $displayData->get('fields') ?: [ ['parent', 'parent_id'], ['published', 'state', 'enabled'], ['category', 'catid'], 'featured', 'sticky', 'access', 'language', 'tags', 'note', 'version_note', ]; $hiddenFields = $displayData->get('hidden_fields') ?: []; if (!ModuleHelper::isAdminMultilang()) { $hiddenFields[] = 'language'; $form->setFieldAttribute('language', 'default', '*'); } $html = []; $html[] = '<fieldset class="form-vertical">'; foreach ($fields as $field) { foreach ((array) $field as $f) { if ($form->getField($f)) { if (in_array($f, $hiddenFields)) { $form->setFieldAttribute($f, 'type', 'hidden'); } $html[] = $form->renderField($f); break; } } } $html[] = '</fieldset>'; echo implode('', $html); PKCA#]� o���Esystem/helixultimate/overrides/layouts/joomla/edit/publishingdata.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; $form = $displayData->getForm(); $fields = $displayData->get('fields') ?: [ 'publish_up', 'publish_down', 'featured_up', 'featured_down', ['created', 'created_time'], ['created_by', 'created_user_id'], 'created_by_alias', ['modified', 'modified_time'], ['modified_by', 'modified_user_id'], 'version', 'hits', 'id' ]; $hiddenFields = $displayData->get('hidden_fields') ?: []; foreach ($fields as $field) { foreach ((array) $field as $f) { if ($form->getField($f)) { if (in_array($f, $hiddenFields)) { $form->setFieldAttribute($f, 'type', 'hidden'); } echo $form->renderField($f); break; } } } PKCA#]IN"��>system/helixultimate/overrides/layouts/joomla/edit/details.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Multilanguage; use Joomla\CMS\Language\Text; $app = Factory::getApplication(); // JLayout for standard handling of the details sidebar in administrator edit screens. $title = $displayData->getForm()->getValue('title'); $published = $displayData->getForm()->getField('published'); $saveHistory = $displayData->get('state')->get('params')->get('save_history', 0); ?> <div class="col-lg-2"> <h4><?php echo Text::_('JDETAILS'); ?></h4> <hr> <fieldset class="form-vertical"> <?php if (empty($title)) : ?> <div class="control-group"> <div class="controls"> <?php echo $displayData->getForm()->getValue('name'); ?> </div> </div> <?php else : ?> <div class="control-group"> <div class="controls"> <?php echo $displayData->getForm()->getValue('title'); ?> </div> </div> <?php endif; ?> <?php if ($published) : ?> <?php echo $displayData->getForm()->renderField('published'); ?> <?php else : ?> <?php echo $displayData->getForm()->renderField('state'); ?> <?php endif; ?> <?php echo $displayData->getForm()->renderField('access'); ?> <?php echo $displayData->getForm()->renderField('featured'); ?> <?php if (Multilanguage::isEnabled()) : ?> <?php echo $displayData->getForm()->renderField('language'); ?> <?php else : ?> <input type="hidden" id="jform_language" name="jform[language]" value="<?php echo $displayData->getForm()->getValue('language'); ?>"> <?php endif; ?> <?php echo $displayData->getForm()->renderField('tags'); ?> <?php if ($saveHistory) : ?> <?php echo $displayData->getForm()->renderField('version_note'); ?> <?php endif; ?> </fieldset> </div> PKCA#]� �MBsystem/helixultimate/overrides/layouts/joomla/edit/title_alias.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; $form = $displayData->getForm(); $title = $form->getField('title') ? 'title' : ($form->getField('name') ? 'name' : ''); ?> <div class="row title-alias form-vertical mb-3"> <div class="col-12 col-md-6"> <?php echo $title ? $form->renderField($title) : ''; ?> </div> <div class="col-12 col-md-6"> <?php echo $form->renderField('alias'); ?> </div> </div> PKCA#]0,�##=system/helixultimate/overrides/layouts/joomla/edit/params.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; $app = Factory::getApplication(); $form = $displayData->getForm(); $fieldSets = $form->getFieldsets(); $helper = $displayData->get('useCoreUI', false) ? 'uitab' : 'bootstrap'; if (empty($fieldSets)) { return; } $ignoreFieldsets = $displayData->get('ignore_fieldsets') ?: []; $outputFieldsets = $displayData->get('output_fieldsets') ?: []; $ignoreFieldsetFields = $displayData->get('ignore_fieldset_fields') ?: []; $ignoreFields = $displayData->get('ignore_fields') ?: []; $extraFields = $displayData->get('extra_fields') ?: []; $tabName = $displayData->get('tab_name') ?: 'myTab'; // These are required to preserve data on save when fields are not displayed. $hiddenFieldsets = $displayData->get('hiddenFieldsets') ?: []; // These are required to configure showing and hiding fields in the editor. $configFieldsets = $displayData->get('configFieldsets') ?: []; // Handle the hidden fieldsets when show_options is set false if (!$displayData->get('show_options', 1)) { // The HTML buffer $html = []; // Loop over the fieldsets foreach ($fieldSets as $name => $fieldSet) { // Check if the fieldset should be ignored if (in_array($name, $ignoreFieldsets, true)) { continue; } // If it is a hidden fieldset, render the inputs if (in_array($name, $hiddenFieldsets)) { // Loop over the fields foreach ($form->getFieldset($name) as $field) { // Add only the input on the buffer $html[] = $field->input; } // Make sure the fieldset is not rendered twice $ignoreFieldsets[] = $name; } // Check if it is the correct fieldset to ignore if (strpos($name, 'basic') === 0) { // Ignore only the fieldsets which are defined by the options not the custom fields ones $ignoreFieldsets[] = $name; } } // Echo the hidden fieldsets echo implode('', $html); } $opentab = false; $xml = $form->getXml(); // Loop again over the fieldsets foreach ($fieldSets as $name => $fieldSet) { // Ensure any fieldsets we don't want to show are skipped (including repeating formfield fieldsets) if ( (isset($fieldSet->repeat) && $fieldSet->repeat === true) || in_array($name, $ignoreFieldsets) || (!empty($configFieldsets) && in_array($name, $configFieldsets, true)) || (!empty($hiddenFieldsets) && in_array($name, $hiddenFieldsets, true)) ) { continue; } // Determine the label if (!empty($fieldSet->label)) { $label = Text::_($fieldSet->label); } else { $label = strtoupper('JGLOBAL_FIELDSET_' . $name); if (Text::_($label) === $label) { $label = strtoupper($app->getInput()->get('option') . '_' . $name . '_FIELDSET_LABEL'); } $label = Text::_($label); } $hasChildren = $xml->xpath('//fieldset[@name="' . $name . '"]//fieldset[not(ancestor::field/form/*)]'); $hasParent = $xml->xpath('//fieldset//fieldset[@name="' . $name . '"]'); $isGrandchild = $xml->xpath('//fieldset//fieldset//fieldset[@name="' . $name . '"]'); if (!$isGrandchild && $hasParent) { echo '<fieldset id="fieldset-' . $name . '" class="options-form ' . (!empty($fieldSet->class) ? $fieldSet->class : '') . '">'; echo '<legend>' . $label . '</legend>'; // Include the description when available if (!empty($fieldSet->description)) { echo '<div class="alert alert-info">'; echo '<span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden">' . Text::_('INFO') . '</span> '; echo Text::_($fieldSet->description); echo '</div>'; } echo '<div class="form-grid">'; } elseif (!$hasParent) { // Tabs if ($opentab) { if ($opentab > 1) { echo '</div>'; echo '</fieldset>'; } // End previous tab echo HTMLHelper::_($helper . '.endTab'); } // Start the tab echo HTMLHelper::_($helper . '.addTab', $tabName, 'attrib-' . $name, $label); $opentab = 1; // Directly add a fieldset if we have no children if (!$hasChildren) { echo '<fieldset id="fieldset-' . $name . '" class="options-form ' . (!empty($fieldSet->class) ? $fieldSet->class : '') . '">'; echo '<legend>' . $label . '</legend>'; // Include the description when available if (!empty($fieldSet->description)) { echo '<div class="alert alert-info">'; echo '<span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden">' . Text::_('INFO') . '</span> '; echo Text::_($fieldSet->description); echo '</div>'; } echo '<div class="form-grid">'; $opentab = 2; } elseif (!empty($fieldSet->description)) { // Include the description when available echo '<div class="alert alert-info alert-parent">'; echo '<span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden">' . Text::_('INFO') . '</span> '; echo Text::_($fieldSet->description); echo '</div>'; } } // We're on the deepest level => output fields if (!$hasChildren) { // The name of the fieldset to render $displayData->fieldset = $name; // Force to show the options $displayData->showOptions = true; // Render the fieldset echo LayoutHelper::render('joomla.edit.fieldset', $displayData); } // Close open fieldset if (!$isGrandchild && $hasParent) { echo '</div>'; echo '</fieldset>'; } } if ($opentab) { if ($opentab > 1) { echo '</div>'; echo '</fieldset>'; } // End previous tab echo HTMLHelper::_($helper . '.endTab'); } PKCA#]��+���?system/helixultimate/overrides/layouts/joomla/edit/metadata.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; $form = $displayData->getForm(); // JLayout for standard handling of metadata fields in the administrator content edit screens. $fieldSets = $form->getFieldsets('metadata'); ?> <?php foreach ($fieldSets as $name => $fieldSet) : ?> <?php if (isset($fieldSet->description) && trim($fieldSet->description)) : ?> <div class="alert alert-info"> <span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span> <?php echo $this->escape(Text::_($fieldSet->description)); ?> </div> <?php endif; ?> <?php // Include the real fields in this panel. if ($name === 'jmetadata') { echo $form->renderField('metadesc'); echo $form->renderField('metakey'); } foreach ($form->getFieldset($name) as $field) { if ($field->name !== 'jform[metadata][tags][]') { echo $field->renderField(); } } ?> <?php endforeach; ?> PKCA#] ڄ(44=system/helixultimate/overrides/layouts/joomla/edit/global.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\Language\Multilanguage; use Joomla\CMS\Language\Text; $app = Factory::getApplication(); $form = $displayData->getForm(); $input = $app->getInput(); $component = $input->getCmd('option', 'com_content'); if ($component === 'com_categories') { $extension = $input->getCmd('extension', 'com_content'); $parts = explode('.', $extension); $component = $parts[0]; } $saveHistory = ComponentHelper::getParams($component)->get('save_history', 0); $fields = $displayData->get('fields') ?: [ 'transition', ['parent', 'parent_id'], ['published', 'state', 'enabled'], ['category', 'catid'], 'featured', 'sticky', 'access', 'language', 'tags', 'note', 'version_note', ]; $hiddenFields = $displayData->get('hidden_fields') ?: []; if (!$saveHistory) { $hiddenFields[] = 'version_note'; } if (!Multilanguage::isEnabled()) { $hiddenFields[] = 'language'; $form->setFieldAttribute('language', 'default', '*'); } $html = []; $html[] = '<fieldset class="form-vertical">'; $html[] = '<legend class="visually-hidden">' . Text::_('JGLOBAL_FIELDSET_GLOBAL') . '</legend>'; foreach ($fields as $field) { foreach ((array) $field as $f) { if ($form->getField($f)) { if (in_array($f, $hiddenFields)) { $form->setFieldAttribute($f, 'type', 'hidden'); } $html[] = $form->renderField($f); break; } } } $html[] = '</fieldset>'; echo implode('', $html); PKCA#]l��H��Bsystem/helixultimate/overrides/layouts/joomla/button/iconclass.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Layout\LayoutHelper; $displayData['html'] = false; echo LayoutHelper::render('joomla.icon.iconclass', $displayData); PKCA#]U����Fsystem/helixultimate/overrides/layouts/joomla/button/action-button.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects extract($displayData, EXTR_OVERWRITE); /** * Layout variables * ----------------- * @var string $icon * @var string $title * @var string $value * @var string $task * @var array $options */ Factory::getDocument()->getWebAssetManager()->useScript('list-view'); $disabled = !empty($options['disabled']); $taskPrefix = $options['task_prefix']; $checkboxName = $options['checkbox_name']; $id = $options['id']; $tipTitle = $options['tip_title']; ?> <button type="button" class="js-grid-item-action tbody-icon data-state-<?php echo $this->escape($value ?? ''); ?>" aria-labelledby="<?php echo $id; ?>" <?php echo $disabled ? 'disabled' : ''; ?> data-item-id="<?php echo $checkboxName . $this->escape($row ?? ''); ?>" data-item-task="<?php echo $this->escape(isset($task) ? $taskPrefix . $task : ''); ?>" > <span class="<?php echo $this->escape($icon ?? ''); ?>" aria-hidden="true"></span> </button> <div id="<?php echo $id; ?>" role="tooltip"> <?php echo HTMLHelper::_('tooltipText', $tipTitle ?: $title, $title, 0, false); ?> </div> PKCA#]}o�b b Jsystem/helixultimate/overrides/layouts/joomla/button/transition-button.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects extract($displayData, EXTR_OVERWRITE); /** * Layout variables * ----------------- * @var string $icon * @var string $title * @var string $value * @var string $task * @var array $options */ $disabled = empty($options['transitions']) || !empty($options['disabled']); $id = $options['id']; $tipTitle = $options['tip_title']; $tipContent = $options['tip_content']; $checkboxName = $options['checkbox_name']; $task = $options['task']; ?> <button type="button" class="tbody-icon data-state-<?php echo $this->escape($value ?? ''); ?>" aria-labelledby="<?php echo $id; ?>" <?php echo $disabled ? 'disabled' : ''; ?> <?php if (!$disabled) : ?> onclick="Joomla.toggleAllNextElements(this, 'd-none')" <?php endif; ?> > <span class="<?php echo $this->escape($icon ?? ''); ?>" aria-hidden="true"></span> </button> <div id="<?php echo $id; ?>" role="tooltip"> <?php echo HTMLHelper::_('tooltipText', $tipTitle ?: $title, $tipContent, 0, false); ?> </div> <?php if (!$disabled) : ?> <div class="d-none"> <span class="visually-hidden"> <label for="transition-select_<?php echo (int) $row ?? ''; ?>"> <?php echo Text::_('JWORKFLOW_EXECUTE_TRANSITION'); ?> </label> </span> <?php $default = [ HTMLHelper::_('select.option', '', $this->escape($options['title'])), HTMLHelper::_('select.option', '-1', '--------', ['disable' => true]), HTMLHelper::_('select.option', '<OPTGROUP>', Text::_('COM_CONTENT_RUN_TRANSITION')), ]; $transitions = array_merge($default, $options['transitions'], [HTMLHelper::_('select.option', '</OPTGROUP>')]); $attribs = [ 'id' => 'transition-select_' . (int) $row ?? '', 'list.attr' => [ 'class' => 'form-select form-select-sm w-auto', 'onchange' => "this.form.transition_id.value=this.value;Joomla.listItemTask('" . $checkboxName . $this->escape($row ?? '') . "', '" . $task . "')"] ]; echo HTMLHelper::_('select.genericlist', $transitions, '', $attribs); ?> </div> <?php endif; ?> PKCA#]cO*�~~@system/helixultimate/overrides/layouts/joomla/icon/iconclass.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2020 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\Utilities\ArrayHelper; // Convert icomoon to fa $icon = $displayData['icon']; // Get fixed width icon or not $iconFixed = $displayData['fixed'] ?? null; // Set default prefix to be fontawesome $iconPrefix = $displayData['prefix'] ?? 'icon-'; // Get other classNames if set, like icon-white, text-danger $iconSuffix = $displayData['suffix'] ?? null; // Get other attributes besides classNames $tabindex = $displayData['tabindex'] ?? null; $title = $displayData['title'] ?? null; // Default output in <span>. ClassNames if set to false $html = $displayData['html'] ?? true; // Replace double set icon-icon- // @todo: Joomla should be cleaned so this replacement is not needed. $icon = str_replace('icon-icon-', 'icon-', $icon); switch ($icon) { case (strpos($icon, 'icon-') !== false): $iconPrefix = $displayData['prefix'] ?? null; break; default: break; } if ($iconFixed) { $iconFixed = 'icon-fw'; } // Just render icon as className $icon = trim(implode(' ', [$iconPrefix . $icon, $iconFixed, $iconSuffix])); // Convert icon to html output when HTML !== false if ($html !== false) { $iconAttribs = [ 'class' => $icon, 'aria-hidden' => "true" ]; if ($tabindex) { $tabindex = (int) $tabindex; if ($tabindex > 0) { $tabindex = 0; } if ($tabindex === 0 || $tabindex === -1) { $iconAttribs['tabindex'] = (string) $tabindex; } } if ($title) { $iconAttribs['title'] = $title; } $icon = '<span ' . ArrayHelper::toString($iconAttribs) . '></span>'; } echo $icon; PKCA#]�4��\\Jsystem/helixultimate/overrides/layouts/joomla/content/category_default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; /** * Note that this layout opens a div with the page class suffix. If you do not use the category children * layout you need to close this div either by overriding this file or in your main layout. */ $params = $displayData->params; $category = $displayData->get('category'); $extension = $category->extension; $canEdit = $params->get('access-edit'); $className = substr($extension, 4); $htag = $params->get('show_page_heading') ? 'h2' : 'h1'; $app = Factory::getApplication(); $category->text = $category->description; $app->triggerEvent('onContentPrepare', [$extension . '.categories', &$category, &$params, 0]); $category->description = $category->text; $results = $app->triggerEvent('onContentAfterTitle', [$extension . '.categories', &$category, &$params, 0]); $afterDisplayTitle = trim(implode("\n", $results)); $results = $app->triggerEvent('onContentBeforeDisplay', [$extension . '.categories', &$category, &$params, 0]); $beforeDisplayContent = trim(implode("\n", $results)); $results = $app->triggerEvent('onContentAfterDisplay', [$extension . '.categories', &$category, &$params, 0]); $afterDisplayContent = trim(implode("\n", $results)); /** * This will work for the core components but not necessarily for other components * that may have different pluralisation rules. */ if (substr($className, -1) === 's') { $className = rtrim($className, 's'); } $tagsData = $category->tags->itemTags; ?> <div class="<?php echo $className . '-category' . $displayData->pageclass_sfx; ?>"> <?php if ($params->get('show_page_heading')) : ?> <h1> <?php echo $displayData->escape($params->get('page_heading')); ?> </h1> <?php endif; ?> <?php if ($params->get('show_category_title', 1)) : ?> <<?php echo $htag; ?>> <?php echo HTMLHelper::_('content.prepare', $category->title, '', $extension . '.category.title'); ?> </<?php echo $htag; ?>> <?php endif; ?> <?php echo $afterDisplayTitle; ?> <?php if ($params->get('show_cat_tags', 1)) : ?> <?php echo LayoutHelper::render('joomla.content.tags', $tagsData); ?> <?php endif; ?> <?php if ($beforeDisplayContent || $afterDisplayContent || $params->get('show_description', 1) || $params->def('show_description_image', 1)) : ?> <div class="category-desc"> <?php if ($params->get('show_description_image') && $category->getParams()->get('image')) : ?> <?php echo LayoutHelper::render( 'joomla.html.image', [ 'src' => $category->getParams()->get('image'), 'alt' => empty($category->getParams()->get('image_alt')) && empty($category->getParams()->get('image_alt_empty')) ? false : $category->getParams()->get('image_alt'), ] ); ?> <?php endif; ?> <?php echo $beforeDisplayContent; ?> <?php if ($params->get('show_description') && $category->description) : ?> <?php echo HTMLHelper::_('content.prepare', $category->description, '', $extension . '.category.description'); ?> <?php endif; ?> <?php echo $afterDisplayContent; ?> </div> <?php endif; ?> <?php echo $displayData->loadTemplate($displayData->subtemplatename); ?> <?php if ($displayData->maxLevel != 0 && $displayData->get('children')) : ?> <div class="cat-children"> <?php if ($params->get('show_category_heading_title_text', 1) == 1) : ?> <h3> <?php echo Text::_('JGLOBAL_SUBCATEGORIES'); ?> </h3> <?php endif; ?> <?php echo $displayData->loadTemplate('children'); ?> </div> <?php endif; ?> </div> PKCA#]�g\�__Rsystem/helixultimate/overrides/layouts/joomla/content/blog_style_default_links.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <ol class="nav nav-tabs nav-stacked"> <?php foreach ($displayData->get('link_items') as $item) : ?> <li> <?php echo HTMLHelper::_('link', Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language) : ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)), $item->title); ?> </li> <?php endforeach; ?> </ol> PKCA#]{��Z��Dsystem/helixultimate/overrides/layouts/joomla/content/open_graph.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Uri\Uri; extract($displayData); $doc = Factory::getDocument(); $config = Factory::getConfig(); $sitename = $config->get('sitename'); // Facebook $doc->addCustomTag('<meta property="og:type" content="article" />'); $doc->addCustomTag('<meta property="og:url" content="'. Uri::current() . '" />'); $doc->addCustomTag('<meta property="og:title" content="'. htmlspecialchars($title ?? "") .'" />'); $doc->addCustomTag('<meta property="og:description" content="'. HTMLHelper::_('string.truncate', (strip_tags($content)), 150) .'" />'); if(isset($image) && $image) { $doc->addCustomTag('<meta property="og:image" content="'. ltrim($image, '/') .'" />'); } if(isset($fb_app_id) && $fb_app_id) { $doc->addCustomTag('<meta property="fb:app_id" content="'. (int) $fb_app_id . '" />'); } $doc->addCustomTag('<meta property="og:site_name" content="'. htmlspecialchars($sitename ?? "") .'" />'); // Twitter $doc->addCustomTag('<meta name="twitter:description" content="'. HTMLHelper::_('string.truncate', (strip_tags($content)), 150) .'" />'); if(isset($image) && $image) { $doc->addCustomTag('<meta name="twitter:image:src" content="'. ltrim($image, '/') .'" />'); } if(isset($twitter_site) && $twitter_site) { $doc->addCustomTag('<meta name="twitter:site" content="@'. htmlspecialchars($twitter_site ?? "") .'" />'); } $doc->addCustomTag('<meta name="twitter:card" content="summary_large_image" />');PKCA#]ʽ���Bsystem/helixultimate/overrides/layouts/joomla/content/readmore.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $params = $displayData['params']; $item = $displayData['item']; $direction = Factory::getLanguage()->isRtl() ? 'left' : 'right'; ?> <div class="readmore"> <?php if (!$params->get('access-view')) : ?> <a href="<?php echo $displayData['link']; ?>" itemprop="url" aria-label="<?php echo Text::_('COM_CONTENT_REGISTER_TO_READ_MORE'); ?> <?php echo htmlspecialchars($item->title ?? "", ENT_QUOTES, 'UTF-8'); ?>"> <?php echo Text::_('COM_CONTENT_REGISTER_TO_READ_MORE'); ?> </a> <?php elseif ($readmore = $item->alternative_readmore) : ?> <a href="<?php echo $displayData['link']; ?>" itemprop="url" aria-label="<?php echo htmlspecialchars($item->title ?? "", ENT_QUOTES, 'UTF-8'); ?>"> <?php echo $readmore; ?> <?php if ($params->get('show_readmore_title', 0) != 0) : ?> <?php echo HTMLHelper::_('string.truncate', $item->title, $params->get('readmore_limit')); ?> <?php endif; ?> </a> <?php elseif ($params->get('show_readmore_title', 0) == 0) : ?> <a href="<?php echo $displayData['link']; ?>" itemprop="url" aria-label="<?php echo Text::_('COM_CONTENT_READ_MORE'); ?> <?php echo htmlspecialchars($item->title ?? "", ENT_QUOTES, 'UTF-8'); ?>"> <?php echo JVERSION < 4 ? Text::sprintf('COM_CONTENT_READ_MORE_TITLE') : Text::_('JGLOBAL_READ_MORE'); ?> </a> <?php else : ?> <a href="<?php echo $displayData['link']; ?>" itemprop="url" aria-label="<?php echo Text::_('COM_CONTENT_READ_MORE'); ?> <?php echo htmlspecialchars($item->title ?? "", ENT_QUOTES, 'UTF-8'); ?>"> <?php echo Text::sprintf('JGLOBAL_READ_MORE_TITLE', HTMLHelper::_('string.truncate', $item->title, $params->get('readmore_limit'))); ?> </a> <?php endif; ?> </div> PKCA#]yGfI��Rsystem/helixultimate/overrides/layouts/joomla/content/categories_default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); $class = ' class="first"'; $item = $displayData->item; $items = $displayData->get('items'); $params = $displayData->params; $extension = $displayData->get('extension'); $className = substr($extension, 4); // This will work for the core components but not necessarily for other components // that may have different pluralisation rules. if (substr($className, -1) === 's') { $className = rtrim($className, 's'); } PKCA#]2����Fsystem/helixultimate/overrides/layouts/joomla/content/text_filters.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; ?> <fieldset class="<?php echo !empty($displayData->formclass) ? $displayData->formclass : 'form-horizontal'; ?>"> <legend><?php echo $displayData->name; ?></legend> <details> <summary class="filter-notes"><?php echo Text::_('COM_CONFIG_TEXT_FILTERS_SUMMARY'); ?></summary> <div class="filter-notes"><?php echo Text::_('COM_CONFIG_TEXT_FILTERS_DESC'); ?></div> </details> <details> <summary class="filter-notes"><?php echo Text::_('JGLOBAL_FILTER_TYPE_LABEL'); ?></summary> <div class="filter-notes"><?php echo Text::_('JGLOBAL_FILTER_TYPE_DESC'); ?></div> </details> <details> <summary class="filter-notes"><?php echo Text::_('JGLOBAL_FILTER_TAGS_LABEL'); ?></summary> <div class="filter-notes"><?php echo Text::_('JGLOBAL_FILTER_TAGS_DESC'); ?></div> </details> <details> <summary class="filter-notes"><?php echo Text::_('JGLOBAL_FILTER_ATTRIBUTES_LABEL'); ?></summary> <div class="filter-notes"><?php echo Text::_('JGLOBAL_FILTER_ATTRIBUTES_DESC'); ?></div> </details> <?php $fieldsnames = explode(',', $displayData->fieldsname); ?> <?php foreach ($fieldsnames as $fieldname) : ?> <?php foreach ($displayData->form->getFieldset($fieldname) as $field) : ?> <div class="table-responsive"><?php echo $field->input; ?></div> <?php endforeach; ?> <?php endforeach; ?> </fieldset> PKCA#]ß�{22Lsystem/helixultimate/overrides/layouts/joomla/content/categories_default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; ?> <?php if ($displayData->params->get('show_page_heading')) : ?> <h1> <?php echo $displayData->escape($displayData->params->get('page_heading')); ?> </h1> <?php endif; ?> <?php if ($displayData->params->get('show_base_description')) : ?> <?php // If there is a description in the menu parameters use that; ?> <?php if ($displayData->params->get('categories_description')) : ?> <div class="category-desc base-desc"> <?php echo HTMLHelper::_('content.prepare', $displayData->params->get('categories_description'), '', $displayData->get('extension') . '.categories'); ?> </div> <?php else : ?> <?php // Otherwise get one from the database if it exists. ?> <?php if ($displayData->parent->description) : ?> <div class="category-desc base-desc"> <?php echo HTMLHelper::_('content.prepare', $displayData->parent->description, '', $displayData->parent->extension . '.categories'); ?> </div> <?php endif; ?> <?php endif; ?> <?php endif; ?> PKCA#]s�Msystem/helixultimate/overrides/layouts/joomla/content/info_block/category.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $title = $this->escape($displayData['item']->category_title); if (!isset($displayData['item']->catslug)) { $displayData['item']->catslug = $displayData['item']->catid . ':' . $displayData['item']->category_alias; } $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <span class="category-name" title="<?php echo Text::sprintf('COM_CONTENT_CATEGORY', $title); ?>"> <?php if ($displayData['params']->get('link_category') && $displayData['item']->catslug) : ?> <a href="<?php echo Route::_(Joomla\Component\Content\Site\Helper\RouteHelper::getCategoryRoute($displayData['item']->catslug)); ?>"><?php echo $title; ?></a> <?php else : ?> <?php echo $title; ?> <?php endif; ?> </span> PKCA#]�S�5DDQsystem/helixultimate/overrides/layouts/joomla/content/info_block/publish_date.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $articleView = $displayData['articleView']; ?> <span class="published" title="<?php echo Text::sprintf('COM_CONTENT_PUBLISHED_DATE_ON', HTMLHelper::_('date', $displayData['item']->publish_up, Text::_('DATE_FORMAT_LC3'))); ?>"> <time datetime="<?php echo HTMLHelper::_('date', $displayData['item']->publish_up, 'c'); ?>"<?php echo ($articleView == 'details') ? ' itemprop="datePublished"' : ''; ?>> <?php echo HTMLHelper::_('date', $displayData['item']->publish_up, Text::_('DATE_FORMAT_LC3')); ?> </time> </span> PKCA#]�L �44Psystem/helixultimate/overrides/layouts/joomla/content/info_block/create_date.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $articleView = $displayData['articleView']; ?> <span class="create" title="<?php echo Text::sprintf('COM_CONTENT_CREATED_DATE_ON', HTMLHelper::_('date', $displayData['item']->created, Text::_('DATE_FORMAT_LC3'))); ?>"> <time datetime="<?php echo HTMLHelper::_('date', $displayData['item']->created, 'c'); ?>"<?php echo ($articleView == 'details') ? ' itemprop="dateCreated"' : ''; ?>> <?php echo HTMLHelper::_('date', $displayData['item']->created, Text::_('DATE_FORMAT_LC3')); ?> </time> </span> PKCA#]|�z�ooPsystem/helixultimate/overrides/layouts/joomla/content/info_block/modify_date.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; ?> <span class="modified"> <time datetime="<?php echo HTMLHelper::_('date', $displayData['item']->modified, 'c'); ?>" itemprop="dateModified"> <?php echo Text::sprintf('COM_CONTENT_LAST_UPDATED', HTMLHelper::_('date', $displayData['item']->modified, Text::_('DATE_FORMAT_LC3'))); ?> </time> </span> PKCA#]�#$��Isystem/helixultimate/overrides/layouts/joomla/content/info_block/hits.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; ?> <span class="hits"> <meta itemprop="interactionCount" content="UserPageVisits:<?php echo $displayData['item']->hits; ?>"> <?php echo Text::sprintf('COM_CONTENT_ARTICLE_HITS', $displayData['item']->hits); ?> </span> PKCA#]jf99Ksystem/helixultimate/overrides/layouts/joomla/content/info_block/author.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; $articleView = $displayData['articleView']; $author = ($displayData['item']->created_by_alias ?: $displayData['item']->author); ?> <span class="createdby"<?php echo ($articleView != 'intro') ? ' itemprop="author" itemscope itemtype="https://schema.org/Person"' : ''; ?> title="<?php echo Text::sprintf('COM_CONTENT_WRITTEN_BY', $author); ?>"> <?php $author = '<span itemprop="name">' . $author . '</span>'; ?> <?php if (!empty($displayData['item']->contact_link ) && $displayData['params']->get('link_author') == true) : ?> <a href="<?php echo Route::_($displayData['item']->contact_link); ?>"<?php echo ($articleView != 'intro') ? ' itemprop="url"' : ''; ?>> <?php echo $author; ?> </a> <?php else : ?> <?php echo $author; ?> <?php endif; ?> </span> PKCA#]��||Tsystem/helixultimate/overrides/layouts/joomla/content/info_block/parent_category.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <span class="parent-category-name"> <?php $title = $this->escape($displayData['item']->parent_title); ?> <?php if ($displayData['params']->get('link_parent_category') && !empty($displayData['item']->parent_slug)) : ?> <?php $url = '<a href="' . Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getCategoryRoute($displayData['item']->parent_slug) : ContentHelperRoute::getCategoryRoute($displayData['item']->parent_slug)) . '" itemprop="genre">' . $title . '</a>'; ?> <?php echo Text::sprintf('COM_CONTENT_PARENT', $url); ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_PARENT', '<span itemprop="genre">' . $title . '</span>'); ?> <?php endif; ?> </span> PKCA#])/m���Qsystem/helixultimate/overrides/layouts/joomla/content/info_block/reading_time.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use HelixUltimate\Framework\Platform\Helper; defined ('JPATH_BASE') or die(); $fullText = $displayData->fulltext; $readTime = Helper::getReadTime($fullText); ?> <span class="read-time" title="read time"><?php echo $readTime; ?></span> PKCA#]��ID33Qsystem/helixultimate/overrides/layouts/joomla/content/info_block/associations.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; ?> <?php if (!empty($displayData['item']->associations)) : ?> <?php $associations = $displayData['item']->associations; ?> <span class="association"> <?php echo Text::_('JASSOCIATIONS'); ?> <?php foreach ($associations as $association) : ?> <?php if ($displayData['item']->params->get('flags', 1) && $association['language']->image) : ?> <?php $flag = HTMLHelper::_('image', 'mod_languages/' . $association['language']->image . '.gif', $association['language']->title_native, array('title' => $association['language']->title_native), true); ?> <a href="<?php echo Route::_($association['item']); ?>"><?php echo $flag; ?></a> <?php else : ?> <?php $class = 'badge bg-secondary label-' . $association['language']->sef; ?> <a class="' . <?php echo $class; ?> . '" href="<?php echo Route::_($association['item']); ?>"><?php echo strtoupper($association['language']->sef); ?></a> <?php endif; ?> <?php endforeach; ?> </span> <?php endif; ?> PKCA#]�3Fsystem/helixultimate/overrides/layouts/joomla/content/associations.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; $items = $displayData; if (!empty($items)) : ?> <ul class="item-associations"> <?php foreach ($items as $id => $item) : ?> <?php if (is_array($item) && isset($item['link'])) : ?> <li> <?php echo $item['link']; ?> </li> <?php elseif (isset($item->link)) : ?> <li> <?php echo $item->link; ?> </li> <?php endif; ?> <?php endforeach; ?> </ul> <?php endif; ?> PKCA#]0�Wsystem/helixultimate/overrides/layouts/joomla/content/blog_style_default_item_title.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Content\Site\Helper\RouteHelper; // Create a shortcut for params. $params = $displayData->params; $canEdit = $displayData->params->get('access-edit'); $heading = $displayData->heading ?? 'h2'; $currentDate = Factory::getDate()->format('Y-m-d H:i:s'); $link = RouteHelper::getArticleRoute($displayData->slug, $displayData->catid, $displayData->language); ?> <?php if ($displayData->state == 0 || $params->get('show_title') || ($params->get('show_author') && !empty($displayData->author))) : ?> <div class="article-header"> <?php if ($params->get('show_title')) : ?> <<?php echo $heading; ?>> <?php if ($params->get('link_titles') && ($params->get('access-view') || $params->get('show_noauth', '0') == '1')) : ?> <a href="<?php echo Route::_($link); ?>"> <?php echo $this->escape($displayData->title); ?> </a> <?php else : ?> <?php echo $this->escape($displayData->title); ?> <?php endif; ?> </<?php echo $heading; ?>> <?php endif; ?> <?php if ($displayData->state == 0) : ?> <span class="badge bg-warning"><?php echo Text::_('JUNPUBLISHED'); ?></span> <?php endif; ?> <?php if ($displayData->publish_up > $currentDate) : ?> <span class="badge bg-warning"><?php echo Text::_('JNOTPUBLISHEDYET'); ?></span> <?php endif; ?> <?php if ($displayData->publish_down !== null && $displayData->publish_down < $currentDate) : ?> <span class="badge bg-warning"><?php echo Text::_('JEXPIRED'); ?></span> <?php endif; ?> </div> <?php endif; ?> PKCA#]cQ 9��Jsystem/helixultimate/overrides/layouts/joomla/content/intro_info_block.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); $blockPosition = $displayData['params']->get('info_block_position', 0); ?> <dl class="article-info text-muted"> <?php if ($displayData['position'] === 'above' && ($blockPosition == 0 || $blockPosition == 2) || $displayData['position'] === 'below' && ($blockPosition == 1) ) : ?> <?php if ($displayData['params']->get('show_author') && !empty($displayData['item']->author )) : ?> <?php echo $this->sublayout('author', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_parent_category') && !empty($displayData['item']->parent_slug)) : ?> <?php echo $this->sublayout('parent_category', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_category')) : ?> <?php echo $this->sublayout('category', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_associations')) : ?> <?php echo $this->sublayout('associations', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_publish_date')) : ?> <?php echo $this->sublayout('publish_date', $displayData); ?> <?php endif; ?> <?php endif; ?> <?php if ($displayData['position'] === 'above' && ($blockPosition == 0) || $displayData['position'] === 'below' && ($blockPosition == 1 || $blockPosition == 2) ) : ?> <?php if ($displayData['params']->get('show_create_date')) : ?> <?php echo $this->sublayout('create_date', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_modify_date')) : ?> <?php echo $this->sublayout('modify_date', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_hits')) : ?> <?php echo $this->sublayout('hits', $displayData); ?> <?php endif; ?> <?php endif; ?> </dl> PKCA#]6jU�xxEsystem/helixultimate/overrides/layouts/joomla/content/intro_image.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\Component\Content\Site\Helper\RouteHelper; $params = $displayData->params ?? null; $images = json_decode($displayData->images ?? ''); $attribs = json_decode($displayData->attribs ?? ''); $introImage = ''; $tplParams = null; if (class_exists('HelixUltimate\\Framework\\Platform\\Helper')) { $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $tplParams = $template ? ($template->params ?? null) : null; } $leading = !empty($displayData->leading); // Preferred size from template params $blogListSize = 'thumbnail'; $titleForAlt = ''; if ($tplParams) { $blogListSize = $leading ? $tplParams->get('leading_blog_list_image', 'large') : $tplParams->get('blog_list_image', 'thumbnail'); } if (!empty($attribs->helix_ultimate_image)) { $introImage = $attribs->helix_ultimate_image; if ($blogListSize !== 'default') { $basename = basename($introImage); $dirname = dirname($introImage); $ext = pathinfo($basename, PATHINFO_EXTENSION); $name = pathinfo($basename, PATHINFO_FILENAME); $listImage = JPATH_ROOT . '/' . $dirname . '/' . $name . '_' . $blogListSize . '.' . $ext; if (file_exists($listImage)) { $introImage = Uri::root(true) . '/' . $dirname . '/' . $name . '_' . $blogListSize . '.' . $ext; } } $titleForAlt = !empty($attribs->helix_ultimate_image_alt_txt) ? $attribs->helix_ultimate_image_alt_txt : ($displayData->title ?? ''); } $altText = $titleForAlt !== '' ? htmlspecialchars($titleForAlt, ENT_COMPAT, 'UTF-8') : false; $canView = ($params && ($params->get('access-view') || $params->get('show_noauth', '0') == '1')); $linkIntroImage = $params ? ( (int)$params->get('link_intro_image') === 1 || ( (int)$params->get('link_titles') === 1 ) ) : false; $shouldLink = $linkIntroImage && $canView; $articleRoute = Route::_(RouteHelper::getArticleRoute($displayData->slug, $displayData->catid, $displayData->language)); // Prepare layout attrs for Joomla image helper $layoutAttr = [ 'src' => htmlspecialchars($introImage, ENT_COMPAT, 'UTF-8'), 'alt' => $altText ?: false, 'itemprop' => 'thumbnailUrl', ]; $imgfloat = !empty($images->float_intro) ? $images->float_intro : ($params ? $params->get('float_intro') : ''); $imgClass = trim(($imgfloat ? 'float-' . $imgfloat : '') . ' item-image article-intro-image'); ?> <?php if ($introImage) : ?> <?php if ($params->get('link_titles') && $params->get('access-view')) : ?> <a href="<?php echo Route::_(Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($displayData->slug, $displayData->catid, $displayData->language)); ?>"> <?php endif; ?> <div class="article-intro-image"> <?php echo LayoutHelper::render('joomla.html.image', $layoutAttr); ?> </div> <?php if ($params->get('link_titles') && $params->get('access-view')) : ?> </a> <?php endif; ?> <?php else : ?> <?php if (isset($images->image_intro) && !empty($images->image_intro)) : ?> <?php $imgfloat = empty($images->float_intro) ? $params->get('float_intro') : $images->float_intro; ?> <div class="article-intro-image float-<?php echo htmlspecialchars($imgfloat, ENT_COMPAT, 'UTF-8'); ?>"> <?php if ($params->get('link_titles') && $params->get('access-view')) : ?> <a href="<?php echo Route::_(Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($displayData->slug, $displayData->catid, $displayData->language)); ?>"> <?php $layoutAttr = [ 'src' => htmlspecialchars($images->image_intro ?? "", ENT_COMPAT, 'UTF-8'), 'alt' => !empty($images->image_intro_alt) ? htmlspecialchars($images->image_intro_alt ?? "", ENT_COMPAT, 'UTF-8') : ($displayData->title ?? ''), ]; if (isset($images->image_intro_caption) && $images->image_intro_caption !== '') { $layoutAttr['class'] = 'caption'; $layoutAttr['title'] = htmlspecialchars($images->image_intro_caption ?? "", ENT_COMPAT, 'UTF-8'); } echo LayoutHelper::render('joomla.html.image', array_merge($layoutAttr, ['itemprop' => 'thumbnailUrl'])); // Image Caption if (isset($images->image_intro_caption) && $images->image_intro_caption !== '') { ?> <figcaption class="caption text-dark"><?php echo $this->escape($images->image_intro_caption); ?></figcaption> <?php } ?> </a> <?php else : ?> <?php $layoutAttr = [ 'src' => htmlspecialchars($images->image_intro ?? "", ENT_COMPAT, 'UTF-8'), 'alt' => !empty($images->image_intro_alt) ? htmlspecialchars($images->image_intro_alt ?? "", ENT_COMPAT, 'UTF-8') : ($displayData->title ?? ''), ]; if (isset($images->image_intro_caption) && $images->image_intro_caption !== '') { $layoutAttr['class'] = 'caption'; $layoutAttr['title'] = htmlspecialchars($images->image_intro_caption ?? "", ENT_COMPAT, 'UTF-8'); } echo LayoutHelper::render('joomla.html.image', array_merge($layoutAttr, ['itemprop' => 'thumbnailUrl'])); // Image Caption if (isset($images->image_intro_caption) && $images->image_intro_caption !== '') { ?> <figcaption class="caption text-dark"><?php echo $this->escape($images->image_intro_caption); ?></figcaption> <?php } ?> <?php endif; ?> </div> <?php endif; ?> <?php endif; ?> PKCA#]W*��Bsystem/helixultimate/overrides/layouts/joomla/content/language.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $item = $displayData; if ($item->language === '*') { echo Text::alt('JALL', 'language'); } elseif ($item->language_image) { echo HTMLHelper::_('image', 'mod_languages/' . $item->language_image . '.gif', '', ['class' => 'me-1'], true) . htmlspecialchars($item->language_title, ENT_COMPAT, 'UTF-8'); } elseif ($item->language_title) { echo htmlspecialchars($item->language_title, ENT_COMPAT, 'UTF-8'); } else { echo Text::_('JUNDEFINED'); } PKCA#]8���?system/helixultimate/overrides/layouts/joomla/content/icons.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; $canEdit = $displayData['params']->get('access-edit'); $articleId = $displayData['item']->id; ?> <?php if ($canEdit) : ?> <div class="icons"> <div class="float-end"> <div> <?php echo HTMLHelper::_('icon.edit', $displayData['item'], $displayData['params']); ?> </div> </div> </div> <?php endif; ?> PKCA#]1X�� � Dsystem/helixultimate/overrides/layouts/joomla/content/emptystate.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; $textPrefix = $displayData['textPrefix'] ?? ''; if (!$textPrefix) { $textPrefix = strtoupper(Factory::getApplication()->getInput()->get('option')); } $formURL = $displayData['formURL'] ?? ''; $createURL = $displayData['createURL'] ?? ''; $helpURL = $displayData['helpURL'] ?? ''; $title = $displayData['title'] ?? Text::_($textPrefix . '_EMPTYSTATE_TITLE'); $content = $displayData['content'] ?? Text::_($textPrefix . '_EMPTYSTATE_CONTENT'); $icon = $displayData['icon'] ?? 'icon-copy article'; $append = $displayData['formAppend'] ?? ''; $btnadd = $displayData['btnadd'] ?? Text::_($textPrefix . '_EMPTYSTATE_BUTTON_ADD'); ?> <form action="<?php echo Route::_($formURL); ?>" method="post" name="adminForm" id="adminForm"> <div class="px-4 py-5 my-5 text-center"> <span class="fa-8x mb-4 <?php echo $icon; ?>" aria-hidden="true"></span> <h1 class="display-5 fw-bold"><?php echo $title; ?></h1> <div class="col-lg-6 mx-auto"> <p class="lead mb-4"> <?php echo $content; ?> </p> <div class="d-grid gap-2 d-sm-flex justify-content-sm-center"> <?php if ($createURL && Factory::getApplication()->getInput()->get('tmpl') !== 'component') : ?> <a href="<?php echo Route::_($createURL); ?>" id="confirmButton" class="btn btn-primary btn-lg px-4 me-sm-3 emptystate-btnadd"><?php echo $btnadd; ?></a> <?php endif; ?> <?php if ($helpURL) : ?> <a href="<?php echo $helpURL; ?>" target="_blank" class="btn btn-outline-secondary btn-lg px-4"><?php echo Text::_('JGLOBAL_LEARN_MORE'); ?></a> <?php endif; ?> </div> </div> </div> <?php // Allow appending any modals (Eg: Bulk Import on com_redirect). echo $append; ?> <input type="hidden" name="task" value=""> <input type="hidden" name="boxchecked" value="0"> <?php echo HTMLHelper::_('form.token'); ?> </form> PKCA#]�p���Jsystem/helixultimate/overrides/layouts/joomla/content/related_articles.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\Layout\LayoutHelper; $articles = $displayData['articles']; $mainItem = $displayData['item']; $template = Helper::loadTemplateData(); $tmpl_params = $template->params; ?> <div class="related-article-list-container"> <h3 class="related-article-title"> <?php echo $tmpl_params->get('related_article_title'); ?> </h3> <?php if( $tmpl_params->get('related_article_view_type') === 'thumb' ): ?> <div class="article-list related-article-list"> <div class="row"> <?php foreach( $articles as $item ): ?> <?php if (strtotime($item->publish_up) > strtotime(Factory::getDate())) { continue; } ?> <div class="col-lg-<?php echo round(12 / Helper::SetColumn($tmpl_params->get('related_article_column'))); ?>"> <?php echo LayoutHelper::render('joomla.content.related_article', $item); ?> </div> <?php endforeach; ?> </div> </div> <?php endif; ?> <?php if( $tmpl_params->get('related_article_view_type') === 'list' ): ?> <ul class="article-list related-article-list"> <?php foreach( $articles as $item ): ?> <li class="related-article-list-item"> <?php $item->heading = 'h4'; ?> <?php echo LayoutHelper::render('joomla.content.blog_style_default_item_title', $item); ?> <?php echo LayoutHelper::render('joomla.content.info_block.publish_date', array('item' => $item, 'params' => $item->params,'articleView'=>'intro')); ?> </li> <?php endforeach; ?> </ul> <?php endif; ?> <?php if( $tmpl_params->get('related_article_view_type') === 'large' ): ?> <div class="article-list related-article-list"> <?php foreach( $articles as $item ): ?> <div class="row"> <div class="col-12"> <?php echo LayoutHelper::render('joomla.content.related_article_large', $item); ?> </div> </div> <?php endforeach; ?> </div> <?php endif; ?> </div>PKCA#],���Ksystem/helixultimate/overrides/layouts/joomla/content/emptystate_module.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; $icon = $displayData['icon'] ?? 'icon-copy article'; $textPrefix = $displayData['textPrefix'] ?? ''; $textSuffix = $displayData['textSuffix'] ?? ''; $title = $displayData['title'] ?? ''; $componentLangString = $textPrefix . '_EMPTYSTATE_TITLE' . $textSuffix; $moduleLangString = $textPrefix . '_EMPTYSTATE_MODULE_TITLE' . $textSuffix; // Did we have a definitive title provided to the view? If not, let's find one! if (!$title) { // Can we find a *_EMPTYSTATE_MODULE_TITLE translation, Else use the components *_EMPTYSTATE_TITLE string $title = Factory::getApplication()->getLanguage()->hasKey($moduleLangString) ? $moduleLangString : $componentLangString; } ?> <div class="mb-4"> <p class="fw-bold text-center text-muted"> <span class="<?php echo $icon; ?>" aria-hidden="true"></span> <?php echo Text::_($title); ?> </p> </div> PKCA#]��FZKK@system/helixultimate/overrides/layouts/joomla/content/rating.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; $rating = (int) $displayData['item']->rating; $rating_count = $displayData['item']->rating_count; if($rating_count == '') { $rating_count = 0; } ?> <div class="article-ratings" data-id="<?php echo (int) $displayData['item']->id; ?>"> <span class="ratings-label"><?php echo Text::_('HELIX_ULTIMATE_ARTICLE_RATINGS'); ?></span> <div class="rating-symbol"> <?php $j = 0; for($i = $rating; $i < 5; $i++) { echo '<span class="rating-star" data-number="' . (5 - $j) . '"></span>'; $j++; } for ($i = 0; $i < $rating; $i++) { echo '<span class="rating-star active" data-number="'.($rating - $i).'"></span>'; } ?> </div> <span class="fas fa-circle-notch fa-spin" aria-hidden="true" style="display: none;"></span> <span class="ratings-count">(<?php echo $rating_count; ?>)</span> </div> PKCA#]8�V HHMsystem/helixultimate/overrides/layouts/joomla/content/blog/comments/count.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $params = $template->params; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); if( ( $params->get('comment') != 'disabled' ) && ( $params->get('comments_count') ) ) { $comment_categories = $params->get('comment_categories'); if(is_array($comment_categories) && count($comment_categories)) { if(in_array($displayData['item']->catid, $comment_categories)) { $url = Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($displayData['item']->id . ':' . $displayData['item']->alias, $displayData['item']->catid, $displayData['item']->language) : ContentHelperRoute::getArticleRoute($displayData['item']->id . ':' . $displayData['item']->alias, $displayData['item']->catid, $displayData['item']->language)); $root = Uri::base(); $root = new Uri($root); $url = $root->getScheme() . '://' . $root->getHost() . $url; ?> <span class="comments-count"> <?php echo LayoutHelper::render('joomla.content.blog.comments.count.' . $params->get('comment'), array( 'item' => $displayData, 'params' => $params, 'url' => $url)); ?> </span> <?php } } } PKCA#]i�����Psystem/helixultimate/overrides/layouts/joomla/content/blog/comments/comments.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $params = $template->params; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); if( $params->get('comment') != 'disabled' ) { $comment_categories = $params->get('comment_categories'); if(is_array($comment_categories) && count($comment_categories)) { if(in_array($displayData->catid, $comment_categories)) { $url = Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($displayData->id . ':' . $displayData->alias, $displayData->catid, $displayData->language) : ContentHelperRoute::getArticleRoute($displayData->id . ':' . $displayData->alias, $displayData->catid, $displayData->language)); $root = Uri::base(); $root = new Uri($root); $url = $root->getScheme() . '://' . $root->getHost() . $url; echo '<div id="article-comments">'; echo LayoutHelper::render( 'joomla.content.blog.comments.comments.' . $params->get('comment'), array( 'item'=>$displayData, 'params'=>$params, 'url'=>$url ) ); echo '</div>'; } } } PKCA#]/j &&[system/helixultimate/overrides/layouts/joomla/content/blog/comments/count/intensedebate.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); ?> <?php if( $displayData['params']->get('comment_intensedebate_acc') != '' ) : ?> <span class="comments-anchor"> <script type="text/javascript"> var idcomments_acct = '<?php echo $displayData["params"]->get("comment_intensedebate_acc"); ?>'; var idcomments_post_id = '<?php echo md5( $displayData["url"] )?>'; var idcomments_post_url = encodeURIComponent("<?php echo $displayData['url'];?>"); </script> <script type="text/javascript" src="https://www.intensedebate.com/js/genericLinkWrapperV2.js"></script> </span> <?php endif; ?> PKCA#]��/��Tsystem/helixultimate/overrides/layouts/joomla/content/blog/comments/count/disqus.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; if( $displayData['params']->get('comment_disqus_subdomain') != '' ) { $doc = Factory::getDocument(); if(!defined('HELIX_ULTIMATE_COMMENTS_DISQUS_COUNT')) { ob_start(); $devmode = $displayData['params']->get('comment_disqus_devmode'); if ($devmode) { echo 'var disqus_developer = 1;'; } ?> var disqus_shortname = '<?php echo $displayData['params']->get("comment_disqus_subdomain"); ?>'; (function() { var d = document, s = d.createElement('script'); s.src = 'https://' + disqus_shortname + '.disqus.com/count.js'; s.setAttribute('data-timestamp', +new Date()); (d.head || d.body).appendChild(s); })(); <?php $output = ob_get_clean(); $doc->addScriptdeclaration( $output ); define('HELIX_ULTIMATE_COMMENTS_DISQUS_COUNT', 1); } ?> <a href="<?php echo $displayData['url']; ?>#article-comments"> <span class="disqus-comment-count" data-disqus-url="<?php echo $displayData['url']; ?>"></span> </a> <?php } PKCA#]=�I���Vsystem/helixultimate/overrides/layouts/joomla/content/blog/comments/count/facebook.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; if( $displayData['params']->get('comment_facebook_app_id') != '' ) { $doc = Factory::getDocument(); if(!defined('HELIX_ULTIMATE_COMMENTS_FACEBOOK_COUNT')) { $doc->addScript( 'https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.11&appId=' . $displayData['params']->get('comment_facebook_app_id') . '&autoLogAppEvents=1' ); define('HELIX_ULTIMATE_COMMENTS_FACEBOOK_COUNT', 1); } ?> <a href="<?php echo $displayData['url']; ?>#comments"> <?php echo Text::_('HELIX_ULTIMATE_COMMENTS'); ?> (<span class="fb-comments-count" data-href="<?php echo $displayData['url']; ?>"></span>) </a> <?php }PKCA#]>ʿ�^system/helixultimate/overrides/layouts/joomla/content/blog/comments/comments/intensedebate.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); ?> <?php if( $displayData['params']->get('comment_intensedebate_acc') != '' ) : ?> <script> var idcomments_acct = '<?php echo $displayData["params"]->get("comment_intensedebate_acc"); ?>'; var idcomments_post_id = '<?php echo md5( $displayData["url"] ); ?>'; var idcomments_post_url = '<?php echo $displayData["url"]; ?>'; </script> <span id="IDCommentsPostTitle" style="display:none"></span> <script type='text/javascript' src='https://www.intensedebate.com/js/genericCommentWrapperV2.js'></script> <?php endif; ?>PKCA#]w�����Wsystem/helixultimate/overrides/layouts/joomla/content/blog/comments/comments/disqus.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); if( $displayData['params']->get('comment_disqus_subdomain') != '' ) { ?> <div id="disqus_thread"></div> <script> <?php $devmode = $displayData['params']->get('comment_disqus_devmode'); if ($devmode) { echo 'var disqus_developer = 1;'; } ?> var disqus_shortname = '<?php echo htmlspecialchars($displayData["params"]->get("comment_disqus_subdomain") ?? ""); ?>'; var disqus_config = function () { this.page.url = "<?php echo $displayData['url']; ?>"; }; (function() { var d = document, s = d.createElement('script'); s.src = 'https://' + disqus_shortname + '.disqus.com/embed.js'; s.setAttribute('data-timestamp', +new Date()); (d.head || d.body).appendChild(s); })(); </script> <noscript> Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow"> comments powered by Disqus. </a> </noscript> <?php } PKCA#]@�-p��Ysystem/helixultimate/overrides/layouts/joomla/content/blog/comments/comments/facebook.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); $width = ($displayData['params']->get('comment_facebook_width') == 100 ) ? '100%' : (int) $displayData['params']->get('comment_facebook_width'); ?> <?php if( $displayData['params']->get('comment_facebook_app_id') != '' ) : ?> <div id="fb-root"></div> <script>(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = 'https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.11&appId=<?php echo $displayData['params']->get('comment_facebook_app_id'); ?>&autoLogAppEvents=1'; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));</script> <div class="fb-comments" data-href="<?php echo $displayData['url']; ?>" data-numposts="<?php echo (int) $displayData['params']->get('comment_facebook_number'); ?>" data-width="<?php echo $width; ?>" data-colorscheme="light"></div> <?php endif; ?>PKCA#]�,S��Jsystem/helixultimate/overrides/layouts/joomla/content/blog/author_info.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\User\UserHelper; $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $params = $template->params; ?> <?php if($params->get('author_info', 0)) : ?> <div class="article-author-information"> <?php $author = Factory::getUser( (int) $displayData->created_by ); $profile = UserHelper::getProfile( (int) $displayData->created_by ); ?> <div class="d-flex"> <div class="flex-shrink-0"> <img class="me-3" src="https://www.gravatar.com/avatar/<?php echo md5($author->get('email')); ?>?s=64&d=identicon&r=PG" alt="<?php echo $author->name; ?>"> </div> <div class="flex-grow-1 ms-3"> <h5 class="mt-0"><?php echo $author->name; ?></h5> <?php if(isset($profile->profile['aboutme']) && $profile->profile['aboutme']) : ?> <div class="author-bio"> <?php echo $profile->profile['aboutme']; ?> <?php if(isset($profile->profile['website']) && $profile->profile['website']) : ?> <div class="author-website mt-2"> <strong><?php echo Text::_('HELIX_ULTIMATE_BLOG_AUTHOR_WEBSITE'); ?>:</strong> <a target="_blank" rel="noopener noreferrer" href="<?php echo strip_tags($profile->profile['website'], ''); ?>"><?php echo strip_tags($profile->profile['website'], ''); ?></a> </div> <?php endif; ?> </div> <?php endif; ?> </div> </div> </div> <?php endif; ?> PKCA#]�`iQQDsystem/helixultimate/overrides/layouts/joomla/content/blog/audio.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use HelixUltimate\Framework\Platform\Helper; extract($displayData); ?> <?php if(isset($attribs->helix_ultimate_audio) && $attribs->helix_ultimate_audio) : ?> <div class="article-featured-audio"> <div class="ratio ratio-16x9"> <?php echo Helper::sanitizeEmbed($attribs->helix_ultimate_audio); ?> </div> </div> <?php endif; ?> PKCA#]��x�nnFsystem/helixultimate/overrides/layouts/joomla/content/blog/gallery.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Uri\Uri; $displayData = (array) ($displayData ?? []); extract($displayData); if (isset($attribs->helix_ultimate_gallery) && $attribs->helix_ultimate_gallery) : $gallery = json_decode($attribs->helix_ultimate_gallery ?? ""); $images = (isset($gallery->helix_ultimate_gallery_images) && $gallery->helix_ultimate_gallery_images) ? $gallery->helix_ultimate_gallery_images : array(); // Filter only images that actually exist $validImages = []; foreach ((array) $images as $img) { $relativePath = str_replace(Uri::root(true), JPATH_ROOT . '/', $img); if (is_file($relativePath)) { $validImages[] = $img; } } if (count($validImages)) : ?> <div class="article-feature-gallery"> <div id="article-feature-gallery-<?php echo $id; ?>" class="carousel slide" data-bs-ride="carousel"> <div class="carousel-inner" role="listbox"> <?php foreach ($validImages as $key => $image) : ?> <div class="carousel-item<?php echo ($key === 0) ? ' active' : ''; ?>"> <img src="<?php echo htmlspecialchars((string) $image, ENT_QUOTES, 'UTF-8'); ?>"<?php echo !empty($attribs->helix_ultimate_image_alt_txt) ? ' alt="' . htmlspecialchars((string) $attribs->helix_ultimate_image_alt_txt, ENT_QUOTES, 'UTF-8') . '"' : ''; ?>> </div> <?php endforeach; ?> </div> <button class="carousel-control-prev" data-bs-target="#article-feature-gallery-<?php echo $id; ?>" type="button" data-bs-slide="prev"> <span class="carousel-control-prev-icon" aria-hidden="true"></span> <span class="visually-hidden">Previous</span> </button> <button class="carousel-control-next" data-bs-target="#article-feature-gallery-<?php echo $id; ?>" type="button" data-bs-slide="next"> <span class="carousel-control-next-icon" aria-hidden="true"></span> <span class="visually-hidden">Next</span> </button> </div> </div> <?php endif; endif; ?> PKCA#] �S���Dsystem/helixultimate/overrides/layouts/joomla/content/blog/video.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die(); use HelixUltimate\Framework\Platform\Helper; extract($displayData); if (isset($attribs->helix_ultimate_video) && $attribs->helix_ultimate_video) { $video_url = trim($attribs->helix_ultimate_video); $video_src = ''; $embed_code = ''; $video = parse_url($video_url); $host = isset($video['host']) ? strtolower($video['host']) : ''; $ext = strtolower(pathinfo($video_url, PATHINFO_EXTENSION)); switch ($host) { case 'youtu.be': $video_id = trim($video['path'], '/'); $video_src = '//www.youtube.com/embed/' . $video_id; break; case 'www.youtube.com': case 'youtube.com': case 'www.youtube-nocookie.com': case 'youtube-nocookie.com': if (strpos($video['path'], '/embed/') === 0) { // Already an embed URL $video_src = '//www.youtube.com' . $video['path']; if (!empty($video['query'])) { $video_src .= '?' . $video['query']; } } else { // Handle standard YouTube watch URL parse_str($video['query'], $query); if (isset($query['v'])) { $video_id = $query['v']; $video_src = '//www.youtube.com/embed/' . $video_id; } } break; case 'vimeo.com': case 'www.vimeo.com': case 'player.vimeo.com': $path = trim($video['path'], '/'); if (strpos($path, 'video/') === 0) { $path = substr($path, 6); } $video_id = explode('?', $path)[0]; $video_src = '//player.vimeo.com/video/' . $video_id; break; case 'dailymotion.com': case 'www.dailymotion.com': $path = trim($video['path'], '/'); if (strpos($path, 'video/') === 0) { $path = substr($path, 6); } $video_id = explode('_', $path)[0]; $video_src = '//www.dailymotion.com/embed/video/' . $video_id; break; case 'dai.ly': $path = trim($video['path'], '/'); if ($path) { $video_id = $path; $video_src = '//www.dailymotion.com/embed/video/' . $video_id; } break; default: if ($ext === 'mp4') { $embed_code = ' <video controls width="100%"> <source src="' . htmlspecialchars($video_url, ENT_QUOTES) . '" type="video/mp4"> Your browser does not support the video tag. </video>'; } else { $embed_code = Helper::sanitizeEmbed( '<iframe src="' . htmlspecialchars($video_url, ENT_QUOTES) . '" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>' ); } break; } if ($embed_code) { ?> <div class="article-featured-video"> <div class="ratio ratio-16x9"> <?php echo $embed_code; ?> </div> </div> <?php } elseif ($video_src) { ?> <div class="article-featured-video"> <div class="ratio ratio-16x9"> <iframe src="<?php echo htmlspecialchars($video_src, ENT_QUOTES); ?>" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe> </div> </div> <?php } } PKCA#]�}�OOOsystem/helixultimate/overrides/layouts/joomla/content/related_article_large.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $item = $displayData; $params = $item->params; $info = $params->get('info_block_position', 0); $attribs = json_decode($item->attribs ?? ""); HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers/html'); $article_format = (isset($attribs->helix_ultimate_article_format) && $attribs->helix_ultimate_article_format) ? $attribs->helix_ultimate_article_format : 'standard'; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <div class="article related-article-large d-flex"> <div class="article-image"> <?php if($article_format === 'gallery') : ?> <?php echo LayoutHelper::render('joomla.content.blog.gallery', array('attribs' => $attribs, 'id' => $item->id)); ?> <?php elseif($article_format === 'video') : ?> <?php echo LayoutHelper::render('joomla.content.blog.video', array('attribs' => $attribs)); ?> <?php elseif($article_format === 'audio') : ?> <?php echo LayoutHelper::render('joomla.content.blog.audio', array('attribs' => $attribs)); ?> <?php else: ?> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language) : ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)); ?>"> <?php echo LayoutHelper::render('joomla.content.full_image', $item); ?> </a> <?php endif; ?> </div> <div class="article-information"> <?php echo LayoutHelper::render('joomla.content.blog_style_default_item_title', $item); ?> <?php if ($params->get('show_author') && !empty($item->author )) : ?> <?php echo LayoutHelper::render('joomla.content.info_block.author', array('item' => $item, 'params' => $params,'articleView'=>'intro')); ?> <?php endif; ?> <?php if ($params->get('show_publish_date')) : ?> <?php echo LayoutHelper::render('joomla.content.info_block.publish_date', array('item' => $item, 'params' => $params,'articleView'=>'intro')); ?> <?php endif; ?> <?php if ($item->introtext): ?> <div class="intro-text"> <?php echo $item->introtext; ?> </div> <?php endif ?> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language) : ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)); ?>" class="btn btn-outline-secondary btn-sm"><?php echo Text::_('HELIX_ULTIMATE_READ_MORE') ?></a> </div> </div>PKCA#]�~ ��>system/helixultimate/overrides/layouts/joomla/content/tags.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Router\Route; use Joomla\Component\Tags\Site\Helper\RouteHelper; use Joomla\Registry\Registry; $authorised = Factory::getUser()->getAuthorisedViewLevels(); ?> <?php if (!empty($displayData)) : ?> <ul class="tags list-inline mb-4"> <?php foreach ($displayData as $i => $tag) : ?> <?php if (in_array($tag->access, $authorised)) : ?> <?php $tagParams = new Registry($tag->params); ?> <?php $link_class = $tagParams->get('tag_link_class', ''); ?> <li class="list-inline-item tag-<?php echo $tag->tag_id; ?> tag-list<?php echo $i; ?>"> <a href="<?php echo Route::_(RouteHelper::getComponentTagRoute($tag->tag_id . ':' . $tag->alias, $tag->language)); ?>" class="<?php echo $link_class; ?>"> <?php echo $this->escape($tag->title); ?> </a> </li> <?php endif; ?> <?php endforeach; ?> </ul> <?php endif; ?> PKCA#]s��ffIsystem/helixultimate/overrides/layouts/joomla/content/options_default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Form\FormHelper; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); ?> <fieldset class="<?php echo !empty($displayData->formclass) ? $displayData->formclass : ''; ?>"> <legend><?php echo $displayData->name; ?></legend> <?php if (!empty($displayData->description)) : ?> <p><?php echo $displayData->description; ?></p> <?php endif; ?> <?php $fieldsnames = explode(',', $displayData->fieldsname); ?> <div class="form-grid"> <?php foreach ($fieldsnames as $fieldname) : ?> <?php foreach ($displayData->form->getFieldset($fieldname) as $field) : ?> <?php $datashowon = ''; ?> <?php $groupClass = $field->type === 'Spacer' ? ' field-spacer' : ''; ?> <?php if ($field->showon) : ?> <?php $wa->useScript('showon'); ?> <?php $datashowon = ' data-showon=\'' . json_encode(FormHelper::parseShowOnConditions($field->showon, $field->formControl, $field->group)) . '\''; ?> <?php endif; ?> <?php if (isset($displayData->showlabel)) : ?> <div class="control-group<?php echo $groupClass; ?>"<?php echo $datashowon; ?>> <div class="controls"><?php echo $field->input; ?></div> </div> <?php else : ?> <?php echo $field->renderField(); ?> <?php endif; ?> <?php endforeach; ?> <?php endforeach; ?> </div> </fieldset> PKCA#]S��� � Dsystem/helixultimate/overrides/layouts/joomla/content/info_block.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Layout\LayoutHelper; $intro = (isset($displayData['intro']) && $displayData['intro']) ? $displayData['intro'] : false; $displayData['articleView'] = ($intro) ? 'intro' : 'details'; $blockPosition = $displayData['params']->get('info_block_position', 0); $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $blogReadTime = $template->params->get('blog_read_time'); ?> <div class="article-info"> <?php if ($displayData['position'] === 'above' && ($blockPosition == 0 || $blockPosition == 2) || $displayData['position'] === 'below' && ($blockPosition == 1) ) : ?> <?php if ($displayData['params']->get('show_author') && !empty($displayData['item']->author )) : ?> <?php echo $this->sublayout('author', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_parent_category') && !empty($displayData['item']->parent_slug) && $intro == false) : ?> <?php echo $this->sublayout('parent_category', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_category')) : ?> <?php echo $this->sublayout('category', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_associations') && $intro == false) : ?> <?php echo $this->sublayout('associations', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_publish_date')) : ?> <?php echo $this->sublayout('publish_date', $displayData); ?> <?php endif; ?> <?php if ($intro) : ?> <?php echo LayoutHelper::render('joomla.content.blog.comments.count', $displayData); ?> <?php endif; ?> <?php endif; ?> <?php if ($displayData['position'] === 'above' && ($blockPosition == 0) || $displayData['position'] === 'below' && ($blockPosition == 1 || $blockPosition == 2) ) : ?> <?php if ($displayData['params']->get('show_create_date') && $intro == false) : ?> <?php echo $this->sublayout('create_date', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_modify_date') && $intro == false) : ?> <?php echo $this->sublayout('modify_date', $displayData); ?> <?php endif; ?> <?php if ($displayData['params']->get('show_hits') && $intro == false) : ?> <?php echo $this->sublayout('hits', $displayData); ?> <?php endif; ?> <?php if ($blogReadTime) :?> <?php echo $this->sublayout('reading_time', $displayData['item']); ?> <?php endif; ?> <?php endif; ?> </div> PKCA#]`ƽ;� � Isystem/helixultimate/overrides/layouts/joomla/content/related_article.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Version; $item = $displayData; $item->enableOpenGraph = false; $params = $item->params; $info = $params->get('info_block_position', 0); $attribs = json_decode($item->attribs ?? ""); HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers/html'); $article_format = (isset($attribs->helix_ultimate_article_format) && $attribs->helix_ultimate_article_format) ? $attribs->helix_ultimate_article_format : 'standard'; $item->heading = 'h4'; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); ?> <div class="article"> <?php if($article_format === 'gallery') : ?> <?php echo LayoutHelper::render('joomla.content.blog.gallery', array('attribs' => $attribs, 'id' => $item->id)); ?> <?php elseif($article_format === 'video') : ?> <?php echo LayoutHelper::render('joomla.content.blog.video', array('attribs' => $attribs)); ?> <?php elseif($article_format === 'audio') : ?> <?php echo LayoutHelper::render('joomla.content.blog.audio', array('attribs' => $attribs)); ?> <?php else: ?> <a href="<?php echo Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language) : ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)); ?>"> <?php echo LayoutHelper::render('joomla.content.full_image', $item); ?> </a> <?php endif; ?> <?php echo LayoutHelper::render('joomla.content.blog_style_default_item_title', $item); ?> <div class="article-info"> <?php if ($params->get('show_author') && !empty($item->author )) : ?> <?php echo LayoutHelper::render('joomla.content.info_block.author', array('item' => $item, 'params' => $params,'articleView'=>'intro')); ?> <?php endif; ?> <?php if ($params->get('show_publish_date')) : ?> <?php echo LayoutHelper::render('joomla.content.info_block.publish_date', array('item' => $item, 'params' => $params,'articleView'=>'intro')); ?> <?php endif; ?> </div> </div>PKCA#]矋���Dsystem/helixultimate/overrides/layouts/joomla/content/full_image.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Uri\Uri; use Joomla\CMS\HTML\HTMLHelper; $params = $displayData->params ?? null; $images = json_decode($displayData->images ?? ''); $attribs = json_decode($displayData->attribs ?? ''); $tplParams = null; if (class_exists('HelixUltimate\\Framework\\Platform\\Helper')) { $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $tplParams = $template ? ($template->params ?? null) : null; } $og = isset($displayData->enableOpenGraph) ? (int) $displayData->enableOpenGraph : (int) ($tplParams ? $tplParams->get('og', 0) : 0); $blogImageSize = $tplParams ? $tplParams->get('blog_details_image', 'large') : 'large'; $fullImage = ''; if (!empty($attribs->helix_ultimate_image)) { $fullImage = $attribs->helix_ultimate_image; if ($blogImageSize !== 'default') { $basename = basename($fullImage); $dirname = trim(dirname($fullImage), '/\\'); $ext = pathinfo($basename, PATHINFO_EXTENSION); $name = pathinfo($basename, PATHINFO_FILENAME); $variantFsPath = JPATH_ROOT . '/' . ($dirname ? $dirname . '/' : '') . $name . '_' . $blogImageSize . '.' . $ext; if (file_exists($variantFsPath)) { $fullImage = Uri::root(true) . '/' . ($dirname ? $dirname . '/' : '') . $name . '_' . $blogImageSize . '.' . $ext; } } } if (empty($fullImage) && !empty($images->image_fulltext)) { $fullImage = $images->image_fulltext; } if (empty($fullImage)) { return; } $toAbsolute = static function ($url) { if (!$url) return $url; if (preg_match('#^https?://#i', $url)) { return $url; } return rtrim(Uri::root(), '/') . '/' . ltrim($url, '/'); }; $imgfloat = ''; if (!empty($images->float_fulltext)) { $imgfloat = 'float-' . $images->float_fulltext; } elseif ($params) { $pf = $params->get('float_fulltext'); $imgfloat = $pf ? 'float-' . $pf : ''; } $altText = ''; if (!empty($attribs->helix_ultimate_image_alt_txt)) { $altText = $attribs->helix_ultimate_image_alt_txt; } elseif (!empty($images->image_fulltext_alt)) { $altText = $images->image_fulltext_alt; } elseif (empty($images->image_fulltext_alt_empty)) { $altText = $displayData->title ?? ''; } $captionText = isset($images->image_fulltext_caption) ? $images->image_fulltext_caption : ''; $figureClass = trim('article-full-image item-image ' . $imgfloat); ?> <figure class="<?php echo htmlspecialchars($figureClass, ENT_COMPAT, 'UTF-8'); ?>"> <?php $layoutAttr = [ 'src' => htmlspecialchars($fullImage, ENT_COMPAT, 'UTF-8'), 'itemprop' => 'image', 'alt' => $altText !== '' ? htmlspecialchars($altText, ENT_COMPAT, 'UTF-8') : false, ]; if ($captionText !== '') { $layoutAttr['class'] = 'caption'; $layoutAttr['title'] = htmlspecialchars($captionText, ENT_COMPAT, 'UTF-8'); } echo LayoutHelper::render('joomla.html.image', $layoutAttr); ?> <?php if ($captionText !== '') : ?> <figcaption class="caption"><?php echo htmlspecialchars($captionText, ENT_COMPAT, 'UTF-8'); ?></figcaption> <?php endif; ?> </figure> <?php if ($og) : ?> <?php $ogImage = $fullImage ?: (!empty($images->image_fulltext) ? $images->image_fulltext : ($images->image_intro ?? '')); $ogImage = $toAbsolute($ogImage); $ogImage = HTMLHelper::cleanImageURL($ogImage)->url; echo LayoutHelper::render('joomla.content.open_graph', [ 'image' => $ogImage, 'title' => $displayData->title ?? '', 'fb_app_id' => $tplParams ? $tplParams->get('og_fb_id') : '', 'twitter_site' => $tplParams ? $tplParams->get('og_twitter_site') : '', 'content' => $displayData->introtext ?? '', ]); ?> <?php endif; ?> PKCA#]dj�λ�Lsystem/helixultimate/overrides/layouts/joomla/content/icons/print_screen.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; ?> <span class="btn btn-outline-secondary btn-sm"> <span class="fas fa-print" aria-hidden="true"></span> <?php echo Text::_('JGLOBAL_PRINT'); ?> </span> PKCA#]B���Esystem/helixultimate/overrides/layouts/joomla/content/icons/email.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; ?> <span class="btn btn-outline-secondary btn-sm"> <span class="fas fa-envelope" aria-hidden="true"></span> <?php echo Text::_('JGLOBAL_EMAIL'); ?> </span>PKCA#]i` �Fsystem/helixultimate/overrides/layouts/joomla/content/icons/create.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; $params = $displayData['params']; ?> <?php if ($params->get('show_icons')) : ?> <span class="icon-plus icon-fw" aria-hidden="true"></span> <?php echo Text::_('JNEW'); ?> <?php else : ?> <?php echo Text::_('JNEW') . ' '; ?> <?php endif; ?> PKCA#][ð���Isystem/helixultimate/overrides/layouts/joomla/content/icons/edit_lock.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; if (isset($displayData['ariaDescribed'])) { $aria_described = $displayData['ariaDescribed']; } elseif (isset($displayData['article'])) { $article = $displayData['article']; $aria_described = 'editarticle-' . (int) $article->id; } elseif (isset($displayData['contact'])) { $contact = $displayData['contact']; $aria_described = 'editcontact-' . (int) $contact->id; } $tooltip = $displayData['tooltip']; ?> <span class="hasTooltip icon-lock" aria-hidden="true"></span> <?php echo Text::_('JLIB_HTML_CHECKED_OUT'); ?> <div role="tooltip" id="<?php echo $aria_described; ?>"> <?php echo $tooltip; ?> </div> PKCA#]b �m��Dsystem/helixultimate/overrides/layouts/joomla/content/icons/edit.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; $article = $displayData['article']; $tooltip = $displayData['tooltip']; $nowDate = strtotime(Factory::getDate()); $icon = $article->state ? 'edit' : 'eye-slash'; $currentDate = Factory::getDate()->format('Y-m-d H:i:s'); $isUnpublished = ($article->publish_up > $currentDate) || !is_null($article->publish_down) && ($article->publish_down < $currentDate); if ($isUnpublished) { $icon = 'eye-slash'; } $aria_described = 'editarticle-' . (int) $article->id; ?> <span class="icon-<?php echo $icon; ?>" aria-hidden="true"></span> <?php echo Text::_('JGLOBAL_EDIT'); ?> <div role="tooltip" id="<?php echo $aria_described; ?>"> <?php echo $tooltip; ?> </div> PKCA#]dj�λ�Ksystem/helixultimate/overrides/layouts/joomla/content/icons/print_popup.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\Language\Text; ?> <span class="btn btn-outline-secondary btn-sm"> <span class="fas fa-print" aria-hidden="true"></span> <?php echo Text::_('JGLOBAL_PRINT'); ?> </span> PKCA#]�}<���Fsystem/helixultimate/overrides/layouts/joomla/content/social_share.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license https://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; $version = new Version(); $JoomlaVersion = $version->getShortVersion(); $url = Route::_(version_compare($JoomlaVersion, '4.0.0', '>=') ? Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($displayData->id . ':' . $displayData->alias, $displayData->catid, $displayData->language) : ContentHelperRoute::getArticleRoute($displayData->id . ':' . $displayData->alias, $displayData->catid, $displayData->language)); $root = Uri::base(); $root = new Uri($root); $url = $root->getScheme() . '://' . $root->getHost() . $url; $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $params = $template->params; $tmpl_params = $template->params; $socialShares = $tmpl_params->get("social_share_lists"); if( is_array($socialShares) && $params->get('social_share') ) : ?> <div class="article-social-share"> <div class="social-share-icon"> <ul> <?php foreach( $socialShares as $socialSite ): ?> <?php if( $socialSite == 'facebook'): ?> <li> <a class="facebook" onClick="window.open('https://www.facebook.com/sharer.php?u=<?php echo $url; ?>','Facebook','width=600,height=300,left='+(screen.availWidth/2-300)+',top='+(screen.availHeight/2-150)+''); return false;" href="https://www.facebook.com/sharer.php?u=<?php echo $url; ?>" title="<?php echo Text::_('HELIX_ULTIMATE_SHARE_FACEBOOK'); ?>"> <span class="fab fa-facebook" aria-hidden="true"></span> </a> </li> <?php endif; ?> <?php if( $socialSite == 'twitter'): ?> <li> <a class="twitter" title="<?php echo Text::_('HELIX_ULTIMATE_SHARE_TWITTER'); ?>" onClick="window.open('https://twitter.com/share?url=<?php echo $url; ?>&text=<?php echo str_replace(" ", "%20", $displayData->title); ?>','Twitter share','width=600,height=300,left='+(screen.availWidth/2-300)+',top='+(screen.availHeight/2-150)+''); return false;" href="https://twitter.com/share?url=<?php echo $url; ?>&text=<?php echo str_replace(" ", "%20", $displayData->title); ?>"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" style="width: 13.56px;position: relative;top: -1.5px;"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/></svg> </a> </li> <?php endif; ?> <?php if( $socialSite == 'linkedin'): ?> <li> <a class="linkedin" title="<?php echo Text::_('HELIX_ULTIMATE_SHARE_LINKEDIN'); ?>" onClick="window.open('https://www.linkedin.com/shareArticle?mini=true&url=<?php echo $url; ?>','Linkedin','width=585,height=666,left='+(screen.availWidth/2-292)+',top='+(screen.availHeight/2-333)+''); return false;" href="https://www.linkedin.com/shareArticle?mini=true&url=<?php echo $url; ?>" > <span class="fab fa-linkedin" aria-hidden="true"></span> </a> </li> <?php endif; ?> <?php endforeach; ?> </ul> </div> </div> <?php endif; ?> PKCA#].*O���Bsystem/helixultimate/overrides/layouts/joomla/tinymce/textarea.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; $data = $displayData; $wa = Factory::getDocument()->getWebAssetManager(); $wa->getRegistry()->addExtensionRegistryFile('plg_editors_tinymce'); $wa->useScript('tinymce')->useScript('plg_editors_tinymce'); ?> <textarea name="<?php echo $data->name; ?>" id="<?php echo $data->id; ?>" cols="<?php echo $data->cols; ?>" rows="<?php echo $data->rows; ?>" style="width: <?php echo $data->width; ?>; height: <?php echo $data->height; ?>;" class="<?php echo empty($data->class) ? 'mce_editable' : $data->class; ?>" <?php echo $data->readonly ? ' readonly disabled' : ''; ?> > <?php echo $data->content; ?> </textarea> PKCA#]y��mmHsystem/helixultimate/overrides/layouts/joomla/tinymce/buttons/button.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Layout\LayoutHelper; echo LayoutHelper::render('joomla.editors.buttons.button', $displayData); PKCA#]��" yyFsystem/helixultimate/overrides/layouts/joomla/tinymce/togglebutton.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; ?> <div class="toggle-editor btn-toolbar float-end clearfix mt-3"> <div class="btn-group"> <button type="button" disabled class="btn btn-secondary js-tiny-toggler-button"> <span class="icon-eye" aria-hidden="true"></span> <?php echo Text::_('PLG_TINY_BUTTON_TOGGLE_EDITOR'); ?> </button> </div> </div> PKCA#]s���@system/helixultimate/overrides/layouts/joomla/system/message.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2014 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Application\CMSApplication; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; /* @var $displayData array */ $msgList = $displayData['msgList']; $document = Factory::getDocument(); $msgOutput = ''; $alert = [ CMSApplication::MSG_EMERGENCY => 'danger', CMSApplication::MSG_ALERT => 'danger', CMSApplication::MSG_CRITICAL => 'danger', CMSApplication::MSG_ERROR => 'danger', CMSApplication::MSG_WARNING => 'warning', CMSApplication::MSG_NOTICE => 'info', CMSApplication::MSG_INFO => 'info', CMSApplication::MSG_DEBUG => 'info', 'message' => 'success' ]; // Load JavaScript message titles Text::script('ERROR'); Text::script('MESSAGE'); Text::script('NOTICE'); Text::script('WARNING'); // Load other Javascript message strings Text::script('JCLOSE'); Text::script('JOK'); Text::script('JOPEN'); // Alerts progressive enhancement $document->getWebAssetManager() ->useStyle('webcomponent.joomla-alert') ->useScript('messages'); if (is_array($msgList) && !empty($msgList)) { $messages = []; foreach ($msgList as $type => $msgs) { // JS loaded messages $messages[] = [$alert[$type] ?? $type => $msgs]; // Noscript fallback if (!empty($msgs)) { $msgOutput .= '<div class="alert alert-' . ($alert[$type] ?? $type) . '">'; foreach ($msgs as $msg) : $msgOutput .= $msg; endforeach; $msgOutput .= '</div>'; } } if ($msgOutput !== '') { $msgOutput = '<noscript>' . $msgOutput . '</noscript>'; } $document->addScriptOptions('joomla.messages', $messages); } ?> <div id="system-message-container" aria-live="polite"><?php echo $msgOutput; ?></div> PKCA#]���̜�Bsystem/helixultimate/overrides/layouts/joomla/form/renderfield.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2014 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; extract($displayData); /** * Layout variables * ----------------- * @var array $options Optional parameters * @var string $id The id of the input this label is for * @var string $name The name of the input this label is for * @var string $label The html code for the label * @var string $input The input field html code * @var string $description An optional description to use as in–line help text * @var string $descClass The class name to use for the description */ if (!empty($options['showonEnabled'])) { /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('showon'); } $class = empty($options['class']) ? '' : ' ' . $options['class']; $rel = empty($options['rel']) ? '' : ' ' . $options['rel']; $id = ($id ?? $name) . '-desc'; $hideLabel = !empty($options['hiddenLabel']); $hideDescription = empty($options['hiddenDescription']) ? false : $options['hiddenDescription']; $descClass = ($options['descClass'] ?? '') ?: (!empty($options['inlineHelp']) ? 'hide-aware-inline-help d-none' : ''); if (!empty($parentclass)) { $class .= ' ' . $parentclass; } ?> <div class="control-group<?php echo $class; ?>"<?php echo $rel; ?>> <?php if ($hideLabel) : ?> <div class="visually-hidden"><?php echo $label; ?></div> <?php else : ?> <div class="control-label"><?php echo $label; ?></div> <?php endif; ?> <div class="controls"> <?php echo $input; ?> <?php if (!$hideDescription && !empty($description)) : ?> <div id="<?php echo $id; ?>" class="<?php echo $descClass ?>"> <small class="form-text"> <?php echo $description; ?> </small> </div> <?php endif; ?> </div> </div> PKCA#]��;Bsystem/helixultimate/overrides/layouts/joomla/form/field/radio.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('JPATH_BASE') or die(); use Joomla\CMS\HTML\HTMLHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $options Options available for this field. */ // Including fallback code for HTML5 non supported browsers. HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'system/html5fallback.js', array('version' => 'auto', 'relative' => true)); /** * The format of the input tag to be filled in using sprintf. * %1 - id * %2 - name * %3 - value * %4 = any other attributes */ $format = '<input type="radio" id="%1$s" name="%2$s" value="%3$s" %4$s />'; $alt = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $name); ?> <div id="<?php echo $id; ?>" class="<?php echo trim($class . ' radio'); ?>" <?php echo $disabled ? 'disabled' : ''; ?> <?php echo $required ? 'required aria-required="true"' : ''; ?> <?php echo $autofocus ? 'autofocus' : ''; ?>> <?php if (!empty($options)) : ?> <?php foreach ($options as $i => $option) : ?> <?php // Initialize some option attributes. $checked = ((string) $option->value === $value) ? 'checked="checked"' : ''; $optionClass = !empty($option->class) ? 'class="form-check-input ' . $option->class . '"' : 'class="form-check-input"'; $labelClass = !empty($option->class) ? 'class="form-check-label ' . $option->class . '"' : 'class="form-check-label btn"'; $disabled = !empty($option->disable) || ($disabled && !$checked) ? 'disabled' : ''; // Initialize some JavaScript option attributes. $onclick = !empty($option->onclick) ? 'onclick="' . $option->onclick . '"' : ''; $onchange = !empty($option->onchange) ? 'onchange="' . $option->onchange . '"' : ''; $oid = $id . $i; $ovalue = htmlspecialchars($option->value, ENT_COMPAT, 'UTF-8'); $attributes = array_filter(array($checked, $optionClass, $disabled, $onchange, $onclick)); ?> <?php if ($required) : ?> <?php $attributes[] = 'required aria-required="true"'; ?> <?php endif; ?> <div class="form-check form-check-inline"> <label for="<?php echo $oid; ?>" <?php echo $labelClass; ?>> <?php echo sprintf($format, $oid, $name, $ovalue, implode(' ', $attributes)); ?> <?php echo $option->text; ?> </label> </div> <?php endforeach; ?> <?php endif; ?> </div> PKCA#]���^ ^ Bsystem/helixultimate/overrides/layouts/joomla/form/field/meter.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. * @var string $animated Is it animated. * @var string $active Is it active. * @var string $max The maximum value. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-* */ // Initialize some field attributes. $class = 'progress-bar ' . $class; $class .= $animated ? ' progress-bar-striped progress-bar-animated' : ''; $class .= $active ? ' active' : ''; $class = 'class="' . $class . '"'; $value = (float) $value; $value = max($value, $min); $value = min($value, $max); $data = ''; $data .= 'aria-valuemax="' . $max . '"'; $data .= ' aria-valuemin="' . $min . '"'; $data .= ' aria-valuenow="' . $value . '"'; $attributes = [ $class, !empty($width) ? ' style="width:' . $width . ';"' : '', $data, $dataAttribute, ]; $value = ((float) ($value - $min) * 100) / ($max - $min); ?> <div class="progress"> <div role="progressbar" <?php echo implode(' ', $attributes); ?> style="width:<?php echo (string) $value; ?>%;<?php echo !empty($color) ? ' background-color:' . $color . ';' : ''; ?>"></div> </div> PKCA#]V-�w� � Isystem/helixultimate/overrides/layouts/joomla/form/field/modal-select.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-* * @var string $valueTitle * @var array $canDo * @var string[] $urls * @var string[] $modalTitles * @var string[] $buttonIcons */ // Add the field script if (!$readonly && !$disabled) { /** @var \Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('modal-content-select-field'); } $fieldClass = $required ? 'required modal-value' : ''; ?> <div class="js-modal-content-select-field <?php echo $class; ?>" <?php echo $dataAttribute; ?>> <div class="input-group"> <input class="form-control js-input-title" type="text" value="<?php echo $this->escape($valueTitle ?? $value); ?>" readonly id="<?php echo $id; ?>" name="<?php echo $name; ?>" placeholder="<?php echo $this->escape($hint); ?>"/> <?php if (!$readonly && !$disabled) : echo $this->sublayout('buttons', $displayData); // The "extra-buttons" layout allows to add extra control buttons to the field, example "propagate association" by com_content echo $this->sublayout('extra-buttons', $displayData); endif; ?> </div> <input type="hidden" id="<?php echo $id; ?>_id" class="<?php echo $fieldClass; ?> js-input-value" data-required="<?php echo (int) $required; ?>" name="<?php echo $name; ?>" value="<?php echo $this->escape($value); ?>"> </div> PKCA#]�yP P Csystem/helixultimate/overrides/layouts/joomla/form/field/number.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. */ $attributes = [ !empty($class) ? 'class="form-control ' . $class . '"' : 'class="form-control"', !empty($description) ? 'aria-describedby="' . ($id ?: $name) . '-desc"' : '', $disabled ? 'disabled' : '', $readonly ? 'readonly' : '', strlen($hint) ? 'placeholder="' . htmlspecialchars($hint, ENT_COMPAT, 'UTF-8') . '"' : '', !empty($onchange) ? 'onchange="' . $onchange . '"' : '', isset($max) ? 'max="' . $max . '"' : '', !empty($step) ? 'step="' . $step . '"' : '', isset($min) ? 'min="' . $min . '"' : '', $required ? 'required' : '', !empty($autocomplete) ? 'autocomplete="' . $autocomplete . '"' : '', $autofocus ? 'autofocus' : '', $dataAttribute, ]; if (is_numeric($value)) { $value = (float) $value; } else { $value = ''; $value = ($required && isset($min)) ? $min : $value; } ?> <input type="number" inputmode="numeric" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?>" <?php echo implode(' ', $attributes); ?>> PKCA#]�!�0��Asystem/helixultimate/overrides/layouts/joomla/form/field/file.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Utility\Utility; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-* */ $maxSize = HTMLHelper::_('number.bytes', Utility::getMaxUploadSize()); ?> <input type="file" name="<?php echo $name; ?>" id="<?php echo $id; ?>" <?php echo !empty($size) ? ' size="' . $size . '"' : ''; ?> <?php echo !empty($accept) ? ' accept="' . $accept . '"' : ''; ?> <?php echo !empty($class) ? ' class="form-control ' . $class . '"' : ' class="form-control"'; ?> <?php echo !empty($multiple) ? ' multiple' : ''; ?> <?php echo $disabled ? ' disabled' : ''; ?> <?php echo $autofocus ? ' autofocus' : ''; ?> <?php echo $dataAttribute; ?> <?php echo !empty($onchange) ? ' onchange="' . $onchange . '"' : ''; ?> <?php echo $required ? ' required' : ''; ?>><br> <?php echo Text::sprintf('JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT', $maxSize); ?> PKCA#]A:+q Nsystem/helixultimate/overrides/layouts/joomla/form/field/list-fancy-select.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $options Options available for this field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-* */ $html = []; $attr = ''; // Initialize the field attributes. $attr .= !empty($size) ? ' size="' . $size . '"' : ''; $attr .= $multiple ? ' multiple' : ''; $attr .= $autofocus ? ' autofocus' : ''; $attr .= $onchange ? ' onchange="' . $onchange . '"' : ''; $attr .= $dataAttribute; // To avoid user's confusion, readonly="readonly" should imply disabled="disabled". if ($readonly || $disabled) { $attr .= ' disabled="disabled"'; } $attr2 = ''; $attr2 .= !empty($class) ? ' class="' . $class . '"' : ''; $attr2 .= ' placeholder="' . $this->escape($hint ?: Text::_('JGLOBAL_TYPE_OR_SELECT_SOME_OPTIONS')) . '" '; if ($required) { $attr .= ' required class="required"'; $attr2 .= ' required'; } // Create a read-only list (no name) with hidden input(s) to store the value(s). if ($readonly) { $html[] = HTMLHelper::_('select.genericlist', $options, '', trim($attr), 'value', 'text', $value, $id); // E.g. form field type tag sends $this->value as array if ($multiple && is_array($value)) { if (!count($value)) { $value[] = ''; } foreach ($value as $val) { $html[] = '<input type="hidden" name="' . $name . '" value="' . htmlspecialchars($val, ENT_COMPAT, 'UTF-8') . '">'; } } else { $html[] = '<input type="hidden" name="' . $name . '" value="' . htmlspecialchars($value, ENT_COMPAT, 'UTF-8') . '">'; } } else // Create a regular list. { $html[] = HTMLHelper::_('select.genericlist', $options, $name, trim($attr), 'value', 'text', $value, $id); } Text::script('JGLOBAL_SELECT_NO_RESULTS_MATCH'); Text::script('JGLOBAL_SELECT_PRESS_TO_SELECT'); Factory::getApplication()->getDocument()->getWebAssetManager() ->usePreset('choicesjs') ->useScript('webcomponent.field-fancy-select'); ?> <joomla-field-fancy-select <?php echo $attr2; ?>><?php echo implode($html); ?></joomla-field-fancy-select> PKCA#]��"���Isystem/helixultimate/overrides/layouts/joomla/form/field/color/slider.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * @var array $displayData Data for this field collected by ColorField */ extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input * @var boolean $disabled Is this field disabled? * @var string $display Which kind of slider should be displayed? * @var string $default Default value for this field * @var string $format Format of color value * @var string $hint Text for inputs placeholder * @var string $id ID of field and label * @var string $name Name of the input field * @var string $onchange Onchange attribute for the field * @var string $onclick Onclick attribute for the field * @var string $position Position of input * @var boolean $preview Should the selected value be displayed separately? * @var boolean $readonly Is this field read only? * @var boolean $required Is this field required? * @var string $saveFormat Format to save the color * @var integer $size Size attribute of the input * @var string $validate Validation rules to apply. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attributes for eg, data-*. */ if ($color === 'none' || is_null($color)) { $color = ''; } $alpha = $format === 'hsla' || $format === 'rgba' || $format === 'alpha'; $autocomplete = !empty($autocomplete) ? 'autocomplete="' . $autocomplete . '"' : ''; $autofocus = $autofocus ? ' autofocus' : ''; $color = ' data-color="' . $color . '"'; $class = $class ? ' class="' . $class . '"' : ''; $default = $default ? ' data-default="' . $default . '"' : ''; $disabled = $disabled ? ' disabled' : ''; $format = $format ? ' data-format="' . $format . '"' : ''; $hint = strlen($hint) ? ' placeholder="' . $this->escape($hint) . '"' : ''; $onchange = $onchange ? ' onchange="' . $onchange . '"' : ''; $onclick = $onclick ? ' onclick="' . $onclick . '"' : ''; $preview = $preview ? ' data-preview="' . $preview . '"' : ''; $readonly = $readonly ? ' readonly' : ''; $saveFormat = $saveFormat ? ' data-format="' . $saveFormat . '"' : ''; $size = $size ? ' size="' . $size . '"' : ''; $validate = $validate ? ' data-validate="' . $validate . '"' : ''; $displayValues = explode(',', $display); $allSliders = $display === 'full' || empty($display); /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('field.color-slider'); Text::script('JFIELD_COLOR_ERROR_CONVERT_HSL'); Text::script('JFIELD_COLOR_ERROR_CONVERT_HUE'); Text::script('JFIELD_COLOR_ERROR_NO_COLOUR'); Text::script('JFIELD_COLOR_ERROR_WRONG_FORMAT'); ?> <div class="color-slider-wrapper" <?php echo $class, $color, $default, $preview, $size, $dataAttribute; ?> > <!-- The data to save at the end (label created in form by Joomla) --> <input type="text" class="form-control color-input" id="<?php echo $id; ?>" name="<?php echo $name; ?>" <?php echo $disabled, $readonly, $required, $saveFormat, $validate; ?> > <!-- Shows value which is allowed to manipulate like 'hue' --> <label for="slider-input" class="visually-hidden"><?php echo Text::_('JFIELD_COLOR_LABEL_SLIDER_INPUT'); ?></label> <input type="text" class="form-control" id="slider-input" <?php echo $autocomplete, $disabled, $hint, $onchange, $onclick, $position, $readonly, $required, $format, $validate; ?> > <span class="form-control-feedback"></span> <?php if ($allSliders || in_array('hue', $displayValues)) : ?> <label for="hue-slider" class="visually-hidden"><?php echo Text::_('JFIELD_COLOR_LABEL_SLIDER_HUE'); ?></label> <input type="range" min="0" max="360" class="form-control color-slider" id="hue-slider" data-type="hue" <?php echo $autofocus, $disabled ?> > <?php endif ?> <?php if ($allSliders || in_array('saturation', $displayValues)) : ?> <label for="saturation-slider" class="visually-hidden"><?php echo Text::_('JFIELD_COLOR_LABEL_SLIDER_SATURATION'); ?></label> <input type="range" min="0" max="100" class="form-control color-slider" id="saturation-slider" data-type="saturation" <?php echo $autofocus, $disabled ?> > <?php endif ?> <?php if ($allSliders || in_array('light', $displayValues)) : ?> <label for="light-slider" class="visually-hidden"><?php echo Text::_('JFIELD_COLOR_LABEL_SLIDER_LIGHT'); ?></label> <input type="range" min="0" max="100" class="form-control color-slider" id="light-slider" data-type="light" <?php echo $autofocus, $disabled ?> > <?php endif ?> <?php if ($alpha && ($allSliders || in_array('alpha', $displayValues))) : ?> <label for="alpha-slider" class="visually-hidden"><?php echo Text::_('JFIELD_COLOR_LABEL_SLIDER_ALPHA'); ?></label> <input type="range" min="0" max="100" class="form-control color-slider" id="alpha-slider" data-type="alpha" <?php echo $autofocus, $disabled ?> > <?php endif ?> </div> PKCA#]+k���Ksystem/helixultimate/overrides/layouts/joomla/form/field/color/advanced.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var integer $size Size attribute of the input. * @var boolean $spellchec Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $checked Is this field checked? * @var array $position Position of input. * @var string $control The forms control. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attributes for eg, data-*. */ if ($validate !== 'color' && in_array($format, ['rgb', 'rgba'], true)) { $alpha = ($format === 'rgba'); $placeholder = $alpha ? 'rgba(0, 0, 0, 0.5)' : 'rgb(0, 0, 0)'; } else { $placeholder = '#rrggbb'; } $inputclass = ($keywords && ! in_array($format, ['rgb', 'rgba'], true)) ? ' keywords' : ' ' . $format; $class = ' class="form-control ' . trim('minicolors ' . $class) . ($validate === 'color' ? '' : $inputclass) . '"'; $control = $control ? ' data-control="' . $control . '"' : ''; $format = $format ? ' data-format="' . $format . '"' : ''; $keywords = $keywords ? ' data-keywords="' . $keywords . '"' : ''; $colors = $colors ? ' data-colors="' . $colors . '"' : ''; $validate = $validate ? ' data-validate="' . $validate . '"' : ''; $disabled = $disabled ? ' disabled' : ''; $readonly = $readonly ? ' readonly' : ''; $hint = strlen($hint) ? ' placeholder="' . $this->escape($hint) . '"' : ' placeholder="' . $placeholder . '"'; $onchange = $onchange ? ' onchange="' . $onchange . '"' : ''; $required = $required ? ' required' : ''; $autocomplete = !empty($autocomplete) ? ' autocomplete="' . $autocomplete . '"' : ''; // Force LTR input value in RTL, due to display issues with rgba/hex colors $direction = $lang->isRtl() ? ' dir="ltr" style="text-align:right"' : ''; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->usePreset('minicolors') ->useScript('field.color-adv'); ?> <input type="text" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo $this->escape($color); ?>"<?php echo $hint, $class, $position, $control, $readonly, $disabled, $required, $onchange, $autocomplete, $autofocus, $format, $keywords, $direction, $validate, $dataAttribute; ?>/> PKCA#]4�7PPIsystem/helixultimate/overrides/layouts/joomla/form/field/color/simple.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellchec Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $checked Is this field checked? * @var array $position Position of input. * @var array $control The forms control. * @var array $colors The specified colors * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. */ $class = ' class="form-select ' . trim($class) . '"'; $disabled = $disabled ? ' disabled' : ''; $readonly = $readonly ? ' readonly' : ''; Factory::getDocument()->getWebAssetManager() ->useStyle('webcomponent.field-simple-color') ->useScript('webcomponent.field-simple-color'); ?> <joomla-field-simple-color text-select="<?php echo Text::_('JFIELD_COLOR_SELECT'); ?>" text-color="<?php echo Text::_('JFIELD_COLOR_VALUE'); ?>" text-close="<?php echo Text::_('JLIB_HTML_BEHAVIOR_CLOSE'); ?>" text-transparent="<?php echo Text::_('JFIELD_COLOR_TRANSPARENT'); ?>"> <select name="<?php echo $name; ?>" id="<?php echo $id; ?>"<?php echo $disabled; ?><?php echo $readonly; ?><?php echo $dataAttribute; ?><?php echo $required; ?><?php echo $class; ?><?php echo $position; ?><?php echo $onchange; ?><?php echo $autofocus; ?> style="visibility:hidden;width:22px;height:1px"> <?php foreach ($colors as $i => $c) : ?> <option<?php echo ($c === $color ? ' selected="selected"' : ''); ?> value="<?php echo $c; ?>"></option> <?php endforeach; ?> </select> </joomla-field-simple-color> PKCA#]0�Z<@system/helixultimate/overrides/layouts/joomla/form/field/tag.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var boolean $allowCustom Flag, to allow add custom values * @var boolean $remoteSearch Flag, to enable remote search * @var integer $minTermLength Minimum length of the term to start searching * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attributes for eg, data-*. */ $html = []; $attr = ''; // Initialize some field attributes. $attr .= $multiple ? ' multiple' : ''; $attr .= $autofocus ? ' autofocus' : ''; $attr .= $onchange ? ' onchange="' . $onchange . '"' : ''; $attr .= $dataAttribute; // To avoid user's confusion, readonly="readonly" should imply disabled="disabled". if ($readonly || $disabled) { $attr .= ' disabled="disabled"'; } $attr2 = ''; $attr2 .= !empty($class) ? ' class="' . $class . '"' : ''; $attr2 .= ' placeholder="' . $this->escape($hint ?: Text::_('JGLOBAL_TYPE_OR_SELECT_SOME_TAGS')) . '" '; $attr2 .= $dataAttribute; if ($allowCustom) { $attr2 .= $allowCustom ? ' allow-custom' : ''; $attr2 .= $allowCustom ? ' new-item-prefix="#new#"' : ''; } if ($remoteSearch) { $attr2 .= ' remote-search'; $attr2 .= ' url="' . Uri::root(true) . '/index.php?option=com_tags&task=tags.searchAjax"'; $attr2 .= ' term-key="like"'; $attr2 .= ' min-term-length="' . $minTermLength . '"'; } if ($required) { $attr .= ' required class="required"'; $attr2 .= ' required'; } // Create a read-only list (no name) with hidden input(s) to store the value(s). if ($readonly) { $html[] = HTMLHelper::_('select.genericlist', $options, '', trim($attr), 'value', 'text', $value, $id); // E.g. form field type tag sends $this->value as array if ($multiple && is_array($value)) { if (!count($value)) { $value[] = ''; } foreach ($value as $val) { $html[] = '<input type="hidden" name="' . $name . '" value="' . htmlspecialchars($val, ENT_COMPAT, 'UTF-8') . '">'; } } else { $html[] = '<input type="hidden" name="' . $name . '" value="' . htmlspecialchars($value, ENT_COMPAT, 'UTF-8') . '">'; } } else // Create a regular list. { $html[] = HTMLHelper::_('select.genericlist', $options, $name, trim($attr), 'value', 'text', $value, $id); } Text::script('JGLOBAL_SELECT_NO_RESULTS_MATCH'); Text::script('JGLOBAL_SELECT_PRESS_TO_SELECT'); Factory::getDocument()->getWebAssetManager() ->usePreset('choicesjs') ->useScript('webcomponent.field-fancy-select'); ?> <joomla-field-fancy-select <?php echo $attr2; ?>><?php echo implode($html); ?></joomla-field-fancy-select> PKCA#]z�+���Jsystem/helixultimate/overrides/layouts/joomla/form/field/radio/buttons.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $options Options available for this field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attributes for eg, data-*. */ $alt = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $name); $isBtnGroup = strpos(trim($class), 'btn-group') !== false; $isBtnYesNo = strpos(trim($class), 'btn-group-yesno') !== false; $classToggle = $isBtnGroup ? 'btn-check' : 'form-check-input'; $btnClass = $isBtnGroup ? 'btn btn-outline-secondary' : 'form-check-label'; $blockStart = $isBtnGroup ? '' : '<div class="form-check">'; $blockEnd = $isBtnGroup ? '' : '</div>'; // Add the attributes of the fieldset in an array $containerClass = trim($class . ' radio' . ($readonly || $disabled ? ' disabled' : '') . ($readonly ? ' readonly' : '')); $attribs = ['id="' . $id . '"']; if (!empty($disabled)) { $attribs[] = 'disabled'; } if (!empty($autofocus)) { $attribs[] = 'autofocus'; } if ($required) { $attribs[] = 'class="required radio"'; } if ($readonly || $disabled) { $attribs[] = 'style="pointer-events: none"'; } if ($dataAttribute) { $attribs[] = $dataAttribute; } ?> <fieldset <?php echo implode(' ', $attribs); ?>> <legend class="visually-hidden"> <?php echo $label; ?> </legend> <div class="<?php echo $containerClass; ?>"> <?php foreach ($options as $i => $option) : ?> <?php echo $blockStart; ?> <?php $disabled = !empty($option->disable) ? 'disabled' : ''; $style = $disabled ? ' style="pointer-events: none"' : ''; // Initialize some option attributes. if ($isBtnYesNo) { // Set the button classes for the yes/no group switch ($option->value) { case '0': $btnClass = 'btn btn-outline-danger'; break; case '1': $btnClass = 'btn btn-outline-success'; break; default: $btnClass = 'btn btn-outline-secondary'; break; } } $optionClass = !empty($option->class) ? $option->class : $btnClass; $optionClass = trim($optionClass . ' ' . $disabled); $checked = ((string) $option->value === $value) ? 'checked="checked"' : ''; // Initialize some JavaScript option attributes. $onclick = !empty($option->onclick) ? 'onclick="' . $option->onclick . '"' : ''; $onchange = !empty($option->onchange) ? 'onchange="' . $option->onchange . '"' : ''; $oid = $id . $i; $ovalue = htmlspecialchars($option->value, ENT_COMPAT, 'UTF-8'); $attributes = array_filter([$checked, $disabled, ltrim($style), $onchange, $onclick]); ?> <?php if ($required) : ?> <?php $attributes[] = 'required'; ?> <?php endif; ?> <input class="<?php echo $classToggle; ?>" type="radio" id="<?php echo $oid; ?>" name="<?php echo $name; ?>" value="<?php echo $ovalue; ?>" <?php echo implode(' ', $attributes); ?>> <label for="<?php echo $oid; ?>" class="<?php echo trim($optionClass); ?>"<?php echo $style; ?>> <?php echo $option->text; ?> </label> <?php echo $blockEnd; ?> <?php endforeach; ?> </div> </fieldset> PKCA#]�!���Ksystem/helixultimate/overrides/layouts/joomla/form/field/radio/switcher.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $options Options available for this field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attributes for eg, data-*. */ // If there are no options don't render anything if (empty($options)) { return ''; } // Load the css files Factory::getApplication()->getDocument()->getWebAssetManager()->useStyle('switcher'); /** * The format of the input tag to be filled in using sprintf. * %1 - id * %2 - name * %3 - value * %4 = any other attributes */ $input = '<input type="radio" id="%1$s" name="%2$s" value="%3$s" %4$s>'; $attr = 'id="' . $id . '"'; $attr .= $onchange ? ' onchange="' . $onchange . '"' : ''; $attr .= $dataAttribute; ?> <fieldset <?php echo $attr; ?>> <legend class="visually-hidden"> <?php echo $label; ?> </legend> <div class="switcher<?php echo ($readonly || $disabled ? ' disabled' : ''); ?>"> <?php foreach ($options as $i => $option) : ?> <?php // False value casting as string returns an empty string so assign it 0 if (empty($value) && $option->value == '0') { $value = '0'; } // Initialize some option attributes. $optionValue = (string) $option->value; $optionId = $id . $i; $attributes = $optionValue == $value ? 'checked class="active ' . $class . '"' : ($class ? 'class="' . $class . '"' : ''); $attributes .= $optionValue != $value && $readonly || $disabled ? ' disabled' : ''; ?> <?php echo sprintf($input, $optionId, $name, $this->escape($optionValue), $attributes); ?> <?php echo '<label for="' . $optionId . '">' . $option->text . '</label>'; ?> <?php endforeach; ?> <span class="toggle-outside"><span class="toggle-inside"></span></span> </div> </fieldset> PKCA#]m�Cc��Esystem/helixultimate/overrides/layouts/joomla/form/field/checkbox.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Form\Field\CheckboxField; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string|null $description Description of the field. * @var boolean $disabled Is this field disabled? * @var CheckboxField $field The form field object. * @var string|null $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var string $validationtext The validation text of invalid value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var boolean $checked Whether the checkbox should be checked. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. */ // Initialize some field attributes. $class = $class ? ' ' . $class : ''; $disabled = $disabled ? ' disabled' : ''; $required = $required ? ' required' : ''; $autofocus = $autofocus ? ' autofocus' : ''; $checked = $checked ? ' checked' : ''; // Initialize JavaScript field attributes. $onclick = $onclick ? ' onclick="' . $onclick . '"' : ''; $onchange = $onchange ? ' onchange="' . $onchange . '"' : ''; ?> <div class="form-check form-check-inline"> <input type="checkbox" name="<?php echo $name; ?>" id="<?php echo $id; ?>" class="form-check-input<?php echo $class; ?>" value="<?php echo htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); ?>" <?php echo $checked . $disabled . $onclick . $onchange . $required . $autofocus . $dataAttribute; ?> > </div> PKCA#]M�h���Gsystem/helixultimate/overrides/layouts/joomla/form/field/checkboxes.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2015 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attributes for eg, data-*. */ /** * The format of the input tag to be filled in using sprintf. * %1 - id * %2 - name * %3 - value * %4 = any other attributes */ $format = '<input type="checkbox" id="%1$s" name="%2$s" value="%3$s" %4$s>'; // The alt option for Text::alt $alt = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $name); ?> <fieldset id="<?php echo $id; ?>" class="<?php echo trim($class . ' checkboxes'); ?>" <?php echo $required ? 'required' : ''; ?> <?php echo $autofocus ? 'autofocus' : ''; ?> <?php echo $dataAttribute; ?>> <legend class="visually-hidden"><?php echo $label; ?></legend> <?php foreach ($options as $i => $option) : ?> <?php // Initialize some option attributes. $checked = in_array((string) $option->value, $checkedOptions, true) ? 'checked' : ''; // In case there is no stored value, use the option's default state. $checked = (!$hasValue && $option->checked) ? 'checked' : $checked; $optionClass = !empty($option->class) ? 'class="form-check-input ' . $option->class . '"' : ' class="form-check-input"'; $optionDisabled = !empty($option->disable) || $disabled ? 'disabled' : ''; // Initialize some JavaScript option attributes. $onclick = !empty($option->onclick) ? 'onclick="' . $option->onclick . '"' : ''; $onchange = !empty($option->onchange) ? 'onchange="' . $option->onchange . '"' : ''; $oid = $id . $i; $value = htmlspecialchars($option->value, ENT_COMPAT, 'UTF-8'); $attributes = array_filter([$checked, $optionClass, $optionDisabled, $onchange, $onclick]); ?> <div class="form-check form-check-inline"> <?php echo sprintf($format, $oid, $name, $value, implode(' ', $attributes)); ?> <label for="<?php echo $oid; ?>" class="form-check-label"> <?php echo $option->text; ?> </label> </div> <?php endforeach; ?> </fieldset> PKCA#]$���Asystem/helixultimate/overrides/layouts/joomla/form/field/text.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. * @var string $dirname The directory name * @var string $addonBefore The text to use in a bootstrap input group prepend * @var string $addonAfter The text to use in a bootstrap input group append * @var boolean $charcounter Does this field support a character counter? */ $list = ''; if ($options) { $list = 'list="' . $id . '_datalist"'; } $charcounterclass = ''; if ($charcounter) { // Load the js file /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('short-and-sweet'); // Set the css class to be used as the trigger $charcounterclass = ' charcount'; // Set the text $counterlabel = 'data-counter-label="' . $this->escape(Text::_('JFIELD_META_DESCRIPTION_COUNTER')) . '"'; } $attributes = [ !empty($class) ? 'class="form-control ' . $class . $charcounterclass . '"' : 'class="form-control' . $charcounterclass . '"', !empty($size) ? 'size="' . $size . '"' : '', !empty($description) ? 'aria-describedby="' . ($id ?: $name) . '-desc"' : '', $disabled ? 'disabled' : '', $readonly ? 'readonly' : '', $dataAttribute, $list, strlen($hint) ? 'placeholder="' . htmlspecialchars($hint, ENT_COMPAT, 'UTF-8') . '"' : '', $onchange ? ' onchange="' . $onchange . '"' : '', !empty($maxLength) ? $maxLength : '', $required ? 'required' : '', !empty($autocomplete) ? 'autocomplete="' . $autocomplete . '"' : '', $autofocus ? ' autofocus' : '', $spellcheck ? '' : 'spellcheck="false"', !empty($inputmode) ? $inputmode : '', !empty($counterlabel) ? $counterlabel : '', !empty($pattern) ? 'pattern="' . $pattern . '"' : '', // @TODO add a proper string here!!! !empty($validationtext) ? 'data-validation-text="' . $validationtext . '"' : '', ]; $addonBeforeHtml = '<span class="input-group-text">' . Text::_($addonBefore) . '</span>'; $addonAfterHtml = '<span class="input-group-text">' . Text::_($addonAfter) . '</span>'; ?> <?php if (!empty($addonBefore) || !empty($addonAfter)) : ?> <div class="input-group"> <?php endif; ?> <?php if (!empty($addonBefore)) : ?> <?php echo $addonBeforeHtml; ?> <?php endif; ?> <input type="text" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?>" <?php echo $dirname; ?> <?php echo implode(' ', $attributes); ?>> <?php if (!empty($addonAfter)) : ?> <?php echo $addonAfterHtml; ?> <?php endif; ?> <?php if (!empty($addonBefore) || !empty($addonAfter)) : ?> </div> <?php endif; ?> <?php if ($options) : ?> <datalist id="<?php echo $id; ?>_datalist"> <?php foreach ($options as $option) : ?> <?php if (!$option->value) : ?> <?php continue; ?> <?php endif; ?> <option value="<?php echo $option->value; ?>"><?php echo $option->text; ?></option> <?php endforeach; ?> </datalist> <?php endif; ?> PKCA#]@�ak� � Bsystem/helixultimate/overrides/layouts/joomla/form/field/email.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\String\PunycodeHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. */ $attributes = [ 'type="email"', 'inputmode="email"', 'name="' . $name . '"', 'class="form-control validate-email' . (!empty($class) ? ' ' . $class : '') . '"', 'id="' . $id . '"', 'value="' . htmlspecialchars(PunycodeHelper::emailToUTF8($value), ENT_COMPAT, 'UTF-8') . '"', $spellcheck ? '' : 'spellcheck="false"', !empty($size) ? 'size="' . $size . '"' : '', !empty($description) ? 'aria-describedby="' . ($id ?: $name) . '-desc"' : '', $disabled ? 'disabled' : '', $readonly ? 'readonly' : '', $onchange ? 'onchange="' . $onchange . '"' : '', !empty($autocomplete) ? 'autocomplete="' . $autocomplete . '"' : '', $multiple ? 'multiple' : '', !empty($maxLength) ? 'maxlength="' . $maxLength . '"' : '', strlen($hint) ? 'placeholder="' . htmlspecialchars($hint, ENT_COMPAT, 'UTF-8') . '"' : '', $required ? 'required' : '', $autofocus ? 'autofocus' : '', $dataAttribute, ]; echo '<input ' . implode(' ', array_values(array_filter($attributes))) . '>'; PKCA#]��MrrKsystem/helixultimate/overrides/layouts/joomla/form/field/contenthistory.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2015 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var string $link The link for the content history page * @var string $label The label text * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attributes for eg, data-*. */ echo HTMLHelper::_( 'bootstrap.renderModal', 'versionsModal', [ 'url' => Route::_($link), 'title' => $label, 'height' => '100%', 'width' => '100%', 'modalWidth' => '80', 'bodyHeight' => '60', 'footer' => '<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" aria-hidden="true">' . Text::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>' ] ); ?> <button type="button" class="btn btn-secondary" data-bs-toggle="modal" data-bs-target="#versionsModal" <?php echo $dataAttribute; ?>> <span class="icon-code-branch" aria-hidden="true"></span> <?php echo $label; ?> </button> PKCA#]�D<�77Esystem/helixultimate/overrides/layouts/joomla/form/field/password.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var boolean $rules Are the rules to be displayed? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. * @var boolean $lock Is this field locked. */ $document = Factory::getApplication()->getDocument(); /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $document->getWebAssetManager(); if ($meter) { $wa->useScript('field.passwordstrength'); $class = 'js-password-strength ' . $class; if ($forcePassword) { $class .= ' meteredPassword'; } } $wa->useScript('field.passwordview'); Text::script('JFIELD_PASSWORD_INDICATE_INCOMPLETE'); Text::script('JFIELD_PASSWORD_INDICATE_COMPLETE'); Text::script('JSHOWPASSWORD'); Text::script('JHIDEPASSWORD'); if ($lock) { Text::script('JMODIFY'); Text::script('JCANCEL'); $disabled = true; $hint = str_repeat('•', 10); $value = ''; } $ariaDescribedBy = $rules ? $name . '-rules ' : ''; $ariaDescribedBy .= !empty($description) ? (($id ?: $name) . '-desc') : ''; $attributes = [ strlen($hint) ? 'placeholder="' . htmlspecialchars($hint, ENT_COMPAT, 'UTF-8') . '"' : '', !empty($autocomplete) ? 'autocomplete="' . $autocomplete . '"' : '', !empty($class) ? 'class="form-control ' . $class . '"' : 'class="form-control"', !empty($ariaDescribedBy) ? 'aria-describedby="' . trim($ariaDescribedBy) . '"' : '', $readonly ? 'readonly' : '', $disabled ? 'disabled' : '', !empty($size) ? 'size="' . $size . '"' : '', !empty($maxLength) ? 'maxlength="' . $maxLength . '"' : '', $required ? 'required' : '', $autofocus ? 'autofocus' : '', !empty($minLength) ? 'data-min-length="' . $minLength . '"' : '', !empty($minIntegers) ? 'data-min-integers="' . $minIntegers . '"' : '', !empty($minSymbols) ? 'data-min-symbols="' . $minSymbols . '"' : '', !empty($minUppercase) ? 'data-min-uppercase="' . $minUppercase . '"' : '', !empty($minLowercase) ? 'data-min-lowercase="' . $minLowercase . '"' : '', !empty($forcePassword) ? 'data-min-force="' . $forcePassword . '"' : '', $dataAttribute, ]; if ($rules) { $requirements = []; if ($minLength) { $requirements[] = Text::sprintf('JFIELD_PASSWORD_RULES_CHARACTERS', $minLength); } if ($minIntegers) { $requirements[] = Text::sprintf('JFIELD_PASSWORD_RULES_DIGITS', $minIntegers); } if ($minSymbols) { $requirements[] = Text::sprintf('JFIELD_PASSWORD_RULES_SYMBOLS', $minSymbols); } if ($minUppercase) { $requirements[] = Text::sprintf('JFIELD_PASSWORD_RULES_UPPERCASE', $minUppercase); } if ($minLowercase) { $requirements[] = Text::sprintf('JFIELD_PASSWORD_RULES_LOWERCASE', $minLowercase); } } ?> <?php if ($rules) : ?> <div id="<?php echo $name . '-rules'; ?>" class="small text-muted"> <?php echo Text::sprintf('JFIELD_PASSWORD_RULES_MINIMUM_REQUIREMENTS', implode(', ', $requirements)); ?> </div> <?php endif; ?> <div class="password-group"> <div class="input-group"> <input type="password" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?>" <?php echo implode(' ', $attributes); ?>> <?php if (!$lock) : ?> <button type="button" class="btn btn-secondary input-password-toggle"> <span class="icon-eye icon-fw" aria-hidden="true"></span> <span class="visually-hidden"><?php echo Text::_('JSHOWPASSWORD'); ?></span> </button> <?php else : ?> <button type="button" id="<?php echo $id; ?>_lock" class="btn btn-info input-password-modify locked"> <?php echo Text::_('JMODIFY'); ?> </button> <?php endif; ?> </div> </div> PKCA#]�QP^S8S8Bsystem/helixultimate/overrides/layouts/joomla/form/field/rules.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Access\Access; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Session\Session; extract($displayData); // Get some system objects. $document = Factory::getDocument(); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var array $options Options available for this field. * @var array $groups Available user groups. * @var array $actions Actions for the asset. * @var integer $assetId Access parameters. * @var string $component The component. * @var string $section The section. * @var boolean $isGlobalConfig Current view is global config? * @var boolean $newItem The new item. * @var object $assetRules Rules for asset. * @var integer $parentAssetId To calculate permissions. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attributes for eg, data-*. */ // Add Javascript for permission change HTMLHelper::_('form.csrf'); Factory::getDocument()->getWebAssetManager() ->useStyle('webcomponent.field-permissions') ->useScript('webcomponent.field-permissions') ->useStyle('webcomponent.joomla-tab') ->useScript('webcomponent.joomla-tab'); // Load JavaScript message titles Text::script('ERROR'); Text::script('WARNING'); Text::script('NOTICE'); Text::script('MESSAGE'); // Add strings for JavaScript error translations. Text::script('JLIB_JS_AJAX_ERROR_CONNECTION_ABORT'); Text::script('JLIB_JS_AJAX_ERROR_NO_CONTENT'); Text::script('JLIB_JS_AJAX_ERROR_OTHER'); Text::script('JLIB_JS_AJAX_ERROR_PARSE'); Text::script('JLIB_JS_AJAX_ERROR_TIMEOUT'); // Ajax request data. $ajaxUri = Route::_('index.php?option=com_config&task=application.store&format=json&' . Session::getFormToken() . '=1'); ?> <?php // Description ?> <details> <summary class="rule-notes"> <?php echo Text::_('JLIB_RULES_SETTINGS_DESC'); ?> </summary> <div class="rule-notes"> <?php if ($section === 'component' || !$section) { echo Text::alt('JLIB_RULES_SETTING_NOTES', $component); } else { echo Text::alt('JLIB_RULES_SETTING_NOTES_ITEM', $component . '_' . $section); } ?> </div> </details> <?php // Begin tabs ?> <joomla-field-permissions class="row mb-2" data-uri="<?php echo $ajaxUri; ?>" <?php echo $dataAttribute; ?>> <joomla-tab orientation="vertical" id="permissions-sliders" recall breakpoint="728"> <?php // Initial Active Pane ?> <?php foreach ($groups as $group) : ?> <?php $active = (int) $group->value === 1 ? ' active' : ''; ?> <joomla-tab-element class="tab-pane" <?php echo $active; ?> name="<?php echo htmlentities(LayoutHelper::render('joomla.html.treeprefix', ['level' => $group->level + 1]), ENT_COMPAT, 'utf-8') . $group->text; ?>" id="permission-<?php echo $group->value; ?>"> <table class="table respTable"> <thead> <tr> <th class="actions w-30" id="actions-th<?php echo $group->value; ?>"> <span class="acl-action"><?php echo Text::_('JLIB_RULES_ACTION'); ?></span> </th> <th class="settings w-40" id="settings-th<?php echo $group->value; ?>"> <span class="acl-action"><?php echo Text::_('JLIB_RULES_SELECT_SETTING'); ?></span> </th> <th class="w-30" id="aclaction-th<?php echo $group->value; ?>"> <span class="acl-action"><?php echo Text::_('JLIB_RULES_CALCULATED_SETTING'); ?></span> </th> </tr> </thead> <tbody> <?php // Check if this group has super user permissions ?> <?php $isSuperUserGroup = Access::checkGroup($group->value, 'core.admin'); ?> <?php foreach ($actions as $action) : ?> <tr> <td class="oddCol" data-label="<?php echo Text::_('JLIB_RULES_ACTION'); ?>" headers="actions-th<?php echo $group->value; ?>"> <label for="<?php echo $id; ?>_<?php echo $action->name; ?>_<?php echo $group->value; ?>"> <?php echo Text::_($action->title); ?> </label> <?php if (!empty($action->description)) : ?> <div role="tooltip" id="tip-<?php echo $id; ?>"> <?php echo htmlspecialchars(Text::_($action->description)); ?> </div> <?php endif; ?> </td> <td data-label="<?php echo Text::_('JLIB_RULES_SELECT_SETTING'); ?>" headers="settings-th<?php echo $group->value; ?>"> <div class="d-flex align-items-center"> <select data-onchange-task="permissions.apply" class="form-select novalidate" name="<?php echo $name; ?>[<?php echo $action->name; ?>][<?php echo $group->value; ?>]" id="<?php echo $id; ?>_<?php echo $action->name; ?>_<?php echo $group->value; ?>" > <?php /** * Possible values: * null = not set means inherited * false = denied * true = allowed */ // Get the actual setting for the action for this group. ?> <?php $assetRule = $newItem === false ? $assetRules->allow($action->name, $group->value) : null;?> <?php // Build the dropdowns for the permissions sliders // The parent group has "Not Set", all children can rightly "Inherit" from that.?> <option value="" <?php echo ($assetRule === null ? ' selected="selected"' : ''); ?>> <?php echo Text::_(empty($group->parent_id) && $isGlobalConfig ? 'JLIB_RULES_NOT_SET' : 'JLIB_RULES_INHERITED'); ?></option> <option value="1" <?php echo ($assetRule === true ? ' selected="selected"' : ''); ?>> <?php echo Text::_('JLIB_RULES_ALLOWED'); ?></option> <option value="0" <?php echo ($assetRule === false ? ' selected="selected"' : ''); ?>> <?php echo Text::_('JLIB_RULES_DENIED'); ?></option> </select>  <span id="icon_<?php echo $id; ?>_<?php echo $action->name; ?>_<?php echo $group->value; ?>"></span> </div> </td> <td data-label="<?php echo Text::_('JLIB_RULES_CALCULATED_SETTING'); ?>" headers="aclaction-th<?php echo $group->value; ?>"> <?php $result = []; ?> <?php // Get the group, group parent id, and group global config recursive calculated permission for the chosen action. ?> <?php $inheritedGroupRule = Access::checkGroup((int) $group->value, $action->name, $assetId); $inheritedGroupParentAssetRule = !empty($parentAssetId) ? Access::checkGroup($group->value, $action->name, $parentAssetId) : null; $inheritedParentGroupRule = !empty($group->parent_id) ? Access::checkGroup($group->parent_id, $action->name, $assetId) : null; // Current group is a Super User group, so calculated setting is "Allowed (Super User)". if ($isSuperUserGroup) { $result['class'] = 'badge bg-success'; $result['text'] = '<span class="icon-lock icon-white" aria-hidden="true"></span>' . Text::_('JLIB_RULES_ALLOWED_ADMIN'); } else { // First get the real recursive calculated setting and add (Inherited) to it. // If recursive calculated setting is "Denied" or null. Calculated permission is "Not Allowed (Inherited)". if ($inheritedGroupRule === null || $inheritedGroupRule === false) { $result['class'] = 'badge bg-danger'; $result['text'] = Text::_('JLIB_RULES_NOT_ALLOWED_INHERITED'); } else { // If recursive calculated setting is "Allowed". Calculated permission is "Allowed (Inherited)". $result['class'] = 'badge bg-success'; $result['text'] = Text::_('JLIB_RULES_ALLOWED_INHERITED'); } // Second part: Overwrite the calculated permissions labels if there is an explicit permission in the current group. /** * @todo: incorrect info * If a component has a permission that doesn't exists in global config (ex: frontend editing in com_modules) by default * we get "Not Allowed (Inherited)" when we should get "Not Allowed (Default)". */ // If there is an explicit permission "Not Allowed". Calculated permission is "Not Allowed". if ($assetRule === false) { $result['class'] = 'badge bg-danger'; $result['text'] = Text::_('JLIB_RULES_NOT_ALLOWED'); } elseif ($assetRule === true) { // If there is an explicit permission is "Allowed". Calculated permission is "Allowed". $result['class'] = 'badge bg-success'; $result['text'] = Text::_('JLIB_RULES_ALLOWED'); } // Third part: Overwrite the calculated permissions labels for special cases. // Global configuration with "Not Set" permission. Calculated permission is "Not Allowed (Default)". if (empty($group->parent_id) && $isGlobalConfig === true && $assetRule === null) { $result['class'] = 'badge bg-danger'; $result['text'] = Text::_('JLIB_RULES_NOT_ALLOWED_DEFAULT'); } elseif ($inheritedGroupParentAssetRule === false || $inheritedParentGroupRule === false) { /** * Component/Item with explicit "Denied" permission at parent Asset (Category, Component or Global config) configuration. * Or some parent group has an explicit "Denied". * Calculated permission is "Not Allowed (Locked)". */ $result['class'] = 'badge bg-danger'; $result['text'] = '<span class="icon-lock icon-white" aria-hidden="true"></span>' . Text::_('JLIB_RULES_NOT_ALLOWED_LOCKED'); } } ?> <output><span class="<?php echo $result['class']; ?>"><?php echo $result['text']; ?></span></output> </td> </tr> <?php endforeach; ?> </tbody> </table> </joomla-tab-element> <?php endforeach; ?> </joomla-tab> </joomla-field-permissions> PKCA#]h��R��Hsystem/helixultimate/overrides/layouts/joomla/form/field/groupedlist.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $groups Groups of options available for this field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-* */ $html = []; $attr = ''; // Initialize some field attributes. $attr .= !empty($class) ? ' class="form-select ' . $class . '"' : ' class="form-select"'; $attr .= !empty($size) ? ' size="' . $size . '"' : ''; $attr .= $multiple ? ' multiple' : ''; $attr .= $required ? ' required' : ''; $attr .= $autofocus ? ' autofocus' : ''; $attr .= $dataAttribute; // To avoid user's confusion, readonly="true" should imply disabled="true". if ($readonly || $disabled) { $attr .= ' disabled="disabled"'; } // Initialize JavaScript field attributes. $attr .= !empty($onchange) ? ' onchange="' . $onchange . '"' : ''; // Create a read-only list (no name) with a hidden input to store the value. if ($readonly) { $html[] = HTMLHelper::_( 'select.groupedlist', $groups, null, [ 'list.attr' => $attr, 'id' => $id, 'list.select' => $value, 'group.items' => null, 'option.key.toHtml' => false, 'option.text.toHtml' => false, ] ); // E.g. form field type tag sends $this->value as array if ($multiple && \is_array($value)) { if (!\count($value)) { $value[] = ''; } foreach ($value as $val) { $html[] = '<input type="hidden" name="' . $name . '" value="' . htmlspecialchars($val, ENT_COMPAT, 'UTF-8') . '">'; } } else { $html[] = '<input type="hidden" name="' . $name . '" value="' . htmlspecialchars($value, ENT_COMPAT, 'UTF-8') . '">'; } } else { // Create a regular list. $html[] = HTMLHelper::_( 'select.groupedlist', $groups, $name, [ 'list.attr' => $attr, 'id' => $id, 'list.select' => $value, 'group.items' => null, 'option.key.toHtml' => false, 'option.text.toHtml' => false, ] ); } echo implode($html); PKCA#]�l��Hsystem/helixultimate/overrides/layouts/joomla/form/field/moduleorder.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attributes for eg, data-*. */ // Initialize some field attributes. $attributes['dataid'] = 'data-id="' . $id . '"'; $attributes['data-url'] = 'data-url="index.php?option=com_modules&task=module.orderPosition&' . $token . '"'; $attributes['data-element'] = 'data-element="parent_' . $id . '"'; $attributes['data-ordering'] = 'data-ordering="' . $ordering . '"'; $attributes['data-position-element'] = 'data-position-element="' . $element . '"'; $attributes['data-client-id'] = 'data-client-id="' . $clientId . '"'; $attributes['data-name'] = 'data-name="' . $name . '"'; $attributes['data-module-id'] = 'data-module-id="' . $moduleId . '"'; if ($disabled) { $attributes['disabled'] = 'disabled'; } if ($class) { $attributes['class'] = 'class="' . $class . '"'; } if ($size) { $attributes['size'] = 'size="' . $size . '"'; } if ($onchange) { $attributes['onchange'] = 'onchange="' . $onchange . '"'; } if ($dataAttribute) { $attributes['dataAttribute'] = $dataAttribute; } Factory::getDocument()->getWebAssetManager() ->useScript('webcomponent.field-module-order'); ?> <joomla-field-module-order <?php echo implode(' ', $attributes); ?>></joomla-field-module-order> PKCA#]L�2�HHGsystem/helixultimate/overrides/layouts/joomla/form/field/radiobasic.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $options Options available for this field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. */ /** * The format of the input tag to be filled in using sprintf. * %1 - id * %2 - name * %3 - value * %4 = any other attributes */ $format = '<input type="radio" id="%1$s" name="%2$s" value="%3$s" %4$s>'; $alt = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $name); ?> <fieldset id="<?php echo $id; ?>" class="<?php echo trim($class . ' radio'); ?>" <?php echo $disabled ? 'disabled' : ''; ?> <?php echo $required ? 'required' : ''; ?> <?php echo $autofocus ? 'autofocus' : ''; ?> <?php echo $dataAttribute; ?>> <?php if (!empty($options)) : ?> <?php foreach ($options as $i => $option) : ?> <?php // Initialize some option attributes. $checked = ((string) $option->value === $value) ? 'checked="checked"' : ''; $optionClass = !empty($option->class) ? 'class="' . $option->class . '"' : ''; $disabled = !empty($option->disable) || ($disabled && !$checked) ? 'disabled' : ''; // Initialize some JavaScript option attributes. $onclick = !empty($option->onclick) ? 'onclick="' . $option->onclick . '"' : ''; $onchange = !empty($option->onchange) ? 'onchange="' . $option->onchange . '"' : ''; $oid = $id . $i; $ovalue = htmlspecialchars($option->value, ENT_COMPAT, 'UTF-8'); $attributes = array_filter([$checked, $optionClass, $disabled, $onchange, $onclick]); ?> <?php if ($required) : ?> <?php $attributes[] = 'required'; ?> <?php endif; ?> <div class="radio mb-0"> <label for="<?php echo $oid; ?>" <?php echo $optionClass; ?>> <?php echo sprintf($format, $oid, $name, $ovalue, implode(' ', $attributes)); ?> <?php echo Text::alt($option->text, $alt); ?> </label> </div> <?php endforeach; ?> <?php endif; ?> </fieldset> PKCA#]k|V� � @system/helixultimate/overrides/layouts/joomla/form/field/url.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\String\PunycodeHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. */ $attributes = [ !empty($size) ? ' size="' . $size . '"' : '', !empty($description) ? ' aria-describedby="' . ($id ?: $name) . '-desc"' : '', $disabled ? ' disabled' : '', $readonly ? ' readonly' : '', strlen($hint) ? ' placeholder="' . htmlspecialchars($hint, ENT_COMPAT, 'UTF-8') . '"' : '', !empty($autocomplete) ? 'autocomplete="' . $autocomplete . '"' : '', $autofocus ? ' autofocus' : '', $spellcheck ? '' : ' spellcheck="false"', $onchange ? ' onchange="' . $onchange . '"' : '', !empty($maxLength) ? $maxLength : '', $required ? ' required' : '', $dataAttribute, ]; /** * @deprecated 4.3 will be removed in 6.0 * The unicode conversion of the URL will be moved to \Joomla\CMS\Form\Field\UrlField::getLayoutData */ if ($value !== null) { $value = $this->escape(PunycodeHelper::urlToUTF8($value)); } ?> <input <?php echo $inputType; ?> inputmode="url" name="<?php echo $name; ?>" <?php echo !empty($class) ? ' class="form-control ' . $class . '"' : 'class="form-control"'; ?> id="<?php echo $id; ?>" value="<?php echo $value; ?>" <?php echo implode(' ', $attributes); ?>> PKCA#]2��@��Asystem/helixultimate/overrides/layouts/joomla/form/field/list.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $options Options available for this field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-* */ $html = []; $attr = ''; // Initialize the field attributes. $attr .= !empty($class) ? ' class="form-select ' . $class . '"' : ' class="form-select"'; $attr .= !empty($size) ? ' size="' . $size . '"' : ''; $attr .= $multiple ? ' multiple' : ''; $attr .= $required ? ' required' : ''; $attr .= $autofocus ? ' autofocus' : ''; $attr .= $onchange ? ' onchange="' . $onchange . '"' : ''; $attr .= !empty($description) ? ' aria-describedby="' . ($id ?: $name) . '-desc"' : ''; $attr .= $dataAttribute; // To avoid user's confusion, readonly="readonly" should imply disabled="disabled". if ($readonly || $disabled) { $attr .= ' disabled="disabled"'; } // Create a read-only list (no name) with hidden input(s) to store the value(s). if ($readonly) { $html[] = HTMLHelper::_('select.genericlist', $options, '', trim($attr), 'value', 'text', $value, $id); // E.g. form field type tag sends $this->value as array if ($multiple && is_array($value)) { if (!count($value)) { $value[] = ''; } foreach ($value as $val) { $html[] = '<input type="hidden" name="' . $name . '" value="' . htmlspecialchars($val, ENT_COMPAT, 'UTF-8') . '">'; } } else { $html[] = '<input type="hidden" name="' . $name . '" value="' . htmlspecialchars($value, ENT_COMPAT, 'UTF-8') . '">'; } } else // Create a regular list passing the arguments in an array. { $listoptions = []; $listoptions['option.key'] = 'value'; $listoptions['option.text'] = 'text'; $listoptions['list.select'] = $value; $listoptions['id'] = $id; $listoptions['list.translate'] = false; $listoptions['option.attr'] = 'optionattr'; $listoptions['list.attr'] = trim($attr); $html[] = HTMLHelper::_('select.genericlist', $options, $name, $listoptions); } echo implode($html); PKCA#]�m�ȣ�Usystem/helixultimate/overrides/layouts/joomla/form/field/groupedlist-fancy-select.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $groups Groups of options available for this field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-* */ $html = []; $attr = ''; // Initialize some field attributes. $attr .= !empty($size) ? ' size="' . $size . '"' : ''; $attr .= $multiple ? ' multiple' : ''; $attr .= $autofocus ? ' autofocus' : ''; $attr .= $dataAttribute; // To avoid user's confusion, readonly="true" should imply disabled="true". if ($readonly || $disabled) { $attr .= ' disabled="disabled"'; } // Initialize JavaScript field attributes. $attr .= !empty($onchange) ? ' onchange="' . $onchange . '"' : ''; $attr2 = ''; $attr2 .= !empty($class) ? ' class="' . $class . '"' : ''; $attr2 .= ' placeholder="' . $this->escape($hint ?: Text::_('JGLOBAL_TYPE_OR_SELECT_SOME_OPTIONS')) . '" '; if ($required) { $attr .= ' required class="required"'; $attr2 .= ' required'; } // Create a read-only list (no name) with a hidden input to store the value. if ($readonly) { $html[] = HTMLHelper::_( 'select.groupedlist', $groups, null, [ 'list.attr' => $attr, 'id' => $id, 'list.select' => $value, 'group.items' => null, 'option.key.toHtml' => false, 'option.text.toHtml' => false, ] ); // E.g. form field type tag sends $this->value as array if ($multiple && \is_array($value)) { if (!\count($value)) { $value[] = ''; } foreach ($value as $val) { $html[] = '<input type="hidden" name="' . $name . '" value="' . htmlspecialchars($val, ENT_COMPAT, 'UTF-8') . '">'; } } else { $html[] = '<input type="hidden" name="' . $name . '" value="' . htmlspecialchars($value, ENT_COMPAT, 'UTF-8') . '">'; } } else { // Create a regular list. $html[] = HTMLHelper::_( 'select.groupedlist', $groups, $name, [ 'list.attr' => $attr, 'id' => $id, 'list.select' => $value, 'group.items' => null, 'option.key.toHtml' => false, 'option.text.toHtml' => false, ] ); } Text::script('JGLOBAL_SELECT_NO_RESULTS_MATCH'); Text::script('JGLOBAL_SELECT_PRESS_TO_SELECT'); Factory::getApplication()->getDocument()->getWebAssetManager() ->usePreset('choicesjs') ->useScript('webcomponent.field-fancy-select'); ?> <joomla-field-fancy-select <?php echo $attr2; ?>><?php echo implode($html); ?></joomla-field-fancy-select> PKCA#]���Osystem/helixultimate/overrides/layouts/joomla/form/field/subform/repeatable.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Form\Form; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var Form $tmpl The Empty form for template * @var array $forms Array of JForm instances for render the rows * @var bool $multiple The multiple state for the form field * @var int $min Count of minimum repeating in multiple mode * @var int $max Count of maximum repeating in multiple mode * @var string $name Name of the input field. * @var string $fieldname The field name * @var string $fieldId The field ID * @var string $control The forms control * @var string $label The field label * @var string $description The field description * @var string $class Classes for the container * @var array $buttons Array of the buttons that will be rendered * @var bool $groupByFieldset Whether group the subform fields by it`s fieldset */ if ($multiple) { // Add script Factory::getApplication() ->getDocument() ->getWebAssetManager() ->useScript('webcomponent.field-subform'); } $class = $class ? ' ' . $class : ''; $sublayout = empty($groupByFieldset) ? 'section' : 'section-byfieldsets'; ?> <div class="subform-repeatable-wrapper subform-layout"> <joomla-field-subform class="subform-repeatable<?php echo $class; ?>" name="<?php echo $name; ?>" button-add=".group-add" button-remove=".group-remove" button-move="<?php echo empty($buttons['move']) ? '' : '.group-move' ?>" repeatable-element=".subform-repeatable-group" minimum="<?php echo $min; ?>" maximum="<?php echo $max; ?>"> <?php if (!empty($buttons['add'])) : ?> <div class="btn-toolbar"> <div class="btn-group"> <button type="button" class="group-add btn btn-sm button btn-success" aria-label="<?php echo Text::_('JGLOBAL_FIELD_ADD'); ?>"> <span class="icon-plus icon-white" aria-hidden="true"></span> </button> </div> </div> <?php endif; ?> <?php foreach ($forms as $k => $form) : echo $this->sublayout($sublayout, ['form' => $form, 'basegroup' => $fieldname, 'group' => $fieldname . $k, 'buttons' => $buttons]); endforeach; ?> <?php if ($multiple) : ?> <template class="subform-repeatable-template-section hidden"><?php echo trim($this->sublayout($sublayout, ['form' => $tmpl, 'basegroup' => $fieldname, 'group' => $fieldname . 'X', 'buttons' => $buttons])); ?></template> <?php endif; ?> </joomla-field-subform> </div> PKCA#]�ح� Usystem/helixultimate/overrides/layouts/joomla/form/field/subform/repeatable-table.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Form\Form; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var Form $tmpl The Empty form for template * @var array $forms Array of JForm instances for render the rows * @var bool $multiple The multiple state for the form field * @var int $min Count of minimum repeating in multiple mode * @var int $max Count of maximum repeating in multiple mode * @var string $name Name of the input field. * @var string $fieldname The field name * @var string $fieldId The field ID * @var string $control The forms control * @var string $label The field label * @var string $description The field description * @var string $class Classes for the container * @var array $buttons Array of the buttons that will be rendered * @var bool $groupByFieldset Whether group the subform fields by it`s fieldset */ if ($multiple) { // Add script Factory::getApplication() ->getDocument() ->getWebAssetManager() ->useScript('webcomponent.field-subform'); } $class = $class ? ' ' . $class : ''; // Build heading $table_head = ''; if (!empty($groupByFieldset)) { foreach ($tmpl->getFieldsets() as $k => $fieldset) { $table_head .= '<th scope="col">' . Text::_($fieldset->label); if ($fieldset->description) { $table_head .= '<span class="icon-info-circle" aria-hidden="true" tabindex="0"></span><div role="tooltip" id="tip-th-' . $fieldId . '-' . $k . '">' . Text::_($fieldset->description) . '</div>'; } $table_head .= '</th>'; } $sublayout = 'section-byfieldsets'; } else { foreach ($tmpl->getGroup('') as $field) { $table_head .= '<th scope="col" style="width:45%">' . strip_tags($field->label); if ($field->description) { $table_head .= '<span class="icon-info-circle" aria-hidden="true" tabindex="0"></span><div role="tooltip" id="tip-' . $field->id . '">' . Text::_($field->description) . '</div>'; } $table_head .= '</th>'; } $sublayout = 'section'; // Label will not be shown for sections layout, so reset the margin left Factory::getApplication() ->getDocument() ->addStyleDeclaration('.subform-table-sublayout-section .controls { margin-left: 0px }'); } ?> <div class="subform-repeatable-wrapper subform-table-layout subform-table-sublayout-<?php echo $sublayout; ?>"> <joomla-field-subform class="subform-repeatable<?php echo $class; ?>" name="<?php echo $name; ?>" button-add=".group-add" button-remove=".group-remove" button-move="<?php echo empty($buttons['move']) ? '' : '.group-move' ?>" repeatable-element=".subform-repeatable-group" rows-container="tbody.subform-repeatable-container" minimum="<?php echo $min; ?>" maximum="<?php echo $max; ?>"> <div class="table-responsive"> <table class="table" id="subfieldList_<?php echo $fieldId; ?>"> <caption class="visually-hidden"> <?php echo Text::_('JGLOBAL_REPEATABLE_FIELDS_TABLE_CAPTION'); ?> </caption> <thead> <tr> <?php echo $table_head; ?> <?php if (!empty($buttons)) : ?> <td style="width:8%;"> <?php if (!empty($buttons['add'])) : ?> <div class="btn-group"> <button type="button" class="group-add btn btn-sm btn-success" aria-label="<?php echo Text::_('JGLOBAL_FIELD_ADD'); ?>"> <span class="icon-plus" aria-hidden="true"></span> </button> </div> <?php endif; ?> </td> <?php endif; ?> </tr> </thead> <tbody class="subform-repeatable-container"> <?php foreach ($forms as $k => $form) : echo $this->sublayout($sublayout, ['form' => $form, 'basegroup' => $fieldname, 'group' => $fieldname . $k, 'buttons' => $buttons]); endforeach; ?> </tbody> </table> </div> <?php if ($multiple) : ?> <template class="subform-repeatable-template-section hidden"> <?php echo trim($this->sublayout($sublayout, ['form' => $tmpl, 'basegroup' => $fieldname, 'group' => $fieldname . 'X', 'buttons' => $buttons])); ?> </template> <?php endif; ?> </joomla-field-subform> </div> PKCA#]�� K K csystem/helixultimate/overrides/layouts/joomla/form/field/subform/repeatable/section-byfieldsets.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Form\Form; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var Form $form The form instance for render the section * @var string $basegroup The base group name * @var string $group Current group name * @var array $buttons Array of the buttons that will be rendered */ ?> <div class="subform-repeatable-group" data-base-name="<?php echo $basegroup; ?>" data-group="<?php echo $group; ?>"> <?php if (!empty($buttons)) : ?> <div class="btn-toolbar text-end"> <div class="btn-group"> <?php if (!empty($buttons['add'])) : ?><button type="button" class="group-add btn btn-sm btn-success" aria-label="<?php echo Text::_('JGLOBAL_FIELD_ADD'); ?>"><span class="icon-plus icon-white" aria-hidden="true"></span> </button><?php endif; ?> <?php if (!empty($buttons['remove'])) : ?><button type="button" class="group-remove btn btn-sm btn-danger" aria-label="<?php echo Text::_('JGLOBAL_FIELD_REMOVE'); ?>"><span class="icon-minus icon-white" aria-hidden="true"></span> </button><?php endif; ?> <?php if (!empty($buttons['move'])) : ?><button type="button" class="group-move btn btn-sm btn-primary" aria-label="<?php echo Text::_('JGLOBAL_FIELD_MOVE'); ?>"><span class="icon-arrows-alt icon-white" aria-hidden="true"></span> </button><?php endif; ?> </div> </div> <?php endif; ?> <div class="row"> <?php foreach ($form->getFieldsets() as $fieldset) : ?> <fieldset class="<?php if (!empty($fieldset->class)) { echo $fieldset->class; } ?>"> <?php if (!empty($fieldset->label)) : ?> <legend><?php echo Text::_($fieldset->label); ?></legend> <?php endif; ?> <?php foreach ($form->getFieldset($fieldset->name) as $field) : ?> <?php echo $field->renderField(); ?> <?php endforeach; ?> </fieldset> <?php endforeach; ?> </div> </div> PKCA#]�.��iiWsystem/helixultimate/overrides/layouts/joomla/form/field/subform/repeatable/section.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Form\Form; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var Form $form The form instance for render the section * @var string $basegroup The base group name * @var string $group Current group name * @var array $buttons Array of the buttons that will be rendered */ ?> <div class="subform-repeatable-group" data-base-name="<?php echo $basegroup; ?>" data-group="<?php echo $group; ?>"> <?php if (!empty($buttons)) : ?> <div class="btn-toolbar text-end"> <div class="btn-group"> <?php if (!empty($buttons['add'])) : ?><button type="button" class="group-add btn btn-sm btn-success" aria-label="<?php echo Text::_('JGLOBAL_FIELD_ADD'); ?>"><span class="icon-plus icon-white" aria-hidden="true"></span> </button><?php endif; ?> <?php if (!empty($buttons['remove'])) : ?><button type="button" class="group-remove btn btn-sm btn-danger" aria-label="<?php echo Text::_('JGLOBAL_FIELD_REMOVE'); ?>"><span class="icon-minus icon-white" aria-hidden="true"></span> </button><?php endif; ?> <?php if (!empty($buttons['move'])) : ?><button type="button" class="group-move btn btn-sm btn-primary" aria-label="<?php echo Text::_('JGLOBAL_FIELD_MOVE'); ?>"><span class="icon-arrows-alt icon-white" aria-hidden="true"></span> </button><?php endif; ?> </div> </div> <?php endif; ?> <?php foreach ($form->getGroup('') as $field) : ?> <?php echo $field->renderField(); ?> <?php endforeach; ?> </div> PKCA#]��rrLsystem/helixultimate/overrides/layouts/joomla/form/field/subform/default.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Form\Form; extract($displayData); /** * Layout variables * ----------------- * @var Form $tmpl The Empty form for template * @var array $forms Array of JForm instances for render the rows * @var bool $multiple The multiple state for the form field * @var int $min Count of minimum repeating in multiple mode * @var int $max Count of maximum repeating in multiple mode * @var string $name Name of the input field. * @var string $fieldname The field name * @var string $fieldId The field ID * @var string $control The forms control * @var string $label The field label * @var string $description The field description * @var array $buttons Array of the buttons that will be rendered * @var bool $groupByFieldset Whether group the subform fields by it`s fieldset */ $form = $forms[0]; ?> <div class="subform-wrapper"> <?php foreach ($form->getGroup('') as $field) : ?> <?php echo $field->renderField(); ?> <?php endforeach; ?> </div> PKCA#]u�O���isystem/helixultimate/overrides/layouts/joomla/form/field/subform/repeatable-table/section-byfieldsets.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Form\Form; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var Form $form The form instance for render the section * @var string $basegroup The base group name * @var string $group Current group name * @var array $buttons Array of the buttons that will be rendered */ ?> <tr class="subform-repeatable-group" data-base-name="<?php echo $basegroup; ?>" data-group="<?php echo $group; ?>"> <?php foreach ($form->getFieldsets() as $fieldset) : ?> <td class="<?php if (!empty($fieldset->class)) { echo $fieldset->class; } ?>"> <?php foreach ($form->getFieldset($fieldset->name) as $field) : ?> <?php echo $field->renderField(); ?> <?php endforeach; ?> </td> <?php endforeach; ?> <?php if (!empty($buttons)) : ?> <td> <div class="btn-group"> <?php if (!empty($buttons['add'])) : ?> <button type="button" class="group-add btn btn-sm btn-success" aria-label="<?php echo Text::_('JGLOBAL_FIELD_ADD'); ?>"> <span class="icon-plus" aria-hidden="true"></span> </button> <?php endif; ?> <?php if (!empty($buttons['remove'])) : ?> <button type="button" class="group-remove btn btn-sm btn-danger" aria-label="<?php echo Text::_('JGLOBAL_FIELD_REMOVE'); ?>"> <span class="icon-minus" aria-hidden="true"></span> </button> <?php endif; ?> <?php if (!empty($buttons['move'])) : ?> <button type="button" class="group-move btn btn-sm btn-primary" aria-label="<?php echo Text::_('JGLOBAL_FIELD_MOVE'); ?>"> <span class="icon-arrows-alt" aria-hidden="true"></span> </button> <?php endif; ?> </div> </td> <?php endif; ?> </tr> PKCA#]y���11]system/helixultimate/overrides/layouts/joomla/form/field/subform/repeatable-table/section.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Form\Form; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var Form $form The form instance for render the section * @var string $basegroup The base group name * @var string $group Current group name * @var array $buttons Array of the buttons that will be rendered */ ?> <tr class="subform-repeatable-group" data-base-name="<?php echo $basegroup; ?>" data-group="<?php echo $group; ?>"> <?php foreach ($form->getGroup('') as $field) : ?> <td data-column="<?php echo strip_tags($field->label); ?>"> <?php echo $field->renderField(['hiddenLabel' => true, 'hiddenDescription' => true]); ?> </td> <?php endforeach; ?> <?php if (!empty($buttons)) : ?> <td> <div class="btn-group"> <?php if (!empty($buttons['add'])) : ?> <button type="button" class="group-add btn btn-sm btn-success" aria-label="<?php echo Text::_('JGLOBAL_FIELD_ADD'); ?>"> <span class="icon-plus" aria-hidden="true"></span> </button> <?php endif; ?> <?php if (!empty($buttons['remove'])) : ?> <button type="button" class="group-remove btn btn-sm btn-danger" aria-label="<?php echo Text::_('JGLOBAL_FIELD_REMOVE'); ?>"> <span class="icon-minus" aria-hidden="true"></span> </button> <?php endif; ?> <?php if (!empty($buttons['move'])) : ?> <button type="button" class="group-move btn btn-sm btn-primary" aria-label="<?php echo Text::_('JGLOBAL_FIELD_MOVE'); ?>"> <span class="icon-arrows-alt" aria-hidden="true"></span> </button> <?php endif; ?> </div> </td> <?php endif; ?> </tr> PKCA#]�+��ooEsystem/helixultimate/overrides/layouts/joomla/form/field/calendar.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\Utilities\ArrayHelper; extract($displayData); // Get some system objects. $document = Factory::getApplication()->getDocument(); $lang = Factory::getApplication()->getLanguage(); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attributes for eg, data-*. * * Calendar Specific * @var string $helperPath The relative path for the helper file * @var string $minYear The minimum year, that will be subtracted/added to current year * @var string $maxYear The maximum year, that will be subtracted/added to current year * @var integer $todaybutton The today button * @var integer $weeknumbers The week numbers display * @var integer $showtime The time selector display * @var integer $filltable The previous/next month filling * @var integer $timeformat The time format * @var integer $singleheader Display different header row for month/year * @var string $direction The document direction * @var string $calendar The calendar type * @var array $weekend The weekends days * @var integer $firstday The first day of the week * @var string $format The format of date and time */ $inputvalue = ''; // Build the attributes array. $attributes = []; empty($size) ? null : $attributes['size'] = $size; empty($maxlength) ? null : $attributes['maxlength'] = $maxLength; empty($class) ? $attributes['class'] = 'form-control' : $attributes['class'] = 'form-control ' . $class; !$readonly ? null : $attributes['readonly'] = 'readonly'; !$disabled ? null : $attributes['disabled'] = 'disabled'; empty($onchange) ? null : $attributes['onchange'] = $onchange; if ($required) { $attributes['required'] = ''; } // Handle the special case for "now". if (strtoupper($value) === 'NOW') { $value = Factory::getDate()->format('Y-m-d H:i:s'); } $readonly = isset($attributes['readonly']) && $attributes['readonly'] === 'readonly'; $disabled = isset($attributes['disabled']) && $attributes['disabled'] === 'disabled'; if (is_array($attributes)) { $attributes = ArrayHelper::toString($attributes); } $calendarAttrs = [ 'data-inputfield' => $id, 'data-button' => $id . '_btn', 'data-date-format' => $format, 'data-firstday' => empty($firstday) ? '' : $firstday, 'data-weekend' => empty($weekend) ? '' : implode(',', $weekend), 'data-today-btn' => $todaybutton, 'data-week-numbers' => $weeknumbers, 'data-show-time' => $showtime, 'data-show-others' => $filltable, 'data-time24' => $timeformat, 'data-only-months-nav' => $singleheader, 'data-min-year' => $minYear, 'data-max-year' => $maxYear, 'data-date-type' => strtolower($calendar), ]; $calendarAttrsStr = ArrayHelper::toString($calendarAttrs); // Add language strings $strings = [ // Days 'SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', // Short days 'SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', // Months 'JANUARY', 'FEBRUARY', 'MARCH', 'APRIL', 'MAY', 'JUNE', 'JULY', 'AUGUST', 'SEPTEMBER', 'OCTOBER', 'NOVEMBER', 'DECEMBER', // Short months 'JANUARY_SHORT', 'FEBRUARY_SHORT', 'MARCH_SHORT', 'APRIL_SHORT', 'MAY_SHORT', 'JUNE_SHORT', 'JULY_SHORT', 'AUGUST_SHORT', 'SEPTEMBER_SHORT', 'OCTOBER_SHORT', 'NOVEMBER_SHORT', 'DECEMBER_SHORT', // Buttons 'JCLOSE', 'JCLEAR', 'JLIB_HTML_BEHAVIOR_TODAY', // Miscellaneous 'JLIB_HTML_BEHAVIOR_WK', ]; foreach ($strings as $c) { Text::script($c); } // These are new strings. Make sure they exist. Can be generalised at later time: eg in 4.1 version. if ($lang->hasKey('JLIB_HTML_BEHAVIOR_AM')) { Text::script('JLIB_HTML_BEHAVIOR_AM'); } if ($lang->hasKey('JLIB_HTML_BEHAVIOR_PM')) { Text::script('JLIB_HTML_BEHAVIOR_PM'); } // Redefine locale/helper assets to use correct path, and load calendar assets $document->getWebAssetManager() ->registerAndUseScript('field.calendar.helper', $helperPath, [], ['defer' => true]) ->useStyle('field.calendar' . ($direction === 'rtl' ? '-rtl' : '')) ->useScript('field.calendar'); ?> <div class="field-calendar"> <?php if (!$readonly && !$disabled) : ?> <div class="input-group"> <?php endif; ?> <input type="text" id="<?php echo $id; ?>" name="<?php echo $name; ?>" value="<?php echo htmlspecialchars(($value !== '0000-00-00 00:00:00') ? $value : '', ENT_COMPAT, 'UTF-8'); ?>" <?php echo !empty($description) ? ' aria-describedby="' . ($id ?: $name) . '-desc"' : ''; ?> <?php echo $attributes; ?> <?php echo $dataAttribute ?? ''; ?> <?php echo !empty($hint) ? 'placeholder="' . htmlspecialchars($hint, ENT_COMPAT, 'UTF-8') . '"' : ''; ?> data-alt-value="<?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?>" autocomplete="off"> <button type="button" class="<?php echo ($readonly || $disabled) ? 'hidden ' : ''; ?>btn btn-primary" id="<?php echo $id; ?>_btn" title="<?php echo Text::_('JLIB_HTML_BEHAVIOR_OPEN_CALENDAR'); ?>" <?php echo $calendarAttrsStr; ?> ><span class="icon-calendar" aria-hidden="true"></span> <span class="visually-hidden"><?php echo Text::_('JLIB_HTML_BEHAVIOR_OPEN_CALENDAR'); ?></span> </button> <?php if (!$readonly && !$disabled) : ?> </div> <?php endif; ?> </div> PKCA#]hbet��Esystem/helixultimate/overrides/layouts/joomla/form/field/textarea.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. * @var boolean $charcounter Does this field support a character counter? * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. */ // Initialize some field attributes. if ($charcounter) { // Load the js file /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('short-and-sweet'); // Set the css class to be used as the trigger $charcounter = ' charcount'; // Set the text $counterlabel = 'data-counter-label="' . $this->escape(Text::_('JFIELD_META_DESCRIPTION_COUNTER')) . '"'; } $attributes = [ $columns ?: '', $rows ?: '', !empty($class) ? 'class="form-control ' . $class . $charcounter . '"' : 'class="form-control' . $charcounter . '"', !empty($description) ? 'aria-describedby="' . ($id ?: $name) . '-desc"' : '', strlen($hint) ? 'placeholder="' . htmlspecialchars($hint, ENT_COMPAT, 'UTF-8') . '"' : '', $disabled ? 'disabled' : '', $readonly ? 'readonly' : '', $onchange ? 'onchange="' . $onchange . '"' : '', $onclick ? 'onclick="' . $onclick . '"' : '', $required ? 'required' : '', !empty($autocomplete) ? 'autocomplete="' . $autocomplete . '"' : '', $autofocus ? 'autofocus' : '', $spellcheck ? '' : 'spellcheck="false"', $maxlength ?: '', !empty($counterlabel) ? $counterlabel : '', $dataAttribute, ]; ?> <textarea name="<?php echo $name; ?>" id="<?php echo $id; ?>" <?php echo implode(' ', $attributes); ?> ><?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?></textarea> PKCA#]km�pBsystem/helixultimate/overrides/layouts/joomla/form/field/combo.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); use Joomla\CMS\HTML\HTMLHelper; /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $options Options available for this field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. */ HTMLHelper::_('behavior.combobox'); $attr = ''; // Initialize some field attributes. $attr .= !empty($class) ? ' class="awesomplete form-control ' . $class . '"' : ' class="awesomplete form-control"'; $attr .= !empty($size) ? ' size="' . $size . '"' : ''; $attr .= !empty($readonly) ? ' readonly' : ''; $attr .= !empty($disabled) ? ' disabled' : ''; $attr .= !empty($required) ? ' required' : ''; $attr .= !empty($description) ? ' aria-describedby="' . ($id ?: $name) . '-desc"' : ''; // Initialize JavaScript field attributes. $attr .= !empty($onchange) ? ' onchange="' . $onchange . '"' : ''; $val = []; foreach ($options as $option) { $val[] = $option->text; } ?> <input type="text" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?>" <?php echo $attr; ?> data-list="<?php echo implode(', ', $val); ?>" <?php echo $dataAttribute; ?> /> PKCA#]�lˏ � @system/helixultimate/overrides/layouts/joomla/form/field/tel.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. * @var integer $maxLength The maximum length that the field shall accept. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. */ $attributes = [ !empty($size) ? 'size="' . $size . '"' : '', !empty($description) ? 'aria-describedby="' . ($id ?: $name) . '-desc"' : '', $disabled ? 'disabled' : '', $readonly ? 'readonly' : '', strlen($hint) ? 'placeholder="' . htmlspecialchars($hint, ENT_COMPAT, 'UTF-8') . '"' : '', !empty($autocomplete) ? 'autocomplete="' . $autocomplete . '"' : '', $autofocus ? 'autofocus' : '', $spellcheck ? '' : 'spellcheck="false"', $onchange ? 'onchange="' . $onchange . '"' : '', !empty($maxLength) ? $maxLength : '', $required ? 'required' : '', !empty($pattern) ? 'pattern="' . $pattern . '"' : '', $dataAttribute, ]; ?> <input type="tel" inputmode="tel" name="<?php echo $name; ?>" <?php echo !empty($class) ? ' class="form-control ' . $class . '"' : 'class="form-control"'; ?> id="<?php echo $id; ?>" value="<?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?>" <?php echo implode(' ', $attributes); ?>> PKCA#]B�I�ttBsystem/helixultimate/overrides/layouts/joomla/form/field/range.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. */ // Initialize some field attributes. $attributes = [ $class ? 'class="form-range ' . $class . '"' : 'class="form-range"', !empty($description) ? 'aria-describedby="' . ($id ?: $name) . '-desc"' : '', $disabled ? 'disabled' : '', $readonly ? 'readonly' : '', !empty($onchange) ? 'onchange="' . $onchange . '"' : '', !empty($max) ? 'max="' . $max . '"' : '', !empty($step) ? 'step="' . $step . '"' : '', !empty($min) ? 'min="' . $min . '"' : '', $autofocus ? 'autofocus' : '', $dataAttribute, ]; $value = is_numeric($value) ? (float) $value : $min; ?> <input type="range" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?>" <?php echo implode(' ', $attributes); ?>> PKCA#]I����Qsystem/helixultimate/overrides/layouts/joomla/form/field/modal-select/buttons.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-* * @var string $valueTitle * @var array $canDo * @var string[] $urls * @var string[] $modalTitles * @var string[] $buttonIcons */ // Prepare options for each Modal $modalSelect = [ 'popupType' => 'iframe', 'src' => empty($urls['select']) ? '' : Route::_($urls['select'], false), 'textHeader' => $modalTitles['select'] ?? Text::_('JSELECT'), ]; $modalNew = [ 'popupType' => 'iframe', 'src' => empty($urls['new']) ? '' : Route::_($urls['new'], false), 'textHeader' => $modalTitles['new'] ?? Text::_('JACTION_CREATE'), ]; $modalEdit = [ 'popupType' => 'iframe', 'src' => empty($urls['edit']) ? '' : Route::_($urls['edit'], false), 'textHeader' => $modalTitles['edit'] ?? Text::_('JACTION_EDIT'), ]; // Decide when the select button always will be visible $isSelectAlways = !empty($canDo['select']) && empty($canDo['clear']); ?> <?php if ($modalSelect['src'] && $canDo['select'] ?? true) : ?> <button type="button" class="btn btn-primary" <?php echo $value && !$isSelectAlways ? 'hidden' : ''; ?> data-button-action="select" <?php echo !$isSelectAlways ? 'data-show-when-value=""' : ''; ?> data-modal-config="<?php echo $this->escape(json_encode($modalSelect, JSON_UNESCAPED_SLASHES)); ?>"> <span class="<?php echo !empty($buttonIcons['select']) ? $buttonIcons['select'] : 'icon-file'; ?>" aria-hidden="true"></span> <?php echo Text::_('JSELECT'); ?> </button> <?php endif; ?> <?php if ($modalNew['src'] && $canDo['new'] ?? false) : ?> <button type="button" class="btn btn-secondary" <?php echo $value ? 'hidden' : ''; ?> data-button-action="create" data-show-when-value="" data-modal-config="<?php echo $this->escape(json_encode($modalNew, JSON_UNESCAPED_SLASHES)); ?>"> <span class="icon-plus" aria-hidden="true"></span> <?php echo Text::_('JACTION_CREATE'); ?> </button> <?php endif; ?> <?php if ($modalEdit['src'] && $canDo['edit'] ?? false) : ?> <button type="button" class="btn btn-primary" <?php echo $value ? '' : 'hidden'; ?> data-button-action="edit" data-show-when-value="1" data-modal-config="<?php echo $this->escape(json_encode($modalEdit, JSON_UNESCAPED_SLASHES)); ?>" data-checkin-url="<?php echo empty($urls['checkin']) ? '' : Route::_($urls['checkin']); ?>"> <span class="icon-pen-square" aria-hidden="true"></span> <?php echo Text::_('JACTION_EDIT'); ?> </button> <?php endif; ?> <?php if ($canDo['clear'] ?? true) : ?> <button type="button" class="btn btn-secondary" <?php echo $value ? '' : 'hidden'; ?> data-button-action="clear" data-show-when-value="1"> <span class="icon-times" aria-hidden="true"></span> <?php echo Text::_('JCLEAR'); ?> </button> <?php endif; ?> PKCA#]�'���Wsystem/helixultimate/overrides/layouts/joomla/form/field/modal-select/extra-buttons.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; /** * The layout allows to add extra control buttons to the field, example "propagate association" by com_content. * * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-* * @var string $valueTitle * @var array $canDo * @var string[] $urls * @var string[] $modalTitles * @var string[] $buttonIcons */ PKCA#]yTk��Asystem/helixultimate/overrides/layouts/joomla/form/field/time.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; /** * @var array $displayData Array with values. */ extract($displayData); /** * Layout variables * ----------------- * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $accept File types that are accepted. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. */ $attributes = [ !empty($class) ? 'class="form-control ' . $class . '"' : 'class="form-control"', !empty($description) ? 'aria-describedby="' . ($id ?: $name) . '-desc"' : '', $disabled ? 'disabled' : '', $readonly ? 'readonly' : '', strlen($hint) ? 'placeholder="' . htmlspecialchars($hint, ENT_COMPAT, 'UTF-8') . '"' : '', !empty($onchange) ? 'onchange="' . $onchange . '"' : '', isset($max) ? 'max="' . $max . '"' : '', isset($step) ? 'step="' . $step . '"' : '', isset($min) ? 'min="' . $min . '"' : '', $required ? 'required' : '', $autofocus ? 'autofocus' : '', $dataAttribute, ]; ?> <input type="time" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo $value ?>" <?php echo implode(' ', $attributes); ?>> PKCA#]4�i֙�Bsystem/helixultimate/overrides/layouts/joomla/form/field/media.phpnu�[���<?php /** * @package Joomla.Admin * @subpackage Layout * * @copyright (C) 2015 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\Helper\MediaHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; extract($displayData); /** * Layout variables * ----------------- * @var string $asset The asset text * @var string $authorField The label text * @var integer $authorId The author id * @var string $class The class text * @var boolean $disabled True if field is disabled * @var string $folder The folder text * @var string $id The label text * @var string $link The link text * @var string $name The name text * @var string $preview The preview image relative path * @var integer $previewHeight The image preview height * @var integer $previewWidth The image preview width * @var string $onchange The onchange text * @var boolean $readonly True if field is readonly * @var integer $size The size text * @var string $value The value text * @var string $src The path and filename of the image * @var string $mediaTypes The ids of supported media types for the Media Manager * @var array $mediaTypeNames The names of supported media types for the Media Manager * @var array $imagesExt The supported extensions for images * @var array $audiosExt The supported extensions for audios * @var array $videosExt The supported extensions for videos * @var array $documentsExt The supported extensions for documents * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-* */ $attr = ''; // Initialize some field attributes. $attr .= !empty($class) ? ' class="form-control field-media-input ' . $class . '"' : ' class="form-control field-media-input"'; $attr .= !empty($size) ? ' size="' . $size . '"' : ''; $attr .= $dataAttribute; // Initialize JavaScript field attributes. $attr .= !empty($onchange) ? ' onchange="' . $onchange . '"' : ''; switch ($preview) { case 'no': // Deprecated parameter value case 'false': case 'none': $showPreview = false; break; case 'yes': // Deprecated parameter value case 'true': case 'show': case 'tooltip': default: $showPreview = true; break; } // Prefill the contents of the popover if ($showPreview) { $cleanValue = MediaHelper::getCleanMediaFieldValue($value); if ($cleanValue && file_exists(JPATH_ROOT . '/' . $cleanValue)) { $src = Uri::root() . $value; } else { $src = ''; } $width = $previewWidth; $height = $previewHeight; $style = ($width > 0) ? 'max-width:' . $width . 'px;' : ''; $style .= ($height > 0) ? 'max-height:' . $height . 'px;' : ''; $imgattr = [ 'class' => 'media-preview', 'style' => $style, ]; $img = HTMLHelper::_('image', $src, Text::_('JLIB_FORM_MEDIA_PREVIEW_ALT'), $imgattr); $previewImg = '<div class="preview_img">' . $img . '</div>'; $previewImgEmpty = '<div class="preview_empty"' . ($src ? ' class="hidden"' : '') . '>' . Text::_('JLIB_FORM_MEDIA_PREVIEW_EMPTY') . '</div>'; $showPreview = 'static'; } // The url for the modal $url = ''; if (!$readonly) { $url = ($link ?: 'index.php?option=com_media&view=media&tmpl=component&mediatypes=' . $mediaTypes . '&asset=' . $asset . '&author=' . $authorId) . '&path=' . $folder; // Correctly route the url to ensure it's correctly using sef modes and subfolders $url = Route::_($url); } Text::script('JSELECT'); Text::script('JCLOSE'); Text::script('JFIELD_MEDIA_LAZY_LABEL'); Text::script('JFIELD_MEDIA_ALT_LABEL'); Text::script('JFIELD_MEDIA_ALT_CHECK_LABEL'); Text::script('JFIELD_MEDIA_ALT_CHECK_DESC_LABEL'); Text::script('JFIELD_MEDIA_CLASS_LABEL'); Text::script('JFIELD_MEDIA_FIGURE_CLASS_LABEL'); Text::script('JFIELD_MEDIA_FIGURE_CAPTION_LABEL'); Text::script('JFIELD_MEDIA_LAZY_LABEL'); Text::script('JFIELD_MEDIA_SUMMARY_LABEL'); Text::script('JFIELD_MEDIA_EMBED_CHECK_DESC_LABEL'); Text::script('JFIELD_MEDIA_DOWNLOAD_CHECK_DESC_LABEL'); Text::script('JFIELD_MEDIA_DOWNLOAD_CHECK_LABEL'); Text::script('JFIELD_MEDIA_EMBED_CHECK_LABEL'); Text::script('JFIELD_MEDIA_WIDTH_LABEL'); Text::script('JFIELD_MEDIA_TITLE_LABEL'); Text::script('JFIELD_MEDIA_HEIGHT_LABEL'); Text::script('JFIELD_MEDIA_UNSUPPORTED'); Text::script('JFIELD_MEDIA_DOWNLOAD_FILE'); Text::script('JLIB_APPLICATION_ERROR_SERVER'); Text::script('JLIB_FORM_MEDIA_PREVIEW_EMPTY', true); $doc = Factory::getApplication()->getDocument(); $wam = $doc->getWebAssetManager(); $wam->useStyle('webcomponent.field-media') ->useScript('webcomponent.field-media') ->useScript('webcomponent.media-select'); $doc->addScriptOptions('media-picker-api', ['apiBaseUrl' => Uri::base(true) . '/index.php?option=com_media&format=json']); if (!$doc->getScriptOptions('media-picker')) { $doc->addScriptOptions('media-picker', [ 'images' => $imagesExt, 'audios' => $audiosExt, 'videos' => $videosExt, 'documents' => $documentsExt, ]); } ?> <joomla-field-media class="field-media-wrapper" types="<?php echo $this->escape(implode(',', $mediaTypeNames)); ?>" base-path="<?php echo $this->escape(Uri::root()); ?>" root-folder="<?php echo $this->escape(ComponentHelper::getParams('com_media')->get('image_path', 'images')); ?>" url="<?php echo $url; ?>" input=".field-media-input" button-select=".button-select" button-clear=".button-clear" modal-title="<?php echo $this->escape(Text::_('JLIB_FORM_CHANGE_IMAGE')); ?>" preview="static" preview-container=".field-media-preview" preview-width="<?php echo $previewWidth; ?>" preview-height="<?php echo $previewHeight; ?>" supported-extensions="<?php echo $this->escape(json_encode(['images' => $imagesAllowedExt, 'audios' => $audiosAllowedExt, 'videos' => $videosAllowedExt, 'documents' => $documentsAllowedExt])); ?>"> <?php if ($showPreview) : ?> <div class="field-media-preview"> <?php echo ' ' . $previewImgEmpty; ?> <?php echo ' ' . $previewImg; ?> </div> <?php endif; ?> <div class="input-group"> <input type="text" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?>" <?php echo $attr; ?>> <?php if (!$disabled) : ?> <button type="button" class="btn btn-success button-select"><?php echo Text::_('JLIB_FORM_BUTTON_SELECT'); ?></button> <button type="button" class="btn btn-danger button-clear"><span class="icon-times" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('JLIB_FORM_BUTTON_CLEAR'); ?></span></button> <?php endif; ?> </div> </joomla-field-media> PKCA#]��{إ�Asystem/helixultimate/overrides/layouts/joomla/form/field/user.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2015 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; use Joomla\Utilities\ArrayHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var string $userName The user name * @var mixed $groups The filtering groups (null means no filtering) * @var mixed $excluded The users to exclude from the list of users * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-*. */ $uri = new Uri('index.php?option=com_users&view=users&layout=modal&tmpl=component&required=0'); $uri->setVar('field', $this->escape($id)); if ($required) { $uri->setVar('required', 1); } if (!empty($groups)) { $uri->setVar('groups', base64_encode(json_encode($groups))); } if (!empty($excluded)) { $uri->setVar('excluded', base64_encode(json_encode($excluded))); } // Invalidate the input value if no user selected if ($this->escape($userName) === Text::_('JLIB_FORM_SELECT_USER')) { $userName = ''; } $inputAttributes = [ 'type' => 'text', 'id' => $id, 'class' => 'form-control field-user-input-name', 'value' => $this->escape($userName), ]; if ($class) { $inputAttributes['class'] .= ' ' . $class; } if ($size) { $inputAttributes['size'] = (int) $size; } if ($required) { $inputAttributes['required'] = 'required'; } if (!$readonly) { $inputAttributes['placeholder'] = Text::_('JLIB_FORM_SELECT_USER'); } if (!$readonly) { Factory::getApplication()->getDocument()->getWebAssetManager() ->useScript('webcomponent.field-user'); } ?> <?php // Create a dummy text field with the user name. ?> <joomla-field-user class="field-user-wrapper" url="<?php echo (string) $uri; ?>" modal-title="<?php echo $this->escape(Text::_('JLIB_FORM_CHANGE_USER')); ?>" input=".field-user-input" input-name=".field-user-input-name" button-select=".button-select"> <div class="input-group"> <input <?php echo ArrayHelper::toString($inputAttributes), $dataAttribute; ?> readonly> <?php if (!$readonly) : ?> <button type="button" class="btn btn-primary button-select" title="<?php echo Text::_('JLIB_FORM_CHANGE_USER'); ?>"> <span class="icon-user icon-white" aria-hidden="true"></span> <span class="visually-hidden"><?php echo Text::_('JLIB_FORM_CHANGE_USER'); ?></span> </button> <?php endif; ?> </div> <?php // Create the real field, hidden, that stored the user id. ?> <?php if (!$readonly) : ?> <input type="hidden" id="<?php echo $id; ?>_id" name="<?php echo $name; ?>" value="<?php echo $this->escape($value); ?>" class="field-user-input <?php echo $class ? (string) $class : ''?>" data-onchange="<?php echo $this->escape($onchange); ?>"> <?php endif; ?> </joomla-field-user> PKCA#]��5� � Csystem/helixultimate/overrides/layouts/joomla/form/field/hidden.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $checkedOptions Options that will be set as checked. * @var boolean $hasValue Has this field a value assigned? * @var array $options Options available for this field. * @var array $inputType Options available for this field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-* */ // Initialize some field attributes. $class = !empty($class) ? ' class="' . $class . '"' : ''; $disabled = $disabled ? ' disabled' : ''; $onchange = $onchange ? ' onchange="' . $onchange . '"' : ''; ?> <input type="hidden" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?>" <?php echo $class, $disabled, $onchange, $dataAttribute; ?>> PKCA#]�͵n��Rsystem/helixultimate/overrides/layouts/joomla/form/field/media/accessiblemedia.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2020 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); $form = $forms[0]; $formfields = $form->getGroup(''); ?> <div class="subform-wrapper"> <?php foreach ($formfields as $field) : ?> <?php echo $field->renderField(); ?> <?php endforeach; ?> </div> PKCA#]J�Bsystem/helixultimate/overrides/layouts/joomla/form/renderlabel.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2014 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var string $text The label text * @var string $for The id of the input this label is for * @var boolean $required True if a required field * @var array $classes A list of classes */ $classes = array_filter((array) $classes); $id = $for . '-lbl'; if ($required) { $classes[] = 'required'; } ?> <label id="<?php echo $id; ?>" for="<?php echo $for; ?>"<?php if (!empty($classes)) { echo ' class="' . implode(' ', $classes) . '"'; } ?>> <?php echo $text; ?><?php if ($required) : ?><span class="star" aria-hidden="true"> *</span><?php endif; ?> </label> PKCA#]ǬBC��Esystem/helixultimate/overrides/layouts/joomla/installer/changelog.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ use Joomla\CMS\Language\Text; defined('_JEXEC') or die; array_walk( $displayData, function ($items, $changeType) { // If there are no items, continue if (empty($items)) { return; } switch ($changeType) { case 'security': $class = 'bg-danger'; break; case 'fix': $class = 'bg-dark'; break; case 'language': $class = 'bg-primary'; break; case 'addition': $class = 'bg-success'; break; case 'change': $class = 'bg-warning text-dark'; break; case 'remove': $class = 'bg-secondary'; break; default: case 'note': $class = 'bg-info'; break; } ?> <div class="changelog"> <div class="changelog__item"> <div class="changelog__tag"> <span class="badge <?php echo $class; ?>"><?php echo Text::_('COM_INSTALLER_CHANGELOG_' . $changeType); ?></span> </div> <div class="changelog__list"> <ul> <li><?php echo implode('</li><li>', $items); ?></li> </ul> </div> </div> </div> <?php } ); PKCA#]�����Asystem/helixultimate/overrides/layouts/joomla/quickicons/icon.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; $id = empty($displayData['id']) ? '' : (' id="' . $displayData['id'] . '"'); $target = empty($displayData['target']) ? '' : (' target="' . $displayData['target'] . '"'); $onclick = empty($displayData['onclick']) ? '' : (' onclick="' . $displayData['onclick'] . '"'); if (isset($displayData['ajaxurl'])) { $dataUrl = 'data-url="' . $displayData['ajaxurl'] . '"'; } else { $dataUrl = ''; } // The title for the link (a11y) $title = empty($displayData['title']) ? '' : (' title="' . $this->escape($displayData['title']) . '"'); // The information $text = empty($displayData['text']) ? '' : ('<span class="j-links-link">' . $displayData['text'] . '</span>'); // Make the class string $class = empty($displayData['class']) ? '' : (' class="' . $this->escape($displayData['class']) . '"'); ?> <?php // If it is a button with two links: make it a list if (isset($displayData['linkadd'])) : ?> <li class="quickicon-group"> <ul class="list-unstyled d-flex w-100"> <li class="quickicon"> <?php else : ?> <li class="quickicon quickicon-single"> <?php endif; ?> <a <?php echo $id . $class; ?> href="<?php echo $displayData['link']; ?>"<?php echo $target . $onclick . $title; ?>> <div class="quickicon-info"> <?php if (isset($displayData['image'])) : ?> <div class="quickicon-icon"> <div class="<?php echo $displayData['image']; ?>" aria-hidden="true"></div> </div> <?php endif; ?> <?php if (isset($displayData['ajaxurl'])) : ?> <div class="quickicon-amount" <?php echo $dataUrl ?> aria-hidden="true"> <span class="icon-spinner" aria-hidden="true"></span> </div> <div class="quickicon-sr-desc visually-hidden"></div> <?php endif; ?> </div> <?php // Name indicates the component if (isset($displayData['name'])) : ?> <div class="quickicon-name d-flex align-items-end" <?php echo isset($displayData['ajaxurl']) ? ' aria-hidden="true"' : ''; ?>> <?php echo Text::_($displayData['name']); ?> </div> <?php endif; ?> <?php // Information or action from plugins if (isset($displayData['text'])) : ?> <div class="quickicon-name d-flex align-items-center"> <?php echo $text; ?> </div> <?php endif; ?> </a> </li> <?php // Add the link to the edit-form if (isset($displayData['linkadd'])) : ?> <li class="quickicon-linkadd j-links-link d-flex"> <a class="d-flex" href="<?php echo $displayData['linkadd']; ?>" title="<?php echo Text::_($displayData['name'] . '_ADD'); ?>"> <span class="icon-plus" aria-hidden="true"></span> </a> </li> </ul> </li> <?php endif; ?> PKCA#][`ƈ� � Hsystem/helixultimate/overrides/layouts/joomla/editors/buttons/button.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2014 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; /** @var \Joomla\CMS\Editor\Button\Button $button */ $button = $displayData; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $btnAsset = 'editor-button.' . $button->getButtonName(); // Enable the button assets if any if ($wa->assetExists('style', $btnAsset)) { $wa->useStyle($btnAsset); } if ($wa->assetExists('script', $btnAsset)) { $wa->useScript($btnAsset); } $class = 'btn btn-secondary'; $class .= $button->get('class') ? ' ' . $button->get('class') : null; $class .= $button->get('modal') ? ' modal-button' : null; $href = '#' . $button->get('editor') . '_' . strtolower($button->get('name', '')) . '_modal'; $link = $button->get('link'); $onclick = $button->get('onclick') ? ' onclick="' . $button->get('onclick') . '"' : ''; $title = $button->get('title') ? $button->get('title') : $button->get('text', ''); $icon = $button->get('icon'); $action = $button->get('action', ''); $options = (array) $button->get('options'); // Correct the link, check for legacy with & in it, and prepend a base Uri if ($link && $link[0] !== '#') { $link = str_contains($link, '&') ? htmlspecialchars_decode($link) : $link; $link = Uri::base(true) . '/' . $link; $options['src'] = $options['src'] ?? $link; } // Detect a legacy BS modal, and set action to "modal" for legacy buttons, when possible $legacyModal = $button->get('modal'); // Prepare default values for modal if ($action === 'modal') { $wa->useScript('joomla.dialog'); $legacyModal = false; $options['popupType'] = $options['popupType'] ?? 'iframe'; $options['textHeader'] = $options['textHeader'] ?? $title; $options['iconHeader'] = $options['iconHeader'] ?? 'icon-' . $icon; } $optStr = $options && $action ? json_encode($options, JSON_UNESCAPED_SLASHES) : ''; ?> <button type="button" data-joomla-editor-button-action="<?php echo $this->escape($action); ?>" data-joomla-editor-button-options="<?php echo $this->escape($optStr); ?>" class="xtd-button btn btn-secondary <?php echo $class; ?>" title="<?php echo $this->escape($title); ?>" <?php echo $onclick; ?> <?php echo $legacyModal ? 'data-bs-toggle="modal" data-bs-target="' . $href . '"' : '' ?>> <?php if ($icon) : ?> <span class="icon-<?php echo $icon; ?>" aria-hidden="true"></span> <?php endif; ?> <?php echo $button->get('text'); ?> </button> PKCA#]%� R��Gsystem/helixultimate/overrides/layouts/joomla/editors/buttons/modal.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; /** @var \Joomla\CMS\Editor\Button\Button $button */ $button = $displayData; if (!$button->get('modal')) { return; } $class = ($button->get('class')) ? $button->get('class') : null; $class .= ($button->get('modal')) ? ' modal-button' : null; $href = '#' . $button->get('editor') . '_' . strtolower($button->get('name')) . '_modal'; $link = ($button->get('link')) ? Uri::base() . $button->get('link') : null; $onclick = ($button->get('onclick')) ? ' onclick="' . $button->get('onclick') . '"' : ''; $title = ($button->get('title')) ? $button->get('title') : $button->get('text'); $options = $button->getOptions(); $confirm = ''; if (is_array($button->get('options')) && isset($options['confirmText']) && isset($options['confirmCallback'])) { $confirm = '<button type="button" class="btn btn-success" data-bs-dismiss="modal" onclick="' . $options['confirmCallback'] . '">' . $options['confirmText'] . ' </button>'; } if (null !== $button->get('id')) { $id = str_replace(' ', '', $button->get('id')); } else { $id = $button->get('editor') . '_' . strtolower($button->get('name')) . '_modal'; } // @todo: J4: Move Make buttons fullscreen on smaller devices per https://github.com/joomla/joomla-cms/pull/23091 // Create the modal echo HTMLHelper::_( 'bootstrap.renderModal', $id, [ 'url' => $link, 'title' => $title, 'height' => array_key_exists('height', $options) ? $options['height'] : '400px', 'width' => array_key_exists('width', $options) ? $options['width'] : '800px', 'bodyHeight' => array_key_exists('bodyHeight', $options) ? $options['bodyHeight'] : '70', 'modalWidth' => array_key_exists('modalWidth', $options) ? $options['modalWidth'] : '80', 'footer' => $confirm . '<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">' . Text::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>' ] ); PKCA#]�[Na))Asystem/helixultimate/overrides/layouts/joomla/editors/buttons.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2014 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; $buttons = $displayData; ?> <div class="editor-xtd-buttons" role="toolbar" aria-label="<?php echo Text::_('JTOOLBAR'); ?>"> <?php if ($buttons) : ?> <?php foreach ($buttons as $button) : $options = (array) $button->get('options'); $legacyModal = $button->get('modal'); ?> <?php echo $this->sublayout('button', $button); ?> <?php echo $legacyModal ? $this->sublayout('modal', $button) : ''; ?> <?php endforeach; ?> <?php endif; ?> </div> PKCA#]5_7<ii?system/helixultimate/overrides/layouts/joomla/toolbar/batch.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; // @todo: Deprecate this file since we can use popup button to raise batch modal. /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = \Joomla\CMS\Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('core'); $id = $displayData['id'] ?? ''; $title = $displayData['title']; Text::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'); Text::script('ERROR'); $message = "{'error': [Joomla.Text._('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST')]}"; $alert = "Joomla.renderMessages(" . $message . ")"; ?> <button<?php echo $id; ?> type="button" onclick="if (document.adminForm.boxchecked.value==0){<?php echo $alert; ?>}else{document.getElementById('collapseModal').open(); return true;}" class="btn btn-primary"> <span class="icon-square" aria-hidden="true"></span> <?php echo $title; ?> </button> PKCA#]�)QD��Gsystem/helixultimate/overrides/layouts/joomla/toolbar/containeropen.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->registerAndUseScript('joomla.toolbar', 'legacy/toolbar.min.js', [], ['defer' => true], ['core']); ?> <nav aria-label="<?php echo Text::_('JTOOLBAR'); ?>"> <div class="btn-toolbar d-flex" role="toolbar" id="<?php echo $displayData['id']; ?>"> PKCA#]\U� Bsystem/helixultimate/overrides/layouts/joomla/toolbar/dropdown.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; extract($displayData, EXTR_OVERWRITE); /** * Layout variables * ----------------- * @var string $id * @var string $onclick * @var string $class * @var string $text * @var string $btnClass * @var string $tagName * @var string $htmlAttributes * @var string $hasButtons * @var string $button * @var string $dropdownItems * @var string $caretClass * @var string $toggleSplit */ $direction = Factory::getLanguage()->isRtl() ? 'dropdown-menu-end' : ''; /** * The dropdown class is also injected on the button from \Joomla\CMS\Toolbar\ToolbarButton::prepareOptions() and therefore we need the dropdown script whether we * are in split toggle mode or not */ /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('bootstrap.dropdown'); ?> <?php if ($hasButtons && trim($button) !== '') : ?> <?php // If there is a toggle split then render the items. Else render the parent button which has the items in the custom element. ?> <?php if ($toggleSplit ?? true) : ?> <div id="<?php echo $id; ?>" class="btn-group dropdown-<?php echo $name ?? ''; ?>" role="group"> <button type="button" class="<?php echo $caretClass ?? ''; ?> dropdown-toggle-split" data-bs-toggle="dropdown" data-bs-target=".dropdown-menu" data-bs-display="static" aria-haspopup="true" aria-expanded="false"> <span class="visually-hidden"><?php echo Text::_('JGLOBAL_TOGGLE_DROPDOWN'); ?></span> <span class="icon-chevron-down" aria-hidden="true"></span> </button> <?php echo $button; ?> <?php if (trim($dropdownItems) !== '') : ?> <div class="dropdown-menu <?php echo $direction; ?>"> <?php echo $dropdownItems; ?> </div> <?php endif; ?> </div> <?php else : ?> <?php echo $button; ?> <?php endif; ?> <?php endif; ?> PKCA#]��'���Bsystem/helixultimate/overrides/layouts/joomla/toolbar/versions.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Session\Session; extract($displayData); /** * Layout variables * ----------------- * @var string $id * @var string $itemId * @var string $typeId * @var string $typeAlias * @var string $title */ /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('core') ->useScript('joomla.dialog-autocreate') ->useScript('webcomponent.toolbar-button'); $url = 'index.php?' . http_build_query([ 'option' => 'com_contenthistory', 'view' => 'history', 'layout' => 'modal', 'tmpl' => 'component', 'item_id' => $itemId, Session::getFormToken() => 1, ]); $dialogOptions = [ 'popupType' => 'iframe', 'src' => $url, 'textHeader' => $title ?? '', ]; ?> <joomla-toolbar-button id="toolbar-versions"> <button class="btn btn-primary" data-joomla-dialog="<?php echo $this->escape(json_encode($dialogOptions)); ?>" type="button"> <span class="icon-code-branch" aria-hidden="true"></span> <?php echo $title; ?> </button> </joomla-toolbar-button> PKCA#]l�jGee?system/helixultimate/overrides/layouts/joomla/toolbar/apply.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; HTMLHelper::_('behavior.core'); if (preg_match('/Joomla.submitbutton/', $displayData['doTask'])) { $ctrls = str_replace("Joomla.submitbutton('", '', $displayData['doTask']); $ctrls = str_replace("')", '', $ctrls); $ctrls = str_replace(";", '', $ctrls); $options = array('task' => $ctrls); Factory::getDocument()->addScriptOptions('keySave', $options); } $id = isset($displayData['id']) ? $displayData['id'] : ''; $doTask = isset($displayData['onclick']) ? $displayData['onclick'] : $displayData['doTask']; $class = $displayData['class']; $text = $displayData['text']; $btnClass = $displayData['btnClass']; ?> <button id="<?php echo $id; ?>" onclick="<?php echo $doTask; ?>" class="<?php echo $btnClass; ?>"> <span class="<?php echo trim($class); ?>"></span> <?php echo $text; ?> </button> PKCA#]��GG?system/helixultimate/overrides/layouts/joomla/toolbar/title.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Layout\LayoutHelper; // Strip extension if given $icon = empty($displayData['icon']) ? 'dot-circle' : preg_replace('#\.[^ .]*$#', '', $displayData['icon']); ?> <h1 class="page-title"> <?php echo LayoutHelper::render('joomla.icon.iconclass', ['icon' => $icon]); ?> <?php echo $displayData['title']; ?> </h1> PKCA#]"���Asystem/helixultimate/overrides/layouts/joomla/toolbar/confirm.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\HTML\HTMLHelper; HTMLHelper::_('behavior.core'); $id = isset($displayData['id']) ? $displayData['id'] : ''; $doTask = isset($displayData['onclick']) ? $displayData['onclick'] : $displayData['doTask']; $class = $displayData['class']; $text = $displayData['text']; ?> <button id="<?php echo $id; ?>" onclick="<?php echo $doTask; ?>" class="btn btn-sm btn-outline-danger"> <span class="<?php echo $class; ?>" aria-hidden="true"></span> <?php echo $text; ?> </button> PKCA#]�)���>system/helixultimate/overrides/layouts/joomla/toolbar/help.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\HTML\HTMLHelper; HTMLHelper::_('behavior.core'); $id = isset($displayData['id']) ? $displayData['id'] : ''; $doTask = isset($displayData['onclick']) ? $displayData['onclick'] : $displayData['doTask']; $text = $displayData['text']; ?> <button id="<?php echo $id; ?>" onclick="<?php echo $doTask; ?>" rel="help" class="btn btn-outline-info btn-sm"> <span class="icon-question-sign" aria-hidden="true"></span> <?php echo $text; ?> </button> PKCA#]�Q; ; Bsystem/helixultimate/overrides/layouts/joomla/toolbar/standard.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; extract($displayData, EXTR_OVERWRITE); /** * Layout variables * ----------------- * @var string $id * @var string $onclick * @var string $class * @var string $text * @var string $btnClass * @var string $tagName * @var string $htmlAttributes * @var string $task The task which should be executed * @var bool $listCheck Boolean, whether selection from a list is needed * @var string $form CSS selector for a target form * @var bool $formValidation Whether the form need to be validated before run the task * @var string $message Confirmation message before run the task */ Factory::getApplication()->getDocument()->getWebAssetManager() ->useScript('core') ->useScript('webcomponent.toolbar-button'); $tagName = $tagName ?? 'button'; $taskAttr = ''; $idAttr = !empty($id) ? ' id="' . $id . '"' : ''; $listAttr = !empty($listCheck) ? ' list-selection' : ''; $formAttr = !empty($form) ? ' form="' . $this->escape($form) . '"' : ''; $validate = !empty($formValidation) ? ' form-validation' : ''; $msgAttr = !empty($message) ? ' confirm-message="' . $this->escape($message) . '"' : ''; if ($msgAttr) { Text::script('WARNING'); Text::script('JYES'); Text::script('JNO'); } if (!empty($task)) { $taskAttr = ' task="' . $task . '"'; } elseif (!empty($onclick)) { $htmlAttributes .= ' onclick="' . $onclick . '"'; } ?> <joomla-toolbar-button <?php echo $idAttr . $taskAttr . $listAttr . $formAttr . $validate . $msgAttr; ?>> <?php if (!empty($group)) : ?> <a href="#" class="dropdown-item"> <span class="<?php echo trim($class ?? ''); ?>"></span> <?php echo $text ?? ''; ?> </a> <?php else : ?> <<?php echo $tagName; ?> class="<?php echo $btnClass ?? ''; ?>" <?php echo $htmlAttributes ?? ''; ?> > <span class="<?php echo trim($class ?? ''); ?>" aria-hidden="true"></span> <?php echo $text ?? ''; ?> </<?php echo $tagName; ?>> <?php endif; ?> </joomla-toolbar-button> PKCA#]��� � ?system/helixultimate/overrides/layouts/joomla/toolbar/basic.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; extract($displayData, EXTR_OVERWRITE); /** * Layout variables * ----------------- * @var int $id * @var string $onclick * @var string $class * @var string $text * @var string $btnClass * @var string $tagName * @var string $htmlAttributes * @var string $task The task which should be executed * @var bool $listCheck Boolean, whether selection from a list is needed * @var string $form CSS selector for a target form * @var bool $formValidation Whether the form need to be validated before run the task * @var string $dropdownItems The dropdown HTML * @var string $hasButtons * @var string $caretClass * @var string $toggleSplit */ Factory::getApplication()->getDocument()->getWebAssetManager() ->useScript('core') ->useScript('webcomponent.toolbar-button'); $tagName = $tagName ?? 'button'; $taskAttr = ''; $title = ''; $idAttr = !empty($id) ? ' id="' . $id . '"' : ''; $listAttr = !empty($listCheck) ? ' list-selection' : ''; $formAttr = !empty($form) ? ' form="' . $this->escape($form) . '"' : ''; $validate = !empty($formValidation) ? ' form-validation' : ''; $msgAttr = !empty($message) ? ' confirm-message="' . $this->escape($message) . '"' : ''; if ($msgAttr) { Text::script('WARNING'); Text::script('JYES'); Text::script('JNO'); } if ($id === 'toolbar-help') { $title = ' title="' . $this->escape(Text::_('JGLOBAL_OPENS_IN_A_NEW_WINDOW')) . '"'; } if (!empty($task)) { $taskAttr = ' task="' . $task . '"'; } elseif (!empty($onclick)) { $htmlAttributes .= ' onclick="' . $onclick . '"'; } $direction = Factory::getLanguage()->isRtl() ? 'dropdown-menu-end' : ''; ?> <joomla-toolbar-button <?php echo $idAttr . $taskAttr . $listAttr . $formAttr . $validate . $msgAttr; ?>> <<?php echo $tagName; ?> class="<?php echo $btnClass ?? ''; ?>" <?php echo $htmlAttributes ?? ''; ?> <?php echo $title; ?> > <span class="<?php echo trim($class ?? ''); ?>" aria-hidden="true"></span> <?php echo $text ?? ''; ?> </<?php echo $tagName; ?>> <?php // If there is no toggle split then ensure the drop down items are rendered inside the custom element ?> <?php if (!($toggleSplit ?? true) && isset($dropdownItems) && trim($dropdownItems) !== '') : ?> <div class="dropdown-menu<?php echo ' ' . $direction; ?>"> <?php echo $dropdownItems; ?> </div> <?php endif; ?> </joomla-toolbar-button> PKCA#]gr/��Dsystem/helixultimate/overrides/layouts/joomla/toolbar/inlinehelp.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Layout\LayoutHelper; Factory::getApplication()->getDocument() ->getWebAssetManager()->useScript('inlinehelp'); echo LayoutHelper::render('joomla.toolbar.standard', $displayData); PKCA#]��$��>system/helixultimate/overrides/layouts/joomla/toolbar/base.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData, EXTR_OVERWRITE); /** * Layout variables * ----------------- * @var string $action * @var array $options */ echo $action; PKCA#]�H@bbCsystem/helixultimate/overrides/layouts/joomla/toolbar/separator.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData, EXTR_OVERWRITE); /** * Layout variables * ----------------- * @var bool $is_child * @var string $id * @var string $doTask * @var string $class * @var string $text * @var string $btnClass * @var string $tagName * @var string $htmlAttributes */ ?> <?php if ($is_child) : ?> <?php if (!empty($text)) : ?> <h6 class="dropdown-header <?php echo $btnClass ?? ''; ?>"> <?php echo $text; ?> </h6> <?php else : ?> <div class="dropdown-divider <?php echo $btnClass ?? ''; ?>"></div> <?php endif; ?> <?php endif; ?> PKCA#]�*�ۂ�Csystem/helixultimate/overrides/layouts/joomla/toolbar/iconclass.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Layout\LayoutHelper; $displayData['html'] = false; echo LayoutHelper::render('joomla.icon.iconclass', $displayData); PKCA#]˝_�,,>system/helixultimate/overrides/layouts/joomla/toolbar/link.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData, EXTR_OVERWRITE); /** * Layout variables * ----------------- * @var int $id * @var string $name * @var string $class * @var string $text * @var string $btnClass * @var string $tagName * @var string $htmlAttributes */ $margin = (strpos($url ?? '', 'index.php?option=com_config') === false) ? '' : 'ms-auto'; $target = empty($target) ? '' : 'target="' . $target . '"'; ?> <joomla-toolbar-button class="<?php echo $margin; ?>"> <a id="<?php echo $id; ?>" class="<?php echo $btnClass; ?>" href="<?php echo $url; ?>" <?php echo $target; ?> <?php echo $htmlAttributes; ?>> <span class="<?php echo $class; ?> icon-fw" aria-hidden="true"></span> <?php echo $text ?: ''; ?> </a> </joomla-toolbar-button> PKCA#]�_�Jsystem/helixultimate/overrides/layouts/joomla/toolbar/group/groupclose.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; ?> </div> </div> PKCA#]`�<<Isystem/helixultimate/overrides/layouts/joomla/toolbar/group/groupopen.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $btnClass = $displayData['class']; ?> <div class="btn-group"> PKCA#]',dHsystem/helixultimate/overrides/layouts/joomla/toolbar/group/groupmid.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $btnClass = $displayData['class']; ?> <button type="button" class="btn btn-sm <?php echo $btnClass; ?> dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" data-bs-auto-close="true" aria-haspopup="true" aria-expanded="false"></button> <div class="dropdown-menu"> PKCA#]�y�i��@system/helixultimate/overrides/layouts/joomla/toolbar/slider.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\HTML\HTMLHelper; HTMLHelper::_('behavior.core'); $id = isset($displayData['id']) ? $displayData['id'] : ''; $doTask = isset($displayData['onclick']) ? $displayData['onclick'] : $displayData['doTask']; $class = $displayData['class']; $text = $displayData['text']; $name = $displayData['name']; $onClose = $displayData['onClose']; ?> <button id="<?php echo $id; ?>" onclick="<?php echo $doTask; ?>" class="btn btn-sm btn-secondary" data-bs-toggle="collapse" data-bs-target="#collapse-<?php echo $name; ?>"<?php echo $onClose; ?>> <span class="icon-cog" aria-hidden="true"></span> <?php echo $text; ?> </button> PKCA#]�vF��?system/helixultimate/overrides/layouts/joomla/toolbar/popup.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\Utilities\ArrayHelper; extract($displayData); /** * Layout variables * ----------------- * @var int $id * @var string $name * @var string $doTask * @var string $class * @var string $text * @var string $btnClass * @var string $tagName * @var bool $listCheck * @var string $htmlAttributes * @var string $modalWidth * @var string $modalHeight * @var string $popupType * @var string $url * @var string $textHeader */ /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ Factory::getApplication()->getDocument()->getWebAssetManager() ->useScript('core') ->useScript('joomla.dialog-autocreate') ->useScript('webcomponent.toolbar-button'); $tagName = $tagName ?? 'button'; $modalAttrs = []; // Check for use of Joomla Dialog, otherwise fallback to BS Modal if (!empty($popupType)) { $popupOptions = [ 'popupType' => $popupType, 'src' => $url, 'textHeader' => $textHeader ?? '', 'width' => $modalWidth ?? null, 'height' => $modalHeight ?? null, ]; $modalAttrs['data-joomla-dialog'] = $this->escape(json_encode($popupOptions)); } else { // @TODO: Remove this fallback in Joomla 6. Deprecation already triggered in PopupButton class. $modalAttrs['data-bs-toggle'] = 'modal'; $modalAttrs['data-bs-target'] = '#' . $selector; } $idAttr = !empty($id) ? ' id="' . $id . '"' : ''; $listAttr = !empty($listCheck) ? ' list-selection' : ''; ?> <joomla-toolbar-button <?php echo $idAttr . $listAttr; ?>> <<?php echo $tagName; ?> value="<?php echo $doTask; ?>" class="<?php echo $btnClass; ?>" <?php echo $htmlAttributes; ?> <?php echo ArrayHelper::toString($modalAttrs); ?> > <span class="<?php echo $class; ?>" aria-hidden="true"></span> <?php echo $text; ?> </<?php echo $tagName; ?>> </joomla-toolbar-button> PKCA#]���?system/helixultimate/overrides/layouts/joomla/toolbar/modal.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $selector = $displayData['selector']; $id = isset($displayData['id']) ? $displayData['id'] : ''; $class = isset($displayData['class']) ? $displayData['class'] : 'btn btn-secondary btn-sm'; $icon = isset($displayData['icon']) ? $displayData['icon'] : 'fas fa-download'; $text = isset($displayData['text']) ? $displayData['text'] : ''; // Render the modal echo HTMLHelper::_('bootstrap.renderModal', 'modal_'. $selector, array( 'url' => $displayData['doTask'], 'title' => $text, 'height' => '100%', 'width' => '100%', 'modalWidth' => 80, 'bodyHeight' => 60, 'closeButton' => true, 'footer' => '<a class="btn btn-secondary" data-bs-dismiss="modal" type="button"' . ' onclick="window.parent.jQuery(\'#modal_downloadModal\').modal(\'hide\');">' . Text::_("COM_BANNERS_CANCEL") . '</a>' . '<button class="btn btn-success" type="button"' . ' onclick="jQuery(\'#modal_downloadModal iframe\').contents().find(\'#exportBtn\').click();">' . Text::_("COM_BANNERS_TRACKS_EXPORT") . '</button>', ) ); ?> <button id="<?php echo $id; ?>" onclick="jQuery('#modal_<?php echo $selector; ?>').modal('show')" class="<?php echo $class; ?>" data-bs-toggle="modal" title="<?php echo $text; ?>"> <span class="icon-<?php echo $icon; ?>" aria-hidden="true"></span><?php echo $text; ?> </button> PKCA#]�s� Hsystem/helixultimate/overrides/layouts/joomla/toolbar/containerclose.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; ?> </div> </nav> PKCA#]�)#�,�,5system/helixultimate/overrides/layouts/comingsoon.phpnu�[���<?php /** * @package Helix_Ultimate_Framework * @author JoomShaper <support@joomshaper.com> * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later */ defined('_JEXEC') or die('Restricted access'); use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; use HelixUltimate\Framework\Core\HelixUltimate; use Joomla\CMS\Helper\AuthenticationHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Router\Route; extract($displayData); // Initialize $app = Factory::getApplication(); $doc = Factory::getDocument(); $isOffline = $app->get('offline'); $site_title = $site_title ?? $app->get('sitename'); $comingsoonEnabled = (int) $params->get('comingsoon', 0) === 1; $twofactormethods = []; if (version_compare(JVERSION, '4.2.0', '<')) { $twofactormethods = AuthenticationHelper::getTwoFactorMethods(); } /** * Load the bootstrap file for enabling the HelixUltimate\Framework namespacing. * * @since 2.0.0 */ $bootstrap_path = JPATH_PLUGINS . '/system/helixultimate/bootstrap.php'; if (file_exists($bootstrap_path)) { require_once $bootstrap_path; } else { die('Install and activate <a target="_blank" rel="noopener noreferrer" href="https://www.joomshaper.com/helix">Helix Ultimate Framework</a>.'); } $theme = new HelixUltimate; $custom_style = $params->get('custom_style'); $preset = ($custom_style) ? 'default' : json_decode($params->get('preset', '{"preset":"preset1"}'))->preset; ?> <!doctype html> <html class="coming-soon" lang="<?php echo $language; ?>" dir="<?php echo $direction; ?>"> <head> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <?php $theme->head(); $theme->add_js('jquery.countdown.min.js'); $theme->add_js('custom.js'); $theme->add_css('font-awesome.min.css'); $theme->add_css('template.css'); $theme->add_css('presets/' . $preset . '.css'); $theme->add_css('custom.css'); //Custom CSS if ($custom_css = $params->get('custom_css')) { $doc->addStyledeclaration($custom_css); } //Custom JS if ($custom_js = $params->get('custom_js')) { $doc->addScriptdeclaration($custom_js); } ?> </head> <body class="<?php echo $isOffline ? 'offline-mode' : ($comingsoonEnabled ? 'coming-soon-mode' : ''); ?>"> <div class="container"> <jdoc:include type="message" /> <?php if ($isOffline) : ?> <!-- OFFLINE CONTENT --> <?php if ($app->get('offline_image')) : ?> <style> body { background-image: url('<?php echo Uri::base(true) . '/' . ltrim($app->get('offline_image'), '/'); ?>'); background-size: cover; background-position: center !important; } </style> <?php endif; ?> <?php if ($app->get('display_offline_message', 0) == 1 && str_replace(' ', '', $app->get('offline_message')) != '') : ?> <div class="offline-message"> <?php echo $app->get('offline_message'); ?> </div> <?php elseif ($app->get('display_offline_message', 0) == 2) : ?> <div class="offline-message"> <?php echo Text::_('JOFFLINE_MESSAGE'); ?> </div> <?php endif; ?> <?php if (isset($login) && $login) : ?> <?php echo $login_form; ?> <?php endif; ?> <?php endif; ?> <?php if (!$isOffline && $comingsoonEnabled) : ?> <!-- COMING SOON CONTENT --> <?php if ($params->get('comingsoon_logo')) : ?> <img class="coming-soon-logo" src="<?php echo $params->get('comingsoon_logo'); ?>" alt="<?php echo htmlspecialchars($site_title ?? ''); ?>"> <?php endif; ?> <?php if ($params->get('comingsoon_bg_image')) : ?> <style> body { background-image: url('<?php echo Uri::base(true) . '/' . ltrim($params->get('comingsoon_bg_image'), '/'); ?>'); background-size: cover; background-position: center !important; } </style> <?php endif; ?> <?php if ($params->get('comingsoon_title_status',0)) : ?> <h1 class="coming-soon-title"> <?php echo htmlspecialchars($params->get('comingsoon_title', $site_title)); ?> </h1> <?php endif; ?> <?php if ($params->get('comingsoon_content_status',0) && $params->get('comingsoon_content')) : ?> <div class="row justify-content-center"> <div class="col-lg-8"> <div class="coming-soon-content"> <?php echo $params->get('comingsoon_content'); ?> </div> </div> </div> <?php endif; ?> <?php if ($params->get('comingsoon_countdown', 0) && $params->get('comingsoon_date')) : ?> <?php $comingsoon_date = explode('-', $params->get('comingsoon_date')); ?> <div id="coming-soon-countdown" class="clearfix"></div> <script type="text/javascript"> jQuery(function($) { $('#coming-soon-countdown').countdown('<?php echo trim($comingsoon_date[0]); ?>/<?php echo trim($comingsoon_date[1]); ?>/<?php echo trim($comingsoon_date[2]); ?>', function(event) { $(this).html(event.strftime('<div class="coming-soon-days"><span class="coming-soon-number">%-D</span><span class="coming-soon-string">%!D:<?php echo Text::_("HELIX_ULTIMATE_DAY"); ?>,<?php echo Text::_("HELIX_ULTIMATE_DAYS"); ?>;</span></div><div class="coming-soon-hours"><span class="coming-soon-number">%H</span><span class="coming-soon-string">%!H:<?php echo Text::_("HELIX_ULTIMATE_HOUR"); ?>,<?php echo Text::_("HELIX_ULTIMATE_HOURS"); ?>;</span></div><div class="coming-soon-minutes"><span class="coming-soon-number">%M</span><span class="coming-soon-string">%!M:<?php echo Text::_("HELIX_ULTIMATE_MINUTE"); ?>,<?php echo Text::_("HELIX_ULTIMATE_MINUTES"); ?>;</span></div><div class="coming-soon-seconds"><span class="coming-soon-number">%S</span><span class="coming-soon-string">%!S:<?php echo Text::_("HELIX_ULTIMATE_SECOND"); ?>,<?php echo Text::_("HELIX_ULTIMATE_SECONDS"); ?>;</span></div>')); }); }); </script> <?php endif; ?> <?php if ($theme->count_modules('comingsoon')) : ?> <div class="coming-soon-position"> <jdoc:include type="modules" name="comingsoon" style="sp_xhtml" /> </div> <?php endif; ?> <?php $facebook = $params->get('facebook'); $instagram = $params->get('instagram'); $twitter = $params->get('twitter'); $pinterest = $params->get('pinterest'); $youtube = $params->get('youtube'); $linkedin = $params->get('linkedin'); $dribbble = $params->get('dribbble'); $behance = $params->get('behance'); $flickr = $params->get('flickr'); $vk = $params->get('vk'); $whatsappInput = $params->get('whatsapp'); $whatsapp = !empty($whatsappInput) ? 'https://wa.me/' . $whatsappInput . '?text=Hi' : ''; if ($params->get('comingsoon_social_icons') && ($facebook || $instagram || $twitter || $pinterest || $youtube || $linkedin || $dribbble || $behance || $flickr || $vk || $whatsapp)) { $social_output = '<ul class="social-icons">'; if ($facebook) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $facebook . '"><i class="fab fa-facebook" aria-hidden="true"></i></a></li>'; } if ($instagram) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $instagram . '"><i class="fab fa-instagram" aria-hidden="true"></i></a></li>'; } if ($twitter) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $twitter . '"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" style="width: 13.56px;position: relative;top: -1.5px;"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/></svg></a></li>'; } if ($pinterest) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $pinterest . '"><i class="fab fa-pinterest" aria-hidden="true"></i></a></li>'; } if ($youtube) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $youtube . '"><i class="fab fa-youtube" aria-hidden="true"></i></a></li>'; } if ($linkedin) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $linkedin . '"><i class="fab fa-linkedin" aria-hidden="true"></i></a></li>'; } if ($dribbble) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $dribbble . '"><i class="fab fa-dribbble" aria-hidden="true"></i></a></li>'; } if ($behance) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $behance . '"><i class="fab fa-behance" aria-hidden="true"></i></a></li>'; } if ($flickr) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $flickr . '"><i class="fab fa-flickr" aria-hidden="true"></i></a></li>'; } if ($whatsapp) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $whatsapp . '"><i class="fab fa-whatsapp" aria-hidden="true"></i></a></li>'; } if ($vk) { $social_output .= '<li><a target="_blank" rel="noopener noreferrer" href="' . $vk . '"><i class="fab fa-vk" aria-hidden="true"></i></a></li>'; } $social_output .= '</ul>'; echo $social_output; } ?> <?php if (($params->get('comingsoon_enable_login', 0))) : ?> <div class="coming-soon-login"> <form action="<?php echo Route::_('index.php', true); ?>" method="post" id="form-login" class="mt-5"> <div class="row gx-3 align-items-center"> <div class="col-auto"> <label class="visually-hidden" for="username"><?php echo Text::_('JGLOBAL_USERNAME'); ?></label> <div class="input-group mb-2"> <div class="input-group-text"><span class="fas fa-user" aria-hidden="true"></span></div> <input name="username" type="text" class="form-control" id="username" placeholder="<?php echo Text::_('JGLOBAL_USERNAME'); ?>"> </div> </div> <div class="col-auto"> <label class="visually-hidden" for="password"><?php echo Text::_('JGLOBAL_PASSWORD'); ?></label> <div class="input-group mb-2"> <div class="input-group-text"><span class="fas fa-key" aria-hidden="true"></span></div> <input name="password" type="password" class="form-control" id="password" placeholder="<?php echo Text::_('JGLOBAL_PASSWORD'); ?>"> </div> </div> <?php if (count($twofactormethods) > 1) : ?> <div class="col-auto"> <label class="visually-hidden" for="secretkey"><?php echo Text::_('JGLOBAL_SECRETKEY'); ?></label> <div class="input-group mb-2"> <div class="input-group-text"><span class="fas fa-user-secret" aria-hidden="true"></span></div> <input name="secretkey" type="text" class="form-control" id="secretkey" placeholder="<?php echo Text::_('JGLOBAL_SECRETKEY'); ?>"> </div> </div> <?php endif; ?> <div class="col-auto"> <input type="submit" name="Submit" class="btn btn-success mb-2 login" value="<?php echo Text::_('JLOGIN'); ?>" /> <input type="hidden" name="option" value="com_users" /> <input type="hidden" name="task" value="user.login" /> <input type="hidden" name="return" value="<?php echo base64_encode(Uri::base()); ?>" /> <?php echo HTMLHelper::_('form.token'); ?> </div> </div> </form> </div> <?php endif; ?> <?php endif; ?> <?php $theme->after_body(); ?> </div> </body> </html> PKCA#]����Nsystem/helixultimate/overrides/layouts/com_contact/joomla/form/renderfield.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; extract($displayData); if (!empty($options['showonEnabled'])) { if (JVERSION < 4) { HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'system/cms.min.js', array('version' => 'auto', 'relative' => true)); } else { /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('showon'); } } $name = $name ?? ''; $class = empty($options['class']) ? '' : ' ' . $options['class']; $rel = empty($options['rel']) ? '' : ' ' . $options['rel']; $id = $name . '-desc'; $hideLabel = !empty($options['hiddenLabel']); $hideDescription = empty($options['hiddenDescription']) ? false : $options['hiddenDescription']; if (!empty($parentclass)) { $class .= ' ' . $parentclass; } ?> <div class="control-group<?php echo $class; ?>"<?php echo $rel; ?>> <?php if ($hideLabel) : ?> <div class="visually-hidden"><?php echo $label; ?></div> <?php else : ?> <?php echo $label; ?> <?php endif; ?> <?php echo $input; ?> <?php if (!$hideDescription && !empty($description)) : ?> <div id="<?php echo $id; ?>"> <small class="form-text"> <?php echo $description; ?> </small> </div> <?php endif; ?> </div> PKCA#]TSsystem/helixultimate/overrides/layouts/libraries/html/bootstrap/tab/starttabset.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; $selector = empty($displayData['selector']) ? '' : $displayData['selector']; ?> <ul class="joomla-tabs nav nav-tabs" id="<?php echo preg_replace('/^[\.#]/', '', $selector); ?>Tabs" role="tablist"></ul> <div class="tab-content" id="<?php echo $selector; ?>Content"> PKCA#]h�`Qsystem/helixultimate/overrides/layouts/libraries/html/bootstrap/tab/endtabset.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; ?> </div> PKCA#]h�`Nsystem/helixultimate/overrides/layouts/libraries/html/bootstrap/tab/endtab.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; ?> </div> PKCA#]�$$Nsystem/helixultimate/overrides/layouts/libraries/html/bootstrap/tab/addtab.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; $id = empty($displayData['id']) ? '' : $displayData['id']; $active = empty($displayData['active']) ? '' : $displayData['active']; $title = empty($displayData['title']) ? '' : $displayData['title']; ?> <div id="<?php echo preg_replace('/^[\.#]/', '', $id); ?>" class="tab-pane<?php echo $active; ?>" data-active="<?php echo trim(htmlspecialchars($active, ENT_COMPAT, 'UTF-8')); ?>" data-id="<?php echo htmlspecialchars($id, ENT_COMPAT, 'UTF-8'); ?>" data-title="<?php echo htmlspecialchars($title, ENT_COMPAT, 'UTF-8'); ?>"> PKCA#];��ľ�Psystem/helixultimate/overrides/layouts/libraries/html/bootstrap/modal/footer.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2015 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var string $selector Unique DOM identifier for the modal. CSS id without # * @var array $params Modal parameters. Default supported parameters: * - title string The modal title * - backdrop mixed A boolean select if a modal-backdrop element should be included (default = true) * The string 'static' includes a backdrop which doesn't close the modal on click. * - keyboard boolean Closes the modal when escape key is pressed (default = true) * - closeButton boolean Display modal close button (default = true) * - animation boolean Fade in from the top of the page (default = true) * - footer string Optional markup for the modal footer * - url string URL of a resource to be inserted as an <iframe> inside the modal body * - height string height of the <iframe> containing the remote resource * - width string width of the <iframe> containing the remote resource * - bodyHeight int Optional height of the modal body in viewport units (vh) * - modalWidth int Optional width of the modal in viewport units (vh) * @var string $body Markup for the modal body. Appended after the <iframe> if the URL option is set */ ?> <div class="modal-footer"> <?php echo $params['footer']; ?> </div> PKCA#]���ȧ�Psystem/helixultimate/overrides/layouts/libraries/html/bootstrap/modal/iframe.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2015 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\Utilities\ArrayHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $selector Unique DOM identifier for the modal. CSS id without # * @var array $params Modal parameters. Default supported parameters: * - title string The modal title * - backdrop mixed A boolean select if a modal-backdrop element should be included (default = true) * The string 'static' includes a backdrop which doesn't close the modal on click. * - keyboard boolean Closes the modal when escape key is pressed (default = true) * - closeButton boolean Display modal close button (default = true) * - animation boolean Fade in from the top of the page (default = true) * - footer string Optional markup for the modal footer * - url string URL of a resource to be inserted as an <iframe> inside the modal body * - height string height of the <iframe> containing the remote resource * - width string width of the <iframe> containing the remote resource * @var string $body Markup for the modal body. Appended after the <iframe> if the URL option is set */ $iframeAttributes = [ 'class' => 'iframe', 'src' => $params['url'] ]; if (isset($params['title'])) { $iframeAttributes['name'] = addslashes($params['title']); $iframeAttributes['title'] = addslashes($params['title']); } if (isset($params['height'])) { $iframeAttributes['height'] = $params['height']; } if (isset($params['width'])) { $iframeAttributes['width'] = $params['width']; } ?> <iframe <?php echo ArrayHelper::toString($iframeAttributes); ?>></iframe> PKCA#]R�#���Nsystem/helixultimate/overrides/layouts/libraries/html/bootstrap/modal/body.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2015 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var string $selector Unique DOM identifier for the modal. CSS id without # * @var array $params Modal parameters. Default supported parameters: * - title string The modal title * - backdrop mixed A boolean select if a modal-backdrop element should be included (default = true) * The string 'static' includes a backdrop which doesn't close the modal on click. * - keyboard boolean Closes the modal when escape key is pressed (default = true) * - closeButton boolean Display modal close button (default = true) * - animation boolean Fade in from the top of the page (default = true) * - footer string Optional markup for the modal footer * - url string URL of a resource to be inserted as an <iframe> inside the modal body * - height string height of the <iframe> containing the remote resource * - width string width of the <iframe> containing the remote resource * - bodyHeight int Optional height of the modal body in viewport units (vh) * - modalWidth int Optional width of the modal in viewport units (vh) * @var string $body Markup for the modal body. Appended after the <iframe> if the URL option is set */ $bodyClass = 'modal-body'; $bodyHeight = isset($params['bodyHeight']) ? round((int) $params['bodyHeight'], -1) : ''; if ($bodyHeight && $bodyHeight >= 20 && $bodyHeight < 90) { $bodyClass .= ' jviewport-height' . $bodyHeight; } ?> <div class="<?php echo $bodyClass; ?>"> <?php echo $body; ?> </div> PKCA#]��s�D D Psystem/helixultimate/overrides/layouts/libraries/html/bootstrap/modal/header.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2015 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var string $selector Unique DOM identifier for the modal. CSS id without # * @var array $params Modal parameters. Default supported parameters: * - title string The modal title * - backdrop mixed A boolean select if a modal-backdrop element should be included (default = true) * The string 'static' includes a backdrop which doesn't close the modal on click. * - keyboard boolean Closes the modal when escape key is pressed (default = true) * - closeButton boolean Display modal close button (default = true) * - animation boolean Fade in from the top of the page (default = true) * - footer string Optional markup for the modal footer * - url string URL of a resource to be inserted as an <iframe> inside the modal body * - height string height of the <iframe> containing the remote resource * - width string width of the <iframe> containing the remote resource * - bodyHeight int Optional height of the modal body in viewport units (vh) * - modalWidth int Optional width of the modal in viewport units (vh) * @var string $body Markup for the modal body. Appended after the <iframe> if the URL option is set */ ?> <div class="modal-header"> <?php if (isset($params['title'])) : ?> <h3 class="modal-title"><?php echo $params['title']; ?></h3> <?php endif; ?> <?php if (!isset($params['closeButton']) || $params['closeButton']) : ?> <button type="button" class="btn-close novalidate" data-bs-dismiss="modal" aria-label="<?php echo Text::_('JLIB_HTML_BEHAVIOR_CLOSE'); ?>"> </button> <?php endif; ?> </div> PKCA#]�Á[Nsystem/helixultimate/overrides/layouts/libraries/html/bootstrap/modal/main.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2015 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Layout\LayoutHelper; use Joomla\Utilities\ArrayHelper; extract($displayData); /** * Layout variables * ----------------- * @var string $selector Unique DOM identifier for the modal. CSS id without # * @var array $params Modal parameters. Default supported parameters: * - title string The modal title * - backdrop mixed A boolean select if a modal-backdrop element should be included (default = true) * The string 'static' includes a backdrop which doesn't close the modal on click. * - keyboard boolean Closes the modal when escape key is pressed (default = true) * - closeButton boolean Display modal close button (default = true) * - animation boolean Fade in from the top of the page (default = true) * - url string URL of a resource to be inserted as an <iframe> inside the modal body * - height string height of the <iframe> containing the remote resource * - width string width of the <iframe> containing the remote resource * - bodyHeight int Optional height of the modal body in viewport units (vh) * - modalWidth int Optional width of the modal in viewport units (vh) * - footer string Optional markup for the modal footer * - modalCss string Optional CSS classes of the modal * @var string $body Markup for the modal body. Appended after the <iframe> if the URL option is set */ $modalClasses = ['modal']; if (!isset($params['animation']) || $params['animation']) { $modalClasses[] = 'fade'; } $modalWidth = isset($params['modalWidth']) ? round((int) $params['modalWidth'], -1) : ''; $modalDialogClass = 'modal-lg'; if ($modalWidth && $modalWidth > 0 && $modalWidth <= 100) { $modalDialogClass .= ' jviewport-width' . $modalWidth; } if (!empty($params['modalCss'])) { $modalDialogClass = $params['modalCss']; } $modalAttributes = [ 'tabindex' => '-1', 'class' => 'joomla-modal ' . implode(' ', $modalClasses) ]; if (isset($params['backdrop'])) { $modalAttributes['data-bs-backdrop'] = (is_bool($params['backdrop']) ? ($params['backdrop'] ? 'true' : 'false') : $params['backdrop']); } if (isset($params['keyboard'])) { $modalAttributes['data-bs-keyboard'] = (is_bool($params['keyboard']) ? ($params['keyboard'] ? 'true' : 'false') : 'true'); } if (isset($params['url'])) { $url = 'data-url="' . $params['url'] . '"'; $iframeHtml = htmlspecialchars(LayoutHelper::render('libraries.html.bootstrap.modal.iframe', $displayData), ENT_COMPAT, 'UTF-8'); } ?> <div id="<?php echo $selector; ?>" role="dialog" <?php echo ArrayHelper::toString($modalAttributes); ?> <?php echo $url ?? ''; ?> <?php echo isset($url) ? 'data-iframe="' . trim($iframeHtml) . '"' : ''; ?>> <div class="modal-dialog <?php echo $modalDialogClass; ?>"> <div class="modal-content"> <?php // Header if (!isset($params['closeButton']) || isset($params['title']) || $params['closeButton']) { echo LayoutHelper::render('libraries.html.bootstrap.modal.header', $displayData); } // Body echo LayoutHelper::render('libraries.html.bootstrap.modal.body', $displayData); // Footer if (isset($params['footer'])) { echo LayoutHelper::render('libraries.html.bootstrap.modal.footer', $displayData); } ?> </div> </div> </div> PKCA#]S���Z�ZGsystem/helixultimate/overrides/layouts/libraries/cms/html/bootstrap.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Layout\LayoutHelper; /** * Utility class for Bootstrap elements. * * @since 3.0 */ abstract class HelixBootstrap { /** * @var array Array containing information for loaded files * @since 3.0 */ protected static $loaded = array(); /** * Add javascript support for Bootstrap alerts * * @param string $selector Common class for the alerts * * @return void * * @since 3.0 */ public static function alert($selector = 'alert') { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.alert', array($selector => '')); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap buttons * * @param string $selector Common class for the buttons * * @return void * * @since 3.1 */ public static function button($selector = 'button') { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.button', array($selector)); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap carousels * * @param string $selector Common class for the carousels. * @param array $params An array of options for the carousel. * Options for the carousel can be: * - interval number The amount of time to delay between automatically cycling an item. * If false, carousel will not automatically cycle. * - pause string Pauses the cycling of the carousel on mouseenter and resumes the cycling * of the carousel on mouseleave. * * @return void * * @since 3.0 */ public static function carousel($selector = 'carousel', $params = array()) { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['interval'] = isset($params['interval']) ? (int) $params['interval'] : 5000; $opt['pause'] = isset($params['pause']) ? $params['pause'] : 'hover'; Factory::getDocument()->addScriptOptions('bootstrap.carousel', array($selector => $opt)); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap dropdowns * * @param string $selector Common class for the dropdowns * * @return void * * @since 3.0 */ public static function dropdown($selector = 'dropdown-toggle') { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.dropdown', array($selector)); static::$loaded[__METHOD__][$selector] = true; } /** * Method to load the Bootstrap JavaScript framework into the document head * * If debugging mode is on an uncompressed version of Bootstrap is included for easier debugging. * * @param mixed $debug Is debugging mode on? [optional] * * @return void * * @since 3.0 */ public static function framework($debug = null) { // Only load once if (!empty(static::$loaded[__METHOD__])) { return; } $debug = (isset($debug) && $debug != JDEBUG) ? $debug : JDEBUG; // Load the needed scripts HTMLHelper::_('behavior.core'); HTMLHelper::_('jquery.framework'); HTMLHelper::_('script', 'vendor/tether/tether.min.js', array('version' => 'auto', 'relative' => true, 'detectDebug' => $debug)); HTMLHelper::_('script', 'vendor/bootstrap/bootstrap.min.js', array('version' => 'auto', 'relative' => true, 'detectDebug' => $debug)); HTMLHelper::_('script', 'system/bootstrap-init.min.js', array('version' => 'auto', 'relative' => true, 'detectDebug' => $debug)); static::$loaded[__METHOD__] = true; } /** * Method to render a Bootstrap modal * * @param string $selector The ID selector for the modal. * @param array $params An array of options for the modal. * Options for the modal can be: * - title string The modal title * - backdrop mixed A boolean select if a modal-backdrop element should be included (default = true) * The string 'static' includes a backdrop which doesn't close the modal on click. * - keyboard boolean Closes the modal when escape key is pressed (default = true) * - closeButton boolean Display modal close button (default = true) * - animation boolean Fade in from the top of the page (default = true) * - footer string Optional markup for the modal footer * - url string URL of a resource to be inserted as an `<iframe>` inside the modal body * - height string height of the `<iframe>` containing the remote resource * - width string width of the `<iframe>` containing the remote resource * @param string $body Markup for the modal body. Appended after the `<iframe>` if the URL option is set * * @return string HTML markup for a modal * * @since 3.0 */ public static function renderModal($selector = 'modal', $params = array(), $body = '') { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); $layoutData = array( 'selector' => $selector, 'params' => $params, 'body' => $body, ); static::$loaded[__METHOD__][$selector] = true; return LayoutHelper::render('joomla.modal.main', $layoutData); } /** * Add javascript support for Bootstrap popovers * * Use element's Title as popover content * * @param string $selector Selector for the popover * @param array $params An array of options for the popover. * Options for the popover can be: * animation boolean apply a css fade transition to the popover * container string|boolean Appends the popover to a specific element: { container: 'body' } * content string|function default content value if `data-content` attribute isn't present * delay number|object delay showing and hiding the popover (ms) - does not apply to manual trigger type * If a number is supplied, delay is applied to both hide/show * Object structure is: delay: { show: 500, hide: 100 } * html boolean Insert HTML into the popover. If false, jQuery's text method will be used to insert * content into the dom. * placement string|function how to position the popover - top | bottom | left | right * selector string If a selector is provided, popover objects will be delegated to the specified targets. * template string Base HTML to use when creating the popover. * title string|function default title value if `title` tag isn't present * trigger string how popover is triggered - hover | focus | manual * constraints array An array of constraints - passed through to Tether. * offset string Offset of the popover relative to its target. * * @return void * * @since 3.0 */ public static function popover($selector = '.hasPopover', $params = array()) { // Only load once if (isset(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); $opt['animation'] = isset($params['animation']) ? $params['animation'] : null; $opt['container'] = isset($params['container']) ? $params['container'] : 'body'; $opt['content'] = isset($params['content']) ? $params['content'] : null; $opt['delay'] = isset($params['delay']) ? $params['delay'] : null; $opt['html'] = isset($params['html']) ? $params['html'] : true; $opt['placement'] = isset($params['placement']) ? $params['placement'] : null; $opt['selector'] = isset($params['selector']) ? $params['selector'] : null; $opt['template'] = isset($params['template']) ? $params['template'] : null; $opt['title'] = isset($params['title']) ? $params['title'] : null; $opt['trigger'] = isset($params['trigger']) ? $params['trigger'] : 'hover focus'; $opt['constraints'] = isset($params['constraints']) ? $params['constraints'] : ['to' => 'scrollParent', 'attachment' => 'together', 'pin' => true]; $opt['offset'] = isset($params['offset']) ? $params['offset'] : '0 0'; $opt = (object) array_filter((array) $opt); // Factory::getDocument()->addScriptOptions('bootstrap.popover', array($selector => $opt)); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap ScrollSpy * * @param string $selector The ID selector for the ScrollSpy element. * @param array $params An array of options for the ScrollSpy. * Options for the ScrollSpy can be: * - offset number Pixels to offset from top when calculating position of scroll. * * @return void * * @since 3.0 */ public static function scrollspy($selector = 'navbar', $params = array()) { // Only load once if (isset(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); Factory::getDocument()->addScriptOptions('bootstrap.scrollspy', array($selector => $params)); static::$loaded[__METHOD__][$selector] = true; } /** * Add javascript support for Bootstrap tooltips * * Add a title attribute to any element in the form * title="title::text" * * @param string $selector The ID selector for the tooltip. * @param array $params An array of options for the tooltip. * Options for the tooltip can be: * animation boolean apply a css fade transition to the popover * container string|boolean Appends the popover to a specific element: { container: 'body' } * delay number|object delay showing and hiding the popover (ms) - does not apply to manual trigger type * If a number is supplied, delay is applied to both hide/show * Object structure is: delay: { show: 500, hide: 100 } * html boolean Insert HTML into the popover. If false, jQuery's text method will be used to insert * content into the dom. * placement string|function how to position the popover - top | bottom | left | right * selector string If a selector is provided, popover objects will be * delegated to the specified targets. * template string Base HTML to use when creating the popover. * title string|function default title value if `title` tag isn't present * trigger string how popover is triggered - hover | focus | manual * constraints array An array of constraints - passed through to Tether. * offset string Offset of the popover relative to its target. * * @return void * * @since 3.0 */ public static function tooltip($selector = '.hasTooltip', $params = array()) { if (!isset(static::$loaded[__METHOD__][$selector])) { // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['animation'] = isset($params['animation']) ? (boolean) $params['animation'] : null; $opt['html'] = isset($params['html']) ? (boolean) $params['html'] : true; $opt['placement'] = isset($params['placement']) ? (string) $params['placement'] : null; $opt['selector'] = isset($params['selector']) ? (string) $params['selector'] : null; $opt['title'] = isset($params['title']) ? (string) $params['title'] : null; $opt['trigger'] = isset($params['trigger']) ? (string) $params['trigger'] : null; $opt['delay'] = isset($params['delay']) ? (is_array($params['delay']) ? $params['delay'] : (int) $params['delay']) : null; $opt['container'] = isset($params['container']) ? $params['container'] : 'body'; $opt['template'] = isset($params['template']) ? (string) $params['template'] : null; $onShow = isset($params['onShow']) ? (string) $params['onShow'] : null; $onShown = isset($params['onShown']) ? (string) $params['onShown'] : null; $onHide = isset($params['onHide']) ? (string) $params['onHide'] : null; $onHidden = isset($params['onHidden']) ? (string) $params['onHidden'] : null; $options = json_encode($opt); // Build the script. $script = array('$(container).find(' . json_encode($selector) . ').tooltip(' . $options . ')'); if ($onShow) { $script[] = 'on("show.bs.tooltip", ' . $onShow . ')'; } if ($onShown) { $script[] = 'on("shown.bs.tooltip", ' . $onShown . ')'; } if ($onHide) { $script[] = 'on("hide.bs.tooltip", ' . $onHide . ')'; } if ($onHidden) { $script[] = 'on("hidden.bs.tooltip", ' . $onHidden . ')'; } // Set static array static::$loaded[__METHOD__][$selector] = true; } return; } /** * Loads js and css files needed by Bootstrap Tooltip Extended plugin * * @param boolean $extended If true, bootstrap-tooltip-extended.js and .css files are loaded * * @return void * * @since 3.6 * * @deprecated 4.0 No replacement, use Bootstrap tooltips. */ public static function tooltipExtended($extended = true) { if ($extended) { HTMLHelper::_('script', 'jui/bootstrap-tooltip-extended.min.js', array('version' => 'auto', 'relative' => true)); HTMLHelper::_('stylesheet', 'jui/bootstrap-tooltip-extended.css', array('version' => 'auto', 'relative' => true)); } } /** * Add javascript support for Bootstrap accordians and insert the accordian * * @param string $selector The ID selector for the tooltip. * @param array $params An array of options for the tooltip. * Options for the tooltip can be: * - parent selector If selector then all collapsible elements under the specified parent will be closed when this * collapsible item is shown. (similar to traditional accordion behavior) * - toggle boolean Toggles the collapsible element on invocation * - active string Sets the active slide during load * * - onShow function This event fires immediately when the show instance method is called. * - onShown function This event is fired when a collapse element has been made visible to the user * (will wait for css transitions to complete). * - onHide function This event is fired immediately when the hide method has been called. * - onHidden function This event is fired when a collapse element has been hidden from the user * (will wait for css transitions to complete). * * @return string HTML for the accordian * * @since 3.0 */ public static function startAccordion($selector = 'myAccordian', $params = array()) { // Only load once if (!empty(static::$loaded[__METHOD__][$selector])) { return; } // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['parent'] = isset($params['parent']) ? ($params['parent'] == true ? '#' . $selector : $params['parent']) : ''; $opt['toggle'] = isset($params['toggle']) ? (boolean) $params['toggle'] : !($opt['parent'] === false || isset($params['active'])); $opt['onShow'] = isset($params['onShow']) ? (string) $params['onShow'] : null; $opt['onShown'] = isset($params['onShown']) ? (string) $params['onShown'] : null; $opt['onHide'] = isset($params['onHide']) ? (string) $params['onHide'] : null; $opt['onHidden'] = isset($params['onHidden']) ? (string) $params['onHidden'] : null; Factory::getDocument()->addScriptOptions('bootstrap.accordion', array($selector => $opt)); static::$loaded[__METHOD__][$selector] = true; return '<div id="' . $selector . '" class="accordion" role="tablist">'; } /** * Close the current accordion * * @return string HTML to close the accordian * * @since 3.0 */ public static function endAccordion() { return '</div>'; } /** * Begins the display of a new accordion slide. * * @param string $selector Identifier of the accordion group. * @param string $text Text to display. * @param string $id Identifier of the slide. * @param string $class Class of the accordion group. * * @return string HTML to add the slide * * @since 3.0 */ public static function addSlide($selector, $text, $id, $class = '') { $in = (static::$loaded[__CLASS__ . '::startAccordion'][$selector]['active'] == $id) ? ' in' : ''; $collapsed = (static::$loaded[__CLASS__ . '::startAccordion'][$selector]['active'] == $id) ? '' : ' collapsed'; $parent = static::$loaded[__CLASS__ . '::startAccordion'][$selector]['parent'] ? ' data-parent="' . static::$loaded[__CLASS__ . '::startAccordion'][$selector]['parent'] . '"' : ''; $class = (!empty($class)) ? ' ' . $class : ''; $html = '<div class="card mb-2' . $class . '">' . '<a href="#' . $id . '" data-bs-toggle="collapse"' . $parent . ' class="card-header' . $collapsed . '" role="tab">' . $text . '</a>' . '<div class="collapse' . $in . '" id="' . $id . '" role="tabpanel">' . '<div class="card-block">'; return $html; } /** * Close the current slide * * @return string HTML to close the slide * * @since 3.0 */ public static function endSlide() { return '</div></div></div>'; } /** * Creates a tab pane * * @param string $selector The pane identifier. * @param array $params The parameters for the pane * * @return string * * @since 3.1 */ public static function startTabSet($selector = 'myTab', $params = array()) { $sig = md5(serialize(array($selector, $params))); if (!isset(static::$loaded[__METHOD__][$sig])) { // Include Bootstrap framework HTMLHelper::_('bootstrap.framework'); // Setup options object $opt['active'] = (isset($params['active']) && ($params['active'])) ? (string) $params['active'] : ''; Factory::getDocument()->addScriptOptions('bootstrap.tabs', array($selector => $opt)); // Set static array static::$loaded[__METHOD__][$sig] = true; static::$loaded[__METHOD__][$selector]['active'] = $opt['active']; } return LayoutHelper::render('libraries.cms.html.bootstrap.starttabset', array('selector' => $selector)); } /** * Close the current tab pane * * @return string HTML to close the pane * * @since 3.1 */ public static function endTabSet() { return LayoutHelper::render('libraries.cms.html.bootstrap.endtabset'); } /** * Begins the display of a new tab content panel. * * @param string $selector Identifier of the panel. * @param string $id The ID of the div element * @param string $title The title text for the new UL tab * * @return string HTML to start a new panel * * @since 3.1 */ public static function addTab($selector, $id, $title) { static $tabScriptLayout = null; static $tabLayout = null; $tabScriptLayout = $tabScriptLayout === null ? new FileLayout('libraries.cms.html.bootstrap.addtabscript') : $tabScriptLayout; $tabLayout = $tabLayout === null ? new FileLayout('libraries.cms.html.bootstrap.addtab') : $tabLayout; $active = (static::$loaded['HTMLHelperBootstrap::startTabSet'][$selector]['active'] == $id) ? ' active' : ''; // Inject tab into UL Factory::getDocument() ->addScriptDeclaration($tabScriptLayout->render(array('selector' => $selector, 'id' => $id, 'active' => $active, 'title' => $title))); return $tabLayout->render(array('id' => $id, 'active' => $active, 'title' => $title)); } /** * Close the current tab content panel * * @return string HTML to close the pane * * @since 3.1 */ public static function endTab() { return LayoutHelper::render('libraries.cms.html.bootstrap.endtab'); } /** * Loads CSS files needed by Bootstrap * * @param boolean $includeMainCss If true, main bootstrap.css files are loaded * @param string $direction rtl or ltr direction. If empty, ltr is assumed * @param array $attribs Optional array of attributes to be passed to HTMLHelper::_('stylesheet') * * @return void * * @since 3.0 */ public static function loadCss($includeMainCss = true, $direction = 'ltr', $attribs = array()) { // Load Bootstrap main CSS if ($includeMainCss) { HTMLHelper::_('stylesheet', 'vendor/bootstrap/bootstrap.min.css', array('version' => 'auto', 'relative' => true), $attribs); } /** * BOOTSTRAP RTL - WILL SORT OUT LATER DOWN THE LINE * Load Bootstrap RTL CSS * if ($direction === 'rtl') * { * HTMLHelper::_('stylesheet', 'jui/bootstrap-rtl.css', array('version' => 'auto', 'relative' => true), $attribs); * } */ } } PKCA#]A��7��Ssystem/helixultimate/overrides/layouts/libraries/cms/html/bootstrap/starttabset.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $selector = empty($displayData['selector']) ? '' : $displayData['selector']; ?> <ul class="joomla-tabs nav nav-tabs mb-3" id="<?php echo $selector; ?>Tabs"></ul> <div class="tab-content" id="<?php echo $selector; ?>Content"> PKCA#]#RFQsystem/helixultimate/overrides/layouts/libraries/cms/html/bootstrap/endtabset.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; ?> </div>PKCA#]�� Nsystem/helixultimate/overrides/layouts/libraries/cms/html/bootstrap/endtab.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; ?> </div>PKCA#]BicQNsystem/helixultimate/overrides/layouts/libraries/cms/html/bootstrap/addtab.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $id = empty($displayData['id']) ? '' : $displayData['id']; $active = empty($displayData['active']) ? '' : $displayData['active']; $selector = empty($displayData['selector']) ? '' : $displayData['selector']; $title = empty($displayData['title']) ? '' : $displayData['title']; ?> <div id="<?php echo $id; ?>" class="tab-pane<?php echo $active; ?>" data-node="<?php echo htmlspecialchars($active, ENT_COMPAT, 'UTF-8') .'['. htmlspecialchars($id, ENT_COMPAT, 'UTF-8') .'['. htmlspecialchars($title, ENT_COMPAT, 'UTF-8'); ?>"> PKCA#];Ӹ�Tsystem/helixultimate/overrides/layouts/libraries/cms/html/bootstrap/addtabscript.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('JPATH_BASE') or die; $selector = empty($displayData['selector']) ? '' : $displayData['selector']; $id = empty($displayData['id']) ? '' : $displayData['id']; $active = empty($displayData['active']) ? '' : $displayData['active']; $title = empty($displayData['title']) ? '' : $displayData['title']; $li = '<li class="nav-item"><a class="nav-link' . $active . '" href="#' . $id . '" data-bs-toggle="tab">' . $title . '</a></li>'; echo 'jQuery(function($){ $(', json_encode('#' . $selector . 'Tabs'), ').append($(', json_encode($li), ')); });'; PKCA#]�m..Jsystem/helixultimate/overrides/layouts/plugins/user/profile/fields/dob.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); extract($displayData); echo $text . '<br />'; ?> PKCA#]�o4+y y Esystem/helixultimate/overrides/layouts/plugins/user/terms/message.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage User.terms * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $options Options available for this field. * @var string $termsnote The terms note that needs to be displayed * @var array $translateLabel Should the label be translated? * @var array $translateHint Should the hint be translated? * @var array $termsArticle The Article ID holding the Terms Article */ echo '<div class="alert alert-info">' . $termsnote . '</div>'; PKCA#]s^F�++Csystem/helixultimate/overrides/layouts/plugins/user/terms/label.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage User.terms * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $options Options available for this field. * @var array $termsnote The terms note that needs to be displayed * @var array $translateLabel Should the label be translated? * @var array $translateHint Should the hint be translated? * @var array $termsArticle The Article ID holding the Terms Article * @var object $article The Article object */ // Get the label text from the XML element, defaulting to the element name. $text = $label ? (string) $label : (string) $name; $text = $translateLabel ? Text::_($text) : $text; // Set required to true as this field is not displayed at all if not required. $required = true; // Build the class for the label. $class = 'required'; $class = !empty($labelclass) ? $class . ' ' . $labelclass : $class; if ($article) { $attribs = [ 'data-bs-toggle' => 'modal', 'data-bs-target' => '#tosModal', 'class' => 'required', ]; $link = HTMLHelper::_('link', Route::_($article->link . '&tmpl=component'), $text, $attribs); echo HTMLHelper::_( 'bootstrap.renderModal', 'tosModal', [ 'url' => Route::_($article->link . '&tmpl=component'), 'title' => $text, 'height' => '100%', 'width' => '100%', 'bodyHeight' => 70, 'modalWidth' => 80, 'footer' => '<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" aria-hidden="true">' . Text::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>', ] ); } else { $link = '<span class="' . $class . '">' . $text . '</span>'; } // Add the label text and star. $label = $link . '<span class="star" aria-hidden="true"> *</span>'; echo $label; PKCA#]w���OOCsystem/helixultimate/overrides/layouts/plugins/user/token/token.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2020 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; extract($displayData); /** * Layout variables * ----------------- * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $name Name of the input field. * @var string $value Value attribute of the field. */ Text::script('ERROR'); Text::script('MESSAGE'); Text::script('PLG_USER_TOKEN_COPY_SUCCESS'); Text::script('PLG_USER_TOKEN_COPY_FAIL'); Factory::getApplication()->getDocument()->getWebAssetManager() ->registerAndUseScript('plg_user_token.token', 'plg_user_token/token.js', [], ['defer' => true], ['core']); ?> <div class="input-group"> <input type="text" class="form-control" name="<?php echo $name; ?>" id="<?php echo $id; ?>" readonly value="<?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?>"> <button class="btn btn-primary" type="button" id="token-copy" title="<?php echo Text::_('PLG_USER_TOKEN_COPY_DESC'); ?>"><?php echo Text::_('PLG_USER_TOKEN_COPY'); ?></button> </div> PKCA#]�1y���bsystem/helixultimate/overrides/layouts/plugins/editors/tinymce/field/tinymcebuilder/setoptions.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors.tinymce * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var \Joomla\CMS\Form\Form $form Form with extra options for the set * @var \Joomla\CMS\Layout\FileLayout $this Context */ ?> <div class="setoptions-form-wrapper"> <?php foreach ($form->getFieldset('basic') as $field) : ?> <?php echo $field->renderField(); ?> <?php endforeach; ?> </div> PKCA#]�4�;;asystem/helixultimate/overrides/layouts/plugins/editors/tinymce/field/tinymcebuilder/setaccess.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors.tinymce * * @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var \Joomla\CMS\Form\Form $form Form with extra options for the set * @var \Joomla\CMS\Layout\FileLayout $this Context */ ?> <div class="setaccess-form-wrapper"> <?php echo $form->renderField('access'); ?> </div> PKCA#]Jf�A�$�$Wsystem/helixultimate/overrides/layouts/plugins/editors/tinymce/field/tinymcebuilder.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage Editors.tinymce * * @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Document\HtmlDocument; use Joomla\CMS\Factory; use Joomla\CMS\Form\Form; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var array $value Value of the field. * @var array $menus List of the menu items * @var array $menubarSource Menu items for builder * @var array $buttons List of the buttons * @var array $buttonsSource Buttons by group, for the builder * @var array $toolbarPreset Toolbar preset (default values) * @var int $setsAmount Amount of sets * @var array $setsNames List of Sets names * @var Form[] $setsForms Form with extra options for an each set * @var string $languageFile TinyMCE language file to translate the buttons * @var FileLayout $this Context */ /** @var HtmlDocument $doc */ $doc = Factory::getApplication()->getDocument(); $wa = $doc->getWebAssetManager(); $wa->getRegistry()->addExtensionRegistryFile('plg_editors_tinymce'); $wa->registerAndUseStyle('tinymce.skin', 'media/vendor/tinymce/skins/ui/oxide/skin.min.css') ->registerAndUseStyle('plg_editors_tinymce.builder', 'plg_editors_tinymce/tinymce-builder.css', [], [], ['tinymce.skin', 'dragula']) ->registerScript('plg_editors_tinymce.builder', 'plg_editors_tinymce/tinymce-builder.js', [], ['type' => 'module'], ['dragula', 'plg_editors_tinymce']) ->useScript('plg_editors_tinymce.builder') ->useStyle('webcomponent.joomla-tab') ->useScript('webcomponent.joomla-tab'); // Add TinyMCE language file to translate the buttons if ($languageFile) { $wa->registerAndUseScript('tinymce.language', $languageFile, [], ['defer' => true], []); } // Add the builder options $doc->addScriptOptions( 'plg_editors_tinymce_builder', [ 'menus' => $menus, 'buttons' => $buttons, 'toolbarPreset' => $toolbarPreset, 'formControl' => $name . '[toolbars]', ] ); ?> <div id="joomla-tinymce-builder"> <h3><?php echo Text::_('PLG_TINY_SET_TARGET_PANEL_TITLE'); ?></h3> <p><?php echo Text::_('PLG_TINY_SET_TARGET_PANEL_DESCRIPTION'); ?></p> <p><?php echo Text::_('PLG_TINY_SET_SOURCE_PANEL_DESCRIPTION'); ?></p> <div class="tox tox-tinymce"> <div class="tox-editor-container"> <div class="tox-menubar tinymce-builder-menu source" data-group="menu" data-value="<?php echo $this->escape(json_encode($menubarSource)); ?>"> </div> <div class="tox-toolbar tinymce-builder-toolbar source" data-group="toolbar" data-value="<?php echo $this->escape(json_encode($buttonsSource)); ?>"> </div> </div> </div> <hr> <joomla-tab orientation="vertical" id="joomla-tinymce-builder-sets" recall breakpoint="974"> <?php foreach ($setsNames as $num => $title) : ?> <?php $isActive = $num === $setsAmount - 1; ?> <joomla-tab-element class="tab-pane" id="set-<?php echo $num; ?>" <?php echo $isActive; ?> name="<?php echo $title; ?>"> <?php // Render tab content for each set ?> <?php $presetButtonClasses = [ 'simple' => 'btn-success', 'medium' => 'btn-info', 'advanced' => 'btn-warning', ]; // Check whether the values exists, and if empty then use from preset if ( empty($value['toolbars'][$num]['menu']) && empty($value['toolbars'][$num]['toolbar1']) && empty($value['toolbars'][$num]['toolbar2']) ) { // Take the preset for default value switch ($num) { case 0: $preset = $toolbarPreset['advanced']; break; case 1: $preset = $toolbarPreset['medium']; break; default: $preset = $toolbarPreset['simple']; } $value['toolbars'][$num] = $preset; } // Take existing values $valMenu = empty($value['toolbars'][$num]['menu']) ? [] : $value['toolbars'][$num]['menu']; $valBar1 = empty($value['toolbars'][$num]['toolbar1']) ? [] : $value['toolbars'][$num]['toolbar1']; $valBar2 = empty($value['toolbars'][$num]['toolbar2']) ? [] : $value['toolbars'][$num]['toolbar2']; ?> <?php echo $this->sublayout('setaccess', ['form' => $setsForms[$num]]); ?> <div class="btn-toolbar float-end mt-3"> <div class="btn-group btn-group-sm"> <?php foreach (array_keys($toolbarPreset) as $presetName) : $btnClass = empty($presetButtonClasses[$presetName]) ? 'btn-primary' : $presetButtonClasses[$presetName]; ?> <button type="button" class="btn <?php echo $btnClass; ?> button-action" data-action="setPreset" data-preset="<?php echo $presetName; ?>" data-set="<?php echo $num; ?>"> <?php echo Text::_('PLG_TINY_SET_PRESET_BUTTON_' . $presetName); ?> </button> <?php endforeach; ?> <button type="button" class="btn btn-danger button-action" data-action="clearPane" data-set="<?php echo $num; ?>"> <?php echo Text::_('JCLEAR'); ?> </button> </div> </div> <div class="clearfix mb-1"></div> <div class="tox tox-tinymce mb-3"> <div class="tox-editor-container"> <div class="tox-menubar tinymce-builder-menu target" data-group="menu" data-set="<?php echo $num; ?>" data-value="<?php echo $this->escape(json_encode($valMenu)); ?>"> </div> <div class="tox-toolbar tinymce-builder-toolbar target" data-group="toolbar1" data-set="<?php echo $num; ?>" data-value="<?php echo $this->escape(json_encode($valBar1)); ?>"> </div> <div class="tox-toolbar tinymce-builder-toolbar target" data-group="toolbar2" data-set="<?php echo $num; ?>" data-value="<?php echo $this->escape(json_encode($valBar2)); ?>"> </div> </div> </div> <?php // Render the form for extra options ?> <?php echo $this->sublayout('setoptions', ['form' => $setsForms[$num]]); ?> </joomla-tab-element> <?php endforeach; ?> </joomla-tab> </div> PKCA#]_�Isystem/helixultimate/overrides/layouts/plugins/system/webauthn/manage.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.webauthn * * @copyright (C) 2020 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\User\User; use Webauthn\PublicKeyCredentialSource; /** * Passwordless Login management interface * * Generic data * * @var FileLayout $this The Joomla layout renderer * @var array $displayData The data in array format. DO NOT USE. * * Layout specific data * * @var User $user The Joomla user whose passwordless login we are managing * @var bool $allow_add Are we allowed to add passwordless login methods * @var array $credentials The already stored credentials for the user * @var string $error Any error messages * @var array $knownAuthenticators Known authenticator metadata * @var boolean $attestationSupport Is authenticator attestation supported in the plugin? */ // Extract the data. Do not remove until the unset() line. try { $app = Factory::getApplication(); $loggedInUser = $app->getIdentity(); $app->getDocument()->getWebAssetManager() ->registerAndUseStyle('plg_system_webauthn.backend', 'plg_system_webauthn/backend.css'); } catch (Exception $e) { $loggedInUser = new User(); } $defaultDisplayData = [ 'user' => $loggedInUser, 'allow_add' => false, 'credentials' => [], 'error' => '', 'knownAuthenticators' => [], 'attestationSupport' => true, ]; extract(array_merge($defaultDisplayData, $displayData)); if ($displayData['allow_add'] === false) { $error = Text::_('PLG_SYSTEM_WEBAUTHN_CANNOT_ADD_FOR_A_USER'); $allow_add = false; } // Ensure the GMP or BCmath extension is loaded in PHP - as this is required by third party library if ($allow_add && function_exists('gmp_intval') === false && function_exists('bccomp') === false) { $error = Text::_('PLG_SYSTEM_WEBAUTHN_REQUIRES_GMP'); $allow_add = false; } Text::script('JGLOBAL_CONFIRM_DELETE'); HTMLHelper::_('bootstrap.tooltip', '.plg_system_webauth-has-tooltip'); ?> <div class="plg_system_webauthn" id="plg_system_webauthn-management-interface"> <?php if (is_string($error) && !empty($error)) : ?> <div class="alert alert-danger"> <?php echo htmlentities($error) ?> </div> <?php endif; ?> <table class="table table-striped"> <caption class="visually-hidden"> <?php echo Text::_('PLG_SYSTEM_WEBAUTHN_TABLE_CAPTION'); ?>, </caption> <thead class="table-dark"> <tr> <th <?php if ($attestationSupport) : ?>colspan="2"<?php endif; ?> scope="col"> <?php echo Text::_('PLG_SYSTEM_WEBAUTHN_MANAGE_FIELD_KEYLABEL_LABEL') ?> </th> <th scope="col"><?php echo Text::_('PLG_SYSTEM_WEBAUTHN_MANAGE_HEADER_ACTIONS_LABEL') ?></th> </tr> </thead> <tbody> <?php foreach ($credentials as $method) : ?> <tr data-credential_id="<?php echo $method['id'] ?>"> <?php if ($attestationSupport) : $aaguid = ($method['credential'] instanceof PublicKeyCredentialSource) ? $method['credential']->getAaguid() : ''; $authMetadata = $knownAuthenticators[$aaguid->toString()] ?? $knownAuthenticators['']; ?> <td class="text-center"> <img class="plg_system_webauth-has-tooltip bg-secondary" style="max-width: 6em; max-height: 3em" src="<?php echo $authMetadata->icon ?>" alt="<?php echo $authMetadata->description ?>" title="<?php echo $authMetadata->description ?>"> </td> <?php endif; ?> <th scope="row" class="webauthnManagementCell"><?php echo htmlentities($method['label']) ?></th> <td class="webauthnManagementCell"> <button class="plg_system_webauthn-manage-edit btn btn-secondary"> <span class="icon-edit" aria-hidden="true"></span> <?php echo Text::_('PLG_SYSTEM_WEBAUTHN_MANAGE_BTN_EDIT_LABEL') ?> </button> <button class="plg_system_webauthn-manage-delete btn btn-danger"> <span class="icon-minus" aria-hidden="true"></span> <?php echo Text::_('PLG_SYSTEM_WEBAUTHN_MANAGE_BTN_DELETE_LABEL') ?> </button> </td> </tr> <?php endforeach; ?> <?php if (empty($credentials)) : ?> <tr> <td colspan="<?php echo $attestationSupport ? '3' : '2'; ?>"> <?php echo Text::_('PLG_SYSTEM_WEBAUTHN_MANAGE_HEADER_NOMETHODS_LABEL') ?> </td> </tr> <?php endif; ?> </tbody> </table> <?php if ($allow_add) : ?> <p class="plg_system_webauthn-manage-add-container"> <button type="button" id="plg_system_webauthn-manage-add" class="btn btn-success w-100"> <span class="icon-plus" aria-hidden="true"></span> <?php echo Text::_('PLG_SYSTEM_WEBAUTHN_MANAGE_BTN_ADD_LABEL') ?> </button> </p> <?php endif; ?> </div> PKCA#]1�K��Nsystem/helixultimate/overrides/layouts/plugins/system/privacyconsent/label.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.privacyconsent * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $options Options available for this field. * @var array $privacynote The privacy note that needs to be displayed * @var array $translateLabel Should the label be translated? * @var array $translateHint Should the hint be translated? * @var array $privacyArticle The Article ID holding the Privacy Article. * @var object $article The Article object. * @var object $privacyLink Link to the privacy article or menu item. */ // Get the label text from the XML element, defaulting to the element name. $text = $label ? (string) $label : (string) $name; $text = $translateLabel ? Text::_($text) : $text; // Set required to true as this field is not displayed at all if not required. $required = true; // Build the class for the label. $class = 'required'; $class = !empty($labelclass) ? $class . ' ' . $labelclass : $class; if ($privacyLink) { $attribs = [ 'data-bs-toggle' => 'modal', 'data-bs-target' => '#consentModal', 'class' => 'required', ]; $link = HTMLHelper::_('link', Route::_($privacyLink . '&tmpl=component'), $text, $attribs); echo HTMLHelper::_( 'bootstrap.renderModal', 'consentModal', [ 'url' => Route::_($privacyLink . '&tmpl=component'), 'title' => $text, 'height' => '100%', 'width' => '100%', 'bodyHeight' => 70, 'modalWidth' => 80, 'footer' => '<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" aria-hidden="true">' . Text::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>', ] ); } else { $link = '<span class="' . $class . '">' . $text . '</span>'; } // Add the label text and star. $label = $link . '<span class="star" aria-hidden="true"> *</span>'; echo $label; PKCA#]��Ne� � Psystem/helixultimate/overrides/layouts/plugins/system/privacyconsent/message.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.privacyconsent * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var array $options Options available for this field. * @var string $privacynote The privacy note that needs to be displayed * @var array $translateLabel Should the label be translated? * @var array $translateHint Should the hint be translated? * @var array $privacyArticle The Article ID holding the Privacy Article */ echo '<div class="alert alert-info">' . $privacynote . '</div>'; PKCA#]��yD��;system/helixultimate/overrides/layouts/chromes/sp_xhtml.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use HelixUltimate\Framework\Platform\Helper; defined('_JEXEC') or die; $module = $displayData['module']; $params = $displayData['params']; $attribs = $displayData['attribs']; if ($module->content === null || $module->content === '') { return; } $moduleTag = htmlspecialchars($params->get('module_tag', 'div') ?? "", ENT_QUOTES, 'UTF-8'); $bootstrapSize = (int) $params->get('bootstrap_size', 0); $moduleClass = $bootstrapSize !== 0 ? ' span' . $bootstrapSize : ''; $headerTag = htmlspecialchars($params->get('header_tag', 'h3') ?? "", ENT_QUOTES, 'UTF-8'); $headerClass = htmlspecialchars($params->get('header_class', 'sp-module-title') ?? "", ENT_COMPAT, 'UTF-8'); $moduleClassSfx = Helper::CheckNull($params->get('moduleclass_sfx')); $encodedModuleClassSfx = is_string($moduleClassSfx) ? htmlspecialchars($moduleClassSfx, ENT_COMPAT, 'UTF-8') : ''; if ($module->content) { echo '<' . $moduleTag . ' class="sp-module ' . $encodedModuleClassSfx . $moduleClass . '">'; if ($module->showtitle) { echo '<' . $headerTag . ' class="' . $headerClass . '">' . $module->title . '</' . $headerTag . '>'; } echo '<div class="sp-module-content">'; echo $module->content; echo '</div>'; echo '</' . $moduleTag . '>'; } PKCA#]�`a�� � 8system/helixultimate/overrides/layouts/chromes/html5.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt * * html5 (chosen html5 tag and font header tags) */ defined('_JEXEC') or die; use Joomla\Utilities\ArrayHelper; $module = $displayData['module']; $params = $displayData['params']; $attribs = $displayData['attribs']; if ((string) $module->content === '') { return; } $allowedTags = ['div', 'article', 'section', 'aside', 'main']; $moduleTagInput = $params->get('module_tag', 'div'); $moduleTag = in_array($moduleTagInput, $allowedTags, true) ? $moduleTagInput : 'div'; $moduleAttribs = []; $moduleAttribs['class'] = 'moduletable ' . htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_QUOTES, 'UTF-8'); $bootstrapSize = (int) $params->get('bootstrap_size', 0); $moduleAttribs['class'] .= $bootstrapSize !== 0 ? ' col-md-' . $bootstrapSize : ''; $allowedHeaderTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; $headerTagInput = $params->get('header_tag', 'h3'); $headerTag = in_array($headerTagInput, $allowedHeaderTags, true) ? $headerTagInput : 'h3'; $headerClass = htmlspecialchars($params->get('header_class', ''), ENT_QUOTES, 'UTF-8'); $headerAttribs = []; // Only output a header class if one is set if ($headerClass !== '') { $headerAttribs['class'] = $headerClass; } // Add class from attributes if any if (!empty($attribs['class'])) { $moduleAttribs['class'] .= ' ' . htmlspecialchars($attribs['class'], ENT_QUOTES, 'UTF-8'); } $moduleId = htmlspecialchars($module->id, ENT_QUOTES, 'UTF-8'); $escapedTitle = htmlspecialchars($escapedTitle, ENT_QUOTES, 'UTF-8'); // Only add aria if the moduleTag is not a div if ($moduleTag !== 'div') { if ($module->showtitle) : $moduleAttribs['aria-labelledby'] = 'mod-' . $moduleId; $headerAttribs['id'] = 'mod-' . $moduleId; else : $moduleAttribs['aria-label'] = $escapedTitle; endif; } $header = '<' . $headerTag . ' ' . ArrayHelper::toString($headerAttribs) . '>' . $escapedTitle . '</' . $headerTag . '>'; ?> <<?php echo $moduleTag; ?> <?php echo ArrayHelper::toString($moduleAttribs); ?>> <?php if ((bool) $module->showtitle) : ?> <?php echo $header; ?> <?php endif; ?> <?php echo $module->content; ?> </<?php echo $moduleTag; ?>> PKCA#]I�`>""7system/helixultimate/overrides/layouts/chromes/none.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; echo $displayData['module']->content; PKCA#]���@8system/helixultimate/overrides/layouts/chromes/table.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt * * Module chrome that wraps the module in a table */ defined('_JEXEC') or die; $module = $displayData['module']; $params = $displayData['params']; ?> <table class="moduletable <?php echo htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); ?>"> <?php if ((bool) $module->showtitle) : ?> <tr> <th> <?php echo $module->title; ?> </th> </tr> <?php endif; ?> <tr> <td> <?php echo $module->content; ?> </td> </tr> </table> PKCA#]�-0��:system/helixultimate/overrides/layouts/chromes/outline.phpnu�[���<?php /** * @package Joomla.Site * @subpackage Layout * * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; Factory::getApplication()->getDocument() ->getWebAssetManager() ->registerAndUseStyle('layouts.chromes.outline', 'layouts/chromes/outline.css'); $module = $displayData['module']; ?> <div class="mod-preview"> <div class="mod-preview-info"> <div class="mod-preview-position"> <?php echo Text::sprintf('JGLOBAL_PREVIEW_POSITION', $module->position); ?> </div> <div class="mod-preview-style"> <?php echo Text::sprintf('JGLOBAL_PREVIEW_STYLE', $module->style); ?> </div> </div> <div class="mod-preview-wrapper"> <?php echo $module->content; ?> </div> </div> PKCA#]3�Y���8system/helixultimate/overrides/mod_languages/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Uri\Uri; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $app->getDocument()->getWebAssetManager(); $wa->registerAndUseStyle('mod_languages', 'mod_languages/template.css'); ?> <div class="mod-languages"> <p class="visually-hidden" id="language_picker_des_<?php echo $module->id; ?>"><?php echo Text::_('MOD_LANGUAGES_DESC'); ?></p> <?php if ($headerText) : ?> <div class="mod-languages__pretext pretext"><p><?php echo $headerText; ?></p></div> <?php endif; ?> <?php if ($params->get('dropdown', 0)) : ?> <?php HTMLHelper::_('bootstrap.dropdown', '.dropdown-toggle'); ?> <div class="mod-languages__select btn-group"> <?php foreach ($list as $language) : ?> <?php if ($language->active) : ?> <button id="language_btn_<?php echo $module->id; ?>" type="button" data-bs-toggle="dropdown" class="btn btn-secondary dropdown-toggle" aria-haspopup="listbox" aria-labelledby="language_picker_des_<?php echo $module->id; ?> language_btn_<?php echo $module->id; ?>" aria-expanded="false"> <?php if ($params->get('dropdownimage', 1) && ($language->image)) : ?> <?php echo HTMLHelper::_('image', 'mod_languages/' . $language->image . '.gif', $params->get('full_name') ? '' : $language->title_native, null, true); ?> <?php endif; ?> <?php echo $params->get('full_name', 1) ? $language->title_native : strtoupper($language->sef); ?> </button> <?php endif; ?> <?php endforeach; ?> <ul aria-labelledby="language_picker_des_<?php echo $module->id; ?>" class="lang-block dropdown-menu"> <?php foreach ($list as $language) : ?> <?php $lbl = ''; if ($params->get('full_name') === 0) { $lbl = 'aria-label="' . $language->title_native . '"'; } ?> <?php if (!$language->active) : ?> <li> <a <?php echo $lbl; ?> href="<?php echo htmlspecialchars_decode(htmlspecialchars($language->link, ENT_QUOTES, 'UTF-8'), ENT_NOQUOTES); ?>"> <?php if ($params->get('dropdownimage', 1) && ($language->image)) : ?> <?php echo HTMLHelper::_('image', 'mod_languages/' . $language->image . '.gif', $params->get('full_name') ? '' : $language->title_native, null, true); ?> <?php endif; ?> <?php echo $params->get('full_name', 1) ? $language->title_native : strtoupper($language->sef); ?> </a> </li> <?php elseif ($params->get('show_active', 1)) : ?> <?php $base = Uri::getInstance(); ?> <li class="lang-active"> <a aria-current="true" <?php echo $lbl; ?> href="<?php echo htmlspecialchars_decode(htmlspecialchars($base, ENT_QUOTES, 'UTF-8'), ENT_NOQUOTES); ?>"> <?php if ($params->get('dropdownimage', 1) && ($language->image)) : ?> <?php echo HTMLHelper::_('image', 'mod_languages/' . $language->image . '.gif', $params->get('full_name') ? '' : $language->title_native, null, true); ?> <?php endif; ?> <?php echo $params->get('full_name', 1) ? $language->title_native : strtoupper($language->sef); ?> </a> </li> <?php endif; ?> <?php endforeach; ?> </ul> </div> <?php else : ?> <ul aria-labelledby="language_picker_des_<?php echo $module->id; ?>" class="mod-languages__list <?php echo $params->get('inline', 1) ? 'lang-inline' : 'lang-block'; ?>"> <?php foreach ($list as $language) : ?> <?php $lbl = ''; if ((($params->get('full_name') === 0) && ($params->get('image') === 0)) || (!$language->image)) { $lbl = 'aria-label="' . $language->title_native . '"'; } ?> <?php if (!$language->active) : ?> <li> <a <?php echo $lbl; ?> href="<?php echo htmlspecialchars_decode(htmlspecialchars($language->link, ENT_QUOTES, 'UTF-8'), ENT_NOQUOTES); ?>"> <?php if ($params->get('image', 1)) : ?> <?php if ($language->image) : ?> <?php echo HTMLHelper::_('image', 'mod_languages/' . $language->image . '.gif', $language->title_native, ['title' => $language->title_native], true); ?> <?php else : ?> <span class="label" title="<?php echo $language->title_native; ?>"><?php echo strtoupper($language->sef); ?></span> <?php endif; ?> <?php else : ?> <?php echo $params->get('full_name', 1) ? $language->title_native : strtoupper($language->sef); ?> <?php endif; ?> </a> </li> <?php elseif ($params->get('show_active', 1)) : ?> <?php $base = Uri::getInstance(); ?> <li class="lang-active"> <a aria-current="true" <?php echo $lbl; ?> href="<?php echo htmlspecialchars_decode(htmlspecialchars($base, ENT_QUOTES, 'UTF-8'), ENT_NOQUOTES); ?>"> <?php if ($params->get('image', 1)) : ?> <?php if ($language->image) : ?> <?php echo HTMLHelper::_('image', 'mod_languages/' . $language->image . '.gif', $language->title_native, ['title' => $language->title_native], true); ?> <?php else : ?> <span class="badge bg-secondary" title="<?php echo $language->title_native; ?>"><?php echo strtoupper($language->sef); ?></span> <?php endif; ?> <?php else : ?> <?php echo $params->get('full_name', 1) ? $language->title_native : strtoupper($language->sef); ?> <?php endif; ?> </a> </li> <?php endif; ?> <?php endforeach; ?> </ul> <?php endif; ?> <?php if ($footerText) : ?> <div class="mod-languages__posttext posttext"><p><?php echo $footerText; ?></p></div> <?php endif; ?> </div> PKCA#]��Y@��:system/helixultimate/overrides/plg_content_vote/rating.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); PKCA#]��Y@��8system/helixultimate/overrides/plg_content_vote/vote.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); PKCA#]Eo�JJ;system/helixultimate/overrides/mod_login/default_logout.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = \Joomla\CMS\Factory::getApplication()->getDocument()->getWebAssetManager(); $wa->useScript('keepalive'); ?> <form class="mod-login-logout form-vertical" action="<?php echo Route::_('index.php', true); ?>" method="post" id="login-form-<?php echo $module->id; ?>"> <?php if ($params->get('greeting', 1)) : ?> <div class="mod-login-logout__login-greeting login-greeting"> <?php if (!$params->get('name', 0)) : ?> <?php echo Text::sprintf('MOD_LOGIN_HINAME', htmlspecialchars($user->get('name'), ENT_COMPAT, 'UTF-8')); ?> <?php else : ?> <?php echo Text::sprintf('MOD_LOGIN_HINAME', htmlspecialchars($user->get('username'), ENT_COMPAT, 'UTF-8')); ?> <?php endif; ?> </div> <?php endif; ?> <?php if ($params->get('profilelink', 0)) : ?> <ul class="mod-login-logout__options list-unstyled"> <li> <a href="<?php echo Route::_('index.php?option=com_users&view=profile'); ?>"> <?php echo Text::_('MOD_LOGIN_PROFILE'); ?></a> </li> </ul> <?php endif; ?> <div class="mod-login-logout__button logout-button"> <button type="submit" name="Submit" class="btn btn-primary"><?php echo Text::_('JLOGOUT'); ?></button> <input type="hidden" name="option" value="com_users"> <input type="hidden" name="task" value="user.logout"> <input type="hidden" name="return" value="<?php echo $return; ?>"> <?php echo HTMLHelper::_('form.token'); ?> </div> </form> PKCA#]�+��4system/helixultimate/overrides/mod_login/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Router\Route; $app->getDocument()->getWebAssetManager() ->useScript('core') ->useScript('keepalive') ->useScript('field.passwordview'); Text::script('JSHOWPASSWORD'); Text::script('JHIDEPASSWORD'); ?> <form id="login-form-<?php echo $module->id; ?>" class="mod-login form-validate" action="<?php echo Route::_('index.php', true, (int) $params->get('usesecure')); ?>" method="post"> <?php if ($params->get('pretext')) : ?> <div class="mod-login__pretext pretext mb-2"> <p><?php echo $params->get('pretext'); ?></p> </div> <?php endif; ?> <div class="mod-login__userdata userdata "> <div class="mod-login__username form-group mb-3"> <label for="modlgn-username-<?php echo $module->id; ?>"> <?php echo Text::_('MOD_LOGIN_VALUE_USERNAME'); ?> </label> <div class="input-group"> <input id="modlgn-username-<?php echo $module->id; ?>" type="text" name="username" class="form-control" required="required" autocomplete="username"> </div> </div> <div class="mod-login__password form-group mb-3"> <label for="modlgn-passwd-<?php echo $module->id; ?>"> <?php echo Text::_('JGLOBAL_PASSWORD'); ?> </label> <div class="input-group"> <input id="modlgn-passwd-<?php echo $module->id; ?>" type="password" name="password" class="form-control input-full" required="required" autocomplete="current-password"> <button type="button" class="btn btn-secondary input-password-toggle"> <span class="icon-eye icon-fw" aria-hidden="true"></span> <span class="visually-hidden"><?php echo Text::_('JSHOWPASSWORD'); ?></span> </button> </div> </div> <!-- Remember me --> <?php if (PluginHelper::isEnabled('system', 'remember')) : ?> <div class="mod-login__remember form-group mb-3"> <div id="form-login-remember-<?php echo $module->id; ?>" class="form-check"> <input type="checkbox" name="remember" class="form-check-input" value="yes" id="form-login-input-remember-<?php echo $module->id; ?>"> <label class="form-check-label" for="form-login-input-remember-<?php echo $module->id; ?>"> <?php echo Text::_('MOD_LOGIN_REMEMBER_ME'); ?> </label> </div> </div> <?php endif; ?> <?php foreach ($extraButtons as $button) : $dataAttributeKeys = array_filter(array_keys($button), function ($key) { return substr($key, 0, 5) == 'data-'; }); ?> <div class="mod-login__submit form-group mb-3"> <button type="button" class="btn btn-secondary btn-lg w-100 <?php echo $button['class'] ?? '' ?>" <?php foreach ($dataAttributeKeys as $key) : ?> <?php echo $key ?>="<?php echo $button[$key] ?>" <?php endforeach; ?> <?php if ($button['onclick']) : ?> onclick="<?php echo $button['onclick'] ?>" <?php endif; ?> title="<?php echo Text::_($button['label']) ?>" id="<?php echo $button['id'] ?>"> <?php if (!empty($button['icon'])) : ?> <span class="<?php echo $button['icon'] ?>"></span> <?php elseif (!empty($button['image'])) : ?> <?php echo $button['image']; ?> <?php elseif (!empty($button['svg'])) : ?> <?php echo $button['svg']; ?> <?php endif; ?> <?php echo Text::_($button['label']) ?> </button> </div> <?php endforeach; ?> <div class="mod-login__submit form-group mb-3"> <button type="submit" name="Submit" id="btn-login-submit" class="btn btn-primary w-100 btn-lg"><?php echo Text::_('JLOGIN'); ?></button> </div> <?php $usersConfig = ComponentHelper::getParams('com_users'); ?> <div class="mod-login__options list-group"> <a class="mod-login__reset list-group-item" href="<?php echo Route::_('index.php?option=com_users&view=reset'); ?>"> <?php echo Text::_('MOD_LOGIN_FORGOT_YOUR_PASSWORD'); ?> </a> <a class="mod-login__remind list-group-item" href="<?php echo Route::_('index.php?option=com_users&view=remind'); ?>"> <?php echo Text::_('MOD_LOGIN_FORGOT_YOUR_USERNAME'); ?> </a> <?php if ($usersConfig->get('allowUserRegistration')) : ?> <a class="mod-login__register list-group-item" href="<?php echo Route::_('index.php?option=com_users&view=registration'); ?>"> <?php echo Text::_('MOD_LOGIN_REGISTER'); ?> <span class="icon-register" aria-hidden="true"></span> </a> <?php endif; ?> </div> <input type="hidden" name="option" value="com_users"> <input type="hidden" name="task" value="user.login"> <input type="hidden" name="return" value="<?php echo $return; ?>"> <?php echo HTMLHelper::_('form.token'); ?> </div> <?php if ($params->get('posttext')) : ?> <div class="mod-login__posttext posttext"> <p><?php echo $params->get('posttext'); ?></p> </div> <?php endif; ?> </form> PKCA#]�:6��Isystem/helixultimate/overrides/com_finder/tmpl/search/default_results.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; ?> <?php // Display the suggested search if it is different from the current search. ?> <?php if (($this->suggested && $this->params->get('show_suggested_query', 1)) || ($this->explained && $this->params->get('show_explained_query', 1))) : ?> <div id="search-query-explained"> <?php // Display the suggested search query. ?> <?php if ($this->suggested && $this->params->get('show_suggested_query', 1)) : ?> <?php // Replace the base query string with the suggested query string. ?> <?php $uri = Uri::getInstance($this->query->toUri()); ?> <?php $uri->setVar('q', $this->suggested); ?> <?php // Compile the suggested query link. ?> <?php $linkUrl = Route::_($uri->toString(array('path', 'query'))); ?> <?php $link = '<a href="' . $linkUrl . '">' . $this->escape($this->suggested) . '</a>'; ?> <?php echo Text::sprintf('COM_FINDER_SEARCH_SIMILAR', $link); ?> <?php elseif ($this->explained && $this->params->get('show_explained_query', 1)) : ?> <?php // Display the explained search query. ?> <?php echo $this->explained; ?> <?php endif; ?> </div> <?php endif; ?> <?php // Display the 'no results' message and exit the template. ?> <?php if (($this->total === 0) || ($this->total === null)) : ?> <div id="search-result-empty"> <h2><?php echo Text::_('COM_FINDER_SEARCH_NO_RESULTS_HEADING'); ?></h2> <?php $multilang = Factory::getApplication()->getLanguageFilter() ? '_MULTILANG' : ''; ?> <p><?php echo Text::sprintf('COM_FINDER_SEARCH_NO_RESULTS_BODY' . $multilang, $this->escape($this->query->input)); ?></p> </div> <?php // Exit this template. ?> <?php return; ?> <?php endif; ?> <?php // Activate the highlighter if enabled. ?> <?php if (!empty($this->query->highlight) && $this->params->get('highlight_terms', 1)) : ?> <?php HTMLHelper::_('behavior.highlighter', $this->query->highlight); ?> <?php endif; ?> <?php // Display a list of results ?> <br id="highlighter-start" /> <ul class="search-results list-striped"> <?php $this->baseUrl = Uri::getInstance()->toString(array('scheme', 'host', 'port')); ?> <?php foreach ($this->results as $result) : ?> <?php $this->result = &$result; ?> <?php $layout = $this->getLayoutFile($this->result->layout); ?> <?php echo $this->loadTemplate($layout); ?> <?php endforeach; ?> </ul> <br id="highlighter-end" /> <?php // Display the pagination ?> <div class="search-pagination"> <div class="w-100"> <?php echo $this->pagination->getPagesLinks(); ?> </div> <div class="search-pages-counter"> <?php // Prepare the pagination string. Results X - Y of Z ?> <?php $start = (int) $this->pagination->limitstart + 1; ?> <?php $total = (int) $this->pagination->total; ?> <?php $limit = (int) $this->pagination->limit * $this->pagination->pagesCurrent; ?> <?php $limit = (int) ($limit > $total ? $total : $limit); ?> <?php echo Text::sprintf('COM_FINDER_SEARCH_RESULTS_OF', $start, $limit, $total); ?> </div> </div> PKCA#]��VVHsystem/helixultimate/overrides/com_finder/tmpl/search/default_result.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Router\Route; use Joomla\String\StringHelper; // Get the mime type class. $mime = !empty($this->result->mime) ? 'mime-' . $this->result->mime : null; $show_description = $this->params->get('show_description', 1); if ($show_description) { // Calculate number of characters to display around the result $term_length = StringHelper::strlen($this->query->input); $desc_length = $this->params->get('description_length', 255); $pad_length = $term_length < $desc_length ? (int) floor(($desc_length - $term_length) / 2) : 0; // Find the position of the search term $pos = $term_length ? StringHelper::strpos(StringHelper::strtolower($this->result->description), StringHelper::strtolower($this->query->input)) : false; // Find a potential start point $start = ($pos && $pos > $pad_length) ? $pos - $pad_length : 0; // Find a space between $start and $pos, start right after it. $space = StringHelper::strpos($this->result->description, ' ', $start > 0 ? $start - 1 : 0); $start = ($space && $space < $pos) ? $space + 1 : $start; $description = HTMLHelper::_('string.truncate', StringHelper::substr($this->result->description, $start), $desc_length, true); } $route = $this->result->route; // Get the route with highlighting information. if (!empty($this->query->highlight) && empty($this->result->mime) && $this->params->get('highlight_terms', 1) && PluginHelper::isEnabled('system', 'highlight')) { $route .= '&highlight=' . base64_encode(json_encode($this->query->highlight)); } ?> <li> <h4 class="result-title <?php echo $mime; ?>"> <a href="<?php echo Route::_($route); ?>"> <?php echo $this->result->title; ?> </a> </h4> <?php if ($show_description && $description !== '') : ?> <p class="result-text"> <?php echo $description; ?> </p> <?php endif; ?> </li> PKCA#]� {w��Asystem/helixultimate/overrides/com_finder/tmpl/search/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; if(JVERSION < 4) { HTMLHelper::_('behavior.core'); HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers/html'); HTMLHelper::_('stylesheet', 'com_finder/finder.css', array('version' => 'auto', 'relative' => true)); HTMLHelper::_('stylesheet', 'vendor/awesomplete/awesomplete.css', array('version' => 'auto', 'relative' => true)); Text::script('MOD_FINDER_SEARCH_VALUE', true); HTMLHelper::_('script', 'com_finder/finder.js', array('version' => 'auto', 'relative' => true)); } else { $this->document->getWebAssetManager() ->useStyle('com_finder.finder') ->useScript('com_finder.finder'); } ?> <div class="finder"> <?php if ($this->params->get('show_page_heading')) : ?> <h1> <?php if ($this ->escape($this->params->get('page_heading'))) : ?> <?php echo $this->escape($this->params->get('page_heading')); ?> <?php else : ?> <?php echo $this->escape($this->params->get('page_title')); ?> <?php endif; ?> </h1> <?php endif; ?> <?php if ($this->params->get('show_search_form', 1)) : ?> <div id="search-form"> <?php echo $this->loadTemplate('form'); ?> </div> <?php endif; ?> <?php // Load the search results layout if we are performing a search. ?> <?php if ($this->query->search === true) : ?> <div id="search-results"> <?php echo $this->loadTemplate('results'); ?> </div> <?php endif; ?> </div> PKCA#]�!��Fsystem/helixultimate/overrides/com_finder/tmpl/search/default_form.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; if (JVERSION < 4) { if ($this->params->get('show_advanced', 1) || $this->params->get('show_autosuggest', 1)) { HTMLHelper::_('jquery.framework'); $script = " jQuery(function() {"; if ($this->params->get('show_advanced', 1)) { /* * This segment of code disables select boxes that have no value when the * form is submitted so that the URL doesn't get blown up with null values. */ $script .= " jQuery('#finder-search').on('submit', function(e){ e.stopPropagation(); // Disable select boxes with no value selected. jQuery('#advancedSearch').find('select').each(function(index, el) { var el = jQuery(el); if(!el.val()){ el.attr('disabled', 'disabled'); } }); });"; } /* * This segment of code sets up the autocompleter. */ if ($this->params->get('show_autosuggest', 1)) { HTMLHelper::_('script', 'jui/jquery.autocomplete.min.js', array('version' => 'auto', 'relative' => true)); $script .= " var suggest = jQuery('#q').autocomplete({ serviceUrl: '" . Route::_('index.php?option=com_finder&task=suggestions.suggest&format=json&tmpl=component') . "', paramName: 'q', minChars: 1, maxHeight: 400, width: 300, zIndex: 9999, deferRequestBy: 500 });"; } $script .= " });"; Factory::getDocument()->addScriptDeclaration($script); } } else { if ($this->params->get('show_autosuggest', 1)) { $this->document->getWebAssetManager()->usePreset('awesomplete'); $this->document->addScriptOptions('finder-search', array('url' => Route::_('index.php?option=com_finder&task=suggestions.suggest&format=json&tmpl=component'))); } } ?> <form action="<?php echo Route::_($this->query->toUri()); ?>" id="finder-search" method="get" class="js-finder-searchform"> <?php echo $this->getFields(); ?> <?php //DISABLED UNTIL WEIRD VALUES CAN BE TRACKED DOWN. ?> <?php if (false && $this->state->get('list.ordering') !== 'relevance_dsc') : ?> <input type="hidden" name="o" value="<?php echo $this->escape($this->state->get('list.ordering')); ?>"> <?php endif; ?> <fieldset class="word mb-3"> <label for="q" class="form-label"> <?php echo Text::_('COM_FINDER_SEARCH_TERMS'); ?> </label> <div class="input-group"> <input type="text" id="q" name="q" class="js-finder-search-query form-control" value="<?php echo $this->escape($this->query->input); ?>"> <?php if ($this->escape($this->query->input) != '' || $this->params->get('allow_empty_query')) : ?> <button name="Search" type="submit" class="btn btn-primary"> <span class="fas fa-search icon-white" aria-hidden="true"></span> <?php echo Text::_('JSEARCH_FILTER_SUBMIT'); ?> </button> <?php else : ?> <button name="Search" type="submit" class="btn btn-primary disabled"> <span class="fas fa-search icon-white" aria-hidden="true"></span> <?php echo Text::_('JSEARCH_FILTER_SUBMIT'); ?> </button> <?php endif; ?> <?php if ($this->params->get('show_advanced', 1)) : ?> <a class="btn btn-secondary" data-bs-toggle="collapse" href="#advancedSearch" role="button" aria-expanded="false" aria-controls="advancedSearch"> <span class="fas fa-search-plus" aria-hidden="true"></span> <?php echo Text::_('COM_FINDER_ADVANCED_SEARCH_TOGGLE'); ?> </a> <?php endif; ?> </div> </fieldset> <?php if ($this->params->get('show_advanced', 1)) : ?> <div id="advancedSearch" class="js-finder-advanced collapse<?php if ($this->params->get('expand_advanced', 0)) echo ' show'; ?>"> <?php if ($this->params->get('show_advanced_tips', 1)) : ?> <div class="card card-outline-secondary mb-3"> <div class="card-body"> <?php echo Text::_('COM_FINDER_ADVANCED_TIPS'); ?> </div> </div> <?php endif; ?> <div id="finder-filter-window"> <?php echo HTMLHelper::_('filter.select', $this->query, $this->params); ?> </div> </div> <?php endif; ?> </form>PKCA#]i����<system/helixultimate/overrides/com_finder/search/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; $this->document->getWebAssetManager() ->useStyle('com_finder.finder') ->useScript('com_finder.finder'); ?> <div class="com-finder finder"> <?php if ($this->params->get('show_page_heading')) : ?> <h1> <?php if ($this->escape($this->params->get('page_heading'))) : ?> <?php echo $this->escape($this->params->get('page_heading')); ?> <?php else : ?> <?php echo $this->escape($this->params->get('page_title')); ?> <?php endif; ?> </h1> <?php endif; ?> <div id="search-form" class="com-finder__form"> <?php echo $this->loadTemplate('form'); ?> </div> <?php // Load the search results layout if we are performing a search. ?> <?php if ($this->query->search === true) : ?> <div id="search-results" class="com-finder__results"> <?php echo $this->loadTemplate('results'); ?> </div> <?php endif; ?> </div> PKCA#]�ە��Csystem/helixultimate/overrides/com_finder/search/default_result.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Multilanguage; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Finder\Administrator\Helper\LanguageHelper; use Joomla\Component\Finder\Administrator\Indexer\Helper; use Joomla\Component\Finder\Administrator\Indexer\Taxonomy; use Joomla\String\StringHelper; $user = $this->getCurrentUser(); $show_description = $this->params->get('show_description', 1); if ($show_description) { // Calculate number of characters to display around the result $term_length = StringHelper::strlen($this->query->input); $desc_length = $this->params->get('description_length', 255); $pad_length = $term_length < $desc_length ? (int) floor(($desc_length - $term_length) / 2) : 0; // Make sure we highlight term both in introtext and fulltext $full_description = $this->result->description; if (!empty($this->result->summary) && !empty($this->result->body)) { $full_description = Helper::parse($this->result->summary . $this->result->body); } // Find the position of the search term $pos = $term_length ? StringHelper::strpos(StringHelper::strtolower($full_description), StringHelper::strtolower($this->query->input)) : false; // Find a potential start point $start = ($pos && $pos > $pad_length) ? $pos - $pad_length : 0; // Find a space between $start and $pos, start right after it. $space = StringHelper::strpos($full_description, ' ', $start > 0 ? $start - 1 : 0); $start = ($space && $space < $pos) ? $space + 1 : $start; $description = HTMLHelper::_('string.truncate', StringHelper::substr($full_description, $start), $desc_length, true); } $showImage = $this->params->get('show_image', 0); $imageClass = $this->params->get('image_class', ''); $extraAttr = []; if ($showImage && !empty($this->result->imageUrl) && $imageClass !== '') { $extraAttr['class'] = $imageClass; } $icon = ''; if (!empty($this->result->mime)) { $icon = '<span class="icon-file-' . $this->result->mime . '" aria-hidden="true"></span> '; } $show_url = ''; if ($this->params->get('show_url', 1)) { $show_url = '<cite class="result__title-url">' . $this->baseUrl . Route::_($this->result->cleanURL) . '</cite>'; } ?> <li class="result__item"> <?php if ($showImage && isset($this->result->imageUrl)) : ?> <figure class="<?php echo htmlspecialchars($imageClass, ENT_COMPAT, 'UTF-8'); ?> result__image"> <?php if ($this->params->get('link_image') && $this->result->route) : ?> <a href="<?php echo Route::_($this->result->route); ?>"> <?php echo HTMLHelper::_('image', $this->result->imageUrl, $this->result->imageAlt, $extraAttr); ?> </a> <?php else : ?> <?php echo HTMLHelper::_('image', $this->result->imageUrl, $this->result->imageAlt, $extraAttr); ?> <?php endif; ?> </figure> <?php endif; ?> <p class="result__title"> <?php if ($this->result->route) : ?> <?php echo HTMLHelper::link( Route::_($this->result->route), '<span class="result__title-text">' . $icon . $this->result->title . '</span>' . $show_url, [ 'class' => 'result__title-link' ] ); ?> <?php else : ?> <?php echo $this->result->title; ?> <?php endif; ?> </p> <?php if ($show_description && $description !== '') : ?> <p class="result__description"> <?php if ($this->result->start_date && $this->params->get('show_date', 1)) : ?> <time class="result__date" datetime="<?php echo HTMLHelper::_('date', $this->result->start_date, 'c'); ?>"> <?php echo HTMLHelper::_('date', $this->result->start_date, Text::_('DATE_FORMAT_LC3')); ?> </time> <?php endif; ?> <?php echo $description; ?> </p> <?php endif; ?> <?php $taxonomies = $this->result->getTaxonomy(); ?> <?php if (count($taxonomies) && $this->params->get('show_taxonomy', 1)) : ?> <ul class="result__taxonomy"> <?php foreach ($taxonomies as $type => $taxonomy) : ?> <?php if ($type == 'Language' && (!Multilanguage::isEnabled() || (isset($taxonomy[0]) && $taxonomy[0]->title == '*'))) : ?> <?php continue; ?> <?php endif; ?> <?php $branch = Taxonomy::getBranch($type); ?> <?php if ($branch->state == 1 && in_array($branch->access, $user->getAuthorisedViewLevels())) : ?> <?php $taxonomy_text = []; ?> <?php foreach ($taxonomy as $node) : ?> <?php if ($node->state == 1 && in_array($node->access, $user->getAuthorisedViewLevels())) : ?> <?php $taxonomy_text[] = $node->title; ?> <?php endif; ?> <?php endforeach; ?> <?php if (count($taxonomy_text)) : ?> <li class="result__taxonomy-item result__taxonomy--<?php echo $type; ?>"> <span><?php echo Text::_(LanguageHelper::branchSingular($type)); ?>:</span> <?php echo Text::_(LanguageHelper::branchSingular(implode(',', $taxonomy_text))); ?> </li> <?php endif; ?> <?php endif; ?> <?php endforeach; ?> </ul> <?php endif; ?> </li> PKCA#]���!77Dsystem/helixultimate/overrides/com_finder/search/default_results.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; ?> <?php // Display the suggested search if it is different from the current search. ?> <?php if (($this->suggested && $this->params->get('show_suggested_query', 1)) || ($this->explained && $this->params->get('show_explained_query', 1))) : ?> <div id="search-query-explained" class="com-finder__explained"> <?php // Display the suggested search query. ?> <?php if ($this->suggested && $this->params->get('show_suggested_query', 1)) : ?> <?php // Replace the base query string with the suggested query string. ?> <?php $uri = Uri::getInstance($this->query->toUri()); ?> <?php $uri->setVar('q', $this->suggested); ?> <?php // Compile the suggested query link. ?> <?php $linkUrl = Route::_($uri->toString(['path', 'query'])); ?> <?php $link = '<a href="' . $linkUrl . '">' . $this->escape($this->suggested) . '</a>'; ?> <?php echo Text::sprintf('COM_FINDER_SEARCH_SIMILAR', $link); ?> <?php elseif ($this->explained && $this->params->get('show_explained_query', 1)) : ?> <?php // Display the explained search query. ?> <p role="alert"> <?php echo Text::plural('COM_FINDER_QUERY_RESULTS', $this->total, $this->explained); ?> </p> <?php endif; ?> </div> <?php endif; ?> <?php // Display the 'no results' message and exit the template. ?> <?php if (($this->total === 0) || ($this->total === null)) : ?> <div id="search-result-empty" class="com-finder__empty"> <h2><?php echo Text::_('COM_FINDER_SEARCH_NO_RESULTS_HEADING'); ?></h2> <?php $multilang = Factory::getApplication()->getLanguageFilter() ? '_MULTILANG' : ''; ?> <p><?php echo Text::sprintf('COM_FINDER_SEARCH_NO_RESULTS_BODY' . $multilang, $this->escape($this->query->input)); ?></p> </div> <?php // Exit this template. ?> <?php return; ?> <?php endif; ?> <?php // Display the 'Sort By' drop-down. ?> <?php if ($this->params->get('show_sort_order', 0) && !empty($this->sortOrderFields) && !empty($this->results)) : ?> <div id="search-sorting" class="com-finder__sorting"> <?php echo $this->loadTemplate('sorting'); ?> </div> <?php endif; ?> <?php // Activate the highlighter if enabled. ?> <?php if (!empty($this->query->highlight) && $this->params->get('highlight_terms', 1)) : ?> <?php // Allow a maximum of 10 tokens to be highlighted. Otherwise the URL can get too long. $this->document->getWebAssetManager()->useScript('highlight'); $this->document->addScriptOptions( 'highlight', [[ 'class' => 'js-highlight', 'highLight' => array_slice($this->query->highlight, 0, 10), ]] ); ?> <?php endif; ?> <?php // Display a list of results ?> <ul id="search-result-list" class="js-highlight com-finder__results-list" start="<?php echo (int) $this->pagination->limitstart + 1; ?>"> <?php $this->baseUrl = Uri::getInstance()->toString(['scheme', 'host', 'port']); ?> <?php foreach ($this->results as $i => $result) : ?> <?php $this->result = &$result; ?> <?php $this->result->counter = $i + 1; ?> <?php $layout = $this->getLayoutFile($this->result->layout); ?> <?php echo $this->loadTemplate($layout); ?> <?php endforeach; ?> </ul> <?php // Display the pagination ?> <div class="com-finder__navigation search-pagination"> <?php if ($this->params->get('show_pagination', 1) > 0) : ?> <div class="com-finder__pagination w-100"> <?php echo $this->pagination->getPagesLinks(); ?> </div> <?php endif; ?> <?php if ($this->params->get('show_pagination_results', 1) > 0) : ?> <div class="com-finder__counter search-pages-counter"> <?php // Prepare the pagination string. Results X - Y of Z ?> <?php $start = (int) $this->pagination->limitstart + 1; ?> <?php $total = (int) $this->pagination->total; ?> <?php $limit = (int) $this->pagination->limit * $this->pagination->pagesCurrent; ?> <?php $limit = (int) min($limit, $total); ?> <?php echo Text::sprintf('COM_FINDER_SEARCH_RESULTS_OF', $start, $limit, $total); ?> </div> <?php endif; ?> </div> PKCA#]ձ��ppAsystem/helixultimate/overrides/com_finder/search/default_form.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; /* * This segment of code sets up the autocompleter. */ if ($this->params->get('show_autosuggest', 1)) { $this->document->getWebAssetManager()->usePreset('awesomplete'); $this->document->addScriptOptions('finder-search', ['url' => Route::_('index.php?option=com_finder&task=suggestions.suggest&format=json&tmpl=component', false)]); Text::script('JLIB_JS_AJAX_ERROR_OTHER'); Text::script('JLIB_JS_AJAX_ERROR_PARSE'); } ?> <form action="<?php echo Route::_($this->query->toUri()); ?>" method="get" class="js-finder-searchform"> <?php echo $this->getFields(); ?> <fieldset class="com-finder__search word mb-3"> <legend class="com-finder__search-legend visually-hidden"> <?php echo Text::_('COM_FINDER_SEARCH_FORM_LEGEND'); ?> </legend> <div class="form-inline"> <label for="q" class="me-2"> <?php echo Text::_('COM_FINDER_SEARCH_TERMS'); ?> </label> <div class="input-group"> <input type="text" name="q" id="q" class="js-finder-search-query form-control" value="<?php echo $this->escape($this->query->input); ?>"> <button type="submit" class="btn btn-primary"> <span class="icon-search icon-white" aria-hidden="true"></span> <?php echo Text::_('JSEARCH_FILTER_SUBMIT'); ?> </button> <?php if ($this->params->get('show_advanced', 1)) : ?> <?php HTMLHelper::_('bootstrap.collapse'); ?> <button class="btn btn-secondary" type="button" data-bs-toggle="collapse" data-bs-target="#advancedSearch" aria-expanded="<?php echo ($this->params->get('expand_advanced', 0) ? 'true' : 'false'); ?>"> <span class="icon-search-plus" aria-hidden="true"></span> <?php echo Text::_('COM_FINDER_ADVANCED_SEARCH_TOGGLE'); ?></button> <?php endif; ?> </div> </div> </fieldset> <?php if ($this->params->get('show_advanced', 1)) : ?> <fieldset id="advancedSearch" class="com-finder__advanced js-finder-advanced collapse<?php if ($this->params->get('expand_advanced', 0)) { echo ' show'; } ?>"> <legend class="com-finder__search-advanced visually-hidden"> <?php echo Text::_('COM_FINDER_SEARCH_ADVANCED_LEGEND'); ?> </legend> <?php if ($this->params->get('show_advanced_tips', 1)) : ?> <div class="com-finder__tips card card-outline-secondary mb-3"> <div class="card-body"> <?php echo Text::_('COM_FINDER_ADVANCED_TIPS_INTRO'); ?> <?php echo Text::_('COM_FINDER_ADVANCED_TIPS_AND'); ?> <?php echo Text::_('COM_FINDER_ADVANCED_TIPS_NOT'); ?> <?php echo Text::_('COM_FINDER_ADVANCED_TIPS_OR'); ?> <?php if ($this->params->get('tuplecount', 1) > 1) : ?> <?php echo Text::_('COM_FINDER_ADVANCED_TIPS_PHRASE'); ?> <?php endif; ?> <?php echo Text::_('COM_FINDER_ADVANCED_TIPS_OUTRO'); ?> </div> </div> <?php endif; ?> <div id="finder-filter-window" class="com-finder__filter"> <?php echo HTMLHelper::_('filter.select', $this->query, $this->params); ?> </div> </fieldset> <?php endif; ?> </form> PKCA#]����\\Dsystem/helixultimate/overrides/com_finder/search/default_sorting.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; ?> <?php HTMLHelper::_('bootstrap.dropdown', '.dropdown-toggle'); ?> <div class="sorting"> <label id="sorting_label" for="sorting_btn"><?php echo Text::_('COM_FINDER_SORT_BY'); ?></label> <div class="sorting__select btn-group"> <?php foreach ($this->sortOrderFields as $sortOrderField) : ?> <?php if ($sortOrderField->active) : ?> <button id="sorting_btn" class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-haspopup="listbox" aria-expanded="false" aria-controls="finder_sorting_list"> <?php echo $this->escape($sortOrderField->label); ?> </button> <?php break; endif; ?> <?php endforeach; ?> <ul id="finder_sorting_list" class="sorting__list block dropdown-menu" role="listbox" aria-labelledby="finder_sorting_desc"> <?php foreach ($this->sortOrderFields as $sortOrderField) : ?> <li class="sorting__list-li <?php echo $sortOrderField->active ? 'sorting__list-li-active' : ''; ?>"> <a class="dropdown-item" role="option" href="<?php echo Route::_($sortOrderField->url);?>" <?php echo $sortOrderField->active ? 'aria-current="true"' : ''; ?>> <?php echo $this->escape($sortOrderField->label); ?> </a> </li> <?php endforeach; ?> </ul> </div> <div class="clearfix"></div> </div> PKCA#]]�"@/@/Dsystem/helixultimate/overrides/com_content/archive/default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Content\Site\Helper\RouteHelper; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); $params = $this->params; ?> <div id="archive-items" class="com-content-archive__items"> <?php foreach ($this->items as $i => $item) : ?> <?php $info = $item->params->get('info_block_position', 0); $useDefList = ( $params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date') || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') ); ?> <div class="row<?php echo $i % 2; ?>" itemscope itemtype="https://schema.org/Article"> <div class="page-header"> <h2 itemprop="headline"> <?php if ($params->get('link_titles')) : ?> <a href="<?php echo Route::_(RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language)); ?>" itemprop="url"> <?php echo $this->escape($item->title); ?> </a> <?php else : ?> <?php echo $this->escape($item->title); ?> <?php endif; ?> </h2> <?php // onContentAfterTitle ?> <?php echo $item->event->afterDisplayTitle; ?> <?php if ($params->get('show_author') && !empty($item->author)) : ?> <div class="createdby" itemprop="author" itemscope itemtype="https://schema.org/Person"> <?php $authorName = $item->created_by_alias ?: $item->author; $authorHtml = '<span itemprop="name">' . htmlspecialchars($authorName, ENT_COMPAT, 'UTF-8') . '</span>'; ?> <?php if (!empty($item->contact_link) && $params->get('link_author')) : ?> <?php echo Text::sprintf( 'COM_CONTENT_WRITTEN_BY', HTMLHelper::_('link', $item->contact_link, $authorHtml, ['itemprop' => 'url']) ); ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_WRITTEN_BY', $authorHtml); ?> <?php endif; ?> </div> <?php endif; ?> </div> <?php if ($useDefList && ($info == 0 || $info == 2)) : ?> <div class="article-info"> <?php if ($params->get('show_parent_category') && !empty($item->parent_id)) : ?> <span class="parent-category-name"> <?php $title = $this->escape($item->parent_title); ?> <?php if ($params->get('link_parent_category') && !empty($item->parent_id)) : ?> <?php $url = '<a href="' . Route::_(RouteHelper::getCategoryRoute($item->parent_id, $item->parent_language)) . '">' . $title . '</a>'; ?> <?php echo Text::sprintf('COM_CONTENT_PARENT', $url); ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_PARENT', '<span itemprop="genre">' . $title . '</span>'); ?> <?php endif; ?> </span> <?php endif; ?> <?php if ($params->get('show_category')) : ?> <span class="category-name"> <?php $title = $this->escape($item->category_title); ?> <?php if ($params->get('link_category') && $item->catid) : ?> <?php $url = '<a href="' . Route::_(RouteHelper::getCategoryRoute($item->catid, $item->category_language)) . '" itemprop="genre">' . $title . '</a>'; ?> <?php echo Text::sprintf('COM_CONTENT_CATEGORY', $url); ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_CATEGORY', '<span itemprop="genre">' . $title . '</span>'); ?> <?php endif; ?> </span> <?php endif; ?> <?php if ($params->get('show_publish_date')) : ?> <span class="published"> <time datetime="<?php echo HTMLHelper::_('date', $item->publish_up, 'c'); ?>" itemprop="datePublished"> <?php echo Text::sprintf('COM_CONTENT_PUBLISHED_DATE_ON', HTMLHelper::_('date', $item->publish_up, Text::_('DATE_FORMAT_LC3'))); ?> </time> </span> <?php endif; ?> <?php if ($info == 0) : ?> <?php if ($params->get('show_modify_date')) : ?> <span class="modified"> <time datetime="<?php echo HTMLHelper::_('date', $item->modified, 'c'); ?>" itemprop="dateModified"> <?php echo Text::sprintf('COM_CONTENT_LAST_UPDATED', HTMLHelper::_('date', $item->modified, Text::_('DATE_FORMAT_LC3'))); ?> </time> </span> <?php endif; ?> <?php if ($params->get('show_create_date')) : ?> <span class="create"> <time datetime="<?php echo HTMLHelper::_('date', $item->created, 'c'); ?>" itemprop="dateCreated"> <?php echo Text::sprintf('COM_CONTENT_CREATED_DATE_ON', HTMLHelper::_('date', $item->created, Text::_('DATE_FORMAT_LC3'))); ?> </time> </span> <?php endif; ?> <?php if ($params->get('show_hits')) : ?> <span class="hits"> <meta content="UserPageVisits:<?php echo (int) $item->hits; ?>" itemprop="interactionCount"> <?php echo Text::sprintf('COM_CONTENT_ARTICLE_HITS', (int) $item->hits); ?> </span> <?php endif; ?> <?php endif; ?> </div> <?php endif; ?> <?php // onContentBeforeDisplay ?> <?php echo $item->event->beforeDisplayContent; ?> <?php if ($params->get('show_intro')) : ?> <div class="intro" itemprop="articleBody"> <?php echo HTMLHelper::_('string.truncateComplex', $item->introtext, $params->get('introtext_limit')); ?> </div> <?php endif; ?> <?php if ($useDefList && ($info == 1 || $info == 2)) : ?> <div class="article-info"> <?php if ($info == 1) : ?> <?php if ($params->get('show_parent_category') && !empty($item->parent_id)) : ?> <span class="parent-category-name"> <?php $title = $this->escape($item->parent_title); ?> <?php if ($params->get('link_parent_category') && $item->parent_id) : ?> <?php $url = '<a href="' . Route::_(RouteHelper::getCategoryRoute($item->parent_id, $item->parent_language)) . '" itemprop="genre">' . $title . '</a>'; ?> <?php echo Text::sprintf('COM_CONTENT_PARENT', $url); ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_PARENT', '<span itemprop="genre">' . $title . '</span>'); ?> <?php endif; ?> </span> <?php endif; ?> <?php if ($params->get('show_category')) : ?> <span class="category-name"> <?php $title = $this->escape($item->category_title); ?> <?php if ($params->get('link_category') && $item->catid) : ?> <?php $url = '<a href="' . Route::_(RouteHelper::getCategoryRoute($item->catid, $item->category_language)) . '" itemprop="genre">' . $title . '</a>'; ?> <?php echo Text::sprintf('COM_CONTENT_CATEGORY', $url); ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_CATEGORY', '<span itemprop="genre">' . $title . '</span>'); ?> <?php endif; ?> </span> <?php endif; ?> <?php if ($params->get('show_publish_date')) : ?> <span class="published"> <time datetime="<?php echo HTMLHelper::_('date', $item->publish_up, 'c'); ?>" itemprop="datePublished"> <?php echo Text::sprintf('COM_CONTENT_PUBLISHED_DATE_ON', HTMLHelper::_('date', $item->publish_up, Text::_('DATE_FORMAT_LC3'))); ?> </time> </span> <?php endif; ?> <?php endif; ?> <?php if ($params->get('show_create_date')) : ?> <span class="create"> <time datetime="<?php echo HTMLHelper::_('date', $item->created, 'c'); ?>" itemprop="dateCreated"> <?php echo Text::sprintf('COM_CONTENT_CREATED_DATE_ON', HTMLHelper::_('date', $item->created, Text::_('DATE_FORMAT_LC3'))); ?> </time> </span> <?php endif; ?> <?php if ($params->get('show_modify_date')) : ?> <span class="modified"> <time datetime="<?php echo HTMLHelper::_('date', $item->modified, 'c'); ?>" itemprop="dateModified"> <?php echo Text::sprintf('COM_CONTENT_LAST_UPDATED', HTMLHelper::_('date', $item->modified, Text::_('DATE_FORMAT_LC3'))); ?> </time> </span> <?php endif; ?> <?php if ($params->get('show_hits')) : ?> <span class="hits"> <meta content="UserPageVisits:<?php echo (int) $item->hits; ?>" itemprop="interactionCount"> <?php echo Text::sprintf('COM_CONTENT_ARTICLE_HITS', (int) $item->hits); ?> </span> <?php endif; ?> </dl> </div> <?php endif; ?> <?php // onContentAfterDisplay ?> <?php echo $item->event->afterDisplayContent; ?> </div> <?php endforeach; ?> </div> <?php if (($params->def('show_pagination', 1) == 1 || ($params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> <nav class="pagination-wrapper d-lg-flex justify-content-between w-100"> <?php echo $this->pagination->getPagesLinks(); ?> <?php if ($params->def('show_pagination_results', 1)) : ?> <div class="pagination-counter text-muted mb-4"> <?php echo $this->pagination->getPagesCounter(); ?> </div> <?php endif; ?> </nav> <?php endif; ?>PKCA#]�Шhh>system/helixultimate/overrides/com_content/archive/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); $params = $this->params; ?> <div class="archive<?php echo $this->pageclass_sfx; ?>"> <?php if ($params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <form id="adminForm" action="<?php echo Route::_('index.php'); ?>" method="post"> <fieldset class="filters"> <legend class="visually-hidden"> <?php echo Text::_('COM_CONTENT_FORM_FILTER_LEGEND'); ?> </legend> <div class="filter-search row g-3 align-items-center mb-4"> <?php if ($params->get('filter_field') !== 'hide') : ?> <div class="col-auto"> <label class="filter-search-lbl visually-hidden" for="filter-search"> <?php echo Text::_('COM_CONTENT_TITLE_FILTER_LABEL'); ?> </label> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->filter); ?>" class="form-control inputbox col-lg-2" onchange="document.getElementById('adminForm').submit();" placeholder="<?php echo Text::_('COM_CONTENT_TITLE_FILTER_LABEL'); ?>"> </div> <?php endif; ?> <div class="col-auto"> <label class="visually-hidden" for="month"><?php echo Text::_('JMONTH'); ?></label> <?php echo $this->form->monthField; ?> </div> <div class="col-auto"> <label class="visually-hidden" for="year"><?php echo Text::_('JYEAR'); ?></label> <?php echo $this->form->yearField; ?> </div> <div class="col-auto"> <label class="visually-hidden" for="limit"><?php echo Text::_('JGLOBAL_DISPLAY_NUM'); ?></label> <?php echo $this->form->limitField; ?> </div> <div class="col-auto"> <button type="submit" class="btn btn-primary"> <?php echo Text::_('JGLOBAL_FILTER_BUTTON'); ?> </button> </div> <input type="hidden" name="view" value="archive"> <input type="hidden" name="option" value="com_content"> <input type="hidden" name="limitstart" value="0"> </div> </fieldset> <?php echo $this->loadTemplate('items'); ?> </form> </div> PKCA#]>B2<Dsystem/helixultimate/overrides/com_content/article/default_links.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; // Create shortcut $urls = json_decode($this->item->urls); // Create shortcuts to some parameters. $params = $this->item->params; if ($urls && (!empty($urls->urla) || !empty($urls->urlb) || !empty($urls->urlc))) : ?> <div class="com-content-article__links content-links"> <ul class="com-content-article__links content-list"> <?php $urlarray = [ [$urls->urla, $urls->urlatext, $urls->targeta, 'a'], [$urls->urlb, $urls->urlbtext, $urls->targetb, 'b'], [$urls->urlc, $urls->urlctext, $urls->targetc, 'c'] ]; foreach ($urlarray as $url) : $link = $url[0]; $label = $url[1]; $target = $url[2]; $id = $url[3]; if (! $link) : continue; endif; // If no label is present, take the link $label = $label ?: $link; // If no target is present, use the default $target = $target ?: $params->get('target' . $id); ?> <li class="com-content-article__link content-links-<?php echo $id; ?>"> <?php // Compute the correct link switch ($target) { case 1: // Open in a new window echo '<a href="' . htmlspecialchars($link, ENT_COMPAT, 'UTF-8') . '" target="_blank" rel="nofollow noopener noreferrer">' . htmlspecialchars($label, ENT_COMPAT, 'UTF-8') . '</a>'; break; case 2: // Open in a popup window $attribs = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=600,height=600'; echo "<a href=\"" . htmlspecialchars($link, ENT_COMPAT, 'UTF-8') . "\" onclick=\"window.open(this.href, 'targetWindow', '" . $attribs . "'); return false;\" rel=\"noopener noreferrer\">" . htmlspecialchars($label, ENT_COMPAT, 'UTF-8') . '</a>'; break; case 3: echo '<a href="' . htmlspecialchars($link, ENT_COMPAT, 'UTF-8') . '" rel="noopener noreferrer" data-bs-toggle="modal" data-bs-target="#linkModal">' . htmlspecialchars($label, ENT_COMPAT, 'UTF-8') . ' </a>'; echo HTMLHelper::_( 'bootstrap.renderModal', 'linkModal', [ 'url' => $link, 'title' => $label, 'height' => '100%', 'width' => '100%', 'modalWidth' => '500', 'bodyHeight' => '500', 'footer' => '<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" aria-hidden="true">' . \Joomla\CMS\Language\Text::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>' ] ); break; default: // Open in parent window echo '<a href="' . htmlspecialchars($link, ENT_COMPAT, 'UTF-8') . '" rel="nofollow">' . htmlspecialchars($label, ENT_COMPAT, 'UTF-8') . ' </a>'; break; } ?></li> <?php endforeach; ?> </ul> </div> <?php endif; ?> PKCA#]|W� + +>system/helixultimate/overrides/com_content/article/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Associations; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\Component\Content\Administrator\Extension\ContentComponent; use Joomla\Component\Content\Site\Helper\RouteHelper; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); $tmplParams = null; if (class_exists('HelixUltimate\\Framework\\Platform\\Helper')) { $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $tmplParams = $template ? ($template->params ?? null) : null; } $relatedArticles = []; if ($tmplParams && $tmplParams->get('related_article')) { $args = [ 'catId' => $this->item->catid, 'maximum' => (int) $tmplParams->get('related_article_limit'), 'itemTags' => $this->item->tags->itemTags ?? [], 'item_id' => $this->item->id, ]; if (class_exists('HelixUltimate\\Framework\\Core\\HelixUltimate')) { $relatedArticles = HelixUltimate\Framework\Core\HelixUltimate::getRelatedArticles($args); } } // Shortcuts $params = $this->item->params; $images = json_decode($this->item->images ?? ''); $urls = json_decode($this->item->urls ?? ''); $attribs = json_decode($this->item->attribs ?? ''); $canEdit = (bool) $params->get('access-edit'); $user = Factory::getUser(); $currentDate = Factory::getDate()->format('Y-m-d H:i:s'); $info = (int) $params->get('info_block_position', 0); $pageHeaderTag = $this->params->get('show_page_heading') ? 'h2' : 'h1'; $articleFormat = (!empty($attribs->helix_ultimate_article_format)) ? $attribs->helix_ultimate_article_format : 'standard'; $assocParam = (Associations::isEnabled() && $params->get('show_associations')); // State badges $isUnpublished = ($this->item->state == ContentComponent::CONDITION_UNPUBLISHED); $isNotPublishedYet = ($this->item->publish_up > $currentDate); $isExpired = !is_null($this->item->publish_down) && ($this->item->publish_down < $currentDate); // Deflist decision $useDefList = ( $params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date') || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam ); ?> <div class="article-details <?php echo $this->pageclass_sfx; ?>" itemscope itemtype="https://schema.org/Article"> <meta itemprop="inLanguage" content="<?php echo ($this->item->language === '*') ? Factory::getConfig()->get('language') : $this->item->language; ?>"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1><?php echo $this->escape($this->params->get('page_heading')); ?></h1> </div> <?php $pageHeaderTag = 'h2'; ?> <?php endif; ?> <?php if (!empty($this->item->pagination) && $this->item->pagination && !$this->item->paginationposition && $this->item->paginationrelative) { echo $this->item->pagination; } ?> <?php switch ($articleFormat) { case 'gallery': echo LayoutHelper::render('joomla.content.blog.gallery', ['attribs' => $attribs, 'id' => $this->item->id]); break; case 'video': echo LayoutHelper::render('joomla.content.blog.video', ['attribs' => $attribs]); break; case 'audio': echo LayoutHelper::render('joomla.content.blog.audio', ['attribs' => $attribs]); break; default: echo LayoutHelper::render('joomla.content.full_image', $this->item); break; } ?> <?php if ($this->item->featured) : ?> <span class="badge bg-danger featured-article-badge"><?php echo Text::_('HELIX_ULTIMATE_FEATURED'); ?></span> <?php endif; ?> <?php if ($params->get('show_title') || $params->get('show_author')) : ?> <div class="article-header"> <?php if ($params->get('show_title')) : ?> <<?php echo $pageHeaderTag; ?> itemprop="headline"> <?php echo $this->escape($this->item->title); ?> </<?php echo $pageHeaderTag; ?>> <?php endif; ?> <?php if ($isUnpublished) : ?> <span class="badge bg-warning text-dark"><?php echo Text::_('JUNPUBLISHED'); ?></span> <?php endif; ?> <?php if ($isNotPublishedYet) : ?> <span class="badge bg-warning text-dark"><?php echo Text::_('JNOTPUBLISHEDYET'); ?></span> <?php endif; ?> <?php if ($isExpired) : ?> <span class="badge bg-warning text-dark mb-2"><?php echo Text::_('JEXPIRED'); ?></span> <?php endif; ?> </div> <?php endif; ?> <div class="article-can-edit d-flex flex-wrap justify-content-between"> <?php ?> <?php echo $this->item->event->afterDisplayTitle; ?> <?php if ($canEdit && empty($this->print)) : ?> <?php echo HTMLHelper::_('icon.edit', $this->item, $params); ?> <?php endif; ?> </div> <?php if ($useDefList && ($info == 0 || $info == 2)) : ?> <?php echo LayoutHelper::render('joomla.content.info_block', ['item' => $this->item, 'params' => $params, 'position' => 'above']); ?> <?php endif; ?> <?php ?> <?php echo $this->item->event->beforeDisplayContent; ?> <?php // Links (position=0) $urlsPos0 = (isset($urls) && ((!empty($urls->urls_position) && ($urls->urls_position == '0')) || ($params->get('urls_position') == '0' && empty($urls->urls_position)))) || (empty($urls->urls_position) && (!$params->get('urls_position'))); if ($urlsPos0) : ?> <?php echo $this->loadTemplate('links'); ?> <?php endif; ?> <?php if ($params->get('access-view')) : ?> <?php if (!empty($this->item->pagination) && $this->item->pagination && !$this->item->paginationposition && !$this->item->paginationrelative) { echo $this->item->pagination; } ?> <?php if (isset($this->item->toc)) : ?> <?php echo $this->item->toc; ?> <?php endif; ?> <?php if ( ($tmplParams && ($tmplParams->get('social_share') || $params->get('show_vote'))) && empty($this->print) ) : ?> <div class="article-ratings-social-share d-flex justify-content-end"> <div class="me-auto align-self-center"> <?php if ($params->get('show_vote')) : ?> <?php HTMLHelper::_('jquery.token'); ?> <?php echo LayoutHelper::render('joomla.content.rating', ['item' => $this->item, 'params' => $params]); ?> <?php endif; ?> </div> <div class="social-share-block"> <?php echo LayoutHelper::render('joomla.content.social_share', $this->item); ?> </div> </div> <?php endif; ?> <div itemprop="articleBody"> <?php echo $this->item->text; ?> </div> <?php if ($info == 1 || $info == 2) : ?> <?php if ($useDefList) : ?> <?php echo LayoutHelper::render('joomla.content.info_block', ['item' => $this->item, 'params' => $params, 'position' => 'below']); ?> <?php endif; ?> <?php endif; ?> <?php if ($info == 0 && $params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> <?php $this->item->tagLayout = new FileLayout('joomla.content.tags'); ?> <?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?> <?php endif; ?> <?php $urlsPos1 = (isset($urls) && ((!empty($urls->urls_position) && ($urls->urls_position == '1')) || ($params->get('urls_position') == '1'))); if ($urlsPos1) : ?> <?php echo $this->loadTemplate('links'); ?> <?php endif; ?> <?php elseif ($params->get('show_noauth') == true && $user->get('guest')) : ?> <?php ?> <?php echo LayoutHelper::render('joomla.content.intro_image', $this->item); ?> <?php echo HTMLHelper::_('content.prepare', $this->item->introtext); ?> <?php if ($params->get('show_readmore') && !empty($this->item->fulltext)) : ?> <?php $menu = Factory::getApplication()->getMenu(); $active = $menu->getActive(); $itemId = $active ? $active->id : 0; $link = new Uri(Route::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); $link->setVar('return', base64_encode(RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language))); ?> <p class="readmore"> <a class="register" href="<?php echo $link; ?>"> <?php if (empty($attribs->alternative_readmore)) { echo Text::_('COM_CONTENT_REGISTER_TO_READ_MORE'); } elseif ($readmore = $attribs->alternative_readmore) { echo $readmore; if ((int) $params->get('show_readmore_title', 0) !== 0) { echo HTMLHelper::_('string.truncate', $this->item->title, (int) $params->get('readmore_limit')); } } elseif ((int) $params->get('show_readmore_title', 0) === 0) { echo Text::sprintf('COM_CONTENT_READ_MORE_TITLE'); } else { echo Text::_('COM_CONTENT_READ_MORE'); echo HTMLHelper::_('string.truncate', $this->item->title, (int) $params->get('readmore_limit')); } ?> </a> </p> <?php endif; ?> <?php endif; ?> <?php ?> <?php echo $this->item->event->afterDisplayContent; ?> <?php echo LayoutHelper::render('joomla.content.blog.author_info', $this->item); ?> <?php if (!empty($this->item->pagination) && $this->item->pagination && $this->item->paginationposition) : echo $this->item->pagination; ?> <?php endif; ?> <?php if (empty($this->print)) : ?> <?php echo LayoutHelper::render('joomla.content.blog.comments.comments', $this->item); ?> <?php endif; ?> </div> <?php if ($tmplParams && $tmplParams->get('related_article') && count($relatedArticles) > 0) : ?> <?php echo LayoutHelper::render('joomla.content.related_articles', ['articles' => $relatedArticles, 'item' => $this->item]); ?> <?php endif; ?> PKCA#]�\����?system/helixultimate/overrides/com_content/category/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Layout\LayoutHelper; ?> <div class="com-content-category category-list"> <?php $this->subtemplatename = 'articles'; echo LayoutHelper::render('joomla.content.category_default', $this); ?> </div> PKCA#]��%�*"*"<system/helixultimate/overrides/com_content/category/blog.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Layout\LayoutHelper; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); $app = Factory::getApplication(); // Content events $this->category->text = $this->category->description; $app->triggerEvent('onContentPrepare', array($this->category->extension . '.categories', &$this->category, &$this->params, 0)); $this->category->description = $this->category->text; $results = $app->triggerEvent('onContentAfterTitle', array($this->category->extension . '.categories', &$this->category, &$this->params, 0)); $afterDisplayTitle = trim(implode("\n", $results)); $results = $app->triggerEvent('onContentBeforeDisplay', array($this->category->extension . '.categories', &$this->category, &$this->params, 0)); $beforeDisplayContent = trim(implode("\n", $results)); $results = $app->triggerEvent('onContentAfterDisplay', array($this->category->extension . '.categories', &$this->category, &$this->params, 0)); $afterDisplayContent = trim(implode("\n", $results)); // Columns + Helix blog list type $columns = !empty((int) $this->params->get('num_columns')) ? (int) $this->params->get('num_columns') : 3; $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $blogListType = $template && isset($template->params) ? ($template->params->get('blog_list_type') ?? 'default') : 'default'; // Choose H tag $htag = $this->params->get('show_page_heading') ? 'h2' : 'h1'; ?> <style> .article-list.grid { --columns: <?php echo (int) $columns; ?>; } </style> <div class="blog<?php echo $this->pageclass_sfx; ?> com-content-category-blog"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1><?php echo $this->escape($this->params->get('page_heading')); ?></h1> </div> <?php endif; ?> <?php if ($this->params->get('show_category_title', 1)) : ?> <<?php echo $htag; ?>> <?php echo $this->category->title; ?> </<?php echo $htag; ?>> <?php endif; ?> <?php echo $afterDisplayTitle; ?> <?php if ($this->params->get('show_cat_tags', 1) && !empty($this->category->tags->itemTags)) : ?> <?php $this->category->tagLayout = new FileLayout('joomla.content.tags'); ?> <?php echo $this->category->tagLayout->render($this->category->tags->itemTags); ?> <?php endif; ?> <?php if ($beforeDisplayContent || $afterDisplayContent || $this->params->get('show_description', 1) || $this->params->def('show_description_image', 1)) : ?> <div class="category-desc clearfix"> <?php if ($this->params->get('show_description_image') && $this->category->getParams()->get('image')) : ?> <?php echo LayoutHelper::render( 'joomla.html.image', [ 'src' => $this->category->getParams()->get('image'), 'alt' => empty($this->category->getParams()->get('image_alt')) && empty($this->category->getParams()->get('image_alt_empty')) ? false : $this->category->getParams()->get('image_alt'), ] ); ?> <?php endif; ?> <?php echo $beforeDisplayContent; ?> <?php if ($this->params->get('show_description') && $this->category->description) : ?> <?php echo HTMLHelper::_('content.prepare', $this->category->description, '', 'com_content.category'); ?> <?php endif; ?> <?php echo $afterDisplayContent; ?> </div> <?php endif; ?> <?php if (empty($this->lead_items) && empty($this->link_items) && empty($this->intro_items)) : ?> <?php if ($this->params->get('show_no_articles', 1)) : ?> <div class="alert alert-info"> <span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span> <?php echo Text::_('COM_CONTENT_NO_ARTICLES'); ?> </div> <?php endif; ?> <?php endif; ?> <?php if (!empty($this->lead_items)) : ?> <div class="com-content-category-blog__items blog-items items-leading article-list articles-leading<?php echo $this->params->get('blog_class_leading'); ?>"> <?php foreach ($this->lead_items as &$item) : ?> <div class="com-content-category-blog__item blog-item article<?php echo $item->state == 0 ? ' system-unpublished' : null; ?>" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting"> <?php $this->item = &$item; $this->item->leading = true; // flag for intro image size logic in your item layout echo $this->loadTemplate('item'); ?> </div> <?php endforeach; ?> </div> <?php endif; ?> <?php $introcount = count($this->intro_items); ?> <?php if (!empty($this->intro_items)) : ?> <?php $blogClass = $this->params->get('blog_class', ''); ?> <?php if ((int) $this->params->get('num_columns') > 1) : ?> <?php $blogClass .= ' cols-' . (int) $this->params->get('num_columns'); ?> <?php endif; ?> <?php if ($blogListType === 'masonry') : ?> <?php $numCols = (int) $this->params->get('num_columns', 1); $orderDown = (int) $this->params->get('multi_column_order', 1); // 1 = across, 0 = down $introcount = count($this->intro_items); $numRows = (int) ceil($introcount / max(1, $numCols)); ?> <div class="article-list grid <?php echo $blogClass; ?>"> <?php for ($col = 0; $col < $numCols; $col++) : ?> <?php for ($row = 0; $row < $numRows; $row++) : // Index calc for masonry style $index = $orderDown ? ($col + $row * $numCols) : ($col * $numRows + $row); if ($index >= $introcount) { continue; } $item = &$this->intro_items[$index]; ?> <div class="article flow" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting"> <?php $this->item = &$item; echo LayoutHelper::render('masonry.bloglist', array($item, ($index + 1)), defined('HELIX_LAYOUTS_PATH') ? HELIX_LAYOUTS_PATH : null); ?> </div> <?php endfor; ?> <?php endfor; ?> </div> <?php else : ?> <div class="article-list <?php echo $blogClass; ?>"> <?php $numCols = (int) $this->params->get('num_columns', 1); $orderDown = (int) $this->params->get('multi_column_order', 1); // 1 = across, 0 = down $introcount = count($this->intro_items); $numRows = (int) ceil($introcount / max(1, $numCols)); $columnClass = 'col-lg-' . max(1, (12 / max(1, $numCols))); for ($row = 0; $row < $numRows; $row++) : ?> <div class="row"> <?php for ($col = 0; $col < $numCols; $col++) : // Index calc for grid style $index = $orderDown ? ($row * $numCols + $col) : ($row + $col * $numRows); if ($index >= $introcount) { continue; } $item = &$this->intro_items[$index]; ?> <div class="<?php echo $columnClass; ?>"> <div class="article" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting"> <?php $this->item = &$item; echo $this->loadTemplate('item'); ?> </div> </div> <?php endfor; ?> </div> <?php endfor; ?> </div> <?php endif; ?> <?php endif; ?> <?php if (!empty($this->link_items)) : ?> <div class="items-more articles-more mb-4"> <?php echo $this->loadTemplate('links'); ?> </div> <?php endif; ?> <?php if ($this->maxLevel != 0 && !empty($this->children[$this->category->id])) : ?> <div class="com-content-category-blog__children cat-children"> <?php if ($this->params->get('show_category_heading_title_text', 1) == 1) : ?> <h3> <?php echo Text::_('JGLOBAL_SUBCATEGORIES'); ?> </h3> <?php endif; ?> <?php echo $this->loadTemplate('children'); ?> </div> <?php endif; ?> <?php if (($this->params->def('show_pagination', 1) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> <div class="com-content-category-blog__navigation w-100"> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <p class="com-content-category-blog__counter counter float-md-end pt-3 pe-2"> <?php echo $this->pagination->getPagesCounter(); ?> </p> <?php endif; ?> <div class="com-content-category-blog__pagination"> <?php echo $this->pagination->getPagesLinks(); ?> </div> </div> <?php endif; ?> </div> PKCA#]�����Bsystem/helixultimate/overrides/com_content/category/blog_links.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Router\Route; use Joomla\Component\Content\Site\Helper\RouteHelper; ?> <ol class="com-content-blog__links"> <?php foreach ($this->link_items as $item) : ?> <li class="com-content-blog__link"> <a href="<?php echo Route::_(RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language)); ?>"> <?php echo $item->title; ?></a> </li> <?php endforeach; ?> </ol> PKCA#]Kͱ�==Esystem/helixultimate/overrides/com_content/category/blog_children.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Content\Site\Helper\RouteHelper; $lang = $this->getLanguage(); $user = $this->getCurrentUser(); $groups = $user->getAuthorisedViewLevels(); if ($this->maxLevel != 0 && count($this->children[$this->category->id]) > 0) : ?> <?php foreach ($this->children[$this->category->id] as $id => $child) : ?> <?php // Check whether category access level allows access to subcategories. ?> <?php if (in_array($child->access, $groups)) : ?> <?php if ($this->params->get('show_empty_categories') || $child->numitems || count($child->getChildren())) : ?> <div class="com-content-category-blog__child"> <?php if ($lang->isRtl()) : ?> <h3 class="page-header item-title"> <?php if ($this->params->get('show_cat_num_articles', 1)) : ?> <span class="badge bg-info tip"> <?php echo $child->getNumItems(true); ?> </span> <?php endif; ?> <a href="<?php echo Route::_(RouteHelper::getCategoryRoute($child->id, $child->language)); ?>"> <?php echo $this->escape($child->title); ?></a> <?php if ($this->maxLevel > 1 && count($child->getChildren()) > 0) : ?> <a href="#category-<?php echo $child->id; ?>" data-bs-toggle="collapse" class="btn btn-sm float-end" aria-label="<?php echo Text::_('JGLOBAL_EXPAND_CATEGORIES'); ?>"><span class="icon-plus" aria-hidden="true"></span></a> <?php endif; ?> </h3> <?php else : ?> <h3 class="page-header item-title"><a href="<?php echo Route::_(RouteHelper::getCategoryRoute($child->id, $child->language)); ?>"> <?php echo $this->escape($child->title); ?></a> <?php if ($this->params->get('show_cat_num_articles', 1)) : ?> <span class="badge bg-info"> <?php echo Text::_('COM_CONTENT_NUM_ITEMS'); ?> <?php echo $child->getNumItems(true); ?> </span> <?php endif; ?> <?php if ($this->maxLevel > 1 && count($child->getChildren()) > 0) : ?> <a href="#category-<?php echo $child->id; ?>" data-bs-toggle="collapse" class="btn btn-sm float-end" aria-label="<?php echo Text::_('JGLOBAL_EXPAND_CATEGORIES'); ?>"><span class="icon-plus" aria-hidden="true"></span></a> <?php endif; ?> </h3> <?php endif; ?> <?php if ($this->params->get('show_subcat_desc') == 1) : ?> <?php if ($child->description) : ?> <div class="com-content-category-blog__description category-desc"> <?php echo HTMLHelper::_('content.prepare', $child->description, '', 'com_content.category'); ?> </div> <?php endif; ?> <?php endif; ?> <?php if ($this->maxLevel > 1 && count($child->getChildren()) > 0) : ?> <div class="com-content-category-blog__children collapse fade" id="category-<?php echo $child->id; ?>"> <?php $this->children[$child->id] = $child->getChildren(); $this->category = $child; $this->maxLevel--; echo $this->loadTemplate('children'); $this->category = $child->getParent(); $this->maxLevel++; ?> </div> <?php endif; ?> </div> <?php endif; ?> <?php endif; ?> <?php endforeach; ?> <?php endif; PKCA#]gF��N�NHsystem/helixultimate/overrides/com_content/category/default_articles.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Associations; use Joomla\CMS\Language\Multilanguage; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\Component\Content\Administrator\Extension\ContentComponent; use Joomla\Component\Content\Site\Helper\AssociationHelper; use Joomla\Component\Content\Site\Helper\RouteHelper; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('com_content.articles-list'); // Create some shortcuts. $n = count($this->items); $listOrder = $this->escape($this->state->get('list.ordering')); $listDirn = $this->escape($this->state->get('list.direction')); $langFilter = false; // Tags filtering based on language filter if (($this->params->get('filter_field') === 'tag') && (Multilanguage::isEnabled())) { $tagfilter = ComponentHelper::getParams('com_tags')->get('tag_list_language_filter'); switch ($tagfilter) { case 'current_language': $langFilter = Factory::getApplication()->getLanguage()->getTag(); break; case 'all': $langFilter = false; break; default: $langFilter = $tagfilter; } } // Check for at least one editable article $isEditable = false; if (!empty($this->items)) { foreach ($this->items as $article) { if ($article->params->get('access-edit')) { $isEditable = true; break; } } } $currentDate = Factory::getDate()->format('Y-m-d H:i:s'); ?> <form action="<?php echo htmlspecialchars(Uri::getInstance()->toString()); ?>" method="post" name="adminForm" id="adminForm" class="com-content-category__articles"> <?php if ($this->params->get('filter_field') !== 'hide') : ?> <div class="com-content__filter btn-group mb-4"> <?php if ($this->params->get('filter_field') === 'tag') : ?> <span class="visually-hidden"> <label class="filter-search-lbl" for="filter-search"> <?php echo Text::_('JOPTION_SELECT_TAG'); ?> </label> </span> <select name="filter_tag" id="filter-search" class="form-select" onchange="document.adminForm.submit();" > <option value=""><?php echo Text::_('JOPTION_SELECT_TAG'); ?></option> <?php echo HTMLHelper::_('select.options', HTMLHelper::_('tag.options', ['filter.published' => [1], 'filter.language' => $langFilter], true), 'value', 'text', $this->state->get('filter.tag')); ?> </select> <?php elseif ($this->params->get('filter_field') === 'month') : ?> <span class="visually-hidden"> <label class="filter-search-lbl" for="filter-search"> <?php echo Text::_('JOPTION_SELECT_MONTH'); ?> </label> </span> <select name="filter-search" id="filter-search" class="form-select" onchange="document.adminForm.submit();"> <option value=""><?php echo Text::_('JOPTION_SELECT_MONTH'); ?></option> <?php echo HTMLHelper::_('select.options', HTMLHelper::_('content.months', $this->state), 'value', 'text', $this->state->get('list.filter')); ?> </select> <?php else : ?> <label class="filter-search-lbl visually-hidden" for="filter-search"> <?php echo Text::_('COM_CONTENT_' . $this->params->get('filter_field') . '_FILTER_LABEL'); ?> </label> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->state->get('list.filter')); ?>" class="inputbox" onchange="document.adminForm.submit();" placeholder="<?php echo Text::_('COM_CONTENT_' . $this->params->get('filter_field') . '_FILTER_LABEL'); ?>"> <?php endif; ?> <?php if ($this->params->get('filter_field') !== 'tag' && $this->params->get('filter_field') !== 'month') : ?> <button type="submit" name="filter_submit" class="btn btn-primary"><?php echo Text::_('JGLOBAL_FILTER_BUTTON'); ?></button> <?php endif; ?> <button type="reset" name="filter-clear-button" class="btn btn-secondary"><?php echo Text::_('JSEARCH_FILTER_CLEAR'); ?></button> </div> <?php endif; ?> <?php if ($this->params->get('show_pagination_limit')) : ?> <div class="com-content-category__pagination btn-group float-end"> <label for="limit" class="visually-hidden"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM'); ?> </label> <?php echo $this->pagination->getLimitBox(); ?> </div> <?php endif; ?> <?php if (empty($this->items)) : ?> <?php if ($this->params->get('show_no_articles', 1)) : ?> <div class="alert alert-info"> <span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span> <?php echo Text::_('COM_CONTENT_NO_ARTICLES'); ?> </div> <?php endif; ?> <?php else : ?> <table class="com-content-category__table category table table-striped table-bordered table-hover"> <caption class="visually-hidden"> <?php echo Text::_('COM_CONTENT_ARTICLES_TABLE_CAPTION'); ?> </caption> <thead<?php echo $this->params->get('show_headings', '1') ? '' : ' class="visually-hidden"'; ?>> <tr> <th scope="col" id="categorylist_header_title"> <?php echo HTMLHelper::_('grid.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder, null, 'asc', '', 'adminForm'); ?> </th> <?php if ($date = $this->params->get('list_show_date')) : ?> <th scope="col" id="categorylist_header_date"> <?php if ($date === 'created') : ?> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTENT_' . $date . '_DATE', 'a.created', $listDirn, $listOrder); ?> <?php elseif ($date === 'modified') : ?> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTENT_' . $date . '_DATE', 'a.modified', $listDirn, $listOrder); ?> <?php elseif ($date === 'published') : ?> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTENT_' . $date . '_DATE', 'a.publish_up', $listDirn, $listOrder); ?> <?php endif; ?> </th> <?php endif; ?> <?php if ($this->params->get('list_show_author')) : ?> <th scope="col" id="categorylist_header_author"> <?php echo HTMLHelper::_('grid.sort', 'JAUTHOR', 'author', $listDirn, $listOrder); ?> </th> <?php endif; ?> <?php if ($this->params->get('list_show_hits')) : ?> <th scope="col" id="categorylist_header_hits"> <?php echo HTMLHelper::_('grid.sort', 'JGLOBAL_HITS', 'a.hits', $listDirn, $listOrder); ?> </th> <?php endif; ?> <?php if ($this->params->get('list_show_votes', 0) && $this->vote) : ?> <th scope="col" id="categorylist_header_votes"> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTENT_VOTES', 'rating_count', $listDirn, $listOrder); ?> </th> <?php endif; ?> <?php if ($this->params->get('list_show_ratings', 0) && $this->vote) : ?> <th scope="col" id="categorylist_header_ratings"> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTENT_RATINGS', 'rating', $listDirn, $listOrder); ?> </th> <?php endif; ?> <?php if ($isEditable) : ?> <th scope="col" id="categorylist_header_edit"><?php echo Text::_('COM_CONTENT_EDIT_ITEM'); ?></th> <?php endif; ?> </tr> </thead> <tbody> <?php foreach ($this->items as $i => $article) : ?> <?php if ($this->items[$i]->state == ContentComponent::CONDITION_UNPUBLISHED) : ?> <tr class="system-unpublished cat-list-row<?php echo $i % 2; ?>"> <?php else : ?> <tr class="cat-list-row<?php echo $i % 2; ?>" > <?php endif; ?> <th class="list-title" scope="row"> <?php if (in_array($article->access, $this->user->getAuthorisedViewLevels())) : ?> <a href="<?php echo Route::_(RouteHelper::getArticleRoute($article->slug, $article->catid, $article->language)); ?>"> <?php echo $this->escape($article->title); ?> </a> <?php if (Associations::isEnabled() && $this->params->get('show_associations')) : ?> <div class="cat-list-association"> <?php $associations = AssociationHelper::displayAssociations($article->id); ?> <?php foreach ($associations as $association) : ?> <?php if ($this->params->get('flags', 1) && $association['language']->image) : ?> <?php $flag = HTMLHelper::_('image', 'mod_languages/' . $association['language']->image . '.gif', $association['language']->title_native, ['title' => $association['language']->title_native], true); ?> <a href="<?php echo Route::_($association['item']); ?>"><?php echo $flag; ?></a> <?php else : ?> <?php $class = 'btn btn-secondary btn-sm btn-' . strtolower($association['language']->lang_code); ?> <a class="<?php echo $class; ?>" title="<?php echo $association['language']->title_native; ?>" href="<?php echo Route::_($association['item']); ?>"><?php echo $association['language']->lang_code; ?> <span class="visually-hidden"><?php echo $association['language']->title_native; ?></span> </a> <?php endif; ?> <?php endforeach; ?> </div> <?php endif; ?> <?php else : ?> <?php echo $this->escape($article->title) . ' : '; $itemId = Factory::getApplication()->getMenu()->getActive()->id; $link = new Uri(Route::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); $link->setVar('return', base64_encode(RouteHelper::getArticleRoute($article->slug, $article->catid, $article->language))); ?> <a href="<?php echo $link; ?>" class="register"> <?php echo Text::_('COM_CONTENT_REGISTER_TO_READ_MORE'); ?> </a> <?php if (Associations::isEnabled() && $this->params->get('show_associations')) : ?> <div class="cat-list-association"> <?php $associations = AssociationHelper::displayAssociations($article->id); ?> <?php foreach ($associations as $association) : ?> <?php if ($this->params->get('flags', 1)) : ?> <?php $flag = HTMLHelper::_('image', 'mod_languages/' . $association['language']->image . '.gif', $association['language']->title_native, ['title' => $association['language']->title_native], true); ?> <a href="<?php echo Route::_($association['item']); ?>"><?php echo $flag; ?></a> <?php else : ?> <?php $class = 'btn btn-secondary btn-sm btn-' . strtolower($association['language']->lang_code); ?> <a class="<?php echo $class; ?>" title="<?php echo $association['language']->title_native; ?>" href="<?php echo Route::_($association['item']); ?>"><?php echo $association['language']->lang_code; ?> <span class="visually-hidden"><?php echo $association['language']->title_native; ?></span> </a> <?php endif; ?> <?php endforeach; ?> </div> <?php endif; ?> <?php endif; ?> <?php if ($article->state == ContentComponent::CONDITION_UNPUBLISHED) : ?> <div> <span class="list-published badge bg-warning text-light"> <?php echo Text::_('JUNPUBLISHED'); ?> </span> </div> <?php endif; ?> <?php if ($article->publish_up > $currentDate) : ?> <div> <span class="list-published badge bg-warning text-light"> <?php echo Text::_('JNOTPUBLISHEDYET'); ?> </span> </div> <?php endif; ?> <?php if (!is_null($article->publish_down) && $article->publish_down < $currentDate) : ?> <div> <span class="list-published badge bg-warning text-light"> <?php echo Text::_('JEXPIRED'); ?> </span> </div> <?php endif; ?> </th> <?php if ($this->params->get('list_show_date')) : ?> <td class="list-date small"> <?php echo HTMLHelper::_( 'date', $article->displayDate, $this->escape($this->params->get('date_format', Text::_('DATE_FORMAT_LC3'))) ); ?> </td> <?php endif; ?> <?php if ($this->params->get('list_show_author', 1)) : ?> <td class="list-author"> <?php if (!empty($article->author) || !empty($article->created_by_alias)) : ?> <?php $author = $article->author ?> <?php $author = $article->created_by_alias ?: $author; ?> <?php if (!empty($article->contact_link) && $this->params->get('link_author') == true) : ?> <?php if ($this->params->get('show_headings')) : ?> <?php echo HTMLHelper::_('link', $article->contact_link, $author); ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_WRITTEN_BY', HTMLHelper::_('link', $article->contact_link, $author)); ?> <?php endif; ?> <?php else : ?> <?php if ($this->params->get('show_headings')) : ?> <?php echo $author; ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_WRITTEN_BY', $author); ?> <?php endif; ?> <?php endif; ?> <?php endif; ?> </td> <?php endif; ?> <?php if ($this->params->get('list_show_hits', 1)) : ?> <td class="list-hits"> <span class="badge bg-info"> <?php if ($this->params->get('show_headings')) : ?> <?php echo $article->hits; ?> <?php else : ?> <?php echo Text::sprintf('JGLOBAL_HITS_COUNT', $article->hits); ?> <?php endif; ?> </span> </td> <?php endif; ?> <?php if ($this->params->get('list_show_votes', 0) && $this->vote) : ?> <td class="list-votes"> <span class="badge bg-success"> <?php if ($this->params->get('show_headings')) : ?> <?php echo $article->rating_count; ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_VOTES_COUNT', $article->rating_count); ?> <?php endif; ?> </span> </td> <?php endif; ?> <?php if ($this->params->get('list_show_ratings', 0) && $this->vote) : ?> <td class="list-ratings"> <span class="badge bg-warning text-light"> <?php if ($this->params->get('show_headings')) : ?> <?php echo $article->rating; ?> <?php else : ?> <?php echo Text::sprintf('COM_CONTENT_RATINGS_COUNT', $article->rating); ?> <?php endif; ?> </span> </td> <?php endif; ?> <?php if ($isEditable) : ?> <td class="list-edit"> <?php if ($article->params->get('access-edit')) : ?> <?php echo HTMLHelper::_('contenticon.edit', $article, $article->params); ?> <?php endif; ?> </td> <?php endif; ?> </tr> <?php endforeach; ?> </tbody> </table> <?php endif; ?> <?php // Code to add a link to submit an article. ?> <?php if ($this->category->getParams()->get('access-create')) : ?> <?php echo HTMLHelper::_('contenticon.create', $this->category, $this->category->params); ?> <?php endif; ?> <?php // Add pagination links ?> <?php if (!empty($this->items)) : ?> <?php if (($this->params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> <div class="com-content-category__navigation w-100 mt-4"> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <p class="com-content-category__counter counter float-end pt-3 pe-2"> <?php echo $this->pagination->getPagesCounter(); ?> </p> <?php endif; ?> <div class="com-content-category__pagination"> <?php echo $this->pagination->getPagesLinks(); ?> </div> </div> <?php endif; ?> <?php endif; ?> <div> <input type="hidden" name="filter_order" value=""> <input type="hidden" name="filter_order_Dir" value=""> <input type="hidden" name="limitstart" value=""> <input type="hidden" name="task" value=""> </div> </form> PKCA#]P{%�ZZHsystem/helixultimate/overrides/com_content/category/default_children.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Content\Site\Helper\RouteHelper; $lang = $this->getLanguage(); $user = $this->getCurrentUser(); $groups = $user->getAuthorisedViewLevels(); ?> <?php if (count($this->children[$this->category->id]) > 0) : ?> <?php foreach ($this->children[$this->category->id] as $id => $child) : ?> <?php // Check whether category access level allows access to subcategories. ?> <?php if (in_array($child->access, $groups)) : ?> <?php if ($this->params->get('show_empty_categories') || $child->getNumItems(true) || count($child->getChildren())) : ?> <div class="com-content-category__children"> <?php if ($lang->isRtl()) : ?> <h3 class="page-header item-title"> <?php if ($this->params->get('show_cat_num_articles', 1)) : ?> <span class="badge bg-info tip hasTooltip" title="<?php echo HTMLHelper::_('tooltipText', 'COM_CONTENT_NUM_ITEMS'); ?>"> <?php echo $child->getNumItems(true); ?> </span> <?php endif; ?> <a href="<?php echo Route::_(RouteHelper::getCategoryRoute($child->id, $child->language)); ?>"> <?php echo $this->escape($child->title); ?></a> <?php if (count($child->getChildren()) > 0 && $this->maxLevel > 1) : ?> <a href="#category-<?php echo $child->id; ?>" data-bs-toggle="collapse" class="btn btn-sm float-end" aria-label="<?php echo Text::_('JGLOBAL_EXPAND_CATEGORIES'); ?>"><span class="icon-plus" aria-hidden="true"></span></a> <?php endif; ?> </h3> <?php else : ?> <h3 class="page-header item-title"><a href="<?php echo Route::_(RouteHelper::getCategoryRoute($child->id, $child->language)); ?>"> <?php echo $this->escape($child->title); ?></a> <?php if ($this->params->get('show_cat_num_articles', 1)) : ?> <span class="badge bg-info tip hasTooltip" title="<?php echo HTMLHelper::_('tooltipText', 'COM_CONTENT_NUM_ITEMS'); ?>"> <?php echo $child->getNumItems(true); ?> </span> <?php endif; ?> <?php if (count($child->getChildren()) > 0 && $this->maxLevel > 1) : ?> <a href="#category-<?php echo $child->id; ?>" data-bs-toggle="collapse" class="btn btn-sm float-end" aria-label="<?php echo Text::_('JGLOBAL_EXPAND_CATEGORIES'); ?>"><span class="icon-plus" aria-hidden="true"></span></a> <?php endif; ?> </h3> <?php endif; ?> <?php if ($this->params->get('show_subcat_desc') == 1) : ?> <?php if ($child->description) : ?> <div class="category-desc"> <?php echo HTMLHelper::_('content.prepare', $child->description, '', 'com_content.category'); ?> </div> <?php endif; ?> <?php endif; ?> <?php if (count($child->getChildren()) > 0 && $this->maxLevel > 1) : ?> <div class="collapse fade" id="category-<?php echo $child->id; ?>"> <?php $this->children[$child->id] = $child->getChildren(); $this->category = $child; $this->maxLevel--; echo $this->loadTemplate('children'); $this->category = $child->getParent(); $this->maxLevel++; ?> </div> <?php endif; ?> </div> <?php endif; ?> <?php endif; ?> <?php endforeach; ?> <?php endif; ?> PKCA#]��bHHAsystem/helixultimate/overrides/com_content/category/blog_item.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Associations; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\Component\Content\Administrator\Extension\ContentComponent; use Joomla\Component\Content\Site\Helper\RouteHelper; $params = $this->item->params ?? null; $attribs = json_decode($this->item->attribs ?? ''); $canEdit = $params ? (bool) $params->get('access-edit') : false; $info = $params ? (int) $params->get('info_block_position', 0) : 0; // Helix template params $tmplParams = null; if (class_exists('HelixUltimate\\Framework\\Platform\\Helper')) { $template = HelixUltimate\Framework\Platform\Helper::loadTemplateData(); $tmplParams = $template ? ($template->params ?? null) : null; } $assocParam = ($params && Associations::isEnabled() && $params->get('show_associations')); $currentDate = Factory::getDate()->format('Y-m-d H:i:s'); $isNotPublishedYet = (!empty($this->item->publish_up) && $this->item->publish_up > $currentDate); $isExpired = (!empty($this->item->publish_down) && $this->item->publish_down < $currentDate); $isUnpublished = ($this->item->state == ContentComponent::CONDITION_UNPUBLISHED) || $isNotPublishedYet || $isExpired; $articleFormat = !empty($attribs->helix_ultimate_article_format) ? $attribs->helix_ultimate_article_format : 'standard'; $useDefList = ($params && ( $params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date') || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam )); switch ($articleFormat) { case 'gallery': echo LayoutHelper::render('joomla.content.blog.gallery', ['attribs' => $attribs, 'id' => $this->item->id]); break; case 'video': echo LayoutHelper::render('joomla.content.blog.video', ['attribs' => $attribs]); break; case 'audio': echo LayoutHelper::render('joomla.content.blog.audio', ['attribs' => $attribs]); break; default: echo LayoutHelper::render('joomla.content.intro_image', $this->item); break; } if (!empty($this->item->featured)) : ?> <span class="badge bg-danger featured-article-badge"><?php echo Text::_('HELIX_ULTIMATE_FEATURED'); ?></span> <?php endif; ?> <div class="article-body"> <?php if ($isUnpublished) : ?> <div class="system-unpublished"> <?php endif; ?> <?php echo LayoutHelper::render('joomla.content.blog_style_default_item_title', $this->item); ?> <?php if ($useDefList && ($info == 0 || $info == 2)) : ?> <?php echo LayoutHelper::render('joomla.content.info_block', ['item' => $this->item, 'params' => $params, 'position' => 'above', 'intro' => true]); ?> <?php if ($params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> <?php if (!($tmplParams && $tmplParams->get('show_list_tags', 0))) : ?> <?php $this->item->tagLayout = new FileLayout('joomla.content.tags'); ?> <?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?> <?php endif; ?> <?php endif; ?> <?php endif; ?> <?php if ($params && !$params->get('show_intro')) : ?> <?php echo $this->item->event->afterDisplayTitle; ?> <?php endif; ?> <?php echo $this->item->event->beforeDisplayContent; ?> <div class="article-introtext"> <?php echo $this->item->introtext; ?> <?php if ($useDefList && ($info == 1)) : ?> <?php echo LayoutHelper::render('joomla.content.info_block', ['item' => $this->item, 'params' => $params, 'position' => 'below', 'intro' => true]); ?> <?php endif; ?> <?php if ($params && $params->get('show_readmore') && $this->item->readmore) : if ($params->get('access-view')) : $link = Route::_(RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language)); else : $menu = Factory::getApplication()->getMenu(); $active = $menu->getActive(); $itemId = $active ? $active->id : 0; $link = new Uri(Route::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); $link->setVar('return', base64_encode(RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language))); endif; ?> <?php echo LayoutHelper::render('joomla.content.readmore', ['item' => $this->item, 'params' => $params, 'link' => $link]); ?> <?php endif; ?> </div> <?php if ($isUnpublished) : ?> </div> <?php endif; ?> </div> <?php echo $this->item->event->afterDisplayContent; ?> PKCA#]$q��(+(+8system/helixultimate/overrides/com_content/form/edit.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Multilanguage; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; // Document & assets $doc = Factory::getDocument(); /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $doc->getWebAssetManager(); $wa->useScript('keepalive') ->useScript('form.validate') ->useScript('com_content.form-edit') ->useScript('bootstrap.modal'); // Helix frontend editor CSS $doc->addStylesheet(Uri::base() . 'plugins/system/helixultimate/assets/css/frontend-editor.css'); HTMLHelper::_('jquery.framework'); HTMLHelper::_('jquery.token'); // Tabs & form config $this->tab_name = 'com-content-form'; $this->ignore_fieldsets = ['image-intro', 'image-full', 'jmetadata', 'item_associations']; $this->useCoreUI = true; // Params $params = $this->state->get('params'); if (!$params->exists('show_publishing_options')) { $params->set('show_urls_images_frontend', '0'); } // Prefill Helix blog options into the form $attribs = json_decode($this->item->attribs ?? ''); $this->form->setValue('helix_ultimate_image', 'attribs', !empty($attribs->helix_ultimate_image) ? $attribs->helix_ultimate_image : ''); $this->form->setValue('helix_ultimate_image_alt_txt', 'attribs', !empty($attribs->helix_ultimate_image_alt_txt) ? $attribs->helix_ultimate_image_alt_txt : ''); $this->form->setValue('helix_ultimate_article_format', 'attribs', !empty($attribs->helix_ultimate_article_format) ? $attribs->helix_ultimate_article_format : 'standard'); $this->form->setValue('helix_ultimate_audio', 'attribs', !empty($attribs->helix_ultimate_audio) ? $attribs->helix_ultimate_audio : ''); $this->form->setValue('helix_ultimate_gallery', 'attribs', !empty($attribs->helix_ultimate_gallery) ? $attribs->helix_ultimate_gallery : ''); $this->form->setValue('helix_ultimate_video', 'attribs', !empty($attribs->helix_ultimate_video) ? $attribs->helix_ultimate_video : ''); // This checks if the editor config options have ever been saved. If they haven't they will fall back to the original settings. if (!$params->exists('show_publishing_options')) { $params->set('show_urls_images_frontend', '0'); } ?> <div class="hu-content-edit edit item-page<?php echo $this->pageclass_sfx ? ' ' . $this->pageclass_sfx : ''; ?>"> <?php if ($params->get('show_page_heading')): ?> <div class="page-header"> <h1><?php echo $this->escape($params->get('page_heading')); ?></h1> </div> <?php endif; ?> <form action="<?php echo Route::_('index.php?option=com_content&a_id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="adminForm" class="form-validate form-vertical com-content-adminForm"> <fieldset> <?php echo HTMLHelper::_('uitab.startTabSet', $this->tab_name, ['active' => 'editor', 'recall' => true, 'breakpoint' => 768]); ?> <?php echo HTMLHelper::_('uitab.addTab', $this->tab_name, 'editor', Text::_('COM_CONTENT_ARTICLE_CONTENT')); ?> <?php echo $this->form->renderField('title'); ?> <?php if (is_null($this->item->id)) : ?> <?php echo $this->form->renderField('alias'); ?> <?php endif; ?> <?php echo $this->form->getInput('articletext'); ?> <?php if ($this->captchaEnabled) : ?> <?php echo $this->form->renderField('captcha'); ?> <?php endif; ?> <?php echo HTMLHelper::_('uitab.endTab'); ?> <?php if ($params->get('show_urls_images_frontend')) : ?> <?php echo HTMLHelper::_('uitab.addTab', $this->tab_name, 'images', Text::_('COM_CONTENT_IMAGES_AND_URLS')); ?> <div class="row"> <div class="col-md-6 mb-3"> <?php echo $this->form->renderField('image_intro', 'images'); ?> <?php echo $this->form->renderField('image_intro_alt', 'images'); ?> <?php echo $this->form->renderField('image_intro_alt_empty', 'images'); ?> <?php echo $this->form->renderField('image_intro_caption', 'images'); ?> <?php echo $this->form->renderField('float_intro', 'images'); ?> </div> <div class="col-md-6 mb-3"> <?php echo $this->form->renderField('image_fulltext', 'images'); ?> <?php echo $this->form->renderField('image_fulltext_alt', 'images'); ?> <?php echo $this->form->renderField('image_fulltext_alt_empty', 'images'); ?> <?php echo $this->form->renderField('image_fulltext_caption', 'images'); ?> <?php echo $this->form->renderField('float_fulltext', 'images'); ?> </div> </div> <hr> <div class="row"> <div class="col-md-4 mb-3"> <?php echo $this->form->renderField('urla', 'urls'); ?> <?php echo $this->form->renderField('urlatext', 'urls'); ?> <div class="mb-3"> <?php echo $this->form->getInput('targeta', 'urls'); ?> </div> </div> <div class="col-md-4 mb-3"> <?php echo $this->form->renderField('urlb', 'urls'); ?> <?php echo $this->form->renderField('urlbtext', 'urls'); ?> <div class="mb-3"> <?php echo $this->form->getInput('targetb', 'urls'); ?> </div> </div> <div class="col-md-4 mb-3"> <?php echo $this->form->renderField('urlc', 'urls'); ?> <?php echo $this->form->renderField('urlctext', 'urls'); ?> <div class="mb-3"> <?php echo $this->form->getInput('targetc', 'urls'); ?> </div> </div> </div> <?php echo HTMLHelper::_('uitab.endTab'); ?> <?php endif; ?> <?php echo LayoutHelper::render('joomla.edit.params', $this); ?> <?php echo HTMLHelper::_('uitab.addTab', $this->tab_name, 'publishing', Text::_('COM_CONTENT_PUBLISHING')); ?> <?php echo $this->form->renderField('transition'); ?> <?php echo $this->form->renderField('catid'); ?> <?php echo $this->form->renderField('tags'); ?> <?php echo $this->form->renderField('note'); ?> <?php if ($params->get('save_history', 0)) : ?> <?php echo $this->form->renderField('version_note'); ?> <?php endif; ?> <?php if ($params->get('show_publishing_options', 1) == 1) : ?> <?php echo $this->form->renderField('created_by_alias'); ?> <?php endif; ?> <?php if ($this->item->params->get('access-change')) : ?> <?php echo $this->form->renderField('state'); ?> <?php echo $this->form->renderField('featured'); ?> <?php if ($params->get('show_publishing_options', 1) == 1) : ?> <?php echo $this->form->renderField('featured_up'); ?> <?php echo $this->form->renderField('featured_down'); ?> <?php echo $this->form->renderField('publish_up'); ?> <?php echo $this->form->renderField('publish_down'); ?> <?php endif; ?> <?php endif; ?> <?php echo $this->form->renderField('access'); ?> <?php if (is_null($this->item->id)) : ?> <div class="form-text text-muted"><?php echo Text::_('COM_CONTENT_ORDERING'); ?></div> <?php endif; ?> <?php echo HTMLHelper::_('uitab.endTab'); ?> <?php if (Multilanguage::isEnabled()) : ?> <?php echo HTMLHelper::_('uitab.addTab', $this->tab_name, 'language', Text::_('JFIELD_LANGUAGE_LABEL')); ?> <?php echo $this->form->renderField('language'); ?> <?php echo HTMLHelper::_('uitab.endTab'); ?> <?php else : ?> <?php echo $this->form->renderField('language'); ?> <?php endif; ?> <?php if ($params->get('show_publishing_options', 1) == 1) : ?> <?php echo HTMLHelper::_('uitab.addTab', $this->tab_name, 'metadata', Text::_('COM_CONTENT_METADATA')); ?> <?php echo $this->form->renderField('metadesc'); ?> <?php echo $this->form->renderField('metakey'); ?> <?php echo HTMLHelper::_('uitab.endTab'); ?> <?php endif; ?> <?php echo HTMLHelper::_('uitab.endTabSet'); ?> <input type="hidden" name="task" value=""> <input type="hidden" name="return" value="<?php echo $this->return_page; ?>"> <?php echo HTMLHelper::_('form.token'); ?> </fieldset> <div class="mb-2 mt-2"> <button type="button" class="btn btn-primary" data-submit-task="article.apply"> <span class="icon-check" aria-hidden="true"></span> <?php echo Text::_('JSAVE'); ?> </button> <button type="button" class="btn btn-primary" data-submit-task="article.save"> <span class="icon-check" aria-hidden="true"></span> <?php echo Text::_('JSAVEANDCLOSE'); ?> </button> <?php if ($this->showSaveAsCopy) : ?> <button type="button" class="btn btn-primary" data-submit-task="article.save2copy"> <span class="icon-copy" aria-hidden="true"></span> <?php echo Text::_('JSAVEASCOPY'); ?> </button> <?php endif; ?> <button type="button" class="btn btn-danger" data-submit-task="article.cancel"> <span class="icon-times" aria-hidden="true"></span> <?php echo Text::_('JCANCEL'); ?> </button> <?php if ($params->get('save_history', 0) && $this->item->id) : ?> <?php echo $this->form->getInput('contenthistory'); ?> <?php endif; ?> </div> </form> </div> PKCA#]js�$��Esystem/helixultimate/overrides/com_content/featured/default_links.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Router\Route; use Joomla\Component\Content\Site\Helper\RouteHelper; ?> <ul class="com-content-blog__links"> <?php foreach ($this->link_items as $item) : ?> <li class="com-content-blog__link"> <a href="<?php echo Route::_(RouteHelper::getArticleRoute($item->slug, $item->catid, $item->language)); ?>"> <?php echo $item->title; ?></a> </li> <?php endforeach; ?> </ul> PKCA#]����bbDsystem/helixultimate/overrides/com_content/featured/default_item.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Associations; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\Component\Content\Administrator\Extension\ContentComponent; use Joomla\Component\Content\Site\Helper\RouteHelper; // Shortcuts $params = $this->item->params; $images = json_decode($this->item->images ?? ''); $attribs = json_decode($this->item->attribs ?? ''); $canEdit = (bool) $params->get('access-edit'); $info = (int) $params->get('info_block_position', 0); $assocParam = (Associations::isEnabled() && $params->get('show_associations')); // Dates / state $currentDate = Factory::getDate()->format('Y-m-d H:i:s'); $isNotPublishedYet = ($this->item->publish_up > $currentDate); $isExpired = (!is_null($this->item->publish_down) && $this->item->publish_down < $currentDate); $isUnpublished = ($this->item->state == ContentComponent::CONDITION_UNPUBLISHED) || $isNotPublishedYet || $isExpired; // Helix article format $article_format = (isset($attribs->helix_ultimate_article_format) && $attribs->helix_ultimate_article_format) ? $attribs->helix_ultimate_article_format : 'standard'; // Deflist decision $useDefList = ( $params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date') || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam ); ?> <?php if($article_format == 'gallery') : ?> <?php echo LayoutHelper::render('joomla.content.blog.gallery', array('attribs' => $attribs, 'id'=>$this->item->id)); ?> <?php elseif($article_format == 'video') : ?> <?php echo LayoutHelper::render('joomla.content.blog.video', array('attribs' => $attribs)); ?> <?php elseif($article_format == 'audio') : ?> <?php echo LayoutHelper::render('joomla.content.blog.audio', array('attribs' => $attribs)); ?> <?php else: ?> <?php echo LayoutHelper::render('joomla.content.intro_image', $this->item); ?> <?php endif; ?> <?php if (!empty($this->item->featured)) : ?> <span class="badge bg-danger featured-article-badge"><?php echo Text::_('HELIX_ULTIMATE_FEATURED'); ?></span> <?php endif; ?> <div class="item-content articleBody"> <?php if ($isUnpublished) : ?> <div class="system-unpublished"> <?php endif; ?> <?php echo LayoutHelper::render('joomla.content.blog_style_default_item_title', $this->item); ?> <?php if ($canEdit) : ?> <?php echo LayoutHelper::render('joomla.content.icons', ['params' => $params, 'item' => $this->item]); ?> <?php endif; ?> <?php echo $this->item->event->afterDisplayTitle; ?> <?php if ($useDefList && ($info == 0 || $info == 2)) : ?> <?php echo LayoutHelper::render('joomla.content.info_block', ['item' => $this->item, 'params' => $params, 'position' => 'above']); ?> <?php if ($info == 0 && $params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> <?php echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?> <?php endif; ?> <?php endif; ?> <?php echo $this->item->event->beforeDisplayContent; ?> <?php echo $this->item->introtext; ?> <?php if ($useDefList && ($info == 1 || $info == 2)) : ?> <?php echo LayoutHelper::render('joomla.content.info_block', ['item' => $this->item, 'params' => $params, 'position' => 'below']); ?> <?php if ($params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> <?php echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?> <?php endif; ?> <?php endif; ?> <?php if ($params->get('show_readmore') && $this->item->readmore) : if ($params->get('access-view')) : $link = Route::_(RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language)); else : $menu = Factory::getApplication()->getMenu(); $active = $menu->getActive(); $itemId = $active ? $active->id : 0; $link = new Uri(Route::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); $link->setVar('return', base64_encode(RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language))); endif; ?> <?php echo LayoutHelper::render('joomla.content.readmore', ['item' => $this->item, 'params' => $params, 'link' => $link]); ?> <?php endif; ?> <?php if ($isUnpublished) : ?> </div> <?php endif; ?> </div> <?php echo $this->item->event->afterDisplayContent; ?> PKCA#]r���EE?system/helixultimate/overrides/com_content/featured/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use HelixUltimate\Framework\Platform\Helper; use Joomla\CMS\HTML\HTMLHelper; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers'); ?> <div class="container-fluid blog-featured<?php echo $this->pageclass_sfx; ?>" itemscope itemtype="https://schema.org/Blog"> <?php if ((int) $this->params->get('show_page_heading') !== 0) : ?> <div class="page-header"> <h1><?php echo $this->escape($this->params->get('page_heading')); ?></h1> </div> <?php endif; ?> <?php $leadingcount = 0; ?> <?php if (!empty($this->lead_items)) : ?> <div class="article-list"> <div class="blog-items items-leading <?php echo $this->params->get('blog_class_leading'); ?>"> <?php foreach ($this->lead_items as &$item) : ?> <div class="leading-<?php echo (int) $leadingcount; ?>"> <div class="blog-item article" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting"> <?php $this->item = &$item; $this->item->leading = true; echo $this->loadTemplate('item'); $leadingcount++; ?> </div> </div> <?php endforeach; ?> </div> </div> <?php endif; ?> <?php $counter = 0; $numColumns = (int) $this->params->get('num_columns', 1); $blogClass = trim($this->params->get('blog_class', '')); if ($numColumns > 1) { $blogClass .= ($blogClass ? ' ' : '') . 'cols-' . $numColumns; } ?> <?php if (!empty($this->intro_items)) : ?> <div class="article-list"> <div class="row row-<?php echo $counter + 1; ?> <?php echo $blogClass; ?>"> <?php foreach ($this->intro_items as $key => &$item) : ?> <div class="col-lg-<?php echo (int) round(12 / Helper::SetColumn($numColumns, 3)); ?>"> <div class="article blog-items <?php echo $blogClass; ?>" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting"> <?php $this->item = &$item; echo $this->loadTemplate('item'); $counter++; ?> </div> </div> <?php endforeach; ?> </div> </div> <?php endif; ?> <?php if (!empty($this->link_items)) : ?> <div class="items-more articles-more mb-4"> <?php echo $this->loadTemplate('links'); ?> </div> <?php endif; ?> <?php if ($this->params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2 && $this->pagination->pagesTotal > 1)) : ?> <nav class="pagination-wrapper d-lg-flex justify-content-between w-100"> <?php echo $this->pagination->getPagesLinks(); ?> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <div class="pagination-counter text-muted mb-4"> <?php echo $this->pagination->getPagesCounter(); ?> </div> <?php endif; ?> </nav> <?php endif; ?> </div> PKCA#]��4C^^Gsystem/helixultimate/overrides/com_content/categories/default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Content\Site\Helper\RouteHelper; if ($this->maxLevelcat != 0 && count($this->items[$this->parent->id]) > 0) : ?> <div class="com-content-categories__items"> <?php foreach ($this->items[$this->parent->id] as $id => $item) : ?> <?php if ($this->params->get('show_empty_categories_cat') || $item->numitems || count($item->getChildren())) : ?> <div class="com-content-categories__item"> <div class="com-content-categories__item-title-wrapper"> <div class="com-content-categories__item-title"> <a href="<?php echo Route::_(RouteHelper::getCategoryRoute($item->id, $item->language)); ?>"> <?php echo $this->escape($item->title); ?></a> <?php if ($this->params->get('show_cat_num_articles_cat') == 1) :?> <span class="badge bg-info"> <?php echo Text::_('COM_CONTENT_NUM_ITEMS'); ?> <?php echo $item->numitems; ?> </span> <?php endif; ?> </div> <?php if (count($item->getChildren()) > 0 && $this->maxLevelcat > 1) : ?> <button type="button" id="category-btn-<?php echo $item->id; ?>" data-category-id="<?php echo $item->id; ?>" class="btn btn-secondary btn-sm" aria-expanded="false" aria-label="<?php echo Text::_('JGLOBAL_EXPAND_CATEGORIES'); ?>" > <span class="icon-plus" aria-hidden="true"></span> </button> <?php endif; ?> </div> <?php if ($this->params->get('show_description_image') && $item->getParams()->get('image')) : ?> <?php echo HTMLHelper::_('image', $item->getParams()->get('image'), $item->getParams()->get('image_alt')); ?> <?php endif; ?> <?php if ($this->params->get('show_subcat_desc_cat') == 1) : ?> <?php if ($item->description) : ?> <div class="com-content-categories__description category-desc"> <?php echo HTMLHelper::_('content.prepare', $item->description, '', 'com_content.categories'); ?> </div> <?php endif; ?> <?php endif; ?> <?php if (count($item->getChildren()) > 0 && $this->maxLevelcat > 1) : ?> <div class="com-content-categories__children" id="category-<?php echo $item->id; ?>" hidden=""> <?php $this->items[$item->id] = $item->getChildren(); $this->parent = $item; $this->maxLevelcat--; echo $this->loadTemplate('items'); $this->parent = $item->getParent(); $this->maxLevelcat++; ?> </div> <?php endif; ?> </div> <?php endif; ?> <?php endforeach; ?> </div> <?php endif; ?> PKCA#]�2k�ooAsystem/helixultimate/overrides/com_content/categories/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; // Add strings for translations in Javascript. Text::script('JGLOBAL_EXPAND_CATEGORIES'); Text::script('JGLOBAL_COLLAPSE_CATEGORIES'); /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->getRegistry()->addExtensionRegistryFile('com_categories'); $wa->usePreset('com_categories.shared-categories-accordion'); ?> <div class="com-content-categories categories-list"> <?php echo LayoutHelper::render('joomla.content.categories_default', $this); echo $this->loadTemplate('items'); ?> </div> PKCA#]ݕ��:system/helixultimate/overrides/com_users/reset/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('keepalive') ->useScript('form.validate'); ?> <div class="com-users-reset reset"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <form id="user-registration" action="<?php echo Route::_('index.php?option=com_users&task=reset.request'); ?>" method="post" class="com-users-reset__form form-validate form-horizontal well"> <?php foreach ($this->form->getFieldsets() as $fieldset) : ?> <fieldset> <?php if (isset($fieldset->label)) : ?> <legend><?php echo Text::_($fieldset->label); ?></legend> <?php endif; ?> <?php echo $this->form->renderFieldset($fieldset->name); ?> </fieldset> <?php endforeach; ?> <div class="com-users-reset__submit control-group"> <div class="controls"> <button type="submit" class="btn btn-primary validate"> <?php echo Text::_('JSUBMIT'); ?> </button> </div> </div> <?php echo HTMLHelper::_('form.token'); ?> </form> </div> PKCA#]�����;system/helixultimate/overrides/com_users/reset/complete.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('keepalive') ->useScript('form.validate'); ?> <div class="com-users-reset-complete reset-complete"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <form action="<?php echo Route::_('index.php?option=com_users&task=reset.complete'); ?>" method="post" class="com-users-reset-complete__form form-validate form-horizontal well"> <?php foreach ($this->form->getFieldsets() as $fieldset) : ?> <fieldset> <?php if (isset($fieldset->label)) : ?> <legend><?php echo Text::_($fieldset->label); ?></legend> <?php endif; ?> <?php echo $this->form->renderFieldset($fieldset->name); ?> </fieldset> <?php endforeach; ?> <div class="com-users-reset-complete__submit control-group"> <div class="controls"> <button type="submit" class="btn btn-primary validate"> <?php echo Text::_('JSUBMIT'); ?> </button> </div> </div> <?php echo HTMLHelper::_('form.token'); ?> </form> </div> PKCA#]k�5��:system/helixultimate/overrides/com_users/reset/confirm.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('keepalive') ->useScript('form.validate'); ?> <div class="com-users-reset-confirm reset-confirm"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <form action="<?php echo Route::_('index.php?option=com_users&task=reset.confirm'); ?>" method="post" class="com-users-reset-confirm__form form-validate form-horizontal well"> <?php foreach ($this->form->getFieldsets() as $fieldset) : ?> <fieldset> <?php if (isset($fieldset->label)) : ?> <legend><?php echo Text::_($fieldset->label); ?></legend> <?php endif; ?> <?php echo $this->form->renderFieldset($fieldset->name); ?> </fieldset> <?php endforeach; ?> <div class="com-users-reset-confirm__submit control-group"> <div class="controls"> <button type="submit" class="btn btn-primary validate"> <?php echo Text::_('JSUBMIT'); ?> </button> </div> </div> <?php echo HTMLHelper::_('form.token'); ?> </form> </div> PKCA#](�0���>system/helixultimate/overrides/com_users/methods/firsttime.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ // Prevent direct access defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Users\Site\View\Methods\HtmlView; /** @var HtmlView $this */ $headingLevel = 2; ?> <div id="com-users-methods-list"> <?php if (!$this->isAdmin) : ?> <h<?php echo $headingLevel ?> id="com-users-methods-list-head"> <?php echo Text::_('COM_USERS_MFA_FIRSTTIME_PAGE_HEAD'); ?> </h<?php echo $headingLevel++ ?>> <?php endif; ?> <div id="com-users-methods-list-instructions" class="alert alert-info"> <h<?php echo $headingLevel ?> class="alert-heading"> <span class="fa fa-shield-alt" aria-hidden="true"></span> <?php echo Text::_('COM_USERS_MFA_FIRSTTIME_INSTRUCTIONS_HEAD'); ?> </h<?php echo $headingLevel ?>> <p> <?php echo Text::_('COM_USERS_MFA_FIRSTTIME_INSTRUCTIONS_WHATITDOES'); ?> </p> <a href="<?php echo Route::_( 'index.php?option=com_users&task=methods.doNotShowThisAgain' . ($this->returnURL ? '&returnurl=' . $this->escape(urlencode($this->returnURL)) : '') . '&user_id=' . $this->user->id . '&' . Factory::getApplication()->getFormToken() . '=1' )?>" class="btn btn-danger w-100"> <?php echo Text::_('COM_USERS_MFA_FIRSTTIME_NOTINTERESTED'); ?> </a> </div> <?php $this->setLayout('list'); echo $this->loadTemplate(); ?> </div> PKCA#]��Ũ�%�%9system/helixultimate/overrides/com_users/methods/list.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ // Prevent direct access defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\Component\Users\Administrator\Helper\Mfa as MfaHelper; use Joomla\Component\Users\Site\Model\MethodsModel; use Joomla\Component\Users\Site\View\Methods\HtmlView; /** @var HtmlView $this */ /** @var MethodsModel $model */ $model = $this->getModel(); $this->document->getWebAssetManager()->useScript('com_users.two-factor-list'); HTMLHelper::_('bootstrap.tooltip', '.hasTooltip'); $canAddEdit = MfaHelper::canAddEditMethod($this->user); $canDelete = MfaHelper::canDeleteMethod($this->user); ?> <div id="com-users-methods-list-container"> <?php foreach ($this->methods as $methodName => $method) : $methodClass = 'com-users-methods-list-method-name-' . htmlentities($method['name']) . ($this->defaultMethod == $methodName ? ' com-users-methods-list-method-default' : ''); ?> <div class="com-users-methods-list-method <?php echo $methodClass?> mx-1 my-3 card <?php echo count($method['active']) ? 'border-secondary' : '' ?>"> <div class="com-users-methods-list-method-header card-header <?php echo count($method['active']) ? 'border-secondary bg-secondary text-white' : '' ?> d-flex flex-wrap align-items-center gap-2"> <div class="com-users-methods-list-method-image pt-1 px-3 pb-2 bg-light rounded-2"> <img src="<?php echo Uri::root() . $method['image'] ?>" alt="<?php echo $this->escape($method['display']) ?>" class="img-fluid" > </div> <div class="com-users-methods-list-method-title flex-grow-1 d-flex flex-column"> <h2 class="h4 p-0 m-0 d-flex gap-3 align-items-center"> <span class="me-1 flex-grow-1"> <?php echo $method['display'] ?> </span> <?php if ($this->defaultMethod == $methodName) : ?> <span id="com-users-methods-list-method-default-tag" class="badge bg-info me-1 fs-6"> <?php echo Text::_('COM_USERS_MFA_LIST_DEFAULTTAG') ?> </span> <?php endif; ?> </h2> </div> </div> <div class="com-users-methods-list-method-records-container card-body"> <div class="com-users-methods-list-method-info my-1 pb-1 small text-muted"> <?php echo $method['shortinfo'] ?> </div> <?php if (count($method['active'])) : ?> <div class="com-users-methods-list-method-records pt-2 my-2"> <?php foreach ($method['active'] as $record) : ?> <div class="com-users-methods-list-method-record d-flex flex-row flex-wrap justify-content-start border-top py-2"> <div class="com-users-methods-list-method-record-info flex-grow-1 d-flex flex-column align-items-start gap-1"> <?php if ($methodName === 'backupcodes') : ?> <?php if ($canAddEdit) : ?> <div class="alert alert-info mt-1 w-100"> <?php echo Text::sprintf('COM_USERS_MFA_BACKUPCODES_PRINT_PROMPT_HEAD', Route::_('index.php?option=com_users&task=method.edit&id=' . (int) $record->id . ($this->returnURL ? '&returnurl=' . $this->escape(urlencode($this->returnURL)) : '') . '&user_id=' . $this->user->id)) ?> </div> <?php endif ?> <?php else : ?> <h3 class="com-users-methods-list-method-record-title-container mb-1 fs-5"> <?php if ($record->default) : ?> <span id="com-users-methods-list-method-default-badge-small" class="text-warning me-1 hasTooltip" title="<?php echo $this->escape(Text::_('COM_USERS_MFA_LIST_DEFAULTTAG')) ?>"> <span class="icon icon-star" aria-hidden="true"></span> <span class="visually-hidden"><?php echo $this->escape(Text::_('COM_USERS_MFA_LIST_DEFAULTTAG')) ?></span> </span> <?php endif; ?> <span class="com-users-methods-list-method-record-title fw-bold"> <?php echo $this->escape($record->title); ?> </span> </h3> <?php endif; ?> <div class="com-users-methods-list-method-record-lastused my-1 d-flex flex-row flex-wrap justify-content-start gap-5 text-muted small w-100"> <span class="com-users-methods-list-method-record-createdon"> <?php echo Text::sprintf('COM_USERS_MFA_LBL_CREATEDON', $model->formatRelative($record->created_on)) ?> </span> <span class="com-users-methods-list-method-record-lastused-date"> <?php echo Text::sprintf('COM_USERS_MFA_LBL_LASTUSED', $model->formatRelative($record->last_used)) ?> </span> </div> </div> <?php if ($methodName !== 'backupcodes' && ($canAddEdit || $canDelete)) : ?> <div class="com-users-methods-list-method-record-actions my-2 d-flex flex-row flex-wrap justify-content-center align-content-center align-items-start"> <?php if ($canAddEdit) : ?> <a class="com-users-methods-list-method-record-edit btn btn-secondary btn-sm mx-1 hasTooltip" href="<?php echo Route::_('index.php?option=com_users&task=method.edit&id=' . (int) $record->id . ($this->returnURL ? '&returnurl=' . $this->escape(urlencode($this->returnURL)) : '') . '&user_id=' . $this->user->id)?>" title="<?php echo Text::_('JACTION_EDIT') ?> <?php echo $this->escape($record->title); ?>"> <span class="icon icon-pencil" aria-hidden="true"></span> <span class="visually-hidden"><?php echo Text::_('JACTION_EDIT') ?> <?php echo $this->escape($record->title); ?></span> </a> <?php endif ?> <?php if ($method['canDisable'] && $canDelete) : ?> <a class="com-users-methods-list-method-record-delete btn btn-danger btn-sm mx-1 hasTooltip" href="<?php echo Route::_('index.php?option=com_users&task=method.delete&id=' . (int) $record->id . ($this->returnURL ? '&returnurl=' . $this->escape(urlencode($this->returnURL)) : '') . '&user_id=' . $this->user->id . '&' . Factory::getApplication()->getFormToken() . '=1')?>" title="<?php echo Text::_('JACTION_DELETE') ?> <?php echo $this->escape($record->title); ?>"> <span class="icon icon-trash" aria-hidden="true"></span> <span class="visually-hidden"><?php echo Text::_('JACTION_DELETE') ?> <?php echo $this->escape($record->title); ?></span> </a> <?php endif; ?> </div> <?php endif; ?> </div> <?php endforeach; ?> </div> <?php endif; ?> <?php if ($canAddEdit && (empty($method['active']) || $method['allowMultiple'])) : ?> <div class="com-users-methods-list-method-addnew-container border-top pt-2"> <a href="<?php echo Route::_('index.php?option=com_users&task=method.add&method=' . $this->escape(urlencode($method['name'])) . ($this->returnURL ? '&returnurl=' . $this->escape(urlencode($this->returnURL)) : '') . '&user_id=' . $this->user->id)?>" class="com-users-methods-list-method-addnew btn btn-outline-primary btn-sm" > <span class="icon-plus-2" aria-hidden="true"></span> <?php echo Text::sprintf('COM_USERS_MFA_ADD_AUTHENTICATOR_OF_TYPE', $method['display']) ?> </a> </div> <?php endif; ?> </div> </div> <?php endforeach; ?> </div> PKCA#]�V���<system/helixultimate/overrides/com_users/methods/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ // Prevent direct access defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Users\Site\View\Methods\HtmlView; /** @var HtmlView $this */ ?> <div id="com-users-methods-list"> <?php if (!$this->get('forHMVC', false)) : ?> <h2 id="com-users-methods-list-head"> <?php echo Text::_('COM_USERS_MFA_LIST_PAGE_HEAD'); ?> </h2> <?php endif ?> <div id="com-users-methods-reset-container" class="d-flex align-items-center border border-1 rounded-3 p-2 bg-light"> <div id="com-users-methods-reset-message" class="flex-grow-1"> <?php echo Text::_('COM_USERS_MFA_LIST_STATUS_' . ($this->mfaActive ? 'ON' : 'OFF')) ?> </div> <?php if ($this->mfaActive) : ?> <div> <a href="<?php echo Route::_('index.php?option=com_users&task=methods.disable&' . Factory::getApplication()->getFormToken() . '=1' . ($this->returnURL ? '&returnurl=' . $this->escape(urlencode($this->returnURL)) : '') . '&user_id=' . $this->user->id) ?>" class="btn btn-danger btn-sm"> <?php echo Text::_('COM_USERS_MFA_LIST_REMOVEALL'); ?> </a> </div> <?php endif; ?> </div> <?php if (!count($this->methods)) : ?> <div id="com-users-methods-list-instructions" class="alert alert-info mt-2"> <span class="icon icon-info-circle" aria-hidden="true"></span> <?php echo Text::_('COM_USERS_MFA_LIST_INSTRUCTIONS'); ?> </div> <?php elseif ($this->isMandatoryMFASetup) : ?> <div class="alert alert-info my-3"> <h3 class="alert-heading"> <?php echo Text::_('COM_USERS_MFA_MANDATORY_NOTICE_HEAD') ?> </h3> <p> <?php echo Text::_('COM_USERS_MFA_MANDATORY_NOTICE_BODY') ?> </p> </div> <?php endif ?> <?php $this->setLayout('list'); echo $this->loadTemplate(); ?> </div> PKCA#]�r���8system/helixultimate/overrides/com_users/method/edit.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ // Prevent direct access defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Users\Site\View\Method\HtmlView; use Joomla\Utilities\ArrayHelper; /** @var HtmlView $this */ $cancelURL = Route::_('index.php?option=com_users&task=methods.display&user_id=' . $this->user->id); if (!empty($this->returnURL)) { $cancelURL = $this->escape(base64_decode($this->returnURL)); } $recordId = (int) $this->record->id ?? 0; $method = $this->record->method ?? $this->getModel()->getState('method'); $userId = (int) $this->user->id ?? 0; $headingLevel = 2; $hideSubmit = !$this->renderOptions['show_submit'] && !$this->isEditExisting ?> <div class="card card-body"> <form action="<?php echo Route::_(sprintf("index.php?option=com_users&task=method.save&id=%d&method=%s&user_id=%d", $recordId, $method, $userId)) ?>" class="form form-horizontal" id="com-users-method-edit" method="post"> <?php echo HTMLHelper::_('form.token') ?> <?php if (!empty($this->returnURL)) : ?> <input type="hidden" name="returnurl" value="<?php echo $this->escape($this->returnURL) ?>"> <?php endif; ?> <?php if (!empty($this->renderOptions['hidden_data'])) : ?> <?php foreach ($this->renderOptions['hidden_data'] as $key => $value) : ?> <input type="hidden" name="<?php echo $this->escape($key) ?>" value="<?php echo $this->escape($value) ?>"> <?php endforeach; ?> <?php endif; ?> <?php if (!empty($this->title)) : ?> <?php if (!empty($this->renderOptions['help_url'])) : ?> <span class="float-end"> <a href="<?php echo $this->renderOptions['help_url'] ?>" class="btn btn-sm btn-dark" target="_blank" > <span class="icon icon-question-sign" aria-hidden="true"></span> <span class="visually-hidden"><?php echo Text::_('JHELP') ?></span> </a> </span> <?php endif;?> <h<?php echo $headingLevel ?> id="com-users-method-edit-head"> <?php echo Text::_($this->title) ?> </h<?php echo $headingLevel ?>> <?php $headingLevel++ ?> <?php endif; ?> <div class="row"> <label class="col-sm-3 col-form-label" for="com-users-method-edit-title"> <?php echo Text::_('COM_USERS_MFA_EDIT_FIELD_TITLE'); ?> </label> <div class="col-sm-9"> <input type="text" class="form-control" id="com-users-method-edit-title" name="title" value="<?php echo $this->escape($this->record->title) ?>" aria-describedby="com-users-method-edit-help"> <p class="form-text" id="com-users-method-edit-help"> <?php echo $this->escape(Text::_('COM_USERS_MFA_EDIT_FIELD_TITLE_DESC')) ?> </p> </div> </div> <div class="row"> <div class="col-sm-9 offset-sm-3"> <div class="form-check"> <input class="form-check-input" type="checkbox" id="com-users-is-default-method" <?php echo $this->record->default ? 'checked="checked"' : ''; ?> name="default"> <label class="form-check-label" for="com-users-is-default-method"> <?php echo Text::_('COM_USERS_MFA_EDIT_FIELD_DEFAULT'); ?> </label> </div> </div> </div> <?php if (!empty($this->renderOptions['pre_message'])) : ?> <div class="com-users-method-edit-pre-message text-muted mt-4 mb-3"> <?php echo $this->renderOptions['pre_message'] ?> </div> <?php endif; ?> <?php if (!empty($this->renderOptions['tabular_data'])) : ?> <div class="com-users-method-edit-tabular-container"> <?php if (!empty($this->renderOptions['table_heading'])) : ?> <h<?php echo $headingLevel ?> class="h3 border-bottom mb-3"> <?php echo $this->renderOptions['table_heading'] ?> </h<?php echo $headingLevel ?>> <?php endif; ?> <table class="table table-striped"> <tbody> <?php foreach ($this->renderOptions['tabular_data'] as $cell1 => $cell2) : ?> <tr> <td> <?php echo $cell1 ?> </td> <td> <?php echo $cell2 ?> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> <?php endif; ?> <?php if ($this->renderOptions['field_type'] == 'custom') : ?> <?php echo $this->renderOptions['html']; ?> <?php endif; ?> <div class="row mb-3 <?php echo $this->renderOptions['input_type'] === 'hidden' ? 'd-none' : '' ?>"> <?php if ($this->renderOptions['label']) : ?> <label class="col-sm-3 col-form-label" for="com-users-method-code"> <?php echo $this->renderOptions['label']; ?> </label> <?php endif; ?> <div class="col-sm-9" <?php echo $this->renderOptions['label'] ? '' : 'offset-sm-3' ?>> <?php $attributes = array_merge( [ 'type' => $this->renderOptions['input_type'], 'name' => 'code', 'value' => $this->escape($this->renderOptions['input_value']), 'id' => 'com-users-method-code', 'class' => 'form-control', 'aria-describedby' => 'com-users-method-code-help', ], $this->renderOptions['input_attributes'] ); if (strpos($attributes['class'], 'form-control') === false) { $attributes['class'] .= ' form-control'; } ?> <input <?php echo ArrayHelper::toString($attributes) ?>> <p class="form-text" id="com-users-method-code-help"> <?php echo $this->escape($this->renderOptions['placeholder']) ?> </p> </div> </div> <div class="row mb-3"> <div class="col-sm-9 offset-sm-3"> <button type="submit" class="btn btn-primary me-3 <?php echo $hideSubmit ? 'd-none' : '' ?> <?php echo $this->renderOptions['submit_class'] ?>"> <span class="<?php echo $this->renderOptions['submit_icon'] ?>" aria-hidden="true"></span> <?php echo Text::_($this->renderOptions['submit_text']); ?> </button> <a href="<?php echo $cancelURL ?>" class="btn btn-sm btn-danger"> <span class="icon icon-cancel-2" aria-hidden="true"></span> <?php echo Text::_('JCANCEL'); ?> </a> </div> </div> <?php if (!empty($this->renderOptions['post_message'])) : ?> <div class="com-users-method-edit-post-message text-muted"> <?php echo $this->renderOptions['post_message'] ?> </div> <?php endif; ?> </form> </div> PKCA#]��� � ?system/helixultimate/overrides/com_users/method/backupcodes.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ // Prevent direct access defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Users\Site\View\Method\HtmlView; /** @var HtmlView $this */ HTMLHelper::_('bootstrap.tooltip', '.hasTooltip'); $cancelURL = Route::_('index.php?option=com_users&task=methods.display&user_id=' . $this->user->id); if (!empty($this->returnURL)) { $cancelURL = $this->escape(base64_decode($this->returnURL)); } if ($this->record->method != 'backupcodes') { throw new RuntimeException(Text::_('JERROR_ALERTNOAUTHOR'), 403); } ?> <h2> <?php echo Text::_('COM_USERS_USER_BACKUPCODES') ?> </h2> <div class="alert alert-info"> <?php echo Text::_('COM_USERS_USER_BACKUPCODES_DESC') ?> </div> <table class="table table-striped"> <?php for ($i = 0; $i < (count($this->backupCodes) / 2); $i++) : ?> <tr> <td> <?php if (!empty($this->backupCodes[2 * $i])) : ?> <?php // This is a Key emoji; we can hide it from screen readers ?> <span aria-hidden="true">🔑</span> <?php echo $this->backupCodes[2 * $i] ?> <?php endif; ?> </td> <td> <?php if (!empty($this->backupCodes[1 + 2 * $i])) : ?> <?php // This is a Key emoji; we can hide it from screen readers ?> <span aria-hidden="true">🔑</span> <?php echo $this->backupCodes[1 + 2 * $i] ?> <?php endif ;?> </td> </tr> <?php endfor; ?> </table> <p> <?php echo Text::_('COM_USERS_MFA_BACKUPCODES_RESET_INFO'); ?> </p> <a class="btn btn-danger" href="<?php echo Route::_(sprintf("index.php?option=com_users&task=method.regenerateBackupCodes&user_id=%s&%s=1%s", $this->user->id, Factory::getApplication()->getFormToken(), empty($this->returnURL) ? '' : '&returnurl=' . $this->returnURL)) ?>"> <span class="icon icon-refresh" aria-hidden="true"></span> <?php echo Text::_('COM_USERS_MFA_BACKUPCODES_RESET'); ?> </a> <a href="<?php echo $cancelURL ?>" class="btn btn-secondary"> <span class="icon icon-cancel-2 icon-ban-circle"></span> <?php echo Text::_('JCANCEL'); ?> </a> PKCA#]F�{���;system/helixultimate/overrides/com_users/remind/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('keepalive') ->useScript('form.validate'); ?> <div class="com-users-remind remind"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <form id="user-registration" action="<?php echo Route::_('index.php?option=com_users&task=remind.remind'); ?>" method="post" class="com-users-remind__form form-validate form-horizontal well"> <?php foreach ($this->form->getFieldsets() as $fieldset) : ?> <fieldset> <?php if (isset($fieldset->label)) : ?> <legend><?php echo Text::_($fieldset->label); ?></legend> <?php endif; ?> <?php echo $this->form->renderFieldset($fieldset->name); ?> </fieldset> <?php endforeach; ?> <div class="com-users-remind__submit control-group"> <div class="controls"> <button type="submit" class="btn btn-primary validate"> <?php echo Text::_('JSUBMIT'); ?> </button> </div> </div> <?php echo HTMLHelper::_('form.token'); ?> </form> </div> PKCA#]<�f��<system/helixultimate/overrides/com_users/profile/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; ?> <div class="com-users-profile profile"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <?php echo $this->loadTemplate('core'); ?> <?php echo $this->loadTemplate('params'); ?> <?php echo $this->loadTemplate('custom'); ?> </div> PKCA#]N'����Csystem/helixultimate/overrides/com_users/profile/default_params.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers/html'); ?> <?php $fields = $this->form->getFieldset('params'); ?> <?php if (count($fields)) : ?> <div id="users-profile-params"> <div class="mb-3"> <strong><?php echo Text::_('COM_USERS_SETTINGS_FIELDSET_LABEL'); ?></strong> </div> <ul class="list-group"> <?php foreach ($fields as $field) : ?> <?php if (!$field->hidden) : ?> <li class="list-group-item"> <strong><?php echo $field->title; ?></strong>: <?php if (HTMLHelper::isRegistered('users.' . $field->id)) : ?> <?php echo HTMLHelper::_('users.' . $field->id, $field->value); ?> <?php elseif (HTMLHelper::isRegistered('users.' . $field->fieldname)) : ?> <?php echo HTMLHelper::_('users.' . $field->fieldname, $field->value); ?> <?php elseif (HTMLHelper::isRegistered('users.' . $field->type)) : ?> <?php echo HTMLHelper::_('users.' . $field->type, $field->value); ?> <?php else : ?> <?php echo HTMLHelper::_('users.value', $field->value); ?> <?php endif; ?> </li> <?php endif; ?> <?php endforeach; ?> </ul> </div> <?php endif; ?> PKCA#]m�?h h Csystem/helixultimate/overrides/com_users/profile/default_custom.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; $fieldsets = $this->form->getFieldsets(); if (isset($fieldsets['core'])) { unset($fieldsets['core']); } if (isset($fieldsets['params'])) { unset($fieldsets['params']); } $tmp = $this->data->jcfields ?? []; $customFields = []; foreach ($tmp as $customField) { $customFields[$customField->name] = $customField; } unset($tmp); ?> <?php foreach ($fieldsets as $group => $fieldset) : ?> <?php $fields = $this->form->getFieldset($group); ?> <?php if (count($fields)) : ?> <div class="users-profile-custom-<?php echo $group; ?>" id="users-profile-custom-<?php echo $group; ?>"> <div class="mb-3"> <?php if (isset($fieldset->label) && ($legend = trim(Text::_($fieldset->label))) !== '') : ?> <strong><?php echo $legend; ?></strong> <?php endif; ?> <?php if (isset($fieldset->description) && trim($fieldset->description)) : ?> <div><?php echo $this->escape(Text::_($fieldset->description)); ?></span> <?php endif; ?> </div> <ul class="list-group "> <?php foreach ($fields as $field) : ?> <?php if (!$field->hidden && $field->type !== 'Spacer') : ?> <li class="list-group-item"> <strong><?php echo $field->title; ?></strong>: <?php if (key_exists($field->fieldname, $customFields)) : ?> <?php echo $customFields[$field->fieldname]->value ?: Text::_('COM_USERS_PROFILE_VALUE_NOT_FOUND'); ?> <?php elseif (HTMLHelper::isRegistered('users.' . $field->id)) : ?> <?php echo HTMLHelper::_('users.' . $field->id, $field->value); ?> <?php elseif (HTMLHelper::isRegistered('users.' . $field->fieldname)) : ?> <?php echo HTMLHelper::_('users.' . $field->fieldname, $field->value); ?> <?php elseif (HTMLHelper::isRegistered('users.' . $field->type)) : ?> <?php echo HTMLHelper::_('users.' . $field->type, $field->value); ?> <?php else : ?> <?php echo HTMLHelper::_('users.value', $field->value); ?> <?php endif; ?> </li> <?php endif; ?> <?php endforeach; ?> </ul> </div> <?php endif; ?> <?php endforeach; ?> PKCA#][�9system/helixultimate/overrides/com_users/profile/edit.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; /** @var Joomla\Component\Users\Site\View\Profile\HtmlView $this */ HTMLHelper::_('bootstrap.tooltip', '.hasTooltip'); // Load user_profile plugin language $lang = $this->getLanguage(); $lang->load('plg_user_profile', JPATH_ADMINISTRATOR); /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->getDocument()->getWebAssetManager(); $wa->useScript('keepalive') ->useScript('form.validate'); ?> <div class="com-users-profile__edit profile-edit"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <form id="member-profile" action="<?php echo Route::_('index.php'); ?>" method="post" class="com-users-profile__edit-form form-validate form-horizontal well" enctype="multipart/form-data"> <?php // Iterate through the form fieldsets and display each one. ?> <?php foreach ($this->form->getFieldsets() as $group => $fieldset) : ?> <?php $fields = $this->form->getFieldset($group); ?> <?php if (count($fields)) : ?> <fieldset> <?php // If the fieldset has a label set, display it as the legend. ?> <?php if (isset($fieldset->label)) : ?> <legend> <?php echo Text::_($fieldset->label); ?> </legend> <?php endif; ?> <?php if (isset($fieldset->description) && trim($fieldset->description)) : ?> <p> <?php echo $this->escape(Text::_($fieldset->description)); ?> </p> <?php endif; ?> <?php // Iterate through the fields in the set and display them. ?> <?php foreach ($fields as $field) : ?> <?php echo $field->renderField(); ?> <?php endforeach; ?> </fieldset> <?php endif; ?> <?php endforeach; ?> <?php if ($this->mfaConfigurationUI) : ?> <fieldset class="com-users-profile__multifactor"> <legend><?php echo Text::_('COM_USERS_PROFILE_MULTIFACTOR_AUTH'); ?></legend> <?php echo $this->mfaConfigurationUI ?> </fieldset> <?php endif; ?> <div class="com-users-profile__edit-submit control-group"> <div class="mb-3"> <button type="submit" class="btn btn-primary validate" name="task" value="profile.save"> <span class="icon-check" aria-hidden="true"></span> <?php echo Text::_('JSAVE'); ?> </button> <button type="submit" class="btn btn-danger" name="task" value="profile.cancel" formnovalidate> <span class="icon-times" aria-hidden="true"></span> <?php echo Text::_('JCANCEL'); ?> </button> <input type="hidden" name="option" value="com_users"> </div> </div> <?php echo $this->form->renderControlFields(); ?> </form> </div> PKCA#]����TTAsystem/helixultimate/overrides/com_users/profile/default_core.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Factory; use Joomla\CMS\Router\Route; ?> <div id="users-profile-core"> <div class="d-flex mb-3"> <div class="me-auto"> <strong><?php echo Text::_('COM_USERS_PROFILE_CORE_LEGEND'); ?></strong> </div> <div> <?php if (Factory::getUser()->id == $this->data->id): ?> <a href="<?php echo Route::_('index.php?option=com_users&task=profile.edit&user_id=' . (int) $this->data->id); ?>"> <span class="fas fa-user-edit" aria-hidden="true"></span> <?php echo Text::_('COM_USERS_EDIT_PROFILE'); ?> </a> <?php endif;?> </div> </div> <ul class="list-group"> <li class="list-group-item"> <strong><?php echo Text::_('COM_USERS_PROFILE_NAME_LABEL'); ?></strong>: <?php echo $this->data->name; ?> </li> <li class="list-group-item"> <strong><?php echo Text::_('COM_USERS_PROFILE_USERNAME_LABEL'); ?></strong>: <?php echo htmlspecialchars($this->data->username ?? "", ENT_COMPAT, 'UTF-8'); ?> </li> <li class="list-group-item"> <strong><?php echo Text::_('COM_USERS_PROFILE_REGISTERED_DATE_LABEL'); ?></strong>: <?php echo HTMLHelper::_('date', $this->data->registerDate, Text::_('DATE_FORMAT_LC1')); ?> </li> <li class="list-group-item"> <strong><?php echo Text::_('COM_USERS_PROFILE_LAST_VISITED_DATE_LABEL'); ?></strong>: <?php if ($this->data->lastvisitDate !== null): ?> <?php echo HTMLHelper::_('date', $this->data->lastvisitDate, Text::_('DATE_FORMAT_LC1')); ?> <?php else: ?> <?php echo Text::_('COM_USERS_PROFILE_NEVER_VISITED'); ?> <?php endif;?> </li> </ul> </div> PKCA#]͐k$wwAsystem/helixultimate/overrides/com_users/registration/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('keepalive') ->useScript('form.validate'); ?> <div class="com-users-registration registration"> <div class="row justify-content-center"> <div class="col-lg-9 col-xl-6"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1><?php echo $this->escape($this->params->get('page_heading')); ?></h1> </div> <?php endif; ?> <form id="member-registration" action="<?php echo Route::_('index.php?option=com_users&task=registration.register'); ?>" method="post" class="com-users-registration__form form-validate" enctype="multipart/form-data"> <?php // Iterate through the form fieldsets and display each one. ?> <?php foreach ($this->form->getFieldsets() as $fieldset) : ?> <?php if ($fieldset->name === 'captcha' && $this->captchaEnabled) : ?> <?php continue; ?> <?php endif; ?> <?php $fields = $this->form->getFieldset($fieldset->name); ?> <?php if (count($fields)) : ?> <fieldset> <?php // If the fieldset has a label set, display it as the legend. ?> <?php if (isset($fieldset->label)) : ?> <legend><?php echo Text::_($fieldset->label); ?></legend> <?php endif; ?> <?php echo $this->form->renderFieldset($fieldset->name); ?> </fieldset> <?php endif; ?> <?php endforeach; ?> <?php if ($this->captchaEnabled) : ?> <?php echo $this->form->renderFieldset('captcha'); ?> <?php endif; ?> <div class="com-users-registration__submit control-group"> <div class="controls"> <button type="submit" class="com-users-registration__register btn btn-primary validate"> <?php echo Text::_('JREGISTER'); ?> </button> <input type="hidden" name="option" value="com_users"> <input type="hidden" name="task" value="registration.register"> </div> </div> <?php echo HTMLHelper::_('form.token'); ?> </form> </div> </div> </div> PKCA#]�1Bsystem/helixultimate/overrides/com_users/registration/complete.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; ?> <div class="com-users-registration-complete registration-complete"> <?php if ($this->params->get('show_page_heading')) : ?> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> <?php endif; ?> </div> PKCA#]���A,,@system/helixultimate/overrides/com_users/login/default_login.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use HelixUltimate\Framework\Platform\Settings; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Router\Route; /** @var \Joomla\Component\Users\Site\View\Login\HtmlView $cookieLogin */ /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('keepalive') ->useScript('form.validate'); $usersConfig = ComponentHelper::getParams('com_users'); ?> <div class="com-users-login login"> <div class="row justify-content-center"> <div class="col-lg-4"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <?php if (($this->params->get('logindescription_show') == 1 && str_replace(' ', '', $this->params->get('login_description', '')) != '') || $this->params->get('login_image') != '') : ?> <div class="com-users-login__description login-description"> <?php endif; ?> <?php if ($this->params->get('logindescription_show') == 1) : ?> <?php echo $this->params->get('login_description'); ?> <?php endif; ?> <?php if ($this->params->get('login_image') != '') : ?> <?php echo HTMLHelper::_('image', $this->params->get('login_image'), empty($this->params->get('login_image_alt')) && empty($this->params->get('login_image_alt_empty')) ? false : $this->params->get('login_image_alt'), ['class' => 'com-users-login__image login-image']); ?> <?php endif; ?> <?php if (($this->params->get('logindescription_show') == 1 && str_replace(' ', '', $this->params->get('login_description', '')) != '') || $this->params->get('login_image') != '') : ?> </div> <?php endif; ?> <form action="<?php echo Route::_('index.php?option=com_users&task=user.login'); ?>" method="post" class="com-users-login__form form-validate form-horizontal well" id="com-users-login__form"> <?php foreach ($this->form->getFieldset('credentials') as $field) : ?> <?php $showon = $field->getAttribute('showon'); $attribs = ''; if ($showon) { $attribs .= ' data-showon=\'' . json_encode(Settings::parseShowOnConditions($showon, $field->formControl)) . '\''; } // Enable disable on $enableOn = $field->getAttribute('enableon', ''); if ($enableOn) { $attribs .= ' data-enableon="' . $enableOn . '"'; } ?> <?php if (!$field->hidden) : ?> <div class="mb-3" <?php echo $attribs; ?>> <?php echo $field->label; ?> <?php echo $field->input; ?> </div> <?php endif; ?> <?php endforeach; ?> <?php if (PluginHelper::isEnabled('system', 'remember')) : ?> <div class="com-users-login__remember mb-3"> <div class="form-check"> <input class="form-check-input" id="remember" type="checkbox" name="remember" value="yes"> <label class="form-check-label" for="remember"> <?php echo Text::_('COM_USERS_LOGIN_REMEMBER_ME'); ?> </label> </div> </div> <?php endif; ?> <?php foreach ($this->extraButtons as $button) : $dataAttributeKeys = array_filter(array_keys($button), function ($key) { return substr($key, 0, 5) == 'data-'; }); ?> <div class="com-users-login__submit control-group"> <div class="mb-3"> <button type="button" class="btn btn-secondary w-100 <?php echo $button['class'] ?? '' ?>" <?php foreach ($dataAttributeKeys as $key) : ?> <?php echo $key ?>="<?php echo $button[$key] ?>" <?php endforeach; ?> <?php if ($button['onclick']) : ?> onclick="<?php echo $button['onclick'] ?>" <?php endif; ?> title="<?php echo Text::_($button['label']) ?>" id="<?php echo $button['id'] ?>"> <?php if (!empty($button['icon'])) : ?> <span class="<?php echo $button['icon'] ?>"></span> <?php elseif (!empty($button['image'])) : ?> <?php echo HTMLHelper::_('image', $button['image'], Text::_($button['tooltip'] ?? ''), [ 'class' => 'icon', ], true) ?> <?php elseif (!empty($button['svg'])) : ?> <?php echo $button['svg']; ?> <?php endif; ?> <?php echo Text::_($button['label']) ?> </button> </div> </div> <?php endforeach; ?> <div class="com-users-login__submit control-group"> <div class="mb-3"> <button type="submit" class="btn btn-primary btn-lg w-100"> <?php echo Text::_('JLOGIN'); ?> </button> </div> </div> <?php $return = $this->form->getValue('return', '', $this->params->get('login_redirect_url', $this->params->get('login_redirect_menuitem', ''))); ?> <input type="hidden" name="return" value="<?php echo base64_encode($return); ?>"> <?php echo HTMLHelper::_('form.token'); ?> </fieldset> </form> <div class="com-users-login__options list-group"> <a class="com-users-login__reset list-group-item" href="<?php echo Route::_('index.php?option=com_users&view=reset'); ?>"> <?php echo Text::_('COM_USERS_LOGIN_RESET'); ?> </a> <a class="com-users-login__remind list-group-item" href="<?php echo Route::_('index.php?option=com_users&view=remind'); ?>"> <?php echo Text::_('COM_USERS_LOGIN_REMIND'); ?> </a> <?php if ($usersConfig->get('allowUserRegistration')) : ?> <a class="com-users-login__register list-group-item" href="<?php echo Route::_('index.php?option=com_users&view=registration'); ?>"> <?php echo Text::_('COM_USERS_LOGIN_REGISTER'); ?> </a> <?php endif; ?> </div> </div> </div> </div>PKCA#]���d� � Asystem/helixultimate/overrides/com_users/login/default_logout.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; /** @var \Joomla\Component\Users\Site\View\Login\HtmlView $this */ ?> <div class="com-users-logout logout"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <?php if (($this->params->get('logoutdescription_show') == 1 && str_replace(' ', '', $this->params->get('logout_description', '')) != '') || $this->params->get('logout_image') != '') : ?> <div class="com-users-logout__description logout-description"> <?php endif; ?> <?php if ($this->params->get('logoutdescription_show') == 1) : ?> <?php echo $this->params->get('logout_description'); ?> <?php endif; ?> <?php if ($this->params->get('logout_image') != '') : ?> <?php echo HTMLHelper::_('image', $this->params->get('logout_image'), empty($this->params->get('logout_image_alt')) && empty($this->params->get('logout_image_alt_empty')) ? false : $this->params->get('logout_image_alt'), ['class' => 'com-users-logout__image thumbnail float-end logout-image']); ?> <?php endif; ?> <?php if (($this->params->get('logoutdescription_show') == 1 && str_replace(' ', '', $this->params->get('logout_description', '')) != '') || $this->params->get('logout_image') != '') : ?> </div> <?php endif; ?> <form action="<?php echo Route::_('index.php?option=com_users&task=user.logout'); ?>" method="post" class="com-users-logout__form form-horizontal well"> <div class="com-users-logout__submit control-group"> <div class="controls"> <button type="submit" class="btn btn-primary"> <span class="icon-backward-2 icon-white" aria-hidden="true"></span> <?php echo Text::_('JLOGOUT'); ?> </button> </div> </div> <?php if ($this->params->get('logout_redirect_url')) : ?> <input type="hidden" name="return" value="<?php echo base64_encode($this->params->get('logout_redirect_url', $this->form->getValue('return', null, ''))); ?>"> <?php else : ?> <input type="hidden" name="return" value="<?php echo base64_encode($this->params->get('logout_redirect_menuitem', $this->form->getValue('return', null, ''))); ?>"> <?php endif; ?> <?php echo HTMLHelper::_('form.token'); ?> </form> </div> PKCA#]����ii:system/helixultimate/overrides/com_users/login/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; /** @var \Joomla\Component\Users\Site\View\Login\HtmlView $this */ $cookieLogin = $this->user->get('cookieLogin'); if (!empty($cookieLogin) || $this->user->get('guest')) { // The user is not logged in or needs to provide a password. echo $this->loadTemplate('login'); } else { // The user is already logged in. echo $this->loadTemplate('logout'); } PKCA#]IE�:��;system/helixultimate/overrides/com_users/captive/select.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ // Prevent direct access defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\Component\Users\Site\View\Captive\HtmlView; /** @var HtmlView $this */ $shownMethods = []; ?> <div id="com-users-select"> <h2 id="com-users-select-heading"> <?php echo Text::_('COM_USERS_MFA_SELECT_PAGE_HEAD'); ?> </h2> <div id="com-users-select-information"> <p> <?php echo Text::_('COM_USERS_LBL_SELECT_INSTRUCTIONS'); ?> </p> </div> <div class="com-users-select-methods p-2"> <?php foreach ($this->records as $record) : if (!array_key_exists($record->method, $this->mfaMethods) && ($record->method != 'backupcodes')) { continue; } $allowEntryBatching = isset($this->mfaMethods[$record->method]) ? $this->mfaMethods[$record->method]['allowEntryBatching'] : false; if ($this->allowEntryBatching) { if ($allowEntryBatching && in_array($record->method, $shownMethods)) { continue; } $shownMethods[] = $record->method; } $methodName = $this->getModel()->translateMethodName($record->method); ?> <a class="com-users-method p-2 border-top border-dark bg-light d-flex flex-row flex-wrap justify-content-start align-items-center text-decoration-none gap-2 text-body" href="<?php echo Route::_('index.php?option=com_users&view=captive&record_id=' . $record->id)?>"> <img src="<?php echo Uri::root() . $this->getModel()->getMethodImage($record->method) ?>" alt="<?php echo $this->escape(strip_tags($record->title)) ?>" class="com-users-method-image img-fluid" /> <?php if (!$this->allowEntryBatching || !$allowEntryBatching) : ?> <span class="com-users-method-title flex-grow-1 fs-5 fw-bold"> <?php if ($record->method === 'backupcodes') : ?> <?php echo $record->title ?> <?php else : ?> <?php echo $this->escape($record->title) ?> <?php endif; ?> </span> <small class="com-users-method-name text-muted"> <?php echo $methodName ?> </small> <?php else : ?> <span class="com-users-method-title flex-grow-1 fs-5 fw-bold"> <?php echo $methodName ?> </span> <small class="com-users-method-name text-muted"> <?php echo $methodName ?> </small> <?php endif; ?> </a> <?php endforeach; ?> </div> </div> PKCA#]ׇ�(<system/helixultimate/overrides/com_users/captive/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Users\Site\Model\CaptiveModel; use Joomla\Component\Users\Site\View\Captive\HtmlView; use Joomla\Utilities\ArrayHelper; /** * @var HtmlView $this View object * @var CaptiveModel $model The model */ $model = $this->getModel(); $this->document->getWebAssetManager() ->useScript('com_users.two-factor-focus'); ?> <div class="users-mfa-captive card card-body"> <h2 id="users-mfa-title"> <?php if (!empty($this->renderOptions['help_url'])) : ?> <span class="float-end"> <a href="<?php echo $this->renderOptions['help_url'] ?>" class="btn btn-sm btn-secondary" target="_blank" > <span class="icon icon-question-sign" aria-hidden="true"></span> <span class="visually-hidden"><?php echo Text::_('JHELP') ?></span> </a> </span> <?php endif;?> <?php if (!empty($this->title)) : ?> <?php echo $this->title ?> <small> – <?php endif; ?> <?php if (!$this->allowEntryBatching) : ?> <?php echo $this->escape($this->record->title) ?> <?php else : ?> <?php echo $this->escape($this->getModel()->translateMethodName($this->record->method)) ?> <?php endif; ?> <?php if (!empty($this->title)) : ?> </small> <?php endif; ?> </h2> <?php if ($this->renderOptions['pre_message']) : ?> <div class="users-mfa-captive-pre-message text-muted mb-3"> <?php echo $this->renderOptions['pre_message'] ?> </div> <?php endif; ?> <form action="<?php echo Route::_('index.php?option=com_users&task=captive.validate&record_id=' . ((int) $this->record->id)) ?>" id="users-mfa-captive-form" method="post" class="form-horizontal" > <?php echo HTMLHelper::_('form.token') ?> <div id="users-mfa-captive-form-method-fields"> <?php if ($this->renderOptions['field_type'] == 'custom') : ?> <?php echo $this->renderOptions['html']; ?> <?php endif; ?> <div class="row mb-3"> <?php if ($this->renderOptions['label']) : ?> <label for="users-mfa-code" class="col-sm-3 col-form-label"> <?php echo $this->renderOptions['label'] ?> </label> <?php endif; ?> <div class="col-sm-9 <?php echo $this->renderOptions['label'] ? '' : 'offset-sm-3' ?>"> <?php $attributes = array_merge( [ 'type' => $this->renderOptions['input_type'], 'name' => 'code', 'value' => '', 'placeholder' => $this->renderOptions['placeholder'] ?? null, 'id' => 'users-mfa-code', 'class' => 'form-control', 'autocomplete' => $this->renderOptions['autocomplete'] ?? 'one-time-code' ], $this->renderOptions['input_attributes'] ); if (strpos($attributes['class'], 'form-control') === false) { $attributes['class'] .= ' form-control'; } ?> <input <?php echo ArrayHelper::toString($attributes) ?>> </div> </div> </div> <div id="users-mfa-captive-form-standard-buttons" class="row my-3"> <div class="col-sm-9 offset-sm-3"> <button class="btn btn-primary me-3 <?php echo $this->renderOptions['submit_class'] ?>" id="users-mfa-captive-button-submit" style="<?php echo $this->renderOptions['hide_submit'] ? 'display: none' : '' ?>" type="submit"> <span class="<?php echo $this->renderOptions['submit_icon'] ?>" aria-hidden="true"></span> <?php echo Text::_($this->renderOptions['submit_text']); ?> </button> <a href="<?php echo Route::_('index.php?option=com_users&task=user.logout&' . Factory::getApplication()->getFormToken() . '=1') ?>" class="btn btn-danger btn-sm" id="users-mfa-captive-button-logout"> <span class="icon icon-lock" aria-hidden="true"></span> <?php echo Text::_('COM_USERS_MFA_LOGOUT'); ?> </a> <?php if (count($this->records) > 1) : ?> <div id="users-mfa-captive-form-choose-another" class="my-3"> <a href="<?php echo Route::_('index.php?option=com_users&view=captive&task=select') ?>"> <?php echo Text::_('COM_USERS_MFA_USE_DIFFERENT_METHOD'); ?> </a> </div> <?php endif; ?> </div> </div> </form> <?php if ($this->renderOptions['post_message']) : ?> <div class="users-mfa-captive-post-message"> <?php echo $this->renderOptions['post_message'] ?> </div> <?php endif; ?> </div> PKCA#]����>system/helixultimate/overrides/mod_articles_latest/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; if (!$list) { return; } ?> <ul class="mod-articleslatest latestnews mod-list"> <?php foreach ($list as $item) : ?> <li itemscope itemtype="https://schema.org/Article"> <a href="<?php echo $item->link; ?>" itemprop="url"> <span itemprop="name"> <?php echo $item->title; ?> </span> <span><?php echo HTMLHelper::_('date', $item->created, 'DATE_FORMAT_LC3'); ?></span> </a> </li> <?php endforeach; ?> </ul> PKCA#]i��<��-system/helixultimate/overrides/pagination.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ use Joomla\CMS\Language\Text; defined ('_JEXEC') or die(); function pagination_list_render($list) { // Initialize variables $html = '<ul class="pagination ms-0 mb-4">'; if ($list['start']['active']==1) $html .= $list['start']['data']; if ($list['previous']['active']==1) $html .= $list['previous']['data']; foreach ($list['pages'] as $page) { $html .= $page['data']; } if ($list['next']['active']==1) $html .= $list['next']['data']; if ($list['end']['active']==1) $html .= $list['end']['data']; $html .= '</ul>'; return $html; } function pagination_item_active(&$item) { $cls = ''; if ($item->text == Text::_('Next')) { $item->text = '»'; $cls = "next";} if ($item->text == Text::_('Prev')) { $item->text = '«'; $cls = "previous";} if ($item->text == Text::_('First')) { $cls = "first";} if ($item->text == Text::_('Last')) { $cls = "last";} return '<li class="page-item"><a class="page-link ' . $cls . '" href="' . $item->link . '" title="' . $item->text . '">' . $item->text . '</a></li>'; } function pagination_item_inactive( &$item ) { $cls = (int)$item->text > 0 ? 'active': 'disabled'; return '<li class="page-item ' . $cls . '"><a class="page-link">' . $item->text . '</a></li>'; } PKCA#]�g� ?system/helixultimate/overrides/com_contact/featured/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; ?> <div class="com-contact-featured blog-featured"> <?php if ($this->params->get('show_page_heading') != 0) : ?> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> <?php endif; ?> <?php echo $this->loadTemplate('items'); ?> <?php if ($this->params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2 && $this->pagination->pagesTotal > 1)) : ?> <div class="com-contact-featured__pagination w-100"> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <p class="counter float-end pt-3 pe-2"> <?php echo $this->pagination->getPagesCounter(); ?> </p> <?php endif; ?> <?php echo $this->pagination->getPagesLinks(); ?> </div> <?php endif; ?> </div> PKCA#]�3�T�$�$Esystem/helixultimate/overrides/com_contact/featured/default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\Component\Contact\Site\Helper\RouteHelper; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('com_contact.contacts-list') ->useScript('core'); $listOrder = $this->escape($this->state->get('list.ordering')); $listDirn = $this->escape($this->state->get('list.direction')); ?> <div class="com-contact-featured__items"> <form action="<?php echo htmlspecialchars(Uri::getInstance()->toString()); ?>" method="post" name="adminForm" id="adminForm"> <?php if ($this->params->get('filter_field')) : ?> <div class="com-contact-featured__filter btn-group mb-3"> <label class="filter-search-lbl visually-hidden" for="filter-search"> <?php echo Text::_('COM_CONTACT_FILTER_SEARCH_DESC'); ?> </label> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->state->get('list.filter')); ?>" class="inputbox" onchange="document.adminForm.submit();" placeholder="<?php echo Text::_('COM_CONTACT_FILTER_SEARCH_DESC'); ?>" > <button type="submit" name="filter_submit" class="btn btn-primary"><?php echo Text::_('JGLOBAL_FILTER_BUTTON'); ?></button> <button type="reset" name="filter-clear-button" class="btn btn-secondary"><?php echo Text::_('JSEARCH_FILTER_CLEAR'); ?></button> </div> <?php endif; ?> <?php if ($this->params->get('show_pagination_limit')) : ?> <div class="com-contact-featured__pagination btn-group float-end"> <label for="limit" class="visually-hidden"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM'); ?> </label> <?php echo $this->pagination->getLimitBox(); ?> </div> <?php endif; ?> <?php if (empty($this->items)) : ?> <div class="alert alert-info"> <span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span> <?php echo Text::_('COM_CONTACT_NO_CONTACTS'); ?> </div> <?php else : ?> <table class="com-contact-featured__table table table-striped table-bordered table-hover"> <caption class="visually-hidden"> <?php echo Text::_('COM_CONTACT_TABLE_CAPTION'); ?>, </caption> <thead<?php echo $this->params->get('show_headings', '1') ? '' : ' class="visually-hidden"'; ?>> <tr> <th scope="col" class="item-title"> <?php echo HTMLHelper::_('grid.sort', 'JGLOBAL_TITLE', 'a.name', $listDirn, $listOrder); ?> </th> <?php if ($this->params->get('show_position_headings')) : ?> <th scope="col" class="item-position"> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTACT_POSITION', 'a.con_position', $listDirn, $listOrder); ?> </th> <?php endif; ?> <?php if ($this->params->get('show_email_headings')) : ?> <th scope="col" class="item-email"> <?php echo Text::_('JGLOBAL_EMAIL'); ?> </th> <?php endif; ?> <?php if ($this->params->get('show_telephone_headings')) : ?> <th scope="col" class="item-phone"> <?php echo Text::_('COM_CONTACT_TELEPHONE'); ?> </th> <?php endif; ?> <?php if ($this->params->get('show_mobile_headings')) : ?> <th scope="col" class="item-phone"> <?php echo Text::_('COM_CONTACT_MOBILE'); ?> </th> <?php endif; ?> <?php if ($this->params->get('show_fax_headings')) : ?> <th scope="col" class="item-phone"> <?php echo Text::_('COM_CONTACT_FAX'); ?> </th> <?php endif; ?> <?php if ($this->params->get('show_suburb_headings')) : ?> <th scope="col" class="item-suburb"> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTACT_SUBURB', 'a.suburb', $listDirn, $listOrder); ?> </th> <?php endif; ?> <?php if ($this->params->get('show_state_headings')) : ?> <th scope="col" class="item-state"> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTACT_STATE', 'a.state', $listDirn, $listOrder); ?> </th> <?php endif; ?> <?php if ($this->params->get('show_country_headings')) : ?> <th scope="col" class="item-state"> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTACT_COUNTRY', 'a.country', $listDirn, $listOrder); ?> </th> <?php endif; ?> </tr> </thead> <tbody> <?php foreach ($this->items as $i => $item) : ?> <?php if ($this->items[$i]->published == 0) : ?> <tr class="system-unpublished featured-list-row<?php echo $i % 2; ?>"> <?php else : ?> <tr class="featured-list-row<?php echo $i % 2; ?>"> <?php endif; ?> <th scope="row" class="list-title"> <a href="<?php echo Route::_(RouteHelper::getContactRoute($item->slug, $item->catid, $item->language)); ?>"> <span><?php echo $this->escape($item->name); ?></span> </a> <?php if ($item->published == 0) : ?> <div> <span class="list-published badge bg-warning text-light"> <?php echo Text::_('JUNPUBLISHED'); ?> </span> </div> <?php endif; ?> </th> <?php if ($this->params->get('show_position_headings')) : ?> <td class="item-position"> <?php echo $item->con_position; ?> </td> <?php endif; ?> <?php if ($this->params->get('show_email_headings')) : ?> <td class="item-email"> <?php echo $item->email_to; ?> </td> <?php endif; ?> <?php if ($this->params->get('show_telephone_headings')) : ?> <td class="item-phone"> <?php echo $item->telephone; ?> </td> <?php endif; ?> <?php if ($this->params->get('show_mobile_headings')) : ?> <td class="item-phone"> <?php echo $item->mobile; ?> </td> <?php endif; ?> <?php if ($this->params->get('show_fax_headings')) : ?> <td class="item-phone"> <?php echo $item->fax; ?> </td> <?php endif; ?> <?php if ($this->params->get('show_suburb_headings')) : ?> <td class="item-suburb"> <span><?php echo $item->suburb; ?></span> </td> <?php endif; ?> <?php if ($this->params->get('show_state_headings')) : ?> <td class="item-state"> <span><?php echo $item->state; ?></span> </td> <?php endif; ?> <?php if ($this->params->get('show_country_headings')) : ?> <td class="item-state"> <span><?php echo $item->country; ?></span> </td> <?php endif; ?> <?php endforeach; ?> </tbody> </table> <?php endif; ?> <div> <input type="hidden" name="filter_order" value="<?php echo $this->escape($this->state->get('list.ordering')); ?>"> <input type="hidden" name="filter_order_Dir" value="<?php echo $this->escape($this->state->get('list.direction')); ?>"> </div> </form> </div> PKCA#]cm�Hsystem/helixultimate/overrides/com_contact/category/default_children.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Contact\Site\Helper\RouteHelper; if ($this->maxLevel != 0 && count($this->children[$this->category->id]) > 0) : ?> <ul class="com-contact-category__children list-striped list-condensed"> <?php foreach ($this->children[$this->category->id] as $id => $child) : ?> <?php if ($this->params->get('show_empty_categories') || $child->numitems || count($child->getChildren())) : ?> <li> <h4 class="item-title"> <a href="<?php echo Route::_(RouteHelper::getCategoryRoute($child->id, $child->language)); ?>"> <?php echo $this->escape($child->title); ?> </a> <?php if ($this->params->get('show_cat_items') == 1) : ?> <span class="badge bg-info float-end" title="<?php echo Text::_('COM_CONTACT_CAT_NUM'); ?>"><?php echo $child->numitems; ?></span> <?php endif; ?> </h4> <?php if ($this->params->get('show_subcat_desc') == 1) : ?> <?php if ($child->description) : ?> <div class="category-desc"> <?php echo HTMLHelper::_('content.prepare', $child->description, '', 'com_contact.category'); ?> </div> <?php endif; ?> <?php endif; ?> <?php if (count($child->getChildren()) > 0) : $this->children[$child->id] = $child->getChildren(); $this->category = $child; $this->maxLevel--; echo $this->loadTemplate('children'); $this->category = $child->getParent(); $this->maxLevel++; endif; ?> </li> <?php endif; ?> <?php endforeach; ?> </ul> <?php endif; ?> PKCA#]L���?system/helixultimate/overrides/com_contact/category/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Layout\LayoutHelper; ?> <div class="com-contact-category"> <?php $this->subtemplatename = 'items'; echo LayoutHelper::render('joomla.content.category_default', $this); ?> </div> PKCA#]���hP-P-Esystem/helixultimate/overrides/com_contact/category/default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\Component\Contact\Administrator\Helper\ContactHelper; use Joomla\Component\Contact\Site\Helper\RouteHelper; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('com_contact.contacts-list') ->useScript('core'); $canDo = ContactHelper::getActions('com_contact', 'category', $this->category->id); $canEdit = $canDo->get('core.edit'); $userId = $this->getCurrentUser()->id; $showEditColumn = false; if ($canEdit) { $showEditColumn = true; } elseif ($canDo->get('core.edit.own') && !empty($this->items)) { foreach ($this->items as $item) { if ($item->created_by == $userId) { $showEditColumn = true; break; } } } $listOrder = $this->escape($this->state->get('list.ordering')); $listDirn = $this->escape($this->state->get('list.direction')); ?> <div class="com-contact-category__items"> <form action="<?php echo htmlspecialchars(Uri::getInstance()->toString()); ?>" method="post" name="adminForm" id="adminForm"> <?php if ($this->params->get('filter_field')) : ?> <div class="com-contact-category__filter btn-group mb-3"> <label class="filter-search-lbl visually-hidden" for="filter-search"> <?php echo Text::_('COM_CONTACT_FILTER_SEARCH_DESC'); ?> </label> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->state->get('list.filter')); ?>" class="inputbox" onchange="document.adminForm.submit();" placeholder="<?php echo Text::_('COM_CONTACT_FILTER_SEARCH_DESC'); ?>" > <button type="submit" name="filter_submit" class="btn btn-primary"><?php echo Text::_('JGLOBAL_FILTER_BUTTON'); ?></button> <button type="reset" name="filter-clear-button" class="btn btn-secondary"><?php echo Text::_('JSEARCH_FILTER_CLEAR'); ?></button> </div> <?php endif; ?> <?php if ($this->params->get('show_pagination_limit')) : ?> <div class="com-contact-category__pagination btn-group float-end"> <label for="limit" class="visually-hidden"> <?php echo Text::_('JGLOBAL_DISPLAY_NUM'); ?> </label> <?php echo $this->pagination->getLimitBox(); ?> </div> <?php endif; ?> <?php if (empty($this->items)) : ?> <?php if ($this->params->get('show_no_contacts', 1)) : ?> <div class="alert alert-info"> <span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span> <?php echo Text::_('COM_CONTACT_NO_CONTACTS'); ?> </div> <?php endif; ?> <?php else : ?> <table class="com-content-category__table category table table-striped table-bordered table-hover" id="contactList"> <caption class="visually-hidden"> <?php echo Text::_('COM_CONTACT_TABLE_CAPTION'); ?>, </caption> <thead<?php echo $this->params->get('show_headings', '1') ? '' : ' class="visually-hidden"'; ?>> <tr> <th scope="col" id="categorylist_header_title"> <?php echo HTMLHelper::_('grid.sort', 'COM_CONTACT_FIELD_NAME_LABEL', 'a.name', $listDirn, $listOrder, null, 'asc', '', 'adminForm'); ?> </th> <th scope="col"> <?php echo Text::_('COM_CONTACT_CONTACT_DETAILS'); ?> </th> <?php if ($showEditColumn) : ?> <th scope="col"> <?php echo Text::_('COM_CONTACT_EDIT_CONTACT'); ?> </th> <?php endif; ?> </tr> </thead> <tbody> <?php foreach ($this->items as $i => $item) : ?> <?php if ($this->items[$i]->published == 0) : ?> <tr class="system-unpublished cat-list-row<?php echo $i % 2; ?>"> <?php else : ?> <tr class="cat-list-row<?php echo $i % 2; ?>" > <?php endif; ?> <th scope="row" class="list-title"> <a href="<?php echo Route::_(RouteHelper::getContactRoute($item->slug, $item->catid, $item->language)); ?>"> <?php if ($this->params->get('show_image_heading')) : ?> <?php if ($item->image) : ?> <?php echo LayoutHelper::render( 'joomla.html.image', [ 'src' => $item->image, 'alt' => '', 'class' => 'contact-thumbnail img-thumbnail', ] ); ?> <?php endif; ?> <?php endif; ?> <?php echo $this->escape($item->name); ?> </a> <?php if ($item->published == 0) : ?> <div> <span class="list-published badge bg-warning text-light"> <?php echo Text::_('JUNPUBLISHED'); ?> </span> </div> <?php endif; ?> <?php if ($item->publish_up && strtotime($item->publish_up) > strtotime(Factory::getDate())) : ?> <div> <span class="list-published badge bg-warning text-light"> <?php echo Text::_('JNOTPUBLISHEDYET'); ?> </span> </div> <?php endif; ?> <?php if (!is_null($item->publish_down) && strtotime($item->publish_down) < strtotime(Factory::getDate())) : ?> <div> <span class="list-published badge bg-warning text-light"> <?php echo Text::_('JEXPIRED'); ?> </span> </div> <?php endif; ?> <?php if ($item->published == -2) : ?> <div> <span class="badge bg-warning text-light"> <?php echo Text::_('JTRASHED'); ?> </span> </div> <?php endif; ?> <?php echo $item->event->afterDisplayTitle; ?> </th> <td> <?php echo $item->event->beforeDisplayContent; ?> <?php if ($this->params->get('show_telephone_headings') && !empty($item->telephone)) : ?> <?php echo Text::sprintf('COM_CONTACT_TELEPHONE_NUMBER', $item->telephone); ?><br> <?php endif; ?> <?php if ($this->params->get('show_mobile_headings') && !empty($item->mobile)) : ?> <?php echo Text::sprintf('COM_CONTACT_MOBILE_NUMBER', $item->mobile); ?><br> <?php endif; ?> <?php if ($this->params->get('show_fax_headings') && !empty($item->fax)) : ?> <?php echo Text::sprintf('COM_CONTACT_FAX_NUMBER', $item->fax); ?><br> <?php endif; ?> <?php if ($this->params->get('show_position_headings') && !empty($item->con_position)) : ?> <?php echo $item->con_position; ?><br> <?php endif; ?> <?php if ($this->params->get('show_email_headings') && !empty($item->email_to)) : ?> <?php echo $item->email_to; ?><br> <?php endif; ?> <?php $location = []; ?> <?php if ($this->params->get('show_suburb_headings') && !empty($item->suburb)) : ?> <?php $location[] = $item->suburb; ?> <?php endif; ?> <?php if ($this->params->get('show_state_headings') && !empty($item->state)) : ?> <?php $location[] = $item->state; ?> <?php endif; ?> <?php if ($this->params->get('show_country_headings') && !empty($item->country)) : ?> <?php $location[] = $item->country; ?> <?php endif; ?> <?php echo implode(', ', $location); ?> <?php echo $item->event->afterDisplayContent; ?> </td> <?php if ($canEdit || ($canDo->get('core.edit.own') && $item->created_by === $userId)) : ?> <td> <?php echo HTMLHelper::_('contacticon.edit', $item, $this->params); ?> </td> <?php endif; ?> <?php endforeach; ?> </tbody> </table> <?php endif; ?> <?php if ($canDo->get('core.create')) : ?> <?php echo HTMLHelper::_('contacticon.create', $this->category, $this->category->params); ?> <?php endif; ?> <?php if ($this->params->get('show_pagination', 2)) : ?> <div class="com-contact-category__pagination w-100"> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <p class="com-contact-category__counter counter float-end pt-3 pe-2"> <?php echo $this->pagination->getPagesCounter(); ?> </p> <?php endif; ?> <?php echo $this->pagination->getPagesLinks(); ?> </div> <?php endif; ?> <div> <input type="hidden" name="filter_order" value="<?php echo $this->escape($this->state->get('list.ordering')); ?>"> <input type="hidden" name="filter_order_Dir" value="<?php echo $this->escape($this->state->get('list.direction')); ?>"> </div> </form> </div> PKCA#]�ؗ�Fsystem/helixultimate/overrides/com_contact/contact/default_address.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\String\PunycodeHelper; $icon = $this->params->get('contact_icons') == 0; /** * Marker_class: Class based on the selection of text, none, or icons * jicon-text, jicon-none, jicon-icon */ ?> <div class="com-contact__address contact-address dl-horizontal mb-4" itemprop="address" itemscope itemtype="https://schema.org/PostalAddress"> <?php if ( ($this->params->get('address_check') > 0) && ($this->item->address || $this->item->suburb || $this->item->state || $this->item->country || $this->item->postcode) ) : ?> <div class="d-flex"> <div class="me-2"> <?php if ($icon && !$this->params->get('marker_address')) : ?> <span class="icon-address" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('COM_CONTACT_ADDRESS'); ?></span> <?php else : ?> <span class="<?php echo $this->params->get('marker_class'); ?>"> <?php echo $this->params->get('marker_address'); ?> </span> <?php endif; ?> </div> <div> <?php if ($this->item->address && $this->params->get('show_street_address')) : ?> <div class="contact-street" itemprop="streetAddress"> <?php echo nl2br($this->item->address, false); ?> </div> <?php endif; ?> <?php if ($this->item->suburb && $this->params->get('show_suburb')) : ?> <div class="contact-suburb" itemprop="addressLocality"> <?php echo $this->item->suburb; ?> </div> <?php endif; ?> <?php if ($this->item->state && $this->params->get('show_state')) : ?> <div class="contact-state" itemprop="addressRegion"> <?php echo $this->item->state; ?> </div> <?php endif; ?> <?php if ($this->item->postcode && $this->params->get('show_postcode')) : ?> <div class="contact-postcode" itemprop="postalCode"> <?php echo $this->item->postcode; ?> </div> <?php endif; ?> <?php if ($this->item->country && $this->params->get('show_country')) : ?> <div class="contact-country" itemprop="addressCountry"> <?php echo $this->item->country; ?> </div> <?php endif; ?> </div> </div> <?php endif; ?> <?php if ($this->item->email_to && $this->params->get('show_email')) : ?> <div class="d-flex mt-2"> <div class="me-2"> <?php if ($icon && !$this->params->get('marker_email')) : ?> <span class="icon-envelope" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('COM_CONTACT_EMAIL_LABEL'); ?></span> <?php else : ?> <span class="<?php echo $this->params->get('marker_class'); ?>"> <?php echo $this->params->get('marker_email'); ?> </span> <?php endif; ?> </div> <div class="contact-emailto"> <?php echo $this->item->email_to; ?> </div> </div> <?php endif; ?> <?php if ($this->item->telephone && $this->params->get('show_telephone')) : ?> <div class="d-flex mt-2"> <div class="me-2"> <?php if ($icon && !$this->params->get('marker_telephone')) : ?> <span class="icon-phone" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('COM_CONTACT_TELEPHONE'); ?></span> <?php else : ?> <span class="<?php echo $this->params->get('marker_class'); ?>"> <?php echo $this->params->get('marker_telephone'); ?> </span> <?php endif; ?> </div> <div class="contact-telephone" itemprop="telephone"> <?php echo $this->item->telephone; ?> </div> </div> <?php endif; ?> <?php if ($this->item->fax && $this->params->get('show_fax')) : ?> <div class="d-flex mt-2"> <div class="me-2"> <?php if ($icon && !$this->params->get('marker_fax')) : ?> <span class="icon-fax" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('COM_CONTACT_FAX'); ?></span> <?php else : ?> <span class="<?php echo $this->params->get('marker_class'); ?>"> <?php echo $this->params->get('marker_fax'); ?> </span> <?php endif; ?> </div> <div class="contact-fax"> <?php echo $this->item->fax; ?> </div> </div> <?php endif; ?> <?php if ($this->item->mobile && $this->params->get('show_mobile')) : ?> <div class="d-flex mt-2"> <div class="me-2"> <?php if ($icon && !$this->params->get('marker_mobile')) : ?> <span class="icon-mobile" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('COM_CONTACT_MOBILE'); ?></span> <?php else : ?> <span class="<?php echo $this->params->get('marker_class'); ?>"> <?php echo $this->params->get('marker_mobile'); ?> </span> <?php endif; ?> </div> <div class="contact-mobile"> <?php echo $this->item->mobile; ?> </div> </div> <?php endif; ?> <?php if ($this->item->webpage && $this->params->get('show_webpage')) : ?> <div class="d-flex mt-2"> <div class="me-2"> <?php if ($icon && !$this->params->get('marker_webpage')) : ?> <span class="icon-globe" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('COM_CONTACT_WEBPAGE'); ?></span> <?php else : ?> <span class="<?php echo $this->params->get('marker_class'); ?>"> <?php echo $this->params->get('marker_webpage'); ?> </span> <?php endif; ?> </div> <div class="contact-webpage"> <a href="<?php echo $this->item->webpage; ?>" target="_blank" rel="noopener noreferrer"> <?php echo PunycodeHelper::urlToUTF8($this->item->webpage); ?></a> </div> </div> <?php endif; ?> </div>PKCA#]��RRDsystem/helixultimate/overrides/com_contact/contact/default_links.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; ?> <div class="com-contact__links contact-links"> <ul class="list-unstyled"> <?php // Letters 'a' to 'e' foreach (range('a', 'e') as $char) : $link = $this->item->params->get('link' . $char); $label = $this->item->params->get('link' . $char . '_name'); if (!$link) : continue; endif; // Add 'http://' if not present $link = (0 === strpos($link, 'http')) ? $link : 'http://' . $link; // If no label is present, take the link $label = $label ?: $link; ?> <li> <a href="<?php echo $link; ?>" rel="noopener noreferrer"> <?php echo $label; ?> </a> </li> <?php endforeach; ?> </ul> </div>PKCA#]WIa�ccGsystem/helixultimate/overrides/com_contact/contact/default_articles.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Router\Route; use Joomla\Component\Content\Site\Helper\RouteHelper; ?> <?php if ($this->params->get('show_articles')) : ?> <div class="com-contact__articles contact-articles"> <ul class="list-unstyled"> <?php foreach ($this->item->articles as $article) : ?> <li> <?php echo HTMLHelper::_('link', Route::_(RouteHelper::getArticleRoute($article->slug, $article->catid, $article->language)), htmlspecialchars($article->title, ENT_COMPAT, 'UTF-8')); ?> </li> <?php endforeach; ?> </ul> </div> <?php endif; ?> PKCA#]hk����>system/helixultimate/overrides/com_contact/contact/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Helper\ContentHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Router\Route; use Joomla\Component\Contact\Site\Helper\RouteHelper; $tparams = $this->item->params; $canDo = ContentHelper::getActions('com_contact', 'category', $this->item->catid); $canEdit = $canDo->get('core.edit') || ($canDo->get('core.edit.own') && $this->item->created_by === $this->getCurrentUser()->id); $htag = $tparams->get('show_page_heading') ? 'h2' : 'h1'; $htag2 = ($tparams->get('show_page_heading') && $tparams->get('show_name')) ? 'h3' : 'h2'; ?> <div class="com-contact contact" itemscope itemtype="https://schema.org/Person"> <?php if ($tparams->get('show_page_heading')) : ?> <h1> <?php echo $this->escape($tparams->get('page_heading')); ?> </h1> <?php endif; ?> <?php if ($this->item->name && $tparams->get('show_name')) : ?> <div class="page-header"> <<?php echo $htag; ?>> <?php if ($this->item->published == 0) : ?> <span class="badge bg-warning text-light"><?php echo Text::_('JUNPUBLISHED'); ?></span> <?php endif; ?> <span class="contact-name"><?php echo $this->item->name; ?></span> </<?php echo $htag; ?>> </div> <?php endif; ?> <?php if ($canEdit) : ?> <?php echo HTMLHelper::_('contacticon.edit', $this->item, $tparams); ?> <?php endif; ?> <?php $show_contact_category = $tparams->get('show_contact_category'); ?> <?php if ($show_contact_category === 'show_no_link') : ?> <<?php echo $htag2; ?>> <span class="contact-category"><?php echo $this->item->category_title; ?></span> </<?php echo $htag2; ?>> <?php elseif ($show_contact_category === 'show_with_link') : ?> <?php $contactLink = RouteHelper::getCategoryRoute($this->item->catid, $this->item->language); ?> <<?php echo $htag2; ?>> <span class="contact-category"><a href="<?php echo $contactLink; ?>"> <?php echo $this->escape($this->item->category_title); ?></a> </span> </<?php echo $htag2; ?>> <?php endif; ?> <?php echo $this->item->event->afterDisplayTitle; ?> <?php if ($tparams->get('show_contact_list') && count($this->contacts) > 1) : ?> <form action="#" method="get" name="selectForm" id="selectForm" class="mb-4"> <label for="select_contact"><?php echo Text::_('COM_CONTACT_SELECT_CONTACT'); ?></label> <?php echo HTMLHelper::_( 'select.genericlist', $this->contacts, 'select_contact', 'class="form-select inputbox" onchange="document.location.href = this.value"', 'link', 'name', $this->item->link ); ?> </form> <?php endif; ?> <?php if ($tparams->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> <div class="com-contact__tags"> <?php $this->item->tagLayout = new FileLayout('joomla.content.tags'); ?> <?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?> </div> <?php endif; ?> <?php echo $this->item->event->beforeDisplayContent; ?> <?php if ($this->params->get('show_info', 1)) : ?> <div class="row"> <?php echo '<' . $htag2 . '>' . Text::_('COM_CONTACT_DETAILS') . '</' . $htag2 . '>'; ?> <div class="col"> <?php if ($this->item->con_position && $tparams->get('show_position')) : ?> <div class="contact-position d-flex mb-3"> <div class="me-2 "> <strong><?php echo Text::_('COM_CONTACT_POSITION'); ?>:</strong> </div> <div itemprop="jobTitle"> <?php echo $this->item->con_position; ?> </div> </div> <?php endif; ?> <div class="contact-info"> <?php echo $this->loadTemplate('address'); ?> <?php if ($tparams->get('allow_vcard')) : ?> <div class="mb-4"> <?php echo Text::_('COM_CONTACT_DOWNLOAD_INFORMATION_AS'); ?> <a href="<?php echo Route::_('index.php?option=com_contact&view=contact&catid=' . $this->item->catslug . '&id=' . $this->item->slug . '&format=vcf'); ?>"> <?php echo Text::_('COM_CONTACT_VCARD'); ?> </a> </div> <?php endif; ?> </div> </div> <?php if ($this->item->image && $tparams->get('show_image')) : ?> <div class="col-lg-auto"> <?php echo LayoutHelper::render( 'joomla.html.image', [ 'src' => $this->item->image, 'alt' => $this->item->name, ] ); ?> </div> <?php endif; ?> </div> <?php endif; ?> <?php if ($tparams->get('show_email_form') && ($this->item->email_to || $this->item->user_id)) : ?> <?php echo '<' . $htag2 . '>' . Text::_('COM_CONTACT_EMAIL_FORM') . '</' . $htag2 . '>'; ?> <?php echo $this->loadTemplate('form'); ?> <?php endif; ?> <?php if ($tparams->get('show_links')) : ?> <?php echo '<' . $htag2 . '>' . Text::_('COM_CONTACT_LINKS') . '</' . $htag2 . '>'; ?> <?php echo $this->loadTemplate('links'); ?> <?php endif; ?> <?php if ($tparams->get('show_articles') && $this->item->user_id && $this->item->articles) : ?> <?php echo '<' . $htag2 . '>' . Text::_('JGLOBAL_ARTICLES') . '</' . $htag2 . '>'; ?> <?php echo $this->loadTemplate('articles'); ?> <?php endif; ?> <?php if ($tparams->get('show_profile') && $this->item->user_id && PluginHelper::isEnabled('user', 'profile')) : ?> <?php echo '<' . $htag2 . '>' . Text::_('COM_CONTACT_PROFILE') . '</' . $htag2 . '>'; ?> <?php echo $this->loadTemplate('profile'); ?> <?php endif; ?> <?php if ($tparams->get('show_user_custom_fields') && $this->contactUser) : ?> <?php echo $this->loadTemplate('user_custom_fields'); ?> <?php endif; ?> <?php if ($this->item->misc && $tparams->get('show_misc')) : ?> <?php echo '<' . $htag2 . '>' . Text::_('COM_CONTACT_OTHER_INFORMATION') . '</' . $htag2 . '>'; ?> <div class="com-contact__miscinfo contact-miscinfo"> <div class="d-flex"> <div class="me-2"> <?php if (!$this->params->get('marker_misc')) : ?> <span class="fas fa-info-circle" aria-hidden="true"></span> <span class="visually-hidden"><?php echo Text::_('COM_CONTACT_OTHER_INFORMATION'); ?></span> <?php else : ?> <span class="<?php echo $this->params->get('marker_class'); ?>"> <?php echo $this->params->get('marker_misc'); ?> </span> <?php endif; ?> </div> <div class="contact-misc"> <?php echo $this->item->misc; ?> </div> </div> </div> <?php endif; ?> <?php echo $this->item->event->afterDisplayContent; ?> </div> PKCA#]�l��ttQsystem/helixultimate/overrides/com_contact/contact/default_user_custom_fields.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\Application\ApplicationHelper; use Joomla\CMS\Language\Text; $params = $this->item->params; $displayGroups = $params->get('show_user_custom_fields'); $userFieldGroups = []; ?> <?php if (!$displayGroups || !$this->contactUser) : ?> <?php return; ?> <?php endif; ?> <?php foreach ($this->contactUser->jcfields as $field) : ?> <?php if ($field->value && (in_array('-1', $displayGroups) || in_array($field->group_id, $displayGroups))) : ?> <?php $userFieldGroups[$field->group_title][] = $field; ?> <?php endif; ?> <?php endforeach; ?> <?php foreach ($userFieldGroups as $groupTitle => $fields) : ?> <?php $id = ApplicationHelper::stringURLSafe($groupTitle); ?> <?php echo '<h3>' . ($groupTitle ?: Text::_('COM_CONTACT_USER_FIELDS')) . '</h3>'; ?> <div class="com-contact__user-fields contact-profile" id="user-custom-fields-<?php echo $id; ?>"> <dl class="dl-horizontal"> <?php foreach ($fields as $field) : ?> <?php if (!$field->value) : ?> <?php continue; ?> <?php endif; ?> <?php if ($field->params->get('showlabel')) : ?> <?php echo '<dt>' . Text::_($field->label) . '</dt>'; ?> <?php endif; ?> <?php echo '<dd>' . $field->value . '</dd>'; ?> <?php endforeach; ?> </dl> </div> <?php endforeach; ?> PKCA#]��u��Csystem/helixultimate/overrides/com_contact/contact/default_form.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('keepalive') ->useScript('form.validate'); ?> <div class="com-contact__form contact-form"> <form id="contact-form" action="<?php echo Route::_('index.php'); ?>" method="post" class="form-validate well"> <?php foreach ($this->form->getFieldsets() as $fieldset) : ?> <?php if ($fieldset->name === 'captcha' && $this->captchaEnabled) : ?> <?php continue; ?> <?php endif; ?> <?php $fields = $this->form->getFieldset($fieldset->name); ?> <?php if (count($fields)) : ?> <fieldset class="m-0"> <?php if (isset($fieldset->label) && ($legend = trim(Text::_($fieldset->label))) !== '') : ?> <legend><?php echo $legend; ?></legend> <?php endif; ?> <?php foreach ($fields as $field) : ?> <?php echo $field->renderField(); ?> <?php endforeach; ?> </fieldset> <?php endif; ?> <?php endforeach; ?> <?php if ($this->captchaEnabled) : ?> <?php echo $this->form->renderFieldset('captcha'); ?> <?php endif; ?> <div class="control-group"> <div class="controls"> <button class="btn btn-primary validate" type="submit"><?php echo Text::_('COM_CONTACT_CONTACT_SEND'); ?></button> <input type="hidden" name="option" value="com_contact"> <input type="hidden" name="task" value="contact.submit"> <input type="hidden" name="return" value="<?php echo $this->return_page; ?>"> <input type="hidden" name="id" value="<?php echo $this->item->slug; ?>"> <?php echo HTMLHelper::_('form.token'); ?> </div> </div> </form> </div> PKCA#]dB����Fsystem/helixultimate/overrides/com_contact/contact/default_profile.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\String\PunycodeHelper; ?> <?php if (PluginHelper::isEnabled('user', 'profile')) : $fields = $this->item->profile->getFieldset('profile'); ?> <div class="com-contact__profile contact-profile" id="users-profile-custom"> <dl class="dl-horizontal"> <?php foreach ($fields as $profile) : // Skip empty values if (!$profile->value) { continue; } $label = $profile->label; $rawValue = (string) $profile->value; $text = htmlspecialchars($rawValue, ENT_QUOTES, 'UTF-8'); echo '<dt>' . $label . '</dt>'; switch ($profile->id) { case 'profile_website': $hasScheme = preg_match('#^https?://#i', $rawValue) === 1; $href = $hasScheme ? $rawValue : ('http://' . $rawValue); $hrefEsc = htmlspecialchars($href, ENT_QUOTES, 'UTF-8'); $display = PunycodeHelper::urlToUTF8($href); $displayEsc = htmlspecialchars($display, ENT_QUOTES, 'UTF-8'); echo '<dd><a href="' . $hrefEsc . '">' . $displayEsc . '</a></dd>'; break; case 'profile_dob': echo '<dd>' . HTMLHelper::_('date', $rawValue, Text::_('DATE_FORMAT_LC4'), false) . '</dd>'; break; default: echo '<dd>' . $text . '</dd>'; break; } endforeach; ?> </dl> </div> <?php endif; ?> PKCA#]u:��hh8system/helixultimate/overrides/com_contact/form/edit.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Multilanguage; use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Router\Route; /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('keepalive') ->useScript('form.validate'); $this->tab_name = 'com-contact-form'; $this->ignore_fieldsets = ['details', 'item_associations', 'language']; $this->useCoreUI = true; ?> <div class="edit item-page<?php echo $this->pageclass_sfx; ?>"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <form action="<?php echo Route::_('index.php?option=com_contact&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="adminForm" class="form-validate form-vertical"> <fieldset> <?php echo HTMLHelper::_('uitab.startTabSet', $this->tab_name, ['active' => 'details', 'recall' => true, 'breakpoint' => 768]); ?> <?php echo HTMLHelper::_('uitab.addTab', $this->tab_name, 'details', empty($this->item->id) ? Text::_('COM_CONTACT_NEW_CONTACT') : Text::_('COM_CONTACT_EDIT_CONTACT')); ?> <?php echo $this->form->renderField('name'); ?> <?php if (is_null($this->item->id)) : ?> <?php echo $this->form->renderField('alias'); ?> <?php endif; ?> <?php echo $this->form->renderFieldset('details'); ?> <?php echo HTMLHelper::_('uitab.endTab'); ?> <?php echo HTMLHelper::_('uitab.addTab', $this->tab_name, 'misc', Text::_('COM_CONTACT_FIELDSET_MISCELLANEOUS')); ?> <?php echo $this->form->getInput('misc'); ?> <?php echo HTMLHelper::_('uitab.endTab'); ?> <?php if (Multilanguage::isEnabled()) : ?> <?php echo HTMLHelper::_('uitab.addTab', $this->tab_name, 'language', Text::_('JFIELD_LANGUAGE_LABEL')); ?> <?php echo $this->form->renderField('language'); ?> <?php echo HTMLHelper::_('uitab.endTab'); ?> <?php else : ?> <?php echo $this->form->renderField('language'); ?> <?php endif; ?> <?php echo LayoutHelper::render('joomla.edit.params', $this); ?> <?php echo HTMLHelper::_('uitab.endTabSet'); ?> <input type="hidden" name="task" value=""/> <input type="hidden" name="return" value="<?php echo $this->return_page; ?>"/> <?php echo HTMLHelper::_('form.token'); ?> </fieldset> <div class="mb-2 mt-2"> <button type="button" class="btn btn-primary" onclick="Joomla.submitbutton('contact.save')"> <span class="icon-check" aria-hidden="true"></span> <?php echo Text::_('JSAVE'); ?> </button> <button type="button" class="btn btn-danger" onclick="Joomla.submitbutton('contact.cancel')"> <span class="icon-times" aria-hidden="true"></span> <?php echo Text::_('JCANCEL'); ?> </button> <?php if ($this->params->get('save_history', 0) && $this->item->id) : ?> <?php echo $this->form->getInput('contenthistory'); ?> <?php endif; ?> </div> </form> </div> PKCA#]M�FFGsystem/helixultimate/overrides/com_contact/categories/default_items.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die(); use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Contact\Site\Helper\RouteHelper; $lang = Factory::getApplication()->getLanguage(); if ($this->maxLevelcat != 0 && count($this->items[$this->parent->id]) > 0) : ?> <?php foreach ($this->items[$this->parent->id] as $id => $item) : ?> <?php if ($this->params->get('show_empty_categories_cat') || $item->numitems || count($item->getChildren())) : ?> <div class="list-group-item"> <div class="com-contact-categories__item-title-wrapper"> <div class="d-flex justify-content-between align-items-center"> <h5 class="m-0"> <a href="<?php echo Route::_(RouteHelper::getCategoryRoute($item->id, $item->language)); ?>"> <?php echo $this->escape($item->title); ?></a> <?php if ($this->params->get('show_cat_items_cat') == 1) :?> <span class="badge bg-primary rounded-pill"> <?php echo Text::_('COM_CONTACT_NUM_ITEMS'); ?> <?php echo $item->numitems; ?> </span> <?php endif; ?> <?php if ($this->maxLevelcat > 1 && count($item->getChildren()) > 0) : ?> <button type="button" id="category-btn-<?php echo $item->id; ?>" class="btn btn-secondary btn-sm float-end" data-bs-toggle="collapse" data-bs-target="#category-<?php echo $item->id; ?>" aria-expanded="false" aria-controls="category-<?php echo $item->id; ?>" aria-label="<?php echo Text::_('JGLOBAL_EXPAND_CATEGORIES'); ?>" > <span class="icon-plus" aria-hidden="true"></span> </button> <?php endif; ?> </h5> </div> <?php if ($this->params->get('show_subcat_desc_cat') == 1) : ?> <?php if ($item->description) : ?> <div class="mt-2"> <?php echo HTMLHelper::_('content.prepare', $item->description, '', 'com_contact.categories'); ?> </div> <?php endif; ?> <?php endif; ?> <!-- Child Categories (Collapse Section) --> <?php if (count($item->getChildren()) > 0 && $this->maxLevelcat > 1) : ?> <div class="com-contact-categories__children collapse" id="category-<?php echo $item->id; ?>"> <?php $this->items[$item->id] = $item->getChildren(); $this->parent = $item; $this->maxLevelcat--; echo $this->loadTemplate('items'); $this->parent = $item->getParent(); $this->maxLevelcat++; ?> </div> <?php endif; ?> </div> </div> <?php endif; ?> <?php endforeach; ?> <?php endif; ?> PKCA#]���b��Asystem/helixultimate/overrides/com_contact/categories/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined ('_JEXEC') or die(); use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Language\Text; // Add strings for translations in Javascript. Text::script('JGLOBAL_EXPAND_CATEGORIES'); Text::script('JGLOBAL_COLLAPSE_CATEGORIES'); /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->getRegistry()->addExtensionRegistryFile('com_categories'); $wa->useScript('com_categories.shared-categories-accordion'); ?> <div class="com-contact-categories categories-list<?php echo $this->pageclass_sfx; ?> list-group"> <?php echo LayoutHelper::render('joomla.content.categories_default', $this); echo $this->loadTemplate('items'); ?> </div> PKCA#]����:system/helixultimate/overrides/mod_breadcrumbs/default.phpnu�[���<?php /** * @package Helix Ultimate Framework * @author JoomShaper https://www.joomshaper.com * @copyright Copyright (c) 2010 - 2025 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\CMS\Uri\Uri; use Joomla\CMS\WebAsset\WebAssetManager; ?> <nav class="mod-breadcrumbs__wrapper" aria-label="<?php echo htmlspecialchars($module->title, ENT_QUOTES, 'UTF-8'); ?>"> <ol class="mod-breadcrumbs breadcrumb px-3 py-2"> <?php if ($params->get('showHere', 1)) : ?> <li class="mod-breadcrumbs__here float-start"> <?php echo Text::_('MOD_BREADCRUMBS_HERE'); ?>  </li> <?php else : ?> <li class="mod-breadcrumbs__divider float-start"> <span class="divider icon-location icon-fw" aria-hidden="true"></span> </li> <?php endif; ?> <?php // Get rid of duplicated entries on trail including home page when using multilanguage for ($i = 0; $i < $count; $i++) { if ($i === 1 && !empty($list[$i]->link) && !empty($list[$i - 1]->link) && $list[$i]->link === $list[$i - 1]->link) { unset($list[$i]); } } // Find last and penultimate items in breadcrumbs list end($list); $last_item_key = key($list); prev($list); $penult_item_key = key($list); // Make a link if not the last item in the breadcrumbs $show_last = $params->get('showLast', 1); $class = null; // Generate the trail foreach ($list as $key => $item) : if ($key !== $last_item_key) : if (!empty($item->link)) : $breadcrumbItem = HTMLHelper::_('link', Route::_($item->link), '<span>' . $item->name . '</span>', ['class' => 'pathway']); else : $breadcrumbItem = '<span>' . $item->name . '</span>'; endif; echo '<li class="mod-breadcrumbs__item breadcrumb-item' . $class . '">' . $breadcrumbItem . '</li>'; elseif ($show_last) : // Render last item if required. $breadcrumbItem = '<span>' . $item->name . '</span>'; $class = ' active'; echo '<li class="mod-breadcrumbs__item breadcrumb-item' . $class . '">' . $breadcrumbItem . '</li>'; endif; endforeach; ?> </ol> <?php // Structured data as JSON $data = [ '@context' => 'https://schema.org', '@type' => 'BreadcrumbList', '@id' => Uri::root() . '#/schema/BreadcrumbList/' . (int) $module->id, 'itemListElement' => [] ]; // Use an independent counter for positions. E.g. if Heading items in pathway. $itemsCounter = 0; // If showHome is disabled use the fallback $homeCrumb for startpage at first position. if (isset($homeCrumb)) { $data['itemListElement'][] = [ '@type' => 'ListItem', 'position' => ++$itemsCounter, 'item' => [ '@id' => Route::_($homeCrumb->link, true, Route::TLS_IGNORE, true), 'name' => $homeCrumb->name, ], ]; } foreach ($list as $key => $item) { // Only add item to JSON if it has a valid link, otherwise skip it. if (!empty($item->link)) { $data['itemListElement'][] = [ '@type' => 'ListItem', 'position' => ++$itemsCounter, 'item' => [ '@id' => Route::_($item->link, true, Route::TLS_IGNORE, true), 'name' => $item->name, ], ]; } elseif ($key === $last_item_key) { // Add the last item (current page) to JSON, but without a link. // Google accepts items without a URL only as the current page. $data['itemListElement'][] = [ '@type' => 'ListItem', 'position' => ++$itemsCounter, 'item' => [ 'name' => $item->name, ], ]; } } if ($itemsCounter) { /** @var WebAssetManager $wa */ $wa = $app->getDocument()->getWebAssetManager(); $prettyPrint = JDEBUG ? JSON_PRETTY_PRINT : 0; $wa->addInline('script', json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | $prettyPrint), [], ['type' => 'application/ld+json']); } ?> </nav> PKCA#]8�ľ��#system/logout/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.logout * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\Logout\Extension\Logout; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.4.0 */ public function register(Container $container): void { $container->set( PluginInterface::class, function (Container $container) { return new Logout( $container->get(DispatcherInterface::class), (array) PluginHelper::getPlugin('system', 'logout'), Factory::getApplication() ); } ); } }; PKDA#]��ĮTTsystem/logout/logout.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_logout</name> <author>Joomla! Project</author> <creationDate>2009-04</creationDate> <copyright>(C) 2009 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_SYSTEM_LOGOUT_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\Logout</namespace> <files> <folder plugin="logout">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_system_logout.ini</language> <language tag="en-GB">language/en-GB/plg_system_logout.sys.ini</language> </languages> </extension> PKDA#]��1DD&system/logout/src/Extension/Logout.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.logout * * @copyright (C) 2010 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Logout\Extension; use Joomla\CMS\Application\ApplicationHelper; use Joomla\CMS\Application\CMSApplicationInterface; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Event\DispatcherInterface; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Plugin class for logout redirect handling. * * @since 1.6 */ final class Logout extends CMSPlugin { /** * Load the language file on instantiation. * * @var boolean * * @since 3.1 */ protected $autoloadLanguage = true; /** * @param DispatcherInterface $dispatcher The object to observe -- event dispatcher. * @param array $config An optional associative array of configuration settings. * @param CMSApplicationInterface $app The object to observe -- event dispatcher. * * @since 1.6 */ public function __construct(DispatcherInterface $dispatcher, array $config, CMSApplicationInterface $app) { parent::__construct($dispatcher, $config); $this->setApplication($app); // If we are on admin don't process. if (!$this->getApplication()->isClient('site')) { return; } $hash = ApplicationHelper::getHash('PlgSystemLogout'); if ($this->getApplication()->getInput()->cookie->getString($hash)) { // Destroy the cookie. $this->getApplication()->getInput()->cookie->set( $hash, '', 1, $this->getApplication()->get('cookie_path', '/'), $this->getApplication()->get('cookie_domain', '') ); } } /** * Method to handle any logout logic and report back to the subject. * * @param array $user Holds the user data. * @param array $options Array holding options (client, ...). * * @return boolean Always returns true. * * @since 1.6 */ public function onUserLogout($user, $options = []) { if ($this->getApplication()->isClient('site')) { // Create the cookie. $this->getApplication()->getInput()->cookie->set( ApplicationHelper::getHash('PlgSystemLogout'), true, time() + 86400, $this->getApplication()->get('cookie_path', '/'), $this->getApplication()->get('cookie_domain', ''), $this->getApplication()->isHttpsForced(), true ); } return true; } } PKDA#]��4qq"system/cache/services/provider.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.cache * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Cache\CacheControllerFactoryInterface; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Profiler\Profiler; use Joomla\CMS\Router\SiteRouter; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\System\Cache\Extension\Cache; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * @since 4.2.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $plugin = PluginHelper::getPlugin('system', 'cache'); $dispatcher = $container->get(DispatcherInterface::class); $documentFactory = $container->get('document.factory'); $cacheControllerFactory = $container->get(CacheControllerFactoryInterface::class); $profiler = (defined('JDEBUG') && JDEBUG) ? Profiler::getInstance('Application') : null; $router = $container->has(SiteRouter::class) ? $container->get(SiteRouter::class) : null; $plugin = new Cache($dispatcher, (array) $plugin, $documentFactory, $cacheControllerFactory, $profiler, $router); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PKDA#]KX��system/cache/cache.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?> <extension type="plugin" group="system" method="upgrade"> <name>plg_system_cache</name> <author>Joomla! Project</author> <creationDate>2007-02</creationDate> <copyright>(C) 2007 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.0.0</version> <description>PLG_CACHE_XML_DESCRIPTION</description> <namespace path="src">Joomla\Plugin\System\Cache</namespace> <files> <folder plugin="cache">services</folder> <folder>src</folder> </files> <languages> <language tag="en-GB">language/en-GB/plg_system_cache.ini</language> <language tag="en-GB">language/en-GB/plg_system_cache.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="browsercache" type="radio" layout="joomla.form.field.radio.switcher" label="PLG_CACHE_FIELD_BROWSERCACHE_LABEL" default="0" filter="integer" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="exclude_menu_items" type="menuitem" label="PLG_CACHE_FIELD_EXCLUDE_MENU_ITEMS_LABEL" multiple="multiple" filter="intarray" layout="joomla.form.field.groupedlist-fancy-select" /> </fieldset> <fieldset name="advanced"> <field name="exclude" type="textarea" label="PLG_CACHE_FIELD_EXCLUDE_LABEL" description="PLG_CACHE_FIELD_EXCLUDE_DESC" rows="15" filter="raw" /> </fieldset> </fields> </config> </extension> PKDA#]�W��/�/$system/cache/src/Extension/Cache.phpnu�[���<?php /** * @package Joomla.Plugin * @subpackage System.cache * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Plugin\System\Cache\Extension; use Joomla\CMS\Cache\CacheController; use Joomla\CMS\Cache\CacheControllerFactoryInterface; use Joomla\CMS\Document\FactoryInterface as DocumentFactoryInterface; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Profiler\Profiler; use Joomla\CMS\Router\SiteRouter; use Joomla\CMS\Uri\Uri; use Joomla\Event\DispatcherInterface; use Joomla\Event\Event; use Joomla\Event\Priority; use Joomla\Event\SubscriberInterface; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Joomla! Page Cache Plugin. * * @since 1.5 */ final class Cache extends CMSPlugin implements SubscriberInterface { /** * Cache instance. * * @var CacheController * @since 1.5 */ private $cache; /** * The application's document factory interface * * @var DocumentFactoryInterface * @since 4.2.0 */ private $documentFactory; /** * Cache controller factory interface * * @var CacheControllerFactoryInterface * @since 4.2.0 */ private $cacheControllerFactory; /** * The application profiler, used when Debug Site is set to Yes in Global Configuration. * * @var Profiler|null * @since 4.2.0 */ private $profiler; /** * The frontend router, injected by the service provider. * * @var SiteRouter|null * @since 4.2.0 */ private $router; /** * Constructor * * @param DispatcherInterface $subject The object to observe * @param array $config An optional associative * array of configuration * settings. Recognized key * values include 'name', * 'group', 'params', * 'language' * (this list is not meant * to be comprehensive). * @param DocumentFactoryInterface $documentFactory The application's * document factory * @param CacheControllerFactoryInterface $cacheControllerFactory Cache controller factory * @param Profiler|null $profiler The application profiler * @param SiteRouter|null $router The frontend router * * @since 4.2.0 */ public function __construct( &$subject, $config, DocumentFactoryInterface $documentFactory, CacheControllerFactoryInterface $cacheControllerFactory, ?Profiler $profiler, ?SiteRouter $router ) { parent::__construct($subject, $config); $this->documentFactory = $documentFactory; $this->cacheControllerFactory = $cacheControllerFactory; $this->profiler = $profiler; $this->router = $router; } /** * Returns an array of CMS events this plugin will listen to and the respective handlers. * * @return array * * @since 4.2.0 */ public static function getSubscribedEvents(): array { /** * Note that onAfterRender and onAfterRespond must be the last handlers to run for this * plugin to operate as expected. These handlers put pages into cache. We must make sure * that a. the page SHOULD be cached and b. we are caching the complete page, as it's * output to the browser. */ return [ 'onAfterRoute' => 'onAfterRoute', 'onAfterRender' => ['onAfterRender', Priority::LOW], 'onAfterRespond' => ['onAfterRespond', Priority::LOW], ]; } /** * Returns a cached page if the current URL exists in the cache. * * @param Event $event The Joomla event being handled * * @return void * * @since 4.0.0 */ public function onAfterRoute(Event $event) { if (!$this->appStateSupportsCaching()) { return; } // If any `pagecache` plugins return false for onPageCacheSetCaching, do not use the cache. PluginHelper::importPlugin('pagecache'); $results = $this->getApplication()->triggerEvent('onPageCacheSetCaching'); $this->getCacheController()->setCaching(!in_array(false, $results, true)); $data = $this->getCacheController()->get($this->getCacheKey()); if ($data === false) { // No cached data. return; } // Set the page content from the cache and output it to the browser. $this->getApplication()->setBody($data); echo $this->getApplication()->toString((bool) $this->getApplication()->get('gzip')); // Mark afterCache in debug and run debug onAfterRespond events, e.g. show Joomla Debug Console if debug is active. if (JDEBUG) { // Create a document instance and load it into the application. $document = $this->documentFactory ->createDocument($this->getApplication()->getInput()->get('format', 'html')); $this->getApplication()->loadDocument($document); if ($this->profiler) { $this->profiler->mark('afterCache'); } $this->getApplication()->triggerEvent('onAfterRespond'); } // Closes the application. $this->getApplication()->close(); } /** * Does the current application state allow for caching? * * The following conditions must be met: * * This is the frontend application. This plugin does not apply to other applications. * * This is a GET request. This plugin does not apply to POST, PUT etc. * * There is no currently logged in user (pages might have user–specific content). * * The message queue is empty. * * The first two tests are cached to make early returns possible; these conditions cannot change * throughout the lifetime of the request. * * The other two tests MUST NOT be cached because auto–login plugins may fire anytime within * the application lifetime logging in a user and messages can be generated anytime within the * application's lifetime. * * @return boolean * @since 4.2.0 */ private function appStateSupportsCaching(): bool { static $isSite = null; static $isGET = null; if ($isSite === null) { $isSite = $this->getApplication()->isClient('site'); $isGET = $this->getApplication()->getInput()->getMethod() === 'GET'; } // Boolean short–circuit evaluation means this returns fast false when $isSite is false. return $isSite && $isGET && $this->getApplication()->getIdentity()->guest && empty($this->getApplication()->getMessageQueue()); } /** * Get the cache controller * * @return CacheController * @since 4.2.0 */ private function getCacheController(): CacheController { if (!empty($this->cache)) { return $this->cache; } // Set the cache options. $options = [ 'defaultgroup' => 'page', 'browsercache' => $this->params->get('browsercache', 0), 'caching' => false, ]; // Instantiate cache with previous options. $this->cache = $this->cacheControllerFactory->createCacheController('page', $options); return $this->cache; } /** * Get a cache key for the current page based on the url and possible other factors. * * @return string * * @since 3.7 */ private function getCacheKey(): string { static $key; if (!$key) { PluginHelper::importPlugin('pagecache'); $parts = $this->getApplication()->triggerEvent('onPageCacheGetKey'); $parts[] = Uri::getInstance()->toString(); $key = md5(serialize($parts)); } return $key; } /** * After Render Event. Check whether the current page is excluded from cache. * * @param Event $event The CMS event we are handling. * * @return void * * @since 3.9.12 */ public function onAfterRender(Event $event) { if (!$this->appStateSupportsCaching() || $this->getCacheController()->getCaching() === false) { return; } if ($this->isExcluded() === true) { $this->getCacheController()->setCaching(false); return; } // Disable compression before caching the page. $this->getApplication()->set('gzip', false); } /** * Check if the page is excluded from the cache or not. * * @return boolean True if the page is excluded else false * * @since 3.5 */ private function isExcluded(): bool { // Check if menu items have been excluded. $excludedMenuItems = $this->params->get('exclude_menu_items', []); if ($excludedMenuItems) { // Get the current menu item. $active = $this->getApplication()->getMenu()->getActive(); if ($active && $active->id && in_array((int) $active->id, (array) $excludedMenuItems)) { return true; } } // Check if regular expressions are being used. $exclusions = $this->params->get('exclude', ''); if ($exclusions) { // Convert the exclusions into a normalised array $exclusions = str_replace(["\r\n", "\r"], "\n", $exclusions); $exclusions = explode("\n", $exclusions); $exclusions = array_map('trim', $exclusions); $filterExpression = function ($x) { return $x !== ''; }; $exclusions = array_filter($exclusions, $filterExpression); // Gets the internal (non-SEF) and the external (possibly SEF) URIs. $internalUrl = '/index.php?' . Uri::getInstance()->buildQuery($this->router->getVars()); $externalUrl = Uri::getInstance()->toString(); // Loop through each pattern. if ($exclusions) { foreach ($exclusions as $exclusion) { // Test both external and internal URI if (preg_match('#' . $exclusion . '#i', $externalUrl . ' ' . $internalUrl, $match)) { return true; } } } } // If any pagecache plugins return true for onPageCacheIsExcluded, exclude. PluginHelper::importPlugin('pagecache'); $results = $this->getApplication()->triggerEvent('onPageCacheIsExcluded'); return in_array(true, $results, true); } /** * After Respond Event. Stores page in cache. * * @param Event $event The application event we are handling. * * @return void * * @since 1.5 */ public function onAfterRespond(Event $event) { if (!$this->appStateSupportsCaching() || $this->getCacheController()->getCaching() === false) { return; } // Saves current page in cache. $this->getCacheController()->store($this->getApplication()->getBody(), $this->getCacheKey()); } } PKDA#]~2}9}9-system/convertforms/script.install.helper.phpnu�[���<?php /** * Installer Script Helper * * @author Tassos Marinos <info@tassos.gr> * @link http://www.tassos.gr * @copyright Copyright © 2016 Tassos Marinos All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL */ defined('_JEXEC') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); class PlgSystemConvertformsInstallerScriptHelper { public $name = ''; public $alias = ''; public $extname = ''; public $extension_type = ''; public $plugin_folder = 'system'; public $module_position = 'status'; public $client_id = 1; public $install_type = 'install'; public $show_message = true; public $autopublish = true; public $db = null; public $app = null; public $installedVersion; public function __construct(&$params) { $this->extname = $this->extname ?: $this->alias; $this->db = JFactory::getDbo(); $this->app = JFactory::getApplication(); $this->installedVersion = $this->getVersion($this->getInstalledXMLFile()); } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function preflight($route, $adapter) { if (!in_array($route, array('install', 'update'))) { return; } JFactory::getLanguage()->load('plg_system_novaraininstaller', JPATH_PLUGINS . '/system/novaraininstaller'); if ($this->show_message && $this->isInstalled()) { $this->install_type = 'update'; } if ($this->onBeforeInstall() === false) { return false; } } /** * Preflight event * * @param string * @param JAdapterInstance * * @return boolean */ public function postflight($route, $adapter) { JFactory::getLanguage()->load($this->getPrefix() . '_' . $this->extname, $this->getMainFolder()); if (!in_array($route, array('install', 'update'))) { return; } if ($this->onAfterInstall() === false) { return false; } if ($route == 'install' && $this->autopublish) { $this->publishExtension(); } if ($this->show_message) { $this->addInstalledMessage(); } JFactory::getCache()->clean('com_plugins'); JFactory::getCache()->clean('_system'); } public function isInstalled() { if (!is_file($this->getInstalledXMLFile())) { return false; } $query = $this->db->getQuery(true) ->select('extension_id') ->from('#__extensions') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote($this->extension_type)) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->getElementName())); $this->db->setQuery($query, 0, 1); $result = $this->db->loadResult(); return empty($result) ? false : true; } public function getMainFolder() { switch ($this->extension_type) { case 'plugin' : return JPATH_SITE . '/plugins/' . $this->plugin_folder . '/' . $this->extname; case 'component' : return JPATH_ADMINISTRATOR . '/components/com_' . $this->extname; case 'module' : return JPATH_ADMINISTRATOR . '/modules/mod_' . $this->extname; case 'library' : return JPATH_SITE . '/libraries/' . $this->extname; } } public function getInstalledXMLFile() { return $this->getXMLFile($this->getMainFolder()); } public function getCurrentXMLFile() { return $this->getXMLFile(__DIR__); } public function getXMLFile($folder) { switch ($this->extension_type) { case 'module' : return $folder . '/mod_' . $this->extname . '.xml'; default : return $folder . '/' . $this->extname . '.xml'; } } public function foldersExist($folders = array()) { foreach ($folders as $folder) { if (is_dir($folder)) { return true; } } return false; } public function publishExtension() { switch ($this->extension_type) { case 'plugin' : $this->publishPlugin(); case 'module' : $this->publishModule(); } } public function publishPlugin() { $query = $this->db->getQuery(true) ->update('#__extensions') ->set($this->db->quoteName('enabled') . ' = 1') ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin')) ->where($this->db->quoteName('element') . ' = ' . $this->db->quote($this->extname)) ->where($this->db->quoteName('folder') . ' = ' . $this->db->quote($this->plugin_folder)); $this->db->setQuery($query); $this->db->execute(); } public function publishModule() { // Get module id $query = $this->db->getQuery(true) ->select('id') ->from('#__modules') ->where($this->db->quoteName('module') . ' = ' . $this->db->quote('mod_' . $this->extname)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id); $this->db->setQuery($query, 0, 1); $id = $this->db->loadResult(); if (!$id) { return; } // check if module is already in the modules_menu table (meaning is is already saved) $query->clear() ->select('moduleid') ->from('#__modules_menu') ->where($this->db->quoteName('moduleid') . ' = ' . (int) $id); $this->db->setQuery($query, 0, 1); $exists = $this->db->loadResult(); if ($exists) { return; } // Get highest ordering number in position $query->clear() ->select('ordering') ->from('#__modules') ->where($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('client_id') . ' = ' . (int) $this->client_id) ->order('ordering DESC'); $this->db->setQuery($query, 0, 1); $ordering = $this->db->loadResult(); $ordering++; // publish module and set ordering number $query->clear() ->update('#__modules') ->set($this->db->quoteName('published') . ' = 1') ->set($this->db->quoteName('ordering') . ' = ' . (int) $ordering) ->set($this->db->quoteName('position') . ' = ' . $this->db->quote($this->module_position)) ->where($this->db->quoteName('id') . ' = ' . (int) $id); $this->db->setQuery($query); $this->db->execute(); // add module to the modules_menu table $query->clear() ->insert('#__modules_menu') ->columns(array($this->db->quoteName('moduleid'), $this->db->quoteName('menuid'))) ->values((int) $id . ', 0'); $this->db->setQuery($query); $this->db->execute(); } public function addInstalledMessage() { JFactory::getApplication()->enqueueMessage( JText::sprintf( JText::_($this->install_type == 'update' ? 'NRI_THE_EXTENSION_HAS_BEEN_UPDATED_SUCCESSFULLY' : 'NRI_THE_EXTENSION_HAS_BEEN_INSTALLED_SUCCESSFULLY'), '<strong>' . JText::_($this->name) . '</strong>', '<strong>' . $this->getVersion() . '</strong>', $this->getFullType() ) ); } public function getPrefix() { switch ($this->extension_type) { case 'plugin'; return JText::_('plg_' . strtolower($this->plugin_folder)); case 'component': return JText::_('com'); case 'module': return JText::_('mod'); case 'library': return JText::_('lib'); default: return $this->extension_type; } } public function getElementName($type = null, $extname = null) { $type = is_null($type) ? $this->extension_type : $type; $extname = is_null($extname) ? $this->extname : $extname; switch ($type) { case 'component' : return 'com_' . $extname; case 'module' : return 'mod_' . $extname; case 'plugin' : default: return $extname; } } public function getFullType() { return JText::_('NRI_' . strtoupper($this->getPrefix())); } public function isPro() { $versionFile = __DIR__ . "/version.php"; // If version file does not exist we assume a PRO version if (!JFile::exists($versionFile)) { return true; } // Load version file require_once $versionFile; return (bool) $NR_PRO; } public function getVersion($file = '') { $file = $file ?: $this->getCurrentXMLFile(); if (!is_file($file)) { return ''; } $xml = JInstaller::parseXMLInstallFile($file); if (!$xml || !isset($xml['version'])) { return ''; } return $xml['version']; } /** * Checks wether the extension can be installed or not * * @return boolean */ public function canInstall() { // The extension is not installed yet. Accept Install. if (!$installed_version = $this->getVersion($this->getInstalledXMLFile())) { return true; } // Path to extension's version file $versionFile = $this->getMainFolder() . "/version.php"